Angular2及以上版本的多语言问题
1、多语言的配置,正常安装@ngx-translate/core和@ngx-translate/http-loader,注意@ngx-translate/core和@ngx-translate/http-loader的版本和当前使用的Angular版本有关,可以参考下图:

也可参考官方文档:https://github.com/ngx-translate/core#5-use-the-service-the-pipe-or-the-directive
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
import {HttpClient, HttpClientModule} from '@angular/common/http';
// 实现AOT编译
export function createTranslateLoader(http: HttpClient) {
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
}
@NgModule({
declarations: [
AppComponent
],
imports: [
// 此处省略其他无关模块配置
HttpClientModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: (createTranslateLoader),
deps: [HttpClient]
}
}),
]
2、使用this.translateService.instant失效的问题
失效原因:是因为在组件初始化的时候,翻译文件有可能没有加载完成,这个方法要在确保翻译文件加载完成的情况下才能使用
解决方案:1、可以使用get方法替代
2、可以在系统启动的时候通过在providers中做处理,具体代码如下
import { Injector, APP_INITIALIZER } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { LOCATION_INITIALIZED } from '@angular/common';
export function appInitializerFactory(translate: TranslateService, injector: Injector) {
return () => new Promise<any>((resolve: any) => {
const locationInitialized = injector.get(LOCATION_INITIALIZED, Promise.resolve(null));
locationInitialized.then(() => {
const langToSet = 'zh_CN'
translate.setDefaultLang('zh_CN');
let lang = window.localStorage.getItem('lang') || 'zh_CN'
if (lang && lang.indexOf('-')) {
lang = lang.replace('-', '_')
}
translate.use(lang).subscribe(() => {
// console.info(`Successfully initialized '${langToSet}' language.'`);
}, err => {
console.error(`Problem with '${langToSet}' language initialization.'`);
}, () => {
resolve(null);
});
});
});
}
providers: [
{
provide: APP_INITIALIZER,
useFactory: appInitializerFactory,
deps: [TranslateService, Injector],
multi: true
}
]
关于instant失效的问题,参考来源:https://github.com/ngx-translate/core/issues/517

浙公网安备 33010602011771号