ng2-translate - 使用OnPush更改检测的组件中的翻译字符串未更新

时间:2016-07-08 17:28:53

标签: angular angular2-pipe ng2-translate

当我第一次更改应用程序的语言时,翻译服务会请求代表新语言的文件,My' smart'组件字符串正确地反映了更新,但任何纯/哑'组件没有,它们保留以前的语言。但是,一旦将新语言文件加载到缓存中并且我继续更改语言,一切似乎都能正常工作。

似乎任何纯组件都没有从新语言文件的ajax响应中解析更新,它只会在文件已加载到缓存时才能正确更改语言。同样,这仅适用于使用ChangeDetectionStrategy.OnPush

的组件

我理解在哑组件中使用Inputs和Observables的changeDetection,但在这种情况下,我对管道并不熟悉。可能我错过了什么?

UDPATE

我设法破解了一个修复程序,它不是很好但是有效。这是我的服务中包含Translate服务的构造函数。

我检查我是否已将语言json文件放在缓存中,以便我选择使用的语言。如果我没有,我会使用' reloadLang' ng2-translate中的方法去获取它。一旦我拥有它,我使用一个空的超时,然后调用' translate.use'。在某个地方出现了计时问题,因为如果我拿出暂停时它就不起作用了。 如果我已经有翻译文件,我即将切换到我只需正常使用translate.use,一切正常。

constructor(private translate: TranslateService, public store: Store<any>) {
// this language will be used as a fallback when a translation isn't found in the current language
translate.setDefaultLang('en');
// subscribe to changes
store.select('i18n').subscribe((state: MultilingualStateI) => {
  // update ng2-translate which will cause translations to occur wherever the TranslatePipe is used in the view
  if (this.translate.getLangs() && (this.translate.getLangs().indexOf(state.lang) > -1)) {
    this.translate.use(state.lang)
  } else {
    this.translate.reloadLang(state.lang).take(1).subscribe(() => {
      setTimeout(() => this.translate.use(state.lang), 0);
    });
  }
});

}

我不完全确定这里发生了什么,但似乎是使用ChangeDetectionStrategy.OnPush和请求翻译文件的新响应之间的混合。如果有人看到这个,请添加您的输入。

1 个答案:

答案 0 :(得分:3)

我遇到了这个问题。我有一些图表(我使用ng2-charts),当我更改语言时(例如,从en更改为es),所有标签都会更新,但图表相关的标签除外。为了使用新语言更新我的图表,我不得不再次将语言更改为es(因此,双击以首次更改语言)。

在阅读了您的问题和解决方法后,我检查了它,问题是,正如您所指出的,缓存。第一次更改语言时,会加载JSON,但由于它不在缓存中而不是所有组件都被翻译(在我的例子中,图表没有被正确更新)。第二次更改为相同的语言时,标签已经在缓存中,因此它可以正常工作。

我通过在初始化服务时加载所有可用的语言来修复它:

constructor(private translate: TranslateService) {
    var navigatorLanguage = (window.navigator.userLanguage || window.navigator.language).toLowerCase().split("-")[0];
    // this language will be used as a fallback when a translation isn't found in the current language
    translate.setDefaultLang(navigatorLanguage);
    // the lang to use, if the lang isn't available, it will use the current loader to get them
    translate.use(navigatorLanguage)
    // Hack to load all languages
    // If we don't do this, the first time we change language not all elements are properly translated
    translate.reloadLang('en')
    translate.reloadLang('es')
}

就我而言,我只有这两种语言。如果有更多,也许一些for循环对于重新加载每个lang是有用的:)