Commit 2655bbbcdb5a92826af8d93b96ddf8b04c04ffec
1 parent
5633c308
Exists in
master
and in
33 other branches
Allow users to change the language
Showing
9 changed files
with
115 additions
and
7 deletions
Show diff stats
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
src/app/components/navbar/navbar.spec.ts
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 "./../../models/interfaces"; |
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
src/languages/pt.json
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 | +}; | ... | ... |