ngx-translate - невозможно выделить перевод в модуле библиотеки - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь создать библиотеку Angular, которая будет иметь отдельный набор переводов от модуля-потребителя.Он состоит из нескольких модулей, которые затем экспортируются потребителю через SharedModule.

Перевод остается в автономном модуле:

import { HttpClient } from '@angular/common/http';
import { InjectionToken, ModuleWithProviders, NgModule } from '@angular/core';
import { TranslatePoHttpLoader } from '@biesbjerg/ngx-translate-po-http-loader';
import {
  MissingTranslationHandler,
  TranslateLoader,
  TranslateModule as NgxTranslateModule,
} from '@ngx-translate/core';

import { TranslationConfig } from '../models/module-config.model';

export function HttpLoaderFactory(http: HttpClient, config: TranslationConfig) {
  const prefix = config && config.urlPrefix || '/i18n/apps/maps';
  const suffix = config && config.urlSuffix || '.po';

  console.log('Will build new loader');

  return new TranslatePoHttpLoader(http, prefix, suffix);
}

export class CustomMissingTranslationHandler implements MissingTranslationHandler {
  handle(params: MissingTranslationHandlerParams) {
   return params.translateService.parser.interpolate(params.key, params.interpolateParams);
  }
}

export const TRANSLATIONS_CONFIG = new InjectionToken('TRANSLATIONS_CONFIG');

@NgModule({
  declarations: [],
  imports: [
    NgxTranslateModule,
  ],
  exports: [
    NgxTranslateModule,
  ]
})
export class TranslateModule {
  public static forRoot(config: TranslationConfig): ModuleWithProviders {
    return {
      ngModule: TranslateModule,
      providers: [
        {
          provide: TRANSLATIONS_CONFIG,
          useValue: config
        },
        ...NgxTranslateModule.forChild({
          loader: {
            provide: TranslateLoader,
            useFactory: HttpLoaderFactory,
            deps: [HttpClient, TRANSLATIONS_CONFIG]
          },
          missingTranslationHandler: {
            provide: MissingTranslationHandler,
            useClass: CustomMissingTranslationHandler,
            deps: [TRANSLATIONS_CONFIG],
          },
          isolate: true,
        }).providers
      ],
    };
  }
}

Модуль преобразования доступен через SharedModule:

import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
import { InjectionToken, ModuleWithProviders, NgModule } from '@angular/core';

import { ModuleConfigModel } from './models/module-config.model';
import { TranslateModule } from './modules/translate.module';

@NgModule({
  declarations: [
   /* ... */
  ],
  imports: [
    TranslateModule,
  ],
  exports: [
    /* ... */
    NgxTranslateModule,
    TranslateModule,
  ]
})
export class SharedModule {
  static forRoot(moduleConfig: ModuleConfigModel): ModuleWithProviders {
    return {
      ngModule: SharedModule,
      providers: [
        {
          provide: ModuleConfigModel,
          useValue: moduleConfig
        },

... TranslateModule.forRoot (moduleConfig.translationConfig) .providers,]};}}

И SharedModule выставляется потребителям через public_api.ts.Я использую это так:

imports: [
    SharedModule.forRoot({
      apiKey: environment.apiKey,
      baseURL: environment.urlPrefix,
      translationConfig,
    }),
    TranslateModule.forRoot({
      isolate: true,
    }),
  ],

Я перепробовал все комбинации метода isolate в forChild моего модуля и всегда основной forRoot() переопределяет инициализацию модуля из исходной библиотеки TranslateModule.Единственным способом, который, казалось, работал, было переключение на NgxTranslateModule.forRoot() в файле библиотеки и удаление основного NgxTranslateModule.forRoot() из потребителя библиотеки, что совершенно неприемлемо ...

TL; DR: переводы работают, как и ожидалось, когда онине изолированы.Когда я изолирую их в загруженный forChild, они переопределяются при инициализации основного forRoot() модуля.isolate флаг не помогает.

...