Kapitel 15. Lokalisierung

Inhaltsverzeichnis

15.1. Für Übersetzer
15.1.1. Voraussetzungen
15.1.2. Zeichenketten extrahieren
15.1.3. Zeichenketten übersetzen
15.1.4. Übersetzungen aktualisieren

15.1. Für Übersetzer

Welcompose nutzt in Bereichen, die nicht vom Anwender ohne weiteres editiert werden können, Englisch für Beschriftungen und Systemmeldungen. Diese können allerdings ohne Weiteres lokalisiert werden. Lokalisierbar ist der Administrationsbereich sowie Teile des öffentlichen Bereichs (z.B. Formular-Beschriftungen und -Fehlermeldungen beim Seitentyp Simple Form), nicht aber Fehlermeldungen vom System, die beispielsweise von Validierungsfunktionen stammen.

Die Lokalisierung erfolgt mit GNU gettext, das beispielsweise auch von anderen Projekten wie KDE verwendet wird. GNU gettext steht in Welcompose einerseits nativ über die gettext-Erweiterung von PHP bereit und andererseits in Form von Smarty-Plugins, die die gettext-Funktionen innerhalb der Vorlagen zur Verfügung stellen.

Eine gute Einführung zum Thema GNU gettext mit PHP bietet der Artikel Gettext von Joao Prado Maia.

15.1.1. Voraussetzungen

Um Welcompose zu lokalisieren, benötigen Sie folgende Werkzeuge:

SmartyGettext

Sie brauchen SmartyGettext, respektive die Datei xgettext.php aus dem Paket, um die zu übersetzenden Zeichenketten aus den Vorlagen und den PHP-Scripts zu extrahieren. Sie erhalten SmartyGettext von http://downloads.welcompose.de/misc/SmartyGettext/xgettext.phps. Speichern Sie die Datei mit dem Suffix .php lokal und kopieren Sie xgettext.php dann nach /usr/local/bin oder fügen Sie den Pfad zur Datei in $PATH ein, damit Sie sie als xgettext.php auf der Kommando-Zeile ansprechen können.

GNU gettext

GNU gettext ist Bestandteil der meisten Linux-Distributionen und MacOS X. Ist es nicht vorhanden, kann es über den jeweiligen Paket-Manager nachinstalliert werden. In Windows ist eine Installation und Nutzung von GNU gettext über Cygwin möglich. Nach der Installation von GNU gettext sollten die Werkzeuge msginit, msgfmt und msgmerge vorhanden sein.

PHP 5.0.3

Eine CLI-Version von PHP 5.0.3 (oder neuer). Ob eine CLI-Version von PHP vorhanden ist, können Sie mit php -v herausfinden. Beispielausgabe: PHP 5.2.0 (cli) (built: Dec 17 2006 11:27:03).

[Warnung] Warnung

Die Code-Beispiele gehen davon aus, dass alle Programme in $PATH installiert sind und daher direkt angesprochen werden können. Ist dem nicht der Fall, passen Sie die Pfade zu den Programmen den aktuellen Gegebenheiten an.

15.1.2. Zeichenketten extrahieren

Bevor die Zeichenketten übersetzt werden können, müssen Sie aus den Vorlagen und PHP-Scripts extrahiert werden. Verwenden Sie dazu das Programm xgettext.php.

[Warnung] Warnung

Es existiert auch ein Programm namens xgettext (ohne Endung .php), das Teil von GNU gettext ist. Verwenden Sie dieses Programm nicht, da es nicht die Zeichenketten in den Vorlagen erkennt. Benutzen Sie statt dessen nur die modifizierte Version xgettext.php, die auch die Zeichenketten in den Vorlagen erkennt.

$ php xgettext.php \
	--charset=utf-8 \
	--directory=welcompose/welcompose/trunk/welcompose \
	--scan-hidden=false \
	--delimiter="{ }" \
	--suffix=.html \
	--suffix=.php 

Mit dem Argument --directory wird das Verzeichnis, angegeben, von dem aus xgettext.php alle Dateien nach Zeichenketten zum Übersetzen durchsuchen soll. Der Pfad sollte auf das Verzeichnis zeigen, indem sich die Software mit den Unterordnern admin, core usw. befindet. Das Argument --suffix definiert, welche Dateitypen (nach Endung) nach Zeichenketten zum Übersetzen durchsucht werden sollen.

[Tipp] Tipp

Um eine Liste aller Optionen von xgettext.php zu erhalten, geben Sie xgettext.php --help ein. Dort wird auch ihre Anwendung erklärt.

Wenn Sie xgettext.php aufrufen, durchsucht es gemäss der Konfiguration den jeweiligen Zielordner und alle Unterordner nach Zeichenketten zum Übersetzen. Die gefundenen Zeichenketten werden in eine Datei mit dem Namen messages.pot geschrieben.

15.1.3. Zeichenketten übersetzen

