Skip to content

Commit b9381cf

Browse files
committed
feat(core): implement hierarchical translation services with parent-child lookup
BREAKING CHANGE: TranslateModule.forRoot() and forChild() are removed. Use provideTranslateService() and provideChildTranslateService() instead. - Add parent-child service hierarchy with translation lookup bubbling - provideTranslateService() creates isolated root services (isRoot=true) - provideChildTranslateService() creates connected children that: - Delegate lang/fallbackLang to root - Load own translations via provided loader - Fall back to parent when translation not found - MissingTranslationHandler resolution bubbles up hierarchy - Simplify TranslateStore to only manage translations - Move lang/fallback state management to TranslateService - Replace `extend` config with clearer `isRoot` semantic Migration: - TranslateModule.forRoot() → provideTranslateService() - TranslateModule.forChild({ extend: true }) → provideChildTranslateService() - TranslateModule.forChild({ isolate: true }) → provideTranslateService()
1 parent 3972d56 commit b9381cf

12 files changed

+709
-272
lines changed

docs/proposal-providers-and-scoping.md

Lines changed: 344 additions & 39 deletions
Large diffs are not rendered by default.

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

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -32,37 +32,4 @@ export interface TranslateModuleConfig extends TranslateProviders {
3232
imports: [TranslatePipe, TranslateDirective],
3333
exports: [TranslatePipe, TranslateDirective],
3434
})
35-
export class TranslateModule {
36-
/**
37-
* Use this method in your root module to provide the TranslateService
38-
*/
39-
static forRoot(config: TranslateModuleConfig = {}): ModuleWithProviders<TranslateModule> {
40-
return {
41-
ngModule: TranslateModule,
42-
providers: [
43-
...defaultProviders(
44-
{
45-
compiler: provideTranslateCompiler(TranslateNoOpCompiler),
46-
parser: provideTranslateParser(TranslateDefaultParser),
47-
loader: provideTranslateLoader(TranslateNoOpLoader),
48-
missingTranslationHandler: provideMissingTranslationHandler(
49-
DefaultMissingTranslationHandler,
50-
),
51-
...config,
52-
},
53-
true,
54-
),
55-
],
56-
};
57-
}
58-
59-
/**
60-
* Use this method in your other (non-root) modules to import the directive/pipe
61-
*/
62-
static forChild(config: TranslateModuleConfig = {}): ModuleWithProviders<TranslateModule> {
63-
return {
64-
ngModule: TranslateModule,
65-
providers: [...defaultProviders(config, config.isolate ?? false)],
66-
};
67-
}
68-
}
35+
export class TranslateModule { }

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

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ClassProvider, Provider, Type } from "@angular/core";
1+
import { ClassProvider, inject, InjectionToken, Provider, Type } from "@angular/core";
22
import {
33
DefaultMissingTranslationHandler,
44
MissingTranslationHandler,
@@ -21,13 +21,12 @@ export interface TranslateProviders {
2121
missingTranslationHandler?: Provider;
2222
}
2323

24-
export interface ChildTranslateServiceConfig extends Partial<TranslateProviders> {
25-
extend?: boolean;
26-
}
24+
export interface ChildTranslateServiceConfig extends Partial<TranslateProviders> { }
2725

2826
export interface RootTranslateServiceConfig extends ChildTranslateServiceConfig {
2927
fallbackLang?: Language;
3028
lang?: Language;
29+
isRoot?: boolean;
3130

3231
/* @deprecated use `fallbackLang` */
3332
useDefaultLang?: boolean;
@@ -63,13 +62,26 @@ export function provideTranslateService(config: RootTranslateServiceConfig = {})
6362
DefaultMissingTranslationHandler,
6463
),
6564
...config,
65+
isRoot: true,
6666
},
6767
true,
6868
);
6969
}
7070

7171
export function provideChildTranslateService(config: ChildTranslateServiceConfig = {}): Provider[] {
72-
return defaultProviders({ extend: true, ...config }, false);
72+
return defaultProviders(
73+
{
74+
compiler: provideTranslateCompiler(TranslateNoOpCompiler),
75+
parser: provideTranslateParser(TranslateDefaultParser),
76+
loader: provideTranslateLoader(TranslateNoOpLoader),
77+
missingTranslationHandler: provideMissingTranslationHandler(
78+
DefaultMissingTranslationHandler,
79+
),
80+
...config,
81+
isRoot: false,
82+
},
83+
true,
84+
);
7385
}
7486

7587
export function defaultProviders(
@@ -108,7 +120,7 @@ export function defaultProviders(
108120
const serviceConfig: TranslateServiceConfig = {
109121
fallbackLang: config.fallbackLang ?? null,
110122
lang: config.lang,
111-
extend: config.extend ?? false,
123+
isRoot: config.isRoot ?? false,
112124
};
113125

114126
providers.push({
@@ -119,14 +131,6 @@ export function defaultProviders(
119131
providers.push({
120132
provide: TranslateService,
121133
useClass: TranslateService,
122-
deps: [
123-
TranslateStore,
124-
TranslateLoader,
125-
TranslateCompiler,
126-
TranslateParser,
127-
MissingTranslationHandler,
128-
TRANSLATE_SERVICE_CONFIG,
129-
],
130134
});
131135

132136
return providers;

0 commit comments

Comments
 (0)