localize.dev

Documentación / Django

Traducción de plantillas de Django, automatizada

Envuelva el texto duro en plantillas de Django con las etiquetas translate y blocktranslate, complete los catálogos .po de gettext y active LocaleMiddleware, todo en un solo comando o solicitud de extracción.

Cómo funciona

El texto plano se convierte en {% translate "…" %}; el texto con variables se convierte en {% blocktranslate with name=user.name %}…{% endblocktranslate %}, y {% load i18n %} se agrega después de {% extends %}.

Los plurales escritos al estilo de Django, {{ n }} item{{ n|pluralize }}, se convierten en {% blocktranslate count count=n %}…{% plural %}…{% endblocktranslate %} con msgid_plural y una forma por cada slot de Plural-Forms.

Las traducciones van directamente a locale/<lang>/LC_MESSAGES/django.po, indexadas por el texto original como lo haría makemessages: se mantienen las entradas existentes, se rellenan las vacías y se añaden las nuevas. Ejecute compilemessages para generarlas. (El catálogo a continuación proviene del ejemplo offline, por lo que sus traducciones están vacías.)

Antes y después

La salida real del motor para este archivo. En una ejecución real, el modelo alojado nombra las claves a partir del contexto.

shop/templates/shop/cart.html · antes
{% extends "base.html" %}
{% block content %}
<h1>Hi {{ user.first_name }}, welcome back</h1>
<input placeholder="Search products">
{% endblock %}
shop/templates/shop/cart.html · después
{% extends "base.html" %}
{% load i18n %}
{% block content %}
<h1>{% blocktranslate with first_name=user.first_name %}Hi {{ first_name }}, welcome back{% endblocktranslate %}</h1>
<input placeholder="{% translate 'Search products' %}">
{% endblock %}
locale/es/LC_MESSAGES/django.po
msgid ""
msgstr ""
"Project-Id-Version: app\n"
"PO-Revision-Date: 2026-11-11 19:53+0000\n"
"Last-Translator: localize.dev <https://uselocalize.dev>\n"
"Language-Team: Spanish\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

msgid "Hi %(first_name)s, welcome back"
msgstr ""

msgid "Search products"
msgstr ""

Lo que añade la configuración

La primera ejecución configura i18n de Django (gettext) si el proyecto aún no lo tiene:

  • USE_I18N = True, LANGUAGES y LOCALE_PATHS en la configuración
  • LocaleMiddleware después del middleware de sesión

Ejecutarlo

La CLI necesita Node.js 22 o posterior, nada más: npx lo ejecuta sin añadir un package.json al proyecto. ¿No tienes Node en tu máquina? La GitHub Action de abajo la ejecuta por ti.

npx localize-dev login

# Preview, then write the changes
npx localize-dev run --dry-run -l es,fr,de
npx localize-dev run -l es,fr,de

# Or open a pull request instead
npx localize-dev pr -l es,fr,de

O añade la GitHub Action y obtén una pull request en cada push. Pruébalo primero en tu propio código en el playground.