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

О процессе в целом

Объекты ПО

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

Локализация: инструменты

Эти инструменты применяются реже:

Централизованные инструменты (в основном, перевода)

Тактика локализации

Достоинства и недостатки тактик

Gettext и Babel

Про gettext:

Про Babel:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример перевода начинается с этого коммита

Основную информацию см. там

При использовании gettext.install() соответствующие функции приезжают в пространство имён совершенно прозрачно, и у линтеров едет крыша.

Возможно, правильное решение — воспользоваться другим рецептом из методички:

   1 import gettext
   2 translation = gettext.translation('counter', каталог_с_переводами, fallback=True)
   3 _, ngettext = translation.gettext, translation.ngettext

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

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

См. пример модификации этого описания в репозитории к лекции по Linux-разработке.

Некоторые замечания

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

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

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

В Babel нет поддержки compendium :(, но она есть в msgmerge из GNU Gettext

Д/З

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

LecturesCMC/PythonDevelopment2022/09_I18n (последним исправлял пользователь FrBrGeorge 2022-04-11 13:42:47)