From: Aarni Koskela Date: Tue, 14 Jan 2025 14:32:22 +0000 (+0200) Subject: `default_locale`: support multiple keys X-Git-Tag: v2.17.0~3^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aee6d698b541dc50439280d7e093092cc0d4b832;p=thirdparty%2Fbabel.git `default_locale`: support multiple keys Also ignore falsy values in `default_locale` args. --- diff --git a/babel/core.py b/babel/core.py index 1c7732b5..bffef94d 100644 --- a/babel/core.py +++ b/babel/core.py @@ -1089,7 +1089,10 @@ class Locale: return self._data['unit_display_names'] -def default_locale(category: str | None = None, aliases: Mapping[str, str] = LOCALE_ALIASES) -> str | None: +def default_locale( + category: str | tuple[str, ...] | list[str] | None = None, + aliases: Mapping[str, str] = LOCALE_ALIASES, +) -> str | None: """Returns the system default locale for a given category, based on environment variables. @@ -1113,11 +1116,22 @@ def default_locale(category: str | None = None, aliases: Mapping[str, str] = LOC - ``LC_CTYPE`` - ``LANG`` - :param category: one of the ``LC_XXX`` environment variable names + :param category: one or more of the ``LC_XXX`` environment variable names :param aliases: a dictionary of aliases for locale identifiers """ - varnames = (category, 'LANGUAGE', 'LC_ALL', 'LC_CTYPE', 'LANG') - for name in filter(None, varnames): + + varnames = ('LANGUAGE', 'LC_ALL', 'LC_CTYPE', 'LANG') + if category: + if isinstance(category, str): + varnames = (category, *varnames) + elif isinstance(category, (list, tuple)): + varnames = (*category, *varnames) + else: + raise TypeError(f"Invalid type for category: {category!r}") + + for name in varnames: + if not name: + continue locale = os.getenv(name) if locale: if name == 'LANGUAGE' and ':' in locale: diff --git a/tests/test_core.py b/tests/test_core.py index b6c55626..8770cf8d 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -265,7 +265,7 @@ class TestLocaleClass: def test_default_locale(monkeypatch): - for name in ['LANGUAGE', 'LC_ALL', 'LC_CTYPE', 'LC_MESSAGES']: + for name in ['LANGUAGE', 'LANG', 'LC_ALL', 'LC_CTYPE', 'LC_MESSAGES']: monkeypatch.setenv(name, '') monkeypatch.setenv('LANG', 'fr_FR.UTF-8') assert default_locale('LC_MESSAGES') == 'fr_FR' @@ -277,6 +277,23 @@ def test_default_locale(monkeypatch): assert default_locale() == 'en_US_POSIX' +def test_default_locale_multiple_args(monkeypatch): + for name in ['LANGUAGE', 'LANG', 'LC_ALL', 'LC_CTYPE', 'LC_MESSAGES', 'LC_MONETARY', 'LC_NUMERIC']: + monkeypatch.setenv(name, '') + assert default_locale(["", 0, None]) is None + monkeypatch.setenv('LANG', 'en_US') + assert default_locale(('LC_MONETARY', 'LC_NUMERIC')) == 'en_US' # No LC_MONETARY or LC_NUMERIC set + monkeypatch.setenv('LC_NUMERIC', 'fr_FR.UTF-8') + assert default_locale(('LC_MONETARY', 'LC_NUMERIC')) == 'fr_FR' # LC_NUMERIC set + monkeypatch.setenv('LC_MONETARY', 'fi_FI.UTF-8') + assert default_locale(('LC_MONETARY', 'LC_NUMERIC')) == 'fi_FI' # LC_MONETARY set, it takes precedence + + +def test_default_locale_bad_arg(): + with pytest.raises(TypeError): + default_locale(42) + + def test_negotiate_locale(): assert (core.negotiate_locale(['de_DE', 'en_US'], ['de_DE', 'de_AT']) == 'de_DE')