Commit 12120fb18df30f29b66558c25c6fcb346585acce
Exists in
master
and in
31 other branches
merge with ngforward
Showing
16 changed files
with
237 additions
and
159 deletions
Show diff stats
src/app/components/language-selector/language-selector.component.spec.ts
@@ -11,16 +11,16 @@ describe("Components", () => { | @@ -11,16 +11,16 @@ describe("Components", () => { | ||
11 | 11 | ||
12 | beforeEach(angular.mock.module("templates")); | 12 | beforeEach(angular.mock.module("templates")); |
13 | 13 | ||
14 | - let languageService: any; | 14 | + let translatorService: any; |
15 | 15 | ||
16 | let buildComponent = (): Promise<ComponentFixture> => { | 16 | let buildComponent = (): Promise<ComponentFixture> => { |
17 | - languageService = jasmine.createSpyObj("languageService", ["availableLanguages", "currentLanguage"]); | 17 | + translatorService = jasmine.createSpyObj("translatorService", ["availableLanguages", "currentLanguage"]) |
18 | return helpers.quickCreateComponent({ | 18 | return helpers.quickCreateComponent({ |
19 | template: "<language-selector></language-selector>", | 19 | template: "<language-selector></language-selector>", |
20 | directives: [LanguageSelector], | 20 | directives: [LanguageSelector], |
21 | providers: [ | 21 | providers: [ |
22 | - provide('LanguageService', { | ||
23 | - useValue: languageService | 22 | + provide('TranslatorService', { |
23 | + useValue: translatorService | ||
24 | }) | 24 | }) |
25 | ].concat(helpers.provideFilters("translateFilter")) | 25 | ].concat(helpers.provideFilters("translateFilter")) |
26 | }); | 26 | }); |
@@ -34,5 +34,13 @@ describe("Components", () => { | @@ -34,5 +34,13 @@ describe("Components", () => { | ||
34 | }); | 34 | }); |
35 | }); | 35 | }); |
36 | 36 | ||
37 | + it("call the translator service when change the language", (done) => { | ||
38 | + let translatorService = jasmine.createSpyObj("translatorService", ["changeLanguage"]); | ||
39 | + let languageSelector = new LanguageSelector(<any>translatorService); | ||
40 | + languageSelector.changeLanguage("en"); | ||
41 | + expect(translatorService.changeLanguage).toHaveBeenCalledWith("en"); | ||
42 | + done(); | ||
43 | + }); | ||
44 | + | ||
37 | }); | 45 | }); |
38 | }); | 46 | }); |
src/app/components/language-selector/language-selector.component.ts
1 | import {Component, Inject} from "ng-forward"; | 1 | import {Component, Inject} from "ng-forward"; |
2 | -import {LanguageService} from "./language.service"; | 2 | +import {TranslatorService} from "../translator/translator.service"; |
3 | 3 | ||
4 | @Component({ | 4 | @Component({ |
5 | selector: "language-selector", | 5 | selector: "language-selector", |
6 | templateUrl: "app/components/language-selector/language-selector.html" | 6 | templateUrl: "app/components/language-selector/language-selector.html" |
7 | }) | 7 | }) |
8 | -@Inject(LanguageService) | 8 | +@Inject(TranslatorService) |
9 | export class LanguageSelector { | 9 | export class LanguageSelector { |
10 | 10 | ||
11 | - constructor(private languageService: LanguageService) { } | 11 | + constructor(private translatorService: TranslatorService) { } |
12 | 12 | ||
13 | currentLanguage() { | 13 | currentLanguage() { |
14 | - return this.languageService.currentLanguage(); | 14 | + return this.translatorService.currentLanguage(); |
15 | } | 15 | } |
16 | 16 | ||
17 | changeLanguage(language: string) { | 17 | changeLanguage(language: string) { |
18 | - this.languageService.changeLanguage(language); | 18 | + this.translatorService.changeLanguage(language); |
19 | } | 19 | } |
20 | 20 | ||
21 | availableLanguages() { | 21 | availableLanguages() { |
22 | - return this.languageService.availableLanguages; | 22 | + return this.translatorService.availableLanguages; |
23 | } | 23 | } |
24 | } | 24 | } |
src/app/components/language-selector/language.service.spec.ts
@@ -1,61 +0,0 @@ | @@ -1,61 +0,0 @@ | ||
1 | -import {ComponentFixture} from 'ng-forward/cjs/testing/test-component-builder'; | ||
2 | -import {provide} from 'ng-forward'; | ||
3 | - | ||
4 | -import {LanguageService} from './language.service'; | ||
5 | - | ||
6 | -import * as helpers from "../../../spec/helpers"; | ||
7 | - | ||
8 | -describe("Services", () => { | ||
9 | - | ||
10 | - describe("Language Service", () => { | ||
11 | - | ||
12 | - let $rootScope: ng.IScope; | ||
13 | - let $q: ng.IQService; | ||
14 | - | ||
15 | - beforeEach(inject((_$rootScope_: ng.IRootScopeService, _$q_: ng.IQService) => { | ||
16 | - $rootScope = _$rootScope_; | ||
17 | - $q = _$q_; | ||
18 | - })); | ||
19 | - | ||
20 | - it("set available languages when change language", (done) => { | ||
21 | - let component: LanguageService = new LanguageService( | ||
22 | - <any>helpers.mocks.$translate, | ||
23 | - <any>helpers.mocks.tmhDynamicLocale, | ||
24 | - <any>helpers.mocks.amMoment, | ||
25 | - <any>helpers.mocks.angularLoad, | ||
26 | - helpers.mocks.scopeWithEvents | ||
27 | - ); | ||
28 | - component.availableLanguages = null; | ||
29 | - expect(component.availableLanguages).toBeNull(); | ||
30 | - component.changeLanguage('en'); | ||
31 | - expect(component.availableLanguages).toBeDefined(); | ||
32 | - done(); | ||
33 | - }); | ||
34 | - | ||
35 | - it("change the language", (done) => { | ||
36 | - let component: LanguageService = new LanguageService( | ||
37 | - <any>helpers.mocks.$translate, | ||
38 | - <any>helpers.mocks.tmhDynamicLocale, | ||
39 | - <any>helpers.mocks.amMoment, | ||
40 | - <any>helpers.mocks.angularLoad, | ||
41 | - helpers.mocks.scopeWithEvents | ||
42 | - ); | ||
43 | - let loadScripPromise = $q.defer(); | ||
44 | - loadScripPromise.resolve(); | ||
45 | - component["angularLoad"].loadScript = jasmine.createSpy("loadScript").and.returnValue(loadScripPromise.promise); | ||
46 | - component["tmhDynamicLocale"].set = jasmine.createSpy("set"); | ||
47 | - component["tmhDynamicLocale"].get = jasmine.createSpy("get").and.returnValue("en"); | ||
48 | - component["$translate"].use = jasmine.createSpy("use"); | ||
49 | - | ||
50 | - component.changeLanguage('pt'); | ||
51 | - $rootScope.$digest(); | ||
52 | - | ||
53 | - expect(component["angularLoad"].loadScript).toHaveBeenCalledWith("/bower_components/moment/locale/pt.js"); | ||
54 | - expect(component["angularLoad"].loadScript).toHaveBeenCalledWith("/bower_components/messageformat/locale/pt.js"); | ||
55 | - expect(component["tmhDynamicLocale"].set).toHaveBeenCalledWith("pt"); | ||
56 | - expect(component["$translate"].use).toHaveBeenCalledWith("pt"); | ||
57 | - done(); | ||
58 | - }); | ||
59 | - | ||
60 | - }); | ||
61 | -}); |
src/app/components/language-selector/language.service.ts
@@ -1,59 +0,0 @@ | @@ -1,59 +0,0 @@ | ||
1 | -import {Injectable, Inject} from "ng-forward"; | ||
2 | - | ||
3 | -@Injectable() | ||
4 | -@Inject("$translate", "tmhDynamicLocale", "amMoment", "angularLoad", "$rootScope") | ||
5 | -export class LanguageService { | ||
6 | - | ||
7 | - availableLanguages: any; | ||
8 | - | ||
9 | - constructor(private $translate: angular.translate.ITranslateService, | ||
10 | - private tmhDynamicLocale: angular.dynamicLocale.tmhDynamicLocaleService, | ||
11 | - private amMoment: any, | ||
12 | - private angularLoad: any, | ||
13 | - private $rootScope: any) { | ||
14 | - | ||
15 | - this.configAvailableLanguages(); | ||
16 | - this.$rootScope.$on("$localeChangeSuccess", () => { | ||
17 | - this.changeLanguage(tmhDynamicLocale.get() || $translate.use()); | ||
18 | - }); | ||
19 | - } | ||
20 | - | ||
21 | - currentLanguage() { | ||
22 | - return this.$translate.use(); | ||
23 | - } | ||
24 | - | ||
25 | - changeLanguage(language: string) { | ||
26 | - if (!language) { | ||
27 | - console.log("WARN: language undefined"); | ||
28 | - return; | ||
29 | - } | ||
30 | - this.changeMomentLocale(language); | ||
31 | - this.tmhDynamicLocale.set(language); | ||
32 | - this.angularLoad.loadScript(`/bower_components/messageformat/locale/${language}.js`).then(() => { | ||
33 | - return this.$translate.use(language); | ||
34 | - }).then(() => { | ||
35 | - this.configAvailableLanguages(); | ||
36 | - }); | ||
37 | - } | ||
38 | - | ||
39 | - translate(text: string) { | ||
40 | - return this.$translate.instant(text); | ||
41 | - } | ||
42 | - | ||
43 | - private configAvailableLanguages() { | ||
44 | - this.availableLanguages = { | ||
45 | - "en": this.$translate.instant("language.en"), | ||
46 | - "pt": this.$translate.instant("language.pt") | ||
47 | - }; | ||
48 | - } | ||
49 | - | ||
50 | - private changeMomentLocale(language: string) { | ||
51 | - let localePromise = Promise.resolve(); | ||
52 | - if (language !== "en") { | ||
53 | - localePromise = this.angularLoad.loadScript(`/bower_components/moment/locale/${language}.js`); | ||
54 | - } | ||
55 | - localePromise.then(() => { | ||
56 | - this.amMoment.changeLocale(language); | ||
57 | - }); | ||
58 | - } | ||
59 | -} |
src/app/components/navbar/navbar.spec.ts
@@ -71,8 +71,8 @@ describe("Components", () => { | @@ -71,8 +71,8 @@ describe("Components", () => { | ||
71 | AUTH_EVENTS | 71 | AUTH_EVENTS |
72 | } | 72 | } |
73 | }), | 73 | }), |
74 | - provide('LanguageService', { | ||
75 | - useValue: helpers.mocks.languageService | 74 | + provide('TranslatorService', { |
75 | + useValue: helpers.mocks.translatorService | ||
76 | }) | 76 | }) |
77 | ].concat(helpers.provideFilters("translateFilter")), | 77 | ].concat(helpers.provideFilters("translateFilter")), |
78 | directives: [Navbar], | 78 | directives: [Navbar], |
src/app/components/notification/notification.component.spec.ts
@@ -13,11 +13,25 @@ describe("Components", () => { | @@ -13,11 +13,25 @@ describe("Components", () => { | ||
13 | 13 | ||
14 | beforeEach(angular.mock.module("templates")); | 14 | beforeEach(angular.mock.module("templates")); |
15 | 15 | ||
16 | + it("display an error message when notify an error", done => { | ||
17 | + let sweetAlert = jasmine.createSpyObj("sweetAlert", ["swal"]); | ||
18 | + sweetAlert.swal = jasmine.createSpy("swal"); | ||
19 | + | ||
20 | + let component: Notification = new Notification(<any>helpers.mocks.$log, <any>sweetAlert, <any>helpers.mocks.translatorService); | ||
21 | + component.error("message", "title"); | ||
22 | + expect(sweetAlert.swal).toHaveBeenCalledWith(jasmine.objectContaining({ | ||
23 | + text: "message", | ||
24 | + title: "title", | ||
25 | + type: "error" | ||
26 | + })); | ||
27 | + done(); | ||
28 | + }); | ||
29 | + | ||
16 | it("use the default message when call notification component without a message", done => { | 30 | it("use the default message when call notification component without a message", done => { |
17 | let sweetAlert = jasmine.createSpyObj("sweetAlert", ["swal"]); | 31 | let sweetAlert = jasmine.createSpyObj("sweetAlert", ["swal"]); |
18 | sweetAlert.swal = jasmine.createSpy("swal"); | 32 | sweetAlert.swal = jasmine.createSpy("swal"); |
19 | 33 | ||
20 | - let component: Notification = new Notification(<any>helpers.mocks.$log, <any>sweetAlert, <any>helpers.mocks.languageService); | 34 | + let component: Notification = new Notification(<any>helpers.mocks.$log, <any>sweetAlert, <any>helpers.mocks.translatorService); |
21 | component.error(); | 35 | component.error(); |
22 | expect(sweetAlert.swal).toHaveBeenCalledWith(jasmine.objectContaining({ | 36 | expect(sweetAlert.swal).toHaveBeenCalledWith(jasmine.objectContaining({ |
23 | text: Notification.DEFAULT_ERROR_MESSAGE, | 37 | text: Notification.DEFAULT_ERROR_MESSAGE, |
@@ -30,7 +44,7 @@ describe("Components", () => { | @@ -30,7 +44,7 @@ describe("Components", () => { | ||
30 | let sweetAlert = jasmine.createSpyObj("sweetAlert", ["swal"]); | 44 | let sweetAlert = jasmine.createSpyObj("sweetAlert", ["swal"]); |
31 | sweetAlert.swal = jasmine.createSpy("swal"); | 45 | sweetAlert.swal = jasmine.createSpy("swal"); |
32 | 46 | ||
33 | - let component: Notification = new Notification(<any>helpers.mocks.$log, <any>sweetAlert, <any>helpers.mocks.languageService); | 47 | + let component: Notification = new Notification(<any>helpers.mocks.$log, <any>sweetAlert, <any>helpers.mocks.translatorService); |
34 | component.success("title", "message", 1000); | 48 | component.success("title", "message", 1000); |
35 | expect(sweetAlert.swal).toHaveBeenCalledWith(jasmine.objectContaining({ | 49 | expect(sweetAlert.swal).toHaveBeenCalledWith(jasmine.objectContaining({ |
36 | type: "success" | 50 | type: "success" |
@@ -42,7 +56,7 @@ describe("Components", () => { | @@ -42,7 +56,7 @@ describe("Components", () => { | ||
42 | let sweetAlert = jasmine.createSpyObj("sweetAlert", ["swal"]); | 56 | let sweetAlert = jasmine.createSpyObj("sweetAlert", ["swal"]); |
43 | sweetAlert.swal = jasmine.createSpy("swal"); | 57 | sweetAlert.swal = jasmine.createSpy("swal"); |
44 | 58 | ||
45 | - let component: Notification = new Notification(<any>helpers.mocks.$log, <any>sweetAlert, <any>helpers.mocks.languageService); | 59 | + let component: Notification = new Notification(<any>helpers.mocks.$log, <any>sweetAlert, <any>helpers.mocks.translatorService); |
46 | component.httpError(500, {}); | 60 | component.httpError(500, {}); |
47 | expect(sweetAlert.swal).toHaveBeenCalledWith(jasmine.objectContaining({ | 61 | expect(sweetAlert.swal).toHaveBeenCalledWith(jasmine.objectContaining({ |
48 | text: "notification.http_error.500.message" | 62 | text: "notification.http_error.500.message" |
@@ -54,7 +68,7 @@ describe("Components", () => { | @@ -54,7 +68,7 @@ describe("Components", () => { | ||
54 | let sweetAlert = jasmine.createSpyObj("sweetAlert", ["swal"]); | 68 | let sweetAlert = jasmine.createSpyObj("sweetAlert", ["swal"]); |
55 | sweetAlert.swal = jasmine.createSpy("swal"); | 69 | sweetAlert.swal = jasmine.createSpy("swal"); |
56 | 70 | ||
57 | - let component: Notification = new Notification(<any>helpers.mocks.$log, <any>sweetAlert, <any>helpers.mocks.languageService); | 71 | + let component: Notification = new Notification(<any>helpers.mocks.$log, <any>sweetAlert, <any>helpers.mocks.translatorService); |
58 | component.success("title", "message"); | 72 | component.success("title", "message"); |
59 | expect(sweetAlert.swal).toHaveBeenCalledWith(jasmine.objectContaining({ | 73 | expect(sweetAlert.swal).toHaveBeenCalledWith(jasmine.objectContaining({ |
60 | type: "success", | 74 | type: "success", |
src/app/components/notification/notification.component.ts
1 | import {Injectable, Inject} from "ng-forward"; | 1 | import {Injectable, Inject} from "ng-forward"; |
2 | -import {LanguageService} from "../language-selector/language.service"; | 2 | +import {TranslatorService} from "../translator/translator.service"; |
3 | 3 | ||
4 | @Injectable() | 4 | @Injectable() |
5 | -@Inject("$log", "SweetAlert", LanguageService) | 5 | +@Inject("$log", "SweetAlert", TranslatorService) |
6 | export class Notification { | 6 | export class Notification { |
7 | 7 | ||
8 | constructor( | 8 | constructor( |
9 | private $log: ng.ILogService, | 9 | private $log: ng.ILogService, |
10 | private SweetAlert: any, | 10 | private SweetAlert: any, |
11 | - private languageService: LanguageService | 11 | + private translatorService: TranslatorService |
12 | ) { } | 12 | ) { } |
13 | 13 | ||
14 | public static DEFAULT_ERROR_TITLE = "notification.error.default.title"; | 14 | public static DEFAULT_ERROR_TITLE = "notification.error.default.title"; |
@@ -16,10 +16,10 @@ export class Notification { | @@ -16,10 +16,10 @@ export class Notification { | ||
16 | public static DEFAULT_SUCCESS_TIMER = 1000; | 16 | public static DEFAULT_SUCCESS_TIMER = 1000; |
17 | 17 | ||
18 | error(message: string = Notification.DEFAULT_ERROR_MESSAGE, title: string = Notification.DEFAULT_ERROR_TITLE) { | 18 | error(message: string = Notification.DEFAULT_ERROR_MESSAGE, title: string = Notification.DEFAULT_ERROR_TITLE) { |
19 | - this.$log.debug("Notification error:", title, message, this.languageService.currentLanguage()); | 19 | + this.$log.debug("Notification error:", title, message, this.translatorService.currentLanguage()); |
20 | this.SweetAlert.swal({ | 20 | this.SweetAlert.swal({ |
21 | - title: this.languageService.translate(title), | ||
22 | - text: this.languageService.translate(message), | 21 | + title: this.translatorService.translate(title), |
22 | + text: this.translatorService.translate(message), | ||
23 | type: "error" | 23 | type: "error" |
24 | }); | 24 | }); |
25 | } | 25 | } |
src/app/components/translator/translator.service.spec.ts
0 → 100644
@@ -0,0 +1,116 @@ | @@ -0,0 +1,116 @@ | ||
1 | +import {ComponentFixture} from 'ng-forward/cjs/testing/test-component-builder'; | ||
2 | +import {provide} from 'ng-forward'; | ||
3 | + | ||
4 | +import {TranslatorService} from './translator.service'; | ||
5 | + | ||
6 | +import * as helpers from "../../../spec/helpers"; | ||
7 | + | ||
8 | +describe("Services", () => { | ||
9 | + | ||
10 | + describe("Translator Service", () => { | ||
11 | + | ||
12 | + let $rootScope: ng.IScope; | ||
13 | + let $q: ng.IQService; | ||
14 | + | ||
15 | + beforeEach(inject((_$rootScope_: ng.IRootScopeService, _$q_: ng.IQService) => { | ||
16 | + $rootScope = _$rootScope_; | ||
17 | + $q = _$q_; | ||
18 | + })); | ||
19 | + | ||
20 | + function createComponent() { | ||
21 | + return new TranslatorService( | ||
22 | + <any>helpers.mocks.$translate, | ||
23 | + <any>helpers.mocks.tmhDynamicLocale, | ||
24 | + <any>helpers.mocks.amMoment, | ||
25 | + <any>helpers.mocks.angularLoad, | ||
26 | + $rootScope | ||
27 | + ); | ||
28 | + } | ||
29 | + | ||
30 | + it("set available languages when change language", (done) => { | ||
31 | + let component: TranslatorService = createComponent(); | ||
32 | + component.availableLanguages = null; | ||
33 | + expect(component.availableLanguages).toBeNull(); | ||
34 | + $rootScope.$emit("$translateChangeSuccess"); | ||
35 | + expect(component.availableLanguages).not.toBeNull(); | ||
36 | + done(); | ||
37 | + }); | ||
38 | + | ||
39 | + it("change the language", (done) => { | ||
40 | + let component: TranslatorService = createComponent(); | ||
41 | + let loadScripPromise = $q.defer(); | ||
42 | + loadScripPromise.resolve(); | ||
43 | + component["angularLoad"].loadScript = jasmine.createSpy("loadScript").and.returnValue(loadScripPromise.promise); | ||
44 | + component["tmhDynamicLocale"].set = jasmine.createSpy("set"); | ||
45 | + component["tmhDynamicLocale"].get = jasmine.createSpy("get").and.returnValue("en"); | ||
46 | + component["$translate"].use = jasmine.createSpy("use"); | ||
47 | + | ||
48 | + component.changeLanguage('pt'); | ||
49 | + $rootScope.$digest(); | ||
50 | + | ||
51 | + expect(component["angularLoad"].loadScript).toHaveBeenCalledWith("/bower_components/moment/locale/pt.js"); | ||
52 | + expect(component["angularLoad"].loadScript).toHaveBeenCalledWith("/bower_components/messageformat/locale/pt.js"); | ||
53 | + expect(component["tmhDynamicLocale"].set).toHaveBeenCalledWith("pt"); | ||
54 | + expect(component["$translate"].use).toHaveBeenCalledWith("pt"); | ||
55 | + done(); | ||
56 | + }); | ||
57 | + | ||
58 | + it("do not load moment locale when change the language to english", (done) => { | ||
59 | + let component: TranslatorService = createComponent(); | ||
60 | + component["angularLoad"].loadScript = jasmine.createSpy("loadScript").and.returnValue($q.defer().promise); | ||
61 | + component.changeLanguage('en'); | ||
62 | + expect(component["angularLoad"].loadScript).not.toHaveBeenCalledWith("/bower_components/moment/locale/pt.js"); | ||
63 | + done(); | ||
64 | + }); | ||
65 | + | ||
66 | + it("do nothing when call change language with null", (done) => { | ||
67 | + let component: TranslatorService = createComponent(); | ||
68 | + component["angularLoad"].loadScript = jasmine.createSpy("loadScript"); | ||
69 | + component["tmhDynamicLocale"].set = jasmine.createSpy("set"); | ||
70 | + component["$translate"].use = jasmine.createSpy("use"); | ||
71 | + | ||
72 | + component.changeLanguage(null); | ||
73 | + | ||
74 | + expect(component["angularLoad"].loadScript).not.toHaveBeenCalled(); | ||
75 | + expect(component["tmhDynamicLocale"].set).not.toHaveBeenCalled(); | ||
76 | + expect(component["$translate"].use).not.toHaveBeenCalled(); | ||
77 | + done(); | ||
78 | + }); | ||
79 | + | ||
80 | + it("return the current language used by the translator", (done) => { | ||
81 | + let component: TranslatorService = createComponent(); | ||
82 | + component["$translate"].use = jasmine.createSpy("use").and.returnValue("en"); | ||
83 | + expect(component.currentLanguage()).toEqual("en"); | ||
84 | + expect(component["$translate"].use).toHaveBeenCalled(); | ||
85 | + done(); | ||
86 | + }); | ||
87 | + | ||
88 | + it("call translate service when translate a text", (done) => { | ||
89 | + let component: TranslatorService = createComponent(); | ||
90 | + component["$translate"].instant = jasmine.createSpy("instant"); | ||
91 | + component.translate("text"); | ||
92 | + expect(component["$translate"].instant).toHaveBeenCalledWith("text"); | ||
93 | + done(); | ||
94 | + }); | ||
95 | + | ||
96 | + it("change the language when receive an event", (done) => { | ||
97 | + let component: TranslatorService = createComponent(); | ||
98 | + component.changeLanguage = jasmine.createSpy("changeLanguage"); | ||
99 | + $rootScope.$emit("$localeChangeSuccess"); | ||
100 | + expect(component.changeLanguage).toHaveBeenCalled(); | ||
101 | + done(); | ||
102 | + }); | ||
103 | + | ||
104 | + it("use the translate language when receive a change language event and there is no language previously selected", (done) => { | ||
105 | + let component: TranslatorService = createComponent(); | ||
106 | + component.changeLanguage = jasmine.createSpy("changeLanguage"); | ||
107 | + component["tmhDynamicLocale"].get = jasmine.createSpy("get").and.returnValue(null); | ||
108 | + component["$translate"].use = jasmine.createSpy("use").and.returnValue("en"); | ||
109 | + | ||
110 | + $rootScope.$emit("$localeChangeSuccess"); | ||
111 | + expect(component["$translate"].use).toHaveBeenCalled(); | ||
112 | + expect(component.changeLanguage).toHaveBeenCalledWith("en"); | ||
113 | + done(); | ||
114 | + }); | ||
115 | + }); | ||
116 | +}); |
@@ -0,0 +1,59 @@ | @@ -0,0 +1,59 @@ | ||
1 | +import {Injectable, Inject} from "ng-forward"; | ||
2 | + | ||
3 | +@Injectable() | ||
4 | +@Inject("$translate", "tmhDynamicLocale", "amMoment", "angularLoad", "$rootScope") | ||
5 | +export class TranslatorService { | ||
6 | + | ||
7 | + availableLanguages: any; | ||
8 | + | ||
9 | + constructor(private $translate: angular.translate.ITranslateService, | ||
10 | + private tmhDynamicLocale: angular.dynamicLocale.tmhDynamicLocaleService, | ||
11 | + private amMoment: any, | ||
12 | + private angularLoad: any, | ||
13 | + private $rootScope: any) { | ||
14 | + | ||
15 | + this.$rootScope.$on("$localeChangeSuccess", () => { | ||
16 | + this.changeLanguage(tmhDynamicLocale.get() || $translate.use()); | ||
17 | + }); | ||
18 | + this.$rootScope.$on("$translateChangeSuccess", () => { | ||
19 | + this.configAvailableLanguages(); | ||
20 | + }); | ||
21 | + } | ||
22 | + | ||
23 | + currentLanguage() { | ||
24 | + return this.$translate.use(); | ||
25 | + } | ||
26 | + | ||
27 | + changeLanguage(language: string) { | ||
28 | + if (!language) { | ||
29 | + console.log("WARN: language undefined"); | ||
30 | + return; | ||
31 | + } | ||
32 | + this.changeMomentLocale(language); | ||
33 | + this.tmhDynamicLocale.set(language); | ||
34 | + this.angularLoad.loadScript(`/bower_components/messageformat/locale/${language}.js`).then(() => { | ||
35 | + return this.$translate.use(language); | ||
36 | + }); | ||
37 | + } | ||
38 | + | ||
39 | + translate(text: string) { | ||
40 | + return this.$translate.instant(text); | ||
41 | + } | ||
42 | + | ||
43 | + private configAvailableLanguages() { | ||
44 | + this.availableLanguages = { | ||
45 | + "en": this.$translate.instant("language.en"), | ||
46 | + "pt": this.$translate.instant("language.pt") | ||
47 | + }; | ||
48 | + } | ||
49 | + | ||
50 | + private changeMomentLocale(language: string) { | ||
51 | + let localePromise = Promise.resolve(); | ||
52 | + if (language !== "en") { | ||
53 | + localePromise = this.angularLoad.loadScript(`/bower_components/moment/locale/${language}.js`); | ||
54 | + } | ||
55 | + localePromise.then(() => { | ||
56 | + this.amMoment.changeLocale(language); | ||
57 | + }); | ||
58 | + } | ||
59 | +} |
src/app/index.route.ts
@@ -1,11 +0,0 @@ | @@ -1,11 +0,0 @@ | ||
1 | - | ||
2 | - | ||
3 | -/** @ngInject */ | ||
4 | -export function routeConfig($stateProvider: ng.ui.IStateProvider, $urlRouterProvider: ng.ui.IUrlRouterProvider) { | ||
5 | - $stateProvider | ||
6 | - .state("main.profile.settings", { | ||
7 | - url: "^/myprofile/:profile" | ||
8 | - }); | ||
9 | - | ||
10 | - $urlRouterProvider.otherwise("/"); | ||
11 | -} |
src/app/index.ts
1 | import {NoosferoApp} from "./index.module"; | 1 | import {NoosferoApp} from "./index.module"; |
2 | import {noosferoModuleConfig} from "./index.config"; | 2 | import {noosferoModuleConfig} from "./index.config"; |
3 | import {noosferoAngularRunBlock} from "./index.run"; | 3 | import {noosferoAngularRunBlock} from "./index.run"; |
4 | -import {routeConfig} from "./index.route"; | ||
5 | 4 | ||
6 | import {Main} from "./main/main.component"; | 5 | import {Main} from "./main/main.component"; |
7 | import {bootstrap, bundle} from "ng-forward"; | 6 | import {bootstrap, bundle} from "ng-forward"; |
@@ -28,5 +27,3 @@ NoosferoApp.addConstants("AUTH_EVENTS", AUTH_EVENTS); | @@ -28,5 +27,3 @@ NoosferoApp.addConstants("AUTH_EVENTS", AUTH_EVENTS); | ||
28 | 27 | ||
29 | NoosferoApp.addConfig(noosferoModuleConfig); | 28 | NoosferoApp.addConfig(noosferoModuleConfig); |
30 | NoosferoApp.run(noosferoAngularRunBlock); | 29 | NoosferoApp.run(noosferoAngularRunBlock); |
31 | - | ||
32 | -NoosferoApp.addConfig(routeConfig); |
src/app/profile/profile.component.ts
@@ -7,6 +7,7 @@ import {ContentViewerActions} from "../content-viewer/content-viewer-actions.com | @@ -7,6 +7,7 @@ import {ContentViewerActions} from "../content-viewer/content-viewer-actions.com | ||
7 | import {NoosferoActivities} from "../components/noosfero-activities/activities.component"; | 7 | import {NoosferoActivities} from "../components/noosfero-activities/activities.component"; |
8 | import {ProfileService} from "../../lib/ng-noosfero-api/http/profile.service"; | 8 | import {ProfileService} from "../../lib/ng-noosfero-api/http/profile.service"; |
9 | import {Notification} from "../components/notification/notification.component"; | 9 | import {Notification} from "../components/notification/notification.component"; |
10 | +import {MyProfile} from "./myprofile.component"; | ||
10 | 11 | ||
11 | 12 | ||
12 | /** | 13 | /** |
@@ -39,6 +40,11 @@ import {Notification} from "../components/notification/notification.component"; | @@ -39,6 +40,11 @@ import {Notification} from "../components/notification/notification.component"; | ||
39 | } | 40 | } |
40 | }, | 41 | }, |
41 | { | 42 | { |
43 | + name: 'main.profile.settings', | ||
44 | + url: "^/myprofile/:profile", | ||
45 | + component: MyProfile | ||
46 | + }, | ||
47 | + { | ||
42 | name: 'main.profile.cms', | 48 | name: 'main.profile.cms', |
43 | url: "^/myprofile/:profile/cms", | 49 | url: "^/myprofile/:profile/cms", |
44 | component: Cms, | 50 | component: Cms, |
src/languages/en.json
@@ -20,6 +20,6 @@ | @@ -20,6 +20,6 @@ | ||
20 | "navbar.content_viewer_actions.new_post": "New Post", | 20 | "navbar.content_viewer_actions.new_post": "New Post", |
21 | "notification.error.default.message": "Something went wrong!", | 21 | "notification.error.default.message": "Something went wrong!", |
22 | "notification.error.default.title": "Oops...", | 22 | "notification.error.default.title": "Oops...", |
23 | - "notification.profile.not_found": "Profile not found", | 23 | + "notification.profile.not_found": "Page not found", |
24 | "notification.http_error.401.message": "Unauthorized" | 24 | "notification.http_error.401.message": "Unauthorized" |
25 | } | 25 | } |
src/languages/pt.json
@@ -20,6 +20,6 @@ | @@ -20,6 +20,6 @@ | ||
20 | "navbar.content_viewer_actions.new_post": "Novo Artigo", | 20 | "navbar.content_viewer_actions.new_post": "Novo Artigo", |
21 | "notification.error.default.message": "Algo deu errado!", | 21 | "notification.error.default.message": "Algo deu errado!", |
22 | "notification.error.default.title": "Oops...", | 22 | "notification.error.default.title": "Oops...", |
23 | - "notification.profile.not_found": "Perfil não encontrado", | 23 | + "notification.profile.not_found": "Página não encontrada", |
24 | "notification.http_error.401.message": "Não autorizado" | 24 | "notification.http_error.401.message": "Não autorizado" |
25 | } | 25 | } |
src/spec/mocks.ts
@@ -107,7 +107,7 @@ export var mocks = { | @@ -107,7 +107,7 @@ export var mocks = { | ||
107 | $log: { | 107 | $log: { |
108 | debug: () => { } | 108 | debug: () => { } |
109 | }, | 109 | }, |
110 | - languageService: { | 110 | + translatorService: { |
111 | currentLanguage: () => { }, | 111 | currentLanguage: () => { }, |
112 | changeLanguage: (lang: string) => { }, | 112 | changeLanguage: (lang: string) => { }, |
113 | translate: (text: string) => { return text; } | 113 | translate: (text: string) => { return text; } |