Angular 5国际化

47

我正在使用最新版本的 Angular5 构建应用程序,并需要用户能够切换语言。在 Angular2+ 中我从未实现过这个功能(实际上我正在使用 Angular5)。

我需要设置翻译的两个地方:

  • 组件的模板HTML - 将标签更改为指定的语言
  • 在组件.ts文件中的代码中 - 可能需要翻译一些根据特定条件动态构建的字符串。

我看了 ngx-translation,它似乎可以满足我的所有需求,例如允许您在不重新构建代码的情况下更改语言,请参见 此处。然而我了解到,由于主要开发人员加入 Angular 团队开发他们的 i18n 代码,它可能会被弃用

我也知道目前的 i18n 并不支持我目前需要的所有功能,请参见 此处

我的问题是 - 最新版 Angular 中的翻译功能现状如何?如果当前版本还没有完全支持(在不重新编译的情况下更改语言),那么是否有其他库可以推荐使用?ngx-translate 对未来是否好用?

非常感谢您在这个领域提供任何指导!

3个回答

57

经过一段时间的调查,我想在这里列出我发现的ngx-translateAngular-i18n之间的主要区别:

  • Angular只支持一种语言,您必须完全重新加载应用程序才能更改语言。JIT支持仅意味着它可以与JIT一起使用,但您仍然必须在引导时提供翻译,因为它会在编译期间替换模板中的文本,而此库使用绑定,这意味着您可以随时更改翻译。缺点是绑定需要内存,因此Angular方式更高效。但是,如果您为组件使用OnPush,则可能永远不会注意到差异。
  • 目前,Angular仅支持在模板中使用i18n,我正在开发功能,使您可以在代码中使用它,但这仍然是一个正在进行的工作。此库在代码和模板中均可使用
  • Angular支持XLIFF或XMB(两者都是XML格式),而此库默认支持JSON,但您可以编写自己的加载器以支持任何格式(例如,有一个PO文件的加载器)。个人而言,Json文件相对来说很容易阅读,而这些其他格式则不是很方便,但这并不是一个巨大的缺点。
  • Angular支持ICU表达式(复数和选择),但此库不支持
  • Angular支持包括Angular代码在内的html占位符,而此库仅支持常规html(因为它是在运行时执行的,而不是在编译期间执行的,在AngularJS中有$compile,但在Angular中没有)
  • 此库的API更完整,因为它在运行时执行,可以提供更多内容(可观察对象、事件等),而Angular没有这些功能(但实际上也不需要,因为您无法更改翻译)ngx-translate的创建者已经说过了这个:

Ocombe(ngx的开发者):@josersleal,这正是他们所做的,Angular团队聘请我为所有人改进国际化(i18n)。但是没有直接将我的库集成到核心中的方法。在为核心团队工作了3个月后,我可以告诉你,Angular i18n比我的库要复杂得多。它处理更多的复杂问题,并且没有我库中的所有错误和缺陷。我理解核心不像库一样快速发展是令人沮丧的,但是有原因,首先是您不能实现某些东西并在看到您忘记包含用例时随时更改它。每件事都必须经过彻底的计划和思考。尽管如此,未来核心中可能会包含大部分此库可以执行的功能,但不幸的是,这可能需要一年时间才能到达那里。好消息是,它将比我的天真实现好得多。

这是一篇讨论ngx-translate和Angular i18n之间主要区别的好文章: https://github.com/ngx-translate/core/issues/495

i18n的更改将在Angular的版本6中进行。今天,我们目前使用的是版本5:

一些想法...

  • Angular-i18n更加高效,因为你可以在编译应用程序时使用所需的语言(而不是在运行时进行翻译)。但这也可能成为一个缺点,因为您可能需要在不同语言下构建多个应用程序版本。
  • 如果我们正在使用SEO,则angular-i18n将是前进的方向,由于URL浏览。对于我的情况,我根本不需要这个。
  • 如果我们需要复数切换等功能。再次强调,我不需要这个 - 我只需要在模板和代码中进行简单的运行时语言切换。
  • Angular-i18n至少要等到2018年3月才会发布。对于我来说,我不能等到那个时候,因为我现在需要构建我的应用程序。
  • ngx-translate的功能集不如angular-i18n全面,但是,我只需要简单的运行时翻译,所以认为它对我们需要的内容足够好。
  • ngx-translate是开源的,如果有一天它不再被开发,如果出现严重问题,我想我可以自己修复(希望到那个时候,任何可能出现的问题都已经解决)。

