← Назад к вопросам
Как сделать определенную строку в шаблоне переводимой в Django?
2.2 Middle🔥 91 комментариев
#Django
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Интернационализация (i18n) строк в Django шаблонах
Мнгие приложения нужно переводить на разные языки. Django имеет встроенную систему локализации для этого.
Основной способ: тег load i18n
1. Простой текст с тегом trans
{% load i18n %}
<!-- Простая строка для перевода -->
<h1>{% trans "Welcome to our site" %}</h1>
<!-- Со значением по умолчанию -->
<p>{% trans "Hello" %}</p>
<!-- С переменной (внимание: нельзя использовать переменные прямо!) -->
<p>{% trans "Hello" %} {{ username }}</p>
2. Блоки текста: blocktrans
Для более длинных текстов с переменными:
{% load i18n %}
<!-- Блок текста с переменной -->
{% blocktrans %}Welcome {{ username }} to our site{% endblocktrans %}
<!-- С параметром count для плюралей -->
{% blocktrans count counter=items.count %}
You have one item
{% plural %}
You have {{ counter }} items
{% endblocktrans %}
<!-- С переменной, назначенной до -->
{% with total=business.employees.count %}
{% blocktrans count total_employees=total %}
There is {{ total_employees }} employee
{% plural %}
There are {{ total_employees }} employees
{% endblocktrans %}
{% endwith %}
Пример: полный workflow
Шаг 1: Создание шаблона с переводимыми строками
<!-- templates/index.html -->
{% load i18n %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>{% trans "My Site" %}</title>
</head>
<body>
<h1>{% trans "Welcome" %}</h1>
<p>{% trans "Hello" %}, {{ user.first_name }}</p>
{% blocktrans count user_count=users.count %}
There is {{ user_count }} active user
{% plural %}
There are {{ user_count }} active users
{% endblocktrans %}
<button>{% trans "Click here" %}</button>
</body>
</html>
Шаг 2: Конфигурация Django settings.py
# settings.py
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# Приложения для i18n
]
# Поддерживаемые языки
LANGUAGE_CODE = 'en-us' # По умолчанию
LANGUAGES = [
('en', 'English'),
('ru', 'Русский'),
('es', 'Español'),
('fr', 'Français'),
]
# Включи i18n
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Местоположение файлов локализации
LOCALE_PATHS = [
BASE_DIR / 'locale',
]
# Middleware для определения языка
MIDDLEWARE = [
'django.middleware.common.CommonMiddleware',
'django.middleware.locale.LocaleMiddleware', # ДОЛЖЕН быть после SessionMiddleware
# остальные middleware
]
Шаг 3: Извлечение строк
# Создай .po файлы для перевода
python manage.py makemessages -l ru
# Создаст: locale/ru/LC_MESSAGES/django.po
# Для всех языков сразу
python manage.py makemessages -a
Шаг 4: Перевод строк
# locale/ru/LC_MESSAGES/django.po
#: templates/index.html:5
msgid "My Site"
msgstr "Мой сайт"
#: templates/index.html:9
msgid "Welcome"
msgstr "Добро пожаловать"
msgid "Hello"
msgstr "Привет"
#: templates/index.html:17
msgid "Click here"
msgstr "Нажми здесь"
#: templates/index.html:13
msgid "There is %(user_count)s active user"
msgid_plural "There are %(user_count)s active users"
msgstr[0] "Есть %(user_count)s активный пользователь"
msgstr[1] "Есть %(user_count)s активных пользователя"
msgstr[2] "Есть %(user_count)s активных пользователей"
Шаг 5: Компиляция переводов
# Преобразуй .po в бинарные .mo файлы
python manage.py compilemessages
# Создаст: locale/ru/LC_MESSAGES/django.mo
Переводы в Python коде
# views.py
from django.utils.translation import gettext as _
from django.utils.translation import gettext_lazy
# Для immediate translation
def my_view(request):
message = _("Welcome to our site")
return HttpResponse(message)
# Для lazy translation (рекомендуется для моделей)
from django.db import models
class Article(models.Model):
title = models.CharField(
max_length=100,
help_text=gettext_lazy("Title of the article")
)
class Meta:
verbose_name = gettext_lazy("Article")
verbose_name_plural = gettext_lazy("Articles")
Плюралии
Джанго автоматически обрабатывает плюралии для каждого языка:
<!-- В шаблоне -->
{% blocktrans count items=products.count %}
There is one product
{% plural %}
There are {{ items }} products
{% endblocktrans %}
<!-- В Python -->
from django.utils.translation import ngettext
message = ngettext(
'There is one item',
'There are %(count)d items',
count
) % {'count': count}
Переводы с контекстом
Одна и та же строка может переводиться по-разному в разных контекстах:
<!-- May - месяц или глагол "может" -->
{% trans "May" context "month" %}
{% trans "May" context "verb" %}
<!-- В Python -->
from django.utils.translation import pgettext
month = pgettext('month', 'May')
verb = pgettext('verb', 'May')
Определение языка
Способ 1: через URL параметр
# urls.py
from django.conf.urls.i18n import i18n_patterns
from django.views.i18n import set_language
urlpatterns = [
# URL с префиксом языка
# /en/about -> English
# /ru/about -> Russian
]
i18n_urlpatterns = i18n_patterns(
path('about/', views.about),
path('contact/', views.contact),
)
urlpatterns += i18n_urlpatterns
Способ 2: через LocaleMiddleware
# settings.py
MIDDLEWARE = [
'django.middleware.locale.LocaleMiddleware',
]
# Порядок определения языка:
# 1. GET параметр 'django_language'
# 2. Cookie 'django_language'
# 3. Accept-Language header
# 4. LANGUAGE_CODE из settings
Способ 3: явно переключать язык
<!-- Форма для выбора языка -->
<form method="post" action="{% url 'set_language' %}">
{% csrf_token %}
<select name="language">
{% get_available_languages as languages %}
{% for code, name in languages %}
<option value="{{ code }}">{{ name }}</option>
{% endfor %}
</select>
<button type="submit">Change Language</button>
</form>
JavaScript переводы
// Для переводов в JavaScript используй django.gettext
<script>
const message = gettext("Welcome");
console.log(message); // Will be translated
</script>
<!-- Или загрузи переводы -->
<script src="{% url 'django.views.i18n.javascript_catalog' %}"></script>
<script>
console.log(gettext("Welcome"));
</script>
Форматирование даты и времени
<!-- Автоматическое форматирование по языку -->
<p>{% now "SHORT_DATE_FORMAT" %}</p>
<p>{% now "j F Y" %}</p> <!-- День Месяц Год -->
<!-- В Python -->
from django.utils.formats import date_format
formatted = date_format(datetime.now(), "SHORT_DATE_FORMAT")
Лучшие практики
✅ Делай так:
<!-- 1. Используй trans для коротких строк -->
<h1>{% trans "Welcome" %}</h1>
<!-- 2. Используй blocktrans для длинных с переменными -->
{% blocktrans %}Hello {{ name }}{% endblocktrans %}
<!-- 3. Используй gettext_lazy в моделях -->
class Product(models.Model):
name = models.CharField(max_length=100)
description = models.CharField(
max_length=500,
help_text=gettext_lazy("Describe the product")
)
<!-- 4. Используй контекст при необходимости -->
{% trans "Save" context "action" %}
<!-- 5. Запускай makemessages перед деплоем -->
python manage.py makemessages -a
python manage.py compilemessages
❌ Не делай так:
<!-- 1. Не переводи переменные напрямую -->
<!-- ПЛОХО: -->
{% trans name %} <!-- name не переведётся! -->
<!-- ХОРОШО: -->
{{ name }}
<!-- 2. Не забывай load i18n -->
<!-- ПЛОХО: -->
{% trans "Hello" %} <!-- Ошибка! -->
<!-- ХОРОШО: -->
{% load i18n %}
{% trans "Hello" %}
<!-- 3. Не переводи динамический контент в коде -->
# ПЛОХО:
message = "Welcome " + user.name
return HttpResponse(_(message))
# ХОРОШО:
message = _("Welcome") + " " + user.name
return HttpResponse(message)
Проверка и отладка
# Посмотри какие строки нужно перевести
python manage.py makemessages --no-wrap
# Проверь что переводы скомпилированы
ls locale/ru/LC_MESSAGES/django.mo
# Очистить кэш переводов
from django.core.management import call_command
call_command('compilemessages')
# В шаблоне проверь язык
<!-- Текущий язык: {{ LANGUAGE_CODE }} -->
Заключение
Мультиязычность в Django — это встроенная возможность которая позволяет:
- Помечать строки с
{% trans %}и{% blocktrans %} - Извлекать строки с
makemessages - Переводить через .po файлы
- Компилировать в .mo файлы
- Отдавать нужный язык пользователю через middleware
Главное: всегда используй gettext_lazy в моделях и помни загружать {% load i18n %} в шаблонах!