Tutorial: WordPress-Themes lokalisieren
Die Lokalisierung / Übersetzung von WordPress-Themes ist eine von mir bisher sträflich wenig beachtete Funktion von WordPress. Dabei kann man mit einem relativ geringen Mehraufwand einen gehörigen Mehrwert in Sachen Interantionalisierung von Themes schaffen.
Warum lokalisieren?
Die Vorteile, den kleinen Mehraufwand bei der Erstellung eines WordPress-Themes in Kauf zu nehmen und dieses zu lokalisieren, liegen auf der Hand. Mit gesonderten Sprachdateien lässt sich das Theme unabhängig vom Quellcode, den man dafür dann nicht mehr anrühren muss, in beliebig viele Sprachen übersetzen.
Die WordPress-Installation selbst ist in Sachen Intarnationalisierung und Übersetzung schon weit gediehen und es gibt bereits unzählige Übersetzungen für den WordPress-Admin. Dann sollten wir beim Theme nicht aufhören.
WordPress verwendet GetText:
Um WordPress-Themes zu lokalisieren verwendet WordPress eine Übersetzungsanwendung namens GetText. Mit dieser Anwendung ist es relativ einfach, WordPress zusagen, was wo und womit übersetzt werden soll. Mehr dazu im Detail.
HTML-Strings übersetzbar machen:
Nehmen wir an, wir wollen in userem Theme einen Titel der Sidebar übersetzen. Dort steht im Quellcode folgendes:
<h4>Recent Articles</h4>
Um diesen HTML-String nun per GetText übersetzbar zu machen, müssen wir ihn in einen GetText-Call packen, den viele Theme-Designer von Euch sicherlich schon gesehen haben und der wie folgt aussieht:
<h4><?php _e('Recent Articles', my_theme_name); ?></h4>
Bemerkung:
Hiermit rufen wir die GetText-Funktion _e() auf und sagen ihr, was womit übersetzt werden soll und dass die Übersetzung an dieser Stelle ausgegeben werden soll (PHP: echo). Der erste Parameter in der Klammer sagt, was übersetzt werden soll und der zweite (my_theme_name) sagt WordPress, wo die Übersetzung zu finden ist (dazu später mehr),
GetText in WordPress-Funktionen:
Sicherlich sind Euch auch schon WordPress-Funktionen bekannt, in denen verschiedene Strings verarbeitet werden. Ein Beispiel ist der Aufruf der Anzahl der Kommentare:
<?php comments_number(__('No comments',my_theme_name), __('One comment',my_theme_name), __( '% comments',my_theme_name) );?>
Bemerkung:
In der Funktion comments_number() können wir drei Strings für drei mögliche Fälle übergeben (kein, 1 und x Kommentare). Wie ihr vielleicht seht, rufen wir jedoch jetzt die GetText-Funktion __() auf. Auch diese sagt WordPress was womit übersetzt werden soll, doch nun wird die Übersetzung an dieser Stelle nicht ausgegeben (PHP: kein echo), sondern kann als String von PHP weiterverarbeitet werden.
Text-Domains:
Der Name ist ein wenig irreführend. Es geht um den zweiten Parameter in den GetText-Calls (my_theme_name). Dieser ist optional und hilft WordPress die richtige Übersetzung zu finden. Es kann nämlich vorkommen, dass z. B. in einem Plugin, das wir verwenden, der gleiche String übersetzt werden soll. Mit unserer eindeutigen Text-Domain können wir klar bestimmen, welche Übersetzung gewählt werden soll. Die Text-Domain kann der Theme-Name sein, mit dem man auch den Theme-Ordner benannt hat (z. B. ‘decoder’ oder ‘my_theme_name’).
Vorbereiten und Erstellen der Sprachdatei:
Angenommen wir haben jetzt überall in unseren Theme diese zu übersetzenden Strings verteilt. Als nächstes wollen wir diese in einer Liste ausgeben, um sie weiterverarbeiten zu können.

