先说结论
多语言系统最隐蔽的 bug 是"旧译文覆盖新稿"。它不会报错,只会让你的站悄悄传播错误信息。
问题场景
- 周一 10:00 发布产品页(版本 A)
- 周一 14:00 运营发现参数写错,改成版本 B
- 周一 10:05 发出的翻译任务在周二回来,译的是版本 A
- 系统直接写回 → 33 个语种全部是错误参数
解法:版本号 + 状态机
每次保存原文时:
translation_version = 'v1:' + sha1(可译字段拼接)
translation_status = 'pending'
翻译任务携带版本号;回写时比对:
| 情况 | 处理 |
|---|---|
| 版本一致 | 写入,状态改 done |
| 版本不一致 | 丢弃,状态保持 pending,重新排队 |
| 任务失败 | 状态 failed,记录原因,可手动重试 |
人工修改的保护
运营精修过的字段要能"免疫"机翻覆盖。两种做法:
- 字段级标记:
manual_locked = true - 独立覆盖表:人工译文优先于机翻译文
我用第一种,简单直接。
状态机的完整状态
pending → translating → done
↑ ↓
└──── failed ←(重试)
- pending:等待取件
- translating:已被服务中心领取(有超时保护)
- done:已回写
- failed:多次失败,进人工队列
边界情况
- 内容删除:翻译任务一并作废
- 语种关闭:该语种的 pending 任务跳过
- 回滚版本:版本号变化,自动重译
最常见的失败是服务中心超时:任务标记为 translating 后进程挂掉,状态卡死。修法是给 translating 加 30 分钟超时回收,自动回到 pending。另一个坑是重复回写——同一版本被写两次,靠版本号校验挡掉。