先说结论
很多 Odoo 多语言问题,看起来像:
- 翻译没了
- 字段怎么忽然变回原文
- 这页有翻译,那页又没有
但更常见的真实原因不是“系统丢翻译”,而是:
当前读取时到底处在哪个语言上下文里,以及这个字段本身是不是按可翻译字段在处理。
所以多语言问题很多时候不是内容有没有,而是读取语义有没有对上。
为什么这类问题特别容易误判
因为用户看到的结果非常直观:
- 我明明翻过了,怎么现在又像没翻?
这会让人自然怀疑:
- 数据没保存
- 翻译丢失
- 缓存出问题
但现实中,更高频的情况是:
- 当前语言上下文不是你以为的那个
- 或者这个字段根本不是以 translatable 字段方式在读
所以“像没翻译”并不一定等于“翻译真的没了”。
translatable 字段真正重要的地方是什么
它最关键的不是“看起来能翻”,而是:
系统会把这个字段当成“可按语言读取不同内容”的字段来解释。
这意味着同一字段在不同语言上下文下,读出来的结果可能不同。
所以它关注的不是静态文本,而是语言维度下的字段表现。
为什么语言上下文这么关键
因为系统在读值时,必须先知道:
- 现在到底按什么语言来读
如果这个前提没对,后面你看到的任何内容都可能和预期不一致。
这也是为什么同一个对象有时会出现:
- A 页面显示翻译
- B 页面却像没翻译
根因不一定在内容,而可能在于两处的语言上下文不同。
为什么“回退逻辑”会让人误以为翻译坏了
因为当目标语言内容不存在,系统往往不会直接给你一个报错空白,而会:
- 回退到原始值 / 默认值
这从体验角度很合理, 但从排查角度就会制造一种错觉:
- 好像翻译系统有时生效、有时又失效
其实它可能一直都很一致,只是你遇到的是:
- 有翻译时显示翻译
- 没翻译时优雅回退
实战里最容易踩的 5 个坑
1. 把“显示原文”直接等同于“翻译丢了”
判断会偏。
2. 忽略当前语言上下文
这是最高频根因之一。
3. 把普通字段当成可翻译字段脑补
会误读机制。
4. 看到不同页面显示不同,就直接怪缓存
很多时候其实是读取语义不同。
5. 不区分“没有翻译”和“回退显示默认值”
会把正常行为当 bug。
一句话记忆法
把它记成一句话:
多语言字段问题很多时候不是“翻译没了”,而是“当前语言上下文和字段翻译语义没对上”;显示原文也可能只是正常回退。
理解这一句,多语言排查会顺很多。
DISCUSSION
评论区