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

Ответ

Для реализации мультиязычности в 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 для перевода ) ```

Ответ 18+ 🔞

А, вот ты про мультиязычность в Джанго спрашиваешь! Ну это, блядь, целая история, ёпта. Система там, конечно, не сказать чтобы простая, но если разобраться — хуй с горы, всё встанет на свои места. Слушай сюда, сейчас разжую. Так, для начала, в Джанго за это отвечает встроенная штука — интернационализация, или i18n для краткости. По сути, она позволяет тебе помечать куски текста, которые надо перевести, а потом подсовывать пользователю нужную версию в зависимости от его языка. Хитрая жопа, но работает. **Основные шаги, которые надо проделать:** 1. **Ковыряемся в `settings.py`** Тут надо включить эту всю движуху, указать, на какие языки мы вообще способны, и впихнуть в середину проекта специальный промежуточный слой — `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. **Размечаем всё, что шевелится** Теперь надо пройтись по всему коду и шаблонам, и везде, где есть текст для юзера, обернуть его в специальные вызовы. В коде на Python используем `gettext`, а в шаблонах — тег `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 # Эта команда прочёсывает весь проект и создаёт/обновляет файлы для русского языка. # Внимание: она ищет строки, обёрнутые в _() или {% trans %}. python manage.py makemessages -l ru # Дальше ты идешь в папку `locale/ru/LC_MESSAGES/`, открываешь файл `django.po` и, # о ужас, вручную заполняешь переводы напротив каждой строки. Терпения ебать ноль нужно. # После того как настрадался и всё заполнил, компилируешь файлы в бинарный `.mo` формат, # который Джанго уже сможет быстро читать. python manage.py compilemessages ``` 4. **Подгоняем URL-адреса** Чтобы у каждого языка был свой уголок, используют `i18n_patterns`. Эта штука автоматически добавляет к твоим URL-адресам префикс языка. Получается красиво: `/en/about/`, `/ru/about/`. ```python # urls.py from django.conf.urls.i18n import i18n_patterns # Обычные урлы (например, для админки) оставляем снаружи, # а те, что должны быть на разных языках, засовываем в i18n_patterns. urlpatterns += i18n_patterns( path('about/', views.about, name='about'), path('news/', views.news, name='news'), # ... все остальные переводимые пути ) ``` Вот, в общих чертах, и вся ёперная система. Сначала кажется, что овердохуища работы, но когда настроишь — живёшь припеваючи. Главное — не забывать компилировать сообщения после правок, а то будешь сидеть и думать: «Почему блядь перевод не появляется?!». А оно, сука, не скомпилировано.