Интернационализация Django

категория: Django
Всем привет. Пришло время сделать сайт на разных языках, чтоб не закрываться в пределах собственной страны. Такая задача звучит на первое время довольно страшновато, а если открыть официальную доку по этому поводу и увидеть много английского текста про интернационализацию и локализацию - то становиться еще хуже :) Я же расскажу как это сделать просто и быстро и на 80% оно покроет все ваши потребности, за остальными нюансами можете уже обращаться в документацию. Сделаем сайт на трех языках: по умолчанию - русский, родной украинский и буржуйский - английский. 1. Открываем наш settings.py и дописываем:
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
#
LANGUAGE_CODE = 'ru'
#
LANGUAGES = (
	('ru', 'Russian'),
	('en', 'English'),
	('uk', 'Ukrainian'),
)
#
MIDDLEWARE_CLASSES = (
	...
    'django.middleware.locale.LocaleMiddleware',
)
#
LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
)
2. Создаем папочку locale в корне проекта или по тому пути, который Вы указали в LOCALE_PATHS 3. Теперь подготавливаем слова для перевода: Во вьюхах:
from django.utils.translation import ugettext as _
...
text = _(u"Какой-то текст")
В шаблонах:
{% load i18n %}
...
{% trans "Мой сайт" %}
...
{% blocktrans %}Это моя переменная: {{variable}}{% endblocktrans %}
В моделях:
from django.utils.translation import ugettext_lazy as _
...
name = models.CharField(max_length=30, verbose_name=_(u"Имя"))
В формах:
from django.utils.translation import ugettext as _
...
name = forms.CharField(label=_(u"Имя"), max_length=30)
4. Теперь сам перевод. В терминале заходим в корень проекта и запускаем:
django-admin.py makemessages -l en -a
У вас появиться папочка en, а в ней LC_MESSAGES, а в ней файлик django.po, а в нем много строк типа:
#: main/index.html:5
msgid "Мой сайт"
msgstr ""
В msgstr вводим свой перевод "My site" Дальше компилируем переводы:
django-admin.py compilemessages
И так делаем для всех языков. 5. Для смены языка на сайте нужно добавить в urls.py:
url(r'^i18n/', include('django.conf.urls.i18n')),
В шаблоне вставляем список языков:
<ul>
  {% for lang in LANGUAGES %}
    <li>
      <form name="setLang{{ lang.1}}" action="/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 %}   
</ul>
Все намного проще чем кажется сначала. Успехов.


blog comments powered by Disqus