Vue3中vue-i18n自定义俄语复数规则配置不生效如何解决?
修复方案
你需要修改三处配置即可实现预期效果:
1. 修正俄语复数规则的判断逻辑
原有规则在复数选项为3条时没有区分2-4和5+、11-19的场景,导致所有非0、非1的数值返回同一个索引,修正后的规则如下:
setup() { const { t, locale } = useI18n({ pluralizationRules: { ru: function (choice, choicesLength) { if (choice === 0) { return 0; } // 11-19的特殊情况全部用секунд const isTeen = choice > 10 && choice < 20; if (isTeen) { return 0; } const endDigit = choice % 10; // 结尾为1对应секунда if (endDigit === 1) { return 1; } // 结尾为2-4对应секунды if (endDigit >= 2 && endDigit <=4) { return 2; } // 其余情况(结尾5-9)对应секунд return 0; }, }, }); return { t, locale }; }
2. 修正俄语国际化的复数条目顺序
原有俄语配置的第三个复数选项错误,需要和规则返回的索引对应:
- 索引0:对应
секунд(0、11-19、结尾5-9的场景) - 索引1:对应
секунда(结尾为1且非11的场景) - 索引2:对应
секунды(结尾为2-4且非12-14的场景)
修正后的国际化配置:
<i18n> { "en": { "seconds":"{count} seconds | {count} second | {count} seconds" }, "ru":{ "seconds":"{count} секунд | {count} секунда | {count} секунды" } } </i18n>
3. 确认t函数的调用方式
调用复数翻译时,必须将需要判断的数值作为第二个参数传入t函数,vue-i18n才能将数值传给复数规则做判断,示例调用:
// 模板中 {{ t('seconds', 3) }} // 输出 3 секунды {{ t('seconds', 11) }} // 输出 11 секунд {{ t('seconds', 21) }} // 输出 21 секунда
如果你需要全局复用俄语复数规则,建议将pluralizationRules配置到全局createI18n的初始化参数中,避免在单个组件内配置不生效的问题。
内容的提问来源于stack exchange,提问作者Gorilka
相关产品推荐
相关产品推荐

