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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:59:55