factograf
RU
Войти

библиотека для интернационализации и локализации

gettext

Gettext
Все данные карточки 13
Тип
локализация программного обеспечения, библиотека
Автор
Ульрих Дреппер
Разработчик
проект GNU
Написана на
Си
Операционные системы
Unix-подобные, Microsoft Windows
Языки интерфейса
русский и ещё 37 языков
Дата выпуска
1990
Аппаратная платформа
кроссплатформенность
Последняя версия
1.0 (28 января 2026)
Репозиторий
git.savannah.gnu.org/cgi…
Состояние
активное
Лицензия
библиотека — LGPL инструменты — GPL документация — GFDL/GPL
Сайт
gnu.org/software/gettext/
Цикл генерации и обновления переводов Gettext
Цикл генерации и обновления переводов Gettext

gettext — библиотека проекта GNU для интернационализации, широко применяемая в свободном ПО.

Описание

Основным отличием от других подобных инструментов является то, что в gettext для обозначения переводимых строк в тексте программы используются их английские оригиналы, а не специальные идентификаторы. Таким образом получается, что для отображения интерфейса на английском языке программе не нужны файлы перевода. Это как правило удобно, потому что большинство разрабатываемых приложений и так пишется на английском.

В gettext есть поддержка множественного числа. Для этого в исходном коде программы используется специальная функция, и приводятся две строки — в единственном и множественном числе. При подстановке перевода на другой язык используется столько форм строки-перевода, сколько нужно для этого языка. Для этого в заголовке файла перевода должно быть специфичное для этого языка выражение для выбора по числу номера строки-перевода.

Библиотека gettext предполагает хранение перевода в файлах с расширениями.mo (англ. Machine Object, бинарный файл, удобный для чтения программой и специфичный для платформы) или.gmo (GNU.mo),.po (англ. Portable Object, человеко-читаемый файл перевода, не зависящий от платформы) и.pot (англ. PO template — каталог, заготовка файла.po для перевода на новый язык). Кроме самих строк перевода,.po-файлы могут содержать комментарии переводчика и различные служебные пометки.

Для формирования и обновления этих файлов при изменении программы предполагается использование ряда утилит, входящих в библиотеку gettext.

Первоначально строки из исходного текста программы собираются с помощью программы xgettext в .pot-файл (каталог). Обновление этого файла и файлов переводов с использованием новых и изменившихся строк, появившихся в исходном коде, осуществляется программой msgmerge. При этом сохраняются все уже переведённые строки, более неиспользуемые отмечаются как устаревшие, а те, которые изменились, помечаются как неточные (англ. fuzzy). По умолчанию устаревшие и неточные строки не будут использоваться программой. Они нужны для удобства переводчика: часто проще базироваться на существующем, пусть и устаревшем, переводе, чем переводить всю фразу заново.

Для начала перевода программы на конкретный язык переводчик создаёт .po-файл: копирует .pot-файл в нужное место и меняет в нём заголовок. Для этого можно использовать программу msginit. Готовый файл перевода конвертируется в.mo-файлы утилитой msgfmt..

Также существуют утилиты для переводчиков, облегчающие редактирование перевода, например:

  • 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, Scala, GNU awk, Паскаль, wxWidgets (с использованием класса wxLocale), YCP (язык YaST2), Tcl, Pike и R, языков платформы Mono (пространство имён Mono.Unix), а также для фреймворка Qt. Часть этих языков поддерживается непосредственно упомянутыми выше утилитами..

Использование в большинстве языков схоже с использованием в Си.

Использование

Для программиста

Простые строки

Строки, которые при работе программы отображаются пользователю и, соответственно, требуют перевода, в исходном коде программы пишутся по-английски и размечаются вызовом функции gettext, ngettext или подобной.

printf(gettext("Hello! My name is %s.\n"), name);

Обычно для уменьшения размера исходного кода и улучшения читаемости объявляют и используют короткий синоним функции #define _ gettext (символ подчёркивания). Таким образом, вызов преобразуется в

printf(_("Hello! My name is %s.\n"), name);

Для вышеприведённой строки в каталоге появится запись вроде этой, после соответствующей обработки командами xgettext и msginit:

#: 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 или подобную ей для формирования нужной строки с числом.

Для переводчика

Простые строки

Затем он переводит строки в этом файле, например, для русского перевода:

#: 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… дней

Выбор одной из этих трёх форм в зависимости от числа осуществляется следующей формулой:

"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, которая обычно уже установлена в требуемое значение.

См. также

  • Интернационализация
  • Память переводов

Примечания

Ссылки

  • Сайт GNU gettext (англ.). Дата обращения: 23 ноября 2009. Архивировано из оригинала 17 февраля 2012 года.
  • Практическое применение gettext для локализации и интернационализации приложений. Дата обращения: 23 ноября 2009. Архивировано из оригинала 17 февраля 2012 года.
  • Gettext для.NET и Mono (англ.). Архивировано из оригинала 11 мая 2013 года.

Читать дальше

На 23 языках

Текст из Википедии, CC BY-SA 4.0 · Статья-источник