许多企业在部署 Odoo 时需要同时服务不同语言的用户:本地销售团队、跨国仓库、在线多语客户。要在同一条记录上展示多语言文本,就需要一种机制来为同一字段保存多种语言的值——这正是可翻译字段的用途。
可翻译字段的核心在于“一条记录,多套语言值”。同一条产品记录可以为不同语言保存不同的名称或描述:法语用户看到法语名称,德语用户看到德语名称,数据库里只有一条产品记录,但呈现因用户语言不同而不同。
本指南围绕 Odoo ORM 的可翻译字段展开,讲清它们的原理、如何创建与管理,以及在实际业务里能带来哪些切实好处。
什么是 Odoo 中的可翻译字段
从概念上讲,可翻译字段就是数据模型中用于存放“人可读文本”的字段,它能为每个已启用的语言保存独立的值。对最终用户来说,这种处理是透明的:他们总是看到自己的语言版本,无须额外操作。
哪些字段类型支持翻译:
- Char:短文本单行(如产品名、分类标签、职称等)
- Text:长文本多行(如产品描述、备注)
- Html:富文本带 HTML(如网站内容、邮件模板正文)
数值、日期、Many2one(关系字段)和布尔值等字段不适合翻译。翻译仅适用于承载自然语言文本的字段。
界面上的呈现方式
在编辑模式下,可翻译字段旁会出现一个小的语言图标或标记,点击后弹出对话框可查看并维护该字段在各语言下的值;经授权的用户可在此处一次管理多语言文本。
在只读模式下,用户直接看到的是其语言的文本;若该语言尚未填写翻译,系统会回退显示基础语言(通常是英语)的值,而不是显示空白。
可翻译字段的工作原理
理解内部实现细节能帮助你在何时使用翻译、如何在规模化环境下维护翻译做出更明智的决策。
字段上的 translate=True 参数
在 Odoo ORM 中,通过在字段定义里添加 translate=True 来启用翻译。示例(自定义短文本字段)如下:
(示例展示如何在模型中定义一个带 translate=True 的 Char 字段)
仅需这个开关,Odoo 就会根据当前语言上下文存取相应的值。这也是 Odoo 框架中非常优雅实用的功能之一。
翻译数据的存储位置
不同 Odoo 版本的存储方式有所演进:
- Odoo 15 及更早版本:翻译保存在独立的 ir.translation 表中,表内每一行对应某个模型/字段/记录/语言的翻译值。
- Odoo 16 及以后版本:翻译直接存放在模型对应的表里,作为 JSONB 列。例如 name 字段的翻译可能以 {"en_US": "Laptop Stand", "fr_FR": "Support pour ordinateur portable", "de_DE": "Laptopständer"} 的形式存在。
将存储迁移到 JSONB 后,避免了频繁联表查询,检索速度与扩展性都有明显提升,尤其是记录量大的模型。
语言上下文如何起作用
读取可翻译字段时,Odoo 会参照当前上下文中的活动语言(context.lang)。登录为法语用户时,ORM 会自动返回法语值。通过 API 调用时,可以在上下文里指定 lang 来控制取回的语言:
(示例展示如何在 API 调用的 context 中传入 lang='fr_FR' 以获取法语值)
这点在集成或导出脚本中尤其重要:务必在上下文中传入目标语言以获取正确的翻译文本。
translate 参数也可使用可调用对象
translate 参数还能接收可调用对象(callable),常见用法是在定义 selection 等静态标签时使用 translate=_ 来将这些字符串标记为模块级可翻译项,这与记录级字段翻译不同,主要用于模块开发时将字符串导出到翻译流程中。
回退(fallback)机制
若活动语言没有对应翻译,Odoo 会回退到数据库的基础语言(通常是英语)显示内容,而不是返回空值。这一机制在翻译未完全覆盖的场景下能保证用户始终看到有意义的信息。
适用的业务场景
可翻译字段不仅是技术特性,它解决了企业多语场景下的实际问题。下面列出五类典型应用场景。
1. 电商:多语言的商品名称和描述
在 Odoo 网站或网店里销售时,买家希望看到本地化的商品名称与描述。product.template 的 name 与 description 字段默认可翻译,这让你能用一套产品目录服务多语市场,避免复制记录却呈现本地化文本和卖点。
访客在法语站点会看到法语的名称与描述,但库存、价格、规则等保持同一条记录与同一套业务逻辑,仅展示的文本随语言变化。
2. 多语言邮件模板
Odoo 的邮件模板正文通常是可翻译的 Html 字段。比如给德语客户发订单确认时,系统会自动使用德文模板(若已填写),因为模板正文标记了 translate=True。
这使企业可以用一套模板支持多个市场,而无需为每种语言写条件逻辑或维护多个模板记录。
3. 网站页面与博客内容
Odoo 网站页面的内容字段支持翻译。启用多语言后,编辑可以为同一页面维护不同语言的内容版本,实现原生多语网站,无需借助第三方插件。
从 SEO 角度来看,各语种页面可分别设置 meta 标题与描述,有助于在本地搜索结果中获得更好排名。
4. 下拉选项与多国团队协作
在 Python 中定义 Selection 字段时,可用 _ 函数标记选项标签为可翻译。这样同一个下拉在不同语言下会显示相应的本地化标签,例如“进行中/暂停/已完成”的翻译会自动呈现给不同语言用户。
这对人力资源、项目管理等跨地区协作场景尤为重要,使团队在各自语言环境下操作相同记录时体验一致。
5. 报表与自定义字段的多语化
如果你通过自定义或 Studio 新增了用于分类的字段(服务类别、风险等级、产品分段等),把这些字段设为可翻译能确保报表与仪表盘在不同语言下正确显示,避免内容混杂不同语言。
若这些字段不翻译,法语用户在报表里可能看到英文标签,造成困惑并降低系统采纳率。
如何创建或启用可翻译字段
在 Odoo 中启用或创建可翻译字段的方法取决于你是使用无代码工具还是直接写 Python。下面列出常见做法。
使用 Python(推荐给开发者)
最推荐且最干净的方式是在模型定义里为字段添加 translate=True,这是 Odoo 官方和技术文档中标准的做法:
(示例展示在 product.template 上新增一个 translate=True 的 Char 与一个 Html 字段)
加上 translate=True 后,Odoo 会自动处理 UI 中的语言标志、翻译存储以及回退逻辑,你不需要再手动处理这些细节。
使用 Odoo Studio 创建的字段
Odoo Studio 在字段配置面板中默认不暴露 translate 选项:你在 Studio 创建的 Char 或 Text 字段默认不可翻译。
不过,创建后可以通过 API 修改 ir.model.fields 记录来开启 translate 属性。方法是先找到该字段的记录 ID,然后写入 translate=True:
(示例展示如何通过 XML-RPC 查找 ir.model.fields 并将 translate 置为 True)
这种方式适合没有源码访问权限、通过脚本或笔记本进行定制的团队。
管理翻译:导出与导入流程
启用可翻译字段后,Odoo 提供了标准的翻译导出/导入工作流:
- 进入 设置 > 翻译 > 导出翻译,可下载指定语言的 .po 或 .csv 文件,文件包含待翻译或需校对的字符串。
- 在文件中完成翻译或交给翻译人员处理。
- 回到 设置 > 翻译 > 导入翻译,将翻译好的文件上传回系统。
针对记录级别的文本(例如单条产品名称),也可以在界面中通过字段旁的语言图标直接编辑,适合小批量内容的快速修改。
通过 API 进行翻译写入
通过 XML-RPC/JSON-RPC 更新可翻译字段时,应在上下文中传入目标语言:
(示例展示如何在写入时通过 context={'lang':'fr_FR'} 提交法语翻译)
用上下文指定语言写入时,只会更新该语言的文本,其他语言不受影响。这是从外部系统向 Odoo 推送翻译内容的推荐方式。
最佳实践建议
正确使用可翻译字段很直观,但遵循以下习惯能避免大量问题与返工。
先确保基础语言的值完整准确
在为其他语言添加翻译前,先把基础语言(base language)的文本写好并确认。其他语言的翻译通常基于该基础值衍生。如果后续修改了基础文本,其他语言不会自动更新,会造成版本不同步,需要额外的对照和更新流程。
只给真正需要翻译的字段加 translate=True
并非所有文本字段都需要翻译。内部编码、技术标识、以及只供单语后台使用的字段无需翻译。过多地开启翻译会增加维护成本和翻译工作量。
大量翻译工作使用导出/导入流程更高效
对于数百或数千件商品的大型目录,逐条在界面编辑不现实。应导出需要翻译的字符串,批量翻译后统一导入,效率更高且出错率更低。
所有 API 操作都明确传入语言上下文
通过 API 读写可翻译字段时务必显式传入 {'lang':'xx_XX'}。否则会使用默认用户语言,可能把文本写入错误的语言槽位,导致难以发现的数据污染问题。
源文本更新时要维护好翻译同步流程
当基础语言文本更新后,其他语言并不会自动随之更新。建议将此纳入内容审核与变更流程,通知翻译人员或触发更新任务,保证各语种的一致性。
常见错误与陷阱
以下是经常会让团队出问题的常见误区,提前注意可以节省很多调试时间。
忘记在 API 写入时指定语言上下文
这是最常见的集成错误:如果通过 API 写入产品名却没有指定 lang,系统会把值写到执行该操作的用户语言槽位上。举例:你本来想写入法语,但执行者的默认语言是英语,结果覆盖了英语值。务必在写入时显式指定目标语言。
误以为翻译字段在搜索时会自动匹配所有语言
在翻译字段上做搜索时,Odoo 默认只在当前活动语言下匹配。若某商品在英语下名为“Laptop Stand”,但法语翻译尚未填写,当用户处于法语环境搜索时,该商品不会被检索到。确保关键字段在目标语言有翻译,或调整搜索逻辑。
在报表中混用可翻译与不可翻译字段导致输出不一致
如果自定义报表同时包含已翻译和未翻译字段,导出的内容在不同用户语言下会出现混杂:有些标签是本地化的,有些始终显示基础语言。设计报表时提前决定哪些字段需要翻译并统一处理。
未考虑到计算字段的翻译开销
若计算字段由多个可翻译字段拼接而成,计算会在当前活动语言下运行,且结果通常不会按语言分别存储。若你需要在多语言下保存不同语言版本的计算结果,需要显式在代码里按语言进行计算与存储。
移除语言却不清理其翻译数据
当你在 Odoo 中停用或删除某种语言时,历史翻译数据可能仍留在数据库中(视版本而定)。这通常不会影响功能,但会增加数据冗余。停用语言后建议检查并清理不再需要的翻译记录。
总结
可翻译字段是 Odoo 中对跨语言企业非常实用的功能。只需在字段上设置 translate=True,就能在不复制记录的前提下为产品目录、邮件模板、网站页面与自定义字段维持本地化内容。
关键在于有选择性地使用翻译:把它用于能显著改善用户或客户体验的字段,规模化维护时采用导出/导入流程,并在 API 集成中始终明确语言上下文。
无论你是在搭建多语言电商、部署跨国团队的 Odoo,还是开发自定义模块,理解可翻译字段都会让你的解决方案更整洁、用户体验更友好。
正在为多语 Odoo 实施做配置或翻译流程方面的规划,需要专业建议吗? 请联系 Dasolo 团队获取支持。 我们很乐意帮助你正确实施多语言配置并优化翻译工作流。