Из Википедии, бесплатной энциклопедии
  (Перенаправлено из GNU gettext )
Перейти к навигации Перейти к поиску

В вычислении , Gettext является интернационализации и локализации (i18n и l10n) система обычно используется для написания многоязычных программ на Unix-подобных компьютер операционных систем . Одним из основных преимуществ gettext является то, что он отделяет программирование от перевода. [3] Наиболее часто используемый реализация Gettext является ГНУ Gettext , [4] выпущен проекта GNU в 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 , реализовали оба. [5] По состоянию на август 2019 года вопрос о том, должен ли gettext быть частью POSIX, все еще обсуждался в Austin Group , несмотря на то, что его старый противник уже вышел из употребления. Приведенные опасения включали его зависимость от установленного системой языкового стандарта ( глобальная переменнаяподвержены проблемам многопоточности) и его поддержка новых расширений языка C, включающих широкие строки. [6]

Проект GNU решил, что подход gettext, использующий сообщение как ключ, проще и удобнее. (Большинство других систем, включая catgets, требует, чтобы разработчик придумывал "ключевые" имена для каждой строки.) [7] Они выпустили GNU gettext, бесплатную реализацию системы в 1995 году. [1] Gettext, GNU или нет. , с тех пор был перенесен на многие языки программирования. [8] Простота po и широкая поддержка редакторов даже привели к их внедрению в непрограммных контекстах для текстовых документов или в качестве промежуточного звена между другими форматами локализации, с появлением таких конвертеров, как po4a (po для чего угодно) и Translate Toolkit, обеспечивающие такую ​​возможность. мост. [9] [10]

Операция [ править ]

Программирование [ править ]

Типичный рабочий процесс gettext. Экземпляр de.po слева показывает «обновление» переводов через msgmerge.

Базовый интерфейс gettext - это gettext(const char*)функция, которая принимает строку, которую пользователь увидит на исходном языке, обычно на английском. Чтобы сэкономить время набора текста, а также для уменьшения кода помех, эта функция обычно псевдонимы в _:

printf ( gettext ( "Меня зовут% s. \ n " ),  my_name ); printf ( _ ( "Меня зовут% s. \ n " ),  my_name );  // то же самое, но короче

gettext()затем использует предоставленные строки в качестве ключей для поиска переводов и возвращает исходную строку, если перевод недоступен. В этом отличие от POSIX catgets() , [11] AmigaOS GetString() или Microsoft Windows, LoadString() где используется программный идентификатор (часто целочисленный). Чтобы справиться с ситуацией, когда один и тот же текст на исходном языке может иметь разные значения, gettext имеет такие функции, cgettext()которые принимают дополнительную строку «контекста».

xgettextзапускается в источниках для создания .potфайла (Portable Object Template), который содержит список всех переводимых строк, извлеченных из источников. Комментарии, начинающиеся с ///, используются для подсказок переводчикам, хотя другие префиксы также можно настроить для дальнейшего ограничения объема. Один из таких распространенных префиксов - TRANSLATORS:.

Например, входной файл с комментарием может выглядеть так:

/// ПЕРЕВОДЧИКИ:% s содержит имя пользователя, как указано в настройках printf ( _ ( "Меня зовут% s. \ N " ),  my_name );

xgettext запускается с помощью команды:

xgettext -c /

Результирующий файл .pot с комментарием выглядит следующим образом (обратите внимание, что xgettext распознает строку как строку формата printf на языке C ):

#. ПЕРЕВОДЧИКИ:% s содержит имя пользователя, как указано в настройках #, c-формат #: src / name.c: 36 msgid "  Меня зовут% s. \ N" msgstr  ""

В сценарии оболочки POSIX gettext предоставляет gettext.shбиблиотеку, которую можно включить, которая предоставляет многие те же функции, которые gettext предоставляет на схожих языках. [12] GNU bash также имеет упрощенную конструкцию $"msgid"для простой функции gettext, хотя она зависит от библиотеки C для предоставления gettext()функции. [13]

