Проекты становятся глобальными, когда этого никто не ждёт. Проблема перевода возникает не только у переводчиков, но и у инженеров. Разговор об основных трудностях перевода с точки зрения Web разработчика. Усвоенные уроки, инструменты и life hacks.
11. 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
12. 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 ""
16. #: 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
18. 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
19. 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
25. 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
Editor's Notes
Здравствуйте. Здравствуйте. Здравствуйте.Я – Алексей Кутепов и я люблю python.Работаю над переводом backoffice POS компании Revel . Компания сравнительно недавно, год назад, вышла на мировой рынок. Этот доклад будет про то, как это было. Надеюсь вам пригодится.
Интернационализация. Каждый определит его по-своему. Для этой презентации под интернационализацией будем понимать набор средств и подходов для упрощения локализации.
Локализация -- это процесс адаптации продукта для определённой местности. Понятие очень широкое, это не только сам перевод текста (даже на изображениях), но и единицы измерений, форматы времени, чисел, особенности восприятия цветов в разных культурах, налогообложение (у нас это одна из основных проблем).
Интернационализация – это процесс облегчающий локализацию. То есть набор средств и подходов.И всё-таки я предпочёл назвать этот доклад «интернационализация», потому что большей частью мы пишем то, что позволяет автоматизировать локализацию.
gettext comes from solariscatgets: The reason for this lies in the third argument of catgets: the unique message IDNeither 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)
Люди придумали локаль. Локаль – это набор настроек определяющий UI для данного региона, включая и язык.Number format setting
Сase conversion settings
Date-time format setting
String collation setting
Currency format setting
Paper size settingKeyboard layout
Люди придумали локаль. Локаль – это набор настроек определяющий UI для данного региона, включая и язык.Number format setting
Сase conversion settings
Date-time format setting
String collation setting
Currency format setting
Paper size setting
Но, локализация это ещё не всё. Изображения (одежда персонажей)Звуковое сопровождениеВидеоряд (пролог к игре fallout видеоряд начинается с ядерного взрыва, в локализации для Японии видеоряд начинается в подземелье)Разница восприятия цветов в разных культурах (броские цвета в Корее, Японии и Китае)Расчёт налогов это тоже локализация.
Ка
Форматы лежат в отдельном файле formats.py в формате Transifex, о котором я расскажу дальше.
Взлянем, как происходит процесс I18n на примере меня. Я помечаю строки в коде, нужно ли их переводить или нет. Затем отдаю переводчику в удобном для человека формате. Переводчик возвращает работу в том же формате. Я компилирую это всё в формат удобный для машины. И получаю локализованный продукт. Как видите, картинки остались нелокализованными, потому что gettext это не может, что и не удивительно.
Это работаю я, сначала я помечаю текст, который должен быть переведен. Я нашёл этот dictionary, и ключи помечаю как неподлежащие переводу, а
Это работаю я, сначала я помечаю текст, который должен быть переведен. Я нашёл этот dictionary, и ключи помечаю как неподлежащие переводу, а
Translation memory – перевод слов запоминается, если встречается уже переведенные слова, то они автоматически заменяются переводом. Это экономит очень много сил переводчиков.
Transifex – платный сервер переводов SaaS.Django использует формат Transifex для хранения файла форматов.
Не всегда удаётся внедрить проверенные решения. Поэтому фантазируем.
Полученный PO файл теперь можно скомпилировать в MO файл, удобный для использования нашей системой.
Переводчики хотят контекста.
Удобно составлять строки динамически, особенно в сложных системах. Английский язык позволяет конструировать предложения легче, чем, например, русский. В данном примере кажется за счёт интенсивного контекста все неоднозначности решены. Но перевод затруднён. При таком подходе невозможно изменить порядок слов, который необходим для качественного перевода.