国际化工具

ICU 消息格式测试器看看每个复数分支实际显示什么

输入一条传统 ICU 消息模板与参数 JSON,比较正常结果和不同数值触发的分支。

ICU 消息格式测试器

ICU 消息模板

参数 JSON

格式化结果

数值边界结果

添加 plural 或 selectordinal 参数后会显示边界值。

消息和参数只在当前浏览器标签页处理,不会上传。

测试选项

复数类别来自当前浏览器的 Intl 数据;CLDR 版本随浏览器变化,可能与应用运行时不同。

结果已过期;重新测试后才能导出。

译文在 count=1 时正确,不代表 11 或 21 也正确。ICU 消息格式测试器用同一模板逐个运行七个边界值,直接显示选中的复数类别与最终句子。

在提交翻译前,用 ICU 消息格式测试器检查占位符名称、嵌套 select 和 Locale。这里使用 FormatJS 与当前浏览器的 Intl 数据;如果线上应用依赖另一套 ICU 或 CLDR 版本,还应在生产运行时复核。

为什么使用 ICU 消息格式测试器?

同一条消息在不同语言和数字下可能走不同分支。

把 11 和 21 都放进预览

ICU 消息格式测试器依次运行 0、1、2、5、11、21、101,保留原始参数 JSON 不动。精确的 =0 分支优先于复数类别;俄语等语言的 11 与 21 也可能选择不同词形。表格把类别和真实输出并排展示。

一条带复数分支的消息按数字流向不同结果,零值单独进入精确匹配分支。

让缺失占位符在提交前暴露

模板里的 {name} 必须有同名 JSON 键,大小写也要一致。ICU 消息格式测试器会报告缺失值、语法位置和无效参数,而不是把未替换的占位符当作成功输出。嵌套 select 和 plural 由同一个解析器执行。

消息模板和参数令牌汇入结果,缺失的参数令牌被标出并停止生成。

按真实值检查分支的三步

01

先选一条实际模板

粘贴传统 ICU MessageFormat 1 模板,或试用 plural、select、嵌套示例。错误示例专门展示缺少 other 分支时的诊断;MF2 的 {$name} 与 .match 不属于本页语法。

02

核对参数键与 Locale

输入一个 JSON 对象,键名必须与模板完全一致。修改 BCP 47 Locale 后,再看同一个数字选中的类别是否改变。复数规则取自浏览器,无法保证与服务端版本相同。

03

查看边界表再导出

选中一个复数或序数变量,重点比较 0、1、11、21。边界运行仅临时覆盖所选参数,不修改输入 JSON;结果过期时复制和下载都会禁用。

语法、参数和 Locale 一起验证

同一引擎负责解析与生成

ICU 消息格式测试器使用 FormatJS 解析和运行传统 MF1,支持 plural、select、selectordinal、offset、嵌套结构与基本 number 格式;MessageFormat 变量替换和语法检查使用同一引擎。

多组数值一次比较

复数规则测试不能只列 one、few、many 名称。边界表展示每个数字的类别和完整句子,适合排查 11 与 21、精确 =0 和 offset 的区别。

错误对应具体输入

ICU 语法检查会在解析器给出位置时标出行列;缺失变量、无效 JSON、无效 Locale 分别显示。输入一改,旧结果立即失效,避免误复制。

可撤销的示例切换

ICU 消息格式测试器默认自动运行。点击示例或清空会先显示替换预览与字符数量,确认后可撤销一次,并同时恢复旧输入与旧结果。

本页支持什么,不支持什么

只测试传统 MessageFormat 1
ICU 消息格式测试器接受 FormatJS 支持的花括号语法,不把 MessageFormat 2 的 {$name}、.match 自动改写成 MF1。两套格式混合会让语法判断失去意义。
浏览器规则不是固定 CLDR 版本
plural/select 的复数类别由当前浏览器 Intl.PluralRules 决定。页面无法可靠读取浏览器内置的 CLDR 版本,也不保证与 ICU4J、ICU4C 或服务端配置逐字一致。
只处理单条模板与一个 JSON 对象
ICU 消息格式测试器不上传翻译文件、不扫描整个 catalog、不比较源文和译文,也不会悄悄补上缺失的 other 分支。数组、null 和标量不能作为顶层参数。
输出按纯文本处理
需要宿主回调的富文本标签会被拒绝,不当 HTML 执行。日期、时间和复杂货币 skeleton 若依赖项目自己的格式器,应再用实际应用运行时检查。

ICU 消息格式测试器常见问题

# 符号在 plural 中代表什么?

在 plural 选项里,# 代表当前数值减去 offset 后格式化的结果。它不等同于普通的 {count} 占位符;把默认示例的 count 从 1 改成 2,就能在结果中看到差异。

如何处理嵌套的 plural 和 select?

可以把 plural 放在 select 的分支里,或反过来。确保当前分支需要的变量都在 JSON 中。ICU 消息格式测试器会用同一套 FormatJS 语法处理嵌套内容,边界表只临时替换一个数值参数。

数字格式化 {var, number} 支持哪些样式?

本页支持 FormatJS 运行时的基本 number 格式;复杂 skeleton 和自定义格式器请在项目运行时再次核对。复数分支中的 # 使用当前 Locale 格式化数字,可能带有不同的分组符号。

常见的错误有哪些?如何排查?

先看语法错误的行列,再检查每个 plural/select 是否有 other 分支;随后核对 JSON 是否为对象、键名大小写、数值变量类型与 Locale。错误信息会留在面板中,方便逐项修正。

ICU 消息格式在实际项目中如何使用?

通常把模板放在翻译资源中,由应用提供参数并在目标 Locale 下格式化。这里适合单条消息的开发预览;上线前仍应在应用实际采用的 FormatJS、ICU4J 或 ICU4C 环境里回归。

遇到与线上应用不同的格式化结果?

现在使用 ICU 消息格式测试器

先改动默认示例的 count,再切换 Locale 比较分支。

下次复数句子只在某个数字上出错时,回到 ICU 消息格式测试器复现该输入。

在当前浏览器本地运行。