Skip to content

5. Интернационализация и локализация

Elmira edited this page Oct 20, 2017 · 1 revision

Настройка

Чтобы перевести страницу в django, прежде всего необходимо задать языки и путь к переводам (локализации) в настройках (heritage_corpus/settings.py). Вот так это выглядит:

# основной язык нашего сайта
LANGUAGE_CODE = 'en-us' 

# все языки, которые мы используем и их коды
LANGUAGES = (
    ('ru', _('Russian')), 
    ('en', _('English')),
)

# мы хотим использовать инструменты для интернационализации из джанго
USE_I18N = True 

# мы хотим использовать инструменты для локализации из джанго
USE_L10N = True 

# путь к директории, в которой мы хотим хранить все переводы
LOCALE_PATHS = ( 
    '...',
)

Фрагменты для перевода

Для того, чтобы Джанго знал, какие именно строки нужно переводить, эти строки нужно специальным образом отметить:

В коде Python используется функция ugettext_lazy(), которую обычно сокращают как _():

from django.utils.translation import ugettext_lazy as _
GenderChoices = ((u'ж', _(u'female')), (u'м', _(u'male')))

Тут мы говорим, что строки 'female' и 'male' в питоновском коде должны на сайте автоматически переводиться.

В шаблонах html используется специальный тэг trans:

{% load i18n %}
<div class="checkbox">{% trans "Dagestanian" %}</div>

Тут мы говорим, что строка 'Dagestanian' из шаблона должна на сайте автоматически переводиться.

Message file

После того, как все нужные строки отмечены для перевода, их нужно собрать в один большой файл. У нас этот файл находится в locale\ru\LC_MESSAGES под названием django.po. Чтобы Джанго сам нашел все новые строки в коде сайта и добавил их в наш файл с переводами, нужно пойти в директорию с проектом и написать команду

python manage.py makemessages -l ru

-l ru указывает на то, что мы хотим апдейтнуть перевод на русский язык.

Файл с переводами выглядит следующим образом:

#: annotator/models.py:28 
msgid "genre" 
msgstr "жанр"
  • msgid - это сама строка из исходного кода, ее менять нельзя.
  • msgstr - это место, куда нужно написать перевод, сначала там будут пустые кавычки, а тебе нужно туда что-то вписать, при переводе кавычки нужно сохранить.
  • Перед каждым фрагментом для перевода стоит комментарий с #, именем файла, из которого взят данный фрагмент и номером строчки, из которой этот фрагмент вытащили.

После того, как мы добавили все нужные переводы, нам необходимо его скомпилировать в более эффективный формат (рядом создастся файл с расширением .mo - как раз он то и используется джангой для переводов). Для этого нужно выполнить команду:

python manage.py compilemessages

После этого, скорее всего, придется перезапустить сервер.

Перевод страницы

У нас на сайте есть страницы, которые берут свое содержимое не из кода сайта, а из базы данных, которую наполняют пользователи (например, страница с новостями).

Для перевода такой страницы, в html-шаблоне мы проверяем текущий код языка у страницы и в соответствии с ним выдаем нужный текст. Вот так, например, это сделано в коде страницы новостей:

{% if LANGUAGE_CODE == 'ru' %}
    <p>{{ article.text_rus | safe}} </p>
{% endif %}

{% if LANGUAGE_CODE == 'en' %}
    <p>{{ article.text_eng | safe}} </p>
{% endif %}

Резюмируем

  1. Обернуть все строки для перевода в _() в питоне или trans в html;
  2. python manage.py makemessages -l ru
  3. В файле django.po найти непереведённые строки и добавить им перевод.
  4. python manage.py compilemessages
  5. runserver - Запускаем и убеждаемся, что всё в порядке.
  6. git push
  7. git pull на сервере
  8. python manage.py compilemessages на сервере
  9. Скорее всего - перезапускаем сервер.