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

Django i18n无法在字典中使用翻译文本问题求助

问题原因

你遇到的问题核心在于翻译执行的时机:

  • 直接在视图的get方法里调用_()时,是在请求处理阶段执行的,此时Django已经根据请求激活了对应的语言环境,翻译能正常生效。
  • 但把_()放在模块级别的字典里时,这段代码会在程序启动时就执行完毕,此时请求还未进入,语言环境是默认状态,翻译结果会固定为默认语言的文本,后续请求切换语言也不会重新触发翻译。
解决方案

有两种常用解决方式,可根据场景选择:

方式1:使用延迟翻译(gettext_lazy)

用django.utils.translation.gettext_lazy替代普通的_(),它会把翻译操作延迟到文本实际被使用(比如序列化返回给客户端)的时候,此时语言环境已经正确激活:

from django.utils.translation import gettext_lazy as _
from rest_framework.views import APIView
from rest_framework.response import Response

msg = {
   123: _("My error msg")
}

class TestAPIView(APIView):
    def get(self, request):
        return Response({'msg': msg[123]})

方式2:将字典改为动态函数

把字典的定义放到函数里,每次请求时才调用函数生成字典,确保翻译是在当前请求的语言环境下执行:

from django.utils.translation import _
from rest_framework.views import APIView
from rest_framework.response import Response

def get_error_messages():
    return {
        123: _("My error msg")
    }

class TestAPIView(APIView):
    def get(self, request):
        return Response({'msg': get_error_messages()[123]})

gettext_lazy更适合静态消息字典,函数方式则适合需要根据上下文动态生成消息的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:52:34