From: Aarni Koskela Date: Sun, 3 Jan 2016 20:50:08 +0000 (+0200) Subject: Add public API for territory language data X-Git-Tag: 2.3.1~28^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f68373c11ef6b355ee7656002eaf864600ebbc8d;p=thirdparty%2Fbabel.git Add public API for territory language data --- diff --git a/babel/languages.py b/babel/languages.py new file mode 100644 index 00000000..28718f68 --- /dev/null +++ b/babel/languages.py @@ -0,0 +1,64 @@ +# -- encoding: UTF-8 -- +from babel.core import get_global + + +def get_official_languages(territory, regional=False, de_facto=False): + """ + Get the official language(s) for the given territory. + + The language codes, if any are known, are returned in order of descending popularity. + + If the `regional` flag is set, then languages which are regionally official are also returned. + + If the `de_facto` flag is set, then languages which are "de facto" official are also returned. + + :param territory: Territory code + :type territory: str + :param regional: Whether to return regionally official languages too + :type regional: bool + :param de_facto: Whether to return de-facto official languages too + :type de_facto: bool + :return: Tuple of language codes + :rtype: tuple[str] + """ + + territory = str(territory).upper() + allowed_stati = set(("official",)) + if regional: + allowed_stati.add("official_regional") + if de_facto: + allowed_stati.add("de_facto_official") + + languages = get_global("territory_languages").get(territory, {}) + pairs = [ + (info['population_percent'], language) + for language, info in languages.items() + if info.get('official_status') in allowed_stati + ] + pairs.sort(reverse=True) + return tuple(lang for _, lang in pairs) + + + +def get_territory_language_info(territory): + """ + Get a dictionary of language information for a territory. + + The dictionary is keyed by language code; the values are dicts with more information. + + The following keys are currently known for the values: + + * `population_percent`: The percentage of the territory's population speaking the + language. + * `official_status`: An optional string describing the officiality status of the language. + Known values are "official", "official_regional" and "de_facto_official". + + See http://www.unicode.org/cldr/charts/latest/supplemental/territory_language_information.html + + :param territory: Territory code + :type territory: str + :return: Language information dictionary + :rtype: dict[str, dict] + """ + territory = str(territory).upper() + return get_global("territory_languages").get(territory, {}).copy() diff --git a/tests/test_languages.py b/tests/test_languages.py new file mode 100644 index 00000000..594149fa --- /dev/null +++ b/tests/test_languages.py @@ -0,0 +1,14 @@ +# -- encoding: UTF-8 -- +from babel.languages import get_official_languages, get_territory_language_info + + +def test_official_languages(): + assert get_official_languages("FI") == ("fi", "sv") + assert get_official_languages("SE") == ("sv",) + assert get_official_languages("CH") == ("de", "fr", "it") + assert get_official_languages("CH", de_facto=True) == ("de", "gsw", "fr", "it") + assert get_official_languages("CH", regional=True) == ("de", "fr", "it", "rm") + + +def test_get_language_info(): + assert set(get_territory_language_info("HU").keys()) == set(("hu", "en", "de", "ro", "hr", "sk", "sl"))