stringtranslate.com

получить текст

В вычислительной технике gettext это система интернационализации и локализации (i18n и l10n), обычно используемая для написания многоязычных программ в Unix-подобных компьютерных операционных системах . Одним из основных преимуществ gettext является то, что он отделяет программирование от перевода. [3] Наиболее часто используемой реализацией gettext является GNU gettext , [4] выпущенная проектом GNU Project в 1995 году. Библиотекой времени выполнения является libintl . gettext предоставляет возможность использовать разные строки для любого количества форм множественного числа существительных, но эта функция не поддерживает грамматический род . Основными расширениями имен файлов , используемыми в этой системе, являются .POT (шаблон переносимого объекта), .PO (переносимый объект) и .MO (машинный объект). [5]

История

Первоначально POSIX не предоставлял средств локализации сообщений. В конце 1980-х годов были выдвинуты два предложения: gettext Uniforum 1988 года и X/Open catgets 1989 года (XPG-3 § 5). Компания Sun Microsystems реализовала первый gettext в 1993 году. Разработчики Unix и POSIX так и не договорились о том, какой интерфейс использовать (другой вариант — катжеты X/Open), поэтому многие библиотеки C , включая glibc , реализовали оба. [6] По состоянию на август 2019 года вопрос о том, должен ли gettext быть частью POSIX, все еще оставался предметом споров в Austin Group , несмотря на то, что его старый враг уже вышел из употребления. Выраженные опасения включали его зависимость от установленного в системе языкового стандарта ( глобальная переменная , подверженная проблемам многопоточности) и поддержку новых расширений языка C, включающих широкие строки. [7]

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

Операция

Программирование

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

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

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

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

xgettextзапускается на источниках для создания .potфайла (шаблона переносимого объекта), который содержит список всех переводимых строк, извлеченных из источников. Комментарии, начинающиеся с, ///используются для подсказки переводчикам, хотя другие префиксы также можно настроить для дальнейшего ограничения объема. Одним из таких распространенных префиксов является 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 предоставляет на аналогичных языках. [14] GNU bash также имеет упрощенную конструкцию $"msgid"для простой функции gettext, хотя предоставление функции зависит от библиотеки gettext()C. [15]

Идет перевод

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

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

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

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

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

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

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

Бег

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

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

Множественное число

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

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

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

msgid  "" msgstr  "" " ..." " Язык: sl\n" " Формы множественного числа: nplurals=4; множественное число=(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 преведено спорочил" msgstr[ 1 ]  "%d преведено спорочило" msgstr[ 2 ]  "%d преведена спорочили" msgstr[ 3 ]  "%d преведена спорочила"

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

Реализации

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

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

Смотрите также

Рекомендации

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

Внешние ссылки