我有一個在全球范圍內使用的應用程式,我的公司正在為某些市場進行品牌重塑。
例如,在美國和加拿大,我們被稱為“Acme Company”,但現在我們希望在美國被稱為“Acme Company”,在加拿大被稱為“Foo Company”。
目前我們的 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 實體中設定變數,這些變數都將被翻譯成相同的,而無需更新所有的實作?
uj5u.com熱心網友回復:
如果您需要自定義行為,最好使用適合它的自定義函式,而不是填充不應該了解您的情況的第三方庫。
vue-i18n 函式具有可變引數,為了便于實作,可以丟棄一些簽名。使用另一個函式名稱不會干擾庫名稱會更干凈,但是可以將它們替換為直接替換:
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等。
另一種選擇可能是使用格式化程式。由于基本格式化程式未公開公開,因此需要重新實作或從 擴展i18n.formatter,這在這一點上變得很棘手。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/444907.html
