使用Angular CLI在运行时Angular 5加载区域设置

Szi*_*rdD 6 localization typescript angular-cli angular angular5

Angular 5提供了一种使用registerLocaleData在运行时加载i18n语言环境的方法

https://angular.io/guide/i18n#i18n-pipes

我想根据设置动态地加载语言环境(例如存储在localStorage中)。我的第一个测试是加载单个语言环境(fr):

import(`@angular/common/locales/fr`).then(locale => {
    registerLocaleData(locale.default);
});
Run Code Online (Sandbox Code Playgroud)

这很好。

根据存储在localStorage中的值进行加载时,如下所示:

const localeName = localStorage.getItem('locale') || 'en';

import(`@angular/common/locales/${localeName}`).then(locale => {
    registerLocaleData(locale.default);
});
Run Code Online (Sandbox Code Playgroud)

它也有效,并且语言环境已成功加载。当使用Angular CLI建立项目时,由于在构建时它不知道要捆绑哪个语言环境,因此将它们全部捆绑在一起,这很好。唯一的问题是,构建过程会针对它加载的每个语言环境发出警告:

模块构建失败:错误:node_modules \ @angular \ common \ locales \ af-NA.d.ts不属于编译输出的一部分。请检查其他错误消息以获取详细信息。

./node_modules/@angular/common/locales/af-NA.js.map中的警告模块解析失败:意外的令牌(1:10)您可能需要适当的加载程序来处理此文件类型。

我已经尝试过包括语言环境* .ts文件,并排除* .map文件,但是似乎没有选择它们。

这是我的tsconfig.app.json

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "baseUrl": "./",
    "module": "esnext",
    "types": []
  },
  "exclude": [
    "test.ts",
    "**/*.spec.ts",
    "../node_modules/@angular/common/locales/**/*.map"
  ],
  "include": [
    "**/*",
    "../node_modules/@angular/common/locales/**/*.ts"
  ]
}
Run Code Online (Sandbox Code Playgroud)

TypeScript需要使用esnext作为模块才能进行动态导入。使用es2015不能正常工作