Skip to content

Commit 399e1e1

Browse files
committed
feat(store): loaders
1 parent 6ebd222 commit 399e1e1

File tree

2 files changed

+38
-6
lines changed

2 files changed

+38
-6
lines changed

projects/ngx-translate/src/lib/translate.service.ts

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import { inject, Injectable, InjectionToken } from "@angular/core";
1+
import { inject, Injectable, InjectionToken, OnDestroy } from "@angular/core";
22
import { concat, defer, forkJoin, isObservable, Observable, of } from "rxjs";
33
import { concatMap, map, shareReplay, switchMap, take } from "rxjs/operators";
44
import { MissingTranslationHandler } from "./missing-translation-handler";
55
import { TranslateCompiler } from "./translate.compiler";
66
import { TranslateLoader } from "./translate.loader";
77
import { InterpolateFunction, TranslateParser } from "./translate.parser";
88
import { TranslateStore } from "./translate.store";
9-
import { insertValue, isArray, isDefinedAndNotNull, isDict, isString } from "./util";
9+
import { insertValue, isArray, isDefinedAndNotNull, isDict, isString, mergeDeep } from "./util";
1010

1111
/**
1212
* Configuration object for the translation service.
@@ -173,7 +173,7 @@ export abstract class ITranslateService {
173173
}
174174

175175
@Injectable()
176-
export class TranslateService implements ITranslateService {
176+
export class TranslateService implements ITranslateService, OnDestroy {
177177
private loadingTranslations!: Observable<InterpolatableTranslationObject>;
178178
private pending = false;
179179
private _translationRequests: Record<Language, Observable<TranslationObject>> = {};
@@ -185,6 +185,8 @@ export class TranslateService implements ITranslateService {
185185
private missingTranslationHandler = inject(MissingTranslationHandler);
186186
private store: TranslateStore = inject(TranslateStore);
187187

188+
private _loaderIndex!: number;
189+
188190
private readonly extend: boolean = false;
189191

190192
/**
@@ -225,6 +227,8 @@ export class TranslateService implements ITranslateService {
225227
}
226228

227229
constructor() {
230+
this._addLoader();
231+
228232
const config: TranslateServiceConfig = {
229233
extend: false,
230234
fallbackLang: null,
@@ -247,6 +251,17 @@ export class TranslateService implements ITranslateService {
247251
}
248252
}
249253

254+
private _addLoader() {
255+
while (this.store.loaders.has(this._loaderIndex)) {
256+
this._loaderIndex++;
257+
}
258+
this.store.loaders.set(this._loaderIndex, this.currentLoader);
259+
}
260+
261+
ngOnDestroy() {
262+
this.store.loaders.delete(this._loaderIndex);
263+
}
264+
250265
/**
251266
* Sets the fallback language to use if a translation is not found in the
252267
* current language
@@ -341,9 +356,22 @@ export class TranslateService implements ITranslateService {
341356
): Observable<InterpolatableTranslationObject> {
342357
this.pending = true;
343358

344-
const loadingTranslations = this.currentLoader
345-
.getTranslation(lang)
346-
.pipe(shareReplay(1), take(1));
359+
const loaders = Array.from(this.store.loaders.values());
360+
const requests = loaders.map((loader) => loader.getTranslation(lang).pipe(take(1)));
361+
362+
// Merge all translation objects
363+
const loadingTranslations = (
364+
requests.length > 1
365+
? forkJoin(requests).pipe(
366+
map((results: TranslationObject[]) =>
367+
results.reduce(
368+
(acc, curr) => mergeDeep(acc, curr),
369+
{} as TranslationObject,
370+
),
371+
),
372+
)
373+
: requests[0]
374+
).pipe(shareReplay(1), take(1));
347375

348376
this.loadingTranslations = loadingTranslations.pipe(
349377
map((res: TranslationObject) => this.compiler.compileTranslations(res, lang)),

projects/ngx-translate/src/lib/translate.store.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Injectable } from "@angular/core";
22
import { Observable, Subject } from "rxjs";
3+
import { TranslateLoader } from "./translate.loader";
34
import {
45
FallbackLangChangeEvent,
56
InterpolatableTranslation,
@@ -28,6 +29,8 @@ export class TranslateStore {
2829
private translations: Record<Language, InterpolatableTranslationObject> = {};
2930
private languages: Language[] = [];
3031

32+
loaders = new Map<number, TranslateLoader>();
33+
3134
public getTranslations(language: Language): DeepReadonly<InterpolatableTranslationObject> {
3235
return this.translations[language];
3336
}
@@ -72,6 +75,7 @@ export class TranslateStore {
7275

7376
public setCurrentLang(lang: string, emitChange = true): void {
7477
this.currentLang = lang;
78+
7579
if (emitChange) {
7680
this._onLangChange.next({ lang: lang, translations: this.translations[lang] });
7781
}

0 commit comments

Comments
 (0)