Flutter ARB 文件的 ICU 复数生成器

选择你的语言:工具会显示每种语言需要的复数类别及示例数字,并生成可直接粘贴到 ARB 文件中的 ICU 消息。免费,无需注册,一切都在你的浏览器中完成。

生成复数消息

语言

然后检查每条译文是否保留了占位符

LocalePilot 是一款桌面应用,可打开你所有的 ARB 文件,把每条译文的 ICU 占位符与原文比对,标记缺失的键,并在导出时自动备份。macOS 版即将完成:留下邮箱,即可收到上线通知。

为什么复数形式因语言而异

zero、one、two、few、many 和 other 这些类别遵循各语言的 CLDR 规则。在英语中,one 只表示 1;在法语中它覆盖 0 和 1;俄语和波兰语还有 few 和 many;阿拉伯语六个全用;中文和日语只有一个:other。因此,为英语写的两分支消息,一旦翻译成其他语言就可能不完整。

本工具在浏览器中读取这些规则(Intl.PluralRules):显示的类别和示例数字都来自该语言本身,无需维护任何表格。

gen-l10n 中的 =1 陷阱

在 flutter gen-l10n 生成的代码中,=1 分支会变成 one 类别。在法语中,这个类别同样适用于零:当 count = 0 时,会显示 "1 article restant"。更好的做法是使用 one 类别并把数字写在文本中,或者添加一个 =0 分支:工具以复选框的形式提供这个选项。详情见ICU 复数与占位符指南。

如何使用结果

  1. 把每种语言的 "key": "{count, plural, …}" 这一行复制到对应的 app_xx.arb 文件中。
  2. 在模板文件中添加一次 @key 元数据。
  3. 运行 flutter gen-l10n:缺少 other 分支或花括号未闭合时,生成会停止并给出文件名。

之后若要检查是否有译文丢失或重命名了占位符,请使用 ARB 缺失键检查器。

工具的局限

本工具只生成结构,每个形式的文本需要你自己写。它不处理 select 消息或嵌套的复数,如果你在 l10n.yaml 中开启了 use-escaping,它也不会把撇号加倍。

常见问题

中文需要哪些复数类别?

只需要 other。按 CLDR 规则,中文和日语一样只有一个复数类别:一个 other 分支就能覆盖所有数字,需要特殊处理零时可以再加 =0。

为什么 other 分支是必需的?

flutter gen-l10n 会拒绝没有 other 分支的复数消息并停止生成,同时指出出错的文件。本工具总会加上这个分支。

=1 和 one 有什么区别?

在生成的代码中,=1 会变成 one 类别,而在法语中 one 也覆盖 0。请把数字写在 one 分支的文本中,或者添加 =0。

我的文本会被发送到服务器吗?

不会。消息在页面中根据浏览器的复数规则组装,不会发送任何内容。

列表中没有的语言也能用吗?

能:在自由输入框中填写语言代码(例如 cs 或 sv)即可。工具接受浏览器能识别的任何语言代码。

它和 LocalePilot 有什么区别?

本工具一次编写一条复数消息。LocalePilot 是一款即将推出的 macOS 桌面应用,可打开你所有的 ARB 文件,并在导出前检查每条译文的 ICU 占位符。

上线时通知我

LocalePilot 正在做最后的完善。留下你的邮箱,上线时我们会通知你。

  • macOS 12 或更高版本 · Ollama 或 LM Studio 可选
  • 应用界面语言:英语、法语、西班牙语、意大利语和葡萄牙语。