Neatbo.

一个不可见空格可能改变 ICU 分支

结合已解决的 NBSP 讨论,区分不可见语法字符、合法文字空白和真正缺失的 other 分支。

复制的消息没有说明全部问题

原提问中的嵌套消息看似有效,但作者随后定位到语法 token 之间的 NBSP U+00A0,撤回了解析器缺陷说法。维护者确认此处无效,文字中的 NBSP 仍可保留。作者最后希望警告能暴露复制进来的不可见空白。

因此,missing other 错误需要原文证据。先检查错误偏移处及附近不可见字符,再决定补分支或换解析器。不要统一替换所有空白,这可能改变合法文字输出。

  • 保留失败系统中的消息和参数 JSON 原件。
  • 核对成熟语法错误码、原始行列及 U+00A0 字节位置。
  • 明确修改该字符,用相同 locale 和参数类型重试。
  • 保存两份原件及完整渲染文本,供接收方运行时复现。

选定明确的数值与 locale 合同

参数仅为标量 Unicode 字符串或数学上精确的安全整数,范围 −9,007,199,254,740,991 至 9,007,199,254,740,991,先检查原始数值 token 再转为 JavaScript Number。小数或科学记数形式只有值确为整数时才可用。计数、offset 和 =选择器须非负。 显式 =选择器仅使用规范十进制写法:=0 或 =[1-9][0-9]*,不带加号、前导零或 −0。

拒绝分数值、日期/时间、样式、骨架、货币、富文本标签/尖括号、MF2 声明、回调和解析器回调。所有 AST 分支均检查必需参数和类型,未选中的分支也检查;合法但未使用的标量参数列入报告。

普通数值参数采用 FormatJS String(value) 语义,number 和 # 采用本浏览器 Intl locale 数据。运行时数据变化可改变结果,不承诺与所有 ICU4J 语义兼容。语法错误显示成熟错误码、原文 UTF16 偏移/行/列、UTF8 字节偏移和附近 U+00A0 位置;不会自动修复 NBSP。

普通数值与 locale 数值
消息:{n} / {n, number}
JSON:{"n":12345}
Locale:en-US
文本:12345 / 12,345

预览需要完整证据

允许 20,000 个 AST 节点、65 层未引用语法花括号、1,000 个参数名;每名 128 UTF8 字节,每字符串值 65,536 UTF8 字节。被单引号引用的文字花括号不计语法深度。

完整渲染文本允许 8 MiB UTF8。屏幕只预览 4,000 个 Unicode 码点;原生复制和 rendered-message.txt 均保留全文。下载两份原件和完整参数元信息报告;报告中的不可见字符位置明确只预览前 200 项。

校验全部分支中的参数,包括当前值没有选中的分支。前 4,000 码点截图不能替代完整文本和不变原件。报告明确将前 200 个不可见字符位置标为辅助预览;全部参数名与用途仍完整。

发布前复核
证据检查
原始消息没有静默修复 NBSP;记录传输 BOM 移除
参数 JSON解码键唯一;整数精确;全部分支类型正确
Locale 与运行时明确枚举;接收运行时 Intl 数据可能不同
完整文本复制或下载全文,而非只有屏幕预览

参考资料

  • ICU 语法中的复制不可见空白

    作者定位语法 NBSP 后撤回最初解析器缺陷说法,仍希望得到可见警告。已阅读三个原例和全部六条评论;网页偏好与需求规模未知。

  • FormatJS 解释式 MessageFormat AST

    本工具只支持明确的纯文本 MF1 合同和运行时 Intl,不承诺完整 ICU4J 兼容、富文本标签或 MF2。

  • ICU MessageFormat1 语法

    select/plural other、offset、# 与可选单引号引用;样式及日期/时间不在本合同内。

本分类工具使用说明

展开工具,查看操作步骤、可调选项和支持范围,再直接进入工作区。

预览 ICU MessageFormat1在本地渲染嵌套 ICU select 与 plural 消息,并用原始位置定位语法中的不可见字符。

在本地渲染嵌套 ICU select 与 plural 消息,并用原始位置定位语法中的不可见字符。

操作步骤

  1. 粘贴消息或选择一份原始 UTF8 消息文件,再粘贴具名参数 JSON。
  2. 选择明确的 locale,用正确参数类型预览并校验全部分支。
  3. 语法拒绝时核对成熟错误码和可见码点位置,明确修改原文后重试。
  4. 交接前复制或下载完整文本、两份不变原件及参数报告。

可调选项

Locale
en-US · en-GB · zh-CN · fr-FR · ru-RU · ar-EG

使用本浏览器明确的 locale 数据;默认 en-US。

能力与限制

  • 粘贴消息,或选择至多一个严格 UTF8 消息文件,上限 1 MiB。文件仅替代主消息,次输入的参数 JSON 仍需粘贴,上限也是 1 MiB。原始文件名标签允许 512 UTF8 字节。
  • 每个输入至多移除一个起始 UTF8 BOM,明确作为传输标记记录;下载保留两份原始字节。拒绝损坏 UTF8、原始或 JSON 转义的未配对 Unicode 代理码。解码后重复参数键使整次处理拒绝。
  • 选择 en-US、en-GB、zh-CN、fr-FR、ru-RU 或 ar-EG,默认 en-US。支持文字、可选单引号引用、普通参数、select、基数 plural、selectordinal、offset、=选择器、# 和无样式 number。每个 select/plural 必须有 other。
  • 参数仅为标量 Unicode 字符串或数学上精确的安全整数,范围 −9,007,199,254,740,991 至 9,007,199,254,740,991,先检查原始数值 token 再转为 JavaScript Number。小数或科学记数形式只有值确为整数时才可用。计数、offset 和 =选择器须非负。 显式 =选择器仅使用规范十进制写法:=0 或 =[1-9][0-9]*,不带加号、前导零或 −0。
  • 拒绝分数值、日期/时间、样式、骨架、货币、富文本标签/尖括号、MF2 声明、回调和解析器回调。所有 AST 分支均检查必需参数和类型,未选中的分支也检查;合法但未使用的标量参数列入报告。
  • 允许 20,000 个 AST 节点、65 层未引用语法花括号、1,000 个参数名;每名 128 UTF8 字节,每字符串值 65,536 UTF8 字节。被单引号引用的文字花括号不计语法深度。
  • 完整渲染文本允许 8 MiB UTF8。屏幕只预览 4,000 个 Unicode 码点;原生复制和 rendered-message.txt 均保留全文。下载两份原件和完整参数元信息报告;报告中的不可见字符位置明确只预览前 200 项。
  • 普通数值参数采用 FormatJS String(value) 语义,number 和 # 采用本浏览器 Intl locale 数据。运行时数据变化可改变结果,不承诺与所有 ICU4J 语义兼容。语法错误显示成熟错误码、原文 UTF16 偏移/行/列、UTF8 字节偏移和附近 U+00A0 位置;不会自动修复 NBSP。
打开预览 ICU MessageFormat1 →