In dieser Serie geht es darum, ein WordPress-Theme zu erstellen – von Grund auf. Der sechste Teil ist ein kleiner Exkurs und beschäftigt sich damit, wie ihr ein Theme für die Übersetzung vorbereiten könnt.
Wenn ein Theme in das Theme-Directory von wordpress.org hochgeladen werden soll, müssen alle sichtbaren Strings englisch sein. Es wäre natürlich schön, wenn unser Theme auch die Möglichkeit bietet, in andere Sprachen – etwa Deutsch – übersetzt zu werden.
Um eine Übersetzung nach Fertigstellung des Themes zu ermöglichen, müssen sämtliche Zeichenketten, die übersetzbar sein sollen, innerhalb einer gettext-Funktion stehen. Dabei gibt es zwei Arten: mit und ohne Kontext für den Übersetzer.
Übersetzung ohne Kontext-Hilfe in eindeutigen Fällen
Bei einigen Zeichenketten braucht der Übersetzer keinen Kontext, um die richtige Übersetzung zu erstellen. Im letzten Teil der Reihe haben wir beispielsweise für Nutzer mit einer bestimmten Berechtigung im Footer einen Link für die Bearbeitung eines Beitrags ausgegeben:
edit_post_link( __( 'Edit', 'bornholm' ), '<span class="edit-link"> · ', '</span>' );
Code-Sprache: JavaScript (javascript)
Wichtig für die Übersetzungsfähigkeit ist dabei dieser Teil:
__( 'Edit', 'bornholm' )
Code-Sprache: JavaScript (javascript)
Die __()
-Funktion (mit zwei Unterstrichen) ist ein Aufruf der translate()
-Funktion. Diese Funktion erwartet als ersten Parameter den zu übersetzenden String und als zweiten die Angabe einer Domain. Die Domain muss innerhalb eines Themes immer gleich sein (eine Ausnahme davon ist beispielsweise ein Framework, das eine eigene Übersetzung mitbringt) und mit dem Wert für Text Domain
in der style.css
übereinstimmen. Das ist bei uns bornholm
. Damit ist dieses Wort für die Übersetzung vorbereitet.
Wenn ihr den String gleich ausgeben möchtet und nicht für die weitere Verwendung benötigt, wie im Beispiel oben als Parameter für eine Funktion, könnt ihr die _e()
-Funktion nutzen:
_e( 'Posted in ', 'bornholm' );
Code-Sprache: JavaScript (javascript)
In diesem Beispiel, ebenfalls aus dem fünften Teil der Reihe, möchten wir die Zeichenkette Posted in
oder deren Übersetzung ausgeben. Wir übergeben wieder ganz normal den zu übersetzenden String und die Text-Domain. Der Unterschied zu der __()
-Funktion ist, dass in der _e()
-Funktion folgende Zeile steht:
echo translate( $text, $domain );
Code-Sprache: PHP (php)
Bei der Funktion mit den zwei Unterstrichen steht statt des echo
ein return
.
Als letzten Fall für die Übersetzung ohne Kontext gibt es noch die Singular-/Plural-Form. Einige Strings verändern sich, je nach übergebener Anzahl. Etwas vereinfacht haben wir da in unserem Theme das folgende Beispiel:
printf(
_n( 'This gallery contains %1$s photo.', 'This gallery contains %1$s photos.', $total_images, 'bornholm' ),
number_format_i18n( $total_images ) );
Code-Sprache: PHP (php)
In erster Linie geht es uns dabei um die mittlere Zeile. Die _n()
-Funktion ruft die translate_plural()
-Methode der Translations
-Klasse auf. Als Parameter wird zuerst die Singular-Form übergeben, gefolgt von der Plural-Form, einer Zahl und der Text-Domain. Wenn die Zahl in $total_images
größer als 1
ist, wird die Plural-Variante ausgegeben.
Übersetzung mit Kontext für die Übersetzer
In einigen Fällen sollten die Übersetzer den Kontext der Übersetzung kennen, um eine Zeichenkette korrekt übersetzen zu können. In unserem Theme ist das beispielsweise bei dem angepassten Weiterlesen-Link der Fall, da sich der Übersetzer nicht zangsweise erschließen kann, was für %s
eingesetzt wird:
$text = _x( 'Continue reading “%s”', 's = post title', 'bornholm' );
Code-Sprache: PHP (php)
Die Funktion _x()
ruft die translate_with_gettext_context()
-Funktion auf und gibt das Ergebnis mittels return
zurück. Als Parameter wird zuerst der String für die Übersetzung übergeben, gefolgt von einer Hilfe für den Übersetzer und der Text-Domain. In dem Übersetzungsprogramm Poedit sieht das dann so aus:
Neben dieser Funktion gibt es noch äquivalente Funktionen zu den weiteren Gettext-Funktionen ohne Kontext. Mit _ex()
könnt ihr die Übersetzung sofort ausgeben lassen. Auch eine Version für Singluar-/Plural-Versionen gibt es: _nx()
. Zwischen den Nummer-Parameter und die Text-Domain kommt hier der Kontext.
Wenn ihr noch genauere Informationen haben möchtet, beispielsweise die nachträgliche Pluralisierung betreffend, werdet ihr auf der Internationalization-Seite von developer.wordpress.org fündig.
Der Theme-Code auf GitHub
Auch, wenn in dieser Reihe kein neuer Code dazugekommen ist: Hier findet ihr den Code unseres WordPress-Themes auf GitHub.
Die weiteren Teile meiner WordPress-Reihe:
- Das eigene WordPress-Theme erstellen – #1: Vorbesprechung und Vorbereitung
- Das eigene WordPress-Theme erstellen – #2: Die style.css und die Metadaten eures Themes
- Das eigene WordPress-Theme erstellen – #3: Die header.php und der Kopf eures Themes
- Das eigene WordPress-Theme erstellen – #4: Die index.php und die Post-Loop
- Das eigene WordPress-Theme erstellen – #5: Die content.php
- Das eigene WordPress-Theme erstellen – #7: Die Sidebar und der Footer
- Das eigene WordPress-Theme erstellen – #8: Menü, Sidebars und Theme-Support in der functions.php
- Das eigene WordPress-Theme erstellen – #9: Die Einzelansicht der Beiträge und Galerien in der single.php
- Das eigene WordPress-Theme erstellen – #10: Die Galerie-Sidebar mit Galerien aus derselben Kategorie
- Das eigene WordPress-Theme erstellen – #11: Der Kommentarbereich
- Das eigene WordPress-Theme erstellen – #12: Die Galerie und ihre Ansicht in der Blog-Übersicht
- Das eigene WordPress-Theme erstellen – #13: Die Archiv-Ansichten
- Das eigene WordPress-Theme erstellen – #14: Einzelansicht einer Seite und das 404-Template
- Das eigene WordPress-Theme erstellen – #15: Die alternative Startseite
- Das eigene WordPress-Theme erstellen – #16: Die Portfolio-Ansicht
- Das eigene WordPress-Theme erstellen – #17: Die Theme-Widgets
- Das eigene WordPress-Theme erstellen – #18: Der Customizer
- Das eigene WordPress-Theme erstellen – #19: Die Customizer-Einstellungen im Theme anwenden
- Das eigene WordPress-Theme erstellen – #20: Fertigstellung und Hochladen ins Directory
Dieser Beitrag ist eine Übernahme meines Beitrags für t3n.de.
hab da mal eine frage... Theme check meckert immer das er nix findet...
ich hab meine sogenannte Text Domain in einer Constante stehen... somit kann ich es schneller ändern falls... 😉 muss ich es jetzt jedesmal in einen String schreiben?
define ( 'LS_THEME', 'irgendeinname' );
_e( 'Phone', LS_THEME );
gruss
M
Hi Markus,
genau, du musst es als String schreiben, nicht als Variable oder Konstante:
Mark hat das in seinem Beitrag noch etwas weiter ausgeführt 🙂
Viele Grüße,
Florian