gettext
gettext | |
Тип | библиотека для интернационализации |
Разработчик | Ульрих Дреппер |
Написана на | Си |
ОС | различные |
Версия | 0.17 (7 декабря 2007) |
Лицензия | библиотека — LGPL инструменты — GPL документация — GFDL/GPL |
Сайт | http://www.gnu.org/software/gettext/ |
gettext — библиотека проекта GNU для интернационализации, широко применяемая в свободном ПО.
Основным отличием от других подобных инструментов является то, что в gettext для обозначения переводимых строк в тексте программы используются их английские оригиналы, а не специальные идентификаторы. Кроме того, в gettext есть поддержка множественного числа.
Использование
Кроме стандартного Си, поддерживаются также: 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(gettext("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 кросплатформенный использует wxWidgets.
- kBabel для KDE.
- Gtranslator для GNOME
- Pootle машинный перевод в он-лайн и инструмент управления переводами.
- gted плагин для Eclipse IDE.
- В крайнем случае можно использовать простой текстовый редактор.
Множественные числа
Для перевода множественных чисел необходимо, чтобы в заголовке (там, где указываются такие данные, как Project-Id-Version
и PO-Revision-Date
) .po
-файла было указано правило формирования множественных чисел для данного языка. Например, в русском языке существует три формы множественных чисел:
- 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... дней
Выбор одной из этих трёх форм в зависимости от числа осуществляется следующей формулой:
"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"
Эта формула имеет вид выражения на языке Си, в котором переменная n
обозначает число.
После такого объявления формы приобретают номера 0, 1 и 2, и перевод фразы осуществляется следующим образом:
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d день назад"
msgstr[1] "%d дня назад"
msgstr[2] "%d дней назад"
Для пользователя
Обычно пользователю в UNIX-подобных операционных системах не нужно предпринимать дополнительных шагов для выбора конкретного перевода. Перевод определяется системной переменной LANG
, которая обычно уже установлена в требуемое значение.
Поддержка существующих переводов
Обновление переводов с использованием новых и изменившихся строк, появившихся в исходном коде, осуществляется программой msgmerge
. При этом сохраняются все уже переведённые строки, а те, которые изменились, помечаются как неточные (англ. fuzzy). По умолчанию, такие строки не будут использоваться программой. Они нужны для удобства переводчика: часто проще базироваться на существующем, пусть и устаревшем, переводе, чем переводить всю фразу заново.
См. также
Ссылки
В Википедии есть портал
«Свободное ПО»
- Сайт gettext (англ.). Проверено 23 ноября 2009.
- Практическое применение gettext для локализации и интернационализации приложений (рус.). Проверено 23 ноября 2009.
ca:Gettext
cs:GNU gettext
de:GNU gettext
el:Gettext
en:GNU gettext
es:Gettext
fi:Gettext
fr:Gettext
it:Gettext
ja:Gettext
ms:Gettext
pl:GNU gettext
pt:Gettext
ro:Gettext
uk:Gettext
zh:Gettext
Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....