Skip to content

Commit c32b10c

Browse files
committed
feat: 🎸 pass scope name to loader
1 parent 27ca401 commit c32b10c

File tree

8 files changed

+35
-18
lines changed

8 files changed

+35
-18
lines changed

projects/ngneat/transloco/src/lib/get-fallbacks-loaders.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
import { from } from 'rxjs';
22
import { map } from 'rxjs/operators';
33
import { resolveLoader } from './resolve-loader';
4-
import { TranslocoLoader } from './transloco.loader';
4+
import { TranslocoLoader, TranslocoLoaderData } from './transloco.loader';
55
import { InlineLoader } from './types';
66

77
export function getFallbacksLoaders(
88
mainPath: string,
99
fallbackPath: string,
1010
mainLoader: TranslocoLoader,
11-
inlineLoader: InlineLoader
11+
inlineLoader: InlineLoader,
12+
data: TranslocoLoaderData
1213
) {
1314
return [mainPath, fallbackPath].map(path => {
14-
const loader = resolveLoader(path, mainLoader, inlineLoader);
15+
const loader = resolveLoader(path, mainLoader, inlineLoader, data);
1516

1617
return from(loader).pipe(
1718
map(translation => ({
Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1-
import { TranslocoLoader } from './transloco.loader';
1+
import { TranslocoLoader, TranslocoLoaderData } from './transloco.loader';
22
import { InlineLoader } from './types';
33
import { isFunction } from './helpers';
44

5-
export function resolveLoader(path: string, mainLoader: TranslocoLoader, inlineLoader: InlineLoader) {
5+
export function resolveLoader(
6+
path: string,
7+
mainLoader: TranslocoLoader,
8+
inlineLoader: InlineLoader,
9+
data: TranslocoLoaderData
10+
) {
611
if (inlineLoader) {
712
const pathLoader = inlineLoader[path];
813
if (isFunction(pathLoader) === false) {
@@ -12,5 +17,5 @@ export function resolveLoader(path: string, mainLoader: TranslocoLoader, inlineL
1217
return inlineLoader[path]().then(res => (res.default ? res.default : res));
1318
}
1419

15-
return mainLoader.getTranslation(path);
20+
return mainLoader.getTranslation(path, data);
1621
}

projects/ngneat/transloco/src/lib/tests/service/getTranslation.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { fakeAsync } from '@angular/core/testing';
22
import { flatten } from '@ngneat/transloco';
3-
import { createService, mockLangs, runLoader } from '../transloco.mocks';
3+
import { createService, mockLangs } from '../transloco.mocks';
44
import { loadLang } from './utils';
55

66
describe('getTranslation', () => {

projects/ngneat/transloco/src/lib/tests/service/load.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ describe('load', () => {
3636
spyOn((service as any).loader, 'getTranslation').and.callThrough();
3737
service.load('en').subscribe();
3838
runLoader();
39-
expect((service as any).loader.getTranslation).toHaveBeenCalledWith('en');
39+
expect((service as any).loader.getTranslation).toHaveBeenCalledWith('en', { scope: null });
4040
expect((service as any).translations.size).toEqual(1);
4141
}));
4242

projects/ngneat/transloco/src/lib/tests/service/missingHandler.spec.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ describe('missingHandler', () => {
3737
service.load('en').subscribe();
3838
runLoader();
3939
expect(service.loader.getTranslation).toHaveBeenCalledTimes(2);
40-
expect(service.loader.getTranslation.calls.allArgs()).toEqual([['en'], ['es']]);
40+
expect(service.loader.getTranslation.calls.allArgs()).toEqual([['en', { scope: null }], ['es', { scope: null }]]);
4141
}));
4242

4343
it('should get the translation from the fallback when there is no key', fakeAsync(() => {
@@ -58,7 +58,10 @@ describe('missingHandler', () => {
5858
spyOn(service.loader, 'getTranslation').and.callThrough();
5959
service.load('lazy-page/en').subscribe();
6060
runLoader(2000);
61-
expect(service.loader.getTranslation.calls.allArgs()).toEqual([['lazy-page/en'], ['lazy-page/es']]);
61+
expect(service.loader.getTranslation.calls.allArgs()).toEqual([
62+
['lazy-page/en', { scope: 'lazy-page' }],
63+
['lazy-page/es', { scope: 'lazy-page' }]
64+
]);
6265
expect(service.translate('empty', {}, 'lazy-page/en')).toEqual('resolved from es');
6366
}));
6467

projects/ngneat/transloco/src/lib/transloco.loader.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@ import { Observable, of } from 'rxjs';
33
import { Translation } from './types';
44

55
export interface TranslocoLoader {
6-
getTranslation(lang: string): Observable<Translation> | Promise<Translation>;
6+
getTranslation(lang: string, data: TranslocoLoaderData): Observable<Translation> | Promise<Translation>;
77
}
88

9+
export type TranslocoLoaderData = {
10+
scope: string;
11+
};
12+
913
export class DefaultLoader implements TranslocoLoader {
1014
constructor(private translations: Map<string, Translation>) {}
1115

projects/ngneat/transloco/src/lib/transloco.service.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@ import {
1515
} from './types';
1616
import { flatten, getValue, isString, size, toCamelCase, unflatten } from './helpers';
1717
import { defaultConfig, TRANSLOCO_CONFIG, TranslocoConfig } from './transloco.config';
18-
import { TRANSLOCO_MISSING_HANDLER, TranslocoMissingHandler, TranslocoMissingHandlerData } from './transloco-missing-handler';
18+
import {
19+
TRANSLOCO_MISSING_HANDLER,
20+
TranslocoMissingHandler,
21+
TranslocoMissingHandlerData
22+
} from './transloco-missing-handler';
1923
import { TRANSLOCO_INTERCEPTOR, TranslocoInterceptor } from './transloco.interceptor';
2024
import { TRANSLOCO_FALLBACK_STRATEGY, TranslocoFallbackStrategy } from './transloco-fallback-strategy';
2125
import { mergeConfig } from './merge-config';
@@ -114,17 +118,17 @@ export class TranslocoService implements OnDestroy {
114118
load(path: string, options: LoadOptions = {}): Observable<Translation> {
115119
if (this.cache.has(path) === false) {
116120
let loadTranslation: Observable<Translation | { translation: Translation; lang: string }[]>;
121+
const isScope = this._isLangScoped(path);
122+
const scope = isScope ? getScopeFromLang(path) : null;
117123

118124
if (this.useFallbackTranslation(path)) {
119125
// if the path is scope the fallback should be `scope/fallbackLang`;
120-
const fallback = this._isLangScoped(path)
121-
? `${getScopeFromLang(path)}/${this.firstFallbackLang}`
122-
: this.firstFallbackLang;
126+
const fallback = isScope ? `${scope}/${this.firstFallbackLang}` : this.firstFallbackLang;
123127

124-
const loaders = getFallbacksLoaders(path, fallback, this.loader, options.inlineLoader);
128+
const loaders = getFallbacksLoaders(path, fallback, this.loader, options.inlineLoader, { scope });
125129
loadTranslation = forkJoin(loaders);
126130
} else {
127-
const loader = resolveLoader(path, this.loader, options.inlineLoader);
131+
const loader = resolveLoader(path, this.loader, options.inlineLoader, { scope });
128132
loadTranslation = from(loader);
129133
}
130134

src/app/loaders/http.loader.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { Injectable } from '@angular/core';
66
export class HttpLoader implements TranslocoLoader {
77
constructor(private http: HttpClient) {}
88

9-
getTranslation(langPath: string) {
9+
getTranslation(langPath: string, { scope }) {
1010
return this.http.get<Translation>(`/assets/i18n/${langPath}.json`);
1111
}
1212
}

0 commit comments

Comments
 (0)