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

多语言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,可以通过自定义中间件覆盖默认的语言探测逻辑:
  1. 在你的项目根目录新建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
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:15:05