PHP to .po extractor
Diese Liste, mit der wir auch die Übersetzung machen ist eine .po-Datei (Portable Object). Um nun aus den php-Dateien unseres Themes die Liste in der .po-Datei zu erstellen, gibt es PHP to .po extractor, mit denen wir einzelne Dateien aber auch Zip-Archive verarbeiten können. Dieser sucht alle Strings, die in _e() und __() Funktionen gepackt sind und gibt uns die .po-Datei zurück.
Übersetzen aller Strings in der .po-Datei:
Um .po-Dateien verarbeiten zu können, solltet Ihr Euch das Programm Poedit herunterladen. Mit diesem Programm lassen sich die Übersetzungen einfach und übersichtlich anfertigen. Beim Abspeichern unserer .po-Datei wird automatisch eine .mo-Datei erstellt, die letztlich die Sprachdatei ist, die WordPress benötigt. Die .po-Datei ist sozusagen nur die Bearabeitungsdatei.

Sprachdateien bearbeiten mit Poedit
Wichtig beim Erstellen der Sprachdateien sind noch die Sprach- und Ländercodes, mit denen wir die Sprachfiles benennen. Eine Sprachdatei für Deutsch aus Deutschland müsste also de_DE.po / de_DE.mo heißen. Für Schweizer Deutsch dementsprechend de_CH.po / de_CH.mo.
Laden der Text-Domain:
Wenn wir die .po/.mo-Dateien in unserem Theme-Ordner platziert haben, sagen wir WordPress, dass in unserem Theme eine Übersetzung geladen werden soll.
<?php load_theme_textdomain(my_theme_name); ?>
Bemerkung:
Diesen Aufruf platzieren wir am besten in der header.php, da diese bei jedem Seitenaufruf angesprochen wird.
Wenn WordPress nun das Sprachfile für die Sprache findet, die in der wp-config.php angegeben ist, wird das Theme mit allen Übersetzungen richtig angezeigt.
define ('WPLANG', 'de_DE');
// edit:
Alternative per Plugin:
Wenn einem das Installieren von Poedit und das externe Scannen der PHP-Dateien zum umständlich ist, kann man das Ganze auch WordPress-intern lösen. Das WordPress-Plugin Codestyling Localization scheint mir dafür eine starke Alternative zu sein. Ich habe es selbst noch nicht getestet, werde das aber auf jeden Fall nachholen.
Danke an sokai für den Tipp!
// end edit;
Fazit:
Die Lokalisierung von WordPress-Themes sollte für Theme-Autoren zum Standard gehören. Wenn man diese Routine einmal durchlaufen ist, hält sich der Mehraufwand tatsächlich in Grenzen und das Theme wird dem internationalen Charakter von WordPress gerecht.
Relevante Links:
- WordPress Codex Translating WordPress
- WordPress Codex WordPress in You Language
- Poedit zum Verarbeiten von .po-Dateien
- PHP Text-Scanner zum Erstellen der .po-Dateien
- How to localize WordPress themes and plugins with GetText
- Wordpress Themes lokalisieren /// ZyBlog
12 Kommentare
1 Trackback
- Lokalisierung: WordPress Themes auf deutsch – So geht’s – FirstDayBlack - [...] Ein paar technische Hinweise zur Lokalisierung für Theme-Entwickler gibt Simon Rimkus in seinem Tutorial »WordPress-Themes lokalisieren«. [...]


