Django i18n get_language_info_list и get_available_languages предоставляют разный код языка
С {% 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'}]
Настройки:
# https://docs.djangoproject.com/en/dev/ref/settings/#language-code
LANGUAGE_CODE = "nl-NL"
# https://docs.djangoproject.com/en/dev/ref/settings/#languages
LANGUAGES = [
('nl-NL', _('Dutch')),
('en', _('English')),
]
В {{ LANGUAGES }}
я ожидаю, что code
будет nl-NL
, а не nl
. Кто-нибудь может объяснить это несоответствие?
Версия Django:
Django==4.2.10
В django/django/conf/locale
присутствует только nl
. Основываясь на LANG_INFO
(из django.conf.locale import LANG_INFO). Я обнаружил, что это происходит здесь generic_lang_code = lang_code.split("-")[0]
:
def get_language_info(lang_code):
from django.conf.locale import LANG_INFO
try:
lang_info = LANG_INFO[lang_code]
if "fallback" in lang_info and "name" not in lang_info:
info = get_language_info(lang_info["fallback"][0])
else:
info = lang_info
except KeyError:
if "-" not in lang_code:
raise KeyError("Unknown language code %s." % lang_code)
generic_lang_code = lang_code.split("-")[0]
try:
info = LANG_INFO[generic_lang_code]
except KeyError:
raise KeyError(
"Unknown language code %s and %s." % (lang_code, generic_lang_code)
)
if info:
info["name_translated"] = gettext_lazy(info["name"])
return info