LOCALE::PO4A::XML.3PM(1) User Contributed Perl Documentation NAME Locale::Po4a::Xml - konvertiert XML-Dokumente und -Derivate von/in PO-Dateien 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. Locale::Po4a::Xml ist ein Modul, um bei der Ubersetzung von XML- Dokumenten in andere [naturliche] Sprachen zu helfen. Es kann auch als Basis verwandt werden, um Module fur XML-basierte Dokumente zu erstellen. UBERSETZEN MIT PO4A::XML Dieses Modul kann direkt zum Umgang mit generischen XML-Dokumenten verwandt werden. Dabei werden die Inhalte aller Markierungen (>>Tags<<) aber keiner Attribute ausgelesen, da sich dort in den meisten XML- basierten Dokumenten der geschriebene Text befindet. Es gibt einige Optionen (die im nachsten Abschnitt beschrieben werden), die dieses Verhalten anpassen lassen. Falls dies nicht auf Ihr Dokumentenformat passt, ermutigen wir Sie, Ihr eigenes, von diesem Modul abgeleitetes Modul zu schreiben, um die Details Ihres Formats zu beschreiben. Lesen Sie den Abschnitt SCHREIBEN ABGELEITETER MODULE weiter unten fur die Beschreibung des Prozesses. VON DIESEM MODUL AKZEPTIERTE OPTIONEN Die globale Option >>debug<< fuhrt dazu, dass das Module ausgeschlossene Zeichenketten anzeigt, um zu erkennen, ob etwas Wichtiges ubersprungen wird. Dies sind die Modul-spezifischen Optionen: nostrip verhindert, dass es Leerzeichen um herausgeloste Zeichenketten entfernt wrap Erstellt eine kanonische Form der zu ubersetzenden Zeichenketten, berucksichtigt dabei, dass Leerzeichen nicht wichtig sind, und bricht das ubersetzte Dokument um. Diese Option kann mit angepassten >>tag<<-Optionen uberschrieben werden. Lesen Sie dazu uber die Option translated weiter unten. unwrap_attributes Attribute werden standardmassig zeilenumgebrochen. Diese Option unterbindet Zeilenumbruche. caseinsensitive Damit funktioniert die Suche nach Markierungen und Attributen unabhangig von der Gross-/Kleinschreibung. Falls es definiert ist, wird es laNG und Lang als lang behandeln. escapequotes Maskiert Anfuhrungszeichen in Ausgabezeichenketten. Dies ist zum Beispiel fur die Erstellung von Zeichenkettenressourcen zur Verwendung mit den Android-Bauwerkzeugen notwendig. Siehe auche: https://developer.android.com/guide/topics/resources/string-resource.html includeexternal Wenn definiert, werden externe Entitaten in das erstellte (ubersetzte) Dokument und fur die Herauslosung der Zeichenketten aufgenommen. Falls es nicht definiert ist, mussen Sie externe Entitaten separat als unabhangige Dokumente ubersetzen. ontagerror Diese Option defniert das Verhalten des Moduls, wenn es auf eine ungultige XML-Syntax trifft (eine schliessende Markierung (>>Tag<<), die nicht zur letzten offnenden Markierung passt). Sie kann die folgenden Werte annehmen: fail Dies ist der Standardwert. Das Modul wird sich mit einem Fehler beenden. warn Das Modul wird fortfahren und eine Warnung ausgeben. silent Das Modul wird ohne Warnungen fortfahren. Seien Sie vorsichtig, wenn Sie diese Option verwenden. Im Allgemeinen wird empfohlen, die Eingabedatei zu reparieren. tagsonly Hinweis: Diese Option wurde missbilligt. extrahiert nur die angegebenen Markierungen in der Option tags. Andernfalls wird es nur die Markierungen extrahieren mit Ausnahme derjenigen, die angegeben wurden. doctype Zeichenkette, bei der ausprobiert wird, ob sie zu der ersten Zeile des Dokumenttyps passt (falls definiert). Falls nicht, wird eine Warnung angezeigt, dass das Dokument vom falschen Typ ist. addlang Zeichenkette, die den Pfad einer Markierung (z.B. ) angibt, zu dem ein Attribut lang="" hinzugefugt werden soll. Die Sprache wird als Basisname der PO-Datei ohne irgendeine .po-Erweiterung definiert sein. optionalclosingtag Logischer Wert, der angibt, ob schliessende Markierungen optional sind (wie in HTML). Standardmassig losen fehlende schliessende Markierungen einen Fehler aus, der entsprechend ontagerror behandelt wird. tags Hinweis: Diese Option wurde missbilligt. Sie sollten stattdessen die Optionen translated und untranslated verwenden. leerzeichengetrennte Liste der Markierungen, die Sie ubersetzen oder uberspringen mochten. Standardmassig werden die angegebenen Markierungen ausgenommen, falls Sie aber die Option >>tagsonly<< verwenden, werden nur die angegebenen Markierungen einbezogen. Die Markierungen mussen die Form haben, Sie konnen aber einige verbinden (), um anzugeben, dass der Inhalt der Markierung nur ubersetzt wird, wenn er in einer -Markierung liegt. Sie konnen ausserdem einige Markierungsoptionen angeben, indem Sie ein paar Zeichen an den Anfang der Markierungshierarchie stellen. Sie konnen zum Beispiel w (Zeilenumbruch) oder W (kein Zeilenumbruch) setzen, um das Standardverhalten, das durch die globale Option wrap angegeben wurde, ausser Kraft zu setzen. Beispiel: W attributes leerzeichengetrennte Liste der Markierungsattribute, die Sie ubersetzen wollen. Sie konnen die Attribute mittels ihres Namens angeben (zum Beispiel >>lang<<), aber Sie konnen ihnen eine Markierung voranstellen, um anzugeben, dass das Attribut nur ubersetzt wird, wenn es sich in der angegebenen Markierung befindet. Zum Beispiel: lang gibt an, dass das Attribut lang nur ubersetzt wird, falls es in einer und einer -Markierung steht. foldattributes Attribute in innenliegenden Markierungen nicht ubersetzen; stattdessen alle Attribute einer Markierung durch po4a-id= ersetzen Dies ist nutzlich, wenn Attribute nicht ubersetzt werden sollen, da dies die Zeichenketten fur Ubersetzer vereinfacht und Tippfehler vermeidet. customtag leerzeichengetrennte Liste der Markierungen, die nicht als Markierungen betrachtet werden. Diese Markierungen werden als innenliegend angesehen und mussen nicht geschlossen werden. break leerzeichengetrennte Liste der Markierungen, die die Abfolge unterbrechen sollen. Standardmassig unterbrechen alle Markierungen die Abfolge. Die Markierungen mussen in der Form vorliegen, Sie konnen aber einige verbinden (), falls eine Markierung nur berucksichtigt werden soll, wenn sie innerhalb einer anderen Markierung liegt (). Bitte beachten Sie, dass eine Markierung nur in einer der Einstellungszeichenketten break, inline placeholder oder customtag aufgefuhrt sein soll. inline leerzeichengetrennte Liste der Markierungen, die als innenliegend betrachtet werden sollen. Standardmassig unterbrechen alle Markierungen die Abfolge. Die Markierungen mussen in der Form vorliegen, Sie konnen aber einige verbinden (), falls eine Markierung nur berucksichtigt werden soll, wenn sie innerhalb einer anderen Markierung liegt (). placeholder leerzeichengetrennte Liste der Markierungen, die als Platzhalter betrachtet werden sollen. Platzhalter unterbrechen die Abfolge nicht, der Inhalt der Platzhalter wird aber separat ubersetzt. Die Lage des Platzhalters in seinem Block wird mit einer Zeichenkette ahnlich der Folgenden markiert: Die Markierungen mussen in der Form vorliegen, Sie konnen aber einige verbinden (), falls eine Markierung nur berucksichtigt werden soll, wenn sie innerhalb einer anderen Markierung liegt (). break-pi Standardmassig werden Verarbeitungsanweisungen (d.h. " ?>"-Markierungen) als innenliegende Markierungen behandelt. Ubergeben Sie diese Option, wenn Sie mochten, dass die Verarbeitungshinweise als unterbrechende Markierungen behandelt werden sollen. Beachten Sie, dass unkomprimierte PHP-Markierungen durch das Auswertprogramm als Verarbeitungsanweisungen gehandhabt werden. nodefault leerzeichengetrennte Liste der Markierungen, die das Modul nicht standardmassig in jeder Kategorie zu setzen versuchen sollte. Falls Sie eine Markierung einsetzen, deren Vorgabeeinstellung in einer Unterklasse dieses Moduls ist, Sie aber eine alternative Einstellung wahlen mochten, mussen Sie diese Markierung als Teil der Einstellungszeichenkette nodefault auffuhren. cpp C-Praprozessordirektiven unterstutzen. Wenn diese Option gesetzt ist, wird Po4a Praprozessordirektiven als Absatztrenner betrachten. Dies ist wichtig, falls die XML-Datei vorher bearbeitet werden muss, weil die Direktiven andernfalls in die Mitte der Zeilen eingefugt werden konnten, falls Po4a sie zum aktuellen Absatz gehorig ansieht und sie nicht durch den Praprozessor erkannt wurden. Hinweis: Die Praprozessordirektiven durfen nur zwischen Markierungen erscheinen (sie durfen keine Markierung unterbrechen). translated leerzeichengetrennte Liste der Markierungen, die Sie ubersetzen mochten Die Markierungen mussen in der Form vorliegen, Sie konnen aber einige verbinden (), falls eine Markierung nur berucksichtigt werden soll, wenn sie innerhalb einer anderen Markierung liegt (). Sie konnen ausserdem einige Markierungsoptionen angeben, indem Sie ein paar Zeichen an den Anfang der Markierungshierarchie stellen. Dies setzt das durch die globalen Optionen wrap und defaulttranslateoption festgelegte Vorgabeverhalten ausser Kraft. w Markierungen sollten ubersetzt werden und Inhalt kann neu umgebrochen werden W Markierungen sollten ubersetzt werden und Inhalt sollte nicht neu umgebrochen werden i Markierungen sollten innenliegend ubersetzt werden p Markierungen sollten als Platzhalter ubersetzt werden Intern kummert sich der XML-Parser nur um diese vier Optionen: w W i p. * In break aufgefuhrte Markierungen werden abhangig von der Option wrap auf w oder W gesetzt. * In inline aufgefuhrte Markierungen werden auf i gesetzt. * In placeholder aufgefuhrte Markierungen werden auf p gesetzt. * In untranslated aufgefuhrte Markierungen sind ohne eine dieser gesetzten Optionen. Das tatsachliche interne Parameterverhalten konnen Sie durch Aufruf von po4a mit der Option --debug uberprufen. Beispiel: W Bitte beachten Sie, dass eine Markeirung entweder in der Einstellungszeichenkette translated oder untranslated aufgefuhrt sein sollte. untranslated leerzeichengetrennte Liste der Markierungen, die Sie nicht ubersetzen mochten Die Markierungen mussen in der Form vorliegen, Sie konnen aber einige verbinden (), falls eine Markierung nur berucksichtigt werden soll, wenn sie innerhalb einer anderen Markierung liegt (). Bitte beachten Sie, dass eine ubersetzbare innenliegende Markierung in einer unubersetzbaren Markierung als eine ubersetzbare unterbrechende Markierung behandelt wird, die Einstellung i entfallt und w oder W werden abhangig von der Option wrap gesetzt. defaulttranslateoption die Standardkategorie fur Markierungen, die sich nicht in >>translated<<, >>untranslated<<, >>break<<, >>inline<< oder >>placeholder<< befinden Dies ist eine Gruppe von in translated definierten Buchstaben und diese Einstellung ist nur fur ubersetzbare Markierungen gultig. SCHREIBEN ABGELEITETER MODULE DEFINIERT, WELCHE MARKIERUNGEN UND ATTRIBUTE ZU UBERSETZEN SIND Die einfachste Anpassung ist, zu definieren, welche Markierungen und Attribute der Parser ubersetzen soll. Dies sollte in der Funktion >>initialize<< erledigt werden. Zuerst sollten Sie die Haupt->>initialize<<-Funktion aufrufen, um die Befehlszeilenoptionen zu erhalten und dann Ihre angepassten Definitionen an den Options-Hash anhangen. Falls Sie einige neue Optionen von der Befehlszeile bearbeiten mochten, sollten Sie sie vor dem Aufruf der Haupt->>initialize<<-Funktion definieren: $self->{options}{'new_option'}=''; $self->SUPER::initialize(%options); $self->{options}{'_default_translated'}.='

