angular 生产中的 i18n 翻译不工作

angular i18n translation in production not working

在我的开发环境中,代码运行良好。但是一旦我构建它并投入生产,它就无法将应用程序编译成正确的语言

console.log(environment);

if (environment.production) {
   enableProdMode();
   window.console.log = function () { };   // disable any console.log debugging statements in production mode
}


declare const require;
var translations;

let locationSplit = window.location.hostname.split(".");
console.log(locationSplit);

if (locationSplit[0] == environment.chinese) {

  translations = require(`raw-loader!./locale/translatedChinese.zh-Hans.xlf`);
}
else {

  translations = null;
}


platformBrowserDynamic().bootstrapModule(AppModule, {
  providers: [
    { provide: TRANSLATIONS, useValue: translations },
    { provide: TRANSLATIONS_FORMAT, useValue: 'xlf' }
  ]
});

我正在控制台记录翻译文件,它就在那里。但是......它没有这样做。是的,逻辑没问题。我已经测试过了。就像我说的,当 运行 在本地使用 webpack 时,一切都很好。所以我对问题可能是什么感到困惑。文件在那里,逻辑是正确的,但它仍然以英文显示:(

angular i18n 不适用于 aot。尝试像这样构建确保关闭 aot:

 ng build --aot=false

似乎可以使用 AOT 编译器来完成。

来自 Angular 文档:

当您使用 AOT 编译器进行国际化时,您必须 pre-build 为每种语言创建一个单独的应用程序包,并根据 server-side 语言检测或 url 参数。 要指示 AOT 编译器使用您的翻译配置,请在 angular.json 文件中设置三个 "i18n" 构建配置选项。

  1. i18nFile:翻译文件的路径。
  2. i18nFormat: 翻译文件的格式。
  3. i18nLocale:语言环境 ID。

您还应该通过设置 outputPath 配置选项将输出定向到 locale-specific 文件夹,以使其与应用程序的其他语言环境版本分开。

"build": {
  ...
  "configurations": {
    ...
    "fr": {
      "aot": true,
      "outputPath": "dist/my-project-fr/",
      "i18nFile": "src/locale/messages.fr.xlf",
      "i18nFormat": "xlf",
      "i18nLocale": "fr",
      ...
    }
  }
},
"serve": {
  ...
  "configurations": {
    ...
    "fr": {
      "browserTarget": "*project-name*:build:fr"
    }
  }
}

然后您可以将此配置传递给 ng serve 或 ng build 命令。下面的示例显示了如何提供在本指南前面部分中创建的法语文件:

ng serve --configuration=fr

对于生产构建,您在 CLI 配置文件中定义一个单独的 production-fr 构建配置,angular.json.

...
"architect": {
  "build": {
    "builder": "@angular-devkit/build-angular:browser",
    "options": { ... },
    "configurations": {
      "fr": {
        "aot": true,
        "outputPath": "dist/my-project-fr/",
        "i18nFile": "src/locale/messages.fr.xlf",
        "i18nFormat": "xlf",
        "i18nLocale": "fr",
        "i18nMissingTranslation": "error",
      }
// ...
"serve": {
  "builder": "@angular-devkit/build-angular:dev-server",
  "options": {
    "browserTarget": "my-project:build"
  },
  "configurations": {
    "production": {
      "browserTarget": "my-project:build:production"
    },
    "fr": {
      "browserTarget": "my-project:build:fr"
    }
  }
},

也可以通过 CLI 使用您现有的生产配置提供相同的配置选项。

ng build --prod --i18n-file src/locale/messages.fr.xlf --i18n-format xlf --i18n-locale fr

更多信息在这里: https://angular.io/guide/i18n#merge-with-the-aot-compiler