[Перевод] Django: краткое руководство по интернационализации

Перевод приложения на разные языки и его локализация — это нечто такое, чем приходится заниматься всем разработчикам. В материале, перевод которого мы сегодня публикуем, представлено краткое руководство по интернационализации Django-приложений.

Часть того, о чём тут пойдёт речь, применимо к локализации любых Python-проектов. Разобрав основы, мы поговорим об ускорении работ по интернационализации. В частности — о применении платформы Phrase.

oqyylovdtaluypbcarhtickvhva.jpeg

Предполагается, что у читателя этого материала имеется работающее Django-приложение, и то, что у него установлен пакет gettext (установить его можно, например, командой pip install gettext). Если вы раньше не пользовались Django (популярным веб-фреймворком, основанным на Python), то вам, возможно, будет полезно сначала взглянуть на это официальное руководство, а потом вернуться к данной статье.

Базовые настройки рабочей среды


Итак, представим, что у вас имеется Django-проект mysite, и приложение, называемое polls. Структура проекта должна выглядеть примерно так:

/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py
    polls/
        migrations/
        __init__.py
        admin.py
        models.py
        tests.py
        views.py


Первый шаг нашей работы заключается в проверке того, активирована ли опция интернационализации в конфигурации проекта. Для того чтобы это сделать, нужно внести следующие изменения в mysite/settings.py:

# mysite/settings.py
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True


Интернационализация шаблонов


Теперь нужно пометить все строки, которые должны быть переведены на разные языки. Представим, что у вас имеется следующий файл шаблона polls/templates/polls/index.html:


Welcome to our site!

Here you find polls.


Этот файл нужно переработать следующим образом:


{% load i18n %}

{% trans 'WelcomeHeading' %}

{% trans 'WelcomeMessage' %}


Здесь мы импортировали пакет для локализации и заменили весь текст на конструкции вида trans 'SomeTranslationKeyName'. Кроме того, в качестве альтернативы такому подходу, можно воспользоваться текстами перевода, применяемыми по умолчанию, в виде ключей перевода. При таком подходе у вас всегда будет хороший текст, задаваемый по умолчанию, в том случае, если для некоего ключа не будет доступного перевода.

Интернационализация в Python-коде


Если требуется локализовать строки, находящиеся внутри Python-кода (например, в файле polls/views.py), нужно импортировать в файл функцию ugettext. Ей, что вполне нормально, можно назначить псевдоним _. Вот как будет выглядеть локализованный вариант простой функции из файла views.py:

# polls/views.py
from django.http import HttpResponse
from django.utils.translation import ugettext as _
def index(request):
    output = _('StatusMsg')
    return HttpResponse(output)


Создание файлов перевода


Теперь нужно создать файлы перевода для каждого варианта языковых настроек, которые мы хотим поддерживать. Для того чтобы это сделать, создадим директорию polls/locale и в директории polls выполним следующую команду:

django-admin makemessage -l de


Здесь de можно заменить на код локали для языка, который планируется добавить в приложение. В нашем примере выполнение этой команды приведёт к созданию gettext-файла polls/locale/de/LC_MESSAGES/django.po следующего содержания:

# polls/locale/de/LC_MESSAGES/django.po
...
#: templates/polls/index.html:3
msgid "WelcomeHeading"
msgstr ""
#: templates/polls/index.html:4
msgid "WelcomeMessage"
msgstr ""


Теперь в этот файл можно ввести переводы строк:

# polls/locale/de/LC_MESSAGES/django.po
...
#: templates/polls/index.html:3
msgid "WelcomeHeading"
msgstr "Willkommen auf unserer Seite!"
#: templates/polls/index.html:4
msgid "WelcomeMessage"
msgstr "Hier findet Ihr Umfragen."


Когда перевод будет готов — нужно всё скомпилировать, выполнив следующую команду:

$ django-admin compilemessages


Выполнять эту команду нужно, опять же, в директории polls.

Для того чтобы быстро проверить работоспособность перевода, нужно поменять код языка в файле mysite/settings.py. Например — так:

# mysite/settings.py
LANGUAGE_CODE = 'de'


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

Ускорение процесса локализации приложений с использованием Phrase


Если вы используете Phrase для организации работ по локализации приложений, то вам, на самом деле, не нужно вручную создавать и редактировать *.po-файлы! Вам достаточно создать и перевести ключи WelcomeHeading и WelcomeMessage в Phrase и использовать функцию экспорта для загрузки *.po-файлов.

Если у вас установлено наше средство командной строки Phrase Client, то ваша работа упрощается ещё сильнее. Достаточно создать в корневой директории проекта конфигурационный файл .phraseapp.yml со следующим содержимым:

# .phraseapp.yml
phraseapp:
  access_token: 
  project_id: 
  file_format: po
  pull:
    targets:
        file: "polls/locale//LC_MESSAGES/django.po


Затем надо выполнить в корневой директории проекта следующую команду:

phraseapp pull && django-admin compilemessages


Благодаря этому будут обновлены все переводы проекта.

Кроме того, ещё больше упростить работу может использование в вашем Django-проекте нашего редактора In-Context Editor. Для этого достаточно установить django-phrase с помощью pip:

pip install django-phrase


Затем достаточно отредактировать шаблоны, при работе с которыми вы планируете использовать In-Context-Editor:


{% load i18n %}
{% load phrase_i18n %}
{% phrase_javascript %}

{% trans 'WelcomeHeading' %}

{% trans 'WelcomeMessage' %}


Обратите внимание на то, что загрузка phrase_i18n должна выполняться после i18n.

И наконец, в конфигурационный файл нужно добавить следующее:

# mysite/settings.py
PHRASE_ENABLED = True
PHRASE_PROJECT_ID = 'YOUR_PROJECT_ID'
PHRASE_PREFIX = '{{__'
PHRASE_SUFFIX = '__}}'


После этого всё будет готово к работе.

Выбор локалей


Обычно разработчики приложений устанавливают локали, основываясь на параметрах браузера пользователя. Для того чтобы это сделать, нужно привести файл mysite/settings.py к следующему виду:

# mysite/settings.py
from django.utils.translation import ugettext_lazy as _
...
MIDDLEWARE_CLASSES = (
    ...,
    'django.middleware.locale.LocaleMiddleware',
    ...,
)
...
LANGUAGE_CODE = 'en-us'
LANGUAGES = (
    ('en-us', _('English')),
    ('de', _('German')),
)


При таком подходе, если у пользователя будет локаль German, он увидит вариант перевода de. В противном случае в качестве перевода по умолчанию будет использоваться en-us. Проверить правильность работы этого механизма можно с помощью curl:

curl http://localhost:8000/polls -H "Accept-Language: de"


Эта команда должна вернуть примерно следующее:

Willkommen auf unserer Seite!

Hier findet Ihr Umfragen.


Итоги


В этом материале мы рассмотрели основы интернационализации Django-приложений. Здесь же мы рассказали о сервисе Phrase, который способен ускорить и упростить работу. Надеемся, то, о чём вы узнали, вам пригодится.

Уважаемые читатели! Как вы подходите к интернационализации ваших Python-проектов?

iqfib45pgphfrxv--zfemt0qnmw.jpeg

© Habrahabr.ru