gettext
Материал из Википедии — свободной энциклопедии
| gettext | |
| Тип | библиотека для интернационализации |
| Разработчик | Ulrich Drepper |
| Написана на | C |
| ОС | Кроссплатформенное программное обеспечение |
| Версия | 0,17 — 7 декабря 2007 |
| Лицензия | LGPL — библиотека GPL — инструменты (англ. tools) GFDL/GPL — документация |
| Сайт | http://www.gnu.org/software/gettext/ |
gettext — библиотека проекта GNU для интернационализации, широко применяется в свободном ПО.
Основным отличием от других подобных инструментов является использование английских строк вместо специальных идентификаторов в тексте программы и поддержка множественного числа.
Последняя версия на данный момент — 0.17.
Содержание |
[править] Использование
Кроме стандартного Си, поддерживаются также: C++, Objective-C, сценарии sh, сценарии bash, Python, Perl, PHP, GNU CLISP (англ.), Emacs Lisp, librep, GNU Smalltalk, Java, GNU awk, Паскаль, wxWidgets (с использованием класса wxLocale), YCP (язык YaST2), Tcl, Pike и R.
Использование в большинстве языков схоже с использованием в Си.
[править] Интернационализация
[править] Для программиста
[править] Простые строки
Строчки, которые необходимо перевести, размечаются в исходном коде вызовом функции gettext, ngettext или подобной. Обычно для уменьшения размера исходников и улучшения читаемости, для gettext объявляют и используют короткий синоним _ (символ подчёркивания). Таким образом, вызов
printf ("Hello! My name is %s.\n", name);
преобразуется в
printf (_("Hello! My name is %s.\n"), name);
Размеченные строки собираются в каталог с помощью утилиты xgettext. Например, для вышеприведённой строки в каталоге появится запись вроде этой:
#: src/name.c:36
msgid "Hello! My name is %s.\n"
msgstr ""
[править] Множественные числа
Для перевода множественного числа используется функция ngettext, которая принимает в качестве параметров две строки (для единственного и множественного числа соответственно) и целое число. В php вызов ngettext выглядит следующим образом:
ngettext("%d day ago","%d days ago",$days_ago)
Две строки необходимы для того, чтоб не делать отдельный перевод этой фразы на английский язык, т.к. большинство разрабатываемых приложений и так пишутся на английском. Функция ngettext сама по себе не производит подстановку числового значения вместо %d, поэтому программисту необходимо вызвать функцию printf или подобную ей для формирования нужной строки с числом.
[править] Для переводчика
[править] Простые строки
Переводчик создаёт на основе каталога .po-файл, содержащий перевод на конкретный язык. (Для этого можно использовать утилиту msginit.) В нём необходимо перевести все строки, например, для русского перевода:
#: src/name.c:36
msgid "Hello! My name is %s.\n"
msgstr "Привет! Меня зовут %s.\n"
Для редактирования .po-файлов существует множество инструментов, к примеру poEdit, но в крайнем случае можно использовать простой текстовый редактор.
[править] Множественные числа
Для перевода множественных чисел необходимо, чтобы в заголовке (там, где указываются такие данные как Project-Id-Version и PO-Revision-Date) файла перевода (*.po) было указано правило формирования множественных чисел для данного языка:
"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"
Для русского языка существут три формы множественных чисел:
1,21,31... день 2,3,4,22,23,24,32,33,34... дня 0,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,25,26,27,28,29,30,35,36... дней
Перевод такой фразы должен осуществлятся следующим образом:
msgid "%d day ago" msgid_plural "%d days ago" msgstr[0] "%d день назад" msgstr[1] "%d дня назад" msgstr[2] "%d дней назад"
[править] Для пользователя
Обычно пользователю в UNIX-подобных операционных системах не нужно предпринимать дополнительных шагов для выбора конкретного перевода. Перевод определяется системной переменной LANG, которая обычно уже установлена в требуемое значение.
[править] Поддержка существующих переводов
Обновление переводов с использованием новых и изменившихся строк, появившихся в исходном коде, осуществляется утилитой msgmerge. При этом сохраняются все уже переведённые строки, а те, которые изменились, помечаются как неточные (англ. fuzzy).
[править] См. также
[править] Ссылки
| В Википедии есть портал «Свободное ПО» |
- Сайт gettext (англ.). Проверено 2 ноября 2008.

