- gettext
-
GNU gettext Тип Автор Ульрих Дреппер
Разработчики сообщество
Написана на Интерфейс Операционная система Linux и др. UNIX-подобные, Windows
Языки интерфейса русский и ещё 37 языков
Последняя версия 0.18.1.1 (6 июня 2010[1])
Состояние активное
Лицензия Сайт gettext — библиотека проекта GNU для интернационализации, широко применяемая в свободном ПО.
Содержание
Описание
Основным отличием от других подобных инструментов является то, что в gettext для обозначения переводимых строк в тексте программы используются их английские оригиналы, а не специальные идентификаторы. Таким образом получается, что для отображения интерфейса на английском языке программе не нужны файлы перевода. Это как правило удобно, потому что большинство разрабатываемых приложений и так пишутся на английском.
В gettext есть поддержка множественного числа. Для этого в исходном коде программы используется специальная функция, и приводятся две строки — в единственном и множественном числе. При подстановке перевода на другой язык используется столько форм строки-перевода, сколько нужно для этого языка. Для этого в заголовке файла перевода должно быть специфичное для этого языка выражение для выбора по числу номера строки-перевода.
Библиотека gettext предполагает хранение перевода в файлах с расширениями .mo (англ. Machine Object, бинарный файл, удобный для чтения программой и специфичный для платформы), или .gmo (GNU .mo) .po (англ. Portable Object, человеко-читаемый файл перевода, не зависящий от платформы) и .pot (англ. PO template — каталог, заготовка файла .po для перевода на новый язык).[2]. Кроме самих строк перевода, .po файлы могут содержать комментарии переводчика и различные служебные пометки.
Для формирования и обновления этих файлов при изменении программы предполагается использование ряда утилит.
Первоначально, строки из исходного текста программы собираются с помощью программы
xgettext
в .pot-файл (каталог). Обновление этого файла и файлов переводов с использованием новых и изменившихся строк, появившихся в исходном коде, осуществляется программойmsgmerge
. При этом сохраняются все уже переведённые строки, а те, которые изменились, помечаются как неточные (англ. fuzzy). По умолчанию, такие строки не будут использоваться программой. Они нужны для удобства переводчика: часто проще базироваться на существующем, пусть и устаревшем, переводе, чем переводить всю фразу заново.Для начала перевода программы на конкретный язык, переводчик создаёт
.po
-файл: копирует.pot
-файл в нужное место и меняет в нём заголовок. Для этого можно использовать программуmsginit
. Готовый файл перевода конвертируется в .mo-файлы утилитойmsgfmt
.[2].Также существуют утилиты для переводчиков, облегчающие редактирование перевода, например:
- Poedit кросплатформенный использует wxWidgets (при сохранении .po-файла пересобирает и соответствующий .mo -файл).
- Lokalize (ранее kBabel) для KDE.
- Gtranslator для GNOME.
- Pootle машинный перевод в он-лайн и инструмент управления переводами.
- gted плагин для Eclipse IDE.
- TM-database машинный перевод .po файлов c помощью он-лайн переводчика и память переводов
- В крайнем случае можно использовать простой текстовый редактор.
Кроме базовой реализации 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, языков платформы Mono (пространство имен Mono.Unix). Часть этих языков поддерживаются непосредственно упомянутыми выше утилитами.[2].
Использование в большинстве языков схоже с использованием в Си.
Использование
Для программиста
Простые строки
Строки, которые при работе программы отображаются пользователю и, соответственно, требуют перевода, в исходном коде программы пишутся по английски и размечаются вызовом функции
gettext
,ngettext
или подобной.printf(gettext("Hello! My name is %s.\n"), name);
Обычно для уменьшения размера исходного кода и улучшения читаемости объявляют и используют короткий синоним функции
gettext
—_
(символ подчёркивания). Таким образом, вызов преобразуется вprintf(_("Hello! My name is %s.\n"), name);
Для вышеприведённой строки в каталоге появится запись вроде этой:
#: src/name.c:36 msgid "Hello! My name is %s.\n" msgstr ""
Множественные числа
Для перевода множественного числа используется функция
ngettext
, которая принимает в качестве параметров две англоязычные строки (для единственного и множественного числа соответственно) и целое число. В PHP вызовngettext
для вывода строки с числом выглядит следующим образом:printf(ngettext("%d day ago", "%d days ago", $daysAgo), $daysAgo);
Функция
ngettext
сама по себе не производит подстановку числового значения вместо%d
, поэтому программисту необходимо вызвать функциюprintf
или подобную ей для формирования нужной строки с числом.Примеры форматирования текста
При переводе строк для формирования веб-интерфейсов можно форматировать текст, заключив текст в определённые HTML-теги. Например:
<i>Курсив</i> <b>Полужирный шрифт</b> <small>Уменьшенный шрифт</small>
В С-подобных языках (в частности, в php) перенос строки отображается символами
\n
, и переводя строки для программ, написанных на них, этим тоже можно пользоваться. Пример:"Текст.\nТекст"
результат:
Текст.
ТекстДля переводчика
Простые строки
Затем он переводит строки в этом файле, например, для русского перевода:
#: src/name.c:36 msgid "Hello! My name is %s.\n" msgstr "Привет! Меня зовут %s.\n"
Множественные числа
Для перевода множественных чисел необходимо, чтобы в заголовке (там, где указываются такие данные, как
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… дней
Выбор одной из этих трёх форм в зависимости от числа осуществляется следующей формулой[3]:
"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"
Выражение для
plural
здесь пишется с использованием синтаксиса языка Си, и может опираться лишь на переменнуюn
, которая обозначает выводимое число.После такого объявления формы приобретают номера 0, 1 и 2, и перевод фразы осуществляется следующим образом:
msgid "%d day ago" msgid_plural "%d days ago" msgstr[0] "%d день назад" msgstr[1] "%d дня назад" msgstr[2] "%d дней назад"
Для пользователя
Обычно пользователю в UNIX-подобных операционных системах не нужно предпринимать дополнительных шагов для выбора конкретного перевода. Перевод определяется системной переменной
LANG
, которая обычно уже установлена в требуемое значение.См. также
Примечания
- ↑ Официальный репозиторий gettext.
- ↑ 1 2 3 Руководство GNU gettext (англ.)
- ↑ Так выглядит строка в файле перевода .po. Знак \n в конце строки означает перенос строки.
Ссылки
- Сайт GNU gettext (англ.). Архивировано из первоисточника 17 февраля 2012. Проверено 23 ноября 2009.
- Практическое применение gettext для локализации и интернационализации приложений (рус.). Архивировано из первоисточника 17 февраля 2012. Проверено 23 ноября 2009.
Категории:- Программное обеспечение по алфавиту
- GNU
- Свободные библиотеки программ
- Локализация
Wikimedia Foundation. 2010.