如何在ngx-translate中使用TranslateHttpLoader和服务url

时间:2017-06-21 08:58:51

标签: javascript angular

我正在尝试从带有服务URL的内容管理系统中获取翻译文本。当我使用JSON文件时,它运行良好,但我如何使用服务URL来获取翻译数据?

这是不起作用的代码:

export function createTranslateLoader(http: Http) {
  return new TranslateHttpLoader(http, 'http://test.test.com/test/test/Translations/{lang}/{SiteId}');
}    

3 个答案:

答案 0 :(得分:4)

昨天我遇到了关于如何使用ngx-translate从API调用中使用JSON响应的相同问题,我已经确定了解决方案。我知道在这里更新很晚,但我相信有人会从中获益。

如果你不打算使用.json文件,Ngx-translate提供使用服务。为此,在* .module.ts文件中," useClass"而不是" useFactory"如下。

 @NgModule({
      imports: [SharedModule, SharedComponentsModule, routing,
        TranslateModule.forRoot({
          loader: {
            provide: TranslateLoader,
            useClass: TranslationService,
            //useFactory : HttpLoaderFactory,
            deps: [HttpClient]
          }

在您的翻译服务中,只需调用API网址即可。

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import { TranslateLoader } from '@ngx-translate/core';

@Injectable()
export class TranslationService implements TranslateLoader {

    constructor(private http: HttpClient) { }

    getTranslation(lang: string): Observable<any> {
    return this.http.get(`http://<someurlreferences>?language=${lang}`)
    .map((response: JSON) => {
    return response;
    });
    }   
}

请记住:API响应应采用JSON格式。否则,ngx-translate不会翻译。

假设您的JSON响应位于格式

之下
{
    "Data": {
        "First": [{
            "key": "FirstKey",
            "value": "FirstValue"
        }]
    }
}

然后,在* .component.ts文件中

import { Component, OnInit } from '@angular/core'
import { TranslateService } from '@ngx-translate/core';

@Component({
  template: `<button (click)="switchLanguage('en')" >English</button>
            <button (click)="switchLanguage('cy')" >Welsh</button>
             <h1>{{'Data.First.0.value' | translate }} <!--FirstValue--> 
                    </h1>`

export class SomeComponent implements OnInit {
constructor(private translate: TranslateService) {
      translate.addLangs(['en', 'cy']);
      translate.setDefaultLang('en');

      const browserLang = translate.getBrowserLang();
      translate.use(browserLang.match(/en|cy/) ? browserLang : 'en');
     }
    switchLanguage(language: string) {
    this.translate.use(language);
  }
}

UI显示两个按钮(英语和威尔士语),点击后,将根据语言参数调用服务API网址。

答案 1 :(得分:0)

当试图从'assets / i18n / english.json'等移动到MySQL数据库以从表中动态获取转换后的值时,我遇到了同样的问题。我想这样做,以便管理员可以自己更改它们。

因此,我尝试了Viswa给出的答案,它可以工作,但是我找到了一种执行HttpLoaderFactory的简单方法。只需将以下内容添加到您的app.module.ts中。用您的API替换URL。我就像'http://localhost:8080/translation/:language'

@Html.AntiForgeryToken()

另一件事浪费了一些时间,因为我发送了一个像export function HttpLoaderFactory(http: HttpClient) { return new TranslateHttpLoader(http, "http://localhost:8080/translation/", ""); } 这样的对象对象,而不是仅仅发送了一个[{name: 'Name'}]这样的对象。一旦修复,它就像一个魅力!

答案 2 :(得分:0)

您的方法绝对正确。但这带来了另一个问题。我们无法在HttpLoaderFactory中将语言获取URL保持为静态。有时可能是动态的。 Viswa提供的解决方案是针对动态URL的。使用服务,我们可以提供动态URL来从数据库中获取翻译的语言。