Локализация PO и MO файлов PDF Печать E-mail

PO и MO файлы - это файлы библиотеки Gettext, широко применяемой в свободном ПО. Кроме реализации для стандартного C++ существуют реализации этой библиотеки для множества языков программирования: PHP, Phyton, Perl, Pascal, Jawa и многих других.

Описание библиотеки Gettext доступно по адресу:

http://www.gnu.org/software/gettext/manual/gettext.html

Строки в PO и MO файлах хранятся в виде списка записей (entries). Каждая запись содержит поля msgid - оригинальная строка и msgstr - перевод. Первая запись в поле msgid содержит пустую строку, в msgstr - заголовок. Заголовок представляет собой набор полей. В поле Content-Type содержится название кодировки файла.

Файлы PO являются текстовыми, файлы MO - двоичными. Файл MO получают с путем компиляции файла PO. Файлы MO содержат подмножество полей PO файла, в нем не сохраняются флаги, комментарии, ссылки и устаревшие (obsolete) записи. Файлы PO не содержат сигнатуру BOM (Byte Order Mask) в начале файла, поэтому кодировки UTF-16 и UTF-32 в PO файлах и, соответственно в MO файлах,  не поддерживаются. В заголовке файла отсутствует информация об языке перевода, поэтому в Radialix язык перевода необходимо задать в диалоге свойств файла на вкладке исходных ресурсов.

Множественное число

Основным отличием библиотеки Gettext от других инструментов локализации является поддержка форм множественного числа. Поддержка множественного числа улучшает восприятие текста. Например, вместо строки:

"% day(s) ago"

указывают две строки:

"%d day ago"

"%d days ago"

Первая строка  - для единственного числа, вторая для множественного. В английском языке одну форму множественного числа, в других языках их может быть несколько. Например, в русском языке используется три формы:

"%d день назад"  (1, 11, 21 и т.д.)

"%d дня назад"   (2..4, 22..24, 32..34 и т.д.)

"%d дней назад"  (остальные числа)

В строке для единственного числа при определенных условиях спецификатор %d может быть опущен:

"один день назад"

Библиотека Gettext в качестве оригинально языка поддерживает только языки с одной формой множественного числа. В подавляющем большинстве случаев - это английский язык. Строка для единственного числа указывается в поле msgid, для множественного  - в поле msgid_plural. В переводе варианты строк указываются  в поле msgstr с индексом:

msgid "%d day ago"

msgid_plural "%d days ago"

msgstr[0] "%d день назад"

msgstr[1] "%d дня назад"

msgstr[2] "%d дней назад"

В приложении выбор варианта перевода производится функцией ngettext из библиотеки Gettext. В эту функцию в качестве одного из параметров передается число, которое требуется подставить в строку вместо спецификатора %d. Обычно это число обозначают с помощью символа n. Функция ngettext считывает из заголовка PO(MO) файла из поля Plural-Forms выражение на языке для вычисления индекса строки msgstr. В это выражение поставляется заданное n, после чего оно вычисляется. Результатом является индекс поля msgstr, из которого и берется перевод. Для русского языка поле Plural-Forms обычно имеет вид:

"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"

где: nplurals - число вариантов множественного числа, plural - выражение для вычисления индекса.

Спецификаторы формата

Еще одной особенностью PO файлов является поддержка нескольких типов спецификаторов формата для каждой строки. Тип спецификаторов указывается в поле флагов. При этом могут быть перечислены стразу несколько типов спецификаторов, т.е. строка может использоваться одновременно несколькими приложениями, написанными на разных языках. Эти языки, конечно же, должны поддерживать похожие форматы спецификаторов. При проверке корректности необходимо проверять строки при для всех указанных форматов.

Поддержка PO и MO файлов  в Radialix

Начиная с версии 2.11.00 Radialix поддерживает все указанные выше особенности файлов библиотеки Gettext.

В Radialix реализованы:

  • Редактор выражения для вычисления индекса строки msgstr
  • Редактор строк множественного числа
  • Проверка корректности строк множественного числа
  • Проверка спецификаторов строки на соответствие сразу нескольким форматам
  • Автозаполенение заголовка файла данными из информации о проекте
  • Отображение списка ссылок и комментариев из PO файлов

Параметры извлечения строк

Параметры извлечения строк из PO и MO файлов отображаются на вкладке Исходные ресурсы в диалоге свойств файла.

POSourceSettings

Radialix позволяет выбрать, какие строки извлекать - опции выбора msgid и msgstr. Если выбрать оба поля, то при извлечении ресурсов, а также при добавлении новых строк при обновлении ресурсов будет производиться импорт перевода.

Radialix поддерживает автоматическое определение кодировки файла путем чтения заголовка файла - пункт <Авто> в списке Кодировка. Полученное имя кодировки отображается в этом же пункте после тега <Авто>. Результат преобразования строк отображается в таблице Предварительный просмотр, число ошибок - в поле Ошибки преобразования символов.

Начальные настройки извлечения строк настраиваются в диалоге параметров для нового проекта - меню Проект>Свойства проекта по умолчанию, раздел Парсеры>Файлы Gettext.

Параметры локализованных файлов

Radialix поддерживает создание как MO файлов так и PO файлов - пункт Тип создаваемых файлов в диалоге свойств файла на вкладке Локализованные файлы.

