| Locale::Po4a::TransTractor(3pm) | Po4a-hulpmiddelen | Locale::Po4a::TransTractor(3pm) |
Locale::Po4a::TransTractor - generieke vertaler en extractor.
Het doel van het project po4a (PO voor alles) is om de vertaalwerkzaamheden (en interessanter nog, het onderhoud van vertalingen) te vergemakkelijken met behulp van gettext-hulpmiddelen in domeinen waarin deze niet meteen verwacht worden, zoals documentatie.
Deze klasse is de voorouder van alle po4a-ontleders die gebruikt worden om een document te ontleden, vertaalbare tekstfragmenten op te zoeken, deze naar een PO-bestand te extraheren en deze te vervangen door hun vertaling in het uitvoerdocument.
Meer formeel neemt ze de volgende argumenten als invoer:
Als uitvoer produceert ze:
Hier volgt een grafische voorstelling:
Invoerdocument --\ /---> Uitvoerdocument
\ / (vertaald)
+-> ontleedfunctie() -----+
/ \
Invoer-PO --------/ \---> Uitvoer-PO
(geëxtraheerd)
Deze functie wordt aangeroepen door de functie process() hieronder, maar indien u ervoor kiest de functie new() te gebruiken en handmatig inhoud toe te voegen aan uw document, zult u deze functie zelf moeten aanroepen.
Inhet volgende voorbeeld wordt een lijst alinea's die beginnen met "<p>", ontleed. Gemakshalve gaan we ervan uit dat het document goed is opgemaakt, d.w.z. dat '<p>'-tags de enige aanwezige tags zijn, en dat deze tag helemaal aan het begin van elke alinea staat.
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--; ) {
# Niet de eerste maal dat we <p> zien.
# Plaats de huidige regel opnieuw in invoer,
# en plaats de gebouwde alinea in uitvoer
$self->unshiftline($line,$lref);
# Nu het document gevormd is, dit vertalen:
# - De voorafgaande tag verwijderen
$paragraph =~ s/^<p>//s;
# - de voorafgaande tag (onvertaald) naar uitvoer sturen
# evenals de rest van de alinea (vertaald)
$self->pushline( "<p>"
. $self->translate($paragraph,$pararef)
);
next PARAGRAPH;
} else {
# Toevoegen aan de alinea
$paragraph .= $line;
$pararef = $lref unless(length($pararef));
}
# De lus herhalen
($line,$lref)=$self->shiftline();
}
# Geen gedefinieerde regel gekregen? Einde van invoerbestand.
return;
}
}
Nadat u de ontleedfunctie geïmplementeerd heeft, kunt u uw documentklasse gebruiken met behulp van de openbare interface die in de volgende sectie voorgesteld wordt.
ARGUMENTEN, behalve die welke door new() geaccepteerd worden (met verwacht type):
Deze lijst
"@{$self->{TT}{doc_in}}" bevat deze
invoerdocumentgegevens als een lijst van tekenreeksen met afwisselende
betekenis.
* De tekenreeks $textline bevat iedere regel van
de invoertekstgegevens.
* De tekenreeks "$filename:$linenum"
bevat de locatie ervan en wordt aangeroepen
via "referentie" ("linenum"
begint bij 1).
Merk op dat dit niets ontleedt. U moet de functie parse() gebruiken wanneer u klaar bent met het inladen van invoerbestanden in het document.
Deze vertaalde-documentgegevens worden verstrekt door:
* "$self->docheader()" dat de
header-tekst voor de plug-in bevat, en
* "@{$self->{TT}{doc_out}}" dat in
een lijst elke regel bevat van de vertaalde hoofdtekst.
[normaal gebruik van het po4a-document...]
($percent,$vertaald,$totaal) = $document->stats();
print "We vonden vertalingen voor $percent\% ($vertaald op $totaal) tekstfragmenten.\n";
Deze functie zendt bij een fout een geheel getal terug dat geen nul is.
Er staan vier functies ter beschikking om invoer te krijgen en uitvoer af te leveren. Zij zijn erg vergelijkbaar met shift/unshift en push/pop van Perl.
* shift in Perl zendt het eerste item uit de lijst terug en haalt het weg uit de lijst. * unshift in Perl voegt een item toe aan de lijst als het eerste item van de lijst. * pop in Perl zendt het laatste item uit de lijst terug en haalt het weg uit de lijst. * push in Perl voegt een item toe aan de lijst als het laatste item van de lijst.
Het eerste paar heeft betrekking op invoer, terwijl het tweede op uitvoer betrekking heeft. Geheugensteuntje: bij invoer bent u geïnteresseerd in de eerste regel, hetgeen shift geeft, en bij uitvoer wilt u uw resultaat toevoegen aan het einde, zoals push doet.
Er wordt een functie verstrekt om de tekst die moet worden vertaald, te verwerken.
Aan deze functie kunnen ook enkele extra argumenten meegegeven worden. Zij moeten als een hash georganiseerd worden. Bijvoorbeeld:
$self->translate("tekstfragment","ref","type",
'wrap' => 1);
Acties:
De aan de commandoregel gespecificeerde tekenset zal gebruikt worden. Indien daar niets gespecificeerd werd, wordt de tekenset van het invoerPO-bestand gebruikt, en indien in het invoerPO-bestand het standaard "CHARSET" vermeld staat, zal de tekenset van het invoerdocument teruggezonden worden, zodat geen tekenhercodering uitgevoerd wordt.
Een tekortkoming van het huidige TransTractor is dat het niet overweg kan met vertaalde documenten welke alle talen bevatten, zoals debconf-sjablonen of .desktop-bestanden.
Om dit probleem aan te pakken, zijn de enige noodzakelijke aanpassingen aan de interface:
$self->pushline_all({ "Description[".$taalcode."]=".
$self->translate($regel,$ref,$taalcode)
});
We zullen zien of dit volstaat ;)
Denis Barbier <barbier@linuxfr.org> Martin Quinson (mquinson#debian.org) Jordi Vilalta <jvprat@gmail.com>
| 2023-01-03 | Po4a-hulpmiddelen |