| Locale::Po4a::TransTractor(3pm) | Po4a Алати | Locale::Po4a::TransTractor(3pm) |
Locale::Po4a::TransTractor - генерички транс(латор екс)трактор.
Циљ po4a (PO for anything – 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;
}
}
Једном када сте имплементирали функцију за парсирање, можете да употребите своју класу документа, користећи јавни интерфејс који је представљен у следећем одељку.
АРГУМЕНТИ, уз оне које прихвата new() (са очекиваним типом):
Низ
"@{$self->{TT}{doc_in}}"
чува
податке
из овог
улазни
документа
као низ
стрингова
са
наизменичним
значењима.
* Стринг
$textline који
држи
сваку
линију
улазног
текста.
* Стринг
"$filename:$linenum"
који држи
његову
локацију
и који се
зове "reference"
("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.
* Perl shift враћа прву ставку низа и уклања је из њега. * Perl unshift ставља ставку на почетак низа као прву. * Perl pop враћа последњу ставку низа и уклања је из њега. * Perl push додаје ставку у низ као последњу.
Први пар се тиче улаза, док је други у вези излаза. Да се лакше упамти: за улаз вам је од интереса прва линија, а то је управо оно што враћа shift, док за излаз желите да свој резултат додате на крај, као што то ради push.
Достављена је једна функција која обрађује текст предвиђен за превођење.
И ова функција може да узме неколико додатних аргумената. Они морају да се организују у хеш. На пример:
$self->translate("string","ref","type",
'wrap' => 1);
Акције:
Користиће излазни скуп карактера наведен у командној линији. Ако није био задат, користиће се скуп карактера улазног PO, а ако улазни PO има подразумевану вредност „CHARSET”, вратиће скуп карактера улазног документа, тако да се не обавља кодирање..
Једна од лоших страна текуће TransTractor класе је да не може обрађивати преведене документе који садрже све језике, као што су debconf шаблони, или .desktop фајлови.
Како би се решио проблем, неопходне су само следеће измене интерфејса:
$self->pushline_all({ "Description[".$langcode."]=".
$self->translate($line,$ref,$langcode)
});
Видећемо да ли је ово довољно ;)
Дени Барбије <barbier@linuxfr.org> Мартин Квинсон (mquinson#debian.org) Жорди Вилалта <jvprat@gmail.com>
| 2023-01-03 | Po4a Алати |