PO4A(1p) | Інструменти Po4a | PO4A(1p) |
po4a — оновлення файлів PO і перекладених документів у один прохід
po4a [параметри] файл_налаштувань
po4a («PO for anything» або «PO для усього») спрощує супровід перекладу документації з використанням класичних інструментів gettext. Основною перевагою po4a є відокремлення придатного до перекладу вмісту документа від його структури. Будь ласка, зверніться до сторінки po4a(7), щоб ознайомитися зі вступними зауваженнями щодо цього проєкту.
Коли вперше запускаєте програму po4a, і у вас є лише файл налаштувань і документи для перекладу (ми називатимемо їх «основні документи»), які слід перекласти, програма створює файл POT (який також називають шаблоном перекладів), у якому містяться усі рядки документів у формі, з якою можуть легко працювати перекладачі.
Такі файли POT можна перекладати або за допомогою спеціалізованого редактора, зокрема Редактора перекладів GGNOME або Lokalize з KDE або poedit, чи інтегрувати до платформи інтернет-перекладу, зокрема weblate або pootle. Результатом перекладу є набір файлів PO, по одному на кожну мову перекладу.
Якщо ви запустите po4a, маючи вже основні документи та файли PO, програма створить перекладені документи, вставивши вміст перекладу (який зберігається у файлах PO) до структури початкових основних документів.
Якщо до основних документів було внесено зміни, po4a оновить файли PO і POT відповідним чином, отже перекладачі без проблем зможуть виявити зміни і оновити результати своєї роботи. Залежно від параметрів запуску, po4a відкидатиме частково перекладені документи або створюватиме документ, у якому поєднуватимуться неперекладені частини англійською (для нових або змінених частин) та перекладені частини (ті частини, переклад яких лишився незмінним у файлі PO).
Типово, програма створюватиме перекладені документи, якщо перекладено принаймні 80% вмісту (див. опис параметра --keep нижче). Відкидання перекладів, які виконано не на 100% може знизити мотивацію перекладачів, але надання «перекладів», які є фрагментарними, може призвести до проблем у кінцевих користувачів.
основні документи---+---->-------->---------+ (документування) | | V (виконання po4a) >-----+--> переклади | | | наявні файли PO -->-> оновлені файли PO >-+ | ^ | | | V | +----------<---------<-------+ ^ (процес перекладу підручника) | | додаток --->--------------------------------------+
Написанням основних документів займаються автори документації. Усі внесені ними зміни автоматично відтворюються за допомогою po4a у файлах PO, за оновлення перекладу яких відповідають перекладачі. Усі зміни у файлах PO (внесені вручну або за допомогою po4a) автоматично відтворюються у перекладених документах. Ви можете відтворити поведінку програми po4a за допомогою скриптів po4a-updatepo(1) і po4a-translate(1) у файлах makefile, втім, це доволі складно і марудно (див. po4a(7)). Наполегливо рекомендуємо вам користуватися у ваших скриптах збирання саме po4a.
Типова поведінка (якщо не вказано --force) така:
Крім того, перекладений документ буде повторно створено, лише якщо його основний документ, файл PO, один із додатків або файл налаштувань виявиться актуальнішим. Щоб запобігти спробам повторного створення перекладених документів, які не проходять перевірки на порогове значення перекладів (див. --keep), буде створено файл із суфіксом назви .po4a-stamp (див. --stamp).
Якщо до основного документа включаються додаткові файли, вам слід скористатися прапорцем --force, інакше час внесення змін до цих включених файлів не буде враховано.
Файли PO завжди повторно створюються на основі файла POT за допомогою msgmerge -U.
Зауваження: цей параметр вмикає лише створення файлів .po4a-stamp. Програма завжди використовуватиме файли штампів, якщо вони існують, їх буде вилучено, лише якщо вказано параметр --rm-translations або переклад файла буде завершено.
УВАГА: цей прапорець змінює поведінку po4a у доволі критичний спосіб: файли перекладу не оновлюватимуться, аж доки не буде поліпшено переклад. Використовуйте цей прапорець, лише якщо ви надаєте перевагу розповсюдженню застарілої перекладеної документації перед розповсюдженням точної, але не перекладеної документації.
Якщо вказано одразу destdir і srcdir, пошук вхідних файлів відбуватиметься у таких категоріях, у вказаному порядку: destdir, поточний каталог і srcdir. Файли результатів записуються до destdir, якщо вказано, або до поточного каталогу.
Так історично склалося, що комплект програм gettext виконує переформатування файлів po так, щоб рядки було перенесено на 77-й позиції, з косметичних міркувань. За допомогою цього параметра можна встановити відповідну поведінку po4a. Якщо встановлено числове значення, po4a переноситиме рядки у файлі po після вказаної позиції і після символів розриву рядка у самих рядках. Якщо встановити значення newlines, po4a розриватиме рядки у msgid і msgstr лише після символів нового рядка у вмісті. Якщо встановити значення no, po4a не переноситиме рядки у файлі po взагалі. Перенесення рядків у коментарях виконується завжди інструментами gettext, які програма використовує на внутрішньому рівні.
Зауважте, що цей параметр не стосується того, яким чином переноситимуться рядки у msgid і msgstr, тобто того, у який спосіб до цих рядків додаватимуться символи розриву рядків.
Зауваження: $lang буде розгорнуто до запису поточної мови.
po4a потрібен аргумент із назвою файла налаштувань. Цей файл має містити такі елементи:
В усіх рядках міститься запис команди у квадратних дужках, за яким вказано параметри. Коментарі починаються з символу «#» і завершуються кінцем рядка. Ви можете екранувати кінець рядка і поділити команду на декілька рядків.
На цій сторінці представлено декілька повних прикладів. Інші приклади можна знайти у каталозі "t/cfg" пакунка із початковим кодом програми.
Найпростішим рішенням є явне визначення шляху до файлів POT та PO, ось так:
[po4a_paths] man/po/project.pot de:man/po/de.po fr:man/po/fr.po
Тут ми спочатку вказуємо шлях до файла POT, а потім шляхи до файлів PO перекладів німецькою та французькою мовами.
Те саме можна записати для зменшення ризику помилок при копіюванні ось так:
[po4a_langs] fr de [po4a_paths] man/po/project.pot $lang:man/po/$lang.po
Компонент $lang буде автоматично розгорнути на основі наданого списку мов. Це зменшить ризик помилки під час вставляння при додаванні нової мови перекладу.
Зробити той самий запис компактнішим можна надавши шлях до каталогу, у якому міститься проєкт з перекладу. Приклад наведено нижче.
[po_directory] man/po/
У вказаному каталозі має міститися набір файлів PO, назви яких слід записувати у форматі XX.po, де "XX" — код мови перекладу за ISO 639-1. У каталозі також має зберігатися один файл POT із суфіксом назви ".pot". Для першого запуску цей файл може бути порожнім, але має існувати (po4a не може визначити назву, якою слід скористатися перед суфіксом).
Зауважте, що слід вибрати лише один з варіантів, "po_directory" або "po4a_paths". Перший ("po_directory") є компактнішим, зменшує ризик помилки під час копіювання, але примушує вас до використання очікуваної структури проєкту та назв файлів. Другий ("po4a_paths") є більш явним, ймовірно, зручнішим для читання, радимо користуватися ним, якщо ви налаштовуєте ваш перший проєкт у po4a.
Централізовані чи поділені файли PO?
Типово, po4a створює по одному файлу PO для кожної мови перекладу. У цих файлах міститиметься увесь ваш проєкт перекладу. Зі зростанням вашого проєкту розмір цих файлів може стати проблемою. При використанні weblate можна встановити для кожного з повідомлень перекладу (тобто msgid) пріоритетність, тому варто встановити її так, щоб важливі рядки було перекладено першими, але деякі команди перекладачів, попри це, можуть просити про поділ даних на декілька файлів.
Щоб створити один файл PO для кожного основного файла, вам слід просто скористатися рядком $master у назві ваших файлів PO у рядку "[po4a_paths]", як це показано нижче.
[po4a_paths] doc/$master/$master.pot $lang:doc/$master/$lang.po
Якщо існуватимуть конфлікти назв, пов'язані із тим, що декілька з файлів матимуть однакові назви, назву основного файла можна вказати за допомогою параметра "master:file="назва:
[po4a_langs] de fr ja [po4a_paths] l10n/po/$master.pot $lang:l10n/po/$master.$lang.po [type: xml] foo/gui.xml $lang:foo/gui.$lang.xml master:file=foo-gui [type: xml] bar/gui.xml $lang:bar/gui.$lang.xml master:file=bar-gui
У режимі поділу po4a будує тимчасову збірку під час оновлення файлів PO, щоб розподілити переклади між усіма файлами PO. Якщо буде виявлено два файли PO із різними перекладами одного і того самого рядка, po4a позначить переклад рядка як неточний і надішле обидва переклади до усіх файлів PO, які містять цей рядок. Коли перекладач оновлюватиме переклад і вилучить позначку неточного перекладу у одному з файлів PO, переклад цього рядка буде оновлено у всіх інших файлах PO автоматично.
Вам слід також вказати список документів, які має бути перекладено. Для кожного основного файла вам слід вказати обробник формату, розташування перекладеного документа, який слід створити, та, необов'язково, додаткові налаштування. Ось приклад:
[type: sgml] doc/my_stuff.sgml fr:doc/fr/mon_truc.sgml \ de:doc/de/mein_kram.sgml [type: man] script fr:doc/fr/script.1 de:doc/de/script.1 [type: docbook] doc/script.xml fr:doc/fr/script.xml \ de:doc/de/script.xml
Втім, знову, ці складні рядки важко читати і редагувати, наприклад, додавати нову мову. Набагато простіше перевпорядкувати речі за допомогою шаблона $lang ось так:
[type: sgml] doc/my_stuff.sgml $lang:doc/$lang/my_stuff.sgml [type: man] script.1 $lang:po/$lang/script.1 [type: docbook] doc/script.xml $lang:doc/$lang/script.xml
Ви можете вказати два типи параметрів: параметри po4a є типовими значенням параметрів командного рядка po4a, а параметри форматування використовуються для зміни поведінки засобів обробки форматування. За допомогою параметрів po4a, наприклад, ви можете вказати у вашому файлі налаштувань типове значення параметра командного рядка --keep 50% замість 80%. Параметри форматування документовано на окремих сторінках кожного з модулів обробки форматування, наприклад, Locale::Po4a::Xml(3pm). Ви можете, наприклад, передати nostrip до засобу обробки XML наказ не обрізати пробіли навколо видобутих рядків.
Ви можете передати ці параметри для певного основного файла або навіть для певного перекладу цього файла за допомогою "opt:" і "opt_XX:" для мови "XX". У наступному прикладі параметр nostrip передається обробнику XML (для усіх мов), а пороговий відсоток перекладу зменшено до 0% для перекладу французькою (тобто визначено, що цей переклад зберігатиметься завжди).
[type:xml] toto.xml $lang:toto.$lang.xml opt:"-o nostrip" opt_fr:"--keep 0"
За будь-яких умов, ці фрагменти налаштувань має бути розташовано наприкінці рядка. Оголошення файлів мають бути першими, далі мають бути додатки, якщо такі є (див. нижче), а лише потім має бути вказано параметри. Групування фрагментів налаштувань не є дуже важливим, оскільки на внутрішньому рівні елементи буде поєднано як рядки. Наступні приклади є еквівалентними:
[type:xml] toto.xml $lang:toto.$lang.xml opt:"--keep 20" opt:"-o nostrip" opt_fr:"--keep 0" [type:xml] toto.xml $lang:toto.$lang.xml opt:"--keep 20 -o nostrip" opt_fr:"--keep 0" [type:xml] toto.xml $lang:toto.$lang.xml opt:--keep opt:20 opt:-o opt:nostrip opt_fr:--keep opt_fr:0
Зауважте, що специфічні для мов параметри не використовуватимуться при збиранні файла POT. Наприклад, не можна передати nostrip обробнику лише для збирання французького перекладу, оскільки той самий файл POT використовується для оновлення у кожній з мов. Тому єдині параметри, які можуть бути специфічними для мови, є параметри, які буде використано для створення перекладених документів, наприклад параметр "--keep".
Альтернативи налаштувань
Щоб передати ті самі параметри для декількох файлів, варто створити альтернативний тип у наведений нижче спосіб. У наступному прикладі, "--keep 0" передається для усіх перекладів італійською за допомогою типу "test", який є розширенням типу "man".
[po4a_alias:test] man opt_it:"--keep 0" [type: test] man/page.1 $lang:man/$lang/page.1
Ви також можете розширити наявний тип повторним використанням тієї самої назви як альтернативної у наведений нижче спосіб. Такі оголошення не вважаються помилковими рекурсивними оголошеннями.
[po4a_alias:man] man opt_it:"--keep 0" [type: man] man/page.1 $lang:man/$lang/page.1
Загальні типові параметри
Ви також можете скористатися рядками "[options]" для визначення параметрів, які має бути використано для усіх файлів, незалежно від типу.
[options] --keep 20 --option nostrip
Як і з параметрами командного рядка, ви можете скорочувати записи параметрів, які передаються через файл налаштувань:
[options] -k 20 -o nostrip
Пріоритетність параметрів
Параметри для усіх джерел буде поєднано. Це забезпечить просте перевизначення типових значень специфічними параметрами. Порядок визначення є таким:
Приклад
Ось приклад, який демонструє те, як екранувати пробіли і лапки:
[po_directory] man/po/ [options] --master-charset UTF-8 [po4a_alias:man] man opt:"-o \"mdoc=NAME,SEE ALSO\"" [type:man] t-05-config/test02_man.1 $lang:tmp/test02_man.$lang.1 \ opt:"-k 75" opt_it:"-L UTF-8" opt_fr:--verbose
Якщо вам потрібно додати додатковий розділ до вашого перекладу, наприклад, вказати у ньому подяки перекладачу, вам слід визначити додаток у рядку, який визначає ваш основний файл. Будь ласка, зверніться до сторінки підручника (man) po4a(7), щоб дізнатися більше про синтаксис файлів додатків.
[type: pod] script fr:doc/fr/script.1 \ add_fr:doc/l10n/script.fr.add
Використовувати шаблони мов можна так:
[type: pod] script $lang:doc/$lang/script.1 \ add_$lang:doc/l10n/script.$lang.add
Якщо додаток не вдасться застосувати, переклад буде відкинуто.
Модифікатори для оголошення додатка
Модифікатори додатків можуть спростити файл налаштувань, якщо додатки надаються не для усіх мов або якщо список додатків для різних мов є різним. Модифікатор — одинарний символ, який вказують перед назвою файла.
Вказана нижче інструкція призводить до включення додатка для усіх мов, але лише якщо такий додаток існує. Якщо додатка не існує, програма не повідомлятиме про це додатково.
[type: pod] script $lang:doc/$lang/script.1 add_$lang:?doc/l10n/script.$lang.add
Наведений нижче код включає список додатків для будь-якої мови:
[type: pod] script $lang:doc/$lang/script.1 add_$lang:@doc/l10n/script.$lang.add
Іноді, може виникнути потреба в усуванні частини рядків з перекладу. Для цього ви можете передати параметр "pot_in" для вашого основного файла з метою визначення назви файла, який буде використано замість основного при побудові файла POT. Ось приклад:
[type:docbook] book.xml \ pot_in:book-filtered.xml \ $lang:book.$lang.xml
У прикладі, рядки для перекладу буде видобуто з файла book-filtered.xml (який має бути створено до виклику po4a), а перекладені файли буде створено з файла book.xml. У результаті, усі рядки, які є частиною файла book.xml, але не є частиною book-filtered.xml не буде включено до файлів PO, а отже, перекладачі не витрачатимуть час на переклад цих рядків. Тому ці рядки лишатимуться незмінними і у перекладених документах. Це, звичайно ж, знизить рівень перекладеності документа, тому вам слід скористатися параметром "--keep" для забезпечення створення перекладених документів навіть для неповних перекладів.
ЗАВДАННЯ: Чи потрібен взагалі цей розділ?
Припустімо, ви є супровідником програми із назвою foo, сторінкою підручника якої є man/foo.1. Актуальний стан, звичайно ж, підтримується лише для англійського варіанта цієї сторінки. Тепер, ви, як супровідник основної версії або пакунків з програмою, хочете створити і супроводжувати переклад. По-перше, вам слід створити файл POT, який ви надішлете перекладачам, за допомогою po4a-gettextize(1).
Отже, у нашому прикладі слід віддати команду
cd man && po4a-gettextize -f man -m foo.1 -p foo.pot
Далі, цей файл слід надіслати до відповідних списків листування перекладачів або запропонувати отримувати його з якоїсь адреси на вашому сайті.
Далі, припустімо, що ви отримали три переклади перед наступним випуском програми: de.po (з додатком de.add), sv.po та pt.po. Оскільки ви не хочете вносити зміни до ваших файлів Makefile кожного разу, коли з'являється новий переклад, ви можете скористатися po4a з відповідним файлом налаштувань у вашому Makefile. Нехай файл налаштувань має назву po4a.cfg. У нашому прикладі його вміст буде таким:
[po_directory] man/po4a/po/ [type: man] man/foo.1 $lang:man/translated/$lang/foo.1 \ add_$lang:?man/po4a/add_$lang/$lang.add opt:"-k 80"
У цьому прикладі ми припускали, що ваші створені сторінки підручника (і усі файли PO і додатків) мають зберігатися у man/translated/$lang/ (відповідно у man/po4a/po/ і man/po4a/add_$lang/) у поточному каталозі. У нашому прикладі каталог man/po4a/po/ міститиме de.po, pt.po і sv.po, а каталог man/po4a/add_de/ міститиме de.add.
Зверніть увагу на використання модифікатора ?, оскільки лише переклад німецькою (de.po) супроводжується додатком.
Для збирання самих перекладених сторінок підручника вам слід (лише одного разу!) додати такий рядок до цілі build відповідного файла Makefile:
po4a po4a.cfg
Щойно усе буде налаштовано, вам не доведеться знову редагувати Makefile, якщо з'явиться новий переклад, тобто, якщо, наприклад, перекладачі французькою надішлють вам fr.po і fr.add, ви просто запишете відповідні файли до man/po4a/po/ і man/po4a/add_fr/, і під час наступного збирання програми переклад французькою буде автоматично зібрано до man/translated/fr/.
Зауважте, що відповідну ціль для встановлення перекладених сторінок підручника разом із англійськими все ж доведеться створити окремо.
Нарешті,
якщо ви не
зберігаєте
створені
файли у
вашій
системі
керування
версіями,
вам
потрібен
буде рядок
і у вашій
цілі clean:
-rm -rf man/translated
po4a-gettextize(1), po4a-normalize(1), po4a-translate(1), po4a-updatepo(1), po4a(7).
Denis Barbier <barbier@linuxfr.org> Nicolas François <nicolas.francois@centraliens.net> Martin Quinson (mquinson#debian.org)
© SPI, inc., 2002–2020.
Ця програма є вільним програмним забезпеченням; ви можете поширювати її і/або вносити до неї зміни за умов дотримання GPL (див. файл COPYING).
2020-12-09 | Інструменти Po4a |