- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF136:Gettext
Материал из Linuxformat.
- Перевод Сделаем открытое ПО доступным неанглоговорящим
Содержание |
Gettext: Скажи свое слово
- Если английский для вас – иностранный язык, почему бы не помочь перевести программы на родную речь? Коэн Вервлоесем показывает, как.
Хотите помочь любимой открытой программе, но не знаете как, потому что программист вы неопытный? Если английский для вас – иностранный язык, переведите программу на ваш собственный! Но зачем этим заниматься? Как читатель Linux Format, вы, наверное, неплохо знаете английский, а то и вообще предпочитаете английскую версию программы, так как это оригинал, и, следовательно, ближе к идее. Но есть ведь и другие люди, которые говорят на вашем родном языке, а английский знают хуже, и отсутствие хорошего перевода затрудняет им работу с программой. Так почему бы не помочь им, сделав этот перевод?
Сперва надо бы узнать, как программа «подцепляет» перевод. Многие популярные программы с открытым исходным кодом применяют подход GNU Gettext, определяющий, как должна быть написана программа, чтобы она поддерживала переведенные сообщения. Проект также содержит библиотеку времени выполнения, которой должны пользоваться программисты, чтобы их сообщения переводились, и ряд утилит в помощь переводчику.
Переводчики обычно не работают с Gettext напрямую, но полезно знать, как он работает в целом. Если программа на C выводит следующее сообщение:
printf(“Unknown command: %s.\n”, command);
программист может сделать его переводимым, применив функцию gettext ко всем строкам таким образом:
printf(gettext(“Unknown command: %s.\n”), command);
Правильно настроенная функция gettext ищет переданную ей строку в файлах перевода, и если перевод есть, возвращает строку на языке пользователя. В противном случае возвращается исходная строка. Язык пользователя обычно задается в окружении рабочего стола или вручную в скрипте X-сессии в переменной окружения LC_MESSAGES.
Так как gettext() вокруг каждой строки загромождает код, в большинстве программ определяется псевдоним _ (на C: #define _(string) gettext (string)), делающий код на C покороче:
printf(_(“Unknown command: %s.\n”), command);
Реализация Gettext существует не только для C, но и для множества других языков и программных оболочек. Она быстро стала стандартом для перевода открытых программ, хотя некоторые проекты, например, OpenOffice.org и Mozilla, имеют собственный формат.
Файлы и функции
Но откуда берутся файлы с переводами? Для этого в Gettext есть команда xgettext. Если передать ей файл программы на C, в которой вызывается функция gettext, она создаст файл .pot (машинно-независимый шаблон объекта) со списком всех переводимых строк файла. В нашем примере файл .pot будет содержать следующие строки:
#: src/command.c:14 msgid “Unknown command: %s.\n” msgstr “”
Обратите внимание, что файл .pot ссылается на точную позицию строки в исходном файле программы. Благодаря этому переводчик может обратиться к контексту, если не уверен в правильности перевода.
Однако переводчики никогда не работают с файлами .pot напрямую – в конце концов, это шаблоны. На основе файла .pot другая утилита Gettext, Msginit, создает файл .po (машинно-независимый объект). Например, если для проекта нет перевода на русский, а вы решили его создать, запустите команду:
msginit --locale=ru --input=command.pot
Создастся файл ru.po, который вы сможете отредактировать.
Предыдущую строку можно перевести таким образом:
#: src/command.c:14 msgid “Unknown command: %s.\n” msgstr “Неизвестная команда: %s.\n”
И, наконец, все файлы .po программы компилируются в двоичный формат еще одной утилитой Gettext – Msgfmt. Результирующие файлы имеют расширение .mo (машинный объект) и распространяются вместе с двоичными файлами программы. При установке они копируются в /usr/local/share/locale/код_языка/LC_MESSAGES/program.mo, где код_языка заменяется кодом языка для всех существующих переводов.
Все это обычно осуществляется автоматически в файлах Makefile или других скриптах сборки. Кроме того, большинство шагов преобразований и других команд обрабатываются куратором переводов или программистами. Поэтому не бойтесь наших объяснений – вам нужно лишь отредактировать файлы .po! Так как для переводчика эти файлы – то же, что исходный код для программиста, рассмотрим некоторые детали: комментарии и формы множественного числа.
Комментарии и плюрализмы
Перед строкой msgid в файле .po могут быть комментарии различных типов, и большинство из них автоматически генерируется утилитами Gettext. Мы уже видели строку комментария, начинающуюся с символов #: и содержащую ссылку на строку исходного кода программы. Комментарии другого типа начинаются с #. — их пишут программисты для переводчика, чтобы передать контекст или предупредить о часто совершаемой ошибке.
Комментарии третьего типа начинаются с #, и содержат флажки. В противоположность #: и #., предназначенным только для информации, комментарии типа #, интерпретируются редактором .po. Один из самых популярных флагов – fuzzy:
#, fuzzy
Утилита Gettext Msgmerge обычно приписывает этот флажок к сообщению, которое было изменено в исходном коде, но не обновлено в переводе. Для переводчика это знак посмотреть на перевод и принять во внимание сообщение оригинала. Переводчик может вручную пометить перевод флагом fuzzy, если сомневается, что он верен, чтобы не забыть заняться им еще раз позже.
Хотя все комментарии создаются автоматически, переводчик может добавлять их и вручную – тогда им должен предшествовать символ #.
Формы множественного числа в английском, возможно, несложные, но в некоторых языках это не так, и в Gettext есть сложная система их поддержки. Не всегда достаточно просто добавить s в конце слова. В заголовке файла .po есть строка, описывающая формы множественного числа языка. Для германских и романских языков она выглядит так:
“Plural-Forms: nplurals=2; plural=(n != 1);\n”
Это означает, что в языке есть две формы: единственная и множественная, и форма множественного числа употребляется тогда, когда число предметов, о которых мы говорим, не равно единице. Посмотрим теперь на одну из строк для множественного числа:
#: src/game.cpp:1566 msgid “The following add-on had errors and could not be loaded:” msgid_plural “The following add-ons had errors and could not be loaded:” msgstr[0] “De volgende add-on bevat fouten en kon niet worden geladen:” msgstr[1] “De volgende add-ons bevatten fouten en konden niet worden geladen:”
Это фрагмент файла .po с переводом на голландский для игры Battle for Wesnoth, где мне попались неполно или неправильно переведенные сообщения, которые я захотел перевести правильно. Здесь строка msgid – это форма единственного числа для английского языка, а форма множественного числа записана в файле msgid_plural. Форма единственного числа переведена в строке msgstr[0], а множественного – в строке msgstr[1].
Для языков с другими формами множественного числа эта схема отличается. Например, если nplurals для некоторого языка равна 3, также появляется строка msgstr[2].
Принимаемся за дело
Редактировать файлы .po можно в вашем любимом редакторе: Gedit, Vim или Emacs, причем весьма эффективно. Vim распознает формат .po, и если подсветка синтаксиса активна, кое-что будет выделено цветами. Кроме того, если включить проверку орфографии в файле .po, Vim сможет подсветить ошибки в строках msgstr. Итак, сделайте проверку орфографии, введите недостающие строки перевода, исправьте неправильные и пошлите обновленный файл .po куратору переводов в проекте. Но прежде чем отправлять файл, проверьте синтаксис следующей командой:
$ msgfmt --statistics --check-header <переведнный_файл.po>
Хотя обычные редакторы вполне пригодны для перевода небольших файлов .po, для больших файлов они непрактичны. Перевод – особая задача, которая для эффективной работы требует специальный интерфейс обзора контекста. К счастью, для переводчиков существует масса инструментов Gettext. В качестве бонуса они гарантируют вам правильный синтаксис. Мы рассмотрим самые популярные, но если вы пользуетесь Emacs, в нем есть режим .po.
В большинстве редакторов PO можно скопировать исходный текст в поле перевода, что особенно удобно для текстов со сложными или длинными именами.
Хорошая программа перевода – Poedit (http://www.poedit.net). При первом запуске вам потребуется ввести свое имя и адрес электронной почты, которые потом можно будет изменить в настройках. Эта информация записывается в строке Last-Translator при сохранении файла.
При открытии файла .po программа считывает все сообщения и выводит их список в главном окне. Сначала идут непереведенные строки, затем – строки, в переводе которых переводчик не был уверен (с флажком fuzzy), и, наконец, переведенные строки. Строки каждого типа выделяются своим цветом. В левом столбце находятся исходные строки, в правом – переводы. При выборе строки исходная строка и перевод показываются в нижней части окна, там, где редактируется перевод.
Знать контекст
Первым делом нужно включить окна Comments [Комментарии] и Automatic Comments [Автоматические комментарии] (в меню View [Вид]). Это даст вам некоторый контекст, который был задан программистом в файле .po с помощью инструментов Gettext. В строке состояния в нижней части окна вы также увидите некоторую статистику: например, процент переведенных сообщений.
Итак, щелкните по строке в списке и приступайте к переводу. Если вы не уверены в переводе, пометьте строку флажком fuzzy, нажав кнопку с облаком. Щелкнув по иконке блокнота, к переводу можно добавить комментарий. Закончив переводить, сохраните полученный результат и отправьте его куратору.
Очень приятная возможность спрятана в пункте меню Catalog > Settings [Каталог > Настройки]. Если кликнуть по вкладке Paths [Пути], вы сможете ввести основной путь к каталогу проекта. Это удобно, если вы загружаете полный исходный код проекта, а не только файл .po. Когда этот путь задан правильно, можно правой кнопкой щелкнуть по строке, и в отдельном окне откроется соответствующая строка в исходном коде.
Официальный редактор файлов .po для Gnome называется Gtranslator. При первом запуске появляется окошко мастера для создания профиля. Введите название проекта, свое имя, адрес электронной почты, язык, адрес электронной почты команды и т. д. Все это можно изменить позже в настройках и даже добавить профили; таким образом Gtranslator позволяет переключаться между различными профилями для различных проектов перевода.
Веселье начинается, конечно, с открытием файла .po в Gtranslator. Расположение окон напоминает Poedit, но по умолчанию в Gtranslator строки показываются в том порядке, в котором они идут в файле .po, а статус непереведенных или отмеченных флажком fuzzy указывается соответствующим символом в отдельном столбце. Чтобы просмотреть непереведенные или помеченные флажком fuzzy строки, просто щелкните на столбце Status [Статус] для сортировки сообщений.
В Gtranslator есть масса горячих клавиш для перехода к предыдущему или следующему сообщению, сообщению с флажком fuzzy, непереведенному сообщению и т. д. Перейдите в меню Go [Переходы] и взгляните на эти комбинации клавиш. Чем лучше вы их знаете, тем быстрее сможете перевести файлы .po в Gtranslator.
Программа также поддерживает систему модулей расширения – доступны модули карты символов для вставки специальных символов простым щелчком на них, словаря, где можно искать слова, и окна для просмотра исходного кода.
Для KDE
В KDE4 роль Gtranslator выполняет Lokalize. У обоих редакторов примерно одинаковой набор возможностей, включая горячие клавиши. Но учтите, что в Lokalize строки, в понимании которых переводчик не уверен, обозначаются как неготовые (‘Not ready’) в меню и как подлежащие пересмотру (‘Needs review’) в списке переводов, что немного нелогично. Оба термина более информативны, чем ‘fuzzy’ (неясный), но могут сбить вас с толку, если вы привыкли к обозначениям Gettext.
Расположение окон в Lokalize немного отличается от других программ. Список исходных строк и переводов показывается в левом верхнем углу окна, в котором есть и удобная строка поиска, а выбранные строка и перевод показываются справа. Комментарии показываются в левом нижнем углу экрана со ссылкой на файлы исходного кода. Lokalize – мощный редактор, но его интерфейс – не самый понятный или удачный с точки зрения используемого экранного пространства.
Простота — это прекрасно
Virtaal поддерживает не только файлы .po, но и другие форматы локализации, но здесь мы будем говорить только о файлах .po. При открытии файла .po сразу становится понятно, что интерфейс Virtaal гораздо беднее по сравнению с другими программами. Перед вами список с двумя столбцами: исходными строками и их переводами. Выбранная строка превращается в поле ввода, где можно изменить перевод, и содержит дополнительную галочку, с помощью которой можно обозвать перевод «неясным». Также показываются комментарии. На первый взгляд это кажется бедноватым, но с задачей справляется блестяще. Также можно выбрать навигацию только по непереведенным строкам – Virtaal не совсем корректно называет их «Незавершенными» (‘Incomplete’) – или находить нужные строки с помощью поиска.
Хотя минималистичный интерфейс прост, программе не хватает массы возможностей, имеющихся в других приложениях. Например, в ней нет горячих клавиш, что замедляет работу. В строке состояния не показывается статистика – вместо нее там показываются языки оригинала и перевода, которые вы и так знаете. Настройки Virtaal также довольно спартанские.
Пока мы говорили только о технических деталях, и здесь легко забыть, что интернационализация программы по большей части касается языка. Если у вас нелады с правописанием и вас не задевает неправильно написанное слово, не беритесь за перевод. От программистов мы все ждем программ без ошибок, и вам тоже нужно держать планку и предоставлять безупречный продукт. Конечно, ошибки делают все, но стремитесь к лучшему, и вот вам несколько советов.
Это все о контексте
В большинстве редакторов PO есть возможность «перевести строки автоматически». Не пользуйтесь ею: верный перевод получается нечасто, и на исправление автоматического перевода уходит больше времени, чем на перевод с нуля.
Правильный перевод фразы часто зависит от контекста. Например, в программе есть непереведенное сообщение ‘No match’ («Нет соответствия»), и его значение трудно понять без контекста. Программа жалуется, что не может что-то запустить? Или некий объект не соответствует шаблону? Конечно, сообщение слишком расплывчатое, и программисту нужно было описать ситуацию более подробно.
Но есть и такие ситуации, когда у совершенно ясных сообщений может быть различный смысл, и, следовательно, переводить их нужно по-разному. И понять, что означает сообщение в контексте программы – задача переводчика. Поэтому в файле .po и указывается положение сообщения в файле исходного кода: не стесняйтесь заглянуть туда! А еще лучше запустить программу и создать ситуацию, в которой появляется сообщение. Делать это лучше до перевода: это позволит вам правильнее понять контекст, в котором появляется сообщение.
Прежде чем браться за перевод новой программы или даже менять перевод существующей, хорошо бы вступить в контакт с командой переводчиков проекта. Не только для того, чтобы избежать двойной работы, но и для того, чтобы разузнать о рабочем окружении команды. Обычно список ответственных за перевод висит на домашней странице проекта, но контактные данные группы переводчиков для того или иного языка можно также найти в заголовке файла .po в поле Language-Team.
И не работайте в одиночку: это источник множества проблем. Будьте максимально ответственным перед командой и не старайтесь решить все проблемы сами. Если вы не уверены в переводе, поговорите с партнерами по команде в рассылке. И не считайте перевод своей собственностью: если кто-то его улучшил, не сердитесь. Если вы не одобряете изменения, поговорите с их автором, но делайте это цивилизованно и пользуйтесь только теми аргументами, которые обоснованы лингвистическими или стилистическими причинами. Перевод открытого ПО – как и программирование – командная работа.
Ресурсы
- GNU Gettext http://www.gnu.org/software/gettext
- Руководство по GNU Gettext http://www.gnu.org/software/gettext/manual/gettext.html
- Poedit http://www.poedit.net
- Gtranslator http://projects.gnome.org/gtranslator
- Lokalize http://userbase.kde.org/Lokalize
- Virtaal http://virtaal.org
Если вам некогда, задавайте приоритеты
Если ваше время ограничено, вы все равно можете помочь. Не пугайтесь количества переводимых сообщений в некоторых программах – просто задавайте приоритеты: в первую очередь переводите сообщения, которые пользователь видит большую часть времени или которые появляются чаще всего. Конечно, эти собщения можно найти, запустив программу и осмотрев важные сообщения, которые пока не переведены, но в Gettext есть удобная утилита, помогающая решить эту задачу. Для начала откройте терминал и введите следующие команды:
$ export LD_PRELOAD=/usr/lib/preloadable_libintl.so $ export GETTEXT_LOG_UNTRANSLATED=$HOME/gettextloguntranslated
Затем запустите из этого терминала программу, сообщения в которой хотите перевести – например, таким образом (для игры Battle for Wesnoth):
$ wesnoth
Немного поработайте с ней обычным образом, и после ее закрытия в файле gettextloguntranslated домашнего каталога появится список сообщений, которые программа пыталась перевести, но не обнаружила перевод для вашего языка. Это PO-файл, но до отправки в PO-редактор его необходимо предварительно обработать. Этот процесс подробно описан в разделе 12.7 руководства по Gettext.