Wie erstelle ich ein sprachunabhängiges WordPress-Theme (Teil 2)
Im 1. Teil der Artikelserie haben wir ja erfahren wie wir die statischen HTML-Texte automatisch übersetzen lassen können. Heute kümmern wir uns um die Ausgaben von php.
Zuerst müssen wir wieder alle Dateien unseres Themes durchforsten. Diesmal suchen wir aber nach den Befehlen echo, printf() oder sprintf(). Hier müssen wir die Text ebenfalls durch die passende Übersertzungsfunktion von WordPress laufen lassen.
1. Der echo-Befehl
Dieser ist einfach zu internationalisieren. Schauen wir uns auch diesen Code an einem Beispiel an. wir sehen hier die typische Ausgabe mit echo-Befehlen.
1 2 3 4 5 6 7 | ...
} elseif (is_archive() && !is_category()) {
echo "<li> » Archive</li>";
} elseif ( is_search() ) {
echo "<li> » Suchergebnisse</li>";
}
... |
In der Folge müssen wir den Befehl mit der Funktion _e($text) ersetzen. Erinnerst Du dich, dass diese Funktion von WordPress, den im Parameter übergebenen Text ersetzt und gleich ausgibt? Ja, klar! Damit ist Dir auch klar was wir machen müssen und warum der folgende SourceCode in den Zeile #3 und #5 so verändert wurde.
1 2 3 4 5 6 7 | ... } elseif (is_archive() && !is_category()) { _e("<li> » Archive</li>"); } elseif ( is_search() ) { _e("<li> » Suchergebnisse</li>"); } ... |
Ich bevorzuge es, wenn es irgendwie geht, keine HTML-Tags direkt in den zu übersetzenden Texten zu haben. Daher würde ich den Code mit der Funktion __($text) ergänzen und den echo-Befehl weiter verwenden. Dadurch habe ich wirklich reinen Text der übersetzt wird.
1 2 3 4 5 6 7 | ... } elseif (is_archive() && !is_category()) { echo "<li>".__(" » Archive")."</li>"; } elseif ( is_search() ) { echo "<li>".__(" » Suchergebnisse")."</li>"; } ... |
2. Die Übersetzung von Texten mit Parametern
Hier kommen die beiden Befehle printf() und sprintf() ins Spiel. Sie unterscheiden sich nur durch die direkte Ausgabe oder durch die Rückgabe des Textes als formatierten String. Eine Esselbrücke ist das s am Anfang des Befehls. Du kannst es Dir als silent oder still merken. Damit hast Du eine Idee, was der Befehl tut. Er gibt den formatierten String als Variable zurück.
Vorhandene php-Befehle ergänzen
Wenn Du einen Ausgabe-Befehl findest, musst Du eigentlich nur den ersten Parameter (den Text) der beiden Befehle mit der __($text) Funktion klammern. Das wars dann auch schon. In einem Beispiel sieht das so aus.
1 2 3 4 5 | ...
<p><img src='/wp-content/themes/guru_02/images/binfo_user.png' alt='User' />
< ?php printf(" Momentan sind %d Benutzer und %d Gäste online!", $userCount, $guestCount); ?>
</p>
... |
Und hier der überarbeitete Code
1 2 3 4 5 | ...
<p><img src='/wp-content/themes/guru_02/images/binfo_user.png' alt='<?php __('Benutzer'); ?/>' />
< ?php printf(__(" Momentan sind %d Benutzer und %d Gäste online!"), $userCount, $guestCount); ?>
</p>
... |
Variablen Text neu erstellen
Leider wirst Du im Theme aber auch Code-Passagen entdecken, die nicht so einfach zu behandeln sind. Da werden mit dem echo-Befehl Ausgabestrings zusammengestellt, die für sich alleine einfach nicht sauber zu übersetzen sind. Denk immer daran, dass Du irgendwann eine Liste der Texte einem Native-Speaker zur Übersetzung geben sollst. Wie soll der aus einzelnen Worten einen sinnvollen Text zusammenbasteln? Daher werden wir das ganze einfach umbauen und uns das Leben leichert machen. Ich probiere auch, soviele gleiche Texte zu verwenden wie möglich. Dann muss nicht jeder Satz neu übersetzt werden, sondern es können viele Dinge einfach wiederverwendet werden. Schauen wir uns den folgenden Code an. Hier wird einfach ein Satz, welcher mit Variablen ergänzt wird, ausgeben.
1 2 3 4 5 | ... echo "<p><img src='/wp-content/themes/guru_02/images/binfo_posts.png' alt='Posts' />". " Seit 2007 wurden ".$postPub. " Posts veröffentlicht & es werden '.$postFut.' Posts erscheinen.</p>"; ... |
Nun müssen wir den ganzen Text zerlegen und mit einer neuen Funktion ausgeben. Erstens ist es kein guter Stil, wenn HTML-Tags innerhalb von php vorkommen. Diese werden wir also ausgliedern. Und als nächstes benötigen wir die Ausgabe eines formatierten Strings. Dazu haben wir ja den Ausgabebefehl printf($formatString, $Param1, …, $Param#) von php. Dieser Befehl hat als ersten Parameter einen String, welcher Text und Platzhalter für die folgenden Parameter enthält. Für uns reichen wahrscheinlich zwei Typen von Platzhalten. Entweder ist es %s für einen String oder %d für eine Dezimalzahl. Diese Platzhalten werden dann von links nach rechts, durch die angegeben Parameter der Funktion ersetzt. In der Folge wird der formatierte String ausgegeben oder für die Weiterverwendung zurückgegeben. Schauen wir uns das Beispiel im neuen Gewand an.
Du siehst, zuerst wurden die notwendigen ShortTags zur Trennung von HTML und php eingeführt. Nun kommt die printf()-Funktion ins Spiel. Der übergebene Text wird sofort mit einer __() übersetzt. Der erste Parameter %d wird durch den Wert der Variablen $postPublished und der zweite Parameter durch den Wert von $postFuture ersetzt.
1 2 3 4 5 6 7 8 9 10 | ... ?> <p><img src='/wp-content/themes/guru_02/images/binfo_posts.png' alt='Posts' /> < ?php printf(__(" Seit 2007 wurden %d Posts veröffentlicht & es werden %d Posts erscheinen."), $postPublished, $postFuture); ?> </p> ... |
Damit haben wir auch diesen Teil geschafft.
Sonstige Texte übersetzen
Da wir gerade beim durchackern des SourceCodes sind, können wir auch noch die restlichen Werte übersetzen. Gerne werden Text einer Variablen zugewiesen. Im folgenden Beispiel ist es ein Array. Aber es können auch einzelne Variablen sein. Wenn Du darauf stosst, kannst Du diese Texte auch sofort mit der __()-Funktion behandeln.
1 2 3 4 | ... $arrTypeP = array("Benutzer", 'Gäste', 'Crawler'); $nameTag = 'Montag'; ... |
Nachdem Du die Übersetzungsfunktion angewendet hast, sollte Dein Code so aussehen.
1 2 3 4 | ... $arrTypeP = array(__('Benutzer'), __('Gäste'), __('Crawler')); $nameTag = __('Montag'); ... |
Immer denselben Text neu übersetzen?
Das ist wirklich nicht sinnvoll! Denn besonders die Beschriftung von Knöpfen oder Feldnamen in Formularen wiederholt sich immer wieder. Dazu können wir einen kleinen Trick anwenden, denn php kennt sogenannte Konstanten. Dazu legen wir uns im Verzeichnis des aktiven Themas eine Datei mit dem Namen language.php an. In der ersten Zeile schreiben wir, wie immer, <?php und in der letzten Zeile ?>. Damit kann der WebServer die Datei sauber verarbeiten. Als nächstes müssen wir die Datei auch verwenden. Dazu öffnen wir unsere Funktionen-Sammlung, functions.php. Gleich am Anfang, entweder in der Zeile nach <?php oder nach den Kommentarzeilen, binden wir unsere “Sprachdatei” mit folgenden Befehl ein:
... require_once (get_bloginfo('template_directory').'/language.php'); ... |
Nun können wir in der Datei language.php die neuen Konstanten definieren und verwenden. Nehmen wir an, wir brauchen Übersetzungen für Speichern, Abbrechen, Absenden und Suchen, dann sieht das ganze wie folgt aus. Natürlich kannst Du auch noch weitere Konstanten definieren. Wichtig ist, dass Du den Namen der Konstante in Großbuchstaben schreibst (dies ist einfach eine Programmiererübereinkunft) und dass Du denn Wert der Konstantenn sofort mit __() übersetzen lässt.
1 2 3 4 5 6 7 | < ?php //Konstanten zur Uebersetzung des Themes define('BUTTON_SAVE',__('Speichern')); define('BUTTON_CANCEL',__('Abbrechen')); define('BUTTON_SEND',__('Senden')); define('BUTTON_SEARCH',__('Suchen')); ?> |
Wenn Du die Konstanten dann in Dein Theme einbauen willst, kann das so aussehen.
... <input name="submit" type="submit" id="submit" tabindex="5" value="<?php echo BUTTON_SAVE; ?/>" /> ... |
Damit haben wir einen langen 2. Teil für die sprachunabhängigen Themes abgeschlossen. Im nächsten und dritten Teil, werden wir uns um die echte Übersetzung kümmern und wie WordPress erkennt, welche Sprache benötigt wird.
Weitere Posts zu diesem Thema
- Wie erstelle ich ein sprachunabhängiges WordPress-Theme (Teil 1)

Heute ist es ja nicht mehr so, dass wir auf einer Insel der seligen Leben und nur Englisch, Deutsch, Französisch oder was auch immer sprechen. Nein, [...] - Programmieren mit php und mySQL (Strings)
Die Arrays sind soweit erledigt. Diesmal kommen die Strings an die Reihe und es ist ein ziemlich langer Artikel geworden. Denn es gibt eine ganzen Hau [...] - Eine Krümelzeile für WordPress
Anfang 2009 habe ich im Post Hänsel & Gretel hatten auch eine Krümelzeile auf dieses Designelement hingewiesen. Nun ist es so, dass ich für eine U [...] - Hat eine Post-Kategorie übergeordnete Eltern?

Heute hatte ich wieder einmal ein interessante Frage. Natürlich gebe ich sie an euch weiter, denn man kann nie genug über WordPress wissen, oder? Ich [...] - Optimiere Deinen WordPress Blog!
Es ist uns eigentlich klar: Je öfter WordPress die Datenbank abfragen muss, desto langsamer wird das ganze System. Jetzt gibt es zwar einen mächtgen T [...]




Momentan sind 0 Benutzer, 0 Gäste & 0 Crawler online.
Seit 2007 wurden 1090 Posts veröffentlicht & kein Post wird erscheinen.
Es wurden 4625 Kommentare geschrieben & 216 TrackBacks gesetzt.
Es existieren zwei Antworten zu diesem Post
schrieb am 9. 3. 2011 um etwa 8 Uhr:http://www.guru-20.info/2011/03/06/wie-erstelle-ich-ein-sprachunabhangiges-wordpress-theme-teil-1/ Die Verlinkung geht leider nicht mehr in deinem Artikel. Würde mir das gerne mal vollständig durchlesen. Sowas habe ich gebraucht.
schrieb am 9. 3. 2011 um etwa 9 Uhr:Danke für den Hinweis. Ich habe es korrigiert.