LOCALE::PO4A::TRANSTRACTOR.3PM(1) User Contributed Perl Documentation NAME Locale::Po4a::TransTractor - generischer Ubersetzungs-Ausleser BESCHREIBUNG Das Projektziel von Po4a (PO fur alles) ist es, die Ubersetzung (und interessanter, die Wartung der Ubersetzung) zu vereinfachen, indem die Gettext-Werkzeuge auch fur 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 ubersetzbaren Zeichenketten, zum Auslesen in eine PO-Datei und zur Ersetzung durch ihre Ubersetzung im Ausgabedokument, verwandt. Oder formaler, sie erwartet die folgenden Argumente als Eingabe: - ein zu ubersetzendes Dokument - eine PO-Datei, die die zu verwendende Ubersetzung enthalt. Als Ausgabe produziert sie: - eine weitere PO-Datei, die aus der Auslosung der ubersetzbaren Zeichenketten aus dem Eingabedokument entsteht - ein ubersetztes Dokument mit der gleichen Struktur wie das der Eingabe, bei der aber alle ubersetzbaren Zeichenketten mit den in der als Eingabe bereitgestellten PO-Datei gefundenen Ubersetzungen ersetzt wurden. Dies ist eine graphische Darstellung davon: Eingabedokument --\ /---> Ausgabedokument \ / (ubersetzt) +-> parse()-Funktion -----+ / \ Eingabe-PO -------/ \---> Ausgabe-PO (herausgelost) FUNCTIONEN, DIE IHR PARSER UBERSCHREIBEN SOLLTE parse() Hier findet die gesamte Arbeit statt: das Auswerten der Eingabedokumente, die Erstellung der Ausgabe und das Herauslosen der ubersetzbaren Zeichenketten. Das ist mit den in Abschnitt INTERNE FUNKTIONEN weiter unten vorgestellten angebotenen Funktionen recht einfach. Lesen Sie auch die UBERSICHT, 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 hinzuzufugen, mussen Sie diese Funktion selbst aufrufen. docheader() Diese Funktion gibt den Header zuruck und sollte dem erzeugten Dokument hinzugefugt werden, ordentlich zitiert, so dass sie in der Zielsprache ein Kommentar wird. Lesen Sie den Abschnitt Entwickler uber Ubersetzungen schulen, von po4a(7), um zu erfahren, wozu dies benutzt wird. UBERSICHT Das folgende Beispiel wertet eine Liste von Absatzen aus, die mit >>

>> beginnen. Der Einfachheit halber wird angenommen, dass das Dokument gut formatiert ist, d.h. dass >>

<<-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/

