Skip to content

Commit 23ee82d

Browse files
authored
Merge pull request #48 from tflori/feature-observeTranslate
Feature observe translate
2 parents 42ac8f9 + ad58182 commit 23ee82d

File tree

3 files changed

+94
-6
lines changed

3 files changed

+94
-6
lines changed

docs/Translator.md

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ resolved once language got loaded.
2727
Example:
2828

2929
```ts
30-
translateService.waitForTranslation().then(() => this.translation = translateService.instant('TEXT'));
30+
translator.waitForTranslation().then(() => this.translation = translator.instant('TEXT'));
3131
```
3232

3333
### translate(keys: string|string[], params?: any, lang?: string): Promise<string|string[]>
@@ -42,7 +42,19 @@ case the promise get resolved with the keys itself.
4242
If keys is an array you get an array with the same order back.
4343

4444
```ts
45-
translateService.translate(['STATUS_OPEN', 'STATUS_CLOSED']).then((translations) => {
45+
translator.translate(['STATUS_OPEN', 'STATUS_CLOSED']).then((translations) => {
46+
this.translations['open'] = translations[0];
47+
this.translations['closed'] = translations[1];
48+
});
49+
```
50+
51+
### observe(keys: string|string[], params?: any): Observable<string|string[]>
52+
53+
Instead of using the language given it is using the current language and pushes the translation for the new language
54+
every time when the language got changed.
55+
56+
```ts
57+
translator.observe(['STATUS_OPEN', 'STATUS_CLOSED']).subscribe((translations) => {
4658
this.translations['open'] = translations[0];
4759
this.translations['closed'] = translations[1];
4860
});
@@ -54,11 +66,11 @@ Basically it is the same like `translate` but it does not wait for translation a
5466
you take a look in the code you will see that `translate` is using `instant` after translations got loaded.
5567

5668
```ts
57-
translateService.waitForTranslation().then(() => {
69+
translator.waitForTranslation().then(() => {
5870
this.translations = {
5971
statuses: {
60-
open: translateService.instant('STATUS_OPEN'),
61-
closed: translateService.instant('STATUS_CLOSED')
72+
open: translator.instant('STATUS_OPEN'),
73+
closed: translator.instant('STATUS_CLOSED')
6274
}
6375
}
6476
});

src/Translator.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,28 @@ export class Translator {
112112
});
113113
}
114114

115+
/**
116+
* Translate keys for current language and return an observable.
117+
*
118+
* The observable gets new translations if the language get changed.
119+
*
120+
* @param {string|string[]} keys
121+
* @param {any?} params
122+
* @returns {Observable<string|string[]>}
123+
*/
124+
public observe(keys: string | string[], params: any = {}): Observable<string | string[]> {
125+
return new Observable<string | string[]>((observer: Observer<string | string[]>) => {
126+
this.translate(keys, params).then((translations: string | string[]) => {
127+
observer.next(translations);
128+
});
129+
this.languageChangedObservable.subscribe(() => {
130+
this.translate(keys, params).then((translations: string | string[]) => {
131+
observer.next(translations);
132+
});
133+
});
134+
});
135+
}
136+
115137
/**
116138
* Translate keys for current language or given language (lang) synchronously.
117139
*
@@ -265,7 +287,8 @@ export class Translator {
265287
* @returns {any}
266288
*/
267289
private pipeTransform(value: any, pipeExpression: string, __context: any): any {
268-
let [pipeName, ...argExpressions] = pipeExpression.split(":");
290+
let argExpressions = pipeExpression.split(":");
291+
let pipeName = argExpressions.shift();
269292
let args = [];
270293
let argExpression: string = "";
271294
while (argExpressions.length) {

tests/Translator.spec.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,59 @@ describe("Translator", () => {
420420
}));
421421
});
422422

423+
describe("observe", () => {
424+
let translateSpy: jasmine.Spy;
425+
426+
beforeEach(() => {
427+
translateSpy = spyOn(translator, "translate").and.callFake((keys: string|string[], params?: any) => {
428+
return Promise.resolve(keys);
429+
});
430+
});
431+
432+
it("returns an observable", () => {
433+
let result = translator.observe("HELLO");
434+
435+
expect(result).toEqual(jasmine.any(Observable));
436+
});
437+
438+
it("is using translate", () => {
439+
translator.observe("HELLO").subscribe();
440+
441+
expect(translator.translate).toHaveBeenCalledWith("HELLO", {});
442+
});
443+
444+
it("pushes the result from translate to observable", fakeAsync(() => {
445+
let spy = jasmine.createSpy("subscriber");
446+
translator.observe("HELLO").subscribe(spy);
447+
448+
JasminePromise.flush();
449+
450+
expect(spy).toHaveBeenCalledWith("HELLO");
451+
}));
452+
453+
it("translates again when language got changed", () => {
454+
translatorConfig.setOptions({ providedLanguages: ["en", "de"]});
455+
456+
translator.observe("HELLO").subscribe();
457+
translator.language = "de";
458+
459+
expect(translator.translate).toHaveBeenCalledTimes(2);
460+
});
461+
462+
it("pushes the result for the new language", fakeAsync(() => {
463+
let spy = jasmine.createSpy("subscriber");
464+
translator.observe("HELLO").subscribe(spy);
465+
466+
JasminePromise.flush();
467+
translateSpy.and.returnValue(Promise.resolve("Hallo"));
468+
translator.language = "de";
469+
JasminePromise.flush();
470+
471+
expect(spy).toHaveBeenCalledWith("HELLO");
472+
expect(spy).toHaveBeenCalledWith("Hallo");
473+
}));
474+
});
475+
423476
describe("instant", () => {
424477
let loaderPromiseResolve: (...params: any[]) => void;
425478

0 commit comments

Comments
 (0)