Локализация иинтернационализация
Django-приложенийРуслан Юлдашев, GetGoing
Kazan Python DevDay
План доклада1. Интернационализация
2. Работа с каталогом переводов
3. Тестирование и поддержка
4. Библиотеки и утилиты
Зачем?1. Хорошие практики разработки
2. Внимательное отношение к текстам и сообщениям
3. Увеличение потенциальной аудитории приложения
4. Привлекательность для инвесторов
2
Интернационализация → Internationalization → i18n
Адаптация приложения для возможного использования в разных
регионах и языках.
Локализация → Localization → l10n
Доработка приложения под конкретный язык или регион.
3
Интернационализация
gettext: *.pyfrom django.utils.translation import ugettext, ungettext
# Simple
msg = ugettext('Hello')
# Format
msg = ugettext('Welcome, {first} {last}!').format(first=x, last=y})
# Plural
msg = ungettext('{0} day', '{0} days', count).format(count)
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
5
gettext: *.html{{ _("Hello") }}
{% load i18n %}
{% trans "Hello" %}
{% blocktrans %}
Hey there <strong>{{ username }}</strong>!
{% endblocktrans %}
{% blocktrans count counter=days|length %}
{{ counter }} day{{% plural %}{{ counter }} days
{% endblocktrans %}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
6
gettext: *.jsurls.py
urlpatterns = patterns('',
(r'̂jsi18n/$', 'django.views.i18n.javascript_catalog')
)
app.js
console.log(gettext("Hello"));
console.log(
interpolate(gettext("Welcome, %(user)s!"), {user: name}, true);
);
01.
02.
03.
01.
02.
03.
04.
7
Форматирование: formats.py#coding: utf-8
DATE_FORMAT = 'D d M Y'
TIME_FORMAT = 'H\hi'
MONTH_DAY_FORMAT = 'j F'
SHORT_DATE_FORMAT = 'd/m/Y'
JS_DATE_FORMAT = 'ddd D MMM YYYY'
JS_SHORT_DATE_FORMAT = 'DD/MM/YYYY'
JS_TIME_FORMAT = 'HH[h]mm'
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
8
Форматирование: *.pyimport datetime
from babel import dates, numbers
dates.format_date(datetime.date.today())
# u'Mar 1, 2014'
dates.format_date(datetime.date.today(), locale='fr')
# u'1 mars 2014'
numbers.format_decimal(1.123, locale='fr')
# u'1,123'
01.
02.
03.
04.
05.
06.
07.
08.
09.
9
Определение языка• LocaleMiddleware — middleware для определения языка:
1. request.session['django_language']
2. django_language cookie
3. Accept-Language HTTP header
4. settings.LANGUAGE_CODE
• Собственная middleware — для сохранения языка в профиль
пользователя
10
Перевод приложений — этоумопомрачительно скучно!
Каталог переводов
Каталог переводов
13
Процесс перевода: путь Джанго• Заврапить все текстовые фразы
• Выполнить
$ python manage.py makemessages
• Перевести фразы
• Выполнить
$ python manage.py compilemessages
14
Файл с переводами (*.po)#: app/views.py:20
msgid "Welcome, {first} {last}!"
msgstr "Привет, {first} {last}!"
#: templates/app.html:35
msgid "{0} day"
msgid_plural "{0} days"
msgstr[0] "{0} день"
msgstr[1] "{0} дня"
msgstr[2] "{0} дней"
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
15
Процесс перевода: путь Джанго
16
Babel
Процесс перевода: путь Babel• Заврапить все текстовые фразы
• Выполнить
$ pybabel extract --output out.po <OPTIONS>
• Перевести фразы
• Выполнить
$ pybabel <init/update> --domain django<js> --input-file <PO>
• Выполнить
$ pybabel compile --domain django<js> <OPTIONS>
19
Процесс перевода: путь Babel
20
Тестирование и поддержка
Тестовый язык• Позволяет обнаружить незаврапленные сообщения
• Выявляет проблемы верстки
$ pip install potpie
$ potpie --type <brackets/unicode/extend/mixed> in.po out.po
#: app/views.py:20
msgid "Welcome, {first} {last}!"
msgstr "[Welcome, {first} {last}! LjπDž 衋sNjΐ]"
01.
02.
01.
02.
03.
22
Типичные проблемы: проблема контекста
26
Типичные проблемы: проблема контекста
27
Типичные проблемы: плохой перевод
28
Типичные проблемы: JS$.get('/some/url/, function (data) {
console.log(
data.sum * 10 // data.sum == 7.5
);
});
// en: 75
// ru: Syntax Error
01.
02.
03.
04.
05.
06.
07.
08.
29
List of libraries and tools• Babel — инструменты для работы с интернационализацией в Python
• PotPie — генерация тестовых текстовых фраз
• PoLib — объектная работа с .po-файлами
• django-localflavor — список регионов, телефонных кодов для стран
• django-countries — список стран
• PoEdit — утилита для редактирования .po-файлов
• MemoQ — комплекс ПО для переводчиков
• puttext.js — альтернатива django i18n js view
30
СпасибоРуслан Юлдашев, GetGoing
• Ссылки по теме: http://bit.ly/python-i18n
• twitter.com/monitoringe
Движок для презентаций Shower: github.com/shower/shower
31
Top Related