The OpenRouter homepage in Japanese.

OpenRouter 现在支持简体中文、Español、Português (Brasil)、Deutsch、Français、日本語和한국어,以及英语。本地化从今天开始进入 beta 阶段。要切换语言,请从账户菜单中选择一种语言,或直接访问类似openrouter.ai/ja或openrouter.ai/ko/models的地址。

The OpenRouter models page in Korean, with filters, tabs, and model metadata translated.

翻译一个网站并让翻译保持最新很难,对我们来说尤其如此。OpenRouter 的站点有 16,918 条英文字符串,而且我们每天都会改动其中一些,所以一次性翻译不到一周就会过时。我们构建了一个循环来帮助大规模完成这件事。每天,它会找出发生变化的字符串,翻译它们,在代码中提交,并让第二个模型对照英文验证含义。当某个翻译未通过检查,或验证器拒绝它时,循环会附上原因将其送回并重试。这个重试循环就是系统中自我纠正的部分。

仍有一些错误会漏过它,而人们会抓住这些错误。当审阅者和读者报告错误时,我们会将其转化为术语表规则、风格说明或覆盖项,而每日审查发现的错误也会成为未来每个模型都必须通过的测试用例。整条流水线运行在 OpenRouter 上。

翻译与代码一起存放在 Git 中

在任何模型参与之前,翻译需要一个归宿。我们使用开源的General Translation运行时来在我们的 React 代码中包裹字符串。我们将翻译作为 JSON 目录与代码一起提交,并在运行时本地加载它们,因此请求路径中不会有翻译服务。一个字符串在合并后的一天内就会被纳入翻译。在此之前,页面显示英文原文。每个翻译条目还会存储其来源英文的指纹。当有人编辑英文时,指纹不再匹配,该条目就会回到队列中。这条规则让每日运行能够找出所有过时条目,而无需重新翻译整个目录。

流水线

该队列中的每个字符串在到达站点之前都要经过五个阶段。

How a string gets translated: new text goes to a translator model, then code checks, then a verifier model, then review, then live. Failed checks and verifier rejections go back to the translator, and fixes flagged by reviewers or readers go into the glossary.

一个脚本会扫描前端,并将每个被包裹的英文字符串写入源目录。每个条目记录其所在文件及其 UI 角色,例如按钮、标题或表头。角色很重要,因为同一个英文单词在不同位置可能需要不同的翻译。按钮上的“Queue”是一条指令,而本文后面的一个缺陷就是模型将其翻译成了名词。

2. 翻译

我们将新增和变更的字符串分批发送给 GPT-6.1 Sol,每批最多 40 条,并使用结构化输出将回复限制在严格的 JSON schema 内。每个请求都携带我们的全局和按语言区分的风格说明、批次中任何产品术语的术语表规则,以及每个字符串的 UI 角色。

以下是一个针对单个日语批次的翻译器请求的简化示例,其中风格说明和术语表规则已截短。

{
"model":"openai/gpt-6.1-sol",
"messages":[
{
"role":"system",
"content":"将 OpenRouter UI 字符串翻译成日语。……"
},
{
"role":"user",
"content":"[{"id":"q1","role":"button","text":"Queue"}]"
}
],
"response_format":{
"type":"json_schema",
"json_schema":{
"name":"translations",
"strict":true,
"schema":{
"type":"object",
"properties":{
"translations":{
"type":"array",
"items":{
"type":"object",
"properties":{
"id":{"type":"string"},
"text":{"type":"string"}
},
"required":["id","text"],
"additionalProperties":false
}
}
},
"required":["translations"],
"additionalProperties":false
}
}
}
}

由于 OpenRouter 上的每个模型都接受相同的请求,尝试不同的翻译器只需更改模型 slug。这就是我们在本文后面进行模型对比的方式。

3. 检查

代码会拒绝违反 ICU 占位符、复数分支、富文本标签或前导/尾随空白的回复,或者以术语表禁止的形式呈现产品术语的回复。我们会将拒绝的批次拆成更小的片段重新发送,并指明失败原因,默认最多进行 4 轮。该限制是一个设置项,最高可设为 20。在最后一轮后仍然失败的字符串会保留英文,并在拉取请求中被标记。

4. 验证

对同一模型的第二次调用充当验证器,对照英文逐条阅读译文,并按严重程度列出错误。任何严重或重大错误,例如漏译从句或意思反转,都会把该字符串连同目前所有异议一起退回给翻译器。翻译器在首次尝试之后最多可重试 3 次,最后一次重试会投入更多推理努力。每个字符串的支出没有单独上限,因为重试次数限制已经对其形成约束。算上检查重发,一个字符串最多可经历四次翻译尝试,每次最多四轮检查,外加每次尝试后的一次验证器调用。这使得最坏情况下每个字符串每种语言约需 20 次模型调用。如果验证器宕机,流水线不写入任何内容,该字符串保持英文。读者看到一天英文,总比看到未经检查的译文要好。

5. 审核

每个每日批次都以一个拉取请求的形式落地。一个 AI 审核员阅读 diff 并发布发现,然后由人合并该拉取请求。

