PO4A(7) | Инструменты Po4a | PO4A(7) |
po4a - платформа для перевода документации и других материалов
Ниже приводится дополнение на любом языке, но только если оно существует. Если дополнение не существует, об ошибке не сообщается.
Этот документ служит введением в проект po4a, ориентированным на потенциальных пользователей, рассматривающих возможность использования этого инструмента, и на любознательных, желающих понять, почему все происходит именно так, как происходит.
Философия свободного программного обеспечения (ПО) состоит в том, чтобы сделать технологии по-настоящему доступными всем. Но лицензирование — это не единственное, о чём стоит задуматься: непереведённое свободное ПО бесполезно для неанглоговорящих пользователей. И нам предстоит ещё кое-какая работа, чтобы сделать его доступным по-настоящему для всех.
Эта ситуация хорошо понятна большинству проектов, и все сейчас убеждены в необходимости переводить все. Тем не менее, фактические переводы представляют собой огромную работу многих людей, которая осложняется небольшими техническими трудностями.
К счастью, у ПО с открытым исходным кодом достаточно хорошие переводы, которые удобно поддерживать благодаря инструментам из пакета gettext. Они извлекают строки для перевода из программ, и предоставляют их переводчикам в единообразном формате (называемом PO-файлы, или translation catalogs, каталоги переводов).Целая экосистема различных инструментов выросла вокруг оных, дабы помочь переводчикам собственно переводить эти PO-файлы. Результат их работы затем используется библиотекой gettext во время исполнения программы, чтобы отображать переведённые сообщения пользователю.
Что касается документации, то здесь ситуация все еще несколько неутешительна. Поначалу перевод документации может показаться проще, чем перевод программы, поскольку кажется, что нужно просто скопировать исходный файл документации и начать переводить содержимое. Однако, когда в исходную документацию вносятся изменения, отслеживание этих изменений быстро превращается в кошмар для переводчиков. Если выполнять эту задачу вручную, она становится неприятной и чреватой ошибками.
Устаревшие переводы часто хуже, чем отсутствие перевода вообще. Конечные пользователи могут быть обмануты документацией, описывающей старое поведение программы. Более того, они не могут напрямую взаимодействовать с сопровождающими, поскольку те не говорят по-английски. Кроме того, сопровождающий не может устранить проблему, поскольку не знает всех языков, на которые переведена документация. Эти трудности, часто вызванные плохим инструментарием, могут подорвать мотивацию добровольных переводчиков, что еще больше усугубляет проблему.
Цель проекта po4a - облегчить работу переводчиков документации. В частности, он делает переводы документации поддерживаемыми.
Идея заключается в повторном использовании и адаптации подхода gettext к этой области. Как и в gettext, тексты извлекаются из оригинальных мест и представляются переводчикам в виде каталогов переводов PO. Переводчики могут использовать классические инструменты gettext для контроля за выполнением работы, сотрудничества и организации команд. po4a затем вставляет переводы непосредственно в структуру документации для создания переведенных исходных файлов, которые можно обрабатывать и распространять так же, как и английские файлы. Любой абзац, который не переведен, остается на английском языке в итоговом документе, гарантируя, что конечные пользователи никогда не увидят в документации устаревший перевод.
Это автоматизирует большую часть тяжелой работы по обслуживанию перевода. Обнаружить абзацы, нуждающиеся в обновлении, становится очень просто, а процесс полностью автоматизирован, когда элементы перестраиваются без дополнительных изменений. Конкретная проверка также может быть использована для снижения вероятности ошибок форматирования, которые приведут к поломке документа.
Полный список достоинств и недостатков этого подхода перечислен в разделе «Часто задаваемые вопросы» ниже в этом документе.
На данный момент этот подход был успешно воплощён для нескольких форматов:
Модуль Locale::Po4a::Man(3pm) также поддерживает формат mdoc, используемый в BSD man pages (они также довольно распространены в Linux).
Подробнее см. в разделе Locale::Po4a::AsciiDoc.
Подробнее см. в разделе Locale::Po4a::Pod.
На данный момент поддерживаются только DebianDoc и DocBook DTD, но добавлять поддержку новых DTD достаточно просто. Возможно даже использование po4a для перевода неизвестного SGML DTD, вообще не вмешиваясь в исходный код; достаточно только предоставить всю необходимую информацию в командной строке. См. подробности в Locale::Po4a::Sgml(3pm).
Модуль Locale::Po4a::LaTeX(3pm) был проверен на документации Python, одной книге и нескольких презентациях.
Поддерживает общий формат, используемый в генераторах статических сайтов, README и других системах документации. Подробности смотрите в разделе Locale::Po4a::Text(3pm).
На данный момент, po4a поддерживает DocBook DTD (cм. Locale::Po4a::Docbook(3pm)) и XHTML.
Подробнее см. в разделе Locale::Po4a::BibTex.
Более подробную информацию см. в Locale::Po4a:Docbook.
Более подробную информацию смотрите в Locale::Po4a:Guide.
Более подробную информацию смотрите в разделе Locale::Po4a::Wml.
Более подробную информацию см. в разделе Locale::Po4a::Yaml.
Более подробную информацию см. в разделе Locale::Po4a::Yaml.
Более подробную информацию см. в разделе Locale::Po4a:Halibut.
Более подробную информацию смотрите в разделе Locale::Po4a::Ini.
Исторически po4a был построен на основе четырех скриптов, каждый из которых выполнял определенную задачу. po4a-gettextize(1) помогает загружать переводы и, по желанию, конвертировать существующие проекты переводов в po4a. po4a-updatepo(1) отражает изменения в оригинальной документации в соответствующих po-файлах. po4a-translate(1) создает переведенный исходный файл из исходного файла и соответствующего PO-файла. Кроме того, po4a-normalize(1) в основном полезен для отладки парсеров po4a, так как он создает непереведенный документ из исходного. Это облегчает поиск ошибок, вносимых процессом синтаксического анализа.
Most projects only require the features of po4a-updatepo(1) and po4a-translate(1), but these scripts proved to be cumbersome and error prone to use. If the documentation to translate is split over several source files, it is difficult to keep the PO files up to date and build the documentation files correctly. As an answer, a all-in-one tool was provided: po4a(1). This tool takes a configuration file describing the structure of the translation project: the location of the PO files, the list of files to translate, and the options to use, and it fully automates the process. When you invoke po4a(1), it both updates the PO files and regenerate the translation files that need to. If everything is already up to date, po4a(1) does not change any file.
В остальной части этого раздела приводится обзор использования интерфейса скриптов po4a. Большинство пользователей, вероятно, предпочтут использовать инструмент "все в одном", который описан в документации po4a(1).
Следующая схема дает представление о том, как можно использовать каждый сценарий po4a. Здесь master.doc - это пример названия документации, подлежащей переводу; XX.doc - это тот же документ, переведенный на язык XX, а doc.XX.po - это каталог переводов для этого документа на язык XX. Авторы документации в основном будут иметь дело с master.doc (который может быть manpage, XML-документом, файлом asciidoc или подобным); переводчики в основном будут иметь дело с PO-файлом, а конечные пользователи будут видеть только файл XX.doc.
мастер.doc | V +<----<----+<-----<-----<--------+------->-------->-------+ : | | : {перевод} | { обновление мастер.doc } : : | | : XX.doc | V V (необязательно) | мастер.doc ->-------->------>+ : | (новый) | V V | | [po4a-gettextize] doc.XX.po -->+ | | | (старый) | | | | ^ V V | | | [po4a-updatepo] | V | | V перевод.pot ^ V | | | doc.XX.po | | | (неточный) | { перевод } | | | | ^ V V | | {ручное редактирование} | | | | | V | V V doc.XX.po --->---->+<---<-- doc.XX.po дополнение мастер.doc (начальный) (актуальный) (необязательно) (актуальный) : | | | : V | | +----->----->----->------> + | | | | | V V V +------>-----+------<------+ | V [po4a-translate] | V XX.doc (актуальный)
Эта схема сложна, но на практике только правая часть (включающая po4a-updatepo(1) и po4a-translate(1)) используется после установки и настройки проекта.
В левой части показано, как po4a-gettextize(1) можно использовать для преобразования существующего проекта перевода в инфраструктуру po4a. Этот скрипт берет оригинальный документ и его переведенный аналог и пытается построить соответствующий PO-файл. Такое ручное преобразование довольно громоздко (подробнее см. документацию po4a-gettextize(1)), но оно необходимо только один раз для преобразования существующих переводов. Если у вас нет переводов для преобразования, вы можете забыть об этом и сосредоточиться на нужной части схемы.
В верху правой части, изображены действия автора оригинала — обновление документации. В середине правой части показывает автоматические действия, производимые po4a-updatepo(1). Новые материалы извлекаются и сравниваются с существующим переводом. Для тех частей, которые не были изменены используется уже существующий перевод, а те части, которые были изменены частично соединяются с уже существующим переводом, но с пометкой «неточно» (fuzzy), указывающей, что перевод должен быть обновлён. Новые или сильно изменённые части оказываются непереведёнными.
Затем, в разделе ручное редактирование описываются действия переводчиков, которые изменяют файлы PO, чтобы обеспечить перевод каждой оригинальной строки и абзаца. Это может быть сделано с помощью специального редактора, такого как GNOME Translation Editor, KDE's Lokalize или poedit, или с помощью онлайн-платформы локализации, такой как weblate или pootle. Результатом перевода является набор PO-файлов, по одному на каждый язык. Более подробную информацию см. в документации gettext.
В нижней части рисунка показано, как po4a-translate(1) создает переведенный исходный документ из исходного документа master.doc и каталога переводов doc.XX.po, который был обновлен переводчиками. Структура документа используется повторно, а оригинальное содержание заменяется его переведенным аналогом. По желанию можно использовать дополнение, чтобы добавить к переводу дополнительный текст. Это часто используется для добавления имени переводчика в окончательный документ. Подробности см. ниже.
Как уже отмечалось, программа po4a(1) объединяет результаты отдельных сценариев, обновляя PO-файлы и переведенный документ за один вызов. Основополагающая логика остается прежней.
Если вы используете po4a(1), то для начала перевода не требуется никаких специальных шагов. Вам просто нужно перечислить языки в конфигурационном файле, и недостающие PO-файлы будут созданы автоматически. Естественно, переводчик должен будет затем предоставить переводы для каждого содержимого, используемого в ваших документах. po4a(1) также создает файл POT, то есть файл шаблона PO. Потенциальные переводчики могут перевести ваш проект на новый язык, переименовав этот файл и предоставив переводы на своем языке.
Если вы предпочитаете использовать отдельные скрипты по отдельности, то для создания файла POT следует использовать po4a-gettextize(1) следующим образом. Затем этот файл можно скопировать в XX.po, чтобы инициировать новый перевод.
$ po4a-gettextize --format <формат> --master <мастер.doc> --po <переводы.pot>
Мастер-документ используется на входе, а файл POT является выходом этого процесса.
Для этого следует использовать скрипт po4a-updatepo(1) (подробности см. в документации к нему):
$ po4a-updatepo --format <формат> --master <новый_мастер.doc> --po <старый_doc.XX.po>
Мастер-документ используется на входе, а файл PO обновляется: он используется как на входе, так и на выходе.
Когда вы закончите с переводом, вы захотите получить переведённую документацию и распространять её своим пользователям вместе с оригиналом. Для этого используйте программу po4a-translate(1) следующим образом:
$ po4a-translate --format <формат> --master <мастер.doc> --po <doc.XX.po> --localized <XX.doc>
Мастер-документ и PO файлы используются на входе, а локализованный файл является выходом этого процесса.
Добавление нового текста в перевод - это, пожалуй, единственное, что в долгосрочной перспективе проще, когда вы переводите файлы вручную :). Это происходит, когда вы хотите добавить в переведенный документ дополнительный раздел, не соответствующий какому-либо содержанию в оригинальном документе. Классический вариант использования - отдать должное команде переводчиков и указать, как сообщать о проблемах, связанных с переводом.
В po4a необходимо указать файлы addendum, которые концептуально можно рассматривать как патчи, накладываемые на локализованный документ после обработки. Каждое дополнение должно быть представлено в виде отдельного файла, формат которого, однако, сильно отличается от классических патчей. Первая строка - это строка заголовка, определяющая точку вставки дополнения (с, к сожалению, загадочным синтаксисом - см. ниже), в то время как остальная часть файла добавляется дословно в определенную позицию.
Строка заголовка должна начинаться со строки PO4A-HEADER:, за которой следует список полей key=value, разделенных запятой.
Например, следующий заголовок объявляет о дополнении, которое должно быть помещено в самый конец перевода.
PO4A-HEADER: mode=eof
Things are more complex when you want to add your extra content in the middle of the document. The following header declares an addendum that must be placed after the XML section containing the string "About this document" in translation.
PO4A-HEADER: position=Об этом документе; mode=after; endboundary=</section>
In practice, when trying to apply an addendum, po4a searches for the first line matching the "position" argument (this can be a regexp). Do not forget that po4a considers the translated document here. This documentation is in English, but your line should probably read as follows if you intend your addendum to apply to the French translation of the document.
PO4A-HEADER: position=À propos de ce document; mode=after; endboundary=</section>
Once the "position" is found in the target document, po4a searches for the next line after the "position" that matches the provided "endboundary". The addendum is added right after that line (because we provided an endboundary, i.e. a boundary ending the current section).
The exact same effect could be obtained with the following header, that is equivalent:
PO4A-HEADER: position=Об этом документе; mode=after; beginboundary=<section>
Here, po4a searches for the first line matching "<section"> after the line matching "About this document" in the translation, and add the addendum before that line since we provided a beginboundary, i.e. a boundary marking the beginning of the next section. So this header line requires to place the addendum after the section containing "About this document", and instruct po4a that a section starts with a line containing the "<section"> tag. This is equivalent to the previous example because what you really want is to add this addendum either after "/section"> or before "<section">.
You can also set the insertion mode to the value "before", with a similar semantic: combining "mode=before" with an "endboundary" will put the addendum just after the matched boundary, that the last potential boundary line before the "position". Combining "mode=before" with an "beginboundary" will put the addendum just before the matched boundary, that the last potential boundary line before the "position".
Mode | Boundary kind | Used boundary | Insertion point compared to the boundary ========|===============|========================|========================================= 'before'| 'endboundary' | last before 'position' | Right after the selected boundary 'before'|'beginboundary'| last before 'position' | Right before the selected boundary 'after' | 'endboundary' | first after 'position' | Right after the selected boundary 'after' |'beginboundary'| first after 'position' | Right before the selected boundary 'eof' | (none) | n/a | End of file
Советы и хитрости при использовании дополнений
PO4A-HEADER: position=Об этом документе; mode=after; beginboundary=<section> PO4A-HEADER: position=Об этом документе ; mode=after; beginboundary=<section>
Примеры дополнений
.SH "АВТОРЫ"
Вам следует выбрать подход с двумя регулярными выражениями, т.е. задать mode=after. Затем сузьте поиск до строк идущих после АВТОРЫ с помощью регулярного выражения в аргументе position. После этого вы должны сопоставить начало следующей секции (например, с помощью ^\.SH) в аргументе beginboundary. Короче говоря:
PO4A-HEADER: mode=after; position=АВТОРЫ; beginboundary=\. SH
PO4A-HEADER:mode=after;position=Copyright Большая Шишка, 2004;beginboundary=^
PO4A-HEADER:mode=after;position=О программе;beginboundary=FakePo4aBoundary
Более подробный пример
Исходный документ (формат POD):
|=head1 NAME | |dummy - a dummy program | |=head1 AUTHOR | |Me <me@example.com>
Тогда следующее дополнение обеспечит добавление раздела о переводчике (на русском) в конец файла.
|PO4A-HEADER:mode=after;position=АВТОР;beginboundary=^=head | |=head1 ПЕРЕВОД | |Я <me@example.ru> |
Чтобы поместить своё дополнение перед «АВТОР», используйте следующий заголовок:
PO4A-HEADER:mode=after;position=ИМЯ;beginboundary=^=head1
Это работает, так как следующая сопоставляемая beginboundary /^=head1/ строка после раздела «NAME» (переведённого как «ИМЯ» на русский) и начинает раздел с перечислением авторов. Таким образом, дополнение будет помещено между этими двумя разделами. Заметьте, что если в дальнейшем какой-либо другой раздел будет добавлен между разделами «ИМЯ» и «АВТОР», то данный пример будет работать не корректно, ибо дополнение будет вставляться перед этим новым разделом.
Чтобы избежать этого, можете использовать аналогичный заголовок с mode=before:
PO4A-HEADER:mode=before;position=^=head1 АВТОР
В этой главе даётся краткий обзор внутренних компонентов po4a так, чтобы вы могли чувствовать себя увереннее, если вы захотите помочь нам сопровождать и улучшать его. Это также может помочь вам понять, почему он не делаете того, что вы ожидали, и как решить ваши проблемы.
Архитектура po4a объектно-ориентирована. Общим предком всех классов-парсеров po4a является Locale::Po4a::TransTractor(3pm). Своё странное имя он получил оттого, что он одновременно отвечает и за перевод документа и извлечение строк.
Если точнее, TransTractor берёт документ для перевода плюс PO-файл с переводами, кои являются его входными данными, и производит два отдельных набора выходных данных: другой PO-файл (как результат извлечения переводимых строк из входного документа) и переведённый документ (с той же структурой, что и входной, но со всеми переводимыми строками заменёнными содержимым входного PO-файла). Ниже приведено графическое представление этого процесса:
Входной документ -\ /---> Выходной документ \ TransTractor:: / (переведённый) +-->-- parse() --------+ / \ Входной PO ------/ \---> Выходной PO (извлечённый)
Эта маленькая косточка и является ядром всей архитектуры po4a. Если вы уберёте входной PO и выходной документ, вы получите po4a-gettextize. Если предоставите оба набора входных данных и проигнорируете выходной PO, вы получите po4a-translate. po4a вызывает TransTractor дважды и вызывает msgmerge -U между оными вызовами, дабы это было комплексное решение с одним файлом настроек. См. подробности в Locale::Po4a::TransTractor(3pm).
Here is a very partial list of projects that use po4a in production for their documentation. If you want to add your project to the list, just drop us an email (or a Merge Request).
This project provides an infrastructure for translating many manpages to different languages, ready for integration into several major distributions (Arch Linux, Debian and derivatives, Fedora).
I personally vocalize it as pouah <https://en.wiktionary.org/wiki/pouah>, which is a French onomatopoetic that we use in place of yuck :) I may have a strange sense of humor :)
There are a few of them. Here is a possibly incomplete list, and more tools are coming at the horizon.
Она может обрабатывать только XML и только с определённым DTD. Мне не очень нравится, как она обрабатывает списки, которые представляются одним большим msgid. Когда список становится большим, весь этот кусок становится сложно переработать.
Основные преимущества po4a перед оными — это простота добавления дополнительного содержипого (по крайней мере там это реализовано ещё хуже) и возможность проведения геттекстизации.
- https://docs.kde.org/stable5/en/kdesdk/lokalize/project-view.html - http://www.debian.org/intl/l10n/
Но не всё так радужно, и этот подход также имеет некоторые недостатки, с которыми нам приходится смириться.
Одна моя мечта состоит в том, чтобы каким-то образом интегрировать po4a в Gtranslator или Lokalize. Тогда при открытии файла документации, строки автоматически извлекались бы, а когда он сохранялся, переведённый файл и PO-файл мог ли бы записываться на диск. Если бы нам удалось сделать модуль MS Word (TM) (или, по крайней мере, RTF), то даже профессиональные переводчики могли бы использовать po4a.
Денис Барбье (Denis Barbier) <barbier,linuxfr.org> Мартин Кенсон (Martin Quinson) (mquinson#debian.org)
2023-01-03 | Инструменты Po4a |