Volver al blog

Traducción en Django para desarrolladores independientes: de semanas a minutos

2026-02-11 8 min de lectura
Traducción en Django para desarrolladores independientes: de semanas a minutos

Construiste una aplicación Django. Funciona, los usuarios se están registrando, y ahora quieres llegar a personas que no hablan inglés. El problema es evidente en cuanto lo miras: el framework de internacionalización de Django es excelente para extraer cadenas traducibles, pero no hace absolutamente nada para completar las traducciones. Esa parte depende de ti.

Si eres un desarrollador en solitario o un equipo de dos personas, la brecha entre makemessages y una aplicación completamente traducida puede parecer enorme. Voy a repasar las opciones realistas, explicar por qué la mayoría no funcionan para equipos pequeños, y mostrar un flujo de trabajo que convierte la traducción de una tarea de varias semanas en un comando de dos minutos.

Las Opciones Tradicionales (y Por Qué Duelen)

Opción 1: Copiar y Pegar desde Google Translate

El primer intento más común. Abres tu archivo .po, copias cada msgid en Google Translate, pegas el resultado como msgstr, y repites. Para cada cadena. En cada idioma.

Una aplicación Django típica tiene entre 200 y 500 cadenas traducibles. Si estás traduciendo a cinco idiomas, eso son entre 1,000 y 2,500 ciclos de copiar y pegar. Incluso si cada uno toma solo 30 segundos, estamos hablando de 8 a 20 horas de trabajo tedioso. Y eso es antes de corregir los errores de formato, los marcadores de posición rotos y la terminología inconsistente que inevitablemente aparecen.

Peor aún, tienes que hacerlo todo de nuevo en el siguiente sprint cuando agregas nuevas cadenas.

Opción 2: Traductores Profesionales

La traducción profesional normalmente cuesta entre $0.10 y $0.25 por palabra. Una aplicación Django con 500 cadenas de un promedio de 8 palabras cada una suma aproximadamente 4,000 palabras. A $0.15/palabra, eso son $600 por idioma, o $3,000 para cinco idiomas.

Para una startup con financiación de capital riesgo, eso es un error de redondeo. Para un desarrollador en solitario que cobra $9/mes por usuario, puede comerse todos los ingresos del trimestre.

Opción 3: Fiverr y Mercados de Freelancers

Puedes encontrar traductores en Fiverr por $20-50 por idioma. Algunos son genuinamente hábiles. Muchos simplemente pegan tu texto en Google Translate y te cobran por el privilegio. Terminas con la misma calidad que la Opción 1, más una ronda extra de comunicación y una semana de espera.

Opción 4: Crowdin, Transifex o Weblate

Estas plataformas son potentes, pero están diseñadas para proyectos con equipos de traducción dedicados. La sobrecarga de configuración (sincronizar repositorios, configurar memorias de traducción, gestionar acceso de colaboradores) es excesiva cuando eres la única persona en el proyecto. Las suscripciones mensuales empiezan en $30-150/mes para niveles de pago, e incluso los niveles gratuitos requieren que mantengas otra integración de terceros más.

Opción 5: Pegar Todo en ChatGPT

Esto en realidad funciona sorprendentemente bien en cuanto a calidad. Pegas el contenido de tu archivo .po en ChatGPT o Claude, pides traducciones y obtienes resultados razonables. El problema es que no escala. Tienes que extraer manualmente las cadenas sin traducir, formatear el prompt, analizar la respuesta de vuelta al formato .po, y manejar el procesamiento por lotes cuando excedes los límites de contexto. Funciona una vez. Se desmorona como flujo de trabajo repetible.

El Enfoque de Automatización

¿Y si todo el paso de traducción fuera un solo comando? Esa es la idea detrás de TranslateBot, un comando de gestión Django de código abierto que lee tus archivos .po, envía las cadenas sin traducir a un proveedor de IA y escribe las traducciones de vuelta en el formato correcto.

Así es como se configura.

Paso 1: Instalar TranslateBot