我们如何衡量

本文的其余部分依赖三个评估套件,所以在数字开始之前,先了解每个套件测试什么会有所帮助。

  • 模型对比(254 个用例)用不同的翻译器模型运行流水线,并用生产验证器为每个回复打分。我们用它来选择翻译器。
  • 流水线对比(454 个用例)让同一个模型运行两次,一次走完整流水线,一次只用两行提示词。代码检查、验证器、来自另外三个模型家族的评判者,以及回译检查都会为其打分。
  • 缺陷套件(22 个用例)收录了每日审核在验证器放行之后仍抓到的真实错误。每个用例都禁止那个曾经上线的错误。

我们尝试过又放弃的东西

流水线现在看起来很简单,因为评估衡量之后,我们删掉了初版设计中的三个部分。

更便宜的翻译器

我们首先测试了一个更小、更便宜的模型 GPT-6 Luna(openai/gpt-6-luna)。在模型对比中,它首次尝试就通过了 91.7% 的用例,而 GPT-6.1 Sol 为 99.2%。它最弱的语言是韩语和日语。它最严重的失败是 General Translation(我们的翻译框架)无法编译的回复,例如它对“Legacy alias of {value}”的翻译。这些失败在每次重试中都持续存在。

更重的模型成本约为 3.4 倍,这 254 个用例为 1.94 美元对 0.57 美元。我们愿意支付这个差价,因为一个始终无法收敛的错误字符串,修复它所花费的时间和精力比一开始就做对要多。

一个独立的评判模型

在验证器出现之前,一个独立的评判模型会为每个翻译打分,我们会重新翻译它标记或标记为不确定的任何内容。为了了解它的效果,我们用一个包含三类字符串的基准测试进行了标注:已知错误、修正后的翻译(早期错误的手工修复版本,应当通过)以及一个干净样本。该评判模型确实发现了真实问题。在一次基准测试运行中,它将该次运行中 91% 的真实缺陷标记为不确定。它还标记了 14 个修正翻译中的 11 个,以及 150 个干净样本中的 42 个,因此它把大量优质工作退回重新翻译。

在验证器就位的情况下,关闭评判模型使首次通过准确率从 99.2% 降至 98.8%,最终结果保持不变。该评判模型此前会将约 45% 的初稿退回重新翻译。我们现在默认将其关闭。

将困难字符串留给人工处理

起初,验证器在每次重试中都拒绝的字符串会保持未翻译状态,直到有人手工修复。对整个目录(16,274 个字符串翻译成 7 种语言)进行一次完整重译后,留下了 97 个这样的字符串(0.09%)。现在,流水线会根据验证器的发现对被拒绝的草稿进行排序,提交错误最少的那一个,并在拉取请求中标记以供审查。这个循环总是以一次翻译结束,即使该翻译仍然带有被标记的错误,而该标记会将其呈现在合并拉取请求的人面前。

该流水线在裸模型之外增加了什么

流水线带来的大部分改进是减少了明显的错误。为了衡量这一点,我们的评估将同一个模型在 454 个案例上运行两次,一次通过完整流水线,一次仅用两行提示词、不带风格说明、术语表或重试。裸模型返回了一条格式错误的回复,因此剩下 453 对可供比较。

指标裸模型完整流水线
未通过术语表或人工编写检查453 个中的 147 个454 个中的 4 个
首次通过验证器通过检查的 306 个中的 263 个(85.9%)全部 454 个中的 448 个(98.7%)
关键错误数,由来自其他模型家族的三个评判员汇总203109
在整体偏好上各自获胜的对数117139
含义在回译后得以保留90.8%89.3%

人工编写检查是针对单个评估案例手写的规则。例如,中文里的“Queue”不能翻译成 队列,即已发布版本中使用的名词形式。检查失败数从 147 降到 4,这是术语表和重试在发挥作用。

验证器的首次通过数据使用了不同的基数。对于裸模型,基数是 306 条通过代码检查的字符串;对于流水线,基数是全部 454 条。验证器与翻译器来自同一模型家族,因此其通过率告诉我们模型在多大程度上与自己一致。我们两项工作都使用 GPT-6.1 Sol,因为它是我们测试的两个翻译器中更准确的那个。为了获得外部视角,评估还将每一对译文在不加标签的情况下发送给来自其他模型家族的三个评判员:Claude Opus 5.5、Gemini 4 Argon 和 DeepSeek V4 Pro。三个评判员合计在流水线输出中发现了 109 个关键错误,在裸模型输出中发现了 203 个。每个评判员的错误单独计数,因此一条被三个评判员都标记的字符串会给总数增加三。

在 453 对译文的整体偏好上,评判员在 139 对中选择了流水线,在 117 对中选择了裸模型,另有 61 对平局、136 对两份译文完全相同。这一差距远小于检查失败数和关键错误数所显示的差距,因此流水线的价值主要在于它消除的具体错误。

最后一行会把每条回复回译成英文,并询问原意是否保留。它给裸模型打了 90.8%,给流水线打了 89.3%。回译看不出术语和语域,而这恰恰是流水线改动的主要部分,所以我们把这个结果视为平局。

