在 Vue-i18n 中更改不同域的翻译

Changing translations within Vue-i18n for different domains

我有一个全球使用的应用程序,我的公司正在为某些市场重塑自己的品牌。

例如在U.S。在加拿大我们被称为“Acme Company”,但现在我们想在 U.S 中被称为“Acme Company”。并作为“加拿大的 Foo 公司。

目前我们的 vue-18n 翻译文件在翻译中到处都是“Acme Company”,例如:

TITLE_WELCOME_MSG: 'Acme Company lorem ipsum dolor sit amet, consectetur adipiscing elit.'

我想做的是这样的:

TITLE_WELCOME_MSG: '{companyBrand} lorem ipsum dolor sit amet, consectetur adipiscing elit.'

然后需要我更新 TITLE_WELCOME_MSG 的实现,现在像这样传递 companyBrand

this.$t('TITLE_WELCOME_MSG', { companyBrand: getCompanyBrandBasedOnDomain() })

然而现在我需要在数百个地方这样做(显然我们真的很喜欢说出我们的名字)。如果我可以在构建时向 i18n 实例提供 companyBrand 并且它会自动更新所有带有该变量的翻译,那会更好。那么我就不需要更新数百个地方了。

我们希望所有语言环境都看到相同的文本,这样如果您在加拿大的任何语言环境中,您都会看到“Foo Company”。此外,如果可能的话,我希望也从任何源代码中排除“Acme Company”。

有没有办法在 vue-i18n 实例中设置变量,这些变量将得到相同的翻译而无需更新所有实现?

如果您需要自定义行为,最好使用适合它的自定义函数,而不是填充不应了解您的情况的 third-party 库。

vue-i18n 函数具有可变参数,为了便于实现,可以丢弃一些签名。使用另一个函数名称不会干扰库名称会更干净,但可以将它们替换为 drop-in 替换:

Vue.use(VueI18n);
Vue.use({
  install() {
    Vue.prototype._orig$t = Vue.prototype.$t;
    Vue.prototype.$t = function (path, values = {}) {
      return this._orig$t(path, { companyBrand: '...', ...values };
    }
  }
);

如果需要,$tc 也是如此。

另一种选择可能是 use a formatter。由于基本格式化程序未公开,因此需要重新实现或从 i18n.formatter 扩展,此时这变得很麻烦。