diff --git a/Lib/locale.py b/Lib/locale.py index dea3ee55cf4d24..e22ee80e5eadaf 100644 --- a/Lib/locale.py +++ b/Lib/locale.py @@ -17,17 +17,15 @@ from builtins import str as _builtin_str import functools -# Try importing the _locale module. -# -# If this fails, fall back on a basic 'C' locale emulation. - # Yuck: LC_MESSAGES is non-standard: can't tell whether it exists before # trying the import. So __all__ is also fiddled at the end of the file. __all__ = ["getlocale", "getdefaultlocale", "getpreferredencoding", "Error", "setlocale", "localeconv", "strcoll", "strxfrm", "str", "atof", "atoi", "format_string", "currency", "normalize", "LC_CTYPE", "LC_COLLATE", "LC_TIME", "LC_MONETARY", - "LC_NUMERIC", "LC_ALL", "CHAR_MAX", "getencoding"] + "LC_NUMERIC", "LC_ALL", "CHAR_MAX", "getencoding", "delocalize", + "localize", "locale_encoding_alias", "locale_alias", + "windows_locale"] def _strcoll(a,b): """ strcoll(string,string) -> int. @@ -41,6 +39,9 @@ def _strxfrm(s): """ return s +# Try importing the _locale module. +# +# If this fails, fall back on a basic 'C' locale emulation. try: from _locale import * @@ -91,6 +92,29 @@ def setlocale(category, value=None): raise Error('_locale emulation only supports "C" locale') return 'C' +else: + _conditional_constants_names = ["ABDAY_1", "ABDAY_2", "ABDAY_3", + "ABDAY_4", "ABDAY_5", "ABDAY_6", + "ABDAY_7", "ABMON_1", "ABMON_10", + "ABMON_11", "ABMON_12", "ABMON_2", + "ABMON_3", "ABMON_4", "ABMON_5", + "ABMON_6", "ABMON_7", "ABMON_8", + "ABMON_9", "ALT_DIGITS", "CODESET", + "CRNCYSTR", "DAY_1", "DAY_2", "DAY_3", + "DAY_4", "DAY_5", "DAY_6", + "DAY_7", "D_FMT", "D_T_FMT", + "ERA", "ERA_D_FMT", "ERA_D_T_FMT", + "ERA_T_FMT", "MON_1", "MON_10", + "MON_11", "MON_12", "MON_2", "MON_3", + "MON_4", "MON_5", "MON_6", "MON_7", + "MON_8", "MON_9", "NOEXPR", + "RADIXCHAR", "THOUSEP", "T_FMT", + "T_FMT_AMPM", "YESEXPR", "AM_STR", + "PM_STR"] + # The constants defined in _locale are platform-dependent, + # so we only include those that are available on the current platform. + __all__.extend(vars().keys() & _conditional_constants_names) + # These may or may not exist in _locale, so be sure to set them. if 'strxfrm' not in globals(): strxfrm = _strxfrm diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py index a06c600cf56689..5db0956d8c3506 100644 --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -9,6 +9,14 @@ import sys import codecs + +class MiscTestCase(unittest.TestCase): + maxDiff = None + def test__all__(self): + extra = ["localeconv", "strcoll", "strxfrm", "getencoding", + "Error"] + support.check__all__(self, locale, extra=extra) + class LazyImportTest(unittest.TestCase): @cpython_only def test_lazy_import(self): diff --git a/Misc/NEWS.d/next/Library/2025-11-02-22-24-13.gh-issue-140924.NQVbR_.rst b/Misc/NEWS.d/next/Library/2025-11-02-22-24-13.gh-issue-140924.NQVbR_.rst new file mode 100644 index 00000000000000..3de3a1566b1427 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-02-22-24-13.gh-issue-140924.NQVbR_.rst @@ -0,0 +1,4 @@ +Add :func:`locale.localize`, :func:`locale.delocalize`, +``locale.locale_encoding_alias``, ``locale.locale_alias``, +``locale.windows_locale`` and platform-specific locale constants +from the :mod:`!_locale` module to ``locale.__all__``.