Django中JavaScriptCatalog的request.LANGUAGE_CODE与页面显示语言不符问题
解决jsi18n视图因浏览器语言偏好返回空数组的问题
最近我在做JS端字符串翻译功能时,也碰到过完全一样的情况——Chrome首选语言设为简体中文时,jsi18n视图返回的翻译目录完全正常;但切换成英语后,返回的数组直接是空的。后来反复测试验证,确实是request.LANGUAGE_CODE变量在背后影响着结果,下面分享我的排查和解决思路:
问题根源拆解
jsi18n视图是依赖Django国际化机制工作的,它会根据request.LANGUAGE_CODE的值去加载对应语言的翻译文件(.po/.mo格式)。- 当浏览器切换到英语时,如果你的项目没有生成英语对应的翻译文件,或者
request.LANGUAGE_CODE没能正确匹配到已有的翻译资源,视图自然会返回空的目录数组。 - 另外还要注意:如果你的Django项目没把英语配置为支持的语言,也会出现这个问题。
分步排查与解决
检查项目国际化基础配置
打开settings.py,确认以下配置是否正确:# 开启国际化 USE_I18N = True # 默认语言 LANGUAGE_CODE = 'zh-hans' # 支持的语言列表,必须包含英语 LANGUAGES = [ ('zh-hans', '简体中文'), ('en', 'English'), ] # 翻译文件存放路径,确保指向正确目录 LOCALE_PATHS = [ os.path.join(BASE_DIR, 'locale'), ]确认英语翻译文件是否存在并生效
- 进入
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!"
- 进入
统一语言代码匹配逻辑
浏览器发送的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列表里。直接测试jsi18n视图返回
在浏览器地址栏直接访问/jsi18n/,切换不同的浏览器语言偏好,查看返回的JSON内容。如果还是空数组,检查翻译文件是否正确编译,或者是否包含JS领域的翻译字符串。
总结
这个问题本质就是Django国际化配置、翻译文件与request.LANGUAGE_CODE的匹配问题。只要确保支持的语言已配置、对应翻译文件存在且正确编译、语言代码能正确映射,就能解决jsi18n视图返回空数组的问题。
内容的提问来源于stack exchange,提问作者user7346216
相关产品推荐
相关产品推荐

