多语言Django项目如何设置默认语言?配置fa为默认仍为en如何解决
问题根因
Django默认的语言探测优先级为:用户手动设置的语言(存在session/cookie中)> 请求头Accept-Language携带的浏览器默认语言 > settings.py中配置的LANGUAGE_CODE。绝大多数用户浏览器的默认Accept-Language中英语优先级更高,因此会出现你已经配置了默认语言为fa,首次访问还是显示英语的问题。
解决方案
你可以根据自己的项目版本和需求选择对应方案:
- 方案1:关闭浏览器语言自动探测(Django 3.2及以上版本适用,最简单)
直接在settings.py中新增如下配置即可,配置后Django不会再优先读取浏览器的语言请求头,找不到用户自定义语言时直接使用你设置的LANGUAGE_CODE作为默认值:
LOCALE_MIDDLEWARE_USE_ACCEPT_LANGUAGE = False
- 方案2:自定义中间件强制默认语言(全版本适用)
如果你的Django版本低于3.2,可以通过自定义中间件覆盖默认的语言探测逻辑:
- 在你的项目根目录新建
middleware.py,写入如下代码:
from django.utils import translation from django.conf import settings class ForceDefaultLanguageMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 仅当用户没有手动设置过语言时,强制使用配置的默认语言 if not request.COOKIES.get('django_language') and not request.session.get('django_language'): translation.activate(settings.LANGUAGE_CODE) request.LANGUAGE_CODE = settings.LANGUAGE_CODE response = self.get_response(request) translation.deactivate() return response
- 在
settings.py的MIDDLEWARE列表中,把上述中间件放在LocaleMiddleware之前:
MIDDLEWARE = [ # ... 其他原有中间件(如SessionMiddleware、CommonMiddleware等) '你的项目名称.middleware.ForceDefaultLanguageMiddleware', 'django.middleware.locale.LocaleMiddleware', # ... 其他剩余中间件 ]
- 特殊场景补充:如果你使用了带语言前缀的路由(
i18n_patterns)
需要额外在settings.py中添加如下配置,避免根路径默认重定向到/en/前缀:
PREFIX_DEFAULT_LANGUAGE = False
验证方式
配置完成后重启Django服务,使用无痕模式访问站点(排除之前的语言cookie、session缓存影响),即可看到默认语言已切换为fa。
内容的提问来源于stack exchange,提问作者Mehran Bahrami
相关产品推荐
相关产品推荐

