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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:12:58