代码之家  ›  专栏  ›  技术社区  ›  Archimede

Angular i18国际化,语言程序化改变

  •  0
  • Archimede  · 技术社区  · 6 年前

    通过这个链接,我尝试在我的Angular6应用程序中实现i18国际化,以便在我的html模板中以英语和意大利语翻译一些文本和日期时间。

    https://next.angular.io/guide/i18n

    我知道这个功能分为三个阶段:

    1) 定义翻译文本。没问题,我创建了一个src/locale文件夹,其中有两个文件:messages.en.xlf(和message.it.xlf);下面是en版本的一个示例。

    <trans-unit id="introductionHeader" datatype="html">
      <source>Hello i18n! (en-EN)</source>
      <note priority="1" from="description">An introduction header for this sample</note>
      <note priority="1" from="meaning">User welcome</note>
    </trans-unit>
    

    <h1 i18n="User welcome|An introduction header for this sample">
        Hello i18n!
    </h1>
    

    现在,我读的方式(3。阶段)以在启动期间本地化应用程序(在Angular.json文件中进行一些编辑,并使用配置选项启动ng-serve);但是,与此相反,我将以编程方式更改应用程序的语言。换句话说,我想要一个命令,比如

    SwitchAppLanguage('en')
    

    例如,这样用户可以通过一个按钮自行更改它,或者应用程序可以读取浏览器的默认语言。我该怎么做?

    编辑:

    "configurations": {
      "production": {
         "i18nFile": "src/locale/messages.it.xlf",
         "i18nFormat": "xlf",
         "i18nLocale": "it",
    (...)
    

    0 回复  |  直到 6 年前
        1
  •  0
  •   Mattijs    5 年前

    因此,如果使用JIT,可以使用webpacks loader来热交换语言文件:

    主要技术指标

    import { enableProdMode } from '@angular/core';
    import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
    
    import { AppModule } from './app/app.module';
    import { environment } from './environments/environment';
    import { getTranslationProviders } from './app/providers/i18n.provider';
    import { LocaleService } from './app/services/locale.service';
    
    if ( environment.production ) {
      enableProdMode();
    }
    
    const locale = new LocaleService();
    locale.getLocale().then( ( localeValue ) => {
      getTranslationProviders( localeValue ).then( providers => {
        platformBrowserDynamic().bootstrapModule( AppModule, { providers } )
          .catch( err => console.log( err ) );
      } );
    } );
    

    i18n.提供商

    import { TRANSLATIONS, TRANSLATIONS_FORMAT } from '@angular/core';
    declare const require;
    
    export function getTranslationProviders( locale: string ): Promise<any[]> {
    
      // Get the locale id as arugment or from the global
      //
      const localeValue = locale || document[ 'locale' ] as string;
    
    
      // return no providers if fail to get translation file for locale
      //
      const noProviders: Object[] = [];
    
      // No locale or AU, doesn't require translation
      //
      if ( !localeValue || localeValue === 'au' ) {
        return Promise.resolve( noProviders );
      }
      try {
        const translations = require( `raw-loader!../../locale/messages.${ localeValue }.xlf` );
        return Promise.resolve( [
          { provide: TRANSLATIONS, useValue: translations },
          { provide: TRANSLATIONS_FORMAT, useValue: 'xlf' }
        ] );
      } catch ( error ) {
        console.error( error );
        return Promise.resolve( noProviders );
      }
    
    }
    
    

    以及 本地服务

    import { WindowRef } from 'app/services/windowRef.service';
    import { environment } from 'environments/environment';
    
    
    @Injectable()
    
    export class LocaleService {
      _locale: string;
      set locale( val: string ) {
        this._locale = val;
      }
      get locale() {
        return this._locale;
      }
    
    
      constructor() {
        this.setLocale();
      }
    
      setLocale() {
        const winRef = new WindowRef();
    
        this.locale = ( environment.countryLookup[ document.location.hostname ] || 'au' ).toLowerCase();
    
        const match = document.location.search.match( /au|nz/ );
    
        if ( match ) {
          this.locale = match.shift();
        }
        // store locale in document
        //
        winRef.nativeWindow.document.locale = this.locale;
      }
    
      getLocale(): Promise<string> {
        return Promise.resolve( this.locale );
      }
    
    }