Интернационализация и локализация сайта на Django
Дата и время: 3 июня 2014 г. 0:51 | Категория: Веб-разработка, Django
В данной статье будут описаны несколько простых шагов на пути к интернационализации и локализации сайта на Django. Приведены лишь самые основные действия, а также описание некоторых подводных камней с которыми можно столкнуться на данном пути. Более подробное описание всегда можно найти в документации. Вопросы о локализации некоторых других проблемных областей будут рассмотрены в следующих статьях.
1. Во-первых, необходимо указать следующие переменные в settings.py (некоторые из них могут быть указаны по умолчанию):
# Корневая директория проекта
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
# Middleware классы
MIDDLEWARE_CLASSES = (
# Другие middleware классы
'django.middleware.locale.LocaleMiddleware',
# Другие middleware классы
)
# Код языка по умолчанию
LANGUAGE_CODE = 'ru'
# Поддерживаемые языки
LANGUAGES = (
('ru', u'Русский'), # Python 2
('en', 'English'),
)
# Кортеж путей к папкам, в которых будут храниться файлы локализации
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale'),
)
# Включить использование интернационализации
USE_I18N = True
# Включить использование локализации
USE_L10N = True
Важно: Строка 'django.middleware.locale.LocaleMiddleware' в MIDDLEWARE_CLASSES должна быть не раньше строки 'django.contrib.sessions.middleware.SessionMiddleware' иначе локализация будет работать некорректно!Далее необходимо создать директории, указанные в переменной LOCALE_PATH. Для данного примера это будет папка locale в корне проекта.
Примечание: Узнать коды различных языков можно в директории Python27/Lib/site-packages/django/conf/locale2. Во-вторых, нужно указать Django какие строки нуждаются в переводе. В шаблонах для этого необходимо указать тег интернационализации и заключить переводимые строки в специальный тег, например:
{% load i18n %}
{% trans "Строка для перевода" %}
В моделях локализуемые строки необходимо заключать в функцию ugettext_lazy из модуля django.utils.translation, а в представлениях и формах в функцию ugettext из того же модуля, которые для сокращения числа вводимых символов принято импортировать с алиасом _:
# models.py
from django.db import models
from django.utils.translation import ugettext_lazy as _
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length = 50, verbose_name = _(u'Имя'))
3. Третьим шагом является генерация файлов локализации для каждого языка. Для этого находясь в корне проекта необходимо выполнить следующую команду:
django-admin.py makemessages -l en
и так для каждого языка, указанного Вами в settings.py, подставляя его код вместо en.
4. Теперь необходимо заполнить сгенерированные файлы локализации django.po, которые для данного примера находятся в папке locale/<код языка>/LC_MESSAGES. Далее представлен пример такого файла:
#: .\blog\models.py:7
msgid "Имя"
msgstr ""
#: .\blog\templates\blog\base.html:2
msgid "Строка для перевода"
msgstr ""
В данном файле перечислены все помеченные с помощью функций или тегов строки, нуждающиеся в переводе. В строке начинающейся с msgid в кавычках находится помеченная строка, в строке msgstr в кавычках необходимо указать её перевод.
Важно: Если вы видите #, fuzzy перед строкой с msgid, то считывание вашей строки произошло некорректно. У меня такое возникало при указании одинаковой строки, но в разных регистрах.5. Теперь необходимо скомпилировать переведённые сообщения с помощью следующей команды (из корня проекта):
django-admin.py compilemessages
6. Последним шагом является добавление на сайт блока переключения языка. В файле urls.py необходимо указать:
urlpatterns = patterns('',
# Другие ссылки
url(r'^i18n/', include('django.conf.urls.i18n')),
# Другие ссылки
)
А в какой-либо из шаблонов добавить следующий блок переключения языка:
<!-- Не забудьте указать {% load i18n %} в начале шаблона -->
{% for lang in LANGUAGES %}
<li>
<form name="setLang{{ lang.1}}" action="/blog/i18n/setlang/" method="POST">
{% csrf_token %}
<input name="next" type="hidden" value="/">
<input type="hidden" name="language" value="{{ lang.0 }}">
<a href="#" onclick="document.setLang{{ lang.1 }}.submit();
return false;">{{ lang.1 }}</a>
</form>
</li>
{% endfor %}
Поздравляю! Теперь Ваш сайт поддерживает интернационализацию и локализацию! Таким образом она была реализована и в этом блоге. comments powered by Disqus