【问题标题】:I18Next & Polymer: update data-bindings when language changedI18Next & Polymer:当语言改变时更新数据绑定
【发布时间】: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)时,它会按原样加载,但数据绑定不会更新,所有字符串都设置在endefault.

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


【解决方案1】:

这是全局绑定问题。除非将它们从 DOM 中移除并重新插入,否则它们不会得到更新。

在我的应用程序中,我有 1 个元素(我们称之为 my-guidepost)作为整个应用程序的根(index.html 不是好方法,因为您无法将其从 DOM 中删除)。

因为我在我的项目中有自己的语言处理,所以我有一个文件,我可以在其中处理语言所需的所有内容。 (我猜你有类似的东西)。

语言切换功能示例:

localStorage.setItem("lang-info", lang);
this.text = this[lang];
document.body.removeChild(document.querySelector("my-guidepost"));

setTimeout(() => {
    var guidepost = document.createElement("my-guidepost");
    guidepost.id = "app";
    document.body.appendChild(guidepost);
}, 500);

注意:我没有使用shadow-dom

因此,我不得不改变很多事情,在您的项目开始扩展到更大的东西之前解决这个问题非常好。例如行:

var guidepost = document.createElement("my-guidepost");

是最致命的。试试你自己,你会看到。也许你的建筑比我好。但是如果你在 ready 函数中指向某个 DOM 元素,它会抛出错误(因为 DOM 甚至没有设置。只在某个变量中创建)。

如果您遇到问题,我会在这里为您提供帮助。

如果您需要更多信息,请询问

【讨论】:

  • 感谢您的意图,但我无法从 DOM 中删除并重新附加我的根元素,因为实现了用户处理,它包含用户选择的语言。 :-(
  • 毫米。我不知道在渲染绑定后如何重新初始化绑定的任何其他方法。唯一的事情是刷新整个页面。但它对用户不友好
  • 无法重新加载页面,因为此时用户的语言未知(无自动检测,将从数据库加载)
猜你喜欢
  • 2017-11-11
  • 1970-01-01
  • 2020-11-04
  • 2015-08-30
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 2013-10-07
相关资源
最近更新 更多