你开发了一个 Django 应用。它运行正常,用户在不断注册,现在你想触达不会说英语的用户。问题一目了然:Django 的国际化框架在提取可翻译字符串方面非常出色,但它完全不会帮你填写翻译内容。这部分需要你自己来做。
如果你是独立开发者或两人小团队,makemessages 和一个完整翻译的应用之间的鸿沟会让人望而却步。我会介绍几种现实可行的方案,解释为什么其中大多数对小团队来说行不通,并展示一种工作流,让翻译从数周的苦差事变成两分钟的命令。
传统方案(以及它们为什么让人头疼)
方案一:从 Google Translate 复制粘贴
最常见的第一次尝试。你打开 .po 文件,把每个 msgid 复制到 Google Translate,再把结果粘贴回 msgstr,然后不断重复。每个字符串都是如此。每种语言都是如此。
一个典型的 Django 应用有 200-500 个可翻译字符串。如果你要翻译成五种语言,那就是 1,000-2,500 次复制粘贴。即使每次只需要 30 秒,你也要花 8-20 个小时做这种令人麻木的工作。而且这还没算上修复格式错误、损坏的占位符和不可避免出现的术语不一致所需的时间。
更糟的是,下一个迭代你添加新字符串时,这一切又要重来一遍。
方案二:专业翻译人员
专业翻译的费用通常是每个单词 $0.10 到 $0.25。一个有 500 个字符串、平均每个 8 个单词的 Django 应用大约有 4,000 个单词。按 $0.15/单词计算,每种语言需要 $600,五种语言就是 $3,000。
对于有风投支持的初创公司,这只是个零头。但对于一个按每位用户 $9/月收费的独立开发者来说,这可能吃掉你一整个季度的收入。
方案三:Fiverr 和自由职业市场
你可以在 Fiverr 上找到每种语言 $20-50 的翻译者。有些人确实技术精湛。但很多人只是把你的文本粘贴到 Google Translate,然后向你收费。你最终得到的质量和方案一一样,还多了一轮沟通和一周的等待。
方案四:Crowdin、Transifex 或 Weblate
这些平台功能强大,但它们是为拥有专门翻译团队的项目设计的。当你是项目中唯一的人时,配置开销(同步仓库、配置翻译记忆库、管理贡献者权限)就显得过于繁重。付费版月费从 $30-150/月起步,即使是免费版也需要你维护又一个第三方集成。
方案五:把所有内容粘贴到 ChatGPT
这在质量方面实际上效果出奇地好。你把 .po 文件内容粘贴到 ChatGPT 或 Claude 中,请求翻译,就能得到合理的结果。问题在于它无法规模化。你必须手动提取未翻译的字符串、格式化提示词、将响应解析回 .po 格式,并在超出上下文限制时处理分批。它能用一次。但作为可重复的工作流就不行了。
自动化方案
如果整个翻译步骤只需一条命令呢?这就是 TranslateBot 背后的理念——一个开源的 Django 管理命令,读取你的 .po 文件,将未翻译的字符串发送给 AI 提供商,然后以正确的格式写回翻译结果。
下面是配置方法。
第一步:安装 TranslateBot
uv add --dev translatebot-django
或者用 pip:
pip install translatebot-django
将其添加到已安装的应用中:
# settings.py
INSTALLED_APPS = [
# ...
'translatebot_django',
]
第二步:配置你的 AI 提供商
添加两个设置:
# settings.py
import os
TRANSLATEBOT_API_KEY = os.getenv("OPENAI_API_KEY")
TRANSLATEBOT_MODEL = "gpt-4o-mini"
TranslateBot 支持 OpenAI、Anthropic Claude、Google Gemini,以及通过 LiteLLM 支持的 100 多种其他模型。它还支持 DeepL 作为专用翻译后端。
第三步:创建 TRANSLATING.md(可选但推荐)
在项目根目录下的 TRANSLATING.md 文件为 AI 提供关于你的应用的上下文信息。这正是通用机器翻译和真正适合你产品的翻译之间的区别:
# Translation Context
## About This Project
A personal finance tracker for freelancers. Users track invoices,
expenses, and tax obligations.
## Tone
- Friendly and informal
- Use "du" in German, "tu" in French
- Keep financial terms precise
## Terminology
- "invoice" = "Rechnung" (German), "facture" (French)
- "dashboard" = keep as English loanword in all languages
- "freelancer" = keep as English loanword in German
这个文件会随每次翻译请求一起发送,因此 AI 会始终使用正确的语气和术语。
第四步:翻译
python manage.py makemessages -l de -l fr -l nl -l es -l ja
python manage.py translate
python manage.py compilemessages
三条命令。就这样。TranslateBot 会找到你所有 .po 文件中的所有未翻译字符串,批量翻译它们,然后写回结果。默认情况下只翻译空条目,因此在添加新字符串后再次运行该命令只会翻译新的内容。
实际操作中的样子
以下是一个独立开发者支持五种语言的真实迭代工作流:
周一:你开发了一个新功能。开发过程中你使用 gettext() 和 {% trans %} 添加了一些新的可翻译字符串。
from django.utils.translation import gettext_lazy as _
class InvoiceView(View):
def post(self, request):
# New string added during development
messages.success(request, _("Invoice sent successfully."))
提交之前:你运行三条命令:
python manage.py makemessages -a --no-obsolete
python manage.py translate
python manage.py compilemessages
translate 命令会检测到新的未翻译条目,并只翻译这些条目。如果你添加了 5 个新字符串并支持 5 种语言,它会在一次 API 调用中完成 25 个翻译。整个过程不到一分钟。
你提交代码、模板和更新后的 .po/.mo 文件。翻译是你正常开发流程的一部分,而不是一个单独的项目。
提交前预览
如果你想在翻译写入磁盘之前先查看它们,使用 dry-run 模式:
python manage.py translate --dry-run
这会将每个翻译打印到终端,而不修改任何文件。
成本对比
这就是自动化让人无法反驳的地方。
| 方案 | 500 个字符串,5 种语言 | 时间 | 持续成本 |
|---|---|---|---|
| 手动复制粘贴 | 免费 | ~40 小时 | ~8 小时/迭代 |
| 专业翻译人员 | ~$3,000 | 1-2 周 | ~$600/迭代 |
| Fiverr 翻译者 | ~$100-250 | 3-7 天 | ~$50/迭代 |
| Crowdin/Transifex | $30-150/月 | 配置:数小时 | 持续 |
| TranslateBot + GPT-4o-mini | ~$0.05 | ~2 分钟 | ~$0.01/迭代 |
| TranslateBot + DeepL Free | $0 | ~2 分钟 | $0 |
一个中小型 Django 应用大约有 500 个可翻译字符串,使用 gpt-4o-mini 每种语言的费用通常不到 $0.01。对于大多数独立项目来说,DeepL 免费版(每月 500,000 字符)可以零成本覆盖所有需求。
需要说明的是:AI 翻译并不完美。低成本的人工翻译也不完美。区别在于 AI 翻译几乎零成本、即时交付,而且可以随时重新运行。
CI 集成:永远不要发布未翻译的字符串
作为独立开发者,我发现最有用的模式之一是在 CI 中添加翻译检查。TranslateBot 包含一个 check_translations 命令,如果任何 .po 文件有未翻译或模糊的条目,它会失败:
# .github/workflows/ci.yml
jobs:
translations:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v4
with:
enable-cache: true
- run: uv python install
- run: uv sync --frozen
- name: Install gettext
run: sudo apt-get update && sudo apt-get install -y --no-install-recommends gettext
- name: Check translations
run: uv run python manage.py check_translations --makemessages
如果你在模板中添加了新的 {% trans %} 标签却忘记运行 translate,CI 会发现:
locale/de/LC_MESSAGES/django.po: 1 untranslated, 0 fuzzy
locale/fr/LC_MESSAGES/django.po: 1 untranslated, 0 fuzzy
CommandError: Translation check failed
这让翻译从你需要记住去做的事情变成了你不可能忘记的事情。
实用建议
从两三种语言开始。你不需要在第一天就推出 15 种语言。选择你用户最多或最大可触达市场的语言。德语、法语和西班牙语可以覆盖欧洲市场的很大一部分。
让母语者审核关键字符串。AI 翻译对大多数界面文本来说已经足够好,但你的着陆页标题和引导流程值得人工审核。请一位朋友、用户或社区论坛中的人花 10 分钟审核最显眼的字符串。
覆盖前使用 dry-run。如果你需要重新翻译所有内容(例如,在更新 TRANSLATING.md 中的术语指南之后),先预览变更:
python manage.py translate --overwrite --dry-run
将 TRANSLATING.md 纳入版本控制。它是你项目翻译配置的一部分。当你更新术语或语气指南时,下一次 translate 运行会将这些变更反映到所有新字符串中。
需要时按应用翻译。如果你只更改了一个应用中的字符串,可以限定翻译范围:
python manage.py translate --app billing
从数周到数分钟
Django 的国际化框架是所有 Web 框架中最好的之一。makemessages、locale 目录和 compilemessages 的工具链成熟而可靠。唯一缺失的部分就是翻译步骤本身。这曾经是昂贵且缓慢的环节。
使用 TranslateBot,工作流变成了:
- 像往常一样使用
gettext()和{% trans %}编写代码 - 运行
makemessages提取字符串 - 运行
translate填写翻译 - 运行
compilemessages编译 - 一起提交所有内容
对于独立开发者来说,这意味着本地化不再是你计划"以后再做"的项目。它是你今天就能做的事情,只需要泡一杯咖啡的时间。
TranslateBot 是开源的,可在 PyPI 和 GitHub 上获取。安装它,运行命令,几分钟内就能看到你的应用以新的语言呈现。