【发布时间】:2017-10-15 05:42:50
【问题描述】:
在我的项目中,我使用 Polymer 1 和 i18next(和 i18next-xhr-backend)来实现国际化。我所做的基本方法(见下文)效果很好,但是当用户更改语言时,Polymer 数据绑定不会更新。
目前的做法如下:
const i18next = require('i18next');
const i18nextXHRBackend = require('i18next-xhr-backend');
i18next
.use(i18nextXHRBackend)
.init({
fallbackLng: ['en', 'default'],
debug: true,
backend: {
loadPath: '/locale/locales/{{lng}}.json',
crossDomain: false
}
}, function(err, t) {
console.log("Init done...");
});
if (!Polymer || !Polymer.Base) {
console.warn('CoolI18N needs Polymer to be loaded.');
}
Polymer.CoolI18N = i18next;
Polymer.Base._addFeature({
myVeryCoolTranslationMethod: function(...params) {
return i18next.t(params);
}
});
在我的元素中,我得到了类似的翻译
<div>[[myVeryCoolTranslationMethod('application.welcomeMessage')]]</div>
或以编程方式通过
Polymer.CoolI18N.t('application.welcomeMessage')
问题是:当我在运行时加载一种新语言(如de)时,它会按原样加载,但数据绑定不会更新,所有字符串都设置在en 或default.
i18next 触发 languageChanged 事件,我可以像这样捕获:
i18next.on('languageChanged', (newLang) => {
console.log("language changed to:", newLang);
});
而这正是 Polymer 需要知道发生了什么变化的地方......
有没有可能实现这些数据绑定得到通知?我不想手动更新每个绑定...
提前谢谢你!
【问题讨论】:
-
就在 i18next 方面 -> 你在 i18next.changeLanguage 上有一个回调,你可以触发任何更新聚合物中的绑定(尚未使用聚合物,所以不知道那个......对不起) .或者通过 i18next.com/api.html#onlanguagechanged 绑定 changeLanguage 抱歉不能为聚合物部分提供帮助...
-
是的,这是真的 - 我知道
i18enxt.on('languageChanged', ...事件,但这正是我不知道如何通知 Polymer 的地方...... -
根据stackoverflow.com/questions/27159625/…Polymer 正在查看用于更新数据绑定中函数的参数,所以也许您可以将语言键作为参数添加到翻译器调用中!?
标签: data-binding polymer polymer-1.0 i18next