{
  "id": 1325951,
  "title": "i18n sin gettext: traducciones en JSON con claves de punto",
  "url": "https://urgent.news/2026/08/16/i18n-sin-gettext-traducciones-en-json-con-claves-de-punto",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-08-16T18:29:59.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/isazajuancarlos/i18n-sin-gettext-traducciones-en-json-con-claves-de-punto-48fd"
  },
  "original_language": "es",
  "account": "Quieres que tu aplicación hable varios idiomas, tal vez español e inglés. Inevitablemente te encontrarás con la gente recomendando utilizar gettext o Babel, junto con ficheros .po, compilación y herramientas de extracción. Aunque efectivo, esto puede ser un costo innecesario para aplicaciones de pequeño o mediano tamaño que solo necesitan una función tan simple como t().\n\nDespués de experimentar con varios enfoques, el autor decidió crear su propia solución llamada dotkey-i18n. Esta es una aplicación pura de Python sin ninguna dependencia. Las traducciones se representan en formato JSON, lo cual puede ser editado fácilmente por cualquiera. Un ejemplo sería:\n\n```\n{\n\"login\": {\n\"welcome\": \"Hola, {name}\",\n\"submit\": \"Entrar\"\n},\n\"menu\": {\n\"reports\": \"Informes\",\n\"settings\": \"Ajustes\"\n}\n}\n```\n\nEn su implementación se encuentran tres aspectos clave:\n1. Las claves tienen notación de punto. Por ejemplo, t(login.submit) navega a través del JSON anidado para mostrar la traducción del botón \"Entrar\".\n2. El sistema falla de manera lógica al buscar una clave que no exista en el idioma solicitado. En su lugar, intenta buscar la clave en el idioma predeterminado antes de renderizarlo.\n3. Las traducciones no necesariamente son completas. Pueden ir incompletas sin dejar huecos en blanco en la interfaz. Una clave que falle devuelve la propia clave, en lugar de producir una excepción durante el renderizado.\n\nUna de las mayores ventajas de dotkey-i18n es que es agnóstico de cualquier framework. El idioma actual se puede obtener desde el getter de idioma inyectable, lo que lo hace perfectamente adecuado para ser utilizado en diversos entornos como NiceGUI, Flask, FastAPI o incluso un script simple. Este código es fácil de integrar en cualquier aplicación de Python que necesite soporte de traducción.\n\nAdemás, la prioridad de este sistema es el siguiente: lang= explícito → lang_getter() → idioma por defecto. En caso de que la clave no exista en el idioma solicitado, se intenta utilizar el idioma predeterminado.\n\nLa idea de dotkey-i18n surgió de un proyecto de sistema de informes bilingüe. El código original estaba atado a un determinado framework, lo que limitaba su versatilidad. Al extraerlo y crear una solución más flexible, se obtuvo un producto que no depende de su sistema de origen.\n\nSi quieres usar esta herramienta, simplemente instala dotkey-i18n con el siguiente comando: pip install dotkey-i18n. Código, tests y todos los detalles de la implementación, que incluyen notación de punto, fallos, claves ausentes y tratamiento de JSON corrupto, se pueden encontrar en el repositorio de GitHub: github.com/isazajuancarlos/dotkey-i18n.",
  "summary": "Quieres que tu app hable español e inglés. Buscas cómo, y el ecosistema te empuja a gettext o Babel: ficheros .po , un paso de compilación a .mo , herramientas de extracción. Potente, sí. Pero para una app pequeña o mediana es un peaje que no querías pagar — solo necesitabas un t() honesto. Lo resolví tantas veces que lo empaqueté: dotkey-i18n , Python puro, sin dependencias. Tus traducciones son…",
  "key_points": [
    "dotkey-i18n is a Python-only i18n solution with no dependencies",
    "JSON format for translations, easy to edit by anyone",
    "Key notation with point, e.g. t(login.submit) navigates JSON"
  ],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}