gettext

Поделись знанием:
Перейти к: навигация, поиск

GNU gettext
Тип

локализация программного обеспечения

Автор

Ульрих Дреппер

Разработчики

сообщество

Написана на

C

Интерфейс

командная строка

Операционная система

Linux и др. UNIX-подобные, Windows

Языки интерфейса

русский и ещё 37 языков

Состояние

активное

Лицензия

библиотека — LGPL
инструменты — GPL
документация — GFDL/GPL

Сайт

[www.gnu.org/software/gettext/ .org/software/gettext/]

К:Википедия:Статьи без изображений (тип: не указан)

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





Описание

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

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

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

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

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

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

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

  • Poedit кросплатформенный использует wxWidgets (при сохранении .po-файла пересобирает и соответствующий .mo -файл).
  • Lokalize (ранее kBabel) для KDE.
  • Gtranslator для GNOME.
  • [translate.sourceforge.net/wiki/pootle/index Pootle] машинный перевод в онлайн и инструмент управления переводами.
  • [www.gted.org/ gted] плагин для Eclipse IDE.
  • [yehongmei.narod.ru/ TM-database] машинный перевод .po файлов c помощью онлайн переводчика и память переводов
  • В крайнем случае можно использовать простой текстовый редактор.

Кроме базовой реализации gettext для стандартного Си, существуют реализации аналогичного подхода для языков C++, Objective-C, сценариев sh/bash, Python, Perl, PHP, GNU CLISP, Emacs Lisp, librep, GNU Smalltalk, Java, Scala[2], GNU awk, Паскаль, wxWidgets (с использованием класса wxLocale), YCP (язык YaST2), Tcl, Pike и R, языков платформы Mono (пространство имен Mono.Unix), а так же для фреймворка Qt. Часть этих языков поддерживаются непосредственно упомянутыми выше утилитами.[1].

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

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

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

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

Строки, которые при работе программы отображаются пользователю и, соответственно, требуют перевода, в исходном коде программы пишутся по-английски и размечаются вызовом функции 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 или подобную ей для формирования нужной строки с числом.

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

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

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

#: 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. 1 2 3 [www.gnu.org/software/gettext/manual/gettext.html Руководство GNU gettext] (англ.)
  2. [github.com/makkarpov/scalingua makkarpov/scalingua: A simple gettext-like internationalization library for Scala]. Проверено 28 апреля 2016.
  3. Так выглядит строка в файле перевода .po. Знак \n в конце строки означает перенос строки.

Ссылки

  • [www.gnu.org/software/gettext/gettext.html Сайт GNU gettext] (англ.). Проверено 23 ноября 2009. [www.webcitation.org/65W97iAj6 Архивировано из первоисточника 17 февраля 2012].
  • [blog.alconost.com/software-localization-using-gettext Практическое применение gettext для локализации и интернационализации приложений] (рус.). Проверено 23 ноября 2009. [www.webcitation.org/65W98979G Архивировано из первоисточника 17 февраля 2012].
  • [sourceforge.net/projects/gettextnet/ Gettext для .NET и Mono] (англ.). [www.webcitation.org/6GWlw4zKL Архивировано из первоисточника 11 мая 2013].

Отрывок, характеризующий Gettext

