]> git.ipfire.org Git - thirdparty/babel.git/commitdiff
Add public API for territory language data
authorAarni Koskela <akx@iki.fi>
Sun, 3 Jan 2016 20:50:08 +0000 (22:50 +0200)
committerAarni Koskela <akx@iki.fi>
Mon, 11 Jan 2016 08:13:48 +0000 (10:13 +0200)
babel/languages.py [new file with mode: 0644]
tests/test_languages.py [new file with mode: 0644]

diff --git a/babel/languages.py b/babel/languages.py
new file mode 100644 (file)
index 0000000..28718f6
--- /dev/null
@@ -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 (file)
index 0000000..594149f
--- /dev/null
@@ -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"))