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

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

Термины

Объекты ПО

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

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

GNU Gettext

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

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

  1. I18n: Обмажем функцией gettext() все строки, нуждающиеся в переводе

    • Есть ещё ngettext(), см. ниже

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

    • Не удаляйте сгенерированные комментарии из файла, это не комментарии☺!

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

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

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

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

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

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

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

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

    • Умеет в примитивную память переводов

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

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

LecturesCMC/PythonDevelopment2020/08_L10n/Gettext.svg.png

Есть ещё вспомогательные инструменты:

$ rpm -ql gettext-tools | grep /bin/ | cut -d/ -f4 | xargs -n1 whatis
autopoint (1)        - copies standard gettext infrastructure
gettextize (1)       - install or upgrade gettext infrastructure
msgattrib (1)        - attribute matching and manipulation on message catalog
msgcat (1)           - combines several message catalogs
msgcat (n)           - Tcl message catalog
msgcmp (1)           - compare message catalog and template
msgcomm (1)          - match two message catalogs
msgconv (1)          - character set conversion for message catalog
msgen (1)            - create English message catalog
msgexec (1)          - process translations of message catalog
msgfilter (1)        - edit translations of message catalog
msgfmt (1)           - compile message catalog to binary format
msggrep (1)          - pattern matching on message catalog
msginit (1)          - initialize a message catalog
msgmerge (1)         - merge message catalog and template
msgunfmt (1)         - uncompile message catalog from binary format
msguniq (1)          - unify duplicate translations in message catalog
recode-sr-latin (1)  - convert Serbian text from Cyrillic to Latin script
xgettext (1)         - extract gettext strings from source

Ход работы

Варианты «пути к локализации»

  1. Локальный — положить рядом с бинарником или в подкаталог po/

    • /!\ Так в Linux не принято!

  2. Системный — положить в /usr/share/locale и/или в /usr/local/share/locale

    • /!\ Требует прав администратора и средств деинсталляции

  3. Микс — предусмотреть два варианта сборки, определить переменную в configure и т. д.

  4. С относительным путём: сформировать путь относительно местоположения бинарника

    • если бинарник ставится в /usr/bin, а переводы — в /usr/share/locale

      • то путь получится ../share/locale

    • выполнить тестовую установку куда-нибудь в /tmp или /home/пользователь/что-то-там

      • при этом бинарник должен ставиться в /home/пользователь/что-то-там/bin/программа

      • оттуда и запускать
      • а путь до локали /home/пользователь/что-то-там/share/locale/… остаётся тот же самый: ../share/locale

Использование множественных форм

В английском их две, в русском — три: 1¹ / 2,3,4² / 5-20³ / 21¹ и т. д.

Страшная формула в строке Plural-Forms:

Если увеличить nplurals до 4 и добавить в начало формулы n==1? 3 :, получим четвёртую словоформу — для ровно одного объекта (в таких случаях можно число 1 не выводить)

Translation memory

gettext и autotools

Есть поддержка, она в первую очередь имеет смысл для больших проектов

Что хранить и что не хранить в GIT-е

Пример

В этом примере изначально autotools использовались для всего, кроме переводов.

Под конец пример переключается на autotools

После каждого коммита я делал

Поддержка Gettext в других системах сборки

Д/З

LecturesCMC/LinuxApplicationDevelopment2024/08_I18n (последним исправлял пользователь FrBrGeorge 2024-11-06 20:10:17)