| Locale::Po4a::TransTractor(3pm) | Po4a Tools | Locale::Po4a::TransTractor(3pm) |
Locale::Po4a::TransTractor - generic trans(lator ex)tractor.
L'objectiu del projecte po4a (PO per a tot) és facilitar la traducció (i sobretot el manteniment de les traduccions) utilitzant les eines de gettext en àrees on no eren d'esperar, com ara en la documentació.
Aquesta classe és l'antecessor de tots els analitzadors de po4a, utilitzats per analitzar documents buscant-ne les cadenes traduïbles, extraient-les cap a un fitxer PO, i reemplaçant-les per la seva traducció en el document de sortida
Més formalment, agafa els següents paràmetres com a entrada:
Com a sortida, genera:
Aquí hi ha una representació gràfica:
Document d'entrada -\ /---> Document de sortida
\ / (traduït)
+--> funció parse() --+
/ \
PO d'entrada --------/ \---> PO de sortida
(extret)
Aquesta funció es crida des de la funció process() de més avall, però si escolliu d'utilitzar la funció new(), i afegir els continguts manualment al vostre document, haureu de cridar aquesta funció manualment.
The following example parses a list of paragraphs beginning with "<p>". For the sake of simplicity, we assume that the document is well formatted, i.e. that '<p>' tags are the only tags present, and that this tag is at the very beginning of each paragraph.
sub parse {
my $self = shift;
PARAGRAF: while (1) {
$my ($paragraf,$pararef)=("","","","");
$my $primera=1;
my ($linia,$lref)=$self->shiftline();
while (defined($linia)) {
if ($linia =~ m/<p>/ && !$primera--; ) {
# No és la primera vegada que veiem <p>.
# Tornem a posar la línia actual a l'entrada,
# i posem el paràgraf construït a la sortida
$document->unshiftline($linia,$lref);
# Ara que el document està construït, el traduïm:
# - Eliminem el tag del principi
$paragraf =~ s/^<p>//s;
# - push to output the leading tag (untranslated) and the
# rest of the paragraph (translated)
$self->pushline( "<p>"
. $self->translate($paragraph,$pararef)
);
next PARAGRAF;
} else {
# L'afegim al paràgraf
$paragraf .= $linia;
$pararef = $lref unless(length($pararef));
}
# Reinit the loop
($line,$lref)=$self->shiftline();
}
# Did not get a defined line? End of input file.
return;
}
}
Un cop hagueu implementat la vostra funció parse, ja podeu utilitzar la vostra classe de documents, a través de la interfície pública presentada a la següent secció.
PARÀMETRES, a part dels acceptats per new() (amb el tipus esperat):
This array
"@{$self->{TT}{doc_in}}" holds this
input document data as an array of strings with alternating meanings.
* The string $textline holding each line of the
input text data.
* The string "$filename:$linenum"
holding its location and called as
"reference" ("linenum" starts
with 1).
Tingueu en compte que això no analitza res. Haureu de cridar la funció parse() quan hagueu acabat d'empaquetar els fitxers d'entrada en el document.
This translated document data are provided by:
* "$self->docheader()" holding the
header text for the plugin, and
* "@{$self->{TT}{doc_out}}" holding
each line of the main translated text in the array.
[ús normal del document po4a...]
($percentatge,$encerts,$peticions) = $document->stats();
print "S'han trobat traduccions per al $percentatge\% ($encerts de $peticions) de cadenes.\n";
Aquesta funció retorna un enter no nul en cas d'error.
Four functions are provided to get input and return output. They are very similar to shift/unshift and push/pop of Perl.
* Perl shift returns the first array item and drop it from the array. * Perl unshift prepends an item to the array as the first array item. * Perl pop returns the last array item and drop it from the array. * Perl push appends an item to the array as the last array item.
The first pair is about input, while the second is about output. Mnemonic: in input, you are interested in the first line, what shift gives, and in output you want to add your result at the end, like push does.
Es proporciona una funció per tractar el text que s'ha de traduir.
Aquesta funció també pot rebre alguns paràmetres extra. Aquests han d'estar agrupats en un hash. Per exemple:
$self->translate("cadena","ref","tipus",
'wrap' => 1);
Accions:
Utilitzarà el joc de caràcters especificat a la línia de comandes. Si no s'ha especificat, utilitzarà el joc de caràcters del PO d'entrada, i si el PO d'entrada conté el valor per defecte "CHARSET", retornarà el joc de caràcters del document d'entrada, de forma que no es realitzi recodificació.
Una deficiència del TransTractor actual és que no pot tractar documents traduïts que continguin tots els idiomes, com ara les plantilles de debconf, o els fitxers .desktop.
Per resoldre aquest problema, els únics canvis necessaris a la interfície són:
$self->pushline_all({ "Description[".$codiidioma."]=".
$self->translate($linia,$ref,$codiidioma)
});
Ja veurem si és suficient ;)
Denis Barbier <barbier@linuxfr.org> Martin Quinson (mquinson#debian.org) Jordi Vilalta <jvprat@gmail.com>
Carme Cirera <menxu@hotmail.com> Jordi Vilalta <jvprat@gmail.com>
| 2023-01-03 | Po4a Tools |