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

Лекции прошлых лет:

Термины

Объекты ПО

Другие объекты продукта

Использование GNU Gettext

Документация

В случае Python (в скобках указаны названия утилит, конкретные действия будут показаны позже)

Создание перевода

  1. I18n:
    • Подключим в текущий namespace волшебную функцию «_()» — «перевести»

    • Обмажем этой функцией все строки, нуждающиеся в переводе
    • Внимание! Новомодные (им, вообще-то уже больше года) f-strings (форматные строки вида «f"...{имя}..."») по понятным причинам в python gettext не поддерживаются. Пользуйтесь методом .format()!

    • Не удаляйте комментарий #, python-brace-format из po-файла, он нужен:)

  2. (xgettext) Создадим на основе i18n-ванного исходного кода шаблон перевода, файл dopmain.pot (domain — это довольно произвольное название того, что мы переводим)

  3. (msginit) Создадим прототип перевода (для русского — ru.po)

  4. (текстовый редактор или специализированный инструмент редактирования .po) Переведём все строки в ru.po

  5. (msgfmt) Скомпилируем перевод в файл ru.mo

Обновление перевода

Вышла новая версия программы (или сами поправили). Там «поехали» строки с сообщениями (появились новые, пропали/изменились/переместились старые).

  1. (xgettext) Сгенерируем новый шаблон

  2. (msgmerge) Обновим содержимое ru.po на основании шаблона и старого ru.po. У msgmerge много искусственного мозга:

    • Не теряет старые переводы (только комментирует)
    • Размечает новые сообщения возможными переводами из старых/законмментированных

  3. Допереводим ru.po

  4. (msgfmt) Компилируем новый перевод

Gettext.svg.png

Процесс локализации

Попробуем перевести пример из документации TkInter

Первичный перевод

Обновление перевода

Про память переводов

Очень важно соблюдать единообразие при переводе одинаковых надписей. Для этого все переводы по проекту можно сложить в т. н. compendium (но же translation memory, она же память переводов) — большой .po-файл, получаемый утилитой msgcat из всех имеющихся

Множественные формы

Наш перевод не слишком-то хорош: футы и метры показываются во множественном числе, независимо от значения полей. На самом деле это свойство не перевода, а исходного текста. Используем gettext для исправления ситуации.

Описание того, какие числа какой множественной форме соответствуют содержится в заголовке ru.po (который нам сгенерировал msginit). Это описание компилируется в некоторый код .mo-файла, который gettext интерпретирует (замечание vslutov@, спасибо).

Д/З

В семестровом проекте должен присутствовать перевод. Если Вы пишете какой-то модуль/бот/библиотеку без UI, переведите документацию (см. Руководство по переводу)

LecturesCMC/PythonDevelopment2020/08_L10n (последним исправлял пользователь FrBrGeorge 2021-04-15 09:15:38)