译者的多语种栈
十个资产给真正在跑流水线的本地化工程师、译者和 i18n PM:抽取 → 术语表 → 翻译(LLM + NMT)→ 术语 QA → 回注。自托管 Weblate/Tolgee,LibreTranslate 兜底,Vale + LanguageTool 做 QA,PDFMathTranslate 和 KrillinAI 啃硬格式。
这个 pack 包含什么
这是给真正在干活的本地化工程师、译者、i18n PM 的栈 — 就是那个要把 po/xliff/json 文件交付出去、不能让 build 挂、不能把占位符 {username} 弄丢、不能因为 LLM 忘了这是个 SaaS 应用就把 "trial" 翻成「法庭审判」的人。
它不是一个魔法翻译器。本地化的活分五步 — 抽取、建术语表、翻译、QA、回注 — 每一步都有自己的工具和自己的翻车点。这个 pack 在每一步给一个默认选项,再在两个容易翻车的步骤(翻译引擎本身、TMS 啃不动的格式)各给一个兜底。
下面全部可自托管。这件事很重要:公司里真正的 translation memory 通常也是法律敏感内容(合同、未发布的 release notes、客服工单)。不假思索就丢给第三方 MT 厂商,是合规电话会议的开端。
推荐安装顺序(抽取 → 术语表 → 翻译 → QA → 回注)
- Weblate — TMS。从这里起步,因为其他所有工具都接到它上面。Weblate 盯你的 git 仓库,从 gettext/xliff/json/properties 抽字符串,交给译者(或 MT 引擎)翻译,再以 commit 形式推回去。Docker 自托管,一下午搭完。
- Tolgee — 开发者友好版替代。如果你的译者不懂技术、需要在运行中的应用里 alt-click 就能编辑字符串的「上下文编辑器」,选 Tolgee 而不是 Weblate。多数团队二选一:git 原生工程团队选 Weblate,产品驱动团队选 Tolgee。
- LibreTranslate — NMT 引擎。自托管 Argos 模型,无 API key,无限流。这是 LLM 太慢、太贵或者拒绝翻译时的兜底。接进 Weblate 当自动建议后端。
- Fairseq — 当你要在自家语料上真训练或微调 NMT 模型时。多数团队不会走到这里。会走到这一步的(强监管行业、低资源语种、post-edit 量极大的工作流)也躲不掉。知道它存在已经是一半。
- Claude / GPT-4 级 LLM(通过 IDE 或 API)— 上下文感知译者。给那些必须读起来像人写的字符串用:营销文案、面向用户的报错、新手引导。永远把术语表和上下文一起放进 prompt,永远。
- NLTK — Python NLP 工具箱。中间环节那些不起眼的活全靠它:分词、断句、给术语表挖候选词、计算翻译输出的 BLEU/chrF。它不是翻译器,是胶带。
- LanguageTool — 25+ 语言的语法 + 风格 QA。跑在翻译后的文本上,不是源文本。它抓的是那一类静默 bug:翻译语法上是错的,但非母语审稿人根本看不出来(德语词格、法语一致性、西语 ser/estar)。
- Vale — 带自定义规则包的散文 linter。这是你的术语执行者:风格指南说「写 sign in 不写 login」就禁掉 login、禁止翻译 "Pull Request"、营销语种里禁某种语气。和 LanguageTool 配对:Vale 抓政策违规,LanguageTool 抓语法。
- PDFMathTranslate — 保留排版、公式、图表地翻译 PDF。其他 PDF 翻译器全做错的那件事。技术文档、学术论文、必须回到 PDF 的监管申报都需要它。
- Whisper + KrillinAI — 当源是口语时。Whisper 抓带时间戳的转写;KrillinAI 包办整条「视频翻到 100 种语言」的流水线,需要的话还能配音。源是视频时才用这俩 — 它们是 TMS 啃不动的格式逃生口。
它们怎么协同(翻译流水线)
源内容 (po / xliff / json / md / pdf / video)
│
▼
┌──── Weblate (或 Tolgee) ────┐
│ 抽字符串 + 分段 │
│ ───────────────────────── │
│ PDF → PDFMathTranslate │
│ 视频 → Whisper + Krillin │
└──────────────┬───────────────┘
▼
术语表 (TMX/CSV)
由术语 owner 维护
│
▼
┌──── 翻译 ────┐
│ ╱ ╲ │
│ LLM (上下 LibreTranslate │
│ 文感知) (批量 + 兜底) │
│ ╲ ╱ │
│ Fairseq (要微调时) │
└──────┬───────┘
▼
┌──── QA 闸 ────┐
│ Vale (术语) │
│ AND │
│ LanguageTool (语法) │
│ AND │
│ NLTK (BLEU/chrF 评分) │
└──────┬───────────┘
▼
Weblate commit 回注 → git → build
关键的环节是 QA 闸:Vale + LanguageTool 双双通过、术语报告显示零违规之前,任何字符串都不许进回注那一步。没这个闸,规模一上来 LLM 的上下文丢失就会把你吃掉。
你会遇到的取舍
- LLM vs Google Translate vs DeepL vs LibreTranslate — LLM 赢在上下文(它知道
{user_name}是占位符不是词)。DeepL 赢在欧洲语言的流畅度。Google 赢在语种覆盖广。LibreTranslate 赢在成本 + 隐私因为跑在你 VPC 里。生产环境按字符串路由:营销文案 → LLM、UI 字符串 → DeepL 或 NMT、内部文档 → LibreTranslate。 - 术语表的松紧 — 太严翻译读起来像机器人。太松一个产品里「sign in」「log in」「登入」「登录」「登陆」会同时存在。中间路线:品牌词和法律词硬执行、风格选择软建议、审稿人可以带评论覆盖。
- Weblate vs Tolgee vs Lokalise/Crowdin — 托管 SaaS(Lokalise、Crowdin、Phrase)上手快但锁定你、按字符串收费。Weblate 是「译者活在 git 里」时的开源默认。Tolgee 是「译者需要上下文编辑」时的开源默认。除非你真需要那些集成而且不在乎账单,跳过 SaaS。
- MT 预翻 + 后编辑 vs 纯人工 — 90% 的字符串,MT + 后编辑比纯人工快 3-5 倍、质量相同。失败的那 10%(法律、品牌语气、笑话、文化梗)在源文件里提前用 tag 标出来、单独走纯人工。把整个 App 当成 10% 处理是本地化成本爆炸的方式。
常见踩坑
- 上下文丢失 — 翻译
Save时不知道这是按钮、功能名、还是「已保存」的过去时。修复:把截图 URL、上下文句子、UI 组件类型一起塞进 translation memory。Tolgee 原生支持;Weblate 要装截图插件。 - 格式破坏 — 弄丢
{count}占位符、把<a href="...">的 HTML 写坏、删掉行尾换行。commit 前永远拿翻译后字符串的形状和源做对比验证。Weblate 有占位符检查;打开它。 - 术语漂移 — 半年里三个译者各自给 "workspace" 选了不同的词。每周跑 Vale + 术语审计;术语违规要当 CI 失败处理,不是软警告。
- 复数形式 — 英语 2 种复数、俄语 3 种、阿拉伯语 6 种、中文 1 种。从 day 1 就用 ICU MessageFormat,不要字符串拼接复数。
- RTL 语言 — 阿拉伯语和希伯来语不只是把文字翻转,还翻转布局、括号、标点规则。RTL 要在 QA 里测,不是在生产里测。
- 没脱敏就把 TM 喂给第三方 LLM — 你的 translation memory 里有未发布的 release notes 和所有客服工单。在内容离开 VPC 之前脱敏 PII 和未公开内容。LibreTranslate 存在就是为了这个原因。
10 个资产打包就绪
常见问题
Weblate 和 Tolgee 真的要都装吗?
不用 — 二选一。如果你的译者用 git 顺手、整条流水线想保持工程师习惯(PR、commit 历史、CI 闸),默认 Weblate。如果你的译者不懂技术、想在运行中的应用里 alt-click 字符串直接改,默认 Tolgee。两个都试的团队最后会把不匹配自己译者干活方式的那个砍掉。pack 把两个都列出来是因为选哪个取决于团队,不取决于技术。
Claude 这种 LLM 啥都能翻,为啥还要 LibreTranslate?
三个原因。一是成本:LibreTranslate 跑在自己硬件上无 token 计费,5 万字符串的产品做批量预翻译,成本差距很大。二是延迟:LibreTranslate 毫秒级返回,LLM 秒级。三是隐私:translation memory 里通常有未发布的产品细节、合同、客户数据 — 留在自己 VPC 很重要。能跑的模式是:上下文重的字符串(营销、报错)给 LLM、一致性和成本重的字符串(批量 UI、内部文档)给 NMT。
Vale 和 LanguageTool 有啥区别 — 不都是 linter?
它们解决不同的层。LanguageTool 是语法检查器:它懂德语词格、法语一致性、西语 ser/estar — 这些是译者可能错是因为目标语言本身难。Vale 是风格和术语 linter:执行你的风格指南(「绝不写 login,永远写 sign in」「绝不翻译 Pull Request」)。两个都要。LanguageTool 抓语法漂移,Vale 抓政策漂移。只跑一个,会留一类 bug 不设防。
这周能跑起来的最小版本是啥?
三件套:Weblate(Docker,一下午就能对着 git 仓库搭起来)、LibreTranslate(Docker 一个容器,接成 Weblate 的 MT 建议引擎)、Vale(CLI,一个配置文件写禁用词列表)。这三件就有了「抽取 → MT 预翻 → 术语闸 → commit」。下周加 LanguageTool 抓 LibreTranslate 抓不到的语法 bug。再下一步给营销文案加 LLM 通道。pack 其他工具,等你撞到三件套基线啃不动的格式时再加。
源代码、截图、术语表、TMS 几头分裂,怎么让译者出活儿?
最大的杠杆是把真实 UI 的截图放进 translation memory、按字符串绑定。Tolgee 一键搞定;Weblate 要装截图插件 + 写个小 CI 任务每个组件上传一张 Storybook 截图。译者能看到自己在翻什么之后,UI 字符串的吞吐量大概涨 30-50%,「德语翻译撑爆按钮」的 bug 报告也会消失。第二个杠杆是自动加载相似字符串的最近 5 条翻译作为上下文 — 多数 TMS 都有,打开它。