Skip to main content
Yanked

This release has been yanked by its maintainers, and will be ignored by installers, except when explicitly specified.

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 login → submit 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.

Metadata

Release files for dotkey-i18n 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dotkey-i18n 0.1.0
File Size Uploaded
dotkey_i18n-0.1.0.tar.gz 9.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dotkey-i18n 0.1.0
File Interpreter ABI Platform
dotkey_i18n-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 19.2 kB

Release files / dotkey_i18n-0.1.0.tar.gz

Download URL dotkey_i18n-0.1.0.tar.gz
Size 9.9 kB
Tags Source
SHA-256 checksum
How to use checksums
08318d3b3e1f291dc3d71f702168b0152cd69a439b78185c9e80d9f4d2393e65
BLAKE2b-256 checksum
How to use checksums
e50f74b9167b801a84e5f4c8fad6ca504192e77976a3596a903c7965b3952b68
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 17, 2026.

Transparency log

Release files / dotkey_i18n-0.1.0-py3-none-any.whl

Download URL dotkey_i18n-0.1.0-py3-none-any.whl
Size 9.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ba1afa913f5b0d12a399c7290a784528e2ede9fff24c88a7e05c0822b2141857
BLAKE2b-256 checksum
How to use checksums
b83a4c73181ad0fefd004d6d81263950111a32953bc0791d73aad3f3b1a453da
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 17, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page