【问题标题】:Angular 2 i18n dynamic/instant translationAngular 2 i18n 动态/即时翻译
【发布时间】:2017-06-20 19:44:24
【问题描述】:

我遵循 angular.io 国际化食谱 (https://angular.io/docs/ts/latest/cookbook/i18n.html#!#angular-i18n)。 一切正常,如果我在 index.html 文件中更改我的语言环境:

document.locale = 'en';

但我希望动态地改变它,就像我们过去在 AngularJS 中所做的那样。我找到了几种解决方案,例如:

//mycomponent.component.ts
changeLang(){
localStorage.setItem('localeId', "es");
location.reload(true);

} //I hardcoded the locale, but you get the idea

有没有办法随时随地翻译文档?因为这种解决方案不实用,并且重新加载时间很长。谢谢您的帮助!

【问题讨论】:

    标签: javascript angular typescript internationalization


    【解决方案1】:

    您可以检查一下,对我来说它完美无缺并且具有出色的性能(即时翻译,无需加载时间或重新加载):

    https://github.com/ocombe/ng2-translate

    然后您可以使用本地存储或任何具有此功能的设备来设置语言:

    translateService.use(window.localStorage.getItem('language'));

    您可以将翻译设置在单个文件中,并且可以以 JSON 格式订购翻译:(我为每个组件封装一个对象)

    "PASSWORD_CONFIRM": {
        "TITLE": "Merci !",
        "DESCRIPTION": "Votre nouveau mot de passe a bien été enregistré. Vous pouvez désormais accéder à la plateforme !",
        "BUTTON": "Entrer sur la plateforme"
      },
      ...
    

    然后你可以在你的 HTML 中设置你的文本如下:

      <div class="title">{{'PASSWORD_CONFIRM.TITLE' | translate}}</div>
      <div class="description">
          {{'PASSWORD_CONFIRM.DESCRIPTION' | translate}}
      </div>
    

    【讨论】:

    • 感谢 Alex,但我真的很想使用 Angular 2 的官方支持来实现国际化。这是一个解决方案,如果我找不到替代方案,我将使用它。谢谢你:)
    • 嗨安德烈,你有没有为你的问题找到任何解决方案,因为我也想为我的应用程序实现同样的解决方案
    • 好像官方的 angular i18n 会随着 ivy 的发布支持动态翻译。 github.com/angular/angular/issues/16477
    • 我最终都做了这两个.. 对静态文本使用 i18n 角度,对包含 html 标签或需要在组件中使用的任何内容使用 ngx-translate。 xlif 中的 HTML 标签是一种可怕的混乱体验,我不得不放弃。
    【解决方案2】:

    简而言之,如果不重新加载应用程序就无法更改语言环境,因为翻译工作由Angular 编译器完成。


    从今天起你有two options当使用官方Angular i18n时:

    使用AOT compiler

    在这种情况下,将为每个语言环境创建一个单独的包,您必须交换整个应用程序,即重新加载它。

    当您使用 AOT 编译器进行国际化时,您必须预先构建一个 为每种语言提供单独的应用程序包并服务于 基于服务器端语言检测或 url参数。

    使用JIT compiler

    这种方法性能较差,但您不一定需要为每种语言打包。
    在这种情况下,您使用webpack 加载翻译文件,并在引导期间将其提供给Angular 编译器。

    JIT 编译器在应用加载时在浏览器中编译应用。 使用 JIT 编译器进行翻译是一个动态过程:

    • 将适当的语言翻译文件作为字符串常量导入。
    • 为 JIT 编译器创建相应的翻译提供程序。
    • 使用这些提供商引导应用程序。

    虽然在官方文档中他们只有 useValue 提供程序的示例,但我很确定您可以使用 useFactory 根据您的配置提供 TRANSLATIONS 和 LOCALE_ID。
    您仍然需要在语言更改时重新引导您的应用程序,这反过来意味着重新加载,但是嘿,用户已将此捆绑包缓存在浏览器中,因此重新加载应该非常快。


    无论如何,到目前为止,如果您想获得真正动态的翻译,我建议您使用ngx-translate。
    除了translate 管道和服务之外,他们还有这个不错的speculative polyfill,当Angular i18n 正式支持代码翻译时,这可能会让您头疼。

    【讨论】:

      【解决方案3】:

      如果您使用 JIT 编译,您当然可以这样做。您需要一家工厂供应商来进行翻译。将这样的内容添加到您的根模块:

        export function localeFactory(): string {
          return (window.clientInformation && window.clientInformation.language) || window.navigator.language;
        }
      
        providers:
        [
          {
            provide: TRANSLATIONS,
            useFactory: (locale) => {
              locale = locale || 'en'; // default to english if no locale provided
              return require(`raw-loader!../locale/messages.${locale}.xlf`);
            },
            deps: [LOCALE_ID]
          },
          {
            provide: LOCALE_ID,
            useFactory: localeFactory
          },
          {provide: TRANSLATIONS_FORMAT, useValue: 'xlf'},
      

      【讨论】:

      • 使用这种方法是一次决定,但在引导时正确吗? (只是验证)。这不像有一个带有本地/国家选择的下拉菜单,并且可以动态更改它吗?需要根据向 Angular 注册的提供者来决定。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      • 1970-01-01
      • 2017-12-14
      • 2017-04-24
      相关资源
      最近更新 更多