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不能正常工作
仅导入 *.js 文件似乎可以解决问题,如下所示:
import(`@angular/common/locales/${localeName}.js`).then(locale => {
   registerLocaleData(locale.default); 
});
Run Code Online (Sandbox Code Playgroud)
无需在tsconfig.app.json 中包含或排除文件
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           3709 次  |  
        
|   最近记录:  |