我的做法与 Beejee 类似,但我扩展了翻译服务。在 TranslateService 的扩展中,我将库的翻译添加到全局应用程序翻译的子级别 (ui.[language]) 下,因为我们使用与根应用程序相同的实例,并且我们不想覆盖根应用程序的翻译. 然后我在组件级别提供了扩展而不是普通的 TranslateService,因此它甚至用于此组件中的 translate 指令并且它是隔离的,这意味着我们不会通过覆盖 currentLang 和 defautlLang 的 getter 来破坏根应用程序的翻译。
ui-translate.service.ts:
const availableLanguages: any = {
'de' : { ... YOUR DE TRANSLATIONS ... },
'en' : { ... YOUR EN TRANSLATIONS ... }
...
};
const langPrefix = 'ui';
@Injectable({
providedIn: 'root'
})
export class UiTranslateService extends TranslateService implements TranslateService {
constructor(public store: TranslateStore,
public currentLoader: TranslateLoader,
public compiler: TranslateCompiler,
public parser: TranslateParser,
public missingTranslationHandler: MissingTranslationHandler,
@Inject(USE_DEFAULT_LANG) useDefaultLang: boolean = true,
@Inject(USE_STORE) isolate: boolean = false) {
super(store, currentLoader, compiler, parser, missingTranslationHandler, useDefaultLang, isolate);
this.onTranslationChange.subscribe((_res: TranslationChangeEvent) => {
// ensure after translation change we (re-)add our translations
if (_res.lang.indexOf(langPrefix) !== 0) {
this.applyUiTranslations();
}
});
this.applyUiTranslations();
}
private applyUiTranslations() {
for (var lang in availableLanguages) {
if (availableLanguages.hasOwnProperty(lang)) {
this.setTranslation(langPrefix + '.' + lang, availableLanguages[lang], true);
}
}
}
/**
* The default lang to fallback when translations are missing on the current lang
*/
get defaultLang(): string {
return langPrefix + '.' + this.store.defaultLang;
}
/**
* The lang currently used
*/
get currentLang(): string {
return this.store.currentLang === undefined ? undefined : langPrefix + '.' + this.store.currentLang;
}
public getParsedResult(translations: any, key: any, interpolateParams?: Object): any {
// apply our translations here
var lang = (this.currentLang || this.defaultLang).split('.')[1];
translations = lang == 'de' ? de : en;
return super.getParsedResult(translations, key, interpolateParams);
}
public get(key: string | Array<string>, interpolateParams?: Object): Observable<string | any> {
return super.get(key, interpolateParams);
}
}
我的.component.ts:
@Component({
selector: 'xxx',
template: 'xxx',
providers: [
{ provide: TranslateService, useClass: UiTranslateService }
]
})
export class MyComponent implements OnInit { }
我的.module.ts:
@NgModule({
imports: [
CommonModule,
TranslateModule
]
})
export class ComponentsModule {}