POTargetSettings

В параметрах создания файлов можно включить автозаполнение заголовка файла данными из проекта - вкладка Опции, задать параметры форм множественного числа и кодировку файлов - вкладки Множественное число и Кодировки соответственно. Опция Порядок байтов используется только при создании MO файлов. Значение <По умолчанию> соответствует порядку байтов в оригинальном файле, если он является MO файлом, или порядку LittleEndian в противном случае.

Параметры форм множественного числа (число форм и формула для вычисления индекса строки) задаются таблицей Язык-Формула. Для получения параметров для требуемого языка Radialix просматривает таблицу начиная с первой записи. При совпадении языка или при наличии в записи тега <Любой язык> просмотр останавливается и используются параметры, заданные в этой записи. Если подходящая запись не найдена, то при создании локализованных файлов будет отображаться сообщение об ошибке.

POPluralList

Добавить данные в таблицу можно с помощью кнопки Вставить или путем ввода данных в самой последней строке таблицы вместо текста Выберите язык. Переместить записи можно  помощью мышки или с помощью кнопок Выше и Ниже. Если во время перетаскивания мышкой удерживать клавишу Ctrl, то будет вставлена копия записи. При поиске записей язык без указания страны эквивалентен любой стране, поэтому такую запись следует размещать ниже языков с указанием страны. Соответственно, запись с тегом <Любой язык> необходимо располагать в конце таблицы, так как записи ниже этой уже не будут участвовать в поиске. Переключатель в колонке Язык исключает запись из поиска. Для перехода в режим редактирования записи можно дважды щелкнув в требуемой ячейке таблицы. Параметры множественного числа редактируются в редакторе выражения множественного числа.

Кодировка создаваемых файлов также задается в виде таблицы, первым столбцом которой является Язык. Аналогичным образом Radialix производит поиск кодировки. Кодировка <Default> соответствует кодировке оригинального файла, если в нем использовалась кодировка UTF-8, или кодировке, заданной по умолчанию для языка перевода, в противном случае.

EncodingList

Также как и для параметров извлечения строк начальные значения параметров создания файлов можно изменить в диалоге параметров для нового проекта - меню Проект>Свойства проекта по умолчанию, раздел Парсеры>Файлы Gettext.

Редактор выражения множественного числа

Редактор выражения множественного числа используется для ввода числа форм и формулы для расчета индекса строки msgstr. Формула представляет собой выражение на языке  C, которое имеет один целочисленный параметр n. n - это числовой аргумент, подставляемый в строку. Например, в строки

msgstr[0] "%d день назад"

msgstr[1] "%d дня назад"

msgstr[2] "%d дней назад"

значение n будет подставлено вместо спецификатора %d. Получится:

"1 день назад" (подходят также числа 21, 31, 41 и т.д.)

"2 дня назад"  (подходят также числа 3, 4, 22..24, 32..34 и т.д.)

"5 дней назад" (подходят также числа 0, 6, 7, 8 и т.д.)

Результат вычисления выражения отображается в таблице Предварительный просмотр. Колонка Индекс - это результат вычисления формулы, колонка n - значение аргумента. Таблица содержит результаты вычисления для n от 0 до 1000. Информация об ошибках компиляции выражения и вычисления индекса выводится в списке сообщений.

POPluralDialog

Редактирование строк PO и MO файлов

Строки PO и MO отображаются в таблице строк в ресурсе ENTRIES, устаревшие строки - в ресурсе OBSOLETE. Строки OBSOLETE не сохраняются в MO файлах и по умолчанию имеют состояние Только для чтения.

Строки и число ссылок отображаются в соответствующих колонках таблицы. Для просмотра ссылок необходимо дважды щелкнуть на ячейке в колонке Ссылки.

Строки, имеющие формы множественного числа, отображаются в виде подстрок одной строки и отделяются друг от друга нулевым символом \0x00.Редактировать такие строки можно непосредственно в ячейках таблицы строк.

PluralString

Однако это удобнее сделать в редакторе строк, который можно вызвать  с помощью клавиши F2 или с помощью команды из контекстного меню. В этом редакторе перевод вводится в таблице Перевод в колонке Строка. В колонке # отображается индекс строки msgstr, в колонке n - значение параметра для выбора строки. Дополнительные команды редактирования (копирование строки, вставка символов и другие) доступны из контекстного меню.

PluralStringEditor

Также как и для обычных строк для строк множественного числа поддерживается вставка указателей горячей клавиши, сохранение символов в начале и в конце строки, а также автоперевод. При автопереводе производится автоматическое определение индекса строки msgstr, соответствующей единственному числу, и в нее вставляется перевод строки msgid. В остальные строки вставляется автоперевод строки msgid_plural. Все формы строки сохраняются в памяти переводов в виде одной записи, состоящей из подстрок, разделенных нулевым символом \0x00.

Проверка корректности множественного числа

Опция для проверки соответствия числа форм множественного числа находится в параметрах проверки корректности перевода проекта в разделе Строки/Текст. Эта опция всегда включена и не доступна для редактирования.

Проверка производится в соответствии с числом форм множественного числа, заданным в параметрах создания локализованных файлов в свойствах файла.

PluralFormChecker