结论:用googletrans或deep-translator批量翻译JSON可行,但必须加人工校验;同步前须做键值一致性检查,否则会上线丢键或覆盖错语言。

直接说结论:用 googletrans 或 deep-translator 做批量翻译可行,但必须加人工校验环节;同步到项目前务必做键值一致性检查,否则上线后会丢键或覆盖错语言。
为什么不能直接用 translate() 批量处理 JSON 文件
常见错误是读取整个 en.json 后对每个 value 调用 translator.translate(),结果要么触发频率限制(429 Too Many Requests),要么把嵌套结构(如 {"title": {"label": "Home"}})当成字符串整体翻,破坏层级。
- 只翻译叶子节点的字符串值,跳过对象、数组、空值和已存在的目标语言键
- 加
time.sleep(0.2)降低请求密度,googletrans官方客户端已停更,推荐改用deep-translator的GoogleTranslator实例 - 设置
source='en'和target='zh'显式声明语言,避免自动检测出错(比如把 “Yes” 误判为法语)
如何安全地把翻译结果写回项目资源目录
同步不是“覆盖”,而是“合并”:保留原文件中已有 target 语言的键(比如开发已手动补的 "error.network"),只补充缺失键,且不删除任何键。
- 用
json.load()分别读取源语言(en.json)和目标语言(zh.json)文件 - 遍历源文件所有键路径(建议用递归函数提取
["user", "login", "button"]这类路径),检查目标文件对应路径是否存在且非空;不存在才写入翻译值 - 写入前用
json.dumps(..., ensure_ascii=False, indent=2)格式化,避免 git diff 出现无意义的换行/缩进变更
哪些键绝对不能自动翻译
硬编码在代码里的占位符、带变量插值的模板、技术术语(如 "HTTP 404"、"JWT token")、大小写敏感字段名(如 "iOS" 翻成中文会丢掉品牌标识)——这些一旦被自动替换,轻则 UI 错乱,重则功能异常。
立即学习“Python免费学习笔记(深入)”;
- 预定义黑名单列表:
["%s", "{id}", "API_KEY", "JWT", "iOS", "Android"],匹配 value 中是否包含任意一项 - 正则过滤插值语法:
re.search(r'\{[a-zA-Z_]+\}|\$[a-zA-Z_]+', value),命中即跳过 - 对 key 名也做判断:
key.endswith('_title') or 'url' in key这类通常需保留原文
最麻烦的其实是上下文缺失——同一个英文单词在不同页面里含义不同(比如 “run” 在 CI 页面是“执行流水线”,在设备页是“启动设备”),机器翻译无法区分。所以脚本只能解决 70% 的静态文案,剩下必须靠带上下文的术语表 + 人工过一遍。


















