选择:同一条消息的多个版本
「1 条消息」「2 条消息」在英语里只差一个 s,但波兰语 / 俄语 / 阿拉伯语有三到六种复数形态——靠 n === 1 ? 'item' : 'items' 硬编码必然翻译错误。MF2 用
.match 声明一组变体(variant),每个变体配一组键(key),运行期由选择子函数(如 :number)挑出当前值落在哪个键、再渲染对应正文。
1 · 语法:.match + 变体 + 通配 *
先用 .input 给选择变量绑一个选择子函数,再 .match 它;随后每行一个变体:键(可以是精确字面量如 0、或复数类别如 one)+ {{正文}}。最后必须有一个通配键
* 作为默认分支——缺它会在构建时报 missing-fallback 错误。
2 · 动手试:复数选择
拖 count、换 locale,看选中了哪个变体、对应的复数类别,以及最终输出:
精确键优先于复数类别。当 count = 0 时,英语的复数类别其实是 other,但只要有一个精确键 0 的变体,它就会被优先选中(实现先按字面值找,找不到再退回类别)。这让你能为「0」「1」写特例文案,其余交给复数规则。
3 · 同一组变体,不同 locale 的命中差异
把波兰语的完整复数变体(one / few / many / *)拿给不同 locale:英语只用 one / other(*),多出来的 few / many 永不命中;波兰语则三档都用得上。这正是不能硬编码的原因。
4 · 序数与精确匹配:select 选项
:number 默认按基数复数(cardinal)选择。传 select=ordinal 改成序数(1st / 2nd / 3rd …),传 select=exact 则只按字面值匹配、不退回类别。
5 · 多个选择子:维度相乘
.match 后可跟多个选择变量,每个变体的键也相应有多列(最左列最重要)。下面同时按 count 与 gender 选择;拖动 / 切换看命中哪一格: