跳转到主要内容

智能体指南:使用 i18n-rosetta

i18n-rosetta 是一个只需一条命令即可翻译应用本地化文件的 CLI 工具。本指南专为希望快速从零开始完成本地化文件翻译的 AI 智能体(或与 AI 智能体协作的开发者)编写。

:::tip 已经熟悉了? 如果你只需要命令,请跳转至 CLI 参考。如果你想构建并基准测试某种翻译方法,请参阅 Arena 智能体指南。 :::


环境设置

# No global install needed — npx runs it directly
npx i18n-rosetta sync

要求:

  • Node.js 18+
  • 翻译服务提供商的 API 密钥

API 密钥设置 —— 根据你使用的翻译方法,rosetta 至少需要一个密钥:

# Option 1: export (session only)
export OPENROUTER_API_KEY="sk-or-..." # for llm / llm-coached methods
export GOOGLE_TRANSLATE_API_KEY="AIza..." # for google-translate method

# Option 2: .env file in your project root (persistent, gitignored)
echo 'OPENROUTER_API_KEY=sk-or-...' > .env

Rosetta 会自动读取 .env。你可以在 openrouter.ai/keys 获取 OpenRouter 密钥。


首次同步

Rosetta 会自动检测你的本地化文件、文件格式(JSON、TOML、YAML、PO)以及目标语言:

npx i18n-rosetta sync

执行过程:

  1. 加载 i18n-rosetta.config.json(或自动检测设置)
  2. 扫描源本地化文件,展平嵌套键
  3. .i18n-rosetta.lock(先前已翻译值的 SHA-256 哈希)进行比对
  4. 检查 .rosetta/tm.json 中的缓存翻译(翻译记忆库)
  5. 通过配置的方法仅翻译已更改、缺失或过期的键
  6. 对每条翻译运行质量门禁(5 项检查)
  7. 将通过检查的翻译写入目标本地化文件
  8. 更新锁文件和 TM 缓存

在修改一个键后的典型重新运行中,第 4 步会从缓存中提供 142 个键,第 5 步仅翻译 1 个键。这就是后续同步既快又省钱的原因。


配置

在项目根目录创建 i18n-rosetta.config.json

{
"inputLocale": "en",
"pairs": {
"en-fr": { "method": "llm-coached" },
"en-ja": { "method": "google-translate" },
"en-crk": { "method": "api", "endpoint": "http://localhost:3000/translate" }
}
}

关键字段:

字段用途默认值
inputLocale源语言en
pairs包含方法配置的源语言→目标语言映射(必填)
localesDir本地化文件存放位置(自动检测)
model用于 llm/llm-coached 方法的 LLM 模型google/gemini-2.5-flash
batchSize每次 API 调用的键数量80 (LLM), 128 (Google)
jsonConcurrencyJSON 键的并行本地化翻译数200
contentConcurrency内容翻译的并行 API 调用数48

完整参考:配置


翻译方法

方法适用场景成本所需 API 密钥
llm通用,适合资源丰富的语言按 Token 计费(取决于模型)OPENROUTER_API_KEY
llm-coached当你有目标语言的语法规则/词典时按 Token 计费 + 辅导上下文OPENROUTER_API_KEY
google-translate谷歌翻译效果较好的高资源语言$20/百万字符GOOGLE_TRANSLATE_API_KEY
api托管在 HTTP 端点后的自定义流水线由服务器决定无(端点处理身份验证)
plugin本地安装的预打包方法视情况而定视情况而定

详情:翻译方法


辅导数据

对于 llm-coached 语言对,辅导数据通过明确的语言学知识来引导 LLM。创建一个辅导文件:

coaching/fr.json
{
"grammar_rules": [
"Use formal register (vous) for all UI text",
"Adjectives agree in gender and number with the noun"
],
"dictionary": {
"dashboard": "tableau de bord",
"settings": "paramètres"
},
"style_notes": "Prefer active voice. Avoid anglicisms."
}

在你的语言对配置中引用它:

"en-fr": { "method": "llm-coached", "coachingFile": "coaching/fr.json" }

质量门禁会验证词典术语是否确实出现在输出中——违规情况会被记录为 [TERM] 警告。

详情:辅导数据


质量门禁

每条翻译在写入磁盘前都会经过五项自动检查:

检查项捕获内容示例
空/空白模型未返回任何内容""
原文复读模型原样返回了输入的英文日语翻译返回 "Welcome"
幻觉循环重复的三元组 (trigrams)"Qo' Qo' Qo' Qo'"
长度膨胀输出比原文长 4 倍以上10 字符原文 → 50 字符输出
书写系统合规语言区域的书写系统错误阿拉伯语区域出现拉丁文本

失败项会以 [GATE] 前缀记录。没有静默回退机制——如果翻译失败,它会被报告,而不是被悄悄接受。

详情:质量门禁


翻译记忆库

Rosetta 将翻译缓存到 .rosetta/tm.json 中,以 源文本 + 语言区域 + 方法 作为键。在后续同步中,未更改的键将直接从缓存中提供——无需调用 API,零成本。

[TM] 142 key(s) served from cache
Translating 3 key(s) to French (llm)... [OK]

若要在单次运行中绕过缓存:npx i18n-rosetta sync --no-tm

详情:翻译记忆库


生成的文件

Rosetta 会在你的项目中创建几个文件。了解它们的作用,以免意外删除或提交错误的文件:

文件用途提交到 Git?
.i18n-rosetta.lock已翻译源值的 SHA-256 哈希(用于变更检测) —— 请提交此文件
.i18n-rosetta-content.lock同上,但用于 Markdown/MDX 内容文件 —— 请提交此文件
.rosetta/tm.json翻译记忆库缓存 —— 请提交此文件(为团队节省 API 成本)
.rosetta/coaching/辅导数据目录 —— 这是你的语言学知识
i18n-rosetta.config.json项目配置 —— 请提交此文件

常见模式

翻译单个语言对:

npx i18n-rosetta sync --pair en-fr

翻译所有已配置的语言对:

npx i18n-rosetta sync

Rosetta 会并行翻译所有语言区域。借助 TM 缓存,只有更改过的键才会调用 API。

内容模式(适用于 Docusaurus、Hugo 等的 Markdown/MDX):

npx i18n-rosetta sync --content

在翻译本地化 JSON 的同时,翻译文档、博客文章和内容文件。使用并行并发(默认:同时进行 48 个 API 调用)。可通过 --content-concurrency 进行调整。

试运行(仅预览,不写入):

npx i18n-rosetta sync --dry-run

强制重新翻译特定键:

npx i18n-rosetta sync --force-keys "hero.title,nav.about"

强制重新翻译所有内容文件:

npx i18n-rosetta sync --force-content

检查翻译状态:

npx i18n-rosetta status

显示每个语言对的覆盖率、质量层级和插件信息。

审计未翻译的回退项:

npx i18n-rosetta audit

列出所有需要翻译的 [EN] 回退值。


故障排除

问题解决方法
OPENROUTER_API_KEY not set导出密钥或将其添加到项目根目录的 .env
No locale files found在配置中设置 localesDir,或确保你的本地化文件符合标准命名规范(en.json, fr.json
[GATE] Script compliance failed目标语言区域生成了拉丁文本,而不是预期的书写系统——请尝试使用其他模型或添加辅导数据
[GATE] Source echo模型原样返回了英文——添加辅导数据或更换模型通常可以解决此问题
所有翻译均被缓存使用 --no-tm 运行以绕过缓存,或使用 --force-keys 针对特定键绕过缓存
锁文件冲突.i18n-rosetta.lock 使用 SHA-256 哈希——解决合并冲突时保留任一版本都是安全的,然后重新运行同步即可

下一步