Перевод [ править ]

Переводчик извлекает .poфайл (переносимый объект) из шаблона с помощью msginitпрограммы, а затем заполняет переводы. [14] msginit инициализирует переводы, поэтому, например, для французского перевода команда для запуска будет: [15]

msginit --locale = fr --input = name.pot

Это создаст fr.po. Затем переводчик редактирует полученный файл вручную или с помощью инструмента перевода, такого как Poedit , или Emacs с его режимом редактирования .poфайлов. Отредактированная запись будет выглядеть так:

#: src / name.c: 36 msgid "  Меня зовут% s. \ n" msgstr  "Je m'appelle% s. \ n"

Наконец, файлы .po компилируются msgfmtв двоичные .moфайлы (машинные объекты). GNU gettext может использовать собственное расширение имени файла .gmoв системах с другой реализацией gettext. [16] Теперь они готовы к распространению вместе с программным пакетом.

GNU msgfmtтакже может выполнять некоторые проверки, относящиеся к строке формата, используемой языком программирования. Он также позволяет выводить в языковые форматы, отличные от MO; [17] X / Open эквивалент gencat.

На более поздних этапах рабочего процесса разработки msgmergeможет использоваться для «обновления» старого перевода на новый шаблон. Также есть утилиты для msgunfmtобратной компиляции .moфайлов и множество других утилит для пакетной обработки.

Бег [ править ]

В системах типа Unix пользователь устанавливает переменную среды LC_MESSAGES , и программа будет отображать строки на выбранном языке, если для этого есть .moфайл.

Пользователи вариантов GNU также могут LANGUAGEвместо этого использовать переменную среды . Его основное отличие от переменной Unix заключается в том, что она поддерживает несколько языков, разделенных двоеточием, для возврата. [18]

Форма множественного числа [ править ]

ngettext()Интерфейс счет для подсчета существительного в строке. Как и в случае с условным обозначением gettext(), N_в практическом использовании он часто называется псевдонимом . Рассмотрим пример кода:

// параметры: английское единственное число, английское множественное число, целое число printf ( ngettext ( "% d переведенное сообщение" ,  "% d переведенное сообщение" ,  n ),  n );

Заголовок в ""(пустой строке) вхождении PO файл хранит некоторые метаданные, один из которых является форма множественного числа , что язык , используемые, как правило , задается с помощью C-стилем оператора трехкомпонентного . Допустим, мы хотим перевести на словенский язык :

MSGID  "" выводе ,  "" "..." " Язык: сл \ п" " Plural-Forms: ? nplurals = 4; множественное число = (п% 100 == 1 1: п% 100 == 2 2: п% 100 == 3 || n% 100 == 4? 3: 0); \ n "

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

#: SRC / msgfmt.c: 876 #, C-формат MsgID  "% d переведенное сообщение" msgid_plural  "% D переведенных сообщения" вывод , [ 0 ]  "% d prevedenih sporočil" вывод , [ 1 ]  "% d prevedeno sporočilo" вывод , [ 2 ]  "% d prevedeni sporočili" msgstr [ 3 ]  "% d prevedena sporočila"

Правила множественного числа ссылок для языков предоставляются консорциумом Unicode . [19] msginit также предварительно заполняет соответствующее правило при создании файла для одного конкретного языка. [14]

Реализации [ править ]

В дополнение к C , gettext имеет следующие реализации: C # для ASP.NET [20] [21] и для WPF , [22] Perl , [23] PHP , [24] Python , [25] Scala , [26] и Node.js . [27]

