Vor etwa einem Jahr habe ich bereits einen Artikel über WordPress Theme internationalization geschrieben und das grundlegende Vorgehen zum Erzeugen von Sprachdateien skizziert. Ich möchte diesen im Folgenden durch meinen persönlichen Workflow anhand eines einfachen Beispiels ergänzen.

Vorbereitung

Wie bereits im ersten Teil dargestellt, muss zunächst in der Datei functions.php die »Textdomain« eingebunden werden. Seit WordPress 2.7 ist es möglich, zusätzlich zum Namen der Domain ein Verzeichnis anzugeben, in dem nach den Übersetzungen gesucht wird (in diesem Fall das Verzeichnis messages/ unterhalb des Template-Verzeichnisses):

load_theme_textdomain('mydomain', get_template_directory().'/messages');

Anschließend müssen in den Templatedateien sämtliche Strings ausgezeichnet werden, die übersetzt werden sollen. Wenn man ein neues Theme von Grund auf gestaltet, tut man gut daran, das von Anfang an zu tun. Andernfalls ist das eine recht mühselige Arbeit.

Ein paar Beispiele

In der Datei index.php befindet sich innerhalb »Der Schleife« (The Loop) diese Zeile zur Ausgabe des Inhalts eines Artikels:

the_content('Read the rest of this entry');

Dies wird zu

the_content( __('Read the rest of this entry', 'mydomain') );

Die Funktion __($message, $domain) sucht innerhalb der Domain $domain (hier: ‘mydomain’) nach einer Übersetzung für den String $message (hier: ‘Read the rest of this entry’) und gibt diese zurück. Oder, falls keine Übersetzung gefunden wurde, den ursprünglichen String.

In der Datei comments.php findet sich das Label für das Formularfeld »author«:

<label for="author">Your name</label>

Dies wird zu

<label for="author"><?php _e('Your name', 'mydomain'); ?></label>

Die Funktion _e(...) ist äquivalent zu echo __(...)

Automatisierung mit GNU make

Nun geht es darum, diese Strings zu extrahieren und in separaten Dateien zu speichern, die dann jeweils die Übersetzung in eine weitere Sprache ermöglichen. Um das Hantieren mit den .po- und .mo-Dateien (siehe Teil 1) etwas einfacher zu gestalten, habe ich folgendes Makefile geschrieben:

# List of locales to generate (space separated)
LOCALES = de_DE

# List of source files
SRC_FILES = ../*.php

# .pot file to create
POT_FILE = messages.pot

$(POT_FILE): $(SRC_FILES)
        xgettext --keyword=__ --keyword=_e --keyword=_c --keyword=__ngettext:1,2 --keyword=__ngettext_noop:1,2 $(SRC_FILES) && \
        mv messages.po $(POT_FILE)

po_files: $(patsubst %,%.po,$(LOCALES))

mo_files: $(patsubst %,%.mo,$(LOCALES))

%.po: $(POT_FILE)
        [ -f $@ ] && \
        msgmerge -U $@ $< && touch $@ || \
        msginit -l $* -o $@

%.mo: %.po
        msgfmt -o $@ $<

Wichtig: die eingerückten Zeilen müssen mit einem Tab und nicht mit Leerzeichen eingerückt werden!

Diese Datei wird unter dem Namen Makefile (Groß-/Kleinschreibung beachten) im Verzeichnis messages/ abgelegt, das unterhalb des Template-Verzeichnisses angelegt wird:

mytheme/
|-- footer.php
|-- functions.php
|-- header.php
|-- index.php
|-- messages/
|   `-- Makefile
|-- screenshot.png
|-- searchform.php
|-- sidebar.php
|-- single.php
`-- style.css

Damit das Folgende funktioniert, müssen die GNU-Tools make und gettext installiert sein, was unter Debian der Befehl aptitude install gettext make erledigt.

.po-Files generieren

Zunächst wechseln wir in das neu angelegte Verzeichnis:

$ cd messages/
$ ls
Makefile

Jetzt legen wir die .po-Datei an, in der die deutschen Übersetzungen gespeichert werden:

$ make de_DE.po

Übersetzen

Nun wird die eigentliche Übersetzungsarbeit fällig. Es bietet sich an, für das Bearbeiten der .po-Dateien eines der zahlreichen Tools zu verwenden, die es einem erleichtern, sich ganz auf die Texte zu konzentrieren, ohne dass man Gefahr läuft die Syntax der Datei kaputt zu machen.

Vorab sollte man in der .po-Datei noch die Zeichenkodierung auf UTF-8 ändern, um sich Probleme mit Umlauten zu ersparen:

"Content-Type: text/plain; charset=UTF-8\n"

.mo-Files generieren

Ist die Übersetzung abgeschlossen, kann die .po-Datei compiliert, d.h. die .mo-Datei erzeugt werden. Das passiert durch den Aufruf von

$ make de_DE.mo

Jetzt sollten die übersetzten Texte im Theme erscheinen. Falls das nicht klappt, sollte als erstes geprüft werden, ob in der wp-config.php die Konstante WPLANG auf den Wert ‘de_DE’ gesetzt ist.

.po-Files aktualisieren

Wird nun weiter am Template gearbeitet, kann es natürlich passieren, dass neue Strings definiert werden, die übersetzt werden wollen. In diesem Fall aktualisiert der Aufruf von make de_DE.po die .po-Datei – alle bisher gemachten Übersetzungen bleiben dabei erhalten. Die Erzeugung der .mo-Datei erfolgt wie gehabt.

Übersetzungen in weitere Sprachen

Wer sich mit Makefiles auskennt, hat vermutlich schon bemerkt, dass sich mit meinem Makefile eine ganze Liste von Sprachdateien in einem Rutsch aktualisieren lassen. Dazu werden in der 2. Zeile alle Locales, die erzeugt werden sollen, durch Leerzeichen getrennt hintereinander aufgelistet (hier z.B. für Deutsch, Französisch, Spanisch und Italienisch):

LOCALES = de_DE fr_FR es_ES it_IT

Nun können alle .po-Dateien mit make po_files bzw. alle .mo-Dateien mit make mo_files auf den neuesten Stand gebracht werden. Es ist übrigens auch möglich, weitere Sprachen im Nachhinein zu ergänzen. Make erzeugt bzw. aktualisiert immer nur die Dateien, die notwendig sind.