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
相关产品推荐
相关产品推荐

