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
Вернуться на верх