首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ng2-translate -在具有OnPush更改检测的组件中不更新翻译字符串

ng2-translate -在具有OnPush更改检测的组件中不更新翻译字符串
EN

Stack Overflow用户
提问于 2016-07-09 01:28:53
回答 0查看 3.2K关注 0票数 4

当我第一次更改我的应用程序的语言时,翻译服务请求表示新语言的文件,我的“智能”组件字符串正确地反映了更新,但任何“纯/哑”组件不能,它们保留在以前的语言中。然而,一旦新的语言文件被加载到缓存中,并且我继续更改语言,一切似乎都很正常。

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

我理解在哑巴组件中使用输入和可观察对象的changeDetection,但在这种情况下,当涉及到管道时,我就不那么熟悉了。也许我漏掉了什么?

更新

我已经设法破解了一个修复,它不是很好,但它是有效的。这是我的服务中包装翻译服务的构造函数。

我检查在缓存中是否已经有我将要选择的语言的语言json文件。如果我没有它,我会使用ng2-translate中的'reloadLang‘方法来获取它。一旦我有了它,我就使用一个空的超时时间,然后调用'translate.use‘。这里有一个定时问题,因为如果我去掉超时,它就不能工作。如果我已经有了要切换到的翻译文件,我只需像往常一样使用translate.use,一切都可以正常工作。

代码语言:javascript
复制
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和请求翻译文件的新响应之间的混合。如果其他人看到了这一点,请添加您的输入。

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38272388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档