Skip to main content

Internationalization and localization setup and support utilities.

Project description

i18n_core: Internationalization Utilities

i18n_core is a lightweight, order-agnostic i18n layer on top of Babel. It lets apps and libraries register translations at any time, and all lookups react to locale changes without re-registration.

Features

  • Dynamic lookups: _, __, ngettext reflect the current locale.
  • Order-agnostic: libraries can register before or after the app; no merge-by-call-order.
  • Domain-aware: no cross-domain bleed; use per-domain catalogs with explicit precedence.
  • System locale detection and Windows LCID support.
  • WxPython helpers: i18n_core.gui.set_wx_locale.
  • Frozen env support (works with embedded data paths).

Installation

pip install i18n_core

Dependencies

  • Babel (>= 2.15, < 3.0)
  • platform_utils

Quickstart (App)

Use finalize_i18n once at startup to set the default domain and locale.

import os
from i18n_core import finalize_i18n, get_system_locale, _

locale_dir = os.path.join(os.path.dirname(__file__), "locale")
finalize_i18n(
    locale_id=get_system_locale(),
    app_domain="my_app",           # matches your .mo domain
    app_locale_path=locale_dir,     # <locale>/<LCID>/LC_MESSAGES/my_app.mo
)

print(_("Hello, world!"))

Change locale anytime — all lookups update automatically:

from i18n_core import set_locale

set_locale("de_DE")

Libraries

Two options — both are safe and idempotent:

  • Rely on inference (zero code): just from i18n_core import _ and call it. The top-level package name becomes your domain, and <pkg>/locale is used.

  • Explicit registration (recommended for clarity/perf):

import sys
import i18n_core

i18n_core.install_module_translation(
    domain="my_lib",                 # your .mo domain
    module=sys.modules[__name__],
    # locale_path=<path>              # optional; defaults to <pkg>/locale
)

print(_("A library string"))

WxPython Integration

import wx
import i18n_core.gui

app = wx.App()
wx_locale = i18n_core.gui.set_wx_locale(locale_path, locale_id)

APIs

  • finalize_i18n(locale_id=None, languages=None, app_domain=None, app_locale_path=None, install_into_builtins=True, priority=100) -> str
    • Configure default app domain/locale; install builtins wrappers.
  • install_module_translation(domain=None, locale_id=None, locale_path=None, module=None, priority=50) -> None
    • Register a provider for a domain and install wrappers into a specific module.
  • install_global_translation(domain, locale_id=None, locale_path=None) -> str
    • Back-compat shim: registers default domain and sets locale.
  • set_locale(locale_id: str) -> str
    • Normalize and apply process/Windows locale; updates i18n registry.
  • get_available_translations(domain, locale_path=None) -> Iterable[str]
    • List available locales for a domain across registered paths.
  • get_available_locales(domain, locale_path=None) -> Iterable[babel.core.Locale]
  • reset_locale() context manager: temporarily adjust process locale.

Precedence & Domains

  • Precedence is explicit: higher priority overrides lower within a domain (default: app=100, libraries=50). Ties resolve by first-registration order.
  • Lookups are domain-aware; module wrappers use their bound domain, and builtins use the default domain (or fall back to caller inference).

Backward Compatibility Notes

  • The legacy global-merge behavior is replaced by per-domain composites. active_translation now reflects the default domain, not a cross-domain merge.
  • install_global_translation and install_module_translation still exist but are now order-agnostic and idempotent.
  • Builtins _, __, ngettext are installed at import-time. If you previously used try: __; except NameError: install_global_translation(...), switch to finalize_i18n in the app entry point.

License

This project is licensed under the terms of the LICENSE file.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

i18n_core-2.0.0.tar.gz (12.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

i18n_core-2.0.0-py2.py3-none-any.whl (12.0 kB view details)

Uploaded Python 2Python 3

File details

Details for the file i18n_core-2.0.0.tar.gz.

File metadata

  • Download URL: i18n_core-2.0.0.tar.gz
  • Upload date:
  • Size: 12.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.8.16

File hashes

Hashes for i18n_core-2.0.0.tar.gz
Algorithm Hash digest
SHA256 e252987b8e554492d47bea1c821164c687050483adc2d59ee880727fb6ef2604
MD5 f516bcaf1a4b6a6a4c4c437b601dffe8
BLAKE2b-256 0993c7cc6b3e71d742a701e6fae372128e3eb7303005c45b08fcd02f95064990

See more details on using hashes here.

File details

Details for the file i18n_core-2.0.0-py2.py3-none-any.whl.

File metadata

  • Download URL: i18n_core-2.0.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 12.0 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.8.16

File hashes

Hashes for i18n_core-2.0.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 d91c74ef4cc0dc78c4409865c55af5dcacdee69db9cb7adea41ad802b37a81b6
MD5 ed28c78e6029ad4eb534c54dcd406999
BLAKE2b-256 15ccc7f68d82442101b935d67cb92ff906b209db6877192627322d092abf5111

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page