用途:扫描代码中硬编码的用户可见文案,将其替换为 i18n 调用,并在各语言文件中补充对应键。判定规则是只要有一种目标语言需要不同字符串就必须包裹,不确定时倾向包裹。
主要能力(按阶段):
- 检测:从 package.json、导入与配置文件识别框架、翻译函数(t()、$t()、_()、$localize、NSLocalizedString、getString 等)、语言文件格式(JSON/YAML/PO/XLIFF/ARB/.strings/.xml)、键名约定、源语言与目标语言、复数格式。存在歧义时须询问用户,不猜测。
- 审计:用 Agent 工具的 research 子代理并行扫描语言文件,撤销对 console 调试信息、技术 ID、CSS 类名、环境变量等不可翻译项的包裹,并在继续前报告结果。
- 扫描:按文件类型(JSX/TSX、Python、Ruby、Swift/Kotlin)分派子代理并行查找标签间文本、可翻译属性(placeholder、title、alt、aria-label 等)、消息/标签赋值,并默认排除 node_modules、测试、dist/build、.next、coverage、配置文件等。
- 归类:按语义命名空间生成键名(common.、nav.、auth.、表单与校验、错误、成功提示、页面、meta. 等);相同文本不同语境使用不同键。
- 包裹:按需导入翻译函数、处理插值(${name} 转为 t('key', {name}))、把三元式复数改为 ICU/框架原生格式、用 Intl 处理日期数字,不破坏 JSX 结构。
- 键文件:向源语言添加新键并保持结构格式,目标语言以 "[NEEDS_TRANSLATION] 英文原文" 占位;不删除或覆盖已有翻译,并校验 JSON/YAML 可解析。
- 校验:并行运行构建与 lint、跨语言键一致性(数量、缺失、多余、插值占位符、复数类别)、测试套件。
限制与规范:不得拆分句子(如 greeting 加 name),不得包裹技术常量,不得使用 defaultValue,不得对 t() 输出做大小写或 trim 转换(如土耳其语 İ/i、德语 ß 规则),计数须放进 t() 内使用 ICU 复数而非外部插值。
框架要点:next-intl 用 useTranslations/getTranslations 与 ICU;react-i18next 用 useTranslation 与后缀复数 _one/_other;vue-i18n 用管道复数;Angular 用 i18n 与 $localize;Python 用 gettext/ngettext,PO 编译为 MO;Ruby 用 I18n.t 与 YAML 复数键;Flutter 用 ARB 与 flutter gen-l10n;iOS 用 .strings/.stringsdict;Android 用 strings.xml 与 <plurals>。
适用场景:已有或计划接入 i18n 的多语言前端、移动端与后端项目,需要在改动前审计、批量包裹并验证一致性。
输出含审计、扫描、键、语言文件、校验(构建/ lint / 测试 / 键一致性 / 复数)、警告(严重、质量、扩展风险)与后续步骤。
暂未提供的信息:具体安装命令、价格与授权方式、支持的语言或框架完整清单、性能数据等资料中未给出。