Блог
  • Начало
  • Обо мне
  • Обратная связь

Интернационализация и локализация сайта на 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/locale
2. Во-вторых, нужно указать 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
Select language:
  • Русский
  • English

  • Программирование

    Python C++ JavaScript

    Веб-разработка

    Django ASP.NET

    Мобильная разработка

    Windows Phone Android

    Разработка игр

    Unity3d Blender

    Артем Устимов © 2014