Angular 9 找不到 'en-US' 的区域设置数据。此语言环境将不包含任何语言环境数据

Angular 9 Locale data for 'en-US' cannot be found. No locale data will be included for this locale

我收到这个奇怪的警告

Locale data for 'en-US' cannot be found. No locale data will be included for this locale 当 运行 ng build --configuration=prod --localize

这是我的 angular.json

// omitted
"i18n": {
    "sourceLocale": "en-US",
    "locales": {
      "sr-Latn": {
        "translation": "src/locale/messages.sr.xlf",
        "baseHref": "/sr/"
      }
    }
  },
// omitted

文档明确指出 en-US 是默认导入的。 更糟糕的是,当我将 sourceLocale 更改为任何其他语言(比如 'de')时,警告消息消失。
手动注册 en-US 语言环境数据也无济于事

这确实很烦人。编译器期望有 en-US 资源,甚至使用 en-US 和 base-href 编译应用程序。

我就是这样解决的。

1) 我只是忽略警告和 en-US 输出目录。

2) 我编译了两次应用程序。首先没有 --localized 选项。这会编译原始应用程序,使用 \ 作为 base-href,并且不使用任何翻译文件。然后我再次使用 --localized 进行编译,并使用与语言代码匹配的 base-href 编译我所有的语言。

ng build --prod --outputPath=dist/original
ng build --prod --outputPath=dist/localized --localize

3) 我从 dist/original 部署原始构建,从 dist/localized 部署除 en-US 目录之外的所有其他构建。

如果将 sourceLocale 设置为 en,它会起作用。

  • 但我不明白为什么默认值 en-US 不起作用。
"i18n": {
    "sourceLocale": "en",
    "locales": {...}
}

最新版本9.0.2可以指定sourceLocale baseHref

"i18n": {
    "sourceLocale": {
      "baseHref": "/",
      "code": "en"
    },
    "locales": {
      "fr": "src/locale/messages.fr.xlf",
      "de": "src/locale/messages.de.xlf",
      "es": "src/locale/messages.es.xlf",
      "it": "src/locale/messages.it.xlf",
      "ja": "src/locale/messages.ja.xlf",
      "ko": "src/locale/messages.ko.xlf",
      "zh": {
        "translation": "src/locale/messages.cn.xlf",
        "baseHref": "/cn/"
      }
    }

我也遇到了同样的问题

如您所说,LOCALE_ID 的默认值似乎是 en-US,因为这就是它在未指定任何内容时所代表的含义。

此外,从 @angular/common/locales/* 看来,registerLocaleData 的默认值是 en@angular/common/locales/en存在,@angular/common/locales/en-US不存在! 与 de-DE 相同:@angular/common/locales/de-DE 不存在,但 @angular/common/locales/de 存在。

目前,我已将所有内容切换为 en/de 并且有效:


英语和德语的本地化示例:

angular.json

[...]
      "i18n": {
        "sourceLocale": "en",
        "locales": {
          "de": "src/locale/messages.de.xlf"
        }
      }
[...]

app.module.ts

[...]
import { registerLocaleData } from '@angular/common';
import localeDe from '@angular/common/locales/de';
import localeEn from '@angular/common/locales/en';

registerLocaleData(localeDe, localeEn);
[...]

可能与文件名为 en-US-POSIX 的事实有关 https://github.com/angular/angular/blob/master/packages/common/locales/en-US-POSIX.ts

尝试动态 import('@angular/common/locales/en-US-POSIX') 有效。

所以尝试这个可能有效

"i18n": {
    "sourceLocale": "en-US-POSIX",
    "locales": {...}
}