'; $self->{options}{'attributes'}.=' <p>lang id'; $self->{options}{'_default_inline'}.=' <br>'; $self->treat_options; Sie sollten in abgeleiteten Modulen die Optionen _default_inline, _default_break, _default_placeholder, _default_translated, _default_untranslated und _default_attributes benutzen. Dies ermoglicht Anwendern, das in Ihrem Modul definierte Verhalten mit Befehlszeilenoptionen ausser Kraft zu setzen. AUSSERKRAFTSETZEN DES VORGABEVERHALTENS MIT BEFEHLSZEILENOPTIONEN Falls Sie das Vorgabeverhalten dieses XML-Moduls und seiner abgeleiteten Module nicht mogen, konnen Sie Befehlszeilenoptionen zur Anderung ihres Verhaltens bereitstellen. Siehe Locale::Po4a::Docbook(3pm), DIE FUNKTION found_string AUssER KRAFT SETZEN Ein weiterer einfacher Schritt ist es, die Funktion >>found_string<< ausser Kraft zu setzen, die die extrahierten Zeichenketten vom Parser erhalt, um sie zu ubersetzen. Dort konnen Sie steuern, welche Zeichenketten Sie ubersetzen mochten und Umwandlungen in diese vor oder nach der Ubersetzung selbst durchfuhren. Sie erhalt den extrahierten Text, die Referenz, von wo sie stammt und einen Hash, der zusatzliche Informationen enthalt, um zu steuern, welche Zeichenketten zu ubersetzen sind, wie sie zu ubersetzen sind und um den Kommentar zu erzeugen. Der Inhalt dieser Optionen hangt von der Art der Zeichenkette ab (angegeben in einem Eintrag dieses Hashs): type="Markierung" Die gefundene Zeichenkette ist der Inhalt einer ubersetzbaren Markierung. Der Eintrag >>tag_options<< enthalt die Optionszeichen am Anfang der Markierungshierarchie in der Moduloption >>tags<<. type="Attribut" bedeutet, dass die gefundene Zeichenkette der Wert eines ubersetzbaren Attributs ist. Der Eintrag >>Attribut<< erhalt den Namen des Attributs. Sie muss den Text zuruckgeben, der das Original im ubersetzten Dokument ersetzt. Hier ein grundlegendes Beispiel dieser Funktion: sub found_string { my ($self,$text,$ref,$options)=@_; $text = $self->translate($text,$ref,"type ".$options->{'type'}, 'wrap'=>$self->{options}{'wrap'}); return $text; } Im neuen Modul Dia ist ein weiteres einfaches Beispiel, das nur einige Zeichenketten filtert. ANDERN VON KENNZEICHENTYPEN (ZU ERLEDIGEN) Dies ist ein komplexeres Modul, das aber eine (fast) vollstandige Anpassung ermoglicht. Es basiert auf einer Liste von Hashes, von denen jeder das Verhalten eines Markierungstyps definiert. Die Liste sollte sortiert sein, so dass die allgemeinsten Markierungen hinter den konkretesten stehen (zuerst nach den beginnenden und dann nach den endenden Schlusseln sortiert). Um eine Markierung zu definieren, mussen Sie einen Hash mit den folgenden Schlusseln erstellen: beginning gibt den Anfang der Markierung an, nach dem >><<< end gibt das Ende der Markierung an, vor dem >>><< breaking teilt mit, ob dies eine unterbrechende Markierungsklasse ist. Eine nicht unterbrechende (innenliegende) Markierung ist eine, die nicht als Teil des Inhalts einer anderen Markierung genommen werden kann. Sie kann die Werte false (0), true (1) oder undefiniert annehmen. Falls Sie dies undefiniert lassen, mussen Sie die Funktion f_breaking definieren, die aussagt, ob eine bestimmte Markierung dieser Klasse eine unterbrechende Markierung ist oder nicht. f_breaking Es ist eine Funktion, die mitteilen wird, ob die nachste Markierung unterbrechend ist oder nicht. Sie sollte definiert sein, wenn die Option breaking nicht definiert ist. f_extract Falls Sie diesen Schlussel undefiniert lassen, muss die generische Extrahierfunktion die Markierung selbst extrahieren. Das ist nutzlich fur Markierungen, die andere Markierungen oder besondere Strukturen beinhalten konnen, so dass der Haupt-Parser nicht durchdreht. Diese Funktion bekommt einen logischen Wert, der aussagt, ob die Markierung aus dem Eingabedatenstrom entfernt werden soll oder nicht. f_translate Diese Funktion erhalt die Markierung (im Format get_string_until()) und gibt die ubersetzte Markierung (ubersetzte Attribute oder alle notigen Umbildungen) als eine einzelne Zeichenkette zuruck. INTERNE FUNKTIONEN, die zum Schreiben abgeleiteter Parser verwendet werden ARBEITEN MIT KENNZEICHEN get_path() Diese Funktion gibt den Pfad zur aktuellen Markierung von der Wurzel des Dokuments in der Form <html><body><p> zuruck. Ein zusatzliches Feld von Markierungen (ohne Klammern) kann als Argument ubergeben werden. Diese Pfadelemente werden am Ende des aktuellen Pfades hinzugefugt. tag_type() Diese Funktion gibt den Index der Liste tag_types zuruck, die zur nachsten Markierung des Eingabedatenstroms passt oder -1, falls es am Ende der Eingabedatei liegt. Hier hat die Markierung eine Struktur, die mit < beginnt und > endet und mehrere Zeilen enthalten kann. Dies funktioniert auf dem Feld "@{$self->{TT}{doc_in}}", das Eingabedokumentdaten und indirekt mittels "$self->shiftline()" und "$self->unshiftline($$)" Referenzen enthalt. extract_tag($$) Diese Funktion gibt die nachste Markierung des Eingabedatenstroms ohne Anfang und Ende in Form eines Feldes zuruck, um die Referenzen der Eingabedatei zu verwalten. Sie hat zwei Parameter: den Typ der Markierung (wie er von tag_type zuruckgegeben wird) und einen logischen Wert, der angibt, ob die Markierung aus dem Eingabedatenstrom entfernt werden soll. Dies funktioniert auf dem Feld "@{$self->{TT}{doc_in}}", das Eingabedokumentdaten und indirekt mittels "$self->shiftline()" und "$self->unshiftline($$)" Referenzen enthalt. get_tag_name(@) Diese Funktion gibt den Namen der als Argument ubergebenen Markierung in der Form eines durch extract_tag zuruckgegebenen Feldes zuruck. breaking_tag() Diese Funktion gibt einen logischen Wert zuruck, der angibt, ob die nachste Markierung im Eingabedatenstrom eine unterbrechende Markierung ist oder nicht (innenliegende Markierung). Sie lasst den Eingabedatenstrom intakt. treat_tag() Diese Funktion ubersetzt die nachste Markierung des Eingabedatenstroms. Dabei benutzt sie die angepassten Ubersetzungsfunktionen jedes Markierungstyps. Dies funktioniert auf dem Feld "@{$self->{TT}{doc_in}}", das Eingabedokumentdaten und indirekt mittels "$self->shiftline()" und "$self->unshiftline($$)" Referenzen enthalt. tag_in_list($@) Diese Funktion gibt eine Zeichenkette zuruck, die angibt, ob das erste Argument (eine Markierungshierarchie) zu einem der Markierungen des zweiten Arguments passt (eine Liste von Markierungen oder Markierungshierarchien). Falls es nicht passt, gibt sie 0 zuruck. Ansonsten gibt sie die Optionen der passenden Markierung zuruck (die Zeichen an Anfang der Markierung) oder 1 (falls die Markierung keine Optionen hat). MIT ATTRIBUTEN ARBEITEN treat_attributes(@) Diese Funktion handhabt die Ubersetzung der Attribute von Markierungen. Sie erhalt die Markierung ohne die Anfangs-/Endmarkierungen, sucht dann die Attribute und ubersetzt die, die ubersetzbar sind (angegeben durch die Moduloption attributes). Dies gibt eine einfache Zeichenkette mit der ubersetzten Markierung zuruck. ARBEITEN MIT MARKIERTEN INHALTEN treat_content() Diese Funktion erhalt Text aus dem Eingabedatenstrom bis zur nachsten unterbrechenden Markierung (nicht innenliegende). Ubersetzen Sie ihn mittels der angepassten Ubersetzungsfunktionen jedes Markierungstyps. Dies funktioniert auf dem Feld "@{$self->{TT}{doc_in}}", das Eingabedokumentdaten und indirekt mittels "$self->shiftline()" und "$self->unshiftline($$)" Referenzen enthalt. MIT DEN MODULOPTIONEN ARBEITEN treat_options() Diese Funktion fullt die internen Strukturen, die die Markierung, Attribute und innenliegenden Daten enthalten, mit den Optionen des Moduls (angegeben auf der Befehlszeile oder in der Initialisierungsfunktion). TEXT AUS DEM EINGABEDOKUMENT ERHALTEN get_string_until($%) Diese Funktion gibt ein Feld mit den Zeilen (und Referenzen) vom Eingabedokument zuruck, bis es das erste Argument findet. Das zweite Argument ist ein Options-Hash. Der Wert 0 bedeutet >>deaktiviert<< (die Vorgabe) und 1 >>aktiviert<<. Die gultigen Optionen sind: include Dies sorgt dafur, dass das zuruckgegebene Feld den gesuchten Text erhalt. remove Dies entfernt den zuruckgegebenen Datenstrom aus der Eingabe. unquoted Dies stellt sicher, dass der gesuchte Text ausserhalb irgendwelcher Anfuhrungszeichen steht. RegAus Dies zeigt an, dass das erste Argument ein regularer Ausdruck statt einer einfachen Zeichenkette ist. skip_spaces(\@) Diese Funktion erhalt als Argument die Referenz eines Absatzes (im Format, das von get_string_until zuruckgegeben wird), uberspringt dessen fuhrende Leerzeichen und gibt sie als einfache Zeichenkette zuruck. join_lines(@) Diese Funktion liefert eine einfache Zeichenkette mit dem Text aus dem Argument-Feld (die Referenzen werden weggelassen). STATUS DIESES MODULS Dieses Modul kann Markierungen und Attribute ubersetzen. TODO-LISTE DOKUMENTENART (ENTITATEN) Es gibt dort eine minimale Unterstutzung fur die Ubersetzung vom Instanzen. Sie werden als Ganzes ubersetzt und Markierungen werden nicht berucksichtigt. Mehrzeilige Entitaten werden nicht unterstutzt und Entitaten werden wahrend der Ubersetzung immer neu umgebrochen. KENNZEICHENTYPEN VON GEERBTEN MODULEN (die Struktur tag_types innerhalb des Hashs $self verschieben?) SIEHE AUCH Locale::Po4a::TransTractor(3pm), po4a(7) AUTOREN Jordi Vilalta <jvprat@gmail.com> Nicolas Francois <nicolas.francois@centraliens.net> URHEBERRECHT UND LIZENZ Copyright (C) 2004 Jordi Vilalta <jvprat@gmail.com> Copyright (C) 2008-2009 Nicolas Francois <nicolas.francois@centraliens.net> Dieses Programm ist freie Software; Sie konnen es unter den Bedingungen der GPL v2.0 oder neuer (siehe die Datei COPYING) vertreiben und/oder verandern. perl v5.38.2 2024-06-26 LOCALE::PO4A::XML.3PM(1)