def normalize_language()

in bedrock/base/i18n.py [0:0]


def normalize_language(language):
    """
    Given a language code, returns the language code supported by Bedrock
    in the proper case, for example "eN-us" --> "en-US" - or None if
    Bedrock doesn't support the language code.

    We also convert it to a specified fallback language if the actual
    presented code is not available _and_ we have a fallback specced in
    settings.

    """

    if not language:
        return None

    lang_code = language

    if lang_code in settings.LANGUAGE_URL_MAP_WITH_FALLBACKS:
        return settings.LANGUAGE_URL_MAP_WITH_FALLBACKS[lang_code]

    # Reformat the lang code to be mixed-case, as we expect
    # them to be for our lookup
    lang, _partition, classifier = language.partition("-")
    lang = lang.lower()  # this part is _always_ lowercase

    _special_cases = ["hant"]

    if classifier:
        if "-" in classifier or classifier in _special_cases:
            _classifier, _partition, rest = classifier.partition("-")
            if _classifier.lower() in _special_cases:
                # support zh-hant-tw -> zh-Hant-TW
                _classifier = capfirst(_classifier)
                if rest:
                    classifier = f"{_classifier}-{rest.upper()}"
                else:
                    classifier = _classifier
            else:
                # Support patterns like ja-JP-mac
                classifier = f"{_classifier.upper()}-{rest}"
        else:
            classifier = classifier.upper()

        lang_code = f"{lang}-{classifier}"
    else:
        lang_code = lang

    try:
        return settings.LANGUAGE_URL_MAP_WITH_FALLBACKS[lang_code]
    except KeyError:
        pre = lang_code.split("-")[0]
        return settings.LANGUAGE_URL_MAP_WITH_FALLBACKS.get(pre)