【问题标题】:Angular 5 internationalizationAngular 5 国际化
【发布时间】:2018-04-29 00:08:34
【问题描述】:

我正在使用最新的 Angular5 构建一个应用程序,我需要的是让用户能够切换语言。我从来不需要在 Angular2+ 中实现这个(实际上我使用的是 Angular5)。

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

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

我正在查看ngx-translation,它看起来可以满足我的所有需求,因为它允许您在不重新构建代码的情况下更改语言,请参阅here。但是我读了it was probably going to be deprecated,因为主要开发人员转移到 Angular 团队来开发他们的 i18n 代码。

我也了解当前的i18n 不支持我现在需要的一切,请参阅here

我的问题 - 最新版本的 Angular 中翻译的状态如何?是否有其他人会推荐其他库,如果确实,Angular 本身还没有得到完全支持(在不重新编译的情况下更改语言)? ngx-translate 对未来有好处吗?

非常感谢这方面的任何指导!

【问题讨论】:

    标签: angular internationalization ngx-translate angular5 angular-i18n


    【解决方案1】:

    在花时间研究这个之后,我想我会发布我发现的 ngx-translateAngular-i18n 之间的主要区别:

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

    Ocombe(ngx 的开发者):@josersleal 这正是他们所做的, Angular 团队聘请我为每个人改进 i18n 但没有 在为 3 工作后将我的 lib 直接集成到核心中的方法 几个月的核心团队我可以告诉你 Angular i18n 更多 比我的 lib 复杂而精致。它处理很多更复杂的 东西,它没有我的所有错误和缺点 lib有。我知道核心不支持令人沮丧 与图书馆一样快地发展,但有理由 那个,第一个是你不能实现一些东西 每当您发现忘记包含用例时,请更改它。 一切都必须经过彻底的计划和思考。不过,你会 将这个库可以做的大部分事情放在核心 未来,但不幸的是,我们可能需要一年的时间才能到达那里。 好消息是它会比我的天真好得多 实施。

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

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

    一些想法……

    • Angular-i18n 的性能更高,因为您使用所需的语言编译应用程序(而不是在运行时进行翻译)。也可能是一个缺点,因为您可能需要使用不同语言构建多个应用程序。
    • 如果我们使用 SEO,由于 url 浏览,angular-i18n 将是前进的方向。就我而言,我根本不需要这个。
    • 如果我们需要复数切换等。同样,我不需要这个 - 我只需要在模板和代码中进行相当直接的运行时语言切换。
    • Angular-i18n 至少要到 2018 年 3 月才会发布。对我来说,我不能等到那时,因为我现在需要构建我的应用程序。
    • ngx-translate 没有 angular-i18n 那样全面的功能集,但是我只需要简单的运行时翻译,所以认为它可以满足我们的需要。
    • ngx-translate 是开源的,到了它不再被开发的那一天,如果有一个严重的问题我想我可以自己解决(希望到那时,可能出现的任何问题都会得到解决)。

    我还要看看 Angular-l10n 库,因为它看起来很不错:

    【讨论】:

    • 你查过i18n官方的当前状态了吗? “Angular-i18n 至少要到 2018 年 3 月才会发布”。好吧,现在已经是 2018 年 3 月了。我们的团队还有一些时间来决定采用哪种解决方案,但我们不想永远等待。 i18n 有路线图吗?我能找到的最佳参考是 Ocombe 的提交历史:github.com/angular/angular/commits?author=ocombe 在我看来,Angular 迟早会放弃 i18n,因为每个人都使用社区解决方案,而且更新更频繁。
    • 注意:ngx-translate 包已在过去几周更新以支持 Angular6
    • 需要注意的是,ngx-translate 的开发有可能在未来结束github.com/ngx-translate/core/issues/783
    • 这是一篇旧帖子,但总结非常好@RobMcCabe,谢谢!
    【解决方案2】:

    是的。 ngx-translate 到现在都很好,我希望将来也一样。

    我在我当前的 Angular 5 项目中使用了 ngx-translate,它有 5 种以上的语言。

    到目前为止,它对我来说工作正常。我不必进行任何自定义更改,它就像即插即用一样工作。

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

    【讨论】:

    • 嗯 - 是的,同意,ngx-translate 很棒!但我希望比“我希望它会在未来”更坚定一些;-) 因为我今天必须实现这一点
    【解决方案3】:

    您可以使用配置文件和语言 json 文件,而不是使用 ng-translate 您可以将该 json 文件放在您的服务器位置并从角度轻松访问它

    config.json你可以污染语言类型

    { 
      "LANGUAGE": "fr.json" 
    
    }
    

    en/fr.json 文件中

    {
        "TITLE": "Bonjour Angular avec translate !",
        "SELECT": "Changer la langue"
    
    }
    

    听到的是sample code

    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 文件

    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 demo

    希望这会有所帮助..!

    【讨论】:

    • 太棒了 - 你能用这种方法即时更改语言吗?
    • 是的,您只需要将配置文件 fr.json 中的语言选择更改为 en.joson
    • @RobMcCabe - 更改答案以获得更好的方法,认为此答案将解决您的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2018-01-18
    • 2017-06-09
    • 2017-09-16
    • 1970-01-01
    相关资源
    最近更新 更多