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).

[править] См. также

[править] Ссылки

Портал:Свободное программное обеспечение
В Википедии есть портал
«Свободное ПО»
Источник — «http://ru.wikipedia.org/wiki/Gettext»