はじめに
「ngx-translate」を使って多言語化対応するとき、LazyLoadされるModuleのTemplateでtranslate
を記述しても翻訳されない。その時どうしたら良いかを共有していく。
前提
ngx-translate
の設定がapp.module.ts
等でされていること。
参考サイト
ちなみに、app.component.ts
で多言語の初期設定も書いておく
app.component.ts
import { Component } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
constructor(private translate: TranslateService) {
this.translate.setDefaultLang('en');
this.translate.use('en');
}
}
各LazyLoadModuleにimportされるTranslateSharedLazyModule
を作成する
ポイントとしてはforChild()
を記述する部分。
useFactory
の部分をnullにしているが、これはapp.module.ts
と同じ多言語の設定を利用するならnullで良い。
※これをimportしたmoduleがロードされるたびにインスタンスが生成されるため。と言っても最初の初回のロードのみ。
src/shared/translate-shared-lazy.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
@NgModule({
declarations: [],
imports: [
CommonModule,
TranslateModule.forChild({
loader: {
provide: TranslateLoader,
useFactory: null,
},
isolate: false,
}),
],
exports: [TranslateModule],
})
export class TranslateSharedLazyModule {}
あとはこれをtranslate
したいModuleでimportしてやればいい。
example-lazy.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { TranslateSharedLazyModule } from '../../shared/translate-shared-lazy.module';
@NgModule({
declarations: [],
imports: [CommonModule, TranslateSharedLazyModule],
})
export class ExampleLazyModule {}