【问题标题】:ngx-translate is not working for lazy loaded modulengx-translate 不适用于延迟加载的模块
【发布时间】:2018-12-20 12:16:33
【问题描述】:

我想在 Angular 5 项目延迟加载模块中实现 ngx-translate,它仅适用于父模块,但不适用于我的子模块,因此请提出更好的解决方案。

我为应用模块编写代码。

我正在使用@ngx-translate/core 和@ngx-translate/http-loader

app.module.ts

 TranslateModule.forRoot({
      @NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    LayoutModule,
    HttpClientModule,
    BrowserAnimationsModule,
    HttpModule, ReactiveFormsModule,
    RouterModule.forRoot(
      appRoutes,
      { enableTracing: false }
    ),
    TranslateModule.forRoot({
      loader: {
        provide: TranslateLoader,
        useFactory: createTranslateLoader,
        deps: [HttpClient]
      }
    })

export function createTranslateLoader(http: HttpClient) {
  return new TranslateHttpLoader(http, './assets/i18n/app/', '.json');

}

child.module.ts

@NgModule({
  imports: [

    RouterModule,
    CommonModule,
    BrowserModule,
    BrowserAnimationsModule,
    GridModule,
    DropDownsModule,
    FormsModule,
    ExcelModule,
    ControlMessagesModule, ReactiveFormsModule,    
    TranslateModule.forChild({
      loader: {
        provide: TranslateLoader,
        useFactory: (AdminTranslateLoader),
        deps: [HttpClient]
      },
      isolate: true
    })

  ],

export function AdminTranslateLoader(http: HttpClient) {
  return new TranslateHttpLoader(http, './assets/i18n/admin/', '.json');
}

【问题讨论】:

  • 尝试对两个模块使用相同的路径'./assets/i18n/app/',看看它是否有效。我在不同的模块中使用相同的文件,它对我来说很好
  • 我的要求是像模块一样将翻译存储在不同的 json 文件中,并将特定的翻译存储在特定的文件示例中翻译

标签: angular localization ngx-translate


【解决方案1】:

我遇到了类似的问题,我在 SharedModule 中调用 TranslateModule.forRoot()

TranslateModule.forRoot({
    loader: {
        provide: TranslateLoader,
        useFactory: HttpLoaderFactory,
        deps: [HttpClient]
    }
})

这个 SharedModule 由我所有的其他 延迟加载 模块导入。 我有一个 menu-bar 子组件,带有一个切换语言的按钮。该组件以构造函数的常用方式通过注入获取TranslateService

constructor(private translate: TranslateService) { }

问题

调用TranslateService.use('[LANG-CODE]') 确实会更改我的菜单栏组件中的翻译。但它并没有改变任何其他子组件的翻译。

这对我有用

我在 github 上发现了这个(相当老的)问题,基本上说我们不应该在 SharedModule 中调用 TranslateModule.forRoot()

github issue - TranslateModule.forRoot should not be put in SharedModule

所以我按照建议将TranslateModule.forRoot() 移动到AppModule 中,然后导出TranslateModule。然后我在我的SharedModule 中导入和导出TranslateModule

完成此操作后,调用 TranslateService.use() 也会翻译其他子组件的文本,而不仅仅是调用函数的那个​​(在我的例子中是 menu-bar

希望其他有类似问题的人会发现这很有用。

【讨论】:

    【解决方案2】:

    我的Angular 12 项目也有同样的问题。

    将项目配置为:

    1. app.module.ts 中添加了TranslateModule.forRoot() 喜欢
    export function httpLoaderFactory(http: HttpClient){
      return new TranslateHttpLoader(http);
    }
    
    @NgModule({
      declarations: [
        AppComponent
      ],
      imports: [
        TranslateModule.forRoot(
          {
          loader: {
            provide: TranslateLoader,
            useFactory: httpLoaderFactory,
            deps: [HttpClient]
          }
        }
        ),
      ]
    })
    export class AppModule { }
    
    1. 在我的SharedModule 中导入和导出TranslateModule
    import { NgModule, OnChanges } from '@angular/core';
    import { CommonModule } from '@angular/common';
    import { TranslateModule } from '@ngx-translate/core';
    
    @NgModule({
      declarations: [],
      imports: [
        CommonModule,
        TranslateModule
      ],
      exports: [
        TranslateModule
      ]
    })
    export class SharedModule { }
    
    
    1. 在延迟加载的组件模块中导入了SharedModule
    2. 它将顺利运行。

    【讨论】:

    • 能否也添加共享模块代码。
    • 也添加了共享模块代码
    • 好的明白谢谢
    【解决方案3】:

    共享模块的概念无论如何都是一个合适的解决方案,但调用子模块并更改 forChild() 在角度 12 中对我有用。

    TranslateModule.forChild({
          loader: {
            provide: TranslateModule,
            useFactory: HttpLoaderFactory,
            deps: [HttpClient]
          }
        })
    

    【讨论】:

      【解决方案4】:

      我认为你必须设置默认语言!例如:

      export class ChildModule {
       constructor(private readonly translate: TranslateService) {
          translate.setDefaultLang(translate.getBrowserLang());
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-22
        相关资源
        最近更新 更多