Python i18n

32
Локализация и интернационализация Django-приложений Руслан Юлдашев, GetGoing Kazan Python DevDay

description

Python DevDay in Kazan #0xDD Slides about i18n and l10n in django/python

Transcript of Python i18n

Page 1: Python i18n

Локализация иинтернационализация

Django-приложенийРуслан Юлдашев, GetGoing

Kazan Python DevDay

Page 2: Python i18n

План доклада1. Интернационализация

2. Работа с каталогом переводов

3. Тестирование и поддержка

4. Библиотеки и утилиты

Page 3: Python i18n

Зачем?1. Хорошие практики разработки

2. Внимательное отношение к текстам и сообщениям

3. Увеличение потенциальной аудитории приложения

4. Привлекательность для инвесторов

2

Page 4: Python i18n

Интернационализация → Internationalization → i18n

Адаптация приложения для возможного использования в разных

регионах и языках.

Локализация → Localization → l10n

Доработка приложения под конкретный язык или регион.

3

Page 5: Python i18n

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

Page 6: Python i18n

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

Page 7: Python i18n

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

Page 8: Python i18n

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

Page 9: Python i18n

Форматирование: 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

Page 10: Python i18n

Форматирование: *.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

Page 11: Python i18n

Определение языка• LocaleMiddleware — middleware для определения языка:

1. request.session['django_language']

2. django_language cookie

3. Accept-Language HTTP header

4. settings.LANGUAGE_CODE

• Собственная middleware — для сохранения языка в профиль

пользователя

10

Page 12: Python i18n

Перевод приложений — этоумопомрачительно скучно!

Page 13: Python i18n

Каталог переводов

Page 14: Python i18n

Каталог переводов

13

Page 15: Python i18n

Процесс перевода: путь Джанго• Заврапить все текстовые фразы

• Выполнить

$ python manage.py makemessages

• Перевести фразы

• Выполнить

$ python manage.py compilemessages

14

Page 16: Python i18n

Файл с переводами (*.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

Page 17: Python i18n

Процесс перевода: путь Джанго

16

Page 18: Python i18n

Babel

Page 19: Python i18n
Page 20: Python i18n

Процесс перевода: путь Babel• Заврапить все текстовые фразы

• Выполнить

$ pybabel extract --output out.po <OPTIONS>

• Перевести фразы

• Выполнить

$ pybabel <init/update> --domain django<js> --input-file <PO>

• Выполнить

$ pybabel compile --domain django<js> <OPTIONS>

19

Page 21: Python i18n

Процесс перевода: путь Babel

20

Page 22: Python i18n

Тестирование и поддержка

Page 23: Python i18n

Тестовый язык• Позволяет обнаружить незаврапленные сообщения

• Выявляет проблемы верстки

$ 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

Page 24: Python i18n
Page 25: Python i18n
Page 26: Python i18n
Page 27: Python i18n

Типичные проблемы: проблема контекста

26

Page 28: Python i18n

Типичные проблемы: проблема контекста

27

Page 29: Python i18n

Типичные проблемы: плохой перевод

28

Page 30: Python i18n

Типичные проблемы: 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

Page 31: Python i18n

List of libraries and tools• Babel — инструменты для работы с интернационализацией в Python

• PotPie — генерация тестовых текстовых фраз

• PoLib — объектная работа с .po-файлами

• django-localflavor — список регионов, телефонных кодов для стран

• django-countries — список стран

• PoEdit — утилита для редактирования .po-файлов

• MemoQ — комплекс ПО для переводчиков

• puttext.js — альтернатива django i18n js view

30

Page 32: Python i18n

СпасибоРуслан Юлдашев, GetGoing

• Ссылки по теме: http://bit.ly/python-i18n

• twitter.com/monitoringe

[email protected]

Движок для презентаций Shower: github.com/shower/shower

31