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

