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.
{% extends "base.html" %}
{% block content %}
<h1>Hi {{ user.first_name }}, welcome back</h1>
<input placeholder="Search products">
{% endblock %}{% 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 %}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,LANGUAGESyLOCALE_PATHSen la configuraciónLocaleMiddlewaredespué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,deO 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.