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

Django中基于用户偏好的动态gettext翻译不生效问题求助

Django中基于用户偏好的动态gettext翻译不生效问题求助

我正在开发一个支持多语言的Django应用,使用基于令牌的认证,尝试根据用户资料中存储的偏好为已认证用户切换语言。但在翻译应用方面遇到了一些问题,尤其是动态消息翻译。

我的现有配置

  • 已在settings.py中设置了多种语言(LANGUAGES),默认语言为英语(LANGUAGE_CODE = 'en')。
  • 使用rest_framework.authtoken进行令牌认证,用户的偏好语言存储在数据库的preferred_language字段中。
  • 添加了自定义中间件来处理基于用户偏好的语言切换,希望在用户认证并设置会话后立即生效。

遇到的问题

语言偏好似乎对静态内容(如模板)生效,但视图中使用gettext的动态翻译字符串没有正确应用用户偏好的语言。

例如,虽然语言切换部分生效(如UI内容),但使用gettext()生成的消息(如错误或成功提示)仍然显示默认语言(英语),而不是用户偏好的语言(例如西班牙语es)。

我的观察

  • 在视图中使用get_language()检查当前激活的语言时,它正确反映了会话中的偏好语言。
  • 已确认会话和Cookie(cookie_language_tinocoloco)中都正确设置了偏好语言。
  • LocaleMiddleware已配置为激活语言,但它没有应用到动态消息上。

我尝试过的方法

  • 确保中间件顺序正确:SessionMiddleware在LocaleMiddleware之前,LocaleMiddleware在AuthenticationMiddleware之前,这与推荐的设置一致。
  • 在中间件中手动使用translation.activate(user.preferred_language)激活语言。

我的配置代码

中间件配置(相关片段)

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",  # 确保会话在语言设置前初始化
    "django.middleware.locale.LocaleMiddleware",  # 语言激活中间件
    "django.contrib.auth.middleware.AuthenticationMiddleware",  # 令牌认证中间件
    # 其他中间件
]

自定义语言中间件

from django.utils import translation

def get_user_language(user):
    if user and hasattr(user, 'preferred_language') and user.preferred_language:
        return user.preferred_language
    return None

class LanguageMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if hasattr(request, 'user') and request.user.is_authenticated:
            language = get_user_language(request.user)
            if language:
                translation.activate(language)  # 激活用户偏好语言
        response = self.get_response(request)
        return response

会话Cookie说明

我也确保了语言偏好存储在会话和Cookie中。

预期行为

我期望动态翻译(使用gettext()和gettext_lazy())能根据用户的偏好语言变化。然而,尽管设置了正确的语言偏好,网站只有部分内容(如模板)反映了新语言,而其他内容(如动态生成的消息)仍然显示默认语言(英语)。

提问

我的设置中是否缺少某些部分,才能让动态翻译字符串尊重已认证用户的偏好语言?
如何确保翻译全局生效,包括动态消息,在用户的语言设置到会话和Cookie之后?
任何指导或建议都将不胜感激。谢谢!

备注:内容来源于stack exchange,提问作者Bryan Menoscal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:19:31