– Посмотри, Наташа, как ужасно горит, – сказала Соня.
– Что горит? – спросила Наташа. – Ах, да, Москва.
И как бы для того, чтобы не обидеть Сони отказом и отделаться от нее, она подвинула голову к окну, поглядела так, что, очевидно, не могла ничего видеть, и опять села в свое прежнее положение.
– Да ты не видела?
– Нет, право, я видела, – умоляющим о спокойствии голосом сказала она.
И графине и Соне понятно было, что Москва, пожар Москвы, что бы то ни было, конечно, не могло иметь значения для Наташи.
Граф опять пошел за перегородку и лег. Графиня подошла к Наташе, дотронулась перевернутой рукой до ее головы, как это она делала, когда дочь ее бывала больна, потом дотронулась до ее лба губами, как бы для того, чтобы узнать, есть ли жар, и поцеловала ее.
– Ты озябла. Ты вся дрожишь. Ты бы ложилась, – сказала она.
– Ложиться? Да, хорошо, я лягу. Я сейчас лягу, – сказала Наташа.
С тех пор как Наташе в нынешнее утро сказали о том, что князь Андрей тяжело ранен и едет с ними, она только в первую минуту много спрашивала о том, куда? как? опасно ли он ранен? и можно ли ей видеть его? Но после того как ей сказали, что видеть его ей нельзя, что он ранен тяжело, но что жизнь его не в опасности, она, очевидно, не поверив тому, что ей говорили, но убедившись, что сколько бы она ни говорила, ей будут отвечать одно и то же, перестала спрашивать и говорить. Всю дорогу с большими глазами, которые так знала и которых выражения так боялась графиня, Наташа сидела неподвижно в углу кареты и так же сидела теперь на лавке, на которую села. Что то она задумывала, что то она решала или уже решила в своем уме теперь, – это знала графиня, но что это такое было, она не знала, и это то страшило и мучило ее.
– Наташа, разденься, голубушка, ложись на мою постель. (Только графине одной была постелена постель на кровати; m me Schoss и обе барышни должны были спать на полу на сене.)
– Нет, мама, я лягу тут, на полу, – сердито сказала Наташа, подошла к окну и отворила его. Стон адъютанта из открытого окна послышался явственнее. Она высунула голову в сырой воздух ночи, и графиня видела, как тонкие плечи ее тряслись от рыданий и бились о раму. Наташа знала, что стонал не князь Андрей. Она знала, что князь Андрей лежал в той же связи, где они были, в другой избе через сени; но этот страшный неумолкавший стон заставил зарыдать ее. Графиня переглянулась с Соней.
– Ложись, голубушка, ложись, мой дружок, – сказала графиня, слегка дотрогиваясь рукой до плеча Наташи. – Ну, ложись же.
– Ах, да… Я сейчас, сейчас лягу, – сказала Наташа, поспешно раздеваясь и обрывая завязки юбок. Скинув платье и надев кофту, она, подвернув ноги, села на приготовленную на полу постель и, перекинув через плечо наперед свою недлинную тонкую косу, стала переплетать ее. Тонкие длинные привычные пальцы быстро, ловко разбирали, плели, завязывали косу. Голова Наташи привычным жестом поворачивалась то в одну, то в другую сторону, но глаза, лихорадочно открытые, неподвижно смотрели прямо. Когда ночной костюм был окончен, Наташа тихо опустилась на простыню, постланную на сено с края от двери.
– Наташа, ты в середину ляг, – сказала Соня.
– Нет, я тут, – проговорила Наташа. – Да ложитесь же, – прибавила она с досадой. И она зарылась лицом в подушку.
Графиня, m me Schoss и Соня поспешно разделись и легли. Одна лампадка осталась в комнате. Но на дворе светлело от пожара Малых Мытищ за две версты, и гудели пьяные крики народа в кабаке, который разбили мамоновские казаки, на перекоске, на улице, и все слышался неумолкаемый стон адъютанта.
Долго прислушивалась Наташа к внутренним и внешним звукам, доносившимся до нее, и не шевелилась. Она слышала сначала молитву и вздохи матери, трещание под ней ее кровати, знакомый с свистом храп m me Schoss, тихое дыханье Сони. Потом графиня окликнула Наташу. Наташа не отвечала ей.
– Кажется, спит, мама, – тихо отвечала Соня. Графиня, помолчав немного, окликнула еще раз, но уже никто ей не откликнулся.
Скоро после этого Наташа услышала ровное дыхание матери. Наташа не шевелилась, несмотря на то, что ее маленькая босая нога, выбившись из под одеяла, зябла на голом полу.
Как бы празднуя победу над всеми, в щели закричал сверчок. Пропел петух далеко, откликнулись близкие. В кабаке затихли крики, только слышался тот же стой адъютанта. Наташа приподнялась.
– Соня? ты спишь? Мама? – прошептала она. Никто не ответил. Наташа медленно и осторожно встала, перекрестилась и ступила осторожно узкой и гибкой босой ступней на грязный холодный пол. Скрипнула половица. Она, быстро перебирая ногами, пробежала, как котенок, несколько шагов и взялась за холодную скобку двери.
Ей казалось, что то тяжелое, равномерно ударяя, стучит во все стены избы: это билось ее замиравшее от страха, от ужаса и любви разрывающееся сердце.
Она отворила дверь, перешагнула порог и ступила на сырую, холодную землю сеней. Обхвативший холод освежил ее. Она ощупала босой ногой спящего человека, перешагнула через него и отворила дверь в избу, где лежал князь Андрей. В избе этой было темно. В заднем углу у кровати, на которой лежало что то, на лавке стояла нагоревшая большим грибом сальная свечка.
Наташа с утра еще, когда ей сказали про рану и присутствие князя Андрея, решила, что она должна видеть его. Она не знала, для чего это должно было, но она знала, что свидание будет мучительно, и тем более она была убеждена, что оно было необходимо.
Весь день она жила только надеждой того, что ночью она уввдит его. Но теперь, когда наступила эта минута, на нее нашел ужас того, что она увидит. Как он был изуродован? Что оставалось от него? Такой ли он был, какой был этот неумолкавший стон адъютанта? Да, он был такой. Он был в ее воображении олицетворение этого ужасного стона. Когда она увидала неясную массу в углу и приняла его поднятые под одеялом колени за его плечи, она представила себе какое то ужасное тело и в ужасе остановилась. Но непреодолимая сила влекла ее вперед. Она осторожно ступила один шаг, другой и очутилась на середине небольшой загроможденной избы. В избе под образами лежал на лавках другой человек (это был Тимохин), и на полу лежали еще два какие то человека (это были доктор и камердинер).
Камердинер приподнялся и прошептал что то. Тимохин, страдая от боли в раненой ноге, не спал и во все глаза смотрел на странное явление девушки в бедой рубашке, кофте и вечном чепчике. Сонные и испуганные слова камердинера; «Чего вам, зачем?» – только заставили скорее Наташу подойти и тому, что лежало в углу. Как ни страшно, ни непохоже на человеческое было это тело, она должна была его видеть. Она миновала камердинера: нагоревший гриб свечки свалился, и она ясно увидала лежащего с выпростанными руками на одеяле князя Андрея, такого, каким она его всегда видела.
Он был таков же, как всегда; но воспаленный цвет его лица, блестящие глаза, устремленные восторженно на нее, а в особенности нежная детская шея, выступавшая из отложенного воротника рубашки, давали ему особый, невинный, ребяческий вид, которого, однако, она никогда не видала в князе Андрее. Она подошла к нему и быстрым, гибким, молодым движением стала на колени.
Он улыбнулся и протянул ей руку.


