【问题标题】:Angular6 - load translations using API call to backend using ngx-translateAngular6 - 使用 API 调用加载翻译到后端使用 ngx-translate
【发布时间】:2019-02-09 10:16:57
【问题描述】:

我想在我的前端使用 ngx-translate 在应用加载时动态加载翻译。

我的后端返回 JSON 格式的响应,例如:

{
   "something: "something"
}

我想在我的 TranslateLoader 上使用该输出而不是本地 en.json 文件。

有什么方法可以实现吗?

TL;DL:我想调用“http://localhost:xxxx/api/translation/EN”来获取翻译的 JSON 响应并将其加载到 TranslateHttpLoader

【问题讨论】:

    标签: angular typescript frontend angular6 ngx-translate


    【解决方案1】:

    你可以创建一个工厂:

    export function httpLoaderFactory(http: HttpClient) {
      return new TranslateHttpLoader(http, "http://localhost:xxxx/api/translation/", "");
    }
    

    并在您的 @NgModule 导入中使用它:

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

    【讨论】:

    • 这看起来很简单。你介意分享更多关于如何在解析后实际使用翻译的信息吗?
    • 您可以像使用本地翻译文件(例如 en.json)一样使用它。查看更多here
    • 另外,别忘了初始化您的翻译服务。查看更多here
    • 所以,我按照信中的说明进行操作,但仍然没有结果。来自服务器的 JSON 响应如下所示: { "test": { "name": "value" } } 我这样做: translate.get('test.name').subscribe(res => console.log(res ));而且还是不能正常工作(不返回翻译)
    • 在评论区调试好难……你确定初始化有效吗?您在开发工具网络选项卡中看到响应了吗?您可以尝试将它与模板中的管道一起使用,看看它是否有效?
    【解决方案2】:

    我们可以使用带有自定义加载器类的 TranslateLoader 提供程序来实现

    In Module :
    
    export class CustomLoader implements TranslateLoader {
    
      constructor(private http: Http) {}
    
      public getTranslation(lang: String): Observable<any> {
        return this.http.get(URL).map(
          (res: any) => {
            return res;
          }
        );
    
      }
    }
    
    @NgModule({
      imports: [
        TranslateModule.forRoot({
          provide: TranslateLoader,
          useClass: CustomLoader,
          // useFactory: (createTranslateLoader),
          deps: [Http]
        })
      ]
    }) 
    

    在组件中:

     constructor(private _translate: TranslateService){}
    
     const transText = this._translate.instant('something');
    

    【讨论】:

    • 感谢您的宝贵时间。我刚试过这个,我得到以下错误:Property 'map' does not exist on type 'Observable&lt;Response&gt;'.。我从 'rxjs' 导入 Observable。
    • 需要添加 import 'rxjs/add/operator/map';
    • 再次感谢。我刚刚修好了。那么,现在有什么方法可以加载并尝试加载到 Angular 组件上的翻译吗? (对不起,很多问题,我的脑袋被那个问题搞砸了)
    • 为什么要加载组件。你可以添加 app.module.ts 这将适用于整个应用程序
    • 我需要重新提出我的问题:此时应用程序已经解析了来自后端的 JSON 响应。现在我需要在应用程序上使用这些翻译。假设返回了术语: { "label" : "translation" }。如何在我的组件中使用它来翻译我的文本?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    相关资源
    最近更新 更多