From 0b5999d43490ee26a9aacccb2a68e868ca872131 Mon Sep 17 00:00:00 2001 From: moss-bryophyta <261561981+moss-bryophyta@users.noreply.github.com> Date: Sat, 7 Mar 2026 13:19:54 -0800 Subject: [PATCH 1/4] refactor: replace hardcoded 'en' defaults with LIBRARY_DEFAULT_LOCALE --- .../src/generaltranslation_intl_messageformat/_formatter.py | 5 +++-- .../src/generaltranslation/formatting/_helpers.py | 6 ++++-- .../src/generaltranslation/locales/_get_locale_name.py | 3 ++- .../generaltranslation/locales/_get_locale_properties.py | 4 +++- .../src/generaltranslation/locales/_get_plural_form.py | 5 +++-- .../generaltranslation/locales/_get_region_properties.py | 3 ++- .../src/generaltranslation/locales/_is_valid_locale.py | 6 ++++-- packages/gt-fastapi/src/gt_fastapi/_setup.py | 3 ++- packages/gt-flask/src/gt_flask/_setup.py | 3 ++- 9 files changed, 25 insertions(+), 13 deletions(-) diff --git a/packages/generaltranslation-intl-messageformat/src/generaltranslation_intl_messageformat/_formatter.py b/packages/generaltranslation-intl-messageformat/src/generaltranslation_intl_messageformat/_formatter.py index a81890f..999dd96 100644 --- a/packages/generaltranslation-intl-messageformat/src/generaltranslation_intl_messageformat/_formatter.py +++ b/packages/generaltranslation-intl-messageformat/src/generaltranslation_intl_messageformat/_formatter.py @@ -9,6 +9,7 @@ from babel import Locale from babel.core import UnknownLocaleError from babel.numbers import format_decimal +from generaltranslation._settings import LIBRARY_DEFAULT_LOCALE from generaltranslation_icu_messageformat_parser import Parser _parser = Parser() @@ -27,13 +28,13 @@ class IntlMessageFormat: mf.format({"count": 5}) # "5 items" """ - def __init__(self, pattern: str, locale: str = "en") -> None: + def __init__(self, pattern: str, locale: str = LIBRARY_DEFAULT_LOCALE) -> None: self._pattern = pattern self._ast = _parser.parse(pattern) try: self._locale = Locale.parse(locale, sep="-") except (UnknownLocaleError, ValueError): - self._locale = Locale("en") + self._locale = Locale(LIBRARY_DEFAULT_LOCALE) @property def pattern(self) -> str: diff --git a/packages/generaltranslation/src/generaltranslation/formatting/_helpers.py b/packages/generaltranslation/src/generaltranslation/formatting/_helpers.py index a88cb4c..bdad80a 100644 --- a/packages/generaltranslation/src/generaltranslation/formatting/_helpers.py +++ b/packages/generaltranslation/src/generaltranslation/formatting/_helpers.py @@ -9,6 +9,8 @@ from babel import Locale from babel.core import UnknownLocaleError +from generaltranslation._settings import LIBRARY_DEFAULT_LOCALE + def _resolve_babel_locale(locales: str | list[str] | None = None) -> Locale: """Convert BCP 47 locale(s) to a Babel :class:`Locale` instance. @@ -22,7 +24,7 @@ def _resolve_babel_locale(locales: str | list[str] | None = None) -> Locale: A :class:`babel.Locale` instance. """ if locales is None: - return Locale("en") + return Locale(LIBRARY_DEFAULT_LOCALE) if isinstance(locales, str): locales = [locales] for tag in locales: @@ -30,7 +32,7 @@ def _resolve_babel_locale(locales: str | list[str] | None = None) -> Locale: return Locale.parse(tag, sep="-") except (UnknownLocaleError, ValueError): continue - return Locale("en") + return Locale(LIBRARY_DEFAULT_LOCALE) def _get_language_code(locales: str | list[str] | None = None) -> str: diff --git a/packages/generaltranslation/src/generaltranslation/locales/_get_locale_name.py b/packages/generaltranslation/src/generaltranslation/locales/_get_locale_name.py index 91402eb..ee4a08b 100644 --- a/packages/generaltranslation/src/generaltranslation/locales/_get_locale_name.py +++ b/packages/generaltranslation/src/generaltranslation/locales/_get_locale_name.py @@ -8,12 +8,13 @@ from babel import Locale +from generaltranslation._settings import LIBRARY_DEFAULT_LOCALE from generaltranslation.locales._types import CustomMapping def get_locale_name( locale: str, - default_locale: str | None = "en", + default_locale: str | None = LIBRARY_DEFAULT_LOCALE, custom_mapping: CustomMapping | None = None, ) -> str: """Return the display name of *locale* rendered in *default_locale*. diff --git a/packages/generaltranslation/src/generaltranslation/locales/_get_locale_properties.py b/packages/generaltranslation/src/generaltranslation/locales/_get_locale_properties.py index ac995dd..2ee77c1 100644 --- a/packages/generaltranslation/src/generaltranslation/locales/_get_locale_properties.py +++ b/packages/generaltranslation/src/generaltranslation/locales/_get_locale_properties.py @@ -8,6 +8,8 @@ from __future__ import annotations from babel import Locale + +from generaltranslation._settings import LIBRARY_DEFAULT_LOCALE from babel.core import get_global from generaltranslation.locales._types import CustomMapping, LocaleProperties @@ -105,7 +107,7 @@ def _build_component_name( def get_locale_properties( locale: str, - default_locale: str | None = "en", + default_locale: str | None = LIBRARY_DEFAULT_LOCALE, custom_mapping: CustomMapping | None = None, ) -> LocaleProperties: """Return a :class:`LocaleProperties` for *locale*.""" diff --git a/packages/generaltranslation/src/generaltranslation/locales/_get_plural_form.py b/packages/generaltranslation/src/generaltranslation/locales/_get_plural_form.py index c28cc3c..1d84912 100644 --- a/packages/generaltranslation/src/generaltranslation/locales/_get_plural_form.py +++ b/packages/generaltranslation/src/generaltranslation/locales/_get_plural_form.py @@ -11,6 +11,7 @@ from babel import Locale +from generaltranslation._settings import LIBRARY_DEFAULT_LOCALE from generaltranslation.locales._types import PLURAL_FORMS, PluralType # Aliases between our custom form names and CLDR form names @@ -54,7 +55,7 @@ def get_plural_form( if forms is None: forms = list(PLURAL_FORMS) if locales is None: - locales = ["en"] + locales = [LIBRARY_DEFAULT_LOCALE] forms_set = set(forms) @@ -95,7 +96,7 @@ def _get_cldr_category(n: int | float, locales: list[str]) -> str: continue # Default to English rules try: - rule = Locale("en").plural_form + rule = Locale(LIBRARY_DEFAULT_LOCALE).plural_form return rule(abs(n)) except Exception: return "other" diff --git a/packages/generaltranslation/src/generaltranslation/locales/_get_region_properties.py b/packages/generaltranslation/src/generaltranslation/locales/_get_region_properties.py index a8cca79..2c0cc4f 100644 --- a/packages/generaltranslation/src/generaltranslation/locales/_get_region_properties.py +++ b/packages/generaltranslation/src/generaltranslation/locales/_get_region_properties.py @@ -9,13 +9,14 @@ from babel import Locale +from generaltranslation._settings import LIBRARY_DEFAULT_LOCALE from generaltranslation.locales._get_locale_emoji import DEFAULT_EMOJI, EMOJIS from generaltranslation.locales._types import CustomRegionMapping def get_region_properties( region: str, - default_locale: str | None = "en", + default_locale: str | None = LIBRARY_DEFAULT_LOCALE, custom_mapping: CustomRegionMapping | None = None, ) -> dict[str, str]: """Return metadata for a region code. diff --git a/packages/generaltranslation/src/generaltranslation/locales/_is_valid_locale.py b/packages/generaltranslation/src/generaltranslation/locales/_is_valid_locale.py index 3538076..bc2e859 100644 --- a/packages/generaltranslation/src/generaltranslation/locales/_is_valid_locale.py +++ b/packages/generaltranslation/src/generaltranslation/locales/_is_valid_locale.py @@ -9,6 +9,8 @@ from babel import Locale from babel.core import UnknownLocaleError +from generaltranslation._settings import LIBRARY_DEFAULT_LOCALE + from generaltranslation.locales._types import CustomMapping # Scripts that are valid but may not be recognised by all display-name APIs. @@ -109,7 +111,7 @@ def is_valid_locale( # For region codes, verify they're known if parsed.territory: try: - display_locale = Locale("en") + display_locale = Locale(LIBRARY_DEFAULT_LOCALE) if parsed.territory not in display_locale.territories: return False except Exception: @@ -119,7 +121,7 @@ def is_valid_locale( if parsed.script: if parsed.script not in SCRIPT_EXCEPTIONS: try: - display_locale = Locale("en") + display_locale = Locale(LIBRARY_DEFAULT_LOCALE) if parsed.script not in display_locale.scripts: return False except Exception: diff --git a/packages/gt-fastapi/src/gt_fastapi/_setup.py b/packages/gt-fastapi/src/gt_fastapi/_setup.py index 3f0fcf6..4717ea6 100644 --- a/packages/gt-fastapi/src/gt_fastapi/_setup.py +++ b/packages/gt-fastapi/src/gt_fastapi/_setup.py @@ -6,6 +6,7 @@ from contextlib import asynccontextmanager from typing import Any +from generaltranslation._settings import LIBRARY_DEFAULT_LOCALE from generaltranslation.locales import determine_locale from gt_i18n import I18nManager, set_i18n_manager, t # noqa: F401 @@ -45,7 +46,7 @@ def _detect_from_accept_language(request: Any, manager: I18nManager) -> str: def initialize_gt( app: Any, *, - default_locale: str = "en", + default_locale: str = LIBRARY_DEFAULT_LOCALE, locales: list[str] | None = None, project_id: str | None = None, cache_url: str | None = None, diff --git a/packages/gt-flask/src/gt_flask/_setup.py b/packages/gt-flask/src/gt_flask/_setup.py index 5268f58..0cf17ed 100644 --- a/packages/gt-flask/src/gt_flask/_setup.py +++ b/packages/gt-flask/src/gt_flask/_setup.py @@ -6,6 +6,7 @@ from collections.abc import Callable from typing import Any +from generaltranslation._settings import LIBRARY_DEFAULT_LOCALE from generaltranslation.locales import determine_locale from gt_i18n import I18nManager, set_i18n_manager, t # noqa: F401 @@ -47,7 +48,7 @@ def _detect_from_accept_language(request: Any, manager: I18nManager) -> str: def initialize_gt( app: Any, *, - default_locale: str = "en", + default_locale: str = LIBRARY_DEFAULT_LOCALE, locales: list[str] | None = None, project_id: str | None = None, cache_url: str | None = None, From e910efbf330e4022066d2a3fe40e0dc05aa1beb1 Mon Sep 17 00:00:00 2001 From: moss-bryophyta <261561981+moss-bryophyta@users.noreply.github.com> Date: Sat, 7 Mar 2026 13:22:53 -0800 Subject: [PATCH 2/4] fix: define LIBRARY_DEFAULT_LOCALE locally in intl-messageformat package The intl-messageformat package doesn't depend on generaltranslation, so importing from generaltranslation._settings would break standalone installs. Define the constant locally instead. --- .../src/generaltranslation_intl_messageformat/_formatter.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/generaltranslation-intl-messageformat/src/generaltranslation_intl_messageformat/_formatter.py b/packages/generaltranslation-intl-messageformat/src/generaltranslation_intl_messageformat/_formatter.py index 999dd96..d787137 100644 --- a/packages/generaltranslation-intl-messageformat/src/generaltranslation_intl_messageformat/_formatter.py +++ b/packages/generaltranslation-intl-messageformat/src/generaltranslation_intl_messageformat/_formatter.py @@ -9,9 +9,10 @@ from babel import Locale from babel.core import UnknownLocaleError from babel.numbers import format_decimal -from generaltranslation._settings import LIBRARY_DEFAULT_LOCALE from generaltranslation_icu_messageformat_parser import Parser +LIBRARY_DEFAULT_LOCALE = "en" + _parser = Parser() From fe0476f0add899098d32702cc13bc8f6633181af Mon Sep 17 00:00:00 2001 From: moss-bryophyta <261561981+moss-bryophyta@users.noreply.github.com> Date: Sat, 7 Mar 2026 13:36:10 -0800 Subject: [PATCH 3/4] chore: add changeset for centralized default locale --- .sampo/changesets/centralize-default-locale.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .sampo/changesets/centralize-default-locale.md diff --git a/.sampo/changesets/centralize-default-locale.md b/.sampo/changesets/centralize-default-locale.md new file mode 100644 index 0000000..1718cf5 --- /dev/null +++ b/.sampo/changesets/centralize-default-locale.md @@ -0,0 +1,8 @@ +--- +pypi/generaltranslation: patch +pypi/gt-fastapi: patch +pypi/gt-flask: patch +pypi/generaltranslation-intl-messageformat: patch +--- + +Centralize hardcoded `"en"` locale defaults into a `LIBRARY_DEFAULT_LOCALE` constant. No behavioral change. From 042c0fbcc1b4695cb671ff180d2f5cd00491a9cc Mon Sep 17 00:00:00 2001 From: moss-bryophyta <261561981+moss-bryophyta@users.noreply.github.com> Date: Sat, 7 Mar 2026 13:42:15 -0800 Subject: [PATCH 4/4] style: fix import sorting (ruff I001) --- .../src/generaltranslation/locales/_get_locale_properties.py | 3 +-- .../src/generaltranslation/locales/_is_valid_locale.py | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/generaltranslation/src/generaltranslation/locales/_get_locale_properties.py b/packages/generaltranslation/src/generaltranslation/locales/_get_locale_properties.py index 2ee77c1..5546bd4 100644 --- a/packages/generaltranslation/src/generaltranslation/locales/_get_locale_properties.py +++ b/packages/generaltranslation/src/generaltranslation/locales/_get_locale_properties.py @@ -8,10 +8,9 @@ from __future__ import annotations from babel import Locale - -from generaltranslation._settings import LIBRARY_DEFAULT_LOCALE from babel.core import get_global +from generaltranslation._settings import LIBRARY_DEFAULT_LOCALE from generaltranslation.locales._types import CustomMapping, LocaleProperties _likely_subtags: dict[str, str] = dict(get_global("likely_subtags")) diff --git a/packages/generaltranslation/src/generaltranslation/locales/_is_valid_locale.py b/packages/generaltranslation/src/generaltranslation/locales/_is_valid_locale.py index bc2e859..d6c6775 100644 --- a/packages/generaltranslation/src/generaltranslation/locales/_is_valid_locale.py +++ b/packages/generaltranslation/src/generaltranslation/locales/_is_valid_locale.py @@ -10,7 +10,6 @@ from babel.core import UnknownLocaleError from generaltranslation._settings import LIBRARY_DEFAULT_LOCALE - from generaltranslation.locales._types import CustomMapping # Scripts that are valid but may not be recognised by all display-name APIs.