Статьи

Краткое руководство по Django I18n

Узнайте, как легко выполнять перевод и локализацию в Django, популярной веб-среде Python.

Мы должны сделать перевод вашего веб-приложения на разные языки и добавить правильную локализацию! Из этого туториала вы узнаете, как начать процесс локализации в Django. Часть этого может быть легко применена к общей локализации Python, и мы также покажем вам, как вы можете еще больше ускорить рабочий процесс i18n с помощью Phrase .

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

Основные настройки

Итак, давайте предположим, что у вас есть проект 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

<!-- polls/templates/polls/index.html -->

<h1>Welcome to our site!</h1>
<p>Here you find polls.</p>

Этот файл должен быть настроен так:

<!-- polls/templates/polls/index.html -->

{% load i18n %}

<h1>{% trans 'WelcomeHeading' %}</h1>
<p>{% trans 'WelcomeMessage' %}</p>

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

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

Если вы хотите локализовать строки в вашем коде Python (например, внутри polls/views.py), вам необходимо импортировать ugettextфункцию. Псевдоним это нормально _. Таким образом, простая функция локализованного вида будет выглядеть следующим образом

# 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'

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

Ускорьте свой процесс, используя фразу

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

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

# .phraseapp.yml

phraseapp:
  access_token: <your access token>
  project_id: <your project's id on PhraseApp>
  file_format: po

  pull:
    targets:
        file: "polls/locale/<locale_code>/LC_MESSAGES/django.po

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

$ phraseapp pull && django-admin compilemessages

Это обновит все переводы в вашем проекте.

Кстати, использование нашего In-Context Editor в вашем приложении Django также очень просто! Вам нужно только установить django-phraseс pip:

$ pip install django-phrase

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

<!-- polls/templates/polls/index.html -->

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

<h1>{% trans 'WelcomeHeading' %}</h1>
<p>{% trans 'WelcomeMessage' %}</p>

Примечание : важно загрузить 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')),
)

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

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

Это должно вернуть что-то вроде этого:

<h1>Willkommen auf unserer Seite!</h1>
<p>Hier findet Ihr Umfragen.</p>

Дальнейшее чтение

Если вы хотите узнать больше об интернационализации в Django, взгляните на официальную документацию . Есть еще одна хорошая статья .

Если вы хотите узнать больше о том, как вы можете настроить Phrase In-Context-Editor в вашем приложении Django, посмотрите документацию на Phrase . Вы также можете найти полные источники демонстрационного приложения, которое мы использовали в этом руководстве на GitHub.

Кроме того, если вы используете Flask , у нас есть еще одно сообщение в блоге, знакомящее вас с локализацией в этой среде.