Angular2 and webpack - i18n plugin vs ng2-translate

后端 未结 5 1797
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-24 04:01

I want to build a web-application with angular2 and bundle this with webpack. What is the best way for providing multiple languages:

i18n-plugin: https://github.com/

相关标签:
5条回答
  • 2020-12-24 04:26

    A slightly modified version of @M.Nour Berro's answer.

    I made this change as synchronous xhr's are deprecated and possibly support might be removed later.

    function getTranslations(filePath: string): Promise<string> {
      var text = '';
      return new Promise<string> ((resolve, reject) => {
        const fileRequest = new XMLHttpRequest();
        fileRequest.open('GET', filePath, true);
        fileRequest.onerror = function (err) {
          console.log(err);
          reject(err);
        };
        fileRequest.onreadystatechange = function () {
          if (fileRequest.readyState === 4) {
            if (fileRequest.status === 200 || fileRequest.status === 0) {
              text = fileRequest.responseText;
              resolve(text);
            }
          }
        };
        fileRequest.send();
      });
    }
    
    0 讨论(0)
  • 2020-12-24 04:29

    If you are using angular-cli you can follow these steps:

    Be aware that your app must be AOT compatibe, so you should be able to build it with --aot switch:

    ng build --aot
    
    1. Extract messages with ng xi18n command with location for translation file given:

      ng xi18n --output-path src/i18n
      
    2. You will get src/i18n/messages.xlf file. Copy this file and translate messages to languages you need:

      src/i18n/messages.en.xlf
      src/i18n/messages.pl.xlf
      
    3. Serve/build your app with ng serve / ng build command (change locale accordingly):

      ng serve --i18n-file=src/i18n/messages.en.xlf --locale=en --i18n-format=xlf --aot
      
    0 讨论(0)
  • 2020-12-24 04:36

    I got it working with webpack using the cookbook. The xliff file has to be converted to ts like so:

    export const TRANSLATION_SV = `<?xml version="1.0" encoding="UTF-8" ?>
    <xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
      <file source-language="en" datatype="plaintext" original="ng2.template">
        <body>
        <trans-unit id="a73e2898b9e1126ed19dbabe4b5c3715a84db61a" datatype="html">
          <source>Category</source>
          <target>Kategori</target>
        </trans-unit>
        </body>
      </file>
    </xliff>`;

    Then in the main.ts it has to be added

    import { TRANSLATIONS, TRANSLATIONS_FORMAT, LOCALE_ID  } from '@angular/core';
    import { TRANSLATION_SV } from './locale/messages.sv';
    

    and inserted to the bootstrap step:

    platformBrowserDynamic().bootstrapModule(AppModule, {
        providers: [
          {provide: TRANSLATIONS, useValue: TRANSLATION_SV},
          {provide: TRANSLATIONS_FORMAT, useValue: "xlf"},
          {provide: LOCALE_ID, useValue:'sv'}
        ];
    });
    
    0 讨论(0)
  • 2020-12-24 04:41

    in case someone still wondering how to use angular 2 localization with webpack loader, i have modified the provider angular 2 cookbook provided;

    First create i18n.provider.ts

    import { TRANSLATIONS, TRANSLATIONS_FORMAT, LOCALE_ID } from '@angular/core';
    import { Observable } from "rxjs/Rx";
    export function getTranslationProviders(): Promise<Object[]> {
    
    
      // Get the locale id from the global
      const locale = document['locale'] as string;
      // return no providers if fail to get translation file for locale
      const noProviders: Object[] = [];
      // No locale or U.S. English: no translation providers
      if (!locale || locale === 'en') {
        return Promise.resolve(noProviders);
      }
      // Ex: 'locale/messages.fr.xlf`
      const translationFile = `./src/app/localezation/messages.${locale}.xlf`;
      var provider = getTranslationsWithSystemJs(translationFile)
        .then((translations: string) => [
          { provide: TRANSLATIONS, useValue: translations },
          { provide: TRANSLATIONS_FORMAT, useValue: 'xlf' },
          { provide: LOCALE_ID, useValue: locale }
        ])
        .catch(() => noProviders); // ignore if file not found
    
      debugger;
      return provider;
    }
    declare var System: any;
    function getTranslationsWithSystemJs(file: string) {
    // changes Start here 
      var text = "";
      var fileRequest = new XMLHttpRequest();
      fileRequest.open("GET", file, false);
      fileRequest.onerror = function (err) {
        console.log(err);
      }
      fileRequest.onreadystatechange = function () {
        if (fileRequest.readyState === 4) {
          if (fileRequest.status === 200 || fileRequest.status == 0) {
            text = fileRequest.responseText;
          }
        }
      }
      fileRequest.send()
      var observable = Observable.of(text);
      var prom = observable.toPromise();
      return prom; 
    }
    

    notice the changes are :

    1. i used jxjs library to create observable/ promise
    2. i used XMLHttpRequest to get the localezation files

    Second in the main.ts files change the bootstrapping the same as mentioned in angular cookbook

    getTranslationProviders().then(providers => {
      const options = { providers };
      platformBrowserDynamic().bootstrapModule(AppModule, options);
    });
    
    0 讨论(0)
  • 2020-12-24 04:45

    Angular 2 Final release has i18n native support https://angular.io/docs/ts/latest/cookbook/i18n.html

    Check another answer https://stackoverflow.com/a/39004058/1267942 with example and some details about usage.

    ng2-translate is too verbose comparing to the native implementation. Also the author of ng2-translate is a big contributor to angular 2 i18n documentation

    0 讨论(0)
提交回复
热议问题