You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中Marshmallow验证错误消息无法翻译问题排查

解决Django中Marshmallow字段验证错误消息无法翻译的问题

你的问题核心确实是执行顺序错误:在字段定义时,你先对带占位符的原消息做了格式化,再传给翻译函数,导致翻译系统找不到对应的msgid。

问题根源

原代码中,translation.ugettext(INVALID_RANGE_DURATION).format("0", "9999.99")的执行逻辑是:

  1. 先调用INVALID_RANGE_DURATION.format("0", "9999.99"),把占位符替换成具体数值,得到类似"Value must be between 0 and 9999.99"的字符串
  2. 再将这个已替换的字符串传给ugettext找翻译

但你的.po文件中,msgid是带占位符的原始字符串"Value must be between {} and {}",翻译系统找不到已替换后的字符串对应的翻译项,自然返回原英文内容。

而pre_load/post_load中能正常翻译,是因为你在这些函数里是先翻译原始带占位符的字符串,再做格式化,和.po文件的msgid完全匹配。

修复方案

调整顺序,先翻译原始带占位符的字符串,再进行格式化;同时推荐使用Django的ugettext_lazy,避免模块加载时过早执行翻译(此时语言环境可能未正确激活)。

修改后的代码示例:

from django.utils.translation import ugettext_lazy as _

# 假设INVALID_RANGE_DURATION是定义好的常量:"Value must be between {} and {}"
gross_weight = fields.Decimal(
    required=True,
    validate=validate.Range(
        min=0,
        max=9999.99,
        error=_INVALID_RANGE_DURATION.format("0", "9999.99")
    )
)

或者直接写原始字符串:

from django.utils.translation import ugettext_lazy as _

gross_weight = fields.Decimal(
    required=True,
    validate=validate.Range(
        min=0,
        max=9999.99,
        error=_("Value must be between {} and {}").format("0", "9999.99")
    )
)

修正.po文件内容

你提供的.po文件msgstr是印地语,若要翻译成中文,需修改为:

msgid "Value must be between {} and {}"
msgstr "值必须在 {} 和 {} 之间"

内容的提问来源于stack exchange,提问作者Digvijay Nikam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 16:25:08