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.
- ``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:
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'
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')