GNU gettext имеет встроенную поддержку Objective-C, но пока нет поддержки языка программирования Swift . Часто используемой реализацией gettext на этих платформах Какао является POLocalizedString. [28] Группа разработчиков Microsoft Outlook для iOS также предоставляет библиотеку LocalizedStringsKit с API, подобным gettext. [29]

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

  • переводчик
  • Poedit
  • Translate Toolkit
  • Virtaal
  • Weblate

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

  1. ^ a b "История gettext () и др.? - comp.unix.solaris" . Compgroups.net . Проверено 3 апреля 2016 года .
  2. ^ https://ftp.gnu.org/pub/gnu/gettext/
  3. Мартиндейл, Линда (1 ноября 2002 г.). «Преодоление цифрового разрыва в Южной Африке | Linux Journal» . linuxjournal.com . Linux Journal . Архивировано 17 сентября 2019 года . Проверено 17 сентября 2019 года .
  4. ^ Tykhomyrov, Olexiy Ye (1 ноября 2002). «Введение в программирование интернационализации | Linux Journal» . linuxjournal.com . Linux Journal . Архивировано 17 сентября 2019 года . Проверено 17 сентября 2019 года .
  5. ^ «Перевод сообщений» . GNU C Library .
  6. ^ «0001122: POSIX должен включать gettext () и друзей - Austin Group Defect Tracker» . Система отслеживания дефектов Austin Group .
  7. ^ "Взгляд программиста" . gettext 0.10.35 . 30 апреля 1998 г.
  8. ^ "Утилиты GNU gettext: Список языков программирования" .
  9. ^ "po4a" . po4a.org .
  10. ^ «Необходимый инструментарий для инженеров по локализации» . Перевести Toolkit .
  11. ^ "О котгетсах" . gnu.org . Проверено 24 октября 2017 года .
  12. ^ "Утилиты GNU gettext: sh" .
  13. ^ "Утилиты GNU gettext: bash" .
  14. ^ a b "Утилиты GNU gettext: PO-файлы" . Gnu.org . Проверено 3 апреля 2016 года .
  15. ^ «Как переводить с помощью GetText PO и POT файлов» . Icanlocalize.com . Проверено 3 апреля 2016 года .
  16. ^ «Файлы, передающие переводы» . Gnu.org . Проверено 22 апреля 2014 года .
  17. ^ "вызов msgfmt" . Утилиты GNU gettext .
  18. ^ «Утилиты GNU gettext: переменные среды локали» . Gnu.org . Проверено 3 апреля 2016 года .
  19. ^ "Языковые правила множественного числа" . unicode.org .
  20. ^ «Архив Google Code - Долгосрочное хранилище для хостинга проектов Google Code» . Code.google.com . Проверено 3 апреля 2016 года .
  21. ^ "turquoiseowl / i18n: Интеллектуальная интернационализация для ASP.NET" . GitHub.com . Проверено 3 апреля 2016 года .
  22. ^ «NGettext.Wpf - Правильная поддержка интернационализации для WPF (через NGettext)» .
  23. ^ "libintl-perl - Библиотека интернационализации для Perl, которая стремится быть совместимой с системой переводов сообщений Uniforum, реализованной, например, в GNU Gettext" . github.com . Проверено 14 сентября 2017 года .
  24. ^ "Gettext" . php.net . Проверено 24 октября 2017 года .
  25. ^ "gettext - Многоязычные службы интернационализации - Документация Python 3.7.0" . docs.python.org . Проверено 21 сентября 2018 года .
  26. ^ "makkarpov / scalingua: Простая библиотека интернационализации, подобная gettext для Scala" . github.com . Проверено 28 апреля 2016 года .
  27. ^ "DanielBaulig / node-gettext: Адаптация библиотеки Javascript Gettext Джошуа И. Миллера для node.js" . GitHub.com . Проверено 3 апреля 2016 года .
  28. ^ "hulab / POLocalizedString: gettext для iOS / OS X / watchOS / tvOS" . GitHub . хулаб. 19 сентября 2019.
  29. ^ «microsoft / LocalizedStringKit: Создавайте файлы .strings прямо из вашего кода» . GitHub . Microsoft. 12 февраля 2020.

Внешние ссылки [ править ]

  • Официальный сайт GNU gettext