Skip to content

Commit c40039f

Browse files
Review
1 parent c85d0c2 commit c40039f

3 files changed

Lines changed: 50 additions & 17 deletions

File tree

Doc/library/gettext.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,8 @@ install themselves in the built-in namespace as the function :func:`!_`.
131131

132132
If *localedir* is not given, then the default system locale directory is used.
133133
[#]_ If *languages* is not given, then the environment variable :envvar:`LANGUAGE`
134-
is searched, it falls back to :func:`locale.setlocale`, which in turn falls
135-
back to the environment variables :envvar:`LC_ALL`, :envvar:`LC_MESSAGES`, and
134+
is searched, it falls back to the current locale or to the environment
135+
variables :envvar:`LC_ALL`, :envvar:`LC_MESSAGES`, and
136136
:envvar:`LANG` where the first one returning a non-empty value is used for the
137137
*languages* variable. The environment variables should contain a colon separated
138138
list of languages, which will be split on the colon to produce the expected list

Lib/gettext.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -493,8 +493,8 @@ def find(domain, localedir=None, languages=None, all=False):
493493
languages = []
494494
if val := os.environ.get('LANGUAGE'):
495495
languages = val.split(':')
496-
elif (loc := locale.setlocale(locale.LC_MESSAGES)) != (None, None):
497-
languages = [".".join(filter(None, loc))]
496+
elif loc := locale.setlocale(locale.LC_MESSAGES):
497+
languages = loc.split(':')
498498
else:
499499
for envar in ('LC_ALL', 'LC_MESSAGES', 'LANG'):
500500
val = os.environ.get(envar)

Lib/test/test_gettext.py

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import sys
2+
3+
import locale
14
import os
25
import base64
36
import gettext
@@ -6,8 +9,7 @@
69
from functools import partial
710

811
from test import support
9-
from test.support import os_helper
10-
12+
from test.support import os_helper, run_with_locale
1113

1214
# TODO:
1315
# - Add new tests, for example for "dgettext"
@@ -736,32 +738,63 @@ def create_mo_file(self, lang):
736738
f.write(GNU_MO_DATA)
737739
return mo_file
738740

739-
def _for_all_vars(self, mo_file, locale):
741+
def _for_all_vars(self, mo_file, locale, expected=True):
740742
for var in ('LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG'):
741743
self.env.set(var, locale)
742744
result = gettext.find("mofile",
743745
localedir=os.path.join(self.tempdir, "locale"))
744-
self.assertEqual(mo_file, result)
746+
if expected:
747+
self.assertEqual(mo_file, result)
748+
else:
749+
self.assertIsNone(result)
745750
self.env.unset(var)
746751

747-
@unittest.mock.patch("locale.setlocale", return_value=(None, None))
752+
@unittest.mock.patch("locale.setlocale", return_value='')
748753
def test_find_with_env_vars(self, patch_getlocale):
749754
# test that find correctly finds the environment variables
750755
# when languages are not supplied
756+
mo_file = self.create_mo_file("ca_ES")
757+
self._for_all_vars(mo_file, "ca_ES")
758+
self._for_all_vars(mo_file, "ca_ES.UTF-8")
759+
self._for_all_vars(mo_file, "ca_ES.UTF-8.mo")
760+
self._for_all_vars(mo_file, "es_ES:ca_ES:fr_FR")
761+
self._for_all_vars(mo_file, "ca_ES@euro")
762+
self._for_all_vars(mo_file, "ca_ES.UTF-8@euro")
763+
self._for_all_vars(mo_file, "ca_ES@valencia")
764+
self._for_all_vars(mo_file, "C", expected=False)
765+
self._for_all_vars(mo_file, "C.UTF-8", expected=False)
766+
767+
@unittest.mock.patch('gettext._expand_lang')
768+
def test_encoding_not_ignored(self, patch_expand_lang):
769+
self.env.set('LANGUAGE', 'ga_IE.UTF-8')
770+
gettext.find("mofile")
771+
patch_expand_lang.assert_any_call('ga_IE.UTF-8')
772+
self.env.unset('LANGUAGE')
773+
774+
def test_find_LANGUAGE_priority(self):
775+
orig = locale.setlocale(locale.LC_MESSAGES)
776+
self.addCleanup(lambda: locale.setlocale(locale.LC_MESSAGES, orig))
777+
self.env.set('LANGUAGE', 'ga_IE')
778+
self.env.set('LC_ALL', 'pt_BR')
779+
locale.setlocale(locale.LC_MESSAGES, 'pt_BR')
751780
mo_file = self.create_mo_file("ga_IE")
752-
self._for_all_vars(mo_file, "ga_IE")
753-
self._for_all_vars(mo_file, "ga_IE.UTF-8")
754-
self._for_all_vars(mo_file, "es_ES:ga_IE:fr_FR")
755-
self._for_all_vars(mo_file, "ga_IE@euro")
781+
782+
result = gettext.find("mofile", localedir=os.path.join(self.tempdir, "locale"))
783+
self.assertEqual(result, mo_file)
784+
locale.setlocale(locale.LC_MESSAGES, orig)
756785

757786
def test_process_vars_override(self):
758-
mo_file = self.create_mo_file("ga_IE")
759-
with unittest.mock.patch("locale.setlocale", return_value=('ga_IE', 'UTF-8')):
787+
orig = locale.setlocale(locale.LC_MESSAGES)
788+
self.addCleanup(lambda: locale.setlocale(locale.LC_MESSAGES, orig))
789+
mo_file = self.create_mo_file("ca_ES")
790+
for loc in ("ca_ES", "ca_ES.UTF-8", "ca_ES@euro", "ca_ES@valencia"):
791+
locale.setlocale(locale.LC_MESSAGES, loc)
760792
result = gettext.find("mofile", localedir=os.path.join(self.tempdir, "locale"))
761793
self.assertEqual(mo_file, result)
762-
with unittest.mock.patch("locale.setlocale", return_value=('ga_IE', None)):
794+
for loc in ("C", "C.UTF-8"):
795+
locale.setlocale(locale.LC_MESSAGES, loc)
763796
result = gettext.find("mofile", localedir=os.path.join(self.tempdir, "locale"))
764-
self.assertEqual(mo_file, result)
797+
self.assertIsNone(result)
765798

766799
def test_find_with_languages(self):
767800
# test that passed languages are used

0 commit comments

Comments
 (0)