Интернационализация, часто обозначаемая аббревиатурой i18n, предполагает адаптацию проекта к местным особенностям, делая его доступным на разных языках, в разных культурах и регионах.

Django обеспечивает всестороннюю поддержку интернационализации, позволяя разработчикам создавать веб-сайты, которые можно легко перевести и локализовать. Платформа включает в себя множество функций, таких как перевод шаблонов, языковые настройки, форматирование даты и управление часовыми поясами.

Цель этой статьи — дать введение в различные концепции интернационализации в Django. Для получения более подробной информации документация предлагает очень точное руководство.

i18n Конфигурация

Интернационализация с Django начинается с общей конфигурации проекта.

По умолчанию язык Django установлен на LANGUAGE_CODE="en-US". Это можно изменить в файле settings.py на любой язык в формате ISO (например, fr-FR для Франции, fr-BE для Бельгии и т. д.).

Промежуточное ПО, отвечающее за локализацию (django.middleware.locale.LocaleMiddleware), выполняет автоматическое определение и выбор языка на основе элементов переданного запроса. По умолчанию Django запоминает язык браузера, но можно сохранить файл cookie, чтобы сохранить пользовательские настройки. Вы также можете рассмотреть возможность использования пользовательского промежуточного программного обеспечения для извлечения языка из информации, хранящейся в базе данных для вошедшего в систему пользователя.

Переменная USE_I18N должна быть установлена ​​на True, чтобы позволить Django использовать инструменты интернационализации. У вас также есть возможность изменить другие элементы, такие как форматирование даты, использование часового пояса и форматирование чисел.

В файле settings.py вашего проекта начните с определения списка языков, поддерживаемых вашим приложением.

LANGUAGES = [
 ("en", "English"),
 ("fr", "Français"),
]

Перевод шаблона

Чтобы использовать интернационализацию в шаблонах, вам нужно загрузить необходимые инструменты с помощью {% load i18n %}. Затем вы можете использовать такие теги, как {% trans "Lorem Ipsum" %} или {% blocktrans %}Lorem Ipsum{% endblocktrans %}, для перевода текста непосредственно в файле HTML.

Django также интегрирует инструменты для управления различными форматами даты, времени и множественного числа в зависимости от локали пользователя. Десятичные разделители и разделители тысяч также могут быть адаптированы.

В шаблонах у вас есть доступ к различным тегам для получения информации о переводе. Например, {% get_current_language %} возвращает информацию о текущем языке, {% get_available_languages %} возвращает список доступных языков. Эти элементы могут быть полезны для отображения контента, зависящего от языка, или для реализации селектора языка.

Файлы перевода

Переводы хранятся в файлах, содержащих переведенные тексты. Перевод облегчается за счет использования файлов Portable Object (PO) и Machine Object (MO).

Команда python manage.py makemessages -l fr генерирует файлы .po (Portable Object), используемые для перевода. Команда python manage.py compilemessages -l fr генерирует файлы .mo (Machine Object), которые будут вызываться приложением для отображения правильного перевода в соответствующем месте.

Файлы перевода хранятся в папках, обозначенных LOCALE_PATHS. Вы можете получить к ним доступ с помощью специальных редакторов, таких как Poedit, или изменить файлы непосредственно в предпочитаемом вами текстовом редакторе.

Django просматривает эти папки, чтобы обнаружить доступные переводы, соответствующие поддерживаемым языкам.

Перевод представлений и моделей

Также возможно переводить элементы вне шаблонов, такие как представления и модели в Django.

from django.utils.translation import gettext as _

output = _("Bonjour")

Для получения переведенного текста Django предоставляет два метода: gettext() и gettext_lazy(). Оба метода служат одной и той же цели: возвращают текст, соответствующий локализации, путем извлечения файлов перевода.

Однако между ними есть несколько различий:

- gettext() - это немедленно оцениваемая функция, которая возвращает перевод. Это означает, что эта функция может игнорировать язык, выбранный промежуточным программным обеспечением, при использовании в представлении или другом модуле из-за жизненного цикла приложения.
- gettext_lazy() возвращает объект Lazy, который будет оцениваться позже, когда потребуется результат. Эта функция в основном используется в моделях, формах и apps.py.

Эти функции можно эффективно использовать для обеспечения локализации URL-адресов.

from django.conf.urls.i18n import i18n_patterns
from django.urls import path
from django.utils.translation import gettext_lazy as _
from django.views.generic import TemplateView


urlpatterns += i18n_patterns(
  path(_("hello-world/"), TemplateView.as_view(template_name="hello_world.html"), name="hello"),
  prefix_default_language=False,
)

Использование i18n_patterns для обработки URL-адресов обеспечивает доступ к определенным функциям, таким как добавление префикса языка по умолчанию к URL-адресу или представление изменения языка. Представление изменения языка с помощью запроса POST позволяет изменить используемый язык и сохранить файл cookie с пользователем, чтобы сохранить его предпочтения.