Angular 11 — не будет находить файлы локали, созданные вручную

#angular #internationalization #angular11

Вопрос:

У меня есть приложение 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/"
          },
...
 

Чтобы указать Угловой на файлы локали, я добавил следующие строки в верхней части файла 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 (филиппинский), он же «фил», в качестве замены тагальского, поскольку Angular поддерживает филиппинский.

В sm.js файл представляет собой копию en.js файл, с некоторыми изменениями. Угловой не может его найти:

 /**
 * @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" amp;amp; typeof module.exports === "object") {
        var v = factory(null, exports);
        if (v !== undefined) module.exports = v;
    }
    else if (typeof define === "function" amp;amp; 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 amp;amp; (i === 1 || i === 2 || i === 3) ||
            v === 0 amp;amp; !(i % 10 === 4 || i % 10 === 6 || i % 10 === 9) ||
            !(v === 0) amp;amp; !(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',
  '

Я добавил репозиторий GitHub, в котором это можно проверить: https://github.com/DrewShirts/angular-samoan

Чтобы воспроизвести проблему, запустите сценарий  build prod  .


Комментарии:

1. Можете ли вы создать stackblitz проект и добавить его к своему вопросу? Другим было бы легче помочь.

2. Можете ли вы показать содержимое файлов sm и tl локали?

3. Я полагаю, вы можете добавить свои "файлы локализации" в nodes_module/@angular/common/locales папку

4. @Eliseo После добавления файла sm.js локали в nodes_module/@angular/common/locales папку и комментирования ручного импорта самоанского языка в app.module.ts , позволяя ему извлекать sm.js содержимое nodes_module/@angular/common/locales вместо src/test-locales : Результат та же ошибка Locale data for 'sm' cannot be found. No locale data will be included for this locale.

5. @Eliseo - добавление этого в node_modules/@angular/common/locales/global сработало! Очевидно, что копирование этого перед сборкой-это взлом. Нам нужно будет заполнить файл локализации для Samoan, а затем создать запрос на извлечение кода angular. Спасибо за идею!

Ответ №1:

Следующее работает, но является халтурой. Я все еще ищу лучшее решение, кроме выполнения запроса на извлечение кода angular. Конечно, это не единственное долгосрочное решение.

Я создал сценарий bash для запуска как часть процесса сборки, который копирует sm.js файл из проекта в node_modules/@angular/общие/локали/глобальные

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

затем измените файл package.json:

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

Не очень элегантное решение, но оно работает. Это также работает на нашей платформе CI/CD.

Спасибо @Eliseo за направление, которое указало нам на это решение.

Комментарии:

1. Репо на GitHub github.com/DrewShirts/angular-samoan было обновлено, чтобы включить это решение.

,
'US Dollar',
{},
'ltr',
plural
];
});
Я добавил репозиторий GitHub, в котором это можно проверить: https://github.com/DrewShirts/angular-samoan

Чтобы воспроизвести проблему, запустите сценарий build prod .

Комментарии:

1. Можете ли вы создать stackblitz проект и добавить его к своему вопросу? Другим было бы легче помочь.

2. Можете ли вы показать содержимое файлов sm и tl локали?

3. Я полагаю, вы можете добавить свои «файлы локализации» в nodes_module/@angular/common/locales папку

4. @Eliseo После добавления файла sm.js локали в nodes_module/@angular/common/locales папку и комментирования ручного импорта самоанского языка в app.module.ts , позволяя ему извлекать sm.js содержимое nodes_module/@angular/common/locales вместо src/test-locales : Результат та же ошибка Locale data for 'sm' cannot be found. No locale data will be included for this locale.

5. @Eliseo — добавление этого в node_modules/@angular/common/locales/global сработало! Очевидно, что копирование этого перед сборкой-это взлом. Нам нужно будет заполнить файл локализации для Samoan, а затем создать запрос на извлечение кода angular. Спасибо за идею!

Ответ №1:

Следующее работает, но является халтурой. Я все еще ищу лучшее решение, кроме выполнения запроса на извлечение кода angular. Конечно, это не единственное долгосрочное решение.

Я создал сценарий bash для запуска как часть процесса сборки, который копирует sm.js файл из проекта в node_modules/@angular/общие/локали/глобальные


затем измените файл package.json:


Не очень элегантное решение, но оно работает. Это также работает на нашей платформе CI/CD.

Спасибо @Eliseo за направление, которое указало нам на это решение.

Комментарии:

1. Репо на GitHub github.com/DrewShirts/angular-samoan было обновлено, чтобы включить это решение.