Упаковка библиотеки Angular с поддержкой i18n

Угловой i18n великолепен, и такие инструменты, как ng-packagr делает упаковку библиотеки компонентов чрезвычайно простой, но можно ли их комбинировать?

Что, если я хочу упаковать и распространить библиотеку компонентов с переводимыми компонентами? Является ли это возможным? Как упаковать такую ​​библиотеку? Будут ли файлы перевода поставляться вместе с пакетом или они должны быть определены в основном приложении?

Было бы здорово, если бы кто-нибудь мог указать мне на какой-нибудь документ. Спасибо


person leonixyz    schedule 15.03.2018    source источник
comment
Я столкнулся с той же проблемой сейчас. Вы нашли решение?   -  person Beejee    schedule 29.12.2018
comment
Вот простое решение, которое я нашел! stackoverflow.com/a/67824442/2448200   -  person Ion Prodan    schedule 03.06.2021


Ответы (2)


Когда вы создаете файл перевода для основного приложения с помощью CLI (с ng xi18n), элементы с атрибутом i18n в библиотеке импортируются в файл перевода. Затем вы можете определить переводы в основном приложении.

person R3N0    schedule 05.06.2018
comment
Это правильно. Но есть и другой способ определить переводы в вашей библиотеке компонентов, как это делают некоторые элементы ng, например ng bootstrap. Он переключает языки локали в зависимости от конфигурации локали сервера. - person Jonathan Ramos; 07.06.2018
comment
Как вы устранили это предупреждение. Не было указано имя для внешнего модуля «@ngx-translate/i18n-polyfill» в output.globals — угадывается «i18nPolyfill»? Я пытался добавить его в пути, но это не сработает. Если я добавлю его в ng-package.json в списке umdModuleIds, он исчезнет, ​​но это правильный способ его использования. Может быть, это новая тема, но я думаю, что вы, возможно, уже решили ее. - person Janne Harju; 13.02.2019
comment
Но что, если я хочу распространять с его помощью официальные переводы моей библиотеки? Как мне подойти к этому? - person waterplea; 20.02.2019
comment
Мне еще предстоит начать подготовку моей библиотеки к распространению, как только я доберусь до этого этапа, я могу что-нибудь придумать. Буду иметь в виду публикацию здесь, хотя я не уверен, что это будет в ближайшее время :) - person waterplea; 27.03.2019
comment
Тоже интересует это. Не нашел ничего о распространении переводов с библиотекой Angular. - person dude; 05.06.2020

Это можно сделать двумя способами: статически предоставить ресурсы и объединить их во время сборки или настроить путь трансляции во время выполнения.

  1. Чтобы статически включать файлы во время сборки, вы просто используете setTranslations в коде, как указано в https://github.com/ngx-translate/core документы. Затем вы можете просто связать свои переводы с кодом.

  2. Лучше было бы дать потребителю знать, что использовать. Чтобы правильно указать путь к файлам перевода (при стандартной структуре, где каждый перевод находится в отдельном файле, содержащем язык в имени), вы можете сделать следующее:

    interface TranslationsConfig {
      prefix: string;
      suffix: string;
    }
    
    export const TRANSLATIONS_CONFIG = new InjectionToken('TRANSLATIONS_CONFIG');
    
    @NgModule({
      declarations: [],
      imports: [
        NgxTranslateModule,
      ],
      exports: [
        NgxTranslateModule,
      ]
    })
    export class TranslateModule {
      public static forRoot(config: TranslationsConfig): ModuleWithProviders {
        return {
          ngModule: TranslateModule,
          providers: [
            {
              provide: TRANSLATIONS_CONFIG,
              useValue: config
            },
            ...NgxTranslateModule.forRoot({
              loader: {
                provide: TranslateLoader,
                useFactory: HttpLoaderFactory,
                deps: [HttpClient, TRANSLATIONS_CONFIG]
            }
          }).providers
        ],
      };
    }
    

    }

Этот код гарантирует, что при создании библиотеки AOT сможет разрешать типы (отсюда InjectionToken и т. д.) и позволяет создавать пользовательский загрузчик переводов.

Теперь только вам решать реализовать фабрику или класс загрузчика, который будет использовать конфиг! Это мое (я использую PO для своих переводов):

export function HttpLoaderFactory(http: HttpClient, config: TranslationsConfig) {
  return new TranslatePoHttpLoader(http, config.prefix, config.suffix);
}

Не забудьте экспортировать каждый класс и функцию, которые вы используете в модуле, поскольку это необходимо для AOT (а библиотеки создаются с помощью AOT по умолчанию).

Чтобы использовать все это решение, где бы вы ни использовали основной библиотечный модуль или этот модуль перевода, вы можете просто вызвать TranslateModule.forRoot(/* Your config here */). Если это не основной экспортируемый модуль, подробнее об использовании иерархических модулей с forRoot здесь:

Как использовать .forRoot() в иерархии функциональных модулей

person SzybkiSasza    schedule 05.04.2019
comment
Должны ли мы по-прежнему использовать инструмент ng-packagr в Angular 7.2 при упаковке библиотеки? - person Stephane; 15.07.2019
comment
Вопрос был не про ngx-translate - person OZ_; 27.07.2021