uv add --dev translatebot-django

O con pip:

pip install translatebot-django

Agrégalo a tus aplicaciones instaladas:

# settings.py
INSTALLED_APPS = [
    # ...
    'translatebot_django',
]

Paso 2: Configura Tu Proveedor de IA

Agrega dos configuraciones:

# settings.py
import os

TRANSLATEBOT_API_KEY = os.getenv("OPENAI_API_KEY")
TRANSLATEBOT_MODEL = "gpt-4o-mini"

TranslateBot funciona con OpenAI, Anthropic Claude, Google Gemini y más de 100 modelos a través de LiteLLM. También soporta DeepL como backend de traducción dedicado.

Paso 3: Crea un TRANSLATING.md (Opcional pero Recomendado)

Un archivo TRANSLATING.md en la raíz de tu proyecto le da al IA contexto sobre tu aplicación. Esto es lo que separa la traducción automática genérica de traducciones que realmente se ajustan a tu producto:

# Translation Context

## About This Project
A personal finance tracker for freelancers. Users track invoices,
expenses, and tax obligations.

## Tone
- Friendly and informal
- Use "du" in German, "tu" in French
- Keep financial terms precise

## Terminology
- "invoice" = "Rechnung" (German), "facture" (French)
- "dashboard" = keep as English loanword in all languages
- "freelancer" = keep as English loanword in German

Este archivo se envía junto con cada solicitud de traducción, para que la IA use consistentemente el tono y la terminología correctos.

Paso 4: Traducir

python manage.py makemessages -l de -l fr -l nl -l es -l ja
python manage.py translate
python manage.py compilemessages

Tres comandos. Eso es todo. TranslateBot encuentra todas las cadenas sin traducir en todos tus archivos .po, las traduce en lotes y escribe los resultados de vuelta. Por defecto solo se traducen las entradas vacías, así que ejecutar el comando de nuevo después de agregar nuevas cadenas solo traduce las nuevas.

Cómo Se Ve Esto en la Práctica

Aquí hay un flujo de trabajo realista de sprint para un desarrollador en solitario que soporta cinco idiomas:

Lunes: Construyes una nueva funcionalidad. Agregas algunas nuevas cadenas traducibles usando gettext() y {% trans %} mientras desarrollas.

from django.utils.translation import gettext_lazy as _

class InvoiceView(View):
    def post(self, request):
        # New string added during development
        messages.success(request, _("Invoice sent successfully."))

Antes de hacer commit: Ejecutas tres comandos:

python manage.py makemessages -a --no-obsolete
python manage.py translate
python manage.py compilemessages

El comando translate detecta las nuevas entradas sin traducir y traduce solo esas. Si agregaste 5 nuevas cadenas y soportas 5 idiomas, hace 25 traducciones en una sola llamada a la API. Todo el proceso toma menos de un minuto.

Haces commit de tu código, plantillas y archivos .po/.mo actualizados juntos. Las traducciones son parte de tu flujo de desarrollo normal, no un proyecto separado.

Vista Previa Antes de Hacer Commit

Si quieres ver las traducciones antes de que se escriban en disco, usa el modo dry-run:

python manage.py translate --dry-run

Esto imprime cada traducción en la terminal sin modificar ningún archivo.

La Comparación de Costos

Aquí es donde la automatización se vuelve difícil de rebatir.

Enfoque 500 cadenas, 5 idiomas Tiempo Costo recurrente
Copiar y pegar manual Gratis ~40 horas ~8 hrs/sprint
Traductores profesionales ~$3,000 1-2 semanas ~$600/sprint
Traductores de Fiverr ~$100-250 3-7 días ~$50/sprint
Crowdin/Transifex $30-150/mes Config: horas Continuo
TranslateBot + GPT-4o-mini ~$0.05 ~2 minutos ~$0.01/sprint
TranslateBot + DeepL Free $0 ~2 minutos $0

