Angular 11 - 不会找到手动创建的语言环境文件

Angular 11 - won't find manually created locale files

我有一个 Angular 11 应用程序,我们支持 14 种语言,包括萨摩亚语和他加禄语,语言环境分别为 sm 和 tl。 Angular 没有这些的语言环境文件。我已经创建并部分翻译了我自己的文件。但是在构建过程中,我收到以下错误消息:

Locale data for 'sm' cannot be found.  No locale data will be included for this locale.
Locale data for 'tl' cannot be found.  No locale data will be included for this locale.

angular.json 文件包含:

...
      "i18n": {
        "sourceLocale": {
          "code": "en",
          "baseHref": "myApp/en/"
        },
        "locales": {
          "de": {
            "translation": "src/i18n/messages.de.xlf",
            "baseHref": "myApp/de/"
          },
          "sm": {
            "translation": "src/i18n/messages.sm.xlf",
            "baseHref": "myApp/sm/"
          },
          "tl": {
            "translation": "src/i18n/messages.tl.xlf",
            "baseHref": "myApp/tl/"
          },
...

为了将 Angular 指向语言环境文件,我在 app.module.ts 文件的顶部附近添加了以下行。我的个性化语言环境文件位于我的应用程序中显示的路径(在应用程序文件夹内)。

import { registerLocaleData } from '@angular/common';
import localeSm from './pb-locales/sm';
import localeTl from './pb-locales/tl';

registerLocaleData(localeSm, 'sm');
registerLocaleData(localeTl, 'tl');

我在网上找不到与此相关的参考资料。

更新: 我将只使用 Pilipino(菲律宾语),又名 'fil' 作为他加禄语的替代品,因为 Angular 支持菲律宾语。

sm.js 文件是 en.js 文件的副本,但有一些更改。 Angular找不到:

/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
(function (factory) {
    if (typeof module === "object" && typeof module.exports === "object") {
        var v = factory(null, exports);
        if (v !== undefined) module.exports = v;
    }
    else if (typeof define === "function" && define.amd) {
        define("@angular/common/locales/sm", ["require", "exports"], factory);
    }
})(function (require, exports) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
// THIS CODE IS GENERATED - DO NOT MODIFY
// See angular/tools/gulp-tasks/cldr/extract.js
    var u = undefined;
    function plural(n) {
        var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(n.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
        if (v === 0 && (i === 1 || i === 2 || i === 3) ||
            v === 0 && !(i % 10 === 4 || i % 10 === 6 || i % 10 === 9) ||
            !(v === 0) && !(f % 10 === 4 || f % 10 === 6 || f % 10 === 9))
            return 1;
  return 5;
}

exports.default = [
  'sm',
  [['a', 'p'], ['AM', 'PM'], u],
  [['AM', 'PM'], u, u],
  [
    ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
    ['Aso Sa', 'Aso Gafua', 'Aso Lua', 'Aso Lulu', 'Aso Tofi', 'Aso Faralie', 'Aso Tonaʻi'],
    ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']
  ],
  u,
  [
    ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
    [
      'Ianuari', 'Fepuari', 'Mati', 'Aperila', 'Me', 'Iuni', 'Iulai', 'Auguso', 'Setema',
      'Oketopa', 'Novema', 'Tesema'
    ]
  ],
  [
    ['E', 'P', 'M', 'A', 'M', 'Hun', 'Hul', 'Ago', 'Set', 'Okt', 'Nob', 'Dis'],
    ['Ene', 'Peb', 'Mar', 'Abr', 'May', 'Hun', 'Hul', 'Ago', 'Set', 'Okt', 'Nob', 'Dis'],
    [
      'Enero', 'Pebrero', 'Marso', 'Abril', 'Mayo', 'Hunyo', 'Hulyo', 'Agosto', 'Setyembre',
      'Oktubre', 'Nobyembre', 'Disyembre'
    ]
  ],
  [['B', 'A'], ['BC', 'AD'], ['Before Christ', 'Anno Domini']],
  0,
  [6, 0],
  ['M/d/yy', 'MMM d, y', 'MMMM d, y', 'EEEE, MMMM d, y'],
  ['h:mm a', 'h:mm:ss a', 'h:mm:ss a z', 'h:mm:ss a zzzz'],
  ['{1}, {0}', u, '{1} \'at\' {0}', u],
  ['.', ',', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
  ['#,##0.###', '#,##0%', '¤#,##0.00', '#E0'],
  'USD',
  '$',
  'US Dollar',
  {},
  'ltr',
  plural
];
});

我添加了一个 GitHub 存储库,可以从中进行测试:https://github.com/DrewShirts/angular-samoan

要重现问题,运行 脚本 build prod

以下是有效的,但是是 hack。除了针对 angular 代码执行拉取请求之外,我仍在寻找更好的解决方案。当然,这不是唯一的长期解决方案。

我创建了一个 bash 脚本到 运行 作为构建过程的一部分,将 sm.js 文件从项目内部复制到 node_modules/@angular/common/locales/global

cp ./src/app/locales/sm.js ./node_modules/@angular/common/locales/global/

然后修改package.json:

"build": "./pre-build-hack.sh && ng build --configuration production --localize"

这不是一个优雅的解决方案,但它确实有效。这也适用于我们的 CI/CD 平台。

感谢@Eliseo 为我们指明了这个解决方案的方向。