5. Februar 2009
Das ist ein Thema, mit dem ich mich auch in der nächsten Zeit näher beschäftigen wollte. Deshalb ist das für mich ein sehr hilfreicher Artikel.
5. Februar 2009
Hey Gerd,
ich hoffe, es werden sich noch mehr Leute mit diesem Thema beschäftigen. Denn zum Teil sind nicht mal Premium Themes lokalisiert. Aber ich denke, da tut sich zur Zeit einiges.
5. Februar 2009
Die Premium themes kommen fast alle aus Amiland und die scheren sich einen %&%$§ um andere Sprachen
5. Februar 2009
Da magst Du Recht haben. Aber auch die werden irgendwann merken, dass die Welt hinter der East und der West Coast weitergeht.
In naher Zukunft gibt es von mir Premium Themes mit fertigen englischen, spanischen und deutschen Sprachfiles
5. Februar 2009
Schönes Tutorial!
…um die ganze Sache mit den *.po/*.mo-Dateien bei der Lokalisierung jedoch einfacher zu gestalten, empfehle ich mal das Plugin “Codestyling Localization”. – Das kann sicher helfen…
sofar|sokai
5. Februar 2009
Hi sokai,
danke für den Tipp! Das werde ich mir mal genauer ansehen. War mir bisher unbekannt, da ich mich echt wenig mit dem Thema beschäftigt habe.
23. August 2009
Hello. Netter Artikel. Schön wäre, wenn du ein wenig auf die Unterschiede zwischen __() und _e() (und es gibt noch zig andere “Modi” für alle smögliche) eingehen könntest. Die Textdomain musst Du übrigens nicht in den header setzen. Die ist in der Functions.php auch gut aufgehoben
30. September 2009
Hallo, habe mit großem Interesse Ihr Tutorial über die Lokalisierung von Wordpress gelesen. Können Sie mir sagen, wie man mit 3 Sprachen verfahren muss?
Sie schreiben, dass man den String machen muss, damit übersetzt wird. Soweit alles klar.
Wir mache ich das, wenn ich eine Übersetzung engl. / deutsch und eine Übersetzung Englisch / italienisch habe. Wie wird die richtige Datei ausgewählt und wie gebe ich die an?
Würde mich sehr freunen, wenn Sie mir weiterhelfen könnten.
Schönen Gruß aus Südtirol
Christoph Taschler
30. September 2009
Hallo Christoph,
wenn das Theme rightig vorbereitet ist, empfehle ich zur Erstellung neuer Übersetzungen das Plugin Codestyling Localization. Das Plugin legt alle nötigen Dateien an und Du kannst alle Sprachen übersichtlich verwalten.
Viele Grüße aus Spanien,
Simon [ThemeShift]
1. Oktober 2009
Danke für die Nachricht.
Wollte das Theme Modern Clix mit Codestyling Localization lokalisieren, anscheindend ist dies “hart” progammiert und das Plugin versagt den Dienst. Ich wäre als Anfänger auch damit zufrieden, die paar php-Dateien händisch durchzuarbeiten, denn das ist ja schnell geschehen. Praktisch hätte ich gerne bei folgendem String All rights reserved. wenn der Besucher der Webseite auf “deutsch” klickt, folgende Ausgabe auf der Webseite: “Alle Rechte vorbehalten”, wenn der Besucher auf italienisch klickt: “Tutti i diritti riservati”. Lässt sich sowas mit einem einfachen Code lösen?
18. Januar 2010
Ich verstehe das mit dem Laden der Sprachdatei noch nicht richtig. Probiere gerade ein freies WOO Theme aus, bei dem in einem Ordner languages bereits eine deutsche mo-Datei enthalten ist.
Wo sollte diese Datei hinkopiert werden?
Muss ich sie umbenennen?
Beim Aufruf der Sprachdatei, muss dann in den Namen des Themes geändert werden, unverändert bleiben oder den kompletten Dateinamen inkl. der Dateiendung enthalten?
Ist wahrscheinlich so simpel, dass ich es nirgendwo finden kann …
Danke für Eure Hilfe
19. Januar 2010
Ich nochmal … hab mich wohl unverständlich ausgedrückt.
Also ich probiere gerade das wirklich schicke WooTheme Irresistible aus, das man hier herunterladen kann: http://www.woothemes.com/2009/02/irresistible/
Läuft auch auf der aktuelle WP Release 2.9.1 wunderbar. Nur, dass es leider auf englisch ist. Die deutschen po/mo dateien liegen zwar in einem Ordner languages (und sind auch tatsächlich mit den deutschen Übersetzungen gefüllt), aber werden nicht integriert.
Nun hab ich bereits das Laden der Text-Datei mit dem von Simon angegeben Codeschnipsel im Header probiert … sowohl wortwörtlich wie auch mit ersetzen von ‘my_theme_name’ mit ‘irresistible’. Geht aber nicht.
Vielleicht hat jemand von Euch das gleiche Problem gelöst?