Gettext
gettext — библиотека проекта GNU для интернационализации, широко применяемая в свободном ПО. ОписаниеОсновным отличием от других подобных инструментов является то, что в gettext для обозначения переводимых строк в тексте программы используются их английские оригиналы, а не специальные идентификаторы. Таким образом получается, что для отображения интерфейса на английском языке программе не нужны файлы перевода. Это как правило удобно, потому что большинство разрабатываемых приложений и так пишется на английском. В gettext есть поддержка множественного числа. Для этого в исходном коде программы используется специальная функция, и приводятся две строки — в единственном и множественном числе. При подстановке перевода на другой язык используется столько форм строки-перевода, сколько нужно для этого языка. Для этого в заголовке файла перевода должно быть специфичное для этого языка выражение для выбора по числу номера строки-перевода. Библиотека gettext предполагает хранение перевода в файлах с расширениями .mo (англ. Machine Object, бинарный файл, удобный для чтения программой и специфичный для платформы) или .gmo (GNU .mo), .po (англ. Portable Object, человеко-читаемый файл перевода, не зависящий от платформы) и .pot (англ. PO template — каталог, заготовка файла .po для перевода на новый язык).[3] Кроме самих строк перевода, .po-файлы могут содержать комментарии переводчика и различные служебные пометки. Для формирования и обновления этих файлов при изменении программы предполагается использование ряда утилит, входящих в библиотеку gettext. Первоначально строки из исходного текста программы собираются с помощью программы Для начала перевода программы на конкретный язык переводчик создаёт Также существуют утилиты для переводчиков, облегчающие редактирование перевода, например:
Кроме базовой реализации gettext для стандартного Си, существуют реализации аналогичного подхода для языков C++, Objective-C, сценариев sh/bash, Python, Perl, PHP, GNU CLISP, Emacs Lisp, librep, GNU Smalltalk, Java, Scala[4], GNU awk, Паскаль, wxWidgets (с использованием класса wxLocale), YCP (язык YaST2), Tcl, Pike и R, языков платформы Mono (пространство имён Mono.Unix), а также для фреймворка Qt. Часть этих языков поддерживается непосредственно упомянутыми выше утилитами.[3]. Использование в большинстве языков схоже с использованием в Си. ИспользованиеДля программистаПростые строкиСтроки, которые при работе программы отображаются пользователю и, соответственно, требуют перевода, в исходном коде программы пишутся по-английски и размечаются вызовом функции printf(gettext("Hello! My name is %s.\n"), name);
Обычно для уменьшения размера исходного кода и улучшения читаемости объявляют и используют короткий синоним функции printf(_("Hello! My name is %s.\n"), name);
Для вышеприведённой строки в каталоге появится запись вроде этой, после соответствующей обработки командами xgettext и msginit: #: src/name.c:36
msgid "Hello! My name is %s.\n"
msgstr ""
Множественные числаДля перевода множественного числа используется функция printf(ngettext("%d day ago", "%d days ago", $daysAgo), $daysAgo);
Функция Для переводчикаПростые строкиЗатем он переводит строки в этом файле, например, для русского перевода: #: src/name.c:36
msgid "Hello! My name is %s.\n"
msgstr "Привет! Меня зовут %s.\n"
Множественные числаДля перевода множественных чисел необходимо, чтобы в заголовке (там, где указываются такие данные, как
Выбор одной из этих трёх форм в зависимости от числа осуществляется следующей формулой[5]: "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"
Выражение для После такого объявления формы приобретают номера 0, 1 и 2, и перевод фразы осуществляется следующим образом: msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d день назад"
msgstr[1] "%d дня назад"
msgstr[2] "%d дней назад"
Для пользователяОбычно пользователю в UNIX-подобных операционных системах не нужно предпринимать дополнительных шагов для выбора конкретного перевода. Перевод определяется системной переменной См. такжеПримечания
Ссылки
|