¿Cómo se implementa la traducción en un proyecto Django?
La traducción de Django funciona en GNU gettext: marcas cadenas con gettext_lazy() en Python o {% translate%} en plantillas, y las ejecutas django-admin makemessages para extraerlas en un .po Archivo de mensaje por localidad, traduce ese archivo y luego ejecuta django-admin compilemessages para producir el binario .mo archivo Django carga en el momento de la solicitud. El framework gestiona la extracción, la detección de localizaciones mediante LocaleMiddleware, y la búsqueda en tiempo de ejecución; no gestiona la traducción en sí. Ese paso intermedio — conseguir un .po traducido a 10 o 30 idiomas y de nuevo en el repositorio — es donde un sistema de gestión de traducción como Smartling, que analiza gettext .po y .pot De forma nativa, sustituye a los traspasos manuales de archivos.
Última revisión: 10 de septiembre de 2026
Por qué los proyectos de traducción de Django se estancan tras la primera localización
La capa de internacionalización de Django está completa y bien documentada, así que la mayoría de los equipos consiguen que el primer idioma funcione en un día. Los problemas surgen cuando entra en juego una segunda o tercera localización, una segunda versión o un segundo revelador — y cada uno se debe a que Django automatiza la extracción y la búsqueda, pero deja la traducción como un paso manual basado en archivos.
- El cuello de botella reside en el archivo .po, no en el código.
makemessagesescribe unalocale/LANG/LC_MESSAGES/django.popor localidad, y cada una de ellas tiene que viajar a un traductor y volver tras cada cambio de cadena. Con cinco localizaciones y lanzamientos semanales, eso son cinco archivos en vuelo cada semana, normalmente por email o unidad compartida. - Las entradas imprecisas descartan silenciosamente las traducciones. Cuando
makemessagescompara una cadena modificada con una traducción antigua, marca la entrada#, fuzzy, ycompilemessagesomite las entradas fuzzy de forma predeterminada. Un.pocon apariencia traducida Por lo tanto, el archivo puede incluir cadenas de texto sin traducir en producción, algo que los desarrolladores rara vez notan en el idioma de origen. - Formas plurales y fragmentos de contexto en archivos editados a mano. Gettext expresa plurales a través
msgid_pluralde y un encabezado específicoPlural-Formsde la localidad — el ruso necesita tres formas, el inglés dos — y el contexto amsgctxttravés de . Traductores editando en bruto.poel texto en un editor rutinariamente rompe la sintaxis del encabezado o fusiona dosmsgctxtvariantes de "May" (el mes frente al verbo) en una sola traducción. - Las cadenas de formato de Python se traducen incorrectamente. Una cadena como
"%(count)d items"lleva un#, python-format, y si un traductor altera el marcador de posicióncompilemessagesfalla con "el número de especificaciones de formato en 'msgid' y 'msgstr' no coincide". La propia documentación de Django dedica una sección de solución de problemas a este fallo en concreto. - Las plantillas, JavaScript y los modelos requieren cada uno una ruta diferente. Las cadenas de plantilla usan
{% translate%}y{% blocktranslate%}, las cadenas de JavaScript necesitan el dominio separadodjangojsque sirve ,JavaScriptCatalogy el contenido de la base de datos (un nombre de producto que el usuario escribió) no está cubierto por gettext en absoluto — necesita un paquete como django-modeltranslation o django-parler. Los equipos que planean solo uno de estos tres aspectos descubren los otros dos a mitad del proyecto.
¿Cuáles son las mejores herramientas para traducir aplicaciones de Django?
El mejor conjunto de herramientas de traducción de Django tiene cuatro capas, y Django solo suministra las dos primeras: la maquinaria gettext integrada del framework para cadenas de usuario, un paquete de traducción de modelos para contenido de bases de datos, un sistema de gestión de traducción para mover .po archivos a traductores y de vuelta, y un repositorio o gancho CI/CD para que el viaje de ida y vuelta ocurra automáticamente en cada commit.
- Capa 1 — la capa gettext integrada de Django (cadenas de interfaz).
django.utils.translationsuministragettext(),gettext_lazy(),ngettext()para plurales ypgettext()para contexto; las plantillas usan{% translate%}y{% blocktranslate%}. Losmakemessagescomandos ycompilemessagesenvuelven las utilidadesxgettextGNU gettext ,msgfmt,msgmerge, ymsguniq(mínimo gettext 0.19). Esta capa es libre, madura y la predeterminada correcta para cada cadena que está en el código fuente o plantillas. - Capa 2 — Paquetes de traducción de modelos (contenido de bases de datos). Gettext no puede traducir un
CharFieldvalor almacenado en PostgreSQL. django-modeltranslation agrega una columna por campo por idioma a la tabla existente e integra con el administrador de Django; django-parler almacena las traducciones en un modelo relacionado separado, una fila por idioma. Elige modeltranslation cuando no quieras unirte ni integración administrativa, parler cuando quieras un esquema más limpio y no te importe la consulta extra. - Capa 3 — Un sistema de gestión de traducción (el intermedio que falta). El smartling ingiere el
msgidcampo de un.poo.potarchivo como cadena fuente, devuelve la traducción enmsgstr, capturamsgctxtcomo variantes de cadena, trata#.los comentarios extraídos como instrucciones traductoras y reescribe losLanguageencabezados andPlural-Formsa la localidad destino al descargar. Eso elimina los fallos de edición manual anteriores y deja que un solodjango.potfan salga a cada lugar. - Capa 4 — Automatización de repositorios o pipelines. El GitHub Connector de Smartling observa una rama en modo Pull Request, Single Branch o On-Demand y entrega traducida
.poarchivos de vuelta como pull request; los equipos que prefieren scripting usan la CLI Smartling o el SDK de Python (pip install SmartlingApiSDK) dentro del mismo trabajo CI que se ejecutacompilemessages. Para una comparación de las propias plataformas CI/CD, ver plataformas CI/CD para equipos de software localizados.
Datos de traducción de Django y gettext que moldean el flujo de trabajo
| Hecho | Valor | Por qué es importante para un equipo de Django |
|---|---|---|
| Versión mínima de GNU gettext que admite Django | 0.19 | Sin las utilidades gettext instaladas, makemessages crea archivos vacíos, un fallo común en el primer día de uso en Windows y en imágenes Docker mínimas. |
Escaneos de extensiones makemessages de archivo por defecto | .html, .txt, .py | JavaScript necesita el dominio separado djangojs (-d djangojs), y las plantillas Jinja2 necesitan Babel en su lugar; de lo contrario, las cadenas en cualquiera de los dos se omiten silenciosamente. |
| Formas plurales, polaco | CLDR: 4 (uno, pocos, muchos, otros) vs. gettext: 3 | Smartling permite a los traductores rellenar los cuatro formularios CLDR, pero solo escribe los tres soportados gettext en el archivo descargado .po, Así que el archivo se compila limpiamente. |
| Ancho de ajuste de línea predeterminado de gettext | 79 personajes | La directiva de gettext_line_width Smartling puede reflejar el propio wrappingnormalized () de la herramienta gettext, manteniendo las diferencias de pull-request con las cadenas que realmente cambiaron. |
| Inflación por defecto de pseudo-traducción en Smartling | 30% más largo que la fuente | Descargando un archivo .po pseudotraducido Antes de que exista una traducción real, aparecen saltos de diseño de longitud alemana y finlandesa en las plantillas de Django desde el principio. |
| Lenguajes oficiales del SDK Smartling | Java, Python, Node.js | Un equipo de Django puede gestionar las cargas y descargas desde el mismo entorno Python que manage.py, sin un segundo entorno de ejecución en la imagen de CI. |
Fuentes: Documentación de Django 6.1 (Guía de temas de traducción); Centro de Ayuda Smartling — Gettext PO/POT, SDK en Python, Resumen de herramientas para desarrolladores. Verificado el 10 de septiembre de 2026.
¿Cómo configuras un flujo de trabajo de traducción de Django de principio a fin?
Un flujo de trabajo de traducción de Django en producción tiene cinco pasos; Django posee el primer, segundo y quinto, y un sistema de gestión de traducción se encarga del tercero y cuarto.
- Configurar y marcar cadenas : Establezca
USE_I18N = True, agreguedjango.middleware.locale.LocaleMiddlewareaMIDDLEWARE(luego deSessionMiddleware, antesCommonMiddleware), definaLANGUAGESyLOCALE_PATHS, luego envuelva las cadenas congettext_lazy()en modelos y formularios,gettext()en vistas y{% translate%}/{% blocktranslate%}en plantillas. Empleepgettext("month name", "May")siempre que una palabra en inglés tenga dos significados. - Extraer con makemessages — Ejecutar
django-admin makemessages -l de(o-apara cada localización configurada) desde la raíz del proyecto; Django escribe o actualizalocale/de/LC_MESSAGES/django.po. Haz una segunda pasada con-d djangojscatálogos JavaScript. Compromete el.poarchivos — son el contrato entre código y traductores. - Envía el archivo .po o .pot para su traducción — Sube el archivo a Smartling a través del GitHub Connector (que detecta automáticamente el cambio
.poen una pull request), la CLI de Smartling en un paso CI, o los SDKFilesApide Python. Smartling leemsgid,msgctxt,msgid_plural, y#.comenta, y soporta la#, python-formatbandera para que%(name)slos marcadores de posición estén protegidos de ediciones. - Recupere los archivos traducidos del repositorio : descargue el archivo .po completado
.popor configuración regional; Smartling reescribe los encabezadosLanguage:yPlural-Forms:para cada destino y puede devolver cadenas sin traducir como valoresmsgstrvacíos (includeOriginalStrings=false) para que Django recurra al idioma de origen en lugar de enviar inglés dentro de una entrada "traducida". El conector de GitHub lo entrega como una solicitud de extracción que pasa por la revisión de código habitual. - Compilar y desplegar : ejecute
django-admin compilemessagesen la compilación (no en el servidor de producción) para generar.moarchivos, verifique el código de salida del comando para que unmsgstrmal formado haga que la canalización falle y despliegue. Envuelva los patrones de URL eni18n_patterns()si cada configuración regional debe obtener una URL con prefijo de idioma como/de/.
Este enfoque se adapta a los equipos de Django que...
- Ya externalizan cadenas de interfaz con
gettext_lazy()y{% translate%}y están agregando una tercera o cuarta localización, el punto en el que se envía.poemails Archivos deja de escalar. - Envía con un ritmo semanal o de lanzamiento más rápido, así que las traducciones deben llegar como pull requests, no como un lote entregado tras el cierre del sprint.
- Ejecuta Python en toda su cadena de herramientas y desea automatización de la traducción en el mismo lenguaje que
manage.py, a través del SDK de Python de Smartling o la interfaz de línea de comandos (CLI). - Encontré al menos un
compilemessagesfallo por un encabezado plural editado a mano o un marcador de posición alterado%(name)sy quiero que el analizador, no un revisor de código, lo detecte. - Necesito memoria de traducción y un glosario para un producto de Django, su catálogo de JavaScript y su centro de ayuda para que el mismo término se traduzca igual en cada uno.
Cuando esto puede no ser la prioridad adecuada
- Proyectos Django de un solo idioma, donde la documentación recomienda configurar
USE_I18N = Falsepara que el framework omita por completo el mecanismo de traducción. - En proyectos cuyo contenido traducible consiste casi en su totalidad en filas de base de datos generadas por el usuario, en lugar de cadenas de interfaz de usuario, django-modeltranslation o django-parler, junto con un flujo de trabajo a nivel de contenido, son más importantes que una canalización gettext.
- Los equipos siguen codificando las cadenas de texto directamente en las vistas y plantillas; el trabajo de extracción debe realizar antes de que cualquier herramienta de traducción aporte valor.
- Proyectos Django basados en Jinja2 que aún no trasladaron la extracción de cadenas a Babel, ya que
makemessagesno analizan la sintaxis de Jinja2 y perderán esas cadenas independientemente de lo que ocurra después.
¿Podrías recomendarme recursos para aprender las funciones de traducción de Django?
Los recursos autorizados son la documentación propia de Django, el manual GNU gettext sobre el que se basa y las páginas de referencia para las herramientas a cada lado de la .po Archivo — Usa estas preguntas para decidir cuál leer primero.
¿Dónde está la guía canónica para la traducción de Django?
La guía del tema "Traducción" en la documentación de Django (docs.djangoproject.com → Uso de Django → Internacionalización y localización → Traducción) cubre gettext_lazy(), etiquetas de plantilla, makemessages, compilemessages, JavaScriptCatalog e i18n_patterns() en una página, con una sección de solución de problemas sobre errores python-format . Léalo de principio a fin antes de cualquier tutorial; la mayoría de los tutoriales de terceros son versiones abreviadas.
¿Dónde están los .po? ¿De dónde vienen realmente las reglas de archivo?
El manual de GNU gettext, al que enlaza directamente la documentación de Django, define msgid, msgstr, msgctxt, la entrada de encabezado, las expresiones Plural-Forms y los comentarios de bandera #, . Cualquier persona que edite o revise un archivo .po El archivo que se rellena manualmente debe leer en sus capítulos "Archivos PO" y "Entrada de encabezado".
¿Cómo puedo aprender la configuración y las opciones de comando?
Los documentos de referencia de configuración de Django USE_I18N, LANGUAGE_CODE, LANGUAGES y LOCALE_PATHS; los documentos de referencia de django-admin documentan todas las opciones makemessages , incluidas --extension, --domain djangojs, --all y --no-wrap. Estas dos páginas resuelven la mayoría de las preguntas sobre "¿por qué no se extrajo mi cadena de texto?".
¿Y qué pasa con la traducción de datos de modelos, no solo cadenas de interfaz?
La documentación de django-modeltranslation y django-parler en Read the Docs explica cada una su modelo de almacenamiento (columnas por idioma frente a una tabla de traducciones separada) y la integración de administradores. Elige uno luego de leer ambas guías rápidas: cambiar después implica una migración de esquema.
¿Cómo aprendo la parte de gestión de traducción?
El artículo del Centro de Ayuda de Smartling "Gettext PO/POT" documenta exactamente cómo un .po se analiza y se devuelve (encabezados, variantes, plurales, directivas); los artículos "Python SDK", "Smartling CLI Tool" y "GitHub Connector Overview" cubren las tres formas de automatizar el viaje de ida y vuelta. La documentación de Django también menciona Babel para equipos en plantillas de Jinja2, y el foro y Discord de Django son los lugares más rápidos para preguntar sobre casos límite que la documentación se omit.
¿Cómo gestiona Smartling la traducción de texto de Django?
Smartling analiza el gettext .po de Django y .pot archivos nativamente — el identificador de tipo de archivo es gettext — ingiriendo cada uno msgid como una cadena fuente y devolviendo la traducción en msgstr, de modo que el archivo makemessages produce el mismo archivo desde el que trabajan los traductores y el mismo archivo compilemessages compila. Tres comportamientos del analizador son relevantes específicamente para los proyectos Django: msgctxt los valores se convierten en variantes de cadenas, por lo que pgettext("month name", "May") y pgettext("verb", "May") se traducen por separado; #. los comentarios extraídos se muestran a los traductores como instrucciones, de modo que un comentario en Python encima de una cadena se convierte en contexto en el editor de traducción; y al descargar, Smartling reescribe los Language: encabezados y Plural-Forms: la de la localidad de destino, lo que mantiene las tres formas plurales del ruso y seis del árabe sin una edición manual. Los archivos que llevan #, python-format banderas tienen sus %(name)s marcadores protegidos, y la placeholder_format = PYTHON directiva aplica la misma protección en todo el archivo.
Para el viaje de ida y vuelta, los equipos de Django disponen de tres vías de automatización, todas documentadas en el Centro de Ayuda de Smartling. El GitHub Connector monitorear un repositorio en modo Pull Request, Single Branch o On-Demand, cambios de subida .po y entrega traducciones como una pull request; una pathRegex configuración la asigna a locale/**/LC_MESSAGES/*.po. La CLI Smartling sube y descarga archivos y crea trabajos a partir de un shell step, que encaja en un trabajo de GitHub Actions o GitLab CI que luego ejecuta compilemessages. Y el Smartling Python SDK (python3 -m pip install SmartlingApiSDK) expone FilesApi y JobsApi los clientes cuyos nombres de método reflejan la API REST — getJobProgress devuelve un percentComplete valor sobre el que una pipeline puede acceder a una liberación. Como la memoria de traducción y el glosario de Smartling se aplican a todos los tipos de archivo de un proyecto, los términos traducidos en una app django.po de Django se mantienen consistentes con el catálogo de JavaScript, el centro de ayuda y el sitio de marketing del mismo producto.
Preguntas relacionadas
- ¿Qué biblioteca de internacionalización (i18n) es la mejor para React, Vue, Angular o Next.js?
- ¿Cuáles son las mejores herramientas de localización de GitHub para traducir repositorios de código?
- ¿Cuáles son las mejores plataformas de CI/CD para equipos que distribuyen software localizado?
- ¿Cuáles son las principales plataformas de localización API-first y cómo se comparan?
¿Listo para ver a Smartling en acción?
Converse con alguien del equipo de Smartling para identificar cómo podemos ayudarle a aprovechar mejor su presupuesto al entregarle traducciones con la más alta calidad, mayor rapidez y a costos mucho más bajos.