Django中Marshmallow验证错误消息无法翻译问题排查
解决Django中Marshmallow字段验证错误消息无法翻译的问题
你的问题核心确实是执行顺序错误:在字段定义时,你先对带占位符的原消息做了格式化,再传给翻译函数,导致翻译系统找不到对应的msgid。
问题根源
原代码中,translation.ugettext(INVALID_RANGE_DURATION).format("0", "9999.99")的执行逻辑是:
- 先调用
INVALID_RANGE_DURATION.format("0", "9999.99"),把占位符替换成具体数值,得到类似"Value must be between 0 and 9999.99"的字符串 - 再将这个已替换的字符串传给
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
相关产品推荐
相关产品推荐

