Skip to content

Commit aee6d69

Browse files
committed
default_locale: support multiple keys
Also ignore falsy values in `default_locale` args.
1 parent 2d8a808 commit aee6d69

2 files changed

Lines changed: 36 additions & 5 deletions

File tree

babel/core.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1089,7 +1089,10 @@ def unit_display_names(self) -> localedata.LocaleDataDict:
10891089
return self._data['unit_display_names']
10901090

10911091

1092-
def default_locale(category: str | None = None, aliases: Mapping[str, str] = LOCALE_ALIASES) -> str | None:
1092+
def default_locale(
1093+
category: str | tuple[str, ...] | list[str] | None = None,
1094+
aliases: Mapping[str, str] = LOCALE_ALIASES,
1095+
) -> str | None:
10931096
"""Returns the system default locale for a given category, based on
10941097
environment variables.
10951098
@@ -1113,11 +1116,22 @@ def default_locale(category: str | None = None, aliases: Mapping[str, str] = LOC
11131116
- ``LC_CTYPE``
11141117
- ``LANG``
11151118
1116-
:param category: one of the ``LC_XXX`` environment variable names
1119+
:param category: one or more of the ``LC_XXX`` environment variable names
11171120
:param aliases: a dictionary of aliases for locale identifiers
11181121
"""
1119-
varnames = (category, 'LANGUAGE', 'LC_ALL', 'LC_CTYPE', 'LANG')
1120-
for name in filter(None, varnames):
1122+
1123+
varnames = ('LANGUAGE', 'LC_ALL', 'LC_CTYPE', 'LANG')
1124+
if category:
1125+
if isinstance(category, str):
1126+
varnames = (category, *varnames)
1127+
elif isinstance(category, (list, tuple)):
1128+
varnames = (*category, *varnames)
1129+
else:
1130+
raise TypeError(f"Invalid type for category: {category!r}")
1131+
1132+
for name in varnames:
1133+
if not name:
1134+
continue
11211135
locale = os.getenv(name)
11221136
if locale:
11231137
if name == 'LANGUAGE' and ':' in locale:

tests/test_core.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ def test_plural_form_property(self):
265265

266266

267267
def test_default_locale(monkeypatch):
268-
for name in ['LANGUAGE', 'LC_ALL', 'LC_CTYPE', 'LC_MESSAGES']:
268+
for name in ['LANGUAGE', 'LANG', 'LC_ALL', 'LC_CTYPE', 'LC_MESSAGES']:
269269
monkeypatch.setenv(name, '')
270270
monkeypatch.setenv('LANG', 'fr_FR.UTF-8')
271271
assert default_locale('LC_MESSAGES') == 'fr_FR'
@@ -277,6 +277,23 @@ def test_default_locale(monkeypatch):
277277
assert default_locale() == 'en_US_POSIX'
278278

279279

280+
def test_default_locale_multiple_args(monkeypatch):
281+
for name in ['LANGUAGE', 'LANG', 'LC_ALL', 'LC_CTYPE', 'LC_MESSAGES', 'LC_MONETARY', 'LC_NUMERIC']:
282+
monkeypatch.setenv(name, '')
283+
assert default_locale(["", 0, None]) is None
284+
monkeypatch.setenv('LANG', 'en_US')
285+
assert default_locale(('LC_MONETARY', 'LC_NUMERIC')) == 'en_US' # No LC_MONETARY or LC_NUMERIC set
286+
monkeypatch.setenv('LC_NUMERIC', 'fr_FR.UTF-8')
287+
assert default_locale(('LC_MONETARY', 'LC_NUMERIC')) == 'fr_FR' # LC_NUMERIC set
288+
monkeypatch.setenv('LC_MONETARY', 'fi_FI.UTF-8')
289+
assert default_locale(('LC_MONETARY', 'LC_NUMERIC')) == 'fi_FI' # LC_MONETARY set, it takes precedence
290+
291+
292+
def test_default_locale_bad_arg():
293+
with pytest.raises(TypeError):
294+
default_locale(42)
295+
296+
280297
def test_negotiate_locale():
281298
assert (core.negotiate_locale(['de_DE', 'en_US'], ['de_DE', 'de_AT']) ==
282299
'de_DE')

0 commit comments

Comments
 (0)