Автор (ы) оригинала | Sun Microsystems |
---|---|
Разработчик (и)) | различные |
Первоначальный выпуск | 1990 г.; 30 лет назад (1990 г.) |
Стабильный выпуск | 0.21 / 27 июля 2020 г.; 2 месяца назад (27.07.2020) |
Репозиторий | на основе OpenSolaris и GNU gettext |
Операционная система | Кросс-платформенный |
Тип | Интернационализация и локализация |
Лицензия | Различные лицензии на бесплатное программное обеспечение |
Веб-сайт | www.gnu.org / software / gettext / |
В вычислениях, gettext - это система интернационализации и локализации (i18n и l10n), обычно используемая для написания многоязычных программ на Unix-подобных компьютерах операционных системах. Одним из основных преимуществ gettext является то, что он отделяет программирование от перевода. Наиболее часто используемая реализация gettext - это GNU gettext, выпущенная GNU Project в 1995 году. Библиотека времени выполнения - libintl . gettext предоставляет возможность использовать разные строки для любого количества форм множественного числа существительных, но он не поддерживает грамматический род.
Изначально в POSIX не было средств локализации сообщений. В конце 1980-х были выдвинуты два предложения: Gettext Uniforum 1988 г. и X / Open 1989 г. (XPG-3 § 5). Sun Microsystems реализовала первый gettext в 1993 году. Разработчики Unix и POSIX никогда не договаривались, какой интерфейс использовать (другой вариант - это X / Open catgets), поэтому многие библиотеки C, включая glibc, реализовали оба. По состоянию на август 2019 года вопрос о том, должен ли gettext быть частью POSIX, все еще оставался предметом споров в Austin Group, несмотря на то, что его старый противник уже вышел из употребления. В число упомянутых проблем входили его зависимость от установленного системой языкового стандарта (глобальная переменная, подверженная проблемам с многопоточностью) и его поддержка новых расширений языка C с использованием широких строк.
GNU Проект решил, что подход gettext, использующий сообщение как ключ, проще и удобнее. (Большинство других систем, включая catgets, требует, чтобы разработчик придумывал «ключевые» имена для каждой строки.) Они выпустили GNU gettext, бесплатную реализацию системы в 1995 году. Gettext, GNU или нет., с тех пор был перенесен на многие языки программирования. Простота po и широкая поддержка редактора даже привели к его внедрению в непрограммных контекстах для текстовых документов или в качестве промежуточного звена между другими форматами локализации, с появлением таких преобразователей, как po4a (po для чего угодно) и Translate Toolkit, обеспечивающие такой мост. 4>
Базовым интерфейсом gettext является функция gettext (const char *)
, которая принимает string, который пользователь увидит на исходном языке, обычно английском. Чтобы сэкономить время ввода и уменьшить беспорядок в коде, эта функция обычно имеет псевдоним с на _
:
printf (gettext ("Меня зовут% s. \ N"), my_name); printf (_ ("Меня зовут% s. \ n"), my_name); // то же самое, но короче
gettext ()
затем использует предоставленные строки в качестве ключей для поиска переводов и вернет исходную строку, если перевод недоступен. В этом отличие от POSIX catgets()
,AmigaOS GetString ()
или Microsoft Windows LoadString ()
, где используется программный идентификатор (часто целое число). Чтобы справиться со случаем, когда один и тот же текст на исходном языке может иметь разные значения, gettext имеет такие функции, как cgettext ()
, которые принимают дополнительную строку «контекста».
xgettext
запускается в источниках для создания файла .pot
(шаблон переносимого объекта), который содержит список всех переводимых строк, извлеченных из источников. Комментарии, начинающиеся с ///
, используются для подсказок переводчикам, хотя другие префиксы также могут быть настроены для дальнейшего ограничения объема. Одним из таких распространенных префиксов является ПЕРЕВОДЧИКИ:
.
. Например, входной файл с комментарием может выглядеть так:
/// ПЕРЕВОДЧИКИ:% s содержит имя пользователя, указанное в настройках printf (_ ("Мой имя% s. \ n "), my_name);
xgettext
запускается с помощью команды:
xgettext -c /
Результирующий файл.pot с комментарием выглядит следующим образом (обратите внимание, что xgettext распознает строку как C -язык printf строка формата):
#. ПЕРЕВОДЧИКИ:% s содержит имя пользователя, как указано в настройках #, c-формат #: src / name.c: 36 msgid "Меня зовут% s. \ N" msgstr ""
В сценарии оболочки POSIX , gettext предоставляет библиотеку gettext.sh
, которую можно включить, которая предоставляет многие те же функции, что и gettext на аналогичных языках. GNU bash также имеет упрощенную конструкцию $ " msgid "
для простой функции gettext, хотя это зависит от библиотеки C для предоставления функции gettext()
.
Переводчик выводит .po
(переносимый объект) из шаблона с помощью программы msginit
, затем заполняет переводы. msginit
инициализирует переводы так, например, для французского языкового перевода, команда для запуска будет выглядеть так:
msginit --locale = fr --input = name.pot
Будет создан fr.po
. Затем переводчик редактирует полученный файл вручную или с помощью инструмента перевода, например, или Emacs с его режимом редактирования для файлов .po
. Отредактированная запись будет выглядеть так:
#: src / name.c: 36 msgid "Меня зовут% s. \ N" msgstr "Je m'appelle% s. \ N"
Наконец,.po файлы компилируются с помощью msgfmt
в двоичные файлы .mo
(машинный объект). GNU gettext может использовать собственное расширение имени файла .gmo
в системах с другой реализацией gettext. Теперь они готовы к распространению вместе с программным пакетом.
GNU msgfmt
также может выполнять некоторые проверки, относящиеся к строке формата , используемой языком программирования. Он также позволяет выводить данные в языковые форматы, отличные от MO.
На более поздних этапах рабочего процесса разработки msgmerge
можно использовать для «обновления» старого перевода на новый шаблон. Также существует msgunfmt
для обратной компиляции файлов .mo
и многие другие утилиты для пакетной обработки.
Пользователь в системах типа Unix устанавливает переменную среды LC_MESSAGES
, и программа отображать строки на выбранном языке, если для него есть файл .mo
.
Пользователи вариантов GNU также могут использовать вместо этого переменную среды LANGUAGE
. Его основное отличие от переменной Unix заключается в том, что он поддерживает несколько языков, разделенных двоеточием, для резервных вариантов.
Интерфейс ngettext ()
учитывает количество существительного в строке. Как и в случае с условным обозначением gettext ()
, на практике он часто называется псевдонимом N_
. Рассмотрим пример кода:
// параметры: английский в единственном числе, английский во множественном числе, число целых чисел printf (ngettext («% d переведенное сообщение», «% d переведенных сообщений», n), n);
Заголовок в записи ""
(пустая строка) файла PO хранит некоторые метаданные, одна из которых - форма множественного числа, используемая языком, обычно указываемая с использованием стиля C тернарный оператор. Допустим, мы хотим перевести словенский язык :
msgid "" msgstr "" "..." "Language: sl \ n" "Множественные формы: nplurals = 4; plural = (n% 100 = = 1? 1: n% 100 == 2? 2: n% 100 == 3 || n% 100 == 4? 3: 0); \ n "
Поскольку теперь существует четыре формы множественного числа, последняя po будет выглядеть так:
#: src / msgfmt.c: 876 #, c-format msgid "% d переведенное сообщение" msgid_plural "% d переведенное сообщение" msgstr [0] "% d prevedenih sporočil" msgstr [1] "% d преведено спорочило" msgstr [2] "% d prevedeni sporočili" msgstr [3] "% d prevedena sporočila"
Справочные правила множественного числа для языков предусмотрены консорциумом Unicode. msginit также предварительно заполняет соответствующее правило при создании файла для одного конкретного языка.
Помимо C, gettext имеет следующие реализации: C # для ASP.NET и для WPF, Perl, PHP, Python, Scala и Node.js.
GNU gettext имеет встроенную поддержку Objective-C, но пока нет поддержки языка программирования Swift. Часто используемой реализацией gettext на этих платформах Какао является POLocalizedString. Команда Microsoft Outlook для iOS также предоставляет библиотеку LocalizedStringsKit с API-интерфейсом, подобным gettext.
Викискладе есть носители, связанные с GNU gettext. |