Django i18n中get_language_info_list返回语言code不符问题咨询
问题描述
在Django 4.2.10环境下,使用模板标签时出现以下现象:
- 执行
{% get_current_language as CURRENT_LANGUAGE %}后,{{ CURRENT_LANGUAGE }}输出为nl-nl - 执行
{% get_available_languages as AVAILABLE_LANGUAGES %}后,{{ AVAILABLE_LANGUAGES }}输出为[('nl-NL', 'Nederlands'), ('en', 'Engels')] - 执行
{% get_language_info_list for AVAILABLE_LANGUAGES as LANGUAGES %}后,{{ LANGUAGES }}输出如下:
[ {'bidi': False, 'code': 'nl', 'name': 'Dutch', 'name_local': 'Nederlands', 'name_translated': 'Nederlands'}, {'bidi': False, 'code': 'en', 'name': 'English', 'name_local': 'English', 'name_translated': 'Engels'} ]
项目相关配置:
# 语言代码配置 LANGUAGE_CODE = "nl-NL" # 可用语言列表配置 LANGUAGES = [ ('nl-NL', _('Dutch')), ('en', _('English')), ]
我期望{{ LANGUAGES }}中的code字段值为nl-NL而非nl,请问这种差异产生的原因是什么?
原因解释
这是由于Django的get_language_info_list模板标签在处理语言代码时,会自动执行规范化处理,将带区域后缀的语言代码转换为基础的两位语言代码。
具体逻辑是:get_language_info_list内部会调用django.utils.translation.get_language_info()函数,该函数会解析传入的语言代码:
- 对于
nl-NL这类包含区域标识的代码,Django会自动截断区域部分,仅保留基础语言代码nl - 这是因为Django内部语言系统主要基于ISO 639-1标准的两位语言代码设计,除非你配置了特定的区域变体语言包,否则默认会统一使用基础代码
而get_current_language返回的是当前请求使用的原始语言代码(包含区域),get_available_languages则直接返回settings.LANGUAGES中配置的原始元组,因此这两个标签的输出会保留nl-NL;但get_language_info_list的设计目的是提供标准化的语言信息,所以会对代码做规范化处理。
如果需要让code字段保留nl-NL,你可以绕过get_language_info_list,手动在视图中构建语言信息列表后传递到模板,或者自定义模板标签来实现需求。
内容的提问来源于stack exchange,提问作者sitWolf
相关产品推荐
相关产品推荐