/ && !$first--; ) { #

taucht nicht zum ersten Mal auf. # Fugen Sie die aktuelle Zeile erneut in die Eingabe, # und fugen Sie den erstellten Absatz in die Ausgabe. $self->unshiftline($line,$lref); # Nun ist das Dokument ausgestaltet, es wird ubersetzt: # - Die fuhrende Markierung entfernen $paragraph =~ s/^

//s; # - die Ausgabe der fuhrenden Markierung (unubersetzt) und des # Rests des Absatzes (unubersetzt) anstossen $self->pushline( "

" . $self->translate($paragraph,$pararef) ); next PARAGRAPH; } else { # an den Absatz anhangen $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, konnen Sie Ihre Dokumentenklasse verwenden, die die offentliche Schnittstelle benutzt, die im nachsten Abschnitt vorgestellt wird. OFFENTLICHE SCHNITTSTELLE fur Skripte, die Ihren Parser benutzen Konstruktor process(%) Diese Funktion kann alles tun, was Sie mit einem Po4a-Dokument in einem Aufruf tun mussen. Ihre Argumente mussen 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 ubersetzte 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 UTF-8 benutzt). 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 UTF-8 benutzt). po_in_name (@) Liste der Dateinamen, von denen die Eingabe-PO-Dateien gelesen werden sollen; enthalt die Ubersetzung, die benutzt wird, um das Dokument zu ubersetzen po_out_name ($) Name der Datei, in den die Ausgabe-PO-Datei geschrieben werden soll; enthalt die aus dem Eingabedokument extrahierten Zeichenketten. addendum (@) Liste der Dateinamen, aus denen die Addenda gelesen werden addendum_charset ($) Zeichensatz fur die Addenda new(%) erstellt ein neues Po4a-Dokument; akzeptiert Optionen (in dem als Parameter ubergebenen Hash): verbose ($) setzt die Detailstufe debug ($) setzt die Debugging-Stufe wrapcol ($) die Spalte, an der der Text im Ausgabedokument umgebrochen werden soll (standardmassig 76) Ein negativer Wert bedeutet, dass uberhaupt kein Umbruch stattfindet. Es akzeptiert auch die nachsten Optionen fur zugrundeliegende PO- Dateien: porefs, copyright-holder, msgid-bugs-address, package- name, package-version, wrap-po. Manipulieren von Dokumentdateien read($$$) Fugt weitere Eingabedokumentendaten am Ende des bestehenden Felds "@{$self->{TT}{doc_in}}" hinzu. Diese Funktion akzeptiert zwei verpflichtende Argumente und ein optionales. * Der von Platte zu lesende Dateiname; * Der Name, der fur den Bau von Referenzen in der PO-Datei verwandt werden soll; * Der Zeichensatz, der zum Lesen dieser Datei (standardmassig UTF-8) verwendet werden soll Das Feld "@{$self->{TT}{doc_in}}" halt die Eingabedokumentdaten als ein Feld von Zeichenketten mit abwechselnden Bedeutungen. * Die Zeichenkette $textline halt jede Zeile der Eingabetextdaten. * Die Zeichenkette "$filename:$linenum" halt 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 ubersetzte Dokument in den angegebene Dateinamen Diese ubersetzten Dokumentdaten werden bereitgestellt durch: * "$self->docheader()" halt den Kopftext fur die Erweiterung und * "@{$self->{TT}{doc_out}}" halt jede Zeile des ubersetzten Haupttextes in dem Feld. PO-Dateien bearbeiten readpo($) fugt den Inhalt einer Datei (deren Name als Argument ubergeben 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 uber bisher erledigte Ubersetzungen zuruck. 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, wahrend Msgfmt den Status der Datei ausgibt. Es ist ein Wrapper fur die Funktion Locale::Po4a::Po::stats_get, die auf die Eingabe-PO-Datei angewandt wird. Beispiel fur die Benutzung: [normale Benutzung des Po4a-Dokuments ] ($percent,$hit,$queries) = $document->stats(); print "Es wurden Ubersetzungen fur $percent\% ($hit von $queries) der Zeichenketten gefunden.\n"; Addenda manipulieren addendum($) Weitere Informationen, was Addenda sind und wie Ubersetzer sie schreiben sollten, finden Sie unter po4a(7). Um ein Addendum auf ein ubersetztes Dokument anzuwenden, ubergeben Sie einfach dieser Funktion seinen Dateinamen und Sie sind fertig. ;) Diese Funktion gibt bei einem Fehler eine Ganzzahl ungleich Null zuruck. INTERNE FUNKTIONEN, die zum Schreiben abgeleiteter Parser verwendet werden Eingaben erhalten, Ausgaben bereitstellen Es werden vier Funktionen bereitgestellt, um Eingaben zu erhalten und Ausgaben zuruckzuliefern. Sie sind den Funktionen shift/unshift und push/pop von Perl sehr ahnlich. * Perl shift liefert den ersten Feldeintrag zuruck und entfernt ihn aus dem Feld. * Perl unshift hangt einen Eintrag als ersten Feldeintrag vor das Feld. * Perl pop liefert den letzten Feldeintrag zuruck und entfernt ihn aus dem Feld. * Perl push hangt einen Eintrag als letzten Feldeintrag an das Feld an. Das erste Paar handelt von der Eingabe, wahrend das Zweite von der Ausgabe handelt. Merkhilfe: In der Eingabe sind Sie an der ersten Zeile interessiert, was Shift ausgibt und in der Ausgabe mochten Sie Ihr Ergebnis an das Ende hinzufugen, 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}}" zuruck und entfernt diese ersten zwei Feldeintrage. 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}}" zuruck. 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}}". Zeichenketten als ubersetzbar markieren Eine Funktion wird bereitgestellt, um den Text zu handhaben, der ubersetzt werden soll. translate($$$) vorgeschriebene Argumente: - eine zu ubersetzende 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 ausserdem einige zusatzliche Argumente entgegennehmen. Sie mussen 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 konnen. Falls ja, wird die Funktion die Zeichenkette in eine kanonische Form bringen, bevor nach einer Ubersetzungen gesucht oder diese extrahiert wird und ein Zeilenumbruch wird durchgefuhrt. wrapcol die Spalte an der umgebrochen werden soll (standardmassig der Wert von wrapcol, der wahrend der Erstellung des TransTractor festgelegt wurde oder 76). Der negative Wert wird von der Vorgabe abgezogen. comment ein zusatzlicher Kommentar, der zum Eintrag hinzugefugt wird Aktionen: - schiebt die Zeichenkette, die Referenz und den Typ nach po_out - gibt die Ubersetzung der Zeichenkette (wie sie in po_in gefunden wurde) zuruck, so dass der Parser das doc_out bauen kann - handhabt die Zeichensatze, um den Zeichensatz der Zeichenkette umzuwandeln, bevor sie an po_out gesandt werden und bevor die Ubersetzungen zuruckgegeben werden Verschiedene Funktionen verbose() kehrt zuruck, falls die Option >>verbose<< wahrend der Erstellung von TransTractor ubergeben wurde debug() kehrt zuruck, falls die Option >>debug<< wahrend der Erstellung von TransTractor ubergeben wurde get_in_charset() Diese Funktion liefert den Zeichensatz zuruck, der als Hauptzeichensatz bereitgestellt wurde get_out_charset() Diese Funktion wird den Zeichensatz zuruckgeben, der im ausgegebenen Dokument benutzt werden sollte (ublicherweise nutzlich, 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 zuruckgeben, so dass die Kodierung durchgefuhrt wird. ZUKUNFTIGE ENTWICKLUNGEN Ein Mangel des aktuellen Transtractors ist, dass er keine ubersetzten Dokumente handhaben kann, die alle Sprachen enthalten, wie Debconf- Schablonen oder Desktop-Dateien. Um dieses Problem anzugehen, sind nur bestimmte Schnittstellenanderungen notwendig: - einen Hash in po_in_name nehmen (eine Liste pro Sprache) - ein zu ubersetzendes Argument hinzufugen, um die Zielsprache anzugeben - ein Funktion pushline_all erstellen, die pushline ihres Inhalts fur alle Sprachen unter Benutzung einer kartenahnlichen Syntax ausfuhren wurde: $self->pushline_all({ "Description[".$langcode."]=". $self->translate($line,$ref,$langcode) }); Es wird sich zeigen, ob das ausreicht. ;) AUTOREN Denis Barbier Martin Quinson (mquinson#debian.org) Jordi Vilalta perl v5.38.2 2024-06-26 LOCALE::PO4A::TRANSTRACTOR.3PM(1)