Skip to main content

Internacionalización mínima: claves con notación de punto sobre ficheros JSON, con caché, fallback al idioma por defecto e interpolación. Sin dependencias, sin gettext.

Project description

dotkey-i18n

Internacionalización mínima para Python: claves con notación de punto sobre ficheros JSON, con caché, fallback e interpolación. Sin dependencias, sin gettext, sin ficheros .po, sin paso de compilación.

from dotkey_i18n import Translator

tr = Translator("locales", default_lang="es")

tr.t("login.welcome", name="Juan")            # "Hola, Juan"
tr.t("menu.reports", lang="en")               # "Reports"

Tus traducciones son JSON que cualquiera puede editar:

// locales/es.json
{
  "login": { "welcome": "Hola, {name}", "submit": "Entrar" },
  "menu":  { "reports": "Informes", "settings": "Ajustes" }
}

Instalación

pip install dotkey-i18n

Sin dependencias. Requiere Python ≥ 3.9.

Por qué existe

gettext y Babel son potentes, pero para una app pequeña o mediana pagas un peaje: ficheros .po, un paso de compilación (.mo), y herramientas aparte. A veces solo quieres un t() honesto sobre unos JSON. Eso es esto.

Qué hace bien

Notación de punto. t("login.submit") navega loginsubmit en el JSON anidado. Agrupa las cadenas por pantalla o por módulo sin claves planas kilométricas.

Fallback al idioma por defecto. Si una clave falta en el idioma pedido, se busca en default_lang antes de rendirse. Tus traducciones pueden ir incompletas sin dejar huecos en blanco:

tr = Translator("locales", default_lang="es")
tr.t("menu.settings", lang="en")   # no está en en.json -> cae a es.json

Nunca revienta la UI. Clave que no existe → devuelve la propia clave (un marcador visible, no una excepción). Interpolación con un {campo} que falta → devuelve el texto sin formatear. JSON corrupto → se trata como vacío. Puedes personalizar el caso "clave ausente" con on_missing.

Agnóstico del framework. El idioma actual entra por un lang_getter inyectable, así funciona igual con NiceGUI, Flask, FastAPI o un script suelto:

# NiceGUI: idioma desde la sesión del usuario
tr = Translator("locales", default_lang="es",
                lang_getter=lambda: app.storage.user.get("idioma"))

# Flask
tr = Translator("locales", lang_getter=lambda: session.get("lang"))

Prioridad: lang= explícito → lang_getter()default_lang.

API

tr = Translator(
    directory,                 # carpeta con los <lang>.json
    default_lang="en",         # idioma por defecto y de fallback
    lang_getter=None,          # callable() -> idioma actual
    fallback_to_default=True,  # buscar en default_lang si falta la clave
    on_missing=None,           # callable(key, lang) -> str para claves ausentes
)

tr.t("a.b.c", lang=None, **kwargs)   # traducir (o tr("a.b.c"))
tr.available_langs                    # ["en", "es", ...] según los ficheros
tr.reload()                           # releer los JSON tras editarlos

De dónde viene

Salió del servicio i18n de un sistema de gestión de informes (español/inglés). Estaba atado al framework —leía el idioma de la sesión de NiceGUI directamente—; al extraerlo se desacopló con el lang_getter, y se le añadió el fallback al idioma por defecto que el original no tenía.

Tests

pip install "dotkey-i18n[test]"
pytest

19 tests: notación de punto, interpolación, selección de idioma, fallback, claves ausentes, reload y JSON corrupto. Verificados por mutación.

Licencia

Apache-2.0.

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

dotkey_i18n-0.1.0.tar.gz (9.9 kB view details)

Uploaded Source

Built Distribution

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

dotkey_i18n-0.1.0-py3-none-any.whl (9.3 kB view details)

Uploaded Python 3

File details

Details for the file dotkey_i18n-0.1.0.tar.gz.

File metadata

  • Download URL: dotkey_i18n-0.1.0.tar.gz
  • Upload date:
  • Size: 9.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dotkey_i18n-0.1.0.tar.gz
Algorithm Hash digest
SHA256 08318d3b3e1f291dc3d71f702168b0152cd69a439b78185c9e80d9f4d2393e65
MD5 ca9906b18ea9aa41224e2346223a1c1e
BLAKE2b-256 e50f74b9167b801a84e5f4c8fad6ca504192e77976a3596a903c7965b3952b68

See more details on using hashes here.

Provenance

The following attestation bundles were made for dotkey_i18n-0.1.0.tar.gz:

Publisher: publish.yml on isazajuancarlos/dotkey-i18n

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dotkey_i18n-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: dotkey_i18n-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 9.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dotkey_i18n-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ba1afa913f5b0d12a399c7290a784528e2ede9fff24c88a7e05c0822b2141857
MD5 491d3c7db8a4cecd0617b657fc5eaa6b
BLAKE2b-256 b83a4c73181ad0fefd004d6d81263950111a32953bc0791d73aad3f3b1a453da

See more details on using hashes here.

Provenance

The following attestation bundles were made for dotkey_i18n-0.1.0-py3-none-any.whl:

Publisher: publish.yml on isazajuancarlos/dotkey-i18n

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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