iOS 和 Flutter 占位符检查器

粘贴源字符串及其译文:工具会标记丢失、改名、类型或顺序改变的占位符,同时适用于 Apple 格式(%@、%1$@、%lld)和 Flutter ICU 消息。免费,无需注册,文本始终不会离开你的浏览器。

比较占位符

要检查的译文

在你的浏览器中比较:不会上传任何内容。

导出前检查每条译文,无需复制粘贴

LocalePilot 是一款桌面应用,可自动把所有译文的占位符与原文比对(%@、%1$@、%lld、ICU),在质量检查中心中列出问题,并在阻断性问题修复之前阻止导出。macOS 版即将完成:留下邮箱,即可收到上线通知。

工具比较什么

  • Apple 格式:%@、%1$@、%d、%ld、%lld、%.2f、%u、%i 和 %s,逐个位置比较。%% 是普通文本。
  • Flutter ICU 占位符:{name},包括 plural 和 select 分支中的占位符。

%e 或 %x 等少见的转换会被有意忽略,以免把 "20%en" 这样的文本误判为错误。

最常见的错误

  • 丢失的说明符:不会崩溃,但名字或数字会从界面上消失。
  • 改变的类型:把 %lld 换成 %@ 后,整数会被当作对象读取,可能导致崩溃。
  • 未编号就改变顺序:要调整顺序,请给每个参数编号(%1$@、%2$@);混用带编号和不带编号的说明符属于未定义行为。
  • 法语中的 “20 % de remise”:百分号前的空格让 % d 被当作说明符读取。请把百分号写两次:%%。
  • 被重命名的 ICU 占位符:{count} 被改成 {nombre},会改变 Flutter 中所有语言的 API。

这些情况在 iOS 格式说明符指南和 ICU 占位符指南中有详细说明。

工具的局限

本工具只比较占位符,不检查含义:当参数未编号时,它无法发现两个被互换的 %@,也无法发现翻译得不好的句子。它不解析 ICU 的撇号转义(Flutter 的 use-escaping 选项):'{' 会被当作花括号读取。它一次只比较一个字符串;如需检查整个文件,请使用 ARB 缺失键检查器,或使用能检查每个键的编辑器。

常见问题

能识别哪些 iOS 格式说明符?

%@、%1$@(以及其他位置)、%d、%ld、%lld、%.2f、%u、%i、%s;%% 被视为普通文本。%e 或 %x 等少见的转换会被有意忽略。

为什么法语的“20 % de remise”会被标记?

在格式字符串中,“% d”是一个有效的说明符(空格是 printf 的标志位),所以“%lld % de remise”中有两个说明符,却只有一个参数。应写成“%lld %% de remise”。

可以在译文中调整参数顺序吗?

可以,只要给每个参数编号:%1$@ 是第一个,%2$@ 是第二个,无论它们在句子中的位置如何。在同一个字符串中,要么全部编号,要么全部不编号。

工具也检查 Flutter ICU 消息吗?

是的:花括号中的占位符会与原文比对,包括 plural 和 select 分支中的占位符。

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

不会。你的字符串(有时还未发布)在页面中比对:不会发送任何内容。

它和 LocalePilot 有什么区别?

本工具一次比较一个字符串。LocalePilot 是一款即将推出的 macOS 桌面应用,可比较 ARB、.strings 和 .xcstrings 文件中的每个键,并在出现阻断性问题时阻止导出。

上线时通知我

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

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