Django中gettext_lazy在列表内字符串拼接/插值失效问题
问题解答
是的,必须把完整的待翻译字符串整体包裹在_()(即gettext_lazy)中,才能让翻译正常生效。
原因分析
gettext_lazy返回的是一个延迟求值的代理对象,而非普通字符串。当你用+、f-string或.format()做字符串拼接时,Python会立即触发代理对象的字符串转换(此时使用的是进程启动时的默认语言环境),导致这部分内容变成静态字符串,无法在DRF序列化时根据请求的语言环境重新翻译。
正确写法
场景1:整句固定可翻译
直接将完整句子作为参数传给_():
from django.utils.translation import gettext_lazy as _ {"item1": { "labels": [ _("label1"), _("this is translatethis label2"), ] }}
场景2:包含动态翻译片段
如果"translatethis"是需要单独翻译的动态内容,用占位符保留完整的句子结构(方便翻译人员调整语序),同时确保外层字符串整体被_()包裹:
from django.utils.translation import gettext_lazy as _ dynamic_text = _("translatethis") {"item1": { "labels": [ _("label1"), # 用%格式化 _("this is %(text)s label2") % {"text": dynamic_text}, # 或者用.format _("this is {text} label2").format(text=dynamic_text), ] }}
这样整个labels中的条目都是延迟求值的代理对象,直到DRF处理请求序列化时,才会根据当前请求的语言环境生成对应的翻译文本。
内容的提问来源于stack exchange,提问作者Milano
相关产品推荐
相关产品推荐

