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.
Hallo Martin,
vielen Dank für dieses Update! Schon der erste Teil half mir mein Theme und etliches mehr zu internationalisieren, aber dieser Beitrag mit den vielen kleinen Hinweisen und vor allem der Makefile ist echt klasse.
Grüße,
Christian
@Christian Gern geschehen und danke fürs Feedback.
Hinweis: WordPress hatte beim Erstellen des Artikels (warum auch immer) die Backslashes (’\') in den Code-Auszügen gefressen. Ich habe das jetzt korrigiert.
Sehe ich auch so