Для князя Андрея прошло семь дней с того времени, как он очнулся на перевязочном пункте Бородинского поля. Все это время он находился почти в постояниом беспамятстве. Горячечное состояние и воспаление кишок, которые были повреждены, по мнению доктора, ехавшего с раненым, должны были унести его. Но на седьмой день он с удовольствием съел ломоть хлеба с чаем, и доктор заметил, что общий жар уменьшился. Князь Андрей поутру пришел в сознание. Первую ночь после выезда из Москвы было довольно тепло, и князь Андрей был оставлен для ночлега в коляске; но в Мытищах раненый сам потребовал, чтобы его вынесли и чтобы ему дали чаю. Боль, причиненная ему переноской в избу, заставила князя Андрея громко стонать и потерять опять сознание. Когда его уложили на походной кровати, он долго лежал с закрытыми глазами без движения. Потом он открыл их и тихо прошептал: «Что же чаю?» Памятливость эта к мелким подробностям жизни поразила доктора. Он пощупал пульс и, к удивлению и неудовольствию своему, заметил, что пульс был лучше. К неудовольствию своему это заметил доктор потому, что он по опыту своему был убежден, что жить князь Андрей не может и что ежели он не умрет теперь, то он только с большими страданиями умрет несколько времени после. С князем Андреем везли присоединившегося к ним в Москве майора его полка Тимохина с красным носиком, раненного в ногу в том же Бородинском сражении. При них ехал доктор, камердинер князя, его кучер и два денщика.