Locale::Po4a::TransTractor - generischer
Übersetzungs-Ausleser
Das Projektziel von Po4a (PO für alles) ist es, die
Übersetzung (und interessanter, die Wartung der Übersetzung)
zu vereinfachen, indem die Gettext-Werkzeuge auch für Gebiete
verwendet werden, wo diese nicht erwartet werden, wie Dokumentation.
Diese Klasse ist Vorfahr jedes Po4a-Parsers. Sie wird zum
Auswerten eines Dokuments, zur Suche nach übersetzbaren
Zeichenketten, zum Auslesen in eine PO-Datei und zur Ersetzung durch ihre
Übersetzung im Ausgabedokument, verwandt.
Oder formaler, sie erwartet die folgenden Argumente als
Eingabe:
- ein zu übersetzendes Dokument
- eine PO-Datei, die die zu verwendende Übersetzung
enthält.
Als Ausgabe produziert sie:
- eine weitere PO-Datei, die aus der Auslösung der
übersetzbaren Zeichenketten aus dem Eingabedokument entsteht
- ein übersetztes Dokument mit der gleichen Struktur wie das der
Eingabe, bei der aber alle übersetzbaren Zeichenketten mit den in
der als Eingabe bereitgestellten PO-Datei gefundenen Übersetzungen
ersetzt wurden.
Dies ist eine graphische Darstellung davon:
Eingabedokument --\ /---> Ausgabedokument
\ / (übersetzt)
+-> parse()-Funktion -----+
/ \
Eingabe-PO -------/ \---> Ausgabe-PO
(herausgelöst)
- parse()
- Hier findet die gesamte Arbeit statt: das Auswerten der Eingabedokumente,
die Erstellung der Ausgabe und das Herauslösen der
übersetzbaren Zeichenketten. Das ist mit den in Abschnitt
INTERNE FUNKTIONEN weiter unten vorgestellten angebotenen
Funktionen recht einfach. Lesen Sie auch die ÜBERSICHT, in
der ein Beispiel vorgestellt wird.
Diese Funktion wird von der unten beschriebenen
process()-Funktion aufgerufen. Falls Sie sich aber entscheiden,
die new()-Funktion zu verwenden und den Inhalt manuell zu Ihrem
Dokument hinzuzufügen, müssen Sie diese Funktion selbst
aufrufen.
- Diese Funktion gibt den Header zurück und sollte dem erzeugten
Dokument hinzugefügt werden, ordentlich zitiert, so dass sie in der
Zielsprache ein Kommentar wird. Lesen Sie den Abschnitt Entwickler
über Übersetzungen schulen, von po4a(7), um zu
erfahren, wozu dies benutzt wird.
ÜBERSICHT
Das folgende Beispiel wertet eine Liste von Absätzen aus,
die mit »<p>» beginnen. Der Einfachheit halber wird
angenommen, dass das Dokument gut formatiert ist, d.h. dass
»<p>«-Markierungen die einzigen vorhandene Markierungen
sind und dass diese Markierung ganz am Anfang jedes Absatzes steht.
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>taucht nicht zum ersten Mal auf.
# Fügen Sie die aktuelle Zeile erneut in die Eingabe,
# und fügen Sie den erstellten Absatz in die Ausgabe.
$self->unshiftline($line,$lref);
# Nun ist das Dokument ausgestaltet, es wird übersetzt:
# - Die führende Markierung entfernen
$paragraph =~ s/^<p>//s;
# - die Ausgabe der führenden Markierung (unübersetzt) und des
# Rests des Absatzes (unübersetzt) anstoßen
$self->pushline( "<p>"
. $self->translate($paragraph,$pararef)
);
next PARAGRAPH;
} else {
# an den Absatz anhängen
$paragraph .= $line;
$pararef = $lref unless(length($pararef));
}
# Die Schleife neu initialisieren
($line,$lref)=$self->shiftline();
}
# Keine definierte Zeile erhalten? Ende der Eingabedatei
return;
}
}
Sobald Sie die Funktion zum Auswerten implementiert haben,
können Sie Ihre Dokumentenklasse verwenden, die die
öffentliche Schnittstelle benutzt, die im nächsten Abschnitt
vorgestellt wird.
ÖFFENTLICHE SCHNITTSTELLE für Skripte, die Ihren
Parser benutzen
- process(%)
- Diese Funktion kann alles tun, was Sie mit einem Po4a-Dokument in einem
Aufruf tun müssen. Ihre Argumente müssen als ein Hash
gepackt sein. AKTIONEN:
- a.
- liest alle PO-Dateien, die in po_in_name angegeben sind
- b.
- liest alle Originaldokumente, die in file_in_name angegeben sind
- c.
- wertet das Dokument aus
- d.
- liest alle angegebenen Addenda und wendet sie an
- e.
- schreibt das übersetzte Dokument in file_out_name (falls
angegeben)
- f.
- schreibt die extrahierte PO-Datei nach po_out_name (falls angegeben)
ARGUMENTE jenseits der durch new() akzeptierten (mit
erwartetem Typ):
- file_in_name
(@)
- Liste der Dateinamen, bei denen das Eingabedokument gelesen werden
sollte
- file_in_charset
($)
- im Eingabedokument benutzter Zeichensatz (falls er nicht angegeben wurde,
wird versucht, ihn aus dem Eingabedokument zu bestimmen).
- file_out_name
($)
- Name der Datei, in den das Ausgabedokument geschrieben werden soll
- file_out_charset
($)
- im Ausgabedokument benutzter Zeichensatz (falls er nicht angegeben wurde,
wird der der PO-Datei benutzt).
- po_in_name
(@)
- Liste der Dateinamen, von denen die Eingabe-PO-Dateien gelesen werden
sollen; enthält die Übersetzung, die benutzt wird, um das
Dokument zu übersetzen
- po_out_name
($)
- Name der Datei, in den die Ausgabe-PO-Datei geschrieben werden soll;
enthält die aus dem Eingabedokument extrahierten
Zeichenketten.
- addendum (@)
- Liste der Dateinamen, aus denen die Addenda gelesen werden
- addendum_charset
($)
- Zeichensatz für die Addenda
- new(%)
- erstellt ein neues Po4a-Dokument; akzeptiert Optionen (in dem als
Parameter übergebenen Hash):
- read($$)
- fügt am Ende des existierenden Feldes
"@{$self->{TT}{doc_in}}" ein weiteres
Eingabedokument ein. Das Argument ist der zu lesende Dateiname. Falls ein
zweiter Dateiname bereitgestellt wird, ist dies der in der Referenz zu
verwendende Dateiname.
Das Feld
"@{$self->{TT}{doc_in}}"
hält die Eingabedokumentdaten als ein Feld von Zeichenketten mit
abwechselnden Bedeutungen.
* Die Zeichenkette $textline hält jede
Zeile der Eingabetextdaten.
* Die Zeichenkette "$filename:$linenum"
hält ihren Ort und wird
»reference« genannt
("linenum" beginnt mit 1).
Bitte beachten Sie, dass es nichts auswertet. Sie sollten die
Funktion parse() benutzen, wenn Sie damit fertig sind,
Eingabedateien in das Dokument zu packen.
- write($)
- schreibt das übersetzte Dokument in den angegebene Dateinamen
Diese übersetzten Dokumentdaten werden bereitgestellt
durch:
* "$self->docheader()" hält
den Kopftext für die Erweiterung und
* "@{$self->{TT}{doc_out}}"
hält jede Zeile des übersetzten Haupttextes in dem
Feld.
- readpo($)
- fügt den Inhalt einer Datei (deren Name als Argument
übergeben wird) der existierenden Eingabe-PO-Datei hinzu. Der alte
Inhalt wird nicht verworfen.
- writepo($)
- schreibt die extrahierte PO-Datei in den angegebene Dateinamen
- stats()
- gibt einige Statistiken über bisher erledigte Übersetzungen
zurück. Bitte beachten Sie, dass es sich nicht um die gleichen
Statistiken handelt, die »msgfmt --statistics« ausgibt. Hier
geht es um den aktuellen Gebrauch der PO-Datei, während Msgfmt den
Status der Datei ausgibt. Es ist ein Wrapper für die Funktion
Locale::Po4a::Po::stats_get, die auf die Eingabe-PO-Datei angewandt wird.
Beispiel für die Benutzung:
[normale Benutzung des Po4a-Dokuments …]
($percent,$hit,$queries) = $document->stats();
print "Es wurden Übersetzungen für $percent\% ($hit von $queries) der Zeichenketten gefunden.\n";
- addendum($)
- Weitere Informationen, was Addenda sind und wie Übersetzer sie
schreiben sollten, finden Sie unter po4a(7). Um ein Addendum auf
ein übersetztes Dokument anzuwenden, übergeben Sie einfach
dieser Funktion seinen Dateinamen und Sie sind fertig. ;)
Diese Funktion gibt bei einem Fehler eine Ganzzahl ungleich
Null zurück.
Es werden vier Funktionen bereitgestellt, um Eingaben zu erhalten
und Ausgaben zurückzuliefern. Sie sind den Funktionen shift/unshift
und push/pop von Perl sehr ähnlich.
* Perl shift liefert den ersten Feldeintrag zurück und entfernt ihn aus dem Feld.
* Perl unshift hängt einen Eintrag als ersten Feldeintrag vor das Feld.
* Perl pop liefert den letzten Feldeintrag zurück und entfernt ihn aus dem Feld.
* Perl push hängt einen Eintrag als letzten Feldeintrag an das Feld an.
Das erste Paar handelt von der Eingabe, während das Zweite
von der Ausgabe handelt. Merkhilfe: In der Eingabe sind Sie an der ersten
Zeile interessiert, was Shift ausgibt und in der Ausgabe möchten Sie
Ihr Ergebnis an das Ende hinzufügen, wie dies Push tut.
- shiftline()
- Diese Funktion liefert die erste auszuwertende Zeile und ihre
entsprechende Referenz (als Feld gepackt) aus dem Feld
"@{$self->{TT}{doc_in}}"
zurück und entfernt diese ersten zwei Feldeinträge. Hier
wird die Referenz durch eine Zeichenkette
"$filename:$linenum"
bereitgestellt.
- unshiftline($$)
- Schiebt die letzte geschobene Zeile des Eingabedokuments und seiner
entsprechenden Referenz an den Kopf von
"{$self->{TT}{doc_in}}"
zurück.
- pushline($)
- Schiebt eine neue Zeile an das Ende von
"{$self->{TT}{doc_out}}".
- popline()
- Holt die zuletzt geschobene Zeile vom Ende von
"{$self->{TT}{doc_out}}".
Eine Funktion wird bereitgestellt, um den Text zu handhaben, der
übersetzt werden soll.
- translate($$$)
- vorgeschriebene Argumente:
- eine zu übersetzende Zeichenkette
- die Referenz dieser Zeichenkette (d.h. Position in der Eingabedatei)
- der Typ der Zeichenkette (d.h. die inhaltliche Beschreibung ihrer
strukturellen Rolle; benutzt in Locale::Po4a::Po::gettextization();
siehe auch po4a(7), Abschnitt Gettextisierung: Wie funktioniert
das?)
Diese Funktion kann außerdem einige zusätzliche
Argumente entgegennehmen. Sie müssen als Hash organisiert sein. Zum
Beispiel:
$self->translate("string","ref","type",
'wrap' => 1);
- wrap
- logische Variable, ob die Leerzeichen in der Zeichenkette als unwichtig
betrachtet werden können. Falls ja, wird die Funktion die
Zeichenkette in eine kanonische Form bringen, bevor nach einer
Übersetzungen gesucht oder diese extrahiert wird und ein
Zeilenumbruch wird durchgeführt.
- wrapcol
- die Spalte, an der umgebrochen werden soll (standardmäßig
76)
- ein zusätzlicher Kommentar, der zum Eintrag hinzugefügt
wird
Aktionen:
- schiebt die Zeichenkette, die Referenz und den Typ nach po_out
- gibt die Übersetzung der Zeichenkette (wie sie in po_in gefunden
wurde) zurück, so dass der Parser das doc_out bauen kann
- handhabt die Zeichensätze, um den Zeichensatz der Zeichenkette
umzuwandeln, bevor sie an po_out gesandt werden und bevor die
Übersetzungen zurückgegeben werden
- verbose()
- kehrt zurück, falls die Option »verbose«
während der Erstellung von TransTractor übergeben wurde
- debug()
- kehrt zurück, falls die Option »debug« während
der Erstellung von TransTractor übergeben wurde
- detected_charset($)
- Dies teilt TransTractor mit, dass ein neuer Zeichensatz (das erste
Argument) vom Eingabedokument festgestellt wurde. Er kann
üblicherweise aus den Kopfzeilen des Dokuments gelesen werden. Nur
der erste Zeichensatz, der entweder von dem process()-Argumenten
kommt oder aus dem Dokumente ermittelt wird, wird
übrigbleiben.
- get_out_charset()
- Diese Funktion wird den Zeichensatz zurückgeben, der im
ausgegebenen Dokument benutzt werden sollte (üblicherweise
nützlich, um den ermittelten Zeichensatz des Eingabedokuments zu
ersetzen, wo er gefunden wurde).
Sie wird den auf der Befehlszeile angegebenen Zeichensatz
verwenden. Falls er nicht angegeben wurde, wird sie den Zeichensatz der
Eingabe-PO-Datei benutzen und falls die Eingabe-PO-Datei die Vorgabe
»CHARSET« hat, wird sie den Zeichensatz des
Eingabedokuments zurückgeben, so dass die Kodierung
durchgeführt wird.
- recode_skipped_text($)
- Diese Funktion gibt den vom Zeichensatz des Eingabedokuments in den
Zeichensatz des Ausgabedokuments neu kodierten Text zurück, der als
Argument übergeben wurde. Dies ist nicht nötig, wenn eine
Zeichenkette übersetzt wird (translate() kodiert selbst
alles neu), aber es ist nötig, wenn Sie eine Zeichenkette des
Eingabedokuments überspringen und wenn Sie wollen, dass das
Ausgabedokument über eine einheitliche globale Kodierung
verfügt.
Ein Mangel des aktuellen Transtractors ist, dass er keine
übersetzten Dokumente handhaben kann, die alle Sprachen enthalten,
wie Debconf-Schablonen oder Desktop-Dateien.
Um dieses Problem anzugehen, sind nur bestimmte
Schnittstellenänderungen notwendig:
Es wird sich zeigen, ob das ausreicht. ;)
Denis Barbier <barbier@linuxfr.org>
Martin Quinson (mquinson#debian.org)
Jordi Vilalta <jvprat@gmail.com>