当我第一次更改我的应用程序的语言时,翻译服务会请求代表新语言的文件,我的“智能”组件字符串正确反映了更新但任何“纯/哑”组件都没有,它们保留在以前语。但是,一旦新的语言文件被加载到缓存中并且我继续更改语言,一切似乎都可以正常工作。
似乎任何纯组件都没有解析来自新语言文件的 ajax 响应的更新,它只会在文件已加载到缓存中时正确更改语言。同样,这仅适用于使用 ChangeDetectionStrategy.OnPush 的组件
我了解在哑组件中使用 Inputs 和 Observables 的 changeDetection,但在这种情况下,我对管道并不熟悉。可能我错过了什么?
UDPATE
我设法破解了一个修复程序,它不是很好,但它有效。这是我的服务中包装翻译服务的构造函数。
我检查我是否已经在缓存中为我将要选择的语言提供了语言 json 文件。如果我没有它,我会使用 ng2-translate 中的 'reloadLang' 方法去获取它。一旦我有了它,我使用一个空的超时,然后调用'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 和请求翻译文件的新响应之间的混合。如果其他人看到此内容,请添加您的输入。