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

Django中JavaScriptCatalog的request.LANGUAGE_CODE与页面显示语言不符问题

解决jsi18n视图因浏览器语言偏好返回空数组的问题

最近我在做JS端字符串翻译功能时,也碰到过完全一样的情况——Chrome首选语言设为简体中文时,jsi18n视图返回的翻译目录完全正常;但切换成英语后,返回的数组直接是空的。后来反复测试验证,确实是request.LANGUAGE_CODE变量在背后影响着结果,下面分享我的排查和解决思路:

问题根源拆解

  • jsi18n视图是依赖Django国际化机制工作的,它会根据request.LANGUAGE_CODE的值去加载对应语言的翻译文件(.po/.mo格式)。
  • 当浏览器切换到英语时,如果你的项目没有生成英语对应的翻译文件,或者request.LANGUAGE_CODE没能正确匹配到已有的翻译资源,视图自然会返回空的目录数组。
  • 另外还要注意:如果你的Django项目没把英语配置为支持的语言,也会出现这个问题。

分步排查与解决

  1. 检查项目国际化基础配置
    打开settings.py,确认以下配置是否正确:

    # 开启国际化
    USE_I18N = True
    # 默认语言
    LANGUAGE_CODE = 'zh-hans'
    # 支持的语言列表,必须包含英语
    LANGUAGES = [
        ('zh-hans', '简体中文'),
        ('en', 'English'),
    ]
    # 翻译文件存放路径,确保指向正确目录
    LOCALE_PATHS = [
        os.path.join(BASE_DIR, 'locale'),
    ]
    
  2. 确认英语翻译文件是否存在并生效

    • 进入locale目录,检查是否有en文件夹,且里面的LC_MESSAGES目录下存在django.po和django.mo文件。如果没有,执行以下命令生成:
      # 生成英语翻译模板
      python manage.py makemessages -l en
      # 编译翻译文件为可识别的二进制格式
      python manage.py compilemessages
      
    • 还要注意:jsi18n只会加载标记为javascript领域的翻译内容,所以你的django.po里要确保有对应标记,比如:
      msgctxt "javascript"
      msgid "welcome_msg"
      msgstr "Welcome!"
      
  3. 统一语言代码匹配逻辑
    浏览器发送的Accept-Language头可能带地区后缀(比如en-US),而你的项目用的是en,这会导致request.LANGUAGE_CODE匹配不到对应语言包。可以自定义中间件处理:

    # 自定义语言处理中间件
    class LanguageNormalizeMiddleware:
        def __init__(self, get_response):
            self.get_response = get_response
    
        def __call__(self, request):
            # 提取浏览器首选语言
            raw_lang = request.META.get('HTTP_ACCEPT_LANGUAGE', '').split(',')[0]
            # 将带地区的英语代码统一映射为en
            if raw_lang.lower().startswith('en'):
                request.LANGUAGE_CODE = 'en'
            # 其他语言同理处理
            response = self.get_response(request)
            return response
    

    记得把这个中间件添加到settings.py的MIDDLEWARE列表里。

  4. 直接测试jsi18n视图返回
    在浏览器地址栏直接访问/jsi18n/,切换不同的浏览器语言偏好,查看返回的JSON内容。如果还是空数组,检查翻译文件是否正确编译,或者是否包含JS领域的翻译字符串。

总结

这个问题本质就是Django国际化配置、翻译文件与request.LANGUAGE_CODE的匹配问题。只要确保支持的语言已配置、对应翻译文件存在且正确编译、语言代码能正确映射,就能解决jsi18n视图返回空数组的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:19:16