Commit 2655bbbcdb5a92826af8d93b96ddf8b04c04ffec

Authored by Victor Costa
1 parent 5633c308

Allow users to change the language

src/app/components/language-selector/language-selector.component.spec.ts 0 → 100644
... ... @@ -0,0 +1,45 @@
  1 +import {TestComponentBuilder, ComponentFixture} from 'ng-forward/cjs/testing/test-component-builder';
  2 +import {Pipe, Input, provide, Component} from 'ng-forward';
  3 +
  4 +import {LanguageSelector} from './language-selector.component';
  5 +
  6 +import * as helpers from "../../../spec/helpers";
  7 +
  8 +const tcb = new TestComponentBuilder();
  9 +
  10 +const htmlTemplate: string = '<language-selector></language-selector>';
  11 +
  12 +describe("Components", () => {
  13 +
  14 + describe("Language Selector Component", () => {
  15 +
  16 + beforeEach(angular.mock.module("templates"));
  17 +
  18 + @Component({
  19 + selector: 'test-container-component',
  20 + template: htmlTemplate,
  21 + directives: [LanguageSelector],
  22 + providers: [
  23 + provide('$translate', {
  24 + useValue: helpers.mocks.$translate
  25 + })
  26 + ].concat(helpers.provideFilters("translateFilter"))
  27 + })
  28 + class BlockContainerComponent { }
  29 +
  30 + it("set available languages when change language", () => {
  31 + let component: LanguageSelector = new LanguageSelector(<any>helpers.mocks.$translate);
  32 + component.availableLanguages = null;
  33 + expect(component.availableLanguages).toBeNull();
  34 + component.changeLanguage('en');
  35 + expect(component.availableLanguages).toBeDefined();
  36 + });
  37 +
  38 + it("display language options", () => {
  39 + helpers.createComponentFromClass(BlockContainerComponent).then(fixture => {
  40 + expect(fixture.debugElement.queryAll('li.language').length).toEqual(2);
  41 + });
  42 + });
  43 +
  44 + });
  45 +});
... ...
src/app/components/language-selector/language-selector.component.ts 0 → 100644
... ... @@ -0,0 +1,29 @@
  1 +import {Component, Inject} from "ng-forward";
  2 +
  3 +@Component({
  4 + selector: "language-selector",
  5 + templateUrl: "app/components/language-selector/language-selector.html"
  6 +})
  7 +@Inject("$translate")
  8 +export class LanguageSelector {
  9 +
  10 + availableLanguages: any;
  11 +
  12 + constructor(private $translate: angular.translate.ITranslateService) {
  13 + this.changeLanguage($translate.use());
  14 + }
  15 +
  16 + currentLanguage() {
  17 + return this.$translate.use();
  18 + }
  19 +
  20 + changeLanguage(language: string) {
  21 + this.$translate.use(language).then((lang) => {
  22 + this.availableLanguages = {
  23 + "en": this.$translate.instant("language.en"),
  24 + "pt": this.$translate.instant("language.pt")
  25 + };
  26 + });
  27 + }
  28 +
  29 +}
... ...
src/app/components/language-selector/language-selector.html 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +<li class="dropdown profile-menu" dropdown>
  2 + <a href="#" class="dropdown-toggle" aria-expanded="false" dropdown-toggle>
  3 + <span>{{"language.selector" | translate}}</span> <b class="caret"></b>
  4 + </a>
  5 + <ul class="dropdown-menu" dropdown-menu>
  6 + <li ng-repeat="(language, description) in ctrl.availableLanguages"
  7 + class="language language-{{language}}" ng-class="{'active': language==ctrl.currentLanguage()}">
  8 + <a href="#" ng-click="ctrl.changeLanguage(language)">
  9 + {{description}}
  10 + </a>
  11 + </li>
  12 + </ul>
  13 +</li>
... ...
src/app/components/navbar/navbar.html
... ... @@ -40,6 +40,9 @@
40 40 </ul>
41 41 </li>
42 42 </ul>
  43 + <ul>
  44 + <language-selector class="nav navbar-nav navbar-right"></language-selector>
  45 + </ul>
43 46 <div ui-view="actions"></div>
44 47 </div>
45 48 </div>
... ...
src/app/components/navbar/navbar.spec.ts
... ... @@ -71,6 +71,9 @@ describe(&quot;Components&quot;, () =&gt; {
71 71 useValue: {
72 72 AUTH_EVENTS
73 73 }
  74 + }),
  75 + provide('$translate', {
  76 + useValue: helpers.mocks.$translate
74 77 })
75 78 ].concat(helpers.provideFilters("translateFilter")),
76 79 directives: [Navbar],
... ...
src/app/components/navbar/navbar.ts
1 1 import {Component, Inject} from "ng-forward";
  2 +import {LanguageSelector} from "../language-selector/language-selector.component";
2 3  
3 4  
4 5 import {Session, AuthService, AuthController, IAuthEvents, AUTH_EVENTS} from "./../auth";
... ... @@ -7,6 +8,7 @@ import {User} from &quot;./../../models/interfaces&quot;;
7 8 @Component({
8 9 selector: "acme-navbar",
9 10 templateUrl: "app/components/navbar/navbar.html",
  11 + directives: [LanguageSelector],
10 12 providers: [AuthService, Session]
11 13 })
12 14 @Inject("$modal", AuthService, "Session", "$scope", "$state")
... ...
src/languages/en.json
... ... @@ -4,5 +4,8 @@
4 4 "navbar.profile": "Profile",
5 5 "navbar.settings": "Settings",
6 6 "navbar.logout": "Log Out",
7   - "navbar.login": "Login"
  7 + "navbar.login": "Login",
  8 + "language.en": "English",
  9 + "language.pt": "Portuguese",
  10 + "language.selector": "Language"
8 11 }
... ...
src/languages/pt.json
... ... @@ -4,5 +4,8 @@
4 4 "navbar.profile": "Perfil",
5 5 "navbar.settings": "Configurações",
6 6 "navbar.logout": "Sair",
7   - "navbar.login": "Login"
  7 + "navbar.login": "Login",
  8 + "language.en": "Inglês",
  9 + "language.pt": "Português",
  10 + "language.selector": "Idioma"
8 11 }
... ...
src/spec/mocks.ts
1 1  
2 2 class ScopeWithEvents {
3   - listeners = {};
  3 + listeners = {};
4 4 constructor() {
5 5  
6 6 }
... ... @@ -17,9 +17,9 @@ class ScopeWithEvents {
17 17  
18 18 public $emit(message: string, arg?: any) {
19 19 console.log("Emitted " + message);
20   - if ( (<any>this.listeners)[message]) {
  20 + if ((<any>this.listeners)[message]) {
21 21 console.log("LISTENERS:", (<any>this.listeners)[message]);
22   - (<any>this.listeners)[message].forEach((f: Function) => {
  22 + (<any>this.listeners)[message].forEach((f: Function) => {
23 23 f(arg);
24 24 });
25 25 }
... ... @@ -42,6 +42,13 @@ export var mocks = {
42 42 return {
43 43 currentUser: () => { return user; }
44 44 };
  45 + },
  46 + $translate: {
  47 + use: (lang?: string) => {
  48 + return {
  49 + then: (func?: any) => { if (func) func() }
  50 + }
  51 + },
  52 + instant: () => { }
45 53 }
46   -
47   -};
48 54 \ No newline at end of file
  55 +};
... ...