【问题标题】:Make sure translations JSON file has loaded before continuing to load Angular app在继续加载 Angular 应用程序之前确保已加载翻译 JSON 文件
【发布时间】:2016-08-12 10:39:55
【问题描述】:

我们使用 ng2-translate 在 Angular 应用程序中实现国际化,并使用 .instant(...) 方法进行翻译以避免订阅 observables 的混乱。

但是,如果翻译 JSON 文件尚未完成加载,.instant 将出错。有没有办法等到翻译文件下载完成后再继续加载应用程序的其余部分?

【问题讨论】:

    标签: angular typescript internationalization


    【解决方案1】:

    也许您可以尝试在 Angular 应用启动时初始化默认语言翻译。

    在你的 app.module.ts 中添加这个

    providers: [
      {
        provide: APP_INITIALIZER,
        useFactory: appInitializerFactory,
        deps: [TranslateService],
        multi: true
      }
    ]
    
    
    import { APP_INITIALIZER } from '@angular/core';
    import { TranslateService } from '@ngx-translate/core';
    
    export function appInitializerFactory(translate: TranslateService) {
      return () => {
        translate.setDefaultLang('es');
        return translate.use('es').toPromise();
      };
    }
    

    您可以在此处找到更多详细信息:https://mcvendrell.medium.com/configuring-ngx-translate-to-load-at-startup-in-angular-1995e7dd6fcc

    【讨论】:

      【解决方案2】:

      文档明确说明了 instant :获取键(或键数组)的即时转换值。 /!\这个方法是同步的,默认的文件加载器是异步的您有责任了解您的翻译何时加载以及使用此方法是安全的。如果您不确定,那么您应该使用 get 方法。

      另外,请注意您不能阻止角度初始化。角度团队不希望您能够做到这一点。

      我阅读了 lib 的代码,无论如何,use 方法都会返回一个 observable。所以你最好的办法是在你的代码中做(鉴于你没有发布你的文档示例代码:

      constructor(translate: TranslateService) {
          var userLang = navigator.language.split('-')[0]; // use navigator lang if available
          userLang = /(fr|en)/gi.test(userLang) ? userLang : 'en';
      
          // this language will be used as a fallback when a translation isn't found in the current language
          translate.setDefaultLang('en');
      
          // the lang to use, if the lang isn't available, it will use the current loader to get them
          /* Here is your observable */
          translate
              .use(userLang)
              .subscribe(res: any => 
              {
                  // In here you can put the code you want. At this point the lang will be loaded
              });
      }
      

      所以在订阅回调中你可以做任何你想做的事情,因为此时已经加载了 lang。由于您没有发布代码,因此我无法为您提供更多帮助,但是如果您需要进一步的帮助,请立即联系我。

      【讨论】:

      • 这确实有道理,但是,如果我订阅了 'translate.use' Observable,那么我知道我的翻译文件已经加载,但是如果那个文件很大,那不意味着UI 在加载之前会有空白点吗?
      • 是的,确实如此。但是你没有其他方法可以走。如果你真的不想在你的 UI 中出现空白点,你可以在你的应用组件中沿着主容器标签设置一个带有*ngIf="!loaded" 的整页加载器块,在你的主容器上设置一个相反的*ngIf="loaded"。在您的应用程序组件中,您将 loaded 布尔值定义为 false,并在订阅回调中设置 this.loaded = true;
      • 这也不是重点,但如果您担心 json 文件大小,您可以在 webbserver 中为 json 激活 gzip / deflate 压缩,因为 gzip 具有非常好的压缩率。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-04
      • 2019-03-03
      • 2021-09-24
      • 1970-01-01
      • 2014-05-02
      相关资源
      最近更新 更多