Una aplicación Django pequeña a mediana con alrededor de 500 cadenas traducibles normalmente cuesta menos de $0.01 por idioma con gpt-4o-mini. Para la mayoría de proyectos en solitario, el nivel gratuito de DeepL (500,000 caracteres/mes) cubre todo sin costo alguno.

Para ser claros: las traducciones de IA no son perfectas. Las traducciones humanas económicas tampoco lo son. La diferencia es que las traducciones de IA cuestan casi nada, llegan al instante y se pueden re-ejecutar cuando quieras.

Integración con CI: Nunca Publiques Cadenas Sin Traducir

Uno de los patrones más útiles que he encontrado como desarrollador en solitario es agregar una verificación de traducciones al CI. TranslateBot incluye un comando check_translations que falla si algún archivo .po tiene entradas sin traducir o difusas:

# .github/workflows/ci.yml
jobs:
  translations:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: astral-sh/setup-uv@v4
        with:
          enable-cache: true
      - run: uv python install
      - run: uv sync --frozen
      - name: Install gettext
        run: sudo apt-get update && sudo apt-get install -y --no-install-recommends gettext
      - name: Check translations
        run: uv run python manage.py check_translations --makemessages

Si agregas una nueva etiqueta {% trans %} en una plantilla y olvidas ejecutar translate, el CI lo detectará:

locale/de/LC_MESSAGES/django.po: 1 untranslated, 0 fuzzy
locale/fr/LC_MESSAGES/django.po: 1 untranslated, 0 fuzzy
CommandError: Translation check failed

Esto convierte las traducciones de algo que recuerdas hacer en algo que no puedes olvidar.

Consejos Prácticos

Empieza con dos o tres idiomas. No necesitas lanzar en 15 idiomas el primer día. Elige los que tengan más usuarios o el mayor mercado direccionable. Alemán, francés y español cubren mucho terreno en los mercados europeos.

Haz que hablantes nativos revisen las cadenas críticas. Las traducciones de IA son suficientemente buenas para la mayoría del texto de la interfaz, pero el titular de tu página de inicio y el flujo de incorporación merecen una revisión humana. Pide a un amigo, un usuario o alguien en un foro de la comunidad que dedique 10 minutos a revisar las cadenas más visibles.

Usa dry-run antes de sobrescribir. Si alguna vez necesitas re-traducir todo (por ejemplo, después de actualizar tu TRANSLATING.md con mejores pautas de terminología), previsualiza los cambios primero:

python manage.py translate --overwrite --dry-run

Mantén TRANSLATING.md en control de versiones. Es parte de la configuración de traducción de tu proyecto. Cuando actualices las pautas de terminología o tono, la siguiente ejecución de translate reflejará esos cambios para cualquier cadena nueva.

Traduce por aplicación cuando sea necesario. Si solo cambiaste cadenas en una aplicación, puedes limitar el alcance de la traducción:

python manage.py translate --app billing

De Semanas a Minutos

El framework de internacionalización de Django es uno de los mejores en cualquier framework web. Las herramientas para makemessages, directorios de locale y compilemessages son maduras y confiables. La única pieza que faltaba era el paso de traducción en sí. Eso solía ser la parte cara y lenta.

Con TranslateBot, el flujo de trabajo se convierte en:

  1. Escribe código con gettext() y {% trans %} como de costumbre
  2. Ejecuta makemessages para extraer cadenas
  3. Ejecuta translate para completar las traducciones
  4. Ejecuta compilemessages para compilar
  5. Haz commit de todo junto

Para un desarrollador en solitario, esto significa que la localización ya no es un proyecto que planeas para "algún día". Es algo que puedes hacer hoy, en el tiempo que toma preparar una taza de café.

TranslateBot es de código abierto y está disponible en PyPI y GitHub. Instálalo, ejecuta el comando y ve tu aplicación en un nuevo idioma en minutos.

Deja de editar archivos .po manualmente

TranslateBot automatiza las traducciones de Django con IA. Un comando, todos tus idiomas, centavos por traducción.