In diesem Beitrag möchte ich aufzeigen, wie ein WordPress Theme auch international genutzt werden kann. Besonders im Hinblick auf mehrsprachige Webseiten, macht es Sinn das eigene Theme in mehreren Sprachen zu übersetzen.
In meinen Schulungen kommt häufig die Frage auf, wie man bestehende Themes oder auch wie man selbsterstellte WordPress Themes für die Lokalisierung vorbereitet. WordPress bietet uns optimale Bedingungen Themes zu übersetzen, ohne das man für jede weitere Sprache noch mal an den Quellcode ran muss.
Überblick der Schritte
- Laden der Textdomain
- Textbausteine in WordPress-Funktionen
- Sprachdateien erstellen
- Übersetzen
- Testen
Laden der Textdomain
Zuerst müssen wir WordPress mitteilen, dass unser Theme übersetzbar ist.
Wir fügen folgendes in die functions.php ein:
load_theme_textdomain('mp_theme_textdomain', get_template_directory() . '/languages');
„mp_theme_textdomain“ ist hier unsere Textdomain, die einzigartig sein sollte. Am besten eignet sich hier der Theme-Name als Identifikator. Das zweite Argument in der Funktion definiert den Ordner, wo die Sprachdateien abgelegt werden. Damit die Textdomain auch für das Theme geladen wird, müssen wir diese in der Setup-Funktion aufrufen.
add_action('after_setup_theme', 'marketpress_theme_setup'); function marketpress_theme_setup(){ load_theme_textdomain('mp_theme_textdomain', get_template_directory() . '/languages'); }
„marketpress_theme_setup“ ist hier exemplarisch für die Setup-Funktion. Bei einem bestehenden Theme, kann die Bezeichnung abweichen.
Textbausteine in WordPress-Funktionen
Als nächsten Schritt definieren wir die Textbausteine, die WordPress dann später laden soll. Außerhalb von PHP Funktionen nutzen wir _e($text_message);
und innerhalb von PHP Funktionen __(&text_message);
. Findet WordPress keine Übersetzung für $text_message wird der Original Textbaustein ausgegeben.
echo 'Hello user';
wird zu
_e('Hello user','mp_theme_textdomain');
Die zweite Variante findet Verwendung innerhalb von Funktionen.
the_content( 'Read more' );
wird zu
the_content( __('Read more','mp_theme_textdomain') );
Manchmal enthalten Textbausteine dynamische Daten wie bspw. eine Ziffer oder Begriffe. In diesem Fall bedienen wir uns der sprintf
PHP Funktion um die endgültige Ausgabe des Textbausteins zu steuern.
$results_found = 12; $message = sprintf( __('%s results found' , 'mp_theme_textdomain') , $results_found );
Singular und Plural
WordPress ermöglicht uns auch Textbausteine in Einzahl oder Mehrzahl auszugeben. Dies ist häufig erforderlich, wenn Ergebnisse ausgegeben werden wie beispielsweise bei Suchergebnissen.
if($results_found == 1) $message = __('1 result found' , 'mp_theme_textdomain'); else $message = sprintf( __('%s results found' , 'mp_theme_textdomain') , $results_found );
Sprachdateien erstellen
Damit WordPress weiß, welcher Textbaustein wie übersetzt dargestellt werden soll, müssen wir eine Liste erstellen. Es gibt drei Dateiformen.
- Die .POT Datei enthält alle übersetzbare Textbausteine
- Die .PO Datei enthält alle übersetzbare und übersetzte Textbausteine
- Die .MO Datei ist eine binäre Datei mit gleichem Inhalt wie die .po, die nur von WordPress gelesen werden kann
Als ersten Schritt erstellen wir die Katalog-Datei .POT mit dem Programm Poedit.
1. Öffne Poedit und erstelle einen neuen Katalog
2. Fülle die Informationen zum Übersetzungsprojekt aus
3. Im Tab „Pfade“ wird dem Programm aufgezeigt, wo gesucht werden soll. Diese Ordner verhalten sich relativ zum Ordner /languages/ innerhalb des Theme-Ordners
4. Im Tab „Schlüsselworte“ geben wir die Funktionsaufrufe __
und _e
ohne Klammern ein.
5. lassen wir Poedit nach den definierten Textbausteinen suchen und erhalten eine Liste, die wir dann übersetzen können.
6. Die .pot Datei wird dem Theme-Namen entsprechend im Ordner /mytheme/languages/ gespeichert.
Diese Datei wird zwar nicht von WordPress benötigt, dient aber als Katalog für weitere Übersetzungen.
Übersetzen
Jetzt geht es ans fröhliche Übersetzen. Sobald alle Textbausteine übersetzt sind, müssen wir das als de_DE.po im Ordner /languages/ im Theme-Ordner abspeichern. Poedit generiert automatisch eine .mo Datei, die von WordPress benötigt wird.
Testen
Sobald die Sprachdateien im Theme-Ordner abgelegt wurden, können wir das im Frontend testen. Sofern in der wp-config.php auch die Sprache mit de_DE definiert wurde.
Zusammenfassung
Wir haben nun mit einfachen Schritten unser Theme für die Lokalisierung vorbereitet. Dies bringt einen deutlichen Mehrwert für das eigene Projekt, sowie für andere WordPress Nutzer, die dein Theme gerne nutzen möchten.
Nachtrag
Torsten hat in seinem Kommentar noch die Slides von Samuel „Otto“ Wood als weitere Referenzquelle empfohlen. Für alle, die sich ausführlich mit der Thematik beschäftigen möchten.
Sehr schöne Einführung, Birgit!
Wer danach noch mehr wissen möchte, dem empfehle ich die Slides von Sam ‘Otto’ Wood vom WordCamp Europe zum Weiterlesen:
http://wceu2013.ottopress.com
Danke dir Torsten 🙂
Ja, die Slides von Samuel sind wirklich eine gute Ergänzung.
Danke Birgit, das versteht selbst der größte DAU! 🙂
PS: Da ist ein kleiner Verwechsel im Text. Der Satz muss so lauten:
“Außerhalb von PHP Funktionen nutzen wir _e($text_message); und innerhalb von PHP Funktionen __(&text_message);.”
Hierfür bietet der Core noch weitere nützliche Funktionen an:
_n( $single, $plural, $number, $domain )
Auf das Beispiel angewendet:
@Heiko: danke für den Hinweis. Ist geändert.
@Dominik: genau für solche Abkürzungen liebe ich WordPress. 🙂
Hallo! Ich habe ein benutzerfreundliche, webbasierte Lokalisierungstool um WordPress Themen zu übersetzen gefunden – https://poeditor.com/ Es gibt sogar ein Plugin, das integriert die POEditor API in Ihre WordPress – http://wordpress.org/extend/plugins/poeditor/ Ich empfehle es.