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.1.tar.gz (12.5 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.1-py2.py3-none-any.whl (12.9 kB view details)

Uploaded Python 2Python 3

File details

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

File metadata

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

File hashes

Hashes for i18n_core-2.0.1.tar.gz
Algorithm Hash digest
SHA256 705c3ee1708b127be18c893a7bc229176fc69183744c3df10d213d225e6818b2
MD5 16007418413df1b3f6149b3676469d68
BLAKE2b-256 63721e393ae5dfc2bae4bc7f2e3b3ed9f855079b810ef1d6fc96fd952f4d02b7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for i18n_core-2.0.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 3ccf4fe0c1b037be9b88780f8c4f7245e04760de695d4167989e1ed1efc2afac
MD5 42211205964d7724ec32be52677923aa
BLAKE2b-256 63b888887f55fbfbc1817c41d7d812a6fa1bf6c0fa89c369b1fd745b27448970

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