\n\n\n\n\n```\n\n## Форматирование даты и времени\n\n```html\n\n

{% now \"SHORT_DATE_FORMAT\" %}

\n

{% now \"j F Y\" %}

\n\n\nfrom django.utils.formats import date_format\n\nformatted = date_format(datetime.now(), \"SHORT_DATE_FORMAT\")\n```\n\n## Лучшие практики\n\n### ✅ Делай так:\n\n```html\n\n

{% trans \"Welcome\" %}

\n\n\n{% blocktrans %}Hello {{ name }}{% endblocktrans %}\n\n\nclass Product(models.Model):\n name = models.CharField(max_length=100)\n description = models.CharField(\n max_length=500,\n help_text=gettext_lazy(\"Describe the product\")\n )\n\n\n{% trans \"Save\" context \"action\" %}\n\n\npython manage.py makemessages -a\npython manage.py compilemessages\n```\n\n### ❌ Не делай так:\n\n```html\n\n\n{% trans name %} \n\n{{ name }}\n\n\n\n{% trans \"Hello\" %} \n\n{% load i18n %}\n{% trans \"Hello\" %}\n\n\n# ПЛОХО:\nmessage = \"Welcome \" + user.name\nreturn HttpResponse(_(message))\n\n# ХОРОШО:\nmessage = _(\"Welcome\") + \" \" + user.name\nreturn HttpResponse(message)\n```\n\n## Проверка и отладка\n\n```bash\n# Посмотри какие строки нужно перевести\npython manage.py makemessages --no-wrap\n\n# Проверь что переводы скомпилированы\nls locale/ru/LC_MESSAGES/django.mo\n\n# Очистить кэш переводов\nfrom django.core.management import call_command\ncall_command('compilemessages')\n\n# В шаблоне проверь язык\n\n```\n\n## Заключение\n\nМультиязычность в Django — это **встроенная возможность** которая позволяет:\n1. **Помечать строки** с `{% trans %}` и `{% blocktrans %}`\n2. **Извлекать строки** с `makemessages`\n3. **Переводить** через .po файлы\n4. **Компилировать** в .mo файлы\n5. **Отдавать нужный язык** пользователю через middleware\n\nГлавное: всегда используй `gettext_lazy` в моделях и помни загружать `{% load i18n %}` в шаблонах!","dateCreated":"2026-03-22T20:41:44.436450","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

Как сделать определенную строку в шаблоне переводимой в 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 — это встроенная возможность которая позволяет:

  1. Помечать строки с {% trans %} и {% blocktrans %}
  2. Извлекать строки с makemessages
  3. Переводить через .po файлы
  4. Компилировать в .mo файлы
  5. Отдавать нужный язык пользователю через middleware

Главное: всегда используй gettext_lazy в моделях и помни загружать {% load i18n %} в шаблонах!

Как сделать определенную строку в шаблоне переводимой в Django? | PrepBro