无需登录 数据私有 本地保存

ICU 消息格式测试器 - 复数/性别/选择格式化

32
0
0
0

ICU 消息格式测试器

测试复数形式(plural)、性别/选择(select)、序数(selectordinal)、数字/日期格式化等 ICU MessageFormat 语法

消息模板
快速预设: 🍎 复数-苹果 👤 性别问候 📦 订单状态 🏆 序数排名 🔗 嵌套复合 💵 数字货币
检测到 1 个变量
变量赋值

输入模板后自动检测变量

实时预览
格式化结果将显示在这里
常见问题 & 知识点

ICU(International Components for Unicode)消息格式是一种强大的国际化消息格式化语法,由 Unicode 联盟维护。它允许在字符串中嵌入变量、复数形式、性别选择、数字格式化等逻辑。广泛应用于 React Intl、Vue I18n、Angular i18n、Flutter、Java ICU4J 等国际化方案中。核心语法使用花括号 {...} 包裹格式化指令。

plural 用于基数(cardinal)场景,如"1个苹果"、"2个苹果"、"5个苹果"。关键字包括 =0, =1, zero, one, two, few, many, other

selectordinal 用于序数(ordinal)场景,如"第1名"、"第2名"、"第3名"。关键字为 zero, one, two, few, many, other(注意没有=X精确匹配)。不同语言的序数规则差异很大:英文中1→one(1st)、2→two(2nd)、3→few(3rd)、其他→other(4th+);中文所有序数都归入other。

pluralselectordinal 的选项消息体中,# 是一个特殊占位符,会被自动替换为该 plural 变量的实际数值。例如 {count, plural, other{有#个苹果}},当 count=5 时,输出"有5个苹果"。# 只在其直接所属的 plural/selectordinal 选项体内有效,嵌套的 plural 会有自己的 # 上下文。

ICU 消息格式支持任意深度的嵌套。例如:
{gender, select, male{他有{count, plural, one{#个苹果} other{#个苹果}}} female{她有{count, plural, one{#个苹果} other{#个苹果}}} other{TA有{count, plural, one{#个苹果} other{#个苹果}}}}

这个模板先根据 gender 选择主语,再根据 count 选择复数形式。内层的 # 属于内层 plural(count),与外层 select(gender)无关。解析器会递归处理每一层。

常见数字格式化样式:
{var, number} — 默认数字格式(带千分位)
{var, number, integer} — 整数(去除小数)
{var, number, currency} — 货币格式(默认USD,受locale影响)
{var, number, percent} — 百分比格式
{var, number, ::compact-short} — 紧凑格式(如1K、1M)
日期同理:{var, date, short/medium/long/full}

1. 花括号不匹配:每个 { 必须有对应的 },嵌套时注意层级。
2. 缺少 other 选项:plural 和 select 都必须包含 other 作为默认分支,否则在无法匹配时会报错。
3. 关键字拼写错误:plural 关键字严格区分大小写,只能使用 zero/one/two/few/many/other=数字
4. 变量名包含特殊字符:变量名只能使用字母、数字、下划线,不能包含空格或标点。
5. 逗号后缺少空格:虽然语法允许,但 {var,plural,...} 中逗号后加空格更易读。

主流国际化库都支持 ICU 消息格式:
React Intl<FormattedMessage id="..." values={{count:5}} />
Vue I18n$tc('key', 5)$t('key', {count:5})
Angular{{ count | i18nPlural:pluralMap }} 或使用 $localize
Flutter:使用 Intl.plural()Intl.select()
Java:使用 ICU4J 库的 MessageFormat
使用此测试器可以预先验证模板语法,确保在所有目标语言环境下正确显示。