Locale::Po4a::Man(3pm) | Инструменты Po4a | Locale::Po4a::Man(3pm) |
Locale::Po4a::Man: преобразование man-страниц из/в PO-файлы
Целью проекта po4a (PO for anything, PO везде и для всего) является облегчение процесса перевода (и что более важно — поддержки перевода), используя инструменты gettext в тех случаях, когда их применение может выглядеть неожиданным, например для документации.
Locale::Po4a::Man — это модуль, предназначенным для помощи в переводе документации в формате nroff (язык разметки man-страниц) на другие [человеческие] языки.
Этот модуль старается как только может, чтобы облегчить жизнь переводчика. Чтобы добиться этого, передаваемый переводчику текст не является дословной копией содержимого man-страницы. Фактически, большинство сырых элементов формата nroff скрыты от глаз переводчика так, чтобы он не смог их испортить.
Абзацы без отступов будут автоматически переформатированы для переводчика. Это может привести к некоторым незначительным отличиям в выходных файлах, т.к. правила форматирования используемые groff не совсем чёткие. Например, иногда резервируется два пробела после скобок.
В любом случае, отличия будут только в положении дополнительных пробелов в переформатированном абзаце и, как мне кажется, это мелочь.
Первое изменение — это изменение способа определения шрифтов. В nroff, существует несколько способов определить, каким должен быть шрифт, маленьким, жирным или курсивом. В переводимом тексте, существует только один способ, позаимствованный из формата POD (Perl online documentation):
Замечание: Начертание CW доступно не на всех groff устройствах. Такое начертание не рекомендуется использовать. Предоставляется только для вашего удобства.
Po4a автоматически производит транслитерацию некоторых символов для облегчения перевода или последующей проверки оного. Ниже приведён список таких транслитераций:
Переводчики могут принудительно использовать roff дефис '\[hy]' в своих переводах.
Чтобы избежать подобной транслитерации, переводчики могут вставить roff символ нулевой ширины (т.е., использовать `\&` или '\&' соответственно).
Поскольку эти символы используются для разделения частей при изменении шрифта, вы не можете использовать их буквально. Используйте вместо них E<lt> и E<gt> (так же как в POD).
Ниже приведены специфические для данного модуля параметры:
Позволяет использовать более строгий формат mdoc, в частности, указывая po4a не переводить название секции 'NAME'. Для страниц mdoc, с переведённой секцией 'NAME', не будут создаваться собственные верхние и нижние колонтитулы.
Согласно
странице
справки groff_mdoc,
секции NAME, SYNOPSIS и
DESCRIPTION
обязательны.
Однако,
какие-либо
проблемы
при
переводе
названий
секций SYNOPSIS
или DESCRIPTION, на
данный
момент не
известны,
но вы
также
можете
предотвратить
перевод
имён
данных
секций
следующим
образом:
-o mdoc=NAME,SYNOPSIS,DESCRIPTION
Эти
проблемы mdoc
также
можно
решить с
помощью
файла
дополнения:
PO4A-HEADER:mode=before;position=^.Dd
.TH
НАЗВАНИЕ_ДОКУМЕНТА
1 "Месяц,
день, год" OS
"Имя
man-раздела"
The following options specify the behavior of a user-defined macro (with a .de request), or of a classical macro that is not supported by po4a. They take as argument a comma-separated list of macros. For example:
-o noarg=FO,OB,AR -o translate_joined=BA,ZQ,UX
Замечание: если макрос не поддерживается po4a и вы считаете, что это стандартный макрос roff, сообщите, пожалуйста, об этом команде разработчиков po4a.
Note: no test is done to ensure that an end command matches its begin command; any ending command stop the no_wrap mode. If you have a begin (respectively end) macro that has no end (respectively begin), you can specify an existing end (like fi) or begin (like nf) as a counterpart. These macros (and their arguments) won't be translated.
Данный модуль очень ограничен и будет таким всегда, т.к. он не является интерпретатором nroff. Конечно, было бы возможно создать настоящий интерпретатор nroff, чтобы предоставить авторам возможность использовать все существующие макросы или даже объявлять новые, но мы не хотим этим заниматься. Это было бы слишком сложной задачей и, как мы считаем, в этом нет необходимости. Мы считаем, что если авторы man-страниц хотят видеть свои творения переведёнными, то они могут их адаптировать, чтобы облегчить работу переводчикам.
Таким образом у парсера, реализованного в po4a, есть несколько известных ограничений, которые мы не собираемся устранять. Эти ограничения содержат некоторые ловушки, которые вам придётся избегать, если вы хотите чтобы переводчики позаботились о вашей документации.
nroff это полноценный язык программирования, с возможностью определения макросов, условными операторами и так далее. Так как этот парсер не является полнофункциональным интерпретатором nroff, он не сможет обработать страницы, использующие подобные возможности (у меня есть около 200 таких страниц).
Есть ещё несколько макросов, которые не поддерживаются po4a::man только потому, что я не смог отыскать документацию по ним. Ниже приведён список таковых макросов используемых на моём компьютере. Обратите внимание, что этот список не является полным, т.к. программа завершает работу при первой встрече с неподдерживаемым макросом. Если у вас есть информация о каком либо из них, я с удовольствием добавлю поддержку оного. Из-за таких макросов po4a::man не может обработать корректно порядка 250 страниц на моём компьютере.
.. ." .AT .b .bank .BE ..br .Bu .BUGS .BY .ce .dbmmanage .do .En .EP .EX .Fi .hw .i .Id .l .LO .mf .N .na .NF .nh .nl .Nm .ns .NXR .OPTIONS .PB .pp .PR .PRE .PU .REq .RH .rn .S< .sh .SI .splitfont .Sx .T .TF .The .TT .UC .ul .Vb .zZ
Иногда автор знает, что некоторые части не подлежат переводу и не должны извлекаться программой po4a. Например, параметр может принимать аргумент other, и other может также обозначать последний аргумент списка. В первом случае, other не должно быть переведено. А во втором случае — должно.
В этом случае, автор может заставить po4a воздержаться от извлечения некоторых строк, с помощью определённых groff конструкций:
.if !'po4a'hide' .B other
(это потребует параметра -o groff_code=verbatim)
Можно
также
определить
новый
макрос,
чтобы
автоматизировать
этот
процесс:
.de IR_untranslated
. IR \\$@
..
.IR_untranslated \-q ", " \-\-quiet
(это потребует параметров -o groff_code=verbatim и -o untranslated=IR_untranslated; с этой конструкцией условный оператор .if !'po4a'hide', строго говоря, не обязателен т.к. po4a не будет пытаться разобрать внутреннюю часть макроопределения)
или
использовать
псевдоним:
.als IR_untranslated IR
.IR_untranslated \-q ", " \-\-quiet
Это потребует параметра -o untranslated=als,IR_untranslated.
Подводя итоги выше сказанному, делайте всё просто и не пытайтесь умничать, когда готовите свои man-страницы. В nroff есть много возможностей, и многие из них не поддерживаются этим парсером. Например, не пытайтесь связываться с \c, чтобы остановить исполнение (как делают 40 страниц на моей машине). И убедитесь, что оставляете аргументы макроса на той же строке, что и он сам. Я знаю, что обратное допустимо в nroff, но это сильно осложнит работу парсера.
Конечно, другая возможность — это использовать другой формат, более дружелюбный к переводчикам (например POD с po4a::pod или один из XML-семейства, например SGML), но благодаря po4a::man в этом больше нет необходимости. Как говорится, если исходный формат вашей документации POD или XML, то будет мудро переводить исходный формат, а не то что из него сгенерировано. В большинстве случаев, po4a::man определяет сгенерированные страницы и выводит предупреждение. Он даже откажется обрабатывать сгенерированные из POD страницы, потому что такие страницы идеально обрабатываются с помощью po4a::pod и потому что nroff в них определяет уйму новых макросов, для которых у меня нет ни какого желания писать поддержку. На моей машине, 1432 из 4323 страниц сгенерированы из POD и будут проигнорированы po4a::man.
В большинстве случаев po4a::man будет находить проблему и прекратит обработку страницы, выводя удовлетворительное сообщение. В некоторых редких случаях программа завершится без предупреждений, но вывод будет ошибочным. Такие случаи называются «Багами» ;) Если вы столкнётесь с подобными ситуациями, обязательно сообщайте о них, по возможности с исправлениями…
Этот модуль можно использовать с большинством существующих man страниц.
Некоторые проверки регулярно проводятся на машинах с Linux:
Locale::Po4a::Pod(3pm), Locale::Po4a::TransTractor(3pm), po4a(7)
Denis Barbier <barbier@linuxfr.org> Nicolas François <nicolas.francois@centraliens.net> Martin Quinson (mquinson#debian.org)
Copyright © 2002-2008 SPI, Inc.
Данная программа является свободным программным обеспечением; вы можете распространять и/или изменять её на условиях Универсальной общественной лицензии (GPL) GNU (см. файл COPYING).
2023-01-03 | Инструменты Po4a |