6月1日 09:25

i18next 插值、复数、上下文怎么用?{{变量}}/CLDR/context 详解

i18next 的插值通过 {{variable}} 语法实现变量替换,如 t('hello', { name: 'Tom' }) 对应翻译文件中 Hello {{name}}。数组插值用 {{arr,0}} 按索引取值。嵌套插值用 $t(key) 引用其他翻译条目,实现翻译文本的复用。复数处理根据语言类型自动匹配:英语等单复数语言使用 key_one/key_other 后缀,俄语等有复杂复数规则的语种遵循 CLDR 规范自动映射对应后缀(如 key_zero/key_one/key_few/key_many/key_other)。上下文功能通过 context 选项让同一 key 根据语境返回不同翻译,如 t('friend', { context: 'male' }) 匹配 friend_male。格式化方面,i18next 内置 format 函数,可自定义格式化器处理日期、数字等,插值时通过 {{value, formatter}} 调用。转义默认开启,{{var}} 输出 HTML 转义后的值,{{-var}} 输出原始值,用于嵌入 HTML 片段。

追问

复数后缀的完整规则是什么?

英语只需 _one_other。斯拉夫语系需要完整的 CLDR 后缀:_zero(0个)、_one(1个)、_few(2-4个)、many(5-20个)、other(其余)。阿拉伯语还有 _two 后缀。i18next 内置了 CLDR 复数规则,只需按规范提供对应后缀的翻译条目即可自动匹配。

context 和复数可以组合吗?

可以。格式为 key_context_plural,如 friend_male_one。i18next 会按 key_context_pluralkey_contextkey_pluralkey 的顺序回退查找:

json
{ "friend_male_one": "一个男朋友", "friend_male_other": "{{count}}个男朋友" }

如何自定义格式化函数?

在 init 时注册:

js
i18n.init({ interpolation: { format: (value, format, lng) => { if (format === 'date') return new Intl.DateTimeFormat(lng).format(value); if (format === 'uppercase') return value.toUpperCase(); return value; } } });

翻译文件中使用 {{date, date}}{{name, uppercase}} 调用。

$t 嵌套插值有什么限制?

$t() 不能循环引用,否则会抛出异常。嵌套深度没有硬限制但不建议超过 2 层,影响可读性和性能。$t() 引用的 key 仍可接收插值参数:$t(greeting, { "name": "Tom" })

标签:i18next