Как реализовать поддержку нескольких языков (i18n) в Django?

«Как реализовать поддержку нескольких языков (i18n) в Django?» — вопрос из категории Django, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для реализации мультиязычности в Django используется встроенный фреймворк интернационализации (i18n). Он позволяет помечать строки для перевода, создавать файлы с переводами и автоматически определять язык пользователя. **Основные шаги:** 1. **Настройка `settings.py`** Активируйте i18n, определите поддерживаемые языки и добавьте `LocaleMiddleware`, который определяет язык на основе запроса (например, из URL-префикса или заголовков). ```python # settings.py USE_I18N = True LANGUAGES = [ ('en', 'English'), ('ru', 'Russian'), ] # LocaleMiddleware должен быть после SessionMiddleware и до CommonMiddleware MIDDLEWARE = [ # ... 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', # ... ] ``` 2. **Разметка строк для перевода** Используйте `gettext` в Python коде и тег `trans` в шаблонах. * **В Python (`views.py`, `models.py`):** ```python from django.utils.translation import gettext_lazy as _ class MyModel(models.Model): name = models.CharField(_("model name"), max_length=100) ``` * **В шаблонах Django:** ```html {% load i18n %}

{% trans "Welcome to our site!" %}

``` 3. **Создание и компиляция файлов перевода** Эти команды сканируют проект на наличие помеченных строк и создают/обновляют файлы перевода (`.po`). ```bash # Создать или обновить файлы для русского языка python manage.py makemessages -l ru # После заполнения .po файла, скомпилировать его в .mo для использования Django python manage.py compilemessages ``` Файлы перевода находятся в директории `locale//LC_MESSAGES/`. 4. **Настройка URL-адресов** Используйте `i18n_patterns` для автоматического добавления языкового префикса к URL (`/en/...`, `/ru/...`). ```python # urls.py from django.conf.urls.i18n import i18n_patterns urlpatterns += i18n_patterns( path('admin/', admin.site.urls), path('about/', views.about, name='about'), # ... другие URL для перевода ) ```