我还将查看Angular-l10n库,因为它看起来非常不错:


你有没有查看官方i18n的最新状态?“Angular-i18n至少要等到2018年3月才会发布”。现在已经是2018年3月了。我们团队还有一些时间来决定采取哪种解决方案,但我们不想永远等待。是否有i18n的路线图?我能找到的最好参考是Ocombe的提交历史记录:https://github.com/angular/angular/commits?author=ocombe。据我所见,Angular可能会早晚放弃i18n,因为每个人都使用社区解决方案,并且该解决方案更经常更新。 - Phil
注意:ngx-translate软件包在过去几周已经更新,以支持Angular6。 - Rob McCabe
1
需要注意的是,ngx-translate 的开发在未来可能会终止。https://github.com/ngx-translate/core/issues/783 - dman
2
这是一篇旧帖子,但总结得非常好。感谢@RobMcCabe! - Juan Stoppa

6

是的。ngx-translate目前很好用,我希望它未来也能继续如此。

我正在使用ngx-translate在我的当前Angular 5项目中,支持5种以上语言。

到目前为止,它对我来说运行良好。我没有进行任何自定义更改,就像插入和播放一样。

我使用了这个插件https://github.com/ngx-translate/core


嗯,没错,我同意,ngx-translate很棒!但是我希望得到比“我希望将来会有”更具体的东西;-) 因为我今天必须实现它。 - Rob McCabe

4

不使用ng-translate,可以使用配置文件和语言json文件来进行翻译。你可以将该json文件放置在服务器位置,并轻松从angular访问。

config.json中,你可以定义语言类型。

{ 
  "LANGUAGE": "fr.json" 

}

en/fr.json文件中。
{
    "TITLE": "Bonjour Angular avec translate !",
    "SELECT": "Changer la langue"

}

config.json 和语言文件

这里有示例代码

App.component

export class AppComponent  {

  name =  LAN_CONFIG['TITLE'];
  // name =  APP_CONFIG['LANGUAGE'];
}

或者

您可以使用config.js文件

将以下代码段添加到index.html头部:

<script>
    var xhrObj = new XMLHttpRequest();
    var url = '/assets/config/config.js';
    xhrObj.open('GET', url, false);
    xhrObj.send('');
    var se = document.createElement('script');
    se.type = "text/javascript";
    se.text = xhrObj.responseText;
    document.getElementsByTagName('head')[0].appendChild(se);
  </script>

config.js文件

enter image description here

window.config= {};
window.config['LANGUAGE'] = 'er.js';

您可以通过访问该变量来访问值,使用以下代码:
@Injectable()
export class LanguageService {

  appConfig:AppConfigService;
  lanTypePath ='../../assets/i18n/'+ window['config'].LANGUAGE;
 constructor(private http: HttpClient)
  {
    console.log(APP_CONFIG['LANGUAGE']);
  }

  public load()
  {
    return new Promise((resolve, reject) => {

      this.http.get(this.lanTypePath).catch((error: any): any => {

        reject(true);
        return Observable.throw('Server error');
      }).subscribe((envResponse :any) => {
        let t = new LanConfig();
        //Modify envResponse here if needed (e.g. to ajust parameters for https,...)
        LAN_CONFIG = Object.assign(t, envResponse);
        resolve(true);
      });

    });
  }

}

我认为对于你的情况,这种方法比以前更好。

Github演示

希望这能有所帮助..!


1
很棒 - 你能用这种方法实现动态更改语言吗? - Rob McCabe
当然,你只需要在配置文件fr.json中更改语言选择为en.joson。 - DeC
@RobMcCabe - 更改答案以找到更好的方法,我认为这个答案将解决你的问题。 - DeC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接