Commit 2655bbbcdb5a92826af8d93b96ddf8b04c04ffec
1 parent
5633c308
Exists in
master
and in
1 other branch
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 @@ | @@ -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 @@ | @@ -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 @@ | @@ -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
| @@ -71,6 +71,9 @@ describe("Components", () => { | @@ -71,6 +71,9 @@ describe("Components", () => { | ||
| 71 | useValue: { | 71 | useValue: { |
| 72 | AUTH_EVENTS | 72 | AUTH_EVENTS |
| 73 | } | 73 | } |
| 74 | + }), | ||
| 75 | + provide('$translate', { | ||
| 76 | + useValue: helpers.mocks.$translate | ||
| 74 | }) | 77 | }) |
| 75 | ].concat(helpers.provideFilters("translateFilter")), | 78 | ].concat(helpers.provideFilters("translateFilter")), |
| 76 | directives: [Navbar], | 79 | directives: [Navbar], |
src/app/components/navbar/navbar.ts
| 1 | import {Component, Inject} from "ng-forward"; | 1 | import {Component, Inject} from "ng-forward"; |
| 2 | +import {LanguageSelector} from "../language-selector/language-selector.component"; | ||
| 2 | 3 | ||
| 3 | 4 | ||
| 4 | import {Session, AuthService, AuthController, IAuthEvents, AUTH_EVENTS} from "./../auth"; | 5 | import {Session, AuthService, AuthController, IAuthEvents, AUTH_EVENTS} from "./../auth"; |
| @@ -7,6 +8,7 @@ import {User} from "./../../models/interfaces"; | @@ -7,6 +8,7 @@ import {User} from "./../../models/interfaces"; | ||
| 7 | @Component({ | 8 | @Component({ |
| 8 | selector: "acme-navbar", | 9 | selector: "acme-navbar", |
| 9 | templateUrl: "app/components/navbar/navbar.html", | 10 | templateUrl: "app/components/navbar/navbar.html", |
| 11 | + directives: [LanguageSelector], | ||
| 10 | providers: [AuthService, Session] | 12 | providers: [AuthService, Session] |
| 11 | }) | 13 | }) |
| 12 | @Inject("$modal", AuthService, "Session", "$scope", "$state") | 14 | @Inject("$modal", AuthService, "Session", "$scope", "$state") |
src/languages/en.json
| @@ -4,5 +4,8 @@ | @@ -4,5 +4,8 @@ | ||
| 4 | "navbar.profile": "Profile", | 4 | "navbar.profile": "Profile", |
| 5 | "navbar.settings": "Settings", | 5 | "navbar.settings": "Settings", |
| 6 | "navbar.logout": "Log Out", | 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,5 +4,8 @@ | ||
| 4 | "navbar.profile": "Perfil", | 4 | "navbar.profile": "Perfil", |
| 5 | "navbar.settings": "Configurações", | 5 | "navbar.settings": "Configurações", |
| 6 | "navbar.logout": "Sair", | 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 | class ScopeWithEvents { | 2 | class ScopeWithEvents { |
| 3 | - listeners = {}; | 3 | + listeners = {}; |
| 4 | constructor() { | 4 | constructor() { |
| 5 | 5 | ||
| 6 | } | 6 | } |
| @@ -17,9 +17,9 @@ class ScopeWithEvents { | @@ -17,9 +17,9 @@ class ScopeWithEvents { | ||
| 17 | 17 | ||
| 18 | public $emit(message: string, arg?: any) { | 18 | public $emit(message: string, arg?: any) { |
| 19 | console.log("Emitted " + message); | 19 | console.log("Emitted " + message); |
| 20 | - if ( (<any>this.listeners)[message]) { | 20 | + if ((<any>this.listeners)[message]) { |
| 21 | console.log("LISTENERS:", (<any>this.listeners)[message]); | 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 | f(arg); | 23 | f(arg); |
| 24 | }); | 24 | }); |
| 25 | } | 25 | } |
| @@ -42,6 +42,13 @@ export var mocks = { | @@ -42,6 +42,13 @@ export var mocks = { | ||
| 42 | return { | 42 | return { |
| 43 | currentUser: () => { return user; } | 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 | \ No newline at end of file | 54 | \ No newline at end of file |
| 55 | +}; |