You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:48:02