Localization Internationalization
catgets VS gettext
1995
[language[_territory][.codeset][@modifier]]
Locale
en_GB.UTF-8@variant
Messages
Dates
Numbers
Currency
en_GB
Locale
More about Localization
• Images
• Sound
• Video
• Cultural perception
• Taxes
gettext features
• Messages
• Plural forms
• Context
Django I18n tools
• gettext
• Formats
• Timezones
I18n features
workflow
Me InterpreterLocalized
Product
P
O
M
O
from django.utils.translation import gettext_noop as _noop
from django.utils.translation import gettext as _
{
_noop(”Winnie rhyme”):
_("It's a very funny thought that, if Bears were Bees,"
"They'd build their nests at the bottom of trees."
"And that being so (if the Bees were Bears),"
"We shouldn't have to climb up all these stairs.”)
}
✪ python manage.py makemessages
Portable Objects
PO files
#: main.py:3
msgid ""
"It's a very funny thought that, if Bears were Bees,"
"They'd build their nests at the bottom of trees."
"And that being so (if the Bees were Bears),"
"We shouldn't have to climb up all these stairs.”
msgstr ""
Pootle Server
Custom Solution
http://rannts.ru/meetups/1/l10n/
Legacy?
Customer?
#: main.py:3
msgid ""
"It's a very funny thought that, if Bears were Bees,"
"They'd build their nests at the bottom of trees."
"And that being so (if the Bees were Bears),"
"We shouldn't have to climb up all these stairs.”
msgstr ""
"Если б мишки были пчёлами, то они бы нипочём, никогда ”
"и не подумали так высо́ко строить дом… Ой!"
✪ python manage.py compilemessages
Provide more context
@classmethod
def get_table_caption(cls):
# Translators: Taxable or Non-Taxable Donations
return cls.prefix + _(' Donations')
#: Translators: Taxable or Non-Taxable Donations
#: source.py:3
msgid ""
"Donations"
msgstr ""
source
PO
Avoid dynamic string creating
@property
def prefix(self):
if self.gov_state in ['CA', 'TX', 'FL']:
# Translators: Taxable Donations
return _('Taxable')
else:
# Translators: Non-Taxable Donations
return _('Non-Taxable')
def get_table_caption(self):
# Translators: Taxable or Non-Taxable Donations
return self.prefix + _('Donations'))
Words sequence cannot be changed
What if nothing to do?
Insert right to the PO files
python-babel
Flask-Babel
Same features. Both uses gettext.
babel-django
Python gettext standard library
GNU gettext API
import gettext
gettext.gettext('EOD Report')
More – pymorphy – pymorphy2
Русский, Белорусский, Украинский.
Морфологический анализ.
(род, число, падеж)
pymorphy-django
mystem
Yandex
Морфологический анализ
cli интерфейс
Informative Links
• History of GNU gettext
https://www.gnu.org/software/gettext/manual/html_node/gettext_219.html#History
https://www.w3.org/International/questions/qa-i18n.ru.php

18 Оттенков I18n

Editor's Notes

  • #2 Здравствуйте. Здравствуйте. Здравствуйте. Я – Алексей Кутепов и я люблю python. Работаю над переводом backoffice POS компании Revel . Компания сравнительно недавно, год назад, вышла на мировой рынок. Этот доклад будет про то, как это было. Надеюсь вам пригодится.
  • #3  Интернационализация. Каждый определит его по-своему. Для этой презентации под интернационализацией будем понимать набор средств и подходов для упрощения локализации. Локализация -- это процесс адаптации продукта для определённой местности. Понятие очень широкое, это не только сам перевод текста (даже на изображениях), но и единицы измерений, форматы времени, чисел, особенности восприятия цветов в разных культурах, налогообложение (у нас это одна из основных проблем). Интернационализация – это процесс облегчающий локализацию. То есть набор средств и подходов. И всё-таки я предпочёл назвать этот доклад «интернационализация», потому что большей частью мы пишем то, что позволяет автоматизировать локализацию.
  • #4  gettext comes from solaris catgets: The reason for this lies in the third argument of catgets: the unique message ID Neither method is a POSIX standard This all began in July 1994 Patrick D’Cruze I18n of fileutils Jim Meyering, the maintainer, asked Richard Stallman about standards and got glocale description. Jim implemented glocale with feedback from Richard Stollman, Patrick and Mitchum DSouza (catgets-like package mainteiner)
  • #5 Люди придумали локаль. Локаль – это набор настроек определяющий UI для данного региона, включая и язык. Number format setting Сase conversion settings Date-time format setting String collation setting Currency format setting Paper size setting Keyboard layout
  • #6 Люди придумали локаль. Локаль – это набор настроек определяющий UI для данного региона, включая и язык. Number format setting Сase conversion settings Date-time format setting String collation setting Currency format setting Paper size setting
  • #7 Но, локализация это ещё не всё. Изображения (одежда персонажей) Звуковое сопровождение Видеоряд (пролог к игре fallout видеоряд начинается с ядерного взрыва, в локализации для Японии видеоряд начинается в подземелье) Разница восприятия цветов в разных культурах (броские цвета в Корее, Японии и Китае) Расчёт налогов это тоже локализация.
  • #9 Ка
  • #10 Форматы лежат в отдельном файле formats.py в формате Transifex, о котором я расскажу дальше.
  • #11 Взлянем, как происходит процесс I18n на примере меня. Я помечаю строки в коде, нужно ли их переводить или нет. Затем отдаю переводчику в удобном для человека формате. Переводчик возвращает работу в том же формате. Я компилирую это всё в формат удобный для машины. И получаю локализованный продукт. Как видите, картинки остались нелокализованными, потому что gettext это не может, что и не удивительно.
  • #12 Это работаю я, сначала я помечаю текст, который должен быть переведен. Я нашёл этот dictionary, и ключи помечаю как неподлежащие переводу, а
  • #13 Это работаю я, сначала я помечаю текст, который должен быть переведен. Я нашёл этот dictionary, и ключи помечаю как неподлежащие переводу, а
  • #14 Translation memory – перевод слов запоминается, если встречается уже переведенные слова, то они автоматически заменяются переводом. Это экономит очень много сил переводчиков.
  • #15 Transifex – платный сервер переводов SaaS. Django использует формат Transifex для хранения файла форматов.
  • #16 Не всегда удаётся внедрить проверенные решения. Поэтому фантазируем.
  • #17 Полученный PO файл теперь можно скомпилировать в MO файл, удобный для использования нашей системой.
  • #18  Переводчики хотят контекста.
  • #20 Удобно составлять строки динамически, особенно в сложных системах. Английский язык позволяет конструировать предложения легче, чем, например, русский. В данном примере кажется за счёт интенсивного контекста все неоднозначности решены. Но перевод затруднён. При таком подходе невозможно изменить порядок слов, который необходим для качественного перевода.