тел.: 8 (4212)20-79-81

Fogstream блог


Многоязычность в Django

Встала задача сделать двуязычный сайт (ru, en). Чтобы в урле отражался текущий язык и его можно было поменять как правкой урла, так и нажатием на соответствующую ссылку. Как, допустим, вот тут. В общем, стандартная ситуация, ничего нового, ничего сверхестественного. Казалось бы, джанго должен справиться с этим без проблем (что, собственно, так и есть), однако найти как это все нужно реализовывать с ходу мне не удалось. Не знаю, возможно эта задача настолько тривиальна и ясна для любого джанго программиста, что на поверхности не нашлось ни одного полного руководства, но мне пришлось склеивать информацию из разных источников, чтобы получить полноценный правильно работающий вариант.

Для начала сделаем переключение языков по ссылке (текущий язык не будет отображаться в урле). Как здесь.

Во-первых, необходимо подправить настройки проекта в settings.py:

LANGUAGE_CODE = 'ru'
ugettext = lambda s: s
LANGUAGES = (
 ('ru', ugettext('Russian')),
 ('en', ugettext('English')),
)

Добавить строчку ‘django.middleware.locale.LocaleMiddleware’ в MIDDLEWARE_CLASSES:

MIDDLEWARE_CLASSES = (
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.locale.LocaleMiddleware',
 'django.middleware.common.CommonMiddleware',
)

Это все описано вот тут. Собственно, это все необходимые настройки.

Текущий язык можно получить из реквеста:

request.LANGUAGE_CODE

Либо с помощью модуля translation:

django.utils.translation.get_language()

В шаблонах необходимо подгрузить i18n:

{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}

Либо просто:

{{ LANGUAGE_CODE }}

Для смены языка можно воспользоваться встроенной вьюшкой django.views.i18n.set_language(). Необходимо только добавить ее в ваши урлы:

(r'^i18n/', include('django.conf.urls.i18n'))

HTML как ей пользоваться:

<form action="/i18n/setlang/" method="post">
{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}" />
<select name="language">
{% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %}
<option value="{{ language.code }}">{{ language.name_local }} ({{ language.code }})</option>
{% endfor %}
</select>
<input type="submit" value="Go" />
</form>
На главную