5 kx
5 kx First run:
5 kx =========
5 kx
5 kx До первого запуска gettextize --force каталог po/ не должен существовать!
5 kx При первом запуске gettextize --force создаются каталоги m4, po
5 kx m4
5 kx ├── ChangeLog
5 kx ├── gettext.m4
5 kx ├── iconv.m4
5 kx ├── lib-ld.m4
5 kx ├── lib-link.m4
5 kx ├── lib-prefix.m4
5 kx ├── nls.m4
5 kx ├── po.m4
5 kx └── progtest.m4
5 kx
5 kx po
5 kx ├── ChangeLog
5 kx ├── Makefile.in.in
5 kx ├── Makevars.template
5 kx ├── POTFILES.in
5 kx ├── Rules-quot
5 kx ├── boldquot.sed
5 kx ├── en@boldquot.header
5 kx ├── en@quot.header
5 kx ├── insert-header.sin
5 kx ├── quot.sed
5 kx └── remove-potcdate.sin
5 kx
5 kx скрипт ./update-gettext копирует файл po/Makevars.template в po/Makevars,
5 kx если po/Makevars не существовал, а также перезаписывает gettext.h. Кроме
5 kx того gettextize добавляет файл config.rpath, и редактирует файлы:
5 kx
5 kx Makefile.am:
5 kx
5 kx --- Makefile.am~ 2020-10-09 02:57:21.678843280 +0300
5 kx +++ Makefile.am 2020-10-09 03:05:09.010316710 +0300
5 kx @@ -5,9 +5,9 @@
5 kx # In build order:
5 kx # ==============
5 kx #
5 kx -SUBDIRS = cgitcgi
5 kx +SUBDIRS = po cgitcgi
5 kx
5 kx -EXTRA_DIST = \
5 kx +EXTRA_DIST = config.rpath m4/ChangeLog \
5 kx doc l10n LICENSE README.md acsite.m4 bootstrap
5 kx
5 kx configure.ac:
5 kx
5 kx --- configure.ac~ 2020-10-09 02:16:40.812940376 +0300
5 kx +++ configure.ac 2020-10-09 03:05:09.022316594 +0300
5 kx @@ -267,7 +267,7 @@
5 kx dnl ============================================================
5 kx AC_MSG_CFG_PART(OUTPUT)
5 kx
5 kx -AC_CONFIG_FILES([
5 kx +AC_CONFIG_FILES([ po/Makefile.in
5 kx cgitcgi/Makefile
5 kx Makefile
5 kx
5 kx После первого запуска update-gettext необходимо отдать следующие файлы
5 kx под версионный контроль:
5 kx
5 kx m4
5 kx ├── ChangeLog
5 kx ├── gettext.m4
5 kx ├── iconv.m4
5 kx ├── lib-ld.m4
5 kx ├── lib-link.m4
5 kx ├── lib-prefix.m4
5 kx ├── nls.m4
5 kx ├── po.m4
5 kx └── progtest.m4
5 kx
5 kx po
5 kx ├── ChangeLog
5 kx ├── Makefile.in.in
5 kx ├── Makevars
5 kx ├── POTFILES.in
5 kx ├── Rules-quot
5 kx ├── boldquot.sed
5 kx ├── en@boldquot.header
5 kx ├── en@quot.header
5 kx ├── insert-header.sin
5 kx ├── quot.sed
5 kx └── remove-potcdate.sin
5 kx
5 kx ABOUT-NLS
5 kx ChangeLog
5 kx Makefile.am
5 kx config.rpath
5 kx configure.ac
5 kx gettext.h
5 kx
5 kx При последующих запусках update-gettext будут обновляться файлы входящие в поставку
5 kx gettext и, при необходимости, добавляться записи в ChangeLog файлы. Как правило,
5 kx ChangeLog файлы будут обновляться только тогда, когда будет инсталлироваться новая
5 kx версия gettext.
5 kx
5 kx
5 kx Далее можно будет держать в каталоге po/ или копировать в каталог po/ с помощью
5 kx скрипта bootstrap файлы LINGUAS, cgit-ui.pot, ru_RU.utf8.po, а также обновлять
5 kx содержимое файла po/POTFILES.in.
5 kx
5 kx Для корректной работы команд make, make dist необходимо наличие файлов po/LINGUAS,
5 kx po/cgit-ui.pot, po/ru_RU.utf8.po, кроме того время последнего изменения данных файлов
5 kx должно удовлетворять зависимостям описанным в Make-файлах. То есть, если мы хотим
5 kx обновить po/POTFILES.in по окончании процедуры bootstrap, то перед конфигурированием
5 kx и сборкой необходимо обновить дату:
5 kx
5 kx $ cd po
5 kx $ touch --touch --reference=Makefile.in.in LINGUAS POTFILES.in ru_RU.utf8.po
5 kx
5 kx Далее мы опишем все процедуры по созданию и обновлению файлов в каталоге po/
5 kx для успешной локализации продукта.
5 kx
5 kx
5 kx Makevars
5 kx ========
5 kx
5 kx Прежде всего, необходимо отредактировать файл Makevars для того, чтобы при создании
5 kx source distribution с помощью команды:
5 kx
5 kx $ make dist
5 kx
5 kx обновление cgit-ui.pot файла, а также файлов *.po и *.gmo происходило корректно
5 kx
5 kx
5 kx Значения переменных:
5 kx -------------------
5 kx
5 kx XGETTEXT_OPTIONS = --keyword=N_ --keyword=_ --keyword=Q_:1,2 \
5 kx --language=C --add-comments --sort-output --no-wrap
5 kx
5 kx COPYRIGHT_HOLDER = Andrey V.Kosteltsev.
5 kx
5 kx PACKAGE_GNU = no
5 kx
5 kx MSGID_BUGS_ADDRESS = <support@radix.pro>
5 kx
5 kx MSGMERGE_OPTIONS = --update --no-wrap --sort-output --backup=simple
5 kx
5 kx MSGINIT_OPTIONS = --no-wrap
5 kx
5 kx
5 kx
5 kx Локализация:
5 kx ===========
5 kx
5 kx Если первый запуск gettextize состоялся и все необходимые файлы были отданы
5 kx под версионный контроль, то последующие запуски update-gettext можно осуществлять
5 kx не беспокоясь о том, что файлы будут испорчены. Делать это нужно до вызова bootstrap
5 kx и configure.
5 kx
5 kx Далее, можно заняться непосредственно локализацией продукта. Первое, что необходимо
5 kx сделать, это создать файл .pot .
5 kx
5 kx В файле config.h, создаваемым скриптом configure, будет определена константа
5 kx PACKAGE, например:
5 kx
5 kx /* Name of package */
5 kx #define PACKAGE "cgit-ui"
5 kx
5 kx и в данном случае, доменом по умолчанию следует считать имя 'cgit-ui'. Файл cgit-ui.pot
5 kx можно создать следующим образом:
5 kx
5 kx $ xgettext --keyword=N_ --keyword=_ --keyword=Q_:1,2 \
5 kx --language=C --add-comments --sort-output --no-wrap \
5 kx --copyright-holder="Andrey V.Kosteltsev." \
5 kx --msgid-bugs-address="<support@radix.pro>" \
5 kx --default-domain=cgit-ui --output=po/cgit-ui.pot \
5 kx `find -type f -name "*.c"`
5 kx
5 kx для удобства мы создали скрипт gen-pot-file, который выполняет команду xgettext
5 kx с нужными параметрами. Его следует запускать сразу после обновления исходных
5 kx кодов программы, откуда xgettext извлекает строки для последующего перевода.
5 kx
5 kx Ключевые слова N_, _, Q_:1,2 означают следующее:
5 kx
5 kx N_ - извлекаются строки типа N_("string"), которые будут присутствовать в cgit-ui.pot
5 kx файле, но переводиться не будут.
5 kx
5 kx _ - извлекаются строки типа _("string"), которые будут переводиться на другие языки.
5 kx
5 kx Q_:1,2 - извлекается первая и вторая строка из конструкций типа:
5 kx
5 kx Q_("%u byte", "%u bytes", (unsigned)bytes)
5 kx
5 kx и в файле cgit-ui.pot будут создаваться записи подобные следующей:
5 kx
5 kx #. TRANSLATORS: IEC 80000-13:2008 byte
5 kx #: cgitcgi/strbuf.c:558
5 kx #, c-format
5 kx msgid "%u byte"
5 kx msgid_plural "%u bytes"
5 kx msgstr[0] ""
5 kx msgstr[1] ""
5 kx
5 kx Таким образом с помощью ngettext() можно добиться корректного перевода числительных,
5 kx например, 1 байт, 10 байтов, 21 байт .
5 kx
5 kx Справка по --keywords здесь: https://www.gnu.org/software/gettext/manual/html_node/Default-Keywords.html
5 kx
5 kx Далее необходимо обновить файл POTFILES.in, записав в него список исходных файлов, в которых
5 kx существуют строки для перевода. Сделать это можно вручную следующим образом:
5 kx
5 kx # List of source files which contain translatable strings.
5 kx
5 kx # cGit CGI source files
5 kx cgitcgi/fatal.c
5 kx cgitcgi/strbuf.c
5 kx . . .
5 kx
5 kx Напомним, что po/POTFILES.in находится под версионным контролем.
5 kx
5 kx Кроме того, под версионным контролем должен находиться файл po/LINGUAS, например,
5 kx следующего содержания:
5 kx
5 kx # Set of available languages.
5 kx
5 kx ru_RU.utf8
5 kx
5 kx Поскольку в файле LINGUAS присутствует сторока 'ru_RU.utf8', в каталоге, po/
5 kx должен находиться файл po/ru_RU.utf8.po, начальное состояние которого можно
5 kx получить с помощью утилиты msginit:
5 kx
5 kx $ cd po/
5 kx $ msginit --no-wrap --locale=ru_RU.utf8 --input=cgit-ui.pot --output=ru_RU.utf8.po
5 kx
5 kx Утилита msginit запросит подтверждение почтового адреса:
5 kx =======================================================
5 kx The new message catalog should contain your email address, so that users can
5 kx give you feedback about the translations, and so that maintainers can contact
5 kx you in case of unexpected technical problems.
5 kx
5 kx Is the following your email address?
5 kx kx@cardhu.radix.pro
5 kx Please confirm by pressing Return, or enter your email address.
5 kx kx@radix.pro
5 kx Retrieving http://translationproject.org/team/index.html... done.
5 kx A translation team for your language (ru) does not exist yet.
5 kx If you want to create a new translation team for ru, please visit
5 kx http://www.iro.umontreal.ca/contrib/po/HTML/teams.html
5 kx http://www.iro.umontreal.ca/contrib/po/HTML/leaders.html
5 kx http://www.iro.umontreal.ca/contrib/po/HTML/index.html
5 kx
5 kx Created ru_RU.utf8.po.
5 kx
5 kx Создание файла ru_RU.utf8.po с помощью команды
5 kx
5 kx $ msginit --no-wrap --locale=ru_RU.utf8 --input=cgit-ui.pot --output=ru_RU.utf8.po
5 kx
5 kx лучше выполнять после конфигурирования исходников для того, чтобы в заголовочном коментарии
5 kx файла ru_RU.utf8.po имя пакета было задано корректно. То есть cgit-ui по имени PACKAGE.
5 kx
5 kx
5 kx Правила перевода числительных записывается на языке С и, для русского языка:
5 kx
5 kx "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
5 kx
5 kx дает:
5 kx
5 kx [0] строка
5 kx [1] строки
5 kx [2] строк
5 kx
5 kx
5 kx В дальнейшем, так как файл ru_RU.utf8.po находится под версионным контролем,
5 kx его надо будет только обновлять.
5 kx
5 kx Допустим в исходные файлы на языке С были добавлены строки, подлежащие переводу, и надо обновить
5 kx файл ru_RU.utf8.po, чтобы в него попали новые строки. Для обновления файла ru_RU.utf8.po, сначала
5 kx нужно обновить файл po/cgit-ui.pot с помощью скрипта gen-pot-file:
5 kx
5 kx $ l10n/gen-pot-file
5 kx
5 kx и затем, обновить файл po/ru_RU.utf8.po:
5 kx
5 kx $ cd po/
5 kx $ msgmerge --update --no-wrap --sort-output --backup=simple ru_RU.utf8.po cgit-ui.pot
5 kx
5 kx Cтарый файл будет сохранен с именем po/ru_RU.utf8.po~
5 kx
5 kx
5 kx Таким образом для обновления как самой утилиты gettext, так и файлов локализации, следует
5 kx (в корне исходного пакета программ) вызывать процедуры обновления в следующем порядке:
5 kx
5 kx $ ./l10n/update-gettext
5 kx $ ./l10n/gen-pot-file
5 kx $ ./l10n/merge-ru_RU.utf8-messages
5 kx
5 kx Остается только не забывать добавлять новые файлы в po/POTFILES.in, а при добавлении новых
5 kx языков (локалей), дополнять файл po/LINGUAS. И наконец еще одно замечание. В файлах *.po,
5 kx при обновлении номера версии продукта, строку:
5 kx
5 kx "Project-Id-Version: cgit-ui 0.0.6\n"
5 kx
5 kx надо обновлять вручную (разумеется если .po файл уже существует под версионным контролем,
5 kx а не создается вновь с помощью утилиты msginit).
5 kx
5 kx
5 kx Файл nls.h обеспечивает исходный код макроопределениями на случай использования gettext,
5 kx а также без использования GNU gettext, когда при конфигурировании выбирается опция:
5 kx
5 kx $ ./configure --disable-nls
5 kx
5 kx Более подробную информацию об утилитах GNU gettext можно получить по адресу:
5 kx
5 kx https://www.gnu.org/software/gettext/manual/gettext.html
5 kx
5 kx
5 kx Enjoy.