Locale::Po4a::Man(3pm)

НАЗВАНИЕ
Locale::Po4a::Man: преобразование man-страниц из/в PO-файлы

ОПИСАНИЕ
Целью проекта po4a (PO for anything, PO везде и для всего) является облегчение процесса перевода (и что более важно — поддержки перевода), используя инструменты gettext в тех случаях, когда их применение может выглядеть неожиданным, например для документации.

Locale::Po4a::Man — это модуль, предназначенным для помощи в переводе документации в формате nroff (язык разметки man-страниц) на другие [человеческие] языки.

ПЕРЕВОД С ПОМОЩЬЮ PO4A::MAN
Этот модуль старается как только может, чтобы облегчить жизнь переводчика. Чтобы добиться этого, передаваемый переводчику текст не является дословной копией содержимого man-страницы. Фактически, большинство сырых элементов формата nroff скрыты от глаз переводчика так, чтобы он не смог их испортить.

  Перенос текста
Абзацы без отступов будут автоматически переформатированы для переводчика. Это может привести к некоторым незначительным отличиям в выходных файлах, т.к. правила форматирования используемые groff не совсем чёткие. Например, иногда резервируется два пробела после скобок.

В любом случае, отличия будут только в положении дополнительных пробелов в переформатированном абзаце и, как мне кажется, это мелочь.

  Определение шрифтов
Первое изменение — это изменение способа определения шрифтов. В nroff, существует несколько способов определить, каким должен быть шрифт, маленьким, жирным или курсивом. В переводимом тексте, существует только один способ, позаимствованный из формата POD (Perl online documentation):

I<текст> -- курсив
    эквивалентен \fIтекст\fP или ".I текст"

B<текст> -- жирный
    эквивалентен \fBтекст\fP или ".B текст"

R<текст> -- обычный (man использует термин «roman» )
    эквивалентен \fRтекст\fP

