【问题标题】:Angular ngx translate in lazy module not working懒惰模块中的Angular ngx翻译不起作用
【发布时间】:2020-11-14 17:26:14
【问题描述】:

我创建了一个包含翻译模块并加载文件的库:

@NgModule({
  imports: [
    MatMomentDateModule,
    TranslateModule.forRoot
    ({

        loader: {
          provide: TranslateLoader,
          useFactory: TranslateFactory,
          deps: [HttpClient]
       }
      }),
    ],
  exports: [TranslateModule],
})

在我的应用程序中,我导入了这个库并加载了应用程序的翻译文件

@NgModule({
  declarations: [
    AppComponent,
    MyLayout
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    MyLibWithTranslation,
    TranslateModule.forChild({
     extend: true,
     loader: {
      provide: TranslateLoader,
      useFactory: TranslateFactory,
      deps: [HttpClient]
     }
    }),
    ....

然后,此应用程序包含加载延迟加载的模块,在这些模块中,我再次导入我的 lib 以拥有 TranslateService

@NgModule({
  declarations: [MyComponent],
  imports: [
    CommonModule,
    LazyModuleRoutingModule,
    MyLibWithTranslation
  ]
})
export class MyLazyModule { }

我的问题是,在我的模块中,我只有来自 MyLibWithTranslation 的翻译负载。我没有从 AppModule 加载的翻译。

【问题讨论】:

    标签: angular lazy-loading translation ngx-translate


    【解决方案1】:

    这里有几个解决方案

    首先你可以使用

    ngx-translate-multi-http-loader

    AoT 需要工厂的导出函数

    export function HttpLoaderFactory(http: HttpClient) { return new
    MultiTranslateHttpLoader(http, [
        {prefix: "./assets/translate/core/", suffix: ".json"},
        {prefix: "./assets/translate/shared/", suffix: ".json"}, ]);
    
    
    @NgModule({
        imports: [
            BrowserModule,
            HttpClientModule,
            TranslateModule.forRoot({
                loader: {
                    provide: TranslateLoader,
                    useFactory: HttpLoaderFactory,
                    deps: [HttpClient]
                }
            })
        ],
        bootstrap: [AppComponent] }) export class AppModule {}
    

    其次是创造

    在您的共享模块中像这样导入和导出

    不使用 forChild 或 forRoot

    imports: [
        TranslateModule
      ],
      exports: [
       TranslateModule
      ], 
    

    在您的应用程序模块中导入 forRoot

    imports:[
    TranslateModule.forRoot({
          loader: {
            provide: TranslateLoader,
            useFactory: createTranslateLoader,
            deps: [HttpClient]
          },
          isolate: true
        })
    ]
    

    【讨论】:

    • 第二种解决方案不起作用。 forChild 没有加载我的翻译文件
    • 在这个例子中你不需要 forChild 在你导出的共享模块上只导入 TranslateModule
    • 我就是这么做的。但是所以我在一个模块中使用了 forChild 但它不起作用。我使用 forRoot 将第一个文件加载到 AppModule 中,然后将 forChild 加载到子模块中,但它不起作用
    • 我也尝试在子模块的 forChild 中扩展 true,但它不起作用。它会覆盖 forRoot 翻译。我通过从 TranslateLoader 继承的服务来加载翻译
    猜你喜欢
    • 1970-01-01
    • 2020-11-08
    • 2018-11-25
    • 2018-11-30
    • 2021-12-07
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多