Tutorial: WordPress-Themes lokalisieren

5. Februar 2009 - Tutorials, WordPress, WordPress Funktionen - 20 Kommentare

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

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

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:

Autor

Moin, ich bin Simon und ehemaliger Betreiber dieses Blogs.

RSS abonnieren

und so weiter...

Kommentare

  • FirstDayBlack - am 5. Februar 2009 - Antworten

    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.

    • Simon [webdemar] - am 5. Februar 2009 - Antworten

      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.

  • FirstDayBlack - am 5. Februar 2009 - Antworten

    Die Premium themes kommen fast alle aus Amiland und die scheren sich einen %&%$§ um andere Sprachen

    • Micha - am 10. Dezember 2010 - Antworten

      Seit deinem Kommentar sind jetzt fast zwei Jahre vergangen und in der Zwischenzeit hat sich da scheinbar viel geändert. Ich habe mich in den letzten Tagen mit der Auswahl eines WordPress-Themes beschäftigt und die Erfahrung gemacht, dass auch die amerikanischen Hersteller von Premium-Wordpress-Themes inzwischen schön sauber die Lokalisierungsfunktionen nutzen. Nur die deutsche Sprachdatei musste ich noch selbst erstellen. Probleme bereiten mir derzeit allerdings die Plugins, von denen viele scheinbar noch nicht so weit sind. Dort im Code rum zu übersetzen ist mir nicht geheuer, weil ich das nicht bei jedem Plugin-Update tun will. Naja, mal sehen.

  • Simon [webdemar] - am 5. Februar 2009 - Antworten

    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 ;-)

  • sokai - am 5. Februar 2009 - Antworten

    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

    • Simon [webdemar] - am 5. Februar 2009 - Antworten

      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.

  • kaiser - am 23. August 2009 - Antworten

    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 ;)

  • Christoph Taschler - am 30. September 2009 - Antworten

    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

    • Simon [webdemar] - am 30. September 2009 - Antworten

      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]

  • Christoph Taschler - am 1. Oktober 2009 - Antworten

    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?

  • Nils - am 18. Januar 2010 - Antworten

    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

  • Nils - am 19. Januar 2010 - Antworten

    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?

  • Wolfgang - am 21. Mai 2010 - Antworten

    wenn man jetzt mehrere .mo dateien hat ( de_DE, en_EN us.w ) ist es möglich, dass sie automatisch per Header ausgewählt werden?

    also englishsprachiger Browser => en_EN

    oder das der user seine sprache auswählt.

  • Ramon Pose - am 2. September 2010 - Antworten

    Guten Tag

    Hoffe du kannst mir weiterhelfen….! Ich habe soziemlich alles versucht bin aber bis anhin gescheitert, was eigentlich nicht verwunderlich ist, da ich auch nicht sehr versiert bin. Ich hab WPML installiert und in meinem K2 mit dem k2 Hook Up einen Link eingefügt. Dies soll mal mein Headermenu werden ” KONTAKT JOBS SITEMAP”. Da meine Website auf Deutsch (Standard), Englisch und Französisch geführt wird, muss ich diese Menüpunkte ja auch übersetzen. Nun ich hab gedacht, dass WPML diese finden wird. Doch mittlerweile hab ich begriffen, das hierzu ein string erstellt werden muss. Nur bekomm ich es nicht hin, dass ich in der WPML mein String erhalte zur Übersetzung :-(

    für jede hilfe bin ich dankbar

    meine domain: http://www.chezleisi.ch

  • Nicoletta - am 2. Dezember 2010 - Antworten

    Fantastischer Artikel, vielen Dank!

    Ich hab ein Theme mit WPML mehrsprachig machen wollen. WPML bietet zwar eine tolle Dokumentation, aber leider nicht für den Part wie man das Theme überhaupt darauf vorbereitet. Vor allem die Erläuterung was denn nun eigentlich eine Textdomain ist, ist der WPML-Doku ausgesprochen dürftig.

  • Paul Neuhaus - am 15. Januar 2011 - Antworten

    Erstmal danke für die Anleitung.

    Eine kurze Frage (in der Hoffnung, dass der Kommentar noch Beachtung findet..):

    Was passiert, wenn ich Werte umstelle? Beispiel: In der comments.php lautet ein String:
    follow the $php-Befehl comments_rss_link (‘feed’)
    Ich habe daraus direkt in der php-Datei
    $php-Befehl comments_rss_link (‘Feed’) abonnieren
    gemacht. D.h. Ich habe die Reihenfolge vertauscht.
    Wird das von einer externen Sprachdatei auch unterstützt?

    Danke.

  • Tom - am 21. Januar 2011 - Antworten

    Habe mit Codestyling Localization jetzt das Theme “Third Style” übersetzt. Ging auch richtig einfach. Weiß denn jemand, ob ich die Übersetzung irgendwo auch der Allgemeinheit übermitteln kann?

Trackbacks

Deine Meinung