CW<текст> -- моноширинный
    эквивалентен \f(CWтекст\fP или ".CW текст"

Замечание: Начертание CW доступно не на всех groff устройствах. Такое начертание не рекомендуется использовать. Предоставляется только для вашего удобства.

  Автоматическая транслитерация символов
Po4a автоматически производит транслитерацию некоторых символов для облегчения перевода или последующей проверки оного. Ниже приведён список таких транслитераций:

дефисы
    Дефис (-) и знак минуса (\-) в man страницах транслитерируются в простое тире (-) в PO-файле. Затем все тире транслитерируются в знак минуса roff (\-) при формировании выходного документа.

    Переводчики могут принудительно использовать roff дефис '\[hy]' в своих переводах.

неразрывные пробелы
    Переводчики могут использовать неразрывные пробелы. Такие неразрывные пробелы (0xA0 в latin1) будут транслитерированы в неразрывные пробелы roff ('\ ').

транслитерация кавычек
    `` и '' будут соответственно транслитерированы в \*(lq и \*(rq.

    Чтобы избежать подобной транслитерации, переводчики могут вставить roff символ нулевой ширины (т.е., использовать `\&` или '\&' соответственно).

  Вставка '<' и '>' в перевод
Поскольку эти символы используются для разделения частей при изменении шрифта, вы не можете использовать их буквально. Используйте вместо них E<lt> и E<gt> (так же как в POD).

ПАРАМЕТРЫ ПРИНИМАЕМЫЕ ЭТИМ МОДУЛЕМ
Ниже приведены специфические для данного модуля параметры:

debug
    Включение отладки некоторых внутренних механизмов данного модуля. Какие части имеют отладочные закладки смотрите в исходном коде.

verbose
    Увеличение количества выводимой служебной информации.

groff_code
    Данный параметр позволяет изменять поведение модуля при обработке секций .de, .ie или .if. Он может принимать следующие значения:

    fail
        Значение по умолчанию. Модуль будет приводить к останову при встрече с секциями .de, .ie или .if.

    verbatim
        Указывает на то, чтобы секции de, .ie или .if были скопированы как есть из оригинала в переведённый документ.

    translate
        Указывает, чтобы секции .de, .ie или .if были предложены для перевода. Данное значение необходимо использовать, если эти секции содержат кукую-либо переводимую строку. В противном случае, следует использовать verbatim.

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

mdoc
    Данный параметр может быть полезен только для mdoc страниц.

    Позволяет использовать более строгий формат 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-раздела"

Следующие параметры позволяют определить поведение новых макросов (определённые с помощью директивы .de), или каких-либо других макросов, не поддерживаемых po4a. В качестве аргумента они принимают список макросов, разделённых запятыми. Например:

 -o noarg=FO,OB,AR -o translate_joined=BA,ZQ,UX

Замечание: если макрос не поддерживается po4a и вы считаете, что это стандартный макрос roff, сообщите, пожалуйста, об этом команде разработчиков po4a.

untranslated
    untranslated указывает, что данные макросы (указанные в аргументе) не требуют перевода.

noarg
    noarg подобен untranslated, с той разницей что po4a будет проверять чтобы аргументы не передавались данному макросу.

translate_joined
    translate_joined указывает, что po4a должен отметить для перевода аргументы данного макроса.

translate_each
    С translate_each, аргументы будут также отмечены для перевода, но каждый из них будет переводиться отдельно.

no_wrap
    Данный параметр принимает в качестве аргумента разделённый замятыми список пар begin:end, где begin и end являются командами, которые определяют начало и конец секции, которая не должна быть переформатирована (rewrapped).

    Замечание: не производится никаких проверок, что каждая команда end соответствует своей команде begin; любая завершающая команда отключает режим no_wrap. Если макрос, который вы хотите использовать в качестве begin (или end), не имеет соответствующего ему макроса end (или begin соответственно), то вы можете указать любой существующий макрос для end (например fi) или для begin (например nf). Данный макрос (и его аргументы) переводиться не будут.

inline
    Данный параметр определяет разделённый запятыми список макросов, которые не должны разбивать текущий абзац. Переводимая строка будет содержать foo <.bar baz qux> quux, где bar — это команда, переданная inline, а baz и qux — её аргументы.

unknown_macros
    Этот параметр определяет поведение po4a когда встречается неизвестный макрос. По умолчанию po4a завершает работу выводя предупреждение. Он может принимать следующие значения: failed (значение по умолчанию), untranslated, noarg, translate_joined, translate_each. (См. описание этих значений выше).

СОЗДАНИЕ MAN-СТРАНИЦ СОВМЕСТИМЫХ С PO4A::MAN
Данный модуль очень ограничен и будет таким всегда, т.к. он не является интерпретатором nroff. Конечно, было бы возможно создать настоящий интерпретатор nroff, чтобы предоставить авторам возможность использовать все существующие макросы или даже объявлять новые, но мы не хотим этим заниматься. Это было бы слишком сложной задачей и, как мы считаем, в этом нет необходимости. Мы считаем, что если авторы man-страниц хотят видеть свои творения переведёнными, то они могут их адаптировать, чтобы облегчить работу переводчикам.

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

  Не программируйте на nroff
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
Иногда автор знает, что некоторые части не подлежат переводу и не должны извлекаться программой 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:

•   треть всех страниц отвергаются, потому что они были сгенерированы из других форматов поддерживаемых po4a (например, POD или SGML).

•   10% оставшихся страниц отвергаются с какой-либо ошибкой (например из-за того, что макросы groff не поддерживаются).

•   Затем, менее 1% страниц проходят все проверки po4a без сообщений об ошибках, но в результате имеют значительные проблемы (например, пропущенные или лишние слова)

•   Все остальные страницы обычно обрабатываются без каких-либо проблем более значительных, нежели изменения пробелов или переносов строк (проблемы со шрифтами в менее, чем 10% обработанных страниц).

СМОТРИТЕ ТАКЖЕ
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).