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

Django初始化加载的变量无法随语言切换翻译的问题

问题解决方法

问题的核心在于:模块级的ugettext_lazy对象虽然是懒加载设计,但如果在代码中没有确保每次使用时都触发动态翻译逻辑,就会固定为应用初始化时的默认语言。以下是几种可行的解决方式:


方法1:在使用时直接调用翻译函数

不要把翻译文本定义为模块级常量,而是在需要渲染的方法内部直接调用翻译函数,确保每次渲染时都根据当前请求的语言环境重新翻译:

# widgets.py
from django.forms import widgets
from django.translation import ugettext_lazy as _

class MyWidget(widgets.TextInput):
    def render(self, name, value, attrs=None, renderer=None):
        value = _('some text')  # 每次渲染时动态获取翻译
        # ... 其他渲染逻辑 ...
        return super().render(name, value, attrs, renderer)

方法2:将常量定义为可调用对象

如果需要复用该文本,可以把它封装成函数或lambda,确保每次调用时都返回最新的翻译结果:

# widgets.py
from django.forms import widgets
from django.translation import ugettext_lazy as _

def get_default_text():
    return _('some text')

class MyWidget(widgets.TextInput):
    def render(self, name, value, attrs=None, renderer=None):
        value = get_default_text()
        # ... 其他渲染逻辑 ...
        return super().render(name, value, attrs, renderer)

方法3:避免提前求值懒对象

如果坚持使用模块级常量,需要检查代码中是否有提前将DEFAULT_TEXT转换为字符串的操作(比如在... other rendering things ...部分),这种转换会触发懒对象的求值,导致语言固定为初始化时的版本。确保传递给父类render方法的是未被转换的懒对象。


额外配置检查

同时请确认你的Django项目翻译配置正确:

  • 已启用django.middleware.locale.LocaleMiddleware,且它的位置在SessionMiddleware和CommonMiddleware之后
  • 正确配置了LANGUAGES、LOCALE_PATHS等翻译相关设置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:22:36