Provided by: po4a_0.73-2ubuntu1_all bug

NAME

       Locale::Po4a::TransTractor - generischer Übersetzungs-Ausleser

BESCHREIBUNG

       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)

FUNCTIONEN, DIE IHR PARSER ÜBERSCHREIBEN SOLLTE

       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.

       docheader()
           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

   Konstruktor
       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 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; 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):

           verbose ($)
               setzt die Detailstufe

           debug ($)
               setzt die Debugging-Stufe

           wrapcol ($)
               die Spalte, an der der Text im Ausgabedokument umgebrochen werden soll (standardmäßig 76)

               Ein negativer Wert bedeutet, dass überhaupt kein Umbruch stattfindet.

           Es  akzeptiert  auch die nächsten Optionen für zugrundeliegende PO-Dateien: porefs, copyright-holder,
           msgid-bugs-address, package-name, package-version, wrap-po.

   Manipulieren von Dokumentdateien
       read($$$)
           Fügt 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 für den Bau von Referenzen in der PO-Datei verwandt werden soll;
            * Der Zeichensatz, der zum Lesen dieser Datei (standardmäßig UTF-8) verwendet werden soll

           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.

   PO-Dateien bearbeiten
       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";

   Addenda manipulieren
       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.

INTERNE FUNKTIONEN, die zum Schreiben abgeleiteter Parser verwendet werden

   Eingaben erhalten, Ausgaben bereitstellen
       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}}".

   Zeichenketten als übersetzbar markieren
       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 der Wert von wrapcol,  der  während  der
               Erstellung des TransTractor festgelegt wurde oder 76).

               Der negative Wert wird von der Vorgabe abgezogen.

           comment
               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

   Verschiedene Funktionen
       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

       get_in_charset()
           Diese Funktion liefert den Zeichensatz zurück, der als Hauptzeichensatz bereitgestellt wurde

       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.

ZUKÜNFTIGE ENTWICKLUNGEN

       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:

       - einen Hash in po_in_name nehmen (eine Liste pro Sprache)

       - ein zu übersetzendes Argument hinzufügen, um die Zielsprache anzugeben

       - ein Funktion pushline_all erstellen, die pushline ihres Inhalts für alle Sprachen unter Benutzung einer
         kartenähnlichen Syntax ausführen würde:

             $self->pushline_all({ "Description[".$langcode."]=".
                                   $self->translate($line,$ref,$langcode)
                                 });

       Es wird sich zeigen, ob das ausreicht. ;)

AUTOREN

        Denis Barbier <barbier@linuxfr.org>
        Martin Quinson (mquinson#debian.org)
        Jordi Vilalta <jvprat@gmail.com>

perl v5.38.2                                       2024-08-28                  LOCALE::PO4A::TRANSTRACTOR.3PM(1)