反馈闭环

验证器在发布前拦截了大部分错误,读者则能发现其余错误中的一部分。

Highlighted text on the Japanese homepage with the popover for sending feedback on it.

在语言对话框中开启“选中即报告”,然后高亮任意译文,添加备注并发送。每份报告都会附带语言、页面和确切的文本。先由模型进行分诊,从四种修复方案中选一种,并在几分钟内上线修复。我们的 AI 审核员检查修复,最后由人工完成合并。

  • 含义错误。该字符串当天回退为英文,随后获得修正后的译文。
  • 术语错误。我们把该术语连同可接受形式和该语言需拒绝的形式一起加入术语表。我们固定 HIPAA、SOC 2、OAuth 和 SAML 等合规与协议名称,让流水线将它们保留为英文。
  • 语气或标点错误。该规则会写入该语言的风格说明。
  • 单个错误字符串。精确覆盖会固定已批准的措辞,之后的任何运行都无法更改它。

每日审查在验证器放行后发现的错误会进入缺陷套件。目前有 22 个用例。其中包括把按钮上的“Queue”译成名词而此处需要动词、把“shadow traffic”译成道路交通,以及一个含义被颠倒的 HIPAA 设置。每个用例都会禁止已发布的那个错误,因此未来任何模型、提示词或术语表改动若让它重现,评估就会失败。

成本如何

我们最初定价时,将全部 16,274 条字符串完整重译为 7 种语言,共 113,918 条翻译,包含翻译和校验在内,总费用约为 430 美元。我们得出这个数字的方式是按每种语言对生产规模的批次定价,再按比例放大。折算下来,每条字符串每种语言不到半美分。校验费用略高于一半,约为 228 美元,即每条字符串每种语言 0.002 美元。此后目录已增长到 16,918 条字符串,如今完整重译一次约需 460 美元。每日循环只发送有变更的内容,某一天有 677 条字符串在 7 种语言中发生变更,费用约为 18 美元。

这两个数字只涵盖翻译和校验调用。它们不包括搭建流水线的工程时间、AI 审核员和分诊模型发起的调用,以及每天合并每个拉取请求的人员。

如今的 16,918 条字符串包含 136,429 个英文单词,因此 7 种语言合计 955,003 个单词,这使我们的成本约为每词 0.0005 美元。以下是按 Smartling 和 Gengo 截至 2026 年 11 月 10 日公布的每词起步费率计算的同一次完整重译。

选项费率全站,7 种语言
我们的流水线,翻译和校验约每词 0.0005 美元约 460 美元
Smartling 机器翻译每词 0.0075 美元约 7,200 美元
Smartling AI 翻译每词 0.06 美元约 57,300 美元
Gengo 标准每词 0.09 美元约 86,000 美元
Smartling AI 人工翻译每词 0.12 美元约 114,600 美元
Gengo 高级每词 0.18 美元约 171,900 美元
Smartling 人工翻译每词 0.20 美元约 191,000 美元

这些是标价;企业合同需另行协商,而且上表中机器翻译之外的每一行都包含人工审核或项目管理,我们的数字未计入这些。最接近的同口径选项是 Smartling 的机器翻译,我们的流水线成本约为其 6%。

你可以复用的部分

如果你在为自己的产品做本地化,这个设计中有四个部分可以直接沿用。

  • 为每条译文与其英文源文建立指纹,使过期的条目自动重新排队。
  • 让代码在任何模型审查含义之前,先拒绝损坏的占位符、复数分支、标签和禁用词。
  • 使用一个能指出每个错误及其严重程度的验证器,并将这些反对意见发回给翻译器。
  • 将人们发现的每一个错误转化为术语表规则、风格说明、覆盖规则或评测用例。

向我们发送你的反馈

在测试阶段,部分措辞可能不够准确,最快的修复方式是通过语言对话框中的“选择并报告”功能进行报告。我们会审阅每一份报告,并将其转化为术语表规则、风格说明或覆盖规则。

常见问题

OpenRouter 支持哪些语言?

OpenRouter 提供英语、简体中文、西班牙语、巴西葡萄牙语、德语、法语、日语和韩语版本。本地化功能处于测试阶段。

如何更改 OpenRouter 的语言?

从账户菜单中选择一种语言,或打开本地化地址,例如 openrouter.ai/ja。

哪些模型负责翻译 OpenRouter?

GPT-6.1 Sol(openai/gpt-6.1-sol)负责翻译每个字符串,随后对同一模型的第二次调用会对照英文进行验证。两者均通过 OpenRouter API 运行。

翻译整个网站需要多少费用?

将当前的 16,918 个字符串完整重新翻译成 7 种语言,费用约为 460 美元,包含翻译和验证,即每个字符串每种语言不到半美分。同样的工作在 Smartling 公布的机器翻译费率下约为 7,200 美元,在公布的 AI 和人工翻译费率下约为 57,300 美元至 191,000 美元。

如何报告糟糕的翻译?

在语言对话框中开启“选择并报告”,高亮显示有误的文本,添加备注并提交。