| Locale::Po4a::TransTractor(3pm) | Інструменти Po4a | Locale::Po4a::TransTractor(3pm) |
Locale::Po4a::TransTractor — загальний засіб перекладу-видобування.
Метою проєкту po4a (PO для усього) є спрощення перекладу (та, що ще цікавіше, супровід перекладів) за допомогою інструментів gettext у областях, де такий переклад спочатку не передбачався, зокрема у документації.
Цей клас є предком будь-якого обробника po4a, що використовується для обробки документа, пошуку придатних до перекладу рядків, видобування цих рядків до файла PO і для заміни рядків перекладами у документі-результаті.
Формально, вхідними є такі аргументи:
На виході матимемо ось що:
Ось графічна схема роботи:
Вхідний документ --\ /---> Вихідний документ
\ / (перекладений)
+-> функція parse() ------+
/ \
Вхідний PO --------/ \---> Вихідний PO
(видобутий)
Ця функція викликається нижче функцією process(), але якщо ви захочете використати функцію new() і додати дані до вашого документа вручну, вам слід викликати цю функцію власноруч.
Нижче наведено приклад коду обробки списку абзаців, кожен з яких починається з «<p>». З міркувань простоти, будемо вважати, що документ має коректне форматування, тобто у ньому є лише теґи «<p>», і ці теґи розташовано на самому початку кожного абзацу.
sub parse {
my $self = shift;
PARAGRAPH: while (1) {
my ($paragraph,$pararef)=("","");
my $first=1;
my ($line,$lref)=$self->shiftline();
while (defined($line)) {
if ($line =~ m/<p>/ && !$first--; ) {
# Бачимо <p> не вперше.
# Повторно передаємо поточний рядок на вхід,
# і передаємо зібраний абзац на вихід
$self->unshiftline($line,$lref);
# Тепер, коли документ сформовано, перекладаємо його:
# - Вилучаємо початковий теґ
$paragraph =~ s/^<p>//s;
# - виштовхуємо на вихід початковий теґ (неперекладений) і
# решту абзацу (перекладену)
$self->pushline( "<p>"
. $self->translate($paragraph,$pararef)
);
next PARAGRAPH;
} else {
# Дописати до абзацу
$paragraph .= $line;
$pararef = $lref unless(length($pararef));
}
# Повторно започатковуємо цикл
($line,$lref)=$self->shiftline();
}
# Не отримати визначеного рядка? Кінець файла вхідних даних.
return;
}
}
Після реалізації функції parse ви можете використовувати ваш клас document за допомогою відкритого (public) інтерфейсу, який представлено у наступному розділі.
АРГУМЕНТИ, окрім тих, які приймаються new() (із очікуваним типом):
Цей
масив
"@{$self->{TT}{doc_in}}"
містить
дані
вхідного
документа
у форматі
масиву
рядків із
різним
призначенням.
* Рядок
$textline
містить
кожен з
рядків
вхідних
текстових
даних.
* Рядок
"$filename:$linenum"
містить
його
розташування
у тексті і
називається
«прив'язка»
("linenum"
починається
з 1).
Будь ласка, зауважте, що функція не обробляє будь-що. Функцію parse() слід використовувати після завершення пакування вхідних файлів до документа.
Ці дані
перекладеного
документа
можна
отримати
так:
* "$self->docheader()"
містить
текст
заголовка
для
додатка, а
* "@{$self->{TT}{doc_out}}"
містить
кожен з
рядків
основного
перекладеного
тексту у
форматі
масиву.
[звичайне використання документа po4a...]
($percent,$hit,$queries) = $document->stats();
print "Знайдено переклади $percent\% ($hit з $queries) рядків.\n";
Ця функція повертає ненульове ціле число, якщо станеться помилка.
Передбачено чотири функції для отримання вхідних даних і повернення вихідних даних. Вони дуже подібні до функцій shift/unshift та push/pop у Perl.
* shift у Perl повертає перший запис масиву і викидає його з масиву. * unshift у Perl дописує запис на початку масиву як його перший запис. * pop у Perl повертає останній запис масиву і викидає його з масиву. * push у Perl дописує запис до масиву наприкінці.
Перша пара працює із вхідними даними, а друга — з вихідними. Мнемоніка: у вхідних даних вас цікавитиме перший рядок, який дає shift, у вихідних ви додаєте результат наприкінці, як це робить push.
Одну функцію передбачено для обробки тексту, який має бути перекладено.
Ця функція також може приймати додаткові аргументи. Їх має бути упорядковано як хеш. Приклад:
$self->translate("string","ref","type",
'wrap' => 1);
Дії:
Функція використовуватиме для виведення кодування, вказане у рядку команди. Якщо кодування не вказано, буде використано кодування з вхідного файла PO. Якщо ж у цьому файлі лишатиметься типове значення кодування, «CHARSET», функція поверне значення кодування вхідного документа, отже ніякого перекодування не виконуватиметься.
Недоліком поточної реалізації TransTractor є те, що модуль не здатен обробляти перекладені документи, у яких містяться переклади усіма мовами, наприклад, шаблони debconf або файли .desktop.
Для усування цієї проблеми достатньо змінити у інтерфейсі таке:
$self->pushline_all({ "Description[".$langcode."]=".
$self->translate($line,$ref,$langcode)
});
Побачимо, чи цього досить ;)
Denis Barbier <barbier@linuxfr.org> Martin Quinson (mquinson#debian.org) Jordi Vilalta <jvprat@gmail.com>
| 2023-01-03 | Інструменти Po4a |