Um die Übersetzung in eine bestimmte Sprache zu beginnen (beispielsweise Deutsch), benötigen Sie das Programm msginit und die Datei messages.pot, die Sie in Abschnitt 15.1.2, „Zeichenketten extrahieren“ erstellt haben.

$ msginit --locale=de --input=messages.pot

msginit ist ein interaktives Programm, dass Ihnen einige Fragen zur Lokalisierung stellt und die Datei messages.pot auf die Übersetzung vorbereitet. Die Sprache, in die Sie Welcompose übersetzen wollen, wird mit dem Kommandozeilen-Argument --locale bestimmt: de steht beispielsweise für Deutsch, es für Spanisch. Sie erhalten eine Datei mit dem Namen messages.po.

Die PO-Dateien können mit jedem Texteditor übersetzt werden, sofern er die richtigen Zeichensätze unterstützt. Jede zu übersetzende Zeichenkette umfasst drei Zeilen:

#: blog_tag.html:120 blog_tag.html:26 blog_tag.html:110
msgid "Postings tagged with »%tmp_current_tag_word«"
msgstr ""

Die erste Zeile listet die Referenzen, also die Dateien und Zeilennummern, wo die Zeichenkette überall gefunden wurde. Dies ist hilfreich bei kontextsensitiver Übersetzung. Die msgid bezeichnet die Zeichenkette im Quellcode, msgstr nimmt den übersetzten Text auf. Beispiel:

#: blog_tag.html:120 blog_tag.html:26 blog_tag.html:110
msgid "Postings tagged with »%tmp_current_tag_word«"
msgstr "Beiträge zum Stichwort »%tmp_current_tag_word«"
[Warnung] Warnung

Editieren Sie auf keinen Fall die msgid. Sonst ist GNU gettext nicht der Lage, der ursprünglichen Zeichenkette die Übersetzung zuzuordnen.

Platzhalter können an einem vorgestellten Prozentzeichen (%) identifiziert werden. Sie sind 1:1 vom Original zu übernehmen und an der passenden Stelle in der Übersetzung zu platzieren (s. Beispiel über diesem Abschnitt).

Zeichenketten, die sowohl im Original als auch in der Übersetzung gleich lauten (z.B. bei Eigennamen wie IBM), ist das Original in die Übersetzung zu übernehmen:

#: blog_tag.html:140 blog_index.html:138 blog_tag.html:130 blog_index.html:128
msgid "Permalink"
msgstr "Permalink"

Nachdem Sie alle Zeichenketten übersetzt haben, reichen Sie die Übersetzung bitte ein oder fügen Sie sie selber der Versionskontrolle, wenn Sie das können.

[Anmerkung] Anmerkung

GNU gettext ist nicht in der Lage, die PO-Dateien für die Übersetzung der Zeichenketten zu verwenden. Diese müssen dazu vorher in das binäre MO-Format überführt werden. Die erfolgt mit dem Programm msgfmt, indem Sie die Anweisung $ msgfmt messages.po verwenden.

Sie brauchen dies als Übersetzer aber nur zu tun, wenn Sie die messages.mo selber benutzen wollen, beispielsweise für einen Test. Ansonsten übernehmen die Scripts, die die Installationsarchive von Welcompose erstellen, die Umwandlung der PO-Dateien.

[Warnung] Warnung

Löschen Sie die PO-Dateien auf keinen Fall! Sie benötigen sie bei Aktualisierungen, um nicht mehr alle Zeichenketten von neuem ändern zu müssen.

15.1.4. Übersetzungen aktualisieren

Wurde die Software aktualisiert, d.h. Zeichenketten geändert und hinzugefügt, ist es nötig, ein weiteres Mal sämtliche Zeichenketten zu extrahieren und eine POT-Datei zu erstellen (siehe Abschnitt 15.1.2, „Zeichenketten extrahieren“). Damit aber nicht wieder sämtliche Zeichenketten übersetzt werden müssen, kann man mit Hilfe eines weiteren Werkzeugs einen Abgleich der alten messages.po und der neuen messages.po ausführen.

$ mv messages.po old.po
$ php xgettext.php \
	--charset=utf-8 \
	--directory=welcompose/welcompose/trunk/welcompose \
	--scan-hidden=false \
	--delimiter="{ }" \
	--suffix=.html \
	--suffix=.php
$ mv messages.po new.po
$ msgmerge old.po new.po --output-file=messages.po

Die resultierende messages.po enthält bereits die – sofern noch gültigen – alten Übersetzungen und am Ende der Datei die gegebenenfalls neu hinzugekommenen oder modifizierten Zeichenketten. Gelöschte Zeichenketten sind auskommentiert am Ende der Datei zu finden:

#~ msgid "VORSCHAU - KOMMENTARE NICHT VERFÜGBAR!"
#~ msgstr "PREVIEW - COMMENTS NOT AVAILABLE"

Die auskommentierten Zeichenketten können bei Bedarf automatisch mit Hilfe von awk entfernt werden:

awk'{if (/^#~/) exit; elseprint}' messages.po > messages_sauber.po