Das eigene WordPress-Theme erstellen – #6: Das Theme auf die Übersetzung vorbereiten

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:

Übersetzung mit Kontext in Poedit. (Screenshot: Poedit)
Übersetzung mit Kontext in Poedit. (Screenshot: Poedit)

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:

Dieser Beitrag ist eine Übernahme meines Beitrags für t3n.de.

2 Reaktionen zu »Das eigene WordPress-Theme erstellen – #6: Das Theme auf die Übersetzung vorbereiten«

  1. 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

    1. Hi Markus,

      genau, du musst es als String schreiben, nicht als Variable oder Konstante:

      „GNU gettext is not a PHP parser. It can’t read variables or constants. It only reads strings. So your text domain strings needs to stay hardcoded as actual quoted strings.“

      Mark Jaquith in seinem Blog

      Mark hat das in seinem Beitrag noch etwas weiter ausgeführt 🙂

      Viele Grüße,
      Florian

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert