DOKK / manpages / debian 10 / po4a / po4a.7.de
PO4A(7) Po4a-Werkzeuge PO4A(7)

Po4a - Rahmenwerk zur Übersetzung von Dokumentation und anderen Materialien

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.

Das Dokument ist wie folgt organisiert:

1. Warum sollte ich Po4a verwenden? Wofür ist es gut?
Dieses einleitende Kapitel erklärt die Motivation des Projekts und seine Philosophie. Sie sollten es zuerst lesen, falls Sie gerade dabei sind, Po4a für Ihre eigene Übersetzungen zu untersuchen.
2. Wie wird Po4a verwandt?
Dieses Kapitel ist eine Art Referenzhandbuch. Es versucht, die Fragen der Benutzer zu beantworten und ihnen ein besseres Verständnis des gesamten Prozesses zu vermitteln. Hier wird eingeführt, wie Po4a mit den Dingen umgeht und es dient als Einleitung zur Dokumentation der speziellen Werkzeuge.
3. Wie funktioniert es?
Dieses Kapitel gibt Ihnen einen kurzen Überblick über die Interna von Po4a, so dass Sie sich sicherer fühlen, es zu warten und zu verbessern. Es könnte Ihnen auch dabei helfen, zu verstehen, warum es nicht das tut, was Sie erwarten, und wie Sie Ihre Probleme beheben können.
4. FAQ
Dieses Kapitel gruppiert die häufig gestellten Fragen (»Frequently Asked Questions«). In der Tat könnten derzeit die meisten dieser Fragen wie folgt formuliert werden: »Warum wurde es auf diese Weise entwickelt und nicht auf eine andere?«. Falls Sie glauben, Po4a ist nicht die richtige Lösung zur Übersetzung von Dokumentation, sollten Sie diesen Abschnitt lesen. Falls er Ihre Frage nicht beantwortet, nehmen Sie auf unserer Mailingliste <devel@lists.po4a.org> mit uns (auf Englisch) Kontakt auf. Wir freuen uns über Rückmeldungen.
5. Spezielle Hinweise zu Modulen
Dieses Kapitel stellt die Besonderheiten jedes Moduls vor, jeweils aus dem Blickwinkel des Übersetzers und ursprünglichen Autors. Lesen Sie diesen Abschnitt, um die Syntax kennenzulernen, die Ihnen beim Übersetzen in diesem Modul begegnen wird oder die Regeln, denen Sie in ihrem Originaldokument folgen sollten, um das Leben der Übersetzer zu erleichtern.

Tatsächlich ist dieser Abschnitt nicht wirklich Teil dieses Dokuments. Stattdessen befindet er sich in jeder Modul-Beschreibung. Dies stellt sicher, das die Information aktuell ist, indem die Dokumentation und der Code zusammengehalten werden.

Ich finde die Idee der Open-Source-Software gut, die jedem Zugriff auf die Software und ihre Quellen erlaubt. Als Franzose ist mir aber auch klar, dass die Lizenz nicht die einzige Beschränkung der Offenheit von Software ist: nicht übersetzte freie Software ist für Personen, die kein Englisch sprechen, nutzlos und wir haben noch einiges zu tun, um diese für jeden da draußen verfügbar zu machen.

Die Wahrnehmung dieser Situation hat sich bei den Akteuren im Bereich Open Source in den letzten Jahren dramatisch verbessert. Wir, die Übersetzer, haben den ersten Kampf gewonnen und jeden von der Bedeutung der Übersetzungen überzeugt. Unglücklicherweise war dies der leichte Teil. Jetzt haben wir was zu tun, und tatsächlich all dieses Zeug zu übersetzen.

Tatsächlich profitiert Open-Source-Software selbst von einem eher anständigen Übersetzungsniveau, Dank der wundervollen Gettext-Werkzeugsammlung. Diese ist in der Lage, zu übersetzende Zeichenketten aus dem Programm herauszulösen, sie in einem einheitlichen Format dem Übersetzer anzubieten und dann das Ergebnis dessen Arbeit zur Laufzeit zur Anzeige übersetzter Meldungen an den Benutzer zu verwenden.

Die Situation ist etwas ganz anderes, wenn es um Dokumentation geht. Viel zu oft ist die übersetzte Dokumentation nicht sichtbar genug (sie wird nicht als Teil des Programms vertrieben), nur teilweise oder nicht aktuell. Letzteres ist die schlimmst mögliche Situation. Eine veraltete Übersetzung kann sich als schlimmer erweisen als überhaupt keine Übersetzung, da sie den Benutzern altes Programmverhalten beschreibt, das nicht mehr in Benutzung ist.

Die Übersetzung von Dokumentation ist an sich nicht sehr schwierig. Texte sind deutlich länger als Programmmeldungen und die Übersetzung dauert daher länger, allerdings werden dazu keine besonderen Fähigkeiten benötigt. Die Schwierigkeit liegt im Warten der Übersetzungsarbeit. Es ist sehr schwierig, fehleranfällig und unangenehm, herauszufinden, welche Teile sich geändert haben und aktualisiert werden müssen. Ich denke, das erklärt, warum so viele übersetzte Dokumentationen da draußen veraltet sind.

Daher besteht der ganze Sinn von Po4a darin, die Dokumentationsübersetzungen wartbar zu halten. Die Idee ist, die Gettext-Methodologie für dieses neue Feld zu nutzen. Wie bei Gettext werden Texte aus ihren ursprünglichen Stellen herausgelöst, um in einem einheitlichen Format den Übersetzern präsentiert zu werden. Die klassischen Gettext-Werkzeuge helfen dann beim Aktualisieren ihrer Arbeiten, wenn eine neue Veröffentlichung des Originals herauskommt. Im Gegensatz zum klassichen Gettext-Modell werden die Übersetzungen dann wieder in die Struktur des ursprünglichen Dokuments eingefügt, so dass es wie die ursprüngliche (englische) Version verarbeitet und verteilt werden kann.

Daher wird die Ermittlung der geänderten (und daher zu aktualisierenden) Teile des Dokuments sehr leicht. Ein anderer Pluspunkt liegt darin, dass die Werkzeuge fast die gesamte Arbeit übernehmen, wenn die Struktur des Originals fundamental neu organisiert wird und wenn Kapitel herumgeschoben, zusammengefasst oder geteilt werden. Indem der zu übersetzende Text aus der Dokumentenstruktur herausgelöst wird, hält Sie dies auch von der Komplexität der Textformatierung fern und reduziert das Risiko, dass Sie ein defektes Dokument erhalten (selbst wenn das nicht vollständig verhindert wird).

Bitte lesen Sie auch die FAQ weiter unten in diesem Dokument für eine komplette Liste der Vor- und Nachteile dieser Vorgehensweise.

Derzeit wurde diese Vorgehensweise erfolgreich für mehrere Arten von Textformatierungsformaten umgesetzt:

man

Das gute alte Handbuchformat, verwandt von vielen Programmen da draußen. Die Unterstützung durch Po4a wird hier sehr begrüßt, da dieses Format etwas schwierig zu benutzen und für Neulinge nicht wirklich einladend ist. Das Modul Locale::Po4a::Man(3pm) unterstütz das Format »mdoc«, das von den BSD-Handbuchseiten verwandt wird (diese sind auch unter Linux recht häufig anzutreffen).

pod

Das ist das »Perl Online Documentation«-Format. Die Sprache und Erweiterungen selbiger sind auf diese Art dokumentiert sowie die meisten existierenden Perl-Skripte. Sie erleichtert es, die Dokumentation nahe beim eigentlichen Code zu halten, indem beide in die gleiche Datei eingebettet werden. Es erleichtert Programmierern die Arbeit, aber unglücklicherweise nicht den Übersetzern.

sgml

Obwohl dieses Format heutzutage etwas von XML verdrängt wurde, wird es noch recht oft für Dokumente verwandt, die mehr als ein paar Bildschirmseiten lang sind. Es ermöglicht es Ihnen, komplette Bücher zu erstellen. Die Übersetzung so langer Dokumente zu aktualisieren kann zu einem echten Alptraum werden. diff stellt sich oft als nutzlos raus, wenn der ursprüngliche Text nach der Aktualisierung neu eingerückt wurde. Glücklicherweise kann Ihnen Po4a bei diesem Prozess helfen.

Derzeit werden nur die DebianDoc- und DocBook-DTD unterstützt, aber das Hinzufügen einer Unterstützung für eine neue DTD ist wirklich leicht. Es ist sogar möglich, Po4a für eine unbekannte SGML-DTD zu verwenden, ohne den Code zu verändern, indem die benötigten Informationen auf der Befehlszeile übergeben werden. Lesen Sie Locale::Po4a::Sgml(3pm) für weitere Details.

TeX / LaTeX

Das LaTeX-Format ist ein wichtiges Dokumentationsformat, das in der Welt der Freien Software und für Veröffentlichungen genutzt wird. Das Modul Locale::Po4a::LaTeX(3pm) wurde mit der Python-Dokumentation, einem Buch und ein paar Präsentationen ausprobiert.

Texinfo

Die gesamte GNU-Dokumentation ist in diesem Format geschrieben (das ist sogar eine der Voraussetzungen, um ein offizielles GNU-Projekt zu werden). Die Unterstützung für Locale::Po4a::Texinfo(3pm) in Po4a ist noch ganz am Anfang. Bitte berichten Sie Fehler und Funktionalitätswünsche.

xml

Das XML-Format liegt vielen Dokumentationsformaten zu Grunde.

Derzeit wird die DocBook-DTD von Po4a unterstützt. Lesen Sie Locale::Po4a::Docbook(3pm) für weitere Details.

andere

Po4a kann auch mit einigen selteneren oder spezialisierten Formaten umgehen, wie dem Dokumentationsformat der Kompilierungsoptionen des 2.4+-Linux-Kernels oder der vom Dia-Werkzeug erstellten Diagramme. Das Hinzufügen eines neuen Formats ist oft sehr leicht und die Hauptaufgabe besteht darin, einen Parser für Ihr Zielformat zu entwickeln. Lesen Sie Locale::Po4a::TransTractor(3pm) für mehr Informationen dazu.

Unglücklicherweise fehlt Po4a noch Unterstützung für einige Dokumentationsformate.

Es gibt einen ganzen Satz an weiteren Formaten, die wir gerne mit Po4a unterstützen würden, nicht nur Dokumentationsformate. Tatsächlich würden wir gerne alle Marktnischen besetzen, die von den klassichen Gettext-Werkzeugen freigelassen werden. Darunter fallen Paketbeschreibungen (Deb und RPM), Paketinstallationsskriptfragen, Paket-Änderungsprotokolle (»Changelogs«) und alle spezialisierten Dateiformate, die von Programmen verwandt werden, wie Spieleszenarien oder WINE-Ressource-Dateien.

Dieses Kapitel ist eine Art Referenzhandbuch. Es versucht, die Fragen der Benutzer zu beantworten und ihnen ein besseres Verständnis des gesamten Prozesses zu vermitteln. Hier wird eingeführt, wie Po4a mit den Dingen umgeht und es dient als Einleitung zur Dokumentation der speziellen Werkzeuge.

Das folgende Schema gibt einen Überblick über den Prozess der Dokumentationsübersetzung mittels Po4a. Haben Sie keine Angst vor der scheinbaren Komplexität, dies kommt daher, das hier der gesamte Prozess dargestellt ist. Sobald Sie Ihr Projekt auf Po4a umgestellt haben, ist nur der rechte Teil der Graphik relevant.

Beachten Sie, dass Master.dok als Beispiel der zu übersetzenden Dokumentation dient und Übersetzung.dok der entsprechende übersetzte Text ist. Die Endung könnte .pod, .xml oder .sgml lauten, abhängig vom Format. Jeder Teil der Abbildung wird in den folgenden Abschnitten noch im Detail dargestellt.

                                   Master.dok
                                       |
                                       V
     +<-----<----+<-----<-----<--------+------->-------->-------+
     :           |                     |                        :
{Übersetzung}    |     { Aktualisierung von Master.dok }        :
     :           |                     |                        :
   XX.dok        |                     V                        V
(optional)       |                 Master.dok ->-------->------>+
     :           |                   (neu)                      |
     V           V                     |                        |
  [po4a-gettextize]   dok.XX.po--->+   |                        |
          |            (alt)       |   |                        |
          |              ^         V   V                        |
          |              |     [po4a-updatepo]                  |
          V              |           |                          V
   Übersetzung.pot       ^           V                          |
          |              |         dok.XX.po                    |
          |              |        (unscharf)                    |
   { Übersetzung }       |           |                          |
          |              ^           V                          V
          |              |  {manuelle Bearbeitung}              |
          |              |           |                          |
          V              |           V                          V
      dok.XX.po --->---->+<---<---- doc.XX.po   Addendum     Master.dok
    (anfänglich)                    (aktuell)  (optional)     (aktuell) 
          :                          |            |             |
          :                          V            |             |
          +----->----->----->------> +            |             |
                                     |            |             |
                                     V            V             V
                                     +------>-----+------<------+
                                                  |
                                                  V
                                           [po4a-translate]
                                                  |
                                                  V
                                                XX.dok
                                               (aktuell)

Auf der linken Seite wird gezeigt, wie eine Umstellung von einer Übersetzung, die Po4a nicht verwendet, in dieses System erfolgt. Oben im rechten Teil werden die Tätigkeiten des ursprünglichen Autors dargestellt (Aktualisierung der Dokumentation). In der Mitte vom rechten Teil sind die automatischen Tätigkeiten von Po4a dargestellt. Das neue Material wird herausgelöst und mit der existierenden Übersetzung verglichen. Unveränderte Teile werden gefunden und vorherige Übersetzungen verwandt. Teile, die teilweise geändert wurden, werden auch mit der vorherigen Übersetzung verbunden, allerdings mit einer speziellen Markierung, die angibt, dass die Übersetzung aktualisiert werden muss. Der untere Teil der Abbildung zeigt, wie formatierte Dokumente gebaut werden.

Tatsächlich ist der einzige manuelle Arbeitsschritt, den Sie als Übersetzer durchführen müssen, die Bearbeitung des mit »{manuelle Bearbeitung}« markierten Bereiches. Jaja, es tut mir leid, Po4a hilft beim Übersetzen. Es übersetzt nichts für Sie …

HOWTO: Wie wird eine neue Übersetzung begonnen?

Dieser Abschnitt stellt die benötigten Schritte dar, um eine neue Übersetzung mit Po4a zu beginnen. Die Verfeinerungen, um ein existierendes Projekt in dieses System zu überführen, werden in den relevanten Abschnitten dargestellt.

Um eine neue Übersetzung mit Po4a anzufangen, müssen Sie die folgenden Schritte ausführen:

  • Herauslösen des zu übersetzenden Texts aus dem ursprünglichen Dokument <Master.dok> in eine neue Übersetzungsvorlagendatei <Übersetzung.pot> (dem Gettext-Format). Verwenden Sie dafür das Programm po4a-gettextize auf folgende Art und Weise:

      $ po4a-gettextize -f <Format> -m <Master.dok> -p <Übersetzung.pot>
        

    <Format> ist natürlich das im Dokument Master.dok verwandte Format. Wie erwartet, geht die Ausgabe in translation.pot. Bitte lesen Sie po4a-gettextize(1) für weitere Details über die existierenden Optionen.

  • Übersetzen Sie tatsächlich, was übersetzt werden soll. Dafür müssen Sie die POT-Datei in z.B. dok.XX.po umbenennen (wobei XX der ISO 639-1-Code für die Sprache ist, in die Sie übersetzen, z.B. fr) und bearbeiten Sie die entstandene Datei. Oft ist es eine gute Idee, die Datei nicht XX.po zu nennen, um Verwirrung mit der Übersetzung der Programmmeldungen zu vermeiden, allerdings ist das Ihre Entscheidung. Vergessen Sie nicht, die Kopfzeilen der PO-Datei zu aktualisieren, sie sind wichtig.

    Die eigentliche Übersetzung kann mit dem PO-Modus von Emacs oder Vi, Lokalize (KDE-basiert), Gtranslator (GNOME-basiert) oder mit welchem Programm Sie am liebsten arbeiten (z.B. Virtaal), erfolgen.

    Wenn Sie mehr darüber wissen wollen, müssen Sie auf jeden Fall die Gettext-Dokumentation konsultieren. Sie ist im Paket gettext-doc verfügbar.

HOWTO: Wie wird die Übersetzung zurück in eine Dokumentationsdatei zurücküberführt?

Sobald Sie mit der Übersetzung fertig sind, möchten Sie die übersetzte Dokumentation erhalten und diese dann zusammen mit der ursprünglichen an die Benutzer verteilen. Verwenden Sie hierfür das Programm po4a-translate(1) wie folgt (wobei XX für den Sprachcode steht):

  $ po4a-translate -f <Format> -m <Master.dok> -p <dok.XX.po> -l <XX.dok>

Wie vorher ist <format> das im Dokument Master.dok verwandte Format. Diesmal ist aber die mit dem Schalter -p übergebene PO-Datei Teil der Eingabe. Dies ist Ihre Übersetzung. Die Ausgabe landet in XX.dok.

Bitte lesen Sie po4a-translate(1) für weitere Details.

HOWTO: Wie wird eine Po4a-Übersetzung aktualisiert?

Um Ihre Übersetzung zu aktualisieren, wenn sich die ursprüngliche Datei Master.dok geändert hat, verwenden Sie das Programm po4a-updatepo(1) wie folgt:

  $ po4a-updatepo -f <Format> -m <neue_Master.dok> -p <alte_dok.XX.po>

(Bitte lesen Sie po4a-updatepo(1) für weitere Details.)

Natürlich wird der neue Absatz in dem Dokument nicht magisch in der PO-Datei durch diesen Befehl übersetzt werden und Sie müssen die PO-Datei manuell aktualisieren. Entsprechend müssen Sie die Übersetzung für Absätze, die geändert wurden, anpassen. Um sicherzustellen, dass Sie keine verpassen werden diese beim Erstellen mit »fuzzy« markiert und Sie müssen diese Markierung entfernen, bevor die Übersetzung von po4a-translate verwandt werden kann. Wie bei der ursprünglichen Übersetzung verwenden Sie am besten Ihren Lieblings-PO-Editor hierfür.

Sobald Ihre PO-Datei wieder aktuell ist, ohne verbliebene unübersetzte oder unscharfe Zeichenketten, können Sie ein übersetztes Dokument erstellen, wie dies im vorherigen Abschnitt beschrieben wurde.

HOWTO: Wie wird eine existierende Übersetzung nach Po4a konvertiert?

Oft haben Sie ein Dokument manuell übersetzt, bis eine größere Reorganisation des ursprünglichen Dokuments Master.dok stattfand. Nach ein paar unschönen Versuchen mit diff und ähnlichen Werkzeugen möchten Sie auf Po4a umstellen. Allerdings möchten Sie natürlich nicht ihre bestehenden Übersetzungen dabei verlieren. Keine Angst, dieser Fall wird auch von den Po4a-Werkzeugen abgedeckt und wird »Gettextisierung« genannt.

Der Schlüssel ist dabei, dass die gleiche Struktur im übersetzten Dokument und in dem ursprünglichen vorliegt, so dass die Werkzeuge die zugehörigen Inhalte entsprechend ermitteln können.

Falls Sie Glück haben (d.h. falls die Struktur beider Dokumente perfekt passt) wird dies reibungsfrei verlaufen und Sie sind in wenigen Sekunden eingerichtet. Andernfalls werden Sie herausfinden, warum dieser Prozess so einen scheußlichen Namen hat und Sie bereiten sich auf Routinearbeit vor. Denken Sie in jedem Fall daran, dass dies der Preis ist, den Sie zahlen müssen, um den Komfort von Po4a danach zu genießen. Das gute daran ist, dass Sie diesen Prozess nur einmal durchführen müssen.

Ich kann das nicht oft genug wiederholen. Um den Prozess zu erleichtern, ist es daher wichtig, dass Sie die genau identische Version finden, die zur Übersetzung verwandt wurde. Am besten ist es, wenn Sie sich die VCS-Revision, die für die Übersetzung verwandt wurde, notiert hatten und Sie sie nicht im Übersetzungsprozess geändert haben, und Sie diese daher verwenden können.

Es wird nicht gut funktionieren, wenn Sie einen aktualisierten Originaltext mit der alten Übersetzung verwenden. Es bleibt möglich, aber es ist schwieriger und sollte wirklich vermieden werden, wenn möglich. Tatsächlich schlage ich vor, dass die beste Lösung, wenn Sie den ursprünglichen Text nicht wiederfinden können, ist, jemanden zu finden, der die Gettextisierung für Sie vornimmt (aber nicht mich ;).

Vielleicht bin ich hier zu dramatisch. Selbst wenn Dinge schiefgehen, bleibt dies deutlich schneller als eine komplette Neuübersetzung. Ich konnte die existierende französische Übersetzung der Perl-Dokumentation an einem Tag gettextisieren, selbst obwohl Dinge schief gegangen sind. Das waren mehr als zwei Megabyte an Text und eine neue Übersetzung hätte Monate oder mehr gedauert.

Lassen Sie mich zuerst die Grundlagen der Prozedur erläutern. Später werde ich dann Tipps für die Fälle geben, bei denen was schief läuft. Um das Verständnis zu erleichtern, verwende ich das obige Beispiel noch mal.

Sobald Sie Sie die alte Master.dok, auf welche die Übersetzung XX.dok passt, haben, kann die Gettextisierung direkt mit der PO-Datei dok.XX.po erfolgen, ohne die manuelle Übersetzung der Datei Übersetzung.pot:

 $ po4a-gettextize -f <Format> -m <alte_Master.dok> -l <XX.dok> -p <dok.XX.po>

Wenn Sie Glück haben, war's das. Sie haben Ihre alte Übersetzung nach Po4a konvertiert und können mit der Aktualisierung sofort beginnen. Folgen Sie einfach den Anweisungen, wie sie einige Abschnitte weiter oben beschrieben wurden, um Ihre PO-Datei mit dem neusten Originaldokument zu synchronisieren, und aktualisieren Sie die Übersetzung entsprechend.

Beachten Sie, dass selbst wenn alles korrekt abgelaufen zu sein scheint, es immer noch Fehlermöglichkeiten gibt. Das liegt daran, dass Po4a nicht in der Lage ist, den Text zu verstehen, um sicherzustellen, dass die Übersetzung auf das Original passt. Daher werden alle Zeichenketten bei diesem Vorgang mit »fuzzy« (d.h. als unscharf) markiert. Sie sollten daher alle sorgfältig prüfen, bevor Sie diese Markierung entfernen.

Oft passen die Dokumentstrukturen nicht genau, wodurch po4a-gettextize daran gehindert wird, seine Aufgabe korrekt wahrzunehmen. Zu diesem Zeitpunkt besteht das Spiel darin, die Dateien zu bearbeiten, um ihre verdammte Struktur passend zu bekommen.

Es kann helfen, den Abschnitt Gettextization: Wie funktioniert es? unten zu lesen. Ein Verständnis des internen Vorgangs wird Ihnen bei der Durchführung helfen. Gut daran ist, dass po4a-gettextize recht ausführlich berichtet, was schief gelaufen ist, wenn das passiert. Zuerst nagelt es den Punkt fest, bei dem in den Dokumenten die Strukturdiskrepanzen vorliegen. Sie werden die Zeichenketten kennenlernen, die nicht zueinander passen, ihre Position im Text und ihren Typ. Desweiteren wird die soweit generierte PO-Datei in gettextization.failed.po ausgegeben.

  • Entfernen Sie alle zusätzlichen Teile in der Übersetzung, wie den Abschnitt, in dem Sie den Namen des Übersetzers angeben und allen danken, die zu der Übersetzung beigetragen haben. Addenda, die im nächsten Abschnitt beschrieben werden, erlauben es Ihnen, diese Informationen wieder hinzuzufügen.
  • Haben Sie keine Scheu, sowohl das Original als auch die Übersetzung zu bearbeiten. Das wichtigste ist, die PO-Datei zu erhalten. Sie können diese dann im Anschluss aktualisieren. Andererseits sollte die Bearbeitung der Übersetzung vorgezogen werden, wenn beide möglich wären, da dies die Dinge erleichtert, wenn die Gettextisierung abgeschlossen ist.
  • Falls notwendig, löschen Sie Teile des Originals, falls diese nicht übersetzt wurden. Beim anschließenden Synchronisieren der PO-Datei mit dem Dokument kommen diese von alleine zurück.
  • Falls Sie die Struktur etwas geändert haben (um zwei Absätze zusammenzufassen oder einen anderen aufzuteilen) nehmen Sie diese Änderungen zurück. Falls es Probleme im Original gibt, sollten Sie den Originalautor informieren. Wenn Sie diese nur in Ihrer Übersetzung korrigieren, werden diese nur für einen Teil der Gemeinschaft korrigiert. Und desweiteren ist das unmöglich, wenn Sie Po4a verwenden ;)
  • Manchmal passen die Inhalte des Absatzes, aber ihr Typ nicht. Dies zu korrigieren hängt stark vom Format ab. In POD und Man kommt dies oft daher, dass bei einem der beiden eine Zeile enthalten ist, die mit einem Leerzeichen beginnt. In diesen Formaten kann so ein Absatz nicht umgebrochen werden und erhält daher einen anderen Typ. Entfernen Sie einfach das Leerzeichen und es klappt wieder. Es kann sich auch um einen Tippfehler im Namen der Markierung (Tags) handeln.

    Entsprechend könnten zwei Absätze in POD zusammengefasst worden sein, wenn die trennende Zeile Leerzeichen enthält oder wenn es keine Leerzeile zwischen der =item-Zeile und dem Inhalt des »item«s gibt.

  • Manchmal sind die Dateien nicht mehr synchron und die Übersetzuzng hängt am falschen Absatz. Dies zeigt an, dass das echte Problem schon früher in den Dateien vorlag. Überprüfen Sie gettextization.failed.po, um herauszufinden, wo die Desynchronisation beginnt und korrigieren Sie dies dort.
  • Manchmal erhalten Sie das starke Gefühl, dass Po4a Teile des Texts aufgefuttert hat, entweder vom Original oder von der Übersetzung. gettextization.failed.po können Sie entnehmen, dass beide gut aufeinander gepasst haben und dann schlug die Gettextisierung fehl, da versucht wurde, einen Absatz mit einem Absatz vor (oder hinter) dem Richtigen zu paaren, als ob der richtige Absatz verschwunden wäre. Verfluchen Sie Po4a wie ich es getan habe, als es mir das erste Mal passierte. Gründlich.

    Diese unglückliche Situation entsteht, wenn ein Absatz mehrfach im Dokument vorkommt. In diesem Fall wird kein neuer Eintrag in der PO-Datei erstellt, sondern es wird stattdessen eine neue Referenz zu dem bestehenden hinzugefügt.

    Wenn daher der gleiche Absatz zwei Mal im Original auftaucht, aber nicht jedes Mal exakt identisch übersetzt wurde, bekommen Sie den Eindruck, dass ein Absatz des Originals verschwunden ist. Entfernen Sie einfach die neue Übersetzung. Falls Sie bevorzugen, stattdessen die erste Übersetzung zu entfernen, da die zweite einfach besser war, ersetzen Sie die erste durch die zweite.

    Wurden im Gegensatz dazu zwei ähnliche, aber verschiedene Absätze exakt identisch übersetzt, bekommen Sie den Eindruck, dass ein Absatz der Übersetzung verschwunden ist. Eine Lösung ist, eine dumme Zeichenkette zum ursprünglichen Absatz hinzuzufügen (wie »Ich bin anders«). Haben Sie keine Angst, diese Dinge verschwinden während der Synchronisation, und wenn der hinzugefügte Text kurz genug ist, wird Gettext ihre Übersetzung zum existierenden Text hinzufügen (und sie dabei als unscharf (»fuzzy«) markieren, was hier allerdings irrelevant ist, da alle Zeichenketten nach der Gettextisierung unscharf sind).

Hoffentlich werden diese Tipps Ihnen bei der Gettextisierungsarbeit und der Erlangung der wertvollen PO-Datei helfen. Sie können jetzt Ihre Datei synchronisieren und mit der Übersetzung beginnen. Bitte beachten Sie, dass bei langen Texten die erste Synchronisierung sehr lange dauert.

Beispielsweise dauerte der erste Lauf von po4a-updatepo der französischen Übersetzung der Perl-Dokumentation (eine 5.5 MB PO-Datei) rund zwei Tage auf einem 1 GHz G5-Computer. Ja, 48 Stunden. Die folgenden dauern aber nur ein paar Dutzend Sekunden auf meinem alten Laptop. Dies kommt daher, dass beim ersten Lauf die meisten Msgids der PO-Datei auf keine der POT-Datei passen. Dies zwingt Gettext, die ähnlichsten mit einem sehr aufwändigen Zeichenketten-Approximier-Algorithmus zu suchen.

HOWTO: Wie wird zusätzlicher Text zu Übersetzungen (wie der Name des Übersetzers) hinzugefügt?

Aufgrund der Gettext-Methode ist dies schwieriger mit Po4a als das vorherige reine Bearbeiten einer neuen Datei neben der ursprünglichen. Allerdings bleibt es dank sogenannter addenda möglich.

Es mag beim Verständnis helfen, Addenda als eine Art von Patches, die auf das übersetzte Dokument nach der Verarbeitung angewandt werden, zu betrachten. Sie unterscheiden sich recht stark von gewöhnlichen Patches (es gibt nur eine Zeile Kontext, der reguläre Ausdrücke von Perl einbetten kann, uns sie können nur neuen Text hinzufügen ohne alten zu löschen), aber die Funktionalität ist die gleiche.

Ihr Ziel ist es, dem Übersetzer zu erlauben, zusätzliche Inhalte zum Dokument hinzuzufügen, der keine Übersetzung aus dem ursprünglichen Dokument ist. Am häufigsten wird dies dazu verwandt, einen Abschnitt über die Übersetzung selbst hinzuzufügen, in der Beitragende aufgeführt sind und dargestellt wird, wie ein Fehler in der Übersetzung gemeldet werden soll.

Ein Addendum muss als separate Datei bereitgestellt werden. Die erste Zeile stellt eine Kopfzeile dar, die anzeigt, wo in dem erstellten Dokument das Addendum eingefügt werden soll. Der Rest der Addendumdatei wird dann unverändert an der angegebenen Position des erstellten Dokuments hinzugefügt.

Die Kopfzeile. die den Kontext festlegt, hat eine recht starre Syntax: Sie muss mit der Zeichenkette PO4A-HEADER: beginnen, gefolgt von einer durch Semikola (;) getrennten Liste von Schlüssel=Wert-Feldern. Leerzeichen SIND wichtig. Beachten Sie, dass Sie das Semikolon-Zeichen (;) nicht im Wert benutzen können (hierbei hilft auch nicht, das Zeichen zu schützen). Optional können zur Lesbarkeit Leeraumzeichen ( ) vor dem Schlüssel eingefügt werden.

Obwohl diese Kontextsuche so betrachtet werden könnte, als ob sie ungefähr auf jeder Zeile des übersetzten Dokuments arbeiten würde, arbeitet sie tatsächlich auf der internen Datenzeichenkette des übersetzten Dokuments. Diese interne Datenzeichenkette kann ein Text sein, der mehrere Absätze mit mehreren Zeilen umfasst oder kann eine einzelne XML-Markierung selbst sein. Der genaue Einfügepunkt des Addendums muss vor oder nach der internen Datenzeichenkette und kann nicht innerhalb der internen Datenzeichenkette liegen.

Die tatsächliche interne Datenzeichenkette des übersetzten Dokuments kann durch Ausführung von Po4a im Fehlersuchmodus visualisiert werden.

Das klingt wieder beängstigend, aber das Beispiel unten sollte Ihnen dabei helfen, herauszufinden, wie die von Ihnen benötigte Kopfzeile geschrieben wird. Um die Diskussion zu beleuchten, nehmen wir an, dass Sie einen Abschnitt »Über diese Übersetzung« nach dem Abschnitt »Über dieses Dokument« hinzufügen möchten.

Dies sind die möglichen Schlüssel in der Kopfzeile:

Er kann entweder die Zeichenkette before oder after sein.

Falls mode=before ist, wird der Einfügepunkt durch eine einstufige reguläre Übereinstimmung ermittelt, die durch das reguläre Ausdrucksargument Position festgelegt wird. Der Einfügepunkt ist direkt vor der eindeutig übereinstimmenden internen Datenzeichenkette des übersetzten Dokuments.

Falls mode=after ist, wird der Einfügepunkt durch eine zweistufige reguläre Übereinstimmung ermittelt, die durch das reguläre Ausdrucksargument Position und durch das reguläre Ausdrucksargument beginboundary oder endboundary festgelegt werden.

Da es mehrere Abschnitte für den angenommenen Fall geben kann, wird der Zweistufenansatz verwandt.

     mode=after
    
Ein regulärer Perlausdruck zur Angabe des Kontextes.

Falls mehr als eine interne Datenzeichenkette (oder keine) auf diesen regulären Ausdruck passt, wird diese Suche nach dem Einfügepunkt und das Hinzufügen fehlschlagen. Es ist in der Tat besser, einen Fehler zu melden, als das Addendum an der falschen Stelle hinzuzufügen.

Falls mode=before ist, wird der Einfügepunkt vor die interne Datenzeichenkette, die eindeutig auf das reguläre Argument Position passt, festgelegt.

Falls mode=after ist, wird die Suche nach dem Einfügepunkt auf die Daten nach der internen Datenzeichenkette, die eindeutig auf das reguläre Argument Position passt, eingegrenzt. Der genaue Einfügepunkt wird weiter durch beginboundary oder endboundary festgelegt.

In diesem Fall müssen mehrere vorhergehende Abschnitte übersprungen werden, um die Suche mittels der Abschnittstitelzeichenkette einzugrenzen.

     position=Über dieses Dokument
    

(In der Realität müssen Sie hier stattdessen die übersetzte Titelzeichenkette verwenden.)

Eine zweiter regulärer Perlausdruck, der nur bei mode=after benötigt wird. Das Addendum wird direkt vor oder nach der ersten internen Datenzeichenkette, die auf den regulären Argumentenausdruck beginboundary bzw. endboundary passt, gelegt.

In diesem Fall kann ausgewählt werden, das Ende des Abschnitts anzugeben, das beim Hinzufügen von Folgendem passt:

   endboundary=</Abschnitt>
    

oder den Anfang des nächsten Abschnitts anzugeben, indem Folgendes angegeben wird:

   beginboundary=<Abschnitt>
    

In beiden Fällen wird das Addendum nach dem </Abschnitt> und vor dem <Abschnitt> platziert. Die erste Variante ist besser, da sie auch funktioniert, wenn das Dokument neu organisiert wird.

Es gibt beide Formen, da sich die Formate der Dokumentationen unterscheiden. In einigen davon gibt es eine Möglichkeit, das Ende eines Abschnitts zu markieren (genauso wie im gerade benutzten </Abschnitt>), während einige andere das Ende des Abschnitts nicht explizit markieren (wie in Handbuchseiten). Im erstgenannten Fall möchten Sie keine Abschnittsgrenzen, die ans Ende eines Abschnitts passen, so dass der Einfügepunkt danach kommt. Im letztgenannten Fall möchten Sie erreichen, dass Abschnittsgrenzen an den Anfang des nächsten Abschnitts passen, so dass der Einfügepunkt direkt davor kommt.

Dies kann undurchsichtig erscheinen, aber die nächsten Beispiele werden Sie hoffentlich erleuchten.

 PO4A-HEADER: mode=after; position=Über dieses Dokument; endboundary=</section>
 PO4A-HEADER: mode=after; position=Über dieses Dokument; beginboundary=<section>
    
  .SH "AUTOREN"
    

Sie sollten den zweischrittigen Zugang durch Setzen von mode=after wählen. Dann sollten Sie mit dem regulären Argumentenausdruck Position die Suche auf die Zeile nach AUTOREN eingrenzen. Dann sollten Sie eine Übereinstimmung mit dem Anfang des nächsten Abschnittes (d.h. ^\.SH) mit dem regulären Argumentenausdruck beginboundary erzielen. Mit anderen Worten:

 PO4A-HEADER:mode=after;position=AUTOREN;beginboundary=\.SH
    
 PO4A-HEADER:mode=after;position=Copyright Großer Kerl, 2004;beginboundary=^
    
 PO4A-HEADER:mode=after;position=Über dieses Dokument;beginboundary=FakePo4aBoundary
    

Denken Sie auf alle Fälle daran, dass dies reguläre Ausdrücke sind. Falls der Ausdruck zum Beispiel auf das Ende eines Nroff-Abschnitts passen soll, der mit der Zeile

  .fi

endet, benutzen Sie .fi nicht als endboundary, weil es auf »e[rfi]nden« passt, was vermutlich nicht das ist, was sie erwarten. Das korrekte endboundary ist in diesem Fall: ^\.fi$.

Falls das Addendum nicht dort landet, wo Sie es erwartet haben, versuchen Sie das Argument -vv an die Werkzeuge zu übergeben, so dass sie erklären, was sie beim Platzieren des Addendums tun.

Ein ausführlicheres Beispiel

Originaldokument (POD-formatiert):

 |=head1 BESCHREIBUNG
 |
 |dummy - Ein Platzhalterprogramm
 |
 |=head1 AUTOR
 |
 |ich

Dann wird das folgende Addendum sicherstellen, dass ein Abschnitt (auf Französisch) über den Übersetzer an das Ende der Datei hinzugefügt wird (auf Französisch heißt »ÜBERSETZER« »TRADUCTEUR« und »moi« heißt »ich«).

 |PO4A-HEADER:mode=after;position=AUTEUR;beginboundary=^=head
 |
 |=head1 TRADUCTEUR
 |
 |moi
 |

Um Ihr Addendum vor dem AUTOR einzufügen, verwenden Sie die folgende Kopfzeile:

 PO4A-HEADER:mode=after;position=NOM;beginboundary=^=head1

Dies funktioniert, da die nächste auf das beginboundary /^=head1/ passende Zeile nach dem Abschnitt »BESCHREIBUNG« (übersetzt zu »NOM« auf Französisch) diejenige ist, die die Autoren deklariert. Daher wird das Addendum zwischen beide Abschnitte gelegt. Beachten Sie: Falls später ein anderer Abschnitt zwischen den Abschnitten NAME und AUTHOR hinzugefügt wird, wird Po4a das Addendum fehlerhafterweise vor den neuen Abschnitt legen.

Um dies zu vermeiden, können Sie das gleiche mittels mode=before erreichen:

 PO4A-HEADER:mode=before;position=^=head1 AUTEUR

HWOTO: Wie erfolgt alles dies in einem Programmaufruf?

Die Benutzung von Po4a erweist sich für Benutzer als ein wenig fehleranfällig, da Sie zwei unterschiedliche Programme in der richtigen Reihenfolge aufrufen müssen (po4a-updatepo und dann po4a-translate), von denen jedes mehr als drei Argumente benötigt. Zudem war es schwer, mit diesem System nur eine PO-Datei für all Ihre Dokumente zu benutzen, wenn mehr als ein Format benutzt wurde.

Das Programm po4a(1) wurde entworfen, um diese Schwierigkeiten zu lösen. Sobald Ihr Projekt auf dieses System umgestellt wurde, schreiben Sie eine einfache Konfigurationdatei, die erklärt, wo Ihre Übersetzungsdateien (PO und POT) liegen, wo Ihre Originaldokumente liegen, deren Formate und wohin ihre Übersetzungen platziert werden sollen.

Wird po4a(1) für diese Datei aufgerufen, wird sichergestellt, dass die PO-Dateien mit dem Original synchronisiert werden und dass das übersetzte Dokument ordentlich erzeugt wird. Gewiss möchten Sie dieses Programm zwei Mal aufrufen: Einmal vor der Bearbeitung der PO-Dateien, um sie zu aktualisieren, und einmal danach, um ein vollständig aktualisiertes übersetztes Dokument zu erhalten. Sie müssen sich aber nur eine Befehlszeile merken.

HOWTO: Wie wird Po4a angepasst?

Po4a-Module haben Optionen (mit der Option -o angegeben), die benutzt werden können, um das Verhalten des Moduls zu ändern.

Sie können auch den Quellcode der bestehenden Module bearbeiten oder sogar Ihre eigenen Module schreiben. Um sie für Po4a sichtbar zu machen, kopieren Sie sie in einen Pfad namens "/bli/blah/blu/lib/Locale/Po4a/" und fügen Sie dann den Pfad "/bli/blah/blu" in der Umgebungsvariablen "PERLIB" oder "PERL5LIB" hinzu. Beispiel:

   PERLLIB=$PWD/lib po4a --previous po4a/po4a.cfg

Hinweis: Der tatsächliche Name des Lib-Verzeichnisses ist nicht von Bedeutung.

Dieses Kapitel gibt Ihnen einen kurzen Überblick über die Interna von Po4a, so dass Sie sich sicherer fühlen, es zu warten und zu verbessern. Es könnte Ihnen auch dabei helfen, zu verstehen, warum es nicht das tut, was Sie erwarten, und wie Sie Ihre Probleme beheben können.

Die Po4a-Architektur ist objektorientiert (in Perl. Ist das nicht schön?). Der gemeinsame Vorfahr zu allen Auswertungsklassen nennt sich TransTractor. Dieser merkwürdige Name ist der Tatsache zu verdanken, dass er gleichzeitig für das Übersetzen des Dokuments und das Extrahieren von Zeichenketten zuständig ist.

Förmlicher ausgedrückt nimmt es ein Dokument zum Übersetzen plus eine PO-Datei, die die Übersetzungen enthält, als Eingabe, während es zwei getrennte Ausgaben erzeugt: Eine weitere PO-Datei (die das Ergebnis des Extrahierens übersetzbarer Zeichenketten vom Eingabedokument ist) und einem übersetzen Dokument (mit der gleichen Struktur, wie der aus der Eingabe, bei der aber alle übersetzbaren Zeichenketten durch den Inhalt der Eingabe-PO-Datei ersetzt wurden). Hier eine grafische Darstellung davon:

 Eingabedokument -- \                             /---> Ausgabedokument
                     \      TransTractor::       /       (übersetzt)
                      +-->--   parse()  --------+
                     /                           \
 Eingabe-PO-Datei---/                             \---> Ausgabe-PO-Datei
                                                          (extrahiert)

Dieser kleine Knochen ist der Kern der Po4a-Architektur. Falls Sie die Eingabe-PO-Datei und das Ausgabedokument weglassen, erhalten Sie po4a-gettextize. Falls Sie beide Eingaben bereitstellen und die Ausgabe-PO-Datei nicht beachten, erhalten Sie po4a-translate. po4a ruft TransTractor zweimal auf und ruft msgmerge -U zwischen diesen TransTractor-Aufrufen auf, um Lösungen aus einer Hand mit einer einzelnen Konfigurationsdatei bereitzustellen.

TransTractor::parse() ist eine virtuelle Funktion, die durch jedes Modul implementiert wird. Hier nun ein kleines Beispiel, um zu zeigen, wie es funktioniert. Es wertet eine Liste von Absätzen aus, von denen jeder mit <p> beginnt.

  1 sub parse {
  2   PARAGRAPH: while (1) {
  3     $my ($paragraph,$pararef,$line,$lref)=("","","","");
  4     $my $first=1;
  5     while (($line,$lref)=$document->shiftline() && defined($line)) {
  6       if ($line =~ m/<p>/ && !$first--; ) {
  7         $document->unshiftline($line,$lref);
  8
  9         $paragraph =~ s/^<p>//s;
 10         $document->pushline("<p>".$document->translate($paragraph,$pararef));
 11
 12         next PARAGRAPH;
 13       } else {
 14         $paragraph .= $line;
 15         $pararef = $lref unless(length($pararef));
 16       }
 17     }
 18     return; # Keine definierte Zeile erhalten? Ende der Eingabedatei.
 19   }
 20 }

In Zeile 6 und 7 tauchen "shiftline()" und "unshiftline()" auf. Diese helfen beim Ein- und Auslesen der Kopfzeilen des internen Eingabedatenstroms des Masterdokuments in die Zeilenzeichenkette und seine Referenz. Hier wird die Referenz durch eine Zeichenkette "$filename:$linenum" bereitgestellt. Bitte denken Sie daran, dass Perl nur eindimensionale Felddatenstrukturen hat. Daher ist Code, der mit den internen Eingabedatenstromzeilen umgeht, etwas kryptisch.

Zeile sechs wird erreicht, wenn <p> zum zweiten Mal gelesen wurde. Dies signalisiert den nächsten Absatz. Daher sollte die gerade erhaltene Zeile zurück in das Originaldokument (Zeile sieben) ablegt und der soweit gebaute Absatz ausgegeben werden. Nachdem das führende <p> in Zeile neun entfernt wurde, wird die Verbindung dieser Markierung mit der Übersetzung des restlichen Absatzes ausgegeben.

Diese translate()-Funktion ist richtig toll. Sie schiebt ihre Argumente in die Ausgabe-PO-Datei (Extrahierung) und gibt ihre Übersetzung so zurück, wie sie in der Eingabe-PO-Datei vorgefunden wurde (Übersetzung). Da sie als Teil des Arguments von pushline() verwandt wird, landet diese Übersetzung im Ausgabedokument.

Ist das nicht toll? Es ist möglich, ein vollständiges Po4a-Modul in weniger als 20 Zeilen zu bauen, wenn das Format einfach genug ist …

Sie können unter Locale::Po4a::TransTractor(3pm) mehr darüber erfahren.

Die Idee hierbei ist, das Originaldokument und seine Übersetzung zu nehmen und zu sagen, dass die Nte übersetzte Zeichenkette der Übersetzung die Übersetzung der Nten extrahierten Zeichenkette des Originals ist. Damit das funktioniert, müssen sich beide Dateien die exakt gleiche Struktur teilen. Falls die Dateien zum Beispiel die folgende Struktur haben, ist es sehr unwahrscheinlich, dass die vierte Zeichenkette der Übersetzung (vom Typ »Kapitel«) die Übersetzung der vierten Zeichenkette des Originals (vom Typ »Absatz«) ist.

    Original         Übersetzung
  Kapitel            Kapitel
    Absatz             Absatz
    Absatz             Absatz
    Absatz           Kapitel
  Kapitel              Absatz
    Absatz             Absatz

Dafür werden Po4a-Parser sowohl für das Original als auch für die Übersetzungsdateien zum Extrahieren der PO-Dateien benutzt. Dann wird eine dritte PO-Datei gebaut, deren Zeichenketten von der zweiten als Übersetzung der Zeichenketten der ersten genommen werden. Um zu prüfen, ob die zusammengefügten Zeichenketten tatsächlich die Übersetzung der jeweils anderen sind, sollten Dokumenten-Parser in Po4a Informationen über den syntaktischen Typ der extrahierten Zeichenketten im Dokument setzen (alle existierenden tun das, Ihres sollte das ebenfalls tun). Dann wird diese Information benutzt, um sicherzustellen, dass beide Dokumente die gleiche Syntax haben. Im vorhergehenden Beispiel würde es ermöglichen, festzustellen, dass Zeichenkette vier im einen Fall ein Absatz und im anderen Fall eine Kapitelüberschrift ist und dieses Problem melden.

Theoretisch wäre es möglich, das Problem festzustellen und die Dateien nachher neu zu synchronisieren (genauso wie es diff tut). Aber es ist nicht klar, was mit den wenigen Zeichenketten geschehen soll, bevor sie asynchron werden und es würde manchmal zu schlechten Ergebnissen führen. Dies ist der Grund, weshalb aktuelle Implementierungen nicht versuchen, etwas neu zu synchronisieren und lautstark fehlschlagen, wenn etwas schiefgeht, was manuelle Änderungen an Dateien erfordert, um das Problem zu lösen.

Sogar mit diesen Vorsichtsmaßnahmen können hier sehr einfach Dinge schiefgehen. Daher werden alle Übersetzungen, die auf diese Weise entstehen, als »fuzzy« (unscharf) markiert, um sicherzustellen, dass der Übersetzer sie aufarbeitet und prüft.

Gut, das hier ist ziemlich leicht. Das übersetzte Dokument wird nicht direkt auf die Platte geschrieben, sondern im Speicher gehalten, bis alle Addenda angewandt wurden. Die hier beteiligten Algorithmen sind eher unkompliziert. Es wird nach einer Zeile gesucht, die zum regulären Positionsausdruck passt und falls mode=before ist, wird das Addendum davor eingefügt. Wenn nicht, wird die nächste zur Abschnittsgrenze passende Zeile gesucht und das Addendum nach dieser Zeile eingefügt, falls es ein endboundary ist oder vor dieser Zeile, falls es ein beginboundary ist.

Dieses Kapitel gruppiert die häufig gestellten Fragen (»Frequently Asked Questions«). In der Tat könnten derzeit die meisten dieser Fragen wie folgt formuliert werden: »Warum wurde es auf diese Weise entwickelt und nicht auf eine andere?«. Falls Sie glauben, Po4a ist nicht die richtige Lösung zur Übersetzung von Dokumentation, sollten Sie diesen Abschnitt lesen. Falls er Ihre Frage nicht beantwortet, nehmen Sie auf unserer Mailingliste <devel@lists.po4a.org> mit uns (auf Englisch) Kontakt auf. Wir freuen uns über Rückmeldungen.

Ja, in Po4a wird jeder Absatz getrennt übersetzt (tatsächlich entscheidet dies jedes Modul, aber alle existierenden Module tun dies und Ihres sollte das auch tun). Es gibt zwei Hauptvorteile für dieses Herangehen:

  • Wenn die technischen Teile des Dokuments nicht sichtbar sind, kann der Übersetzer nicht daran herumbasteln. Je weniger Markierungen der Übersetzer vorgesetzt bekommt, um so weniger Fehler kann er machen.
  • Das Zerschneiden des Dokuments hilft beim Isolieren der Änderungen am Originaldokument. Wenn das Original verändert wurde, wird es durch diesen Prozess vereinfacht, herauszufinden, welche Teile der Übersetzung aktualisiert werden müssen.

Sogar mit diesen Vorteilen mögen einige Leute den Gedanken nicht, jeden Absatz einzeln zu übersetzen. Hier einige Antworten auf deren Befürchtungen:

  • Diese Herangehensweise erwies sich im KDE-Projekt als erfolgreich und ermöglichte dort Leuten die größte bekannte Sammlung übersetzter und aktueller Dokumentation.
  • Die Übersetzer können weiterhin den Kontext zum Übersetzen benutzen, da die Zeichenketten in der PO-Datei in der gleichen Reihenfolge wie im Originaldokument stehen. Nacheinander zu übersetzen ist daher eher vergleichbar, ob Sie Po4a verwenden oder nicht. Und auf jeden Fall bleibt die beste Möglichkeit, den Kontext zu erhalten, das Dokument in ein druckbares Format umzuwandeln, da die Fassungen mit Textformatierungen nach Auffassung des Verfassers nicht wirklich lesbar sind.
  • Diese Herangehensweise ist diejenige, die von professionellen Übersetzern angewandt wird. Es stimmt, dass die etwas andere Ziele als Open-Source-Übersetzer verfolgen. Die Wartung ist zum Beispiel meist weniger kritisch für sie, da der Inhalt sich seltener ändert.

Professionelle Übersetzerwerkzeuge unterteilen das Dokument machmal auf Satzebene, um die Wiederverwendbarkeit vorhergehender Übersetzungen zu maximieren und ihre Verarbeitung zu beschleunigen. Das Problem ist, dass der gleiche Satz mehrere Übersetzungen haben könnte, je nach Kontext.

Absätze sind definitionsgemäß länger als Sätze. Das wird hoffentlich sicherstellen, dass der gleiche Absatz, wenn er in zwei Dokumenten vorkommt, die gleiche Bedeutung (und Übersetzung) hat, ohne in jedem Fall den Kontext zu beachten.

Unterteilen in kleinere Teile als einen Satz wäre sehr schlecht. Es wäre etwas zu umfangreich, hier zu erklären warum, aber interessierte Leser können beispielsweise die Handbuchseite Locale::Maketext::TPJ13(3pm) lesen (die der Perl-Dokumentation beigefügt ist). Kurz gesagt, hat jede Sprache ihre besonderen syntaktischen Regeln und es gibt keine Möglichkeit, Sätze durch angesammelte Teile von Sätzen für alle existierenden Sprachen zu bilden (oder gar für fünf der zehn meistgesprochenen, oder sogar weniger).

Auf den ersten Blick schien Gettext nicht für alle Arten von Übersetzungen geeignet zu sein. Es scheint zum Beispiel nicht an Debconf angepasst zu sein, die Schnittstelle, die alle Debian-Pakete für ihr Zusammenspiel mit dem Anwender während der Installation nutzen. In diesem Fall waren die Texte schön klein (ein Dutzend Zeilen für jedes Paket) und es war schwierig, die Übersetzung in eine Spezialdatei abzulegen, da sie vor der Paketinstallation verfügbar sein müssen.

Daher haben sich die Debconf-Entwickler entschieden, eine andere Lösung zu implementieren, bei der Übersetzungen in die gleiche Datei wie das Original platziert werden. Dies ist recht ansprechend. Jemand könnte dies zum Beispiel sogar für XML wollen, dies würde dann ungefähr so aussehen:

 <section>
  <title lang="de">Mein Titel</title>
  <title lang="fr">Mon titre</title>
  <para>
   <text lang="de">Mein Text.</text>
   <text lang="fr">Mon texte.</text>
  </para>
 </section>

Aber es war dadurch so problematisch, dass nun eine PO-basierte Herangehensweise benutzt wird. Nur das Original kann in der Datei bearbeitet werden und die Übersetzung muss in PO-Dateien erfolgen, die von der Master-Schablone extrahiert wurden (und zur Kompilierungzeit des Pakets zurück platziert werden). Das alte System wurde wegen mehrerer Probleme missbilligt:

  • Verwaltungsprobleme

    Falls mehrere Übersetzer gleichzeitig einen Patch bereitstellen, ist es schwierig, sie zusammenzufügen.

    Wie möchten Sie Änderungen im Original ermitteln, wofür die Übersetzungen aktualisiert werden müssen? Um Diff zu benutzen, müssen sie vermerken, welche Version des Originals Sie übersetzt haben. D.h. Sie benötigen in Ihrer Datei eine PO-Datei. ;)

  • Kodierungsprobleme

    Diese Lösung ist umsetzbar, wenn nur europäische Sprachen beteiligt sind, aber die Einführung von Koreanisch, Russisch und/oder Arabisch erschwert das Szenario. UTF könnte eine Lösung sein, aber es gibt immer noch Probleme damit.

    Außerdem sind solche Probleme schwer feststellbar (d.h. nur koreanische Leser werden bemerken, dass die Kodierung von Koreanisch kaputt ist [aufgrund des russischen Übersetzers]).

Gettext löst all diese Probleme gleichzeitig.

Das stimmt, allerdings kam bisher niemand mit einer besseren Lösung. Die einzige bekannte Alternative ist die manuelle Übersetzung mit all den Verwaltungsproblemen.

Soweit mir bekannt, gibt es nur zwei davon:

Dies ist das durch KDE-Leute entwickelte Werkzeug, um DocBook-XML zu handhaben. Soweit bekannt, war es das erste Programm zum Extrahieren von Zeichenketten aus der Dokumentation in PO-Dateien und um sie nach dem Übersetzen wieder einzuspeisen.

Es kann nur XML und eine spezielle DTD handhaben. Der Verfasser ist ziemlich unglücklich mit der Handhabung von Listen, die in einer großen Msgid enden. Wenn die Liste groß wird, wird es schwerer, mit dem großen Stück umzugehen.

Dieses von Denis Barbier erstellte Programm ist so eine Art Vorläufer des Po4a-SGML-Moduls, wodurch ersteres mehr oder weniger missbilligt ist. Wie der Name sagt, handhabt es nur die DebianDoc-DTD, die mehr oder weniger eine missbilligte DTD ist.

Die Hauptvorteile von Po4a demgegenüber sind die Erleichterung beim Hinzufügen zusätzlichen Inhalts (was dort sogar schlechter ist) und die Fähigkeit, Gettext zu verwenden.

Wenn Sie versuchen, Dokumentationen oder Programme zu übersetzen, sehen Sie sich drei Arten von Problemen gegenüber; linguistische (nicht jeder spricht zwei Sprachen), technische (der Grund, weshalb Po4a existiert) und beziehungsartige/menschliche. Nicht alle Entwickler verstehen die Notwendigkeit, Dinge zu übersetzen. Sogar wenn sie entgegenkommend sind, könnten Sie ignorieren, wie Übersetzern die Arbeit erleichtert wird. Um dabei zu helfen, bringt Po4a ein Menge Dokumentation mit, auf die Bezug genommen werden kann.

Ein weiterer wichtiger Punkt ist, dass jede übersetzte Datei mit einem kurzen Kommentar beginnt, der angibt, um was für eine Datei es sich handelt und wie sie benutzt wird. Dies sollte den armen Entwicklern helfen, die mit tonneweisen Dateien in unterschiedlichen Sprachen überschüttet werden, die sie kaum sprechen können und hilft ihnen, korrekt damit umzugehen.

In einem Projekt, das Po4a verwendet, sind übersetzte Dateien keine Quelldateien mehr. Das bedeutet, dass diese Dateien nicht die bevorzugte Form für Veränderungen sind. Da dies eher untypisch ist, ist das eine leichte Fehlerquelle. Daher haben alle vorhandenen Dateien diese Kopfzeilen:

 |       *****************************************************
 |       *           GENERATED FILE, DO NOT EDIT             *
 |       * THIS IS NO SOURCE FILE, BUT RESULT OF COMPILATION *
 |       *****************************************************
 |
 | This file was generated by po4a-translate(1). Do not store it (in VCS,
 | for example), but store the PO file used as source file by po4a-translate.
 |
 | In fact, consider this as a binary, and the PO file as a regular source file:
 | If the PO gets lost, keeping this translation up-to-date will be harder ;)

Ebenso müssen die normalen PO-Dateien von Gettext nur in das Verzeichnis po/ kopiert werden. Aber dies ist nicht der Fall bei denen, die durch Po4a manipuliert wurden. Das Hauptrisiko hier ist, dass ein Entwickler die existierende Übersetzung seines Programms mit der Übersetzung seiner Dokumentation löscht. (Beides kann nicht in der gleichen PO-Datei gespeichert werden, weil sein Programm seine Übersetzung als mo-Datei installieren muss, während die Dokumentation ihre Übersetzung nur zur Zeit der Kompilierung benötigt.) Daher enthalten die PO-Dateien, die vom Modul po-debiandoc erzeugt wurden folgende Kopfzeilen:

 #
 #  ADVISES TO DEVELOPERS:
 #    - you do not need to manually edit POT or PO files.
 #    - this file contains the translation of your debconf templates.
 #      Do not replace the translation of your program with this !!
 #        (or your translators will get very upset)
 #
 #  ADVISES TO TRANSLATORS:
 #    If you are not familiar with the PO format, gettext documentation
 #     is worth reading, especially sections dedicated to this format.
 #    For example, run:
 #         info -n '(gettext)PO Files'
 #         info -n '(gettext)Header Entry'
 #
 #    Some information specific to po-debconf are available at
 #            /usr/share/doc/po-debconf/README-trans
 #         or http://www.debian.org/intl/l10n/po-debconf/README-trans
 #

ZUSAMMENFASSUNG der Vorteile der Gettext-basierten Herangehensweise

  • Die Übersetzungen werden nicht zusammen mit dem Original gespeichert, wodurch es möglich wird, festzustellen, ob Übersetzungen nicht mehr aktuell sind.
  • Die Übersetzungen werden jeweils in separaten Dateien gespeichert, was verhindert, dass sich Übersetzer unterschiedlicher Sprachen, sowohl beim Senden des Patches als auch auf der Ebene des Dateikodierung, stören.
  • Es basiert intern auf Gettext (Po4a bietet aber eine sehr einfache Schnittstelle, so dass Sie die Interna nicht verstehen müssen, um es zu benutzen). Auf diese Art muss das Rad nicht neu erfunden werden und aufgrund ihrer weiten Verbreitung kann davon ausgegangen werden, dass diese Werkzeuge mehr oder weniger fehlerfrei sind.
  • Für den Endanwender hat sich nichts geändert (außer der Tatsache, dass Übersetzungen hoffentlich besser gepflegt werden). Die resultierende Dokumentationsdatei, die verteilt wird, ist exakt dieselbe.
  • Es ist nicht nötig, dass Übersetzer eine neue Dateisyntax lernen und ihr bevorzugter PO-Editor (wie der PO-Modus von Emacs, Lokalize oder Gtranslator) wird gut funktionieren.
  • Gettext bietet eine einfache Möglichkeit, Statistiken darüber zu erhalten, was erledigt ist, was überprüft und aktualisiert werden sollte und was noch zu erledigen ist. Einige Beispiele können unter den folgenden Adressen gefunden werden:

     - https://docs.kde.org/stable5/en/kdesdk/lokalize/project-view.html
     - http://www.debian.org/intl/l10n/
        

Aber nicht alles ist rosig und diese Herangehensweise hat auch einige Nachteile, die bewältigt werden müssen.

  • Addenda sind … auf den ersten Blick merkwürdig.
  • Sie können den übersetzten Text nicht nach Ihren Präferenzen anpassen, wie das Aufteilen eines Absatzes hier und das Zusammensetzen zwei anderer dort. Aber, falls es in einem gewissen Sinn ein Problem mit dem Original gibt, sollte es sowieso als Fehler gemeldet werden.
  • Sogar mit der einfachen Oberfläche bleibt es ein neues Werkzeug, das Leute lernen müssen.

    Es wäre traumhaft, wenn jemand Po4a in Gtranslator oder Lokalize einbinden würde. Wenn eine Dokumentationsdatei geöffnet wird, werden die Zeichenketten automatisch extrahiert. Wenn sie gespeichert wird, kann eine übersetzte Datei + PO-Datei auf die Platte geschrieben werden. Falls es fertiggebracht wird, ein MS-Word-Modul™ (oder zumindest RTF) zu erstellen, können es sogar professionelle Übersetzer nutzen.

 Denis Barbier <barbier,linuxfr.org>
 Martin Quinson (mquinson#debian.org)
2018-12-09 Po4a-Werkzeuge