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

posted @ 2020-09-07 17:46  闯入码途的水产人  阅读(329)  评论(0编辑  收藏  举报