WordPress-Themes für Mehrsprachigkeit und Übersetzungen vorbereiten

In vielen Fällen soll ein WordPress-Theme nicht nur in einer Sprache funktionieren. Damit darin verwendete, feste Textbestandteile in verschiedenen Sprachen ausgegeben werden können, müssen diese auf eine bestimmte Weise in Theme-Dateien eingebunden werden. Im Folgenden erklären wir, wie du Themes übersetzbar machst, wie du Übersetzungen erzeugst und wie du diese dem Theme anfügen kannst.

Grundlagen zur Internationalisierung in WordPress

Das Ermöglichen von Übersetzungen in Code wird Internationalisierung genannt. Üblich ist auch die Abkürzung »i18n«, die sich aus den 18 Buchstaben zwischen dem i und dem n des englischen Begriffs Internationalization ableitet. WordPress verwendet dafür die freie Bibliothek GNU gettext und stellt darauf basierende Funktionen zur Verfügung, um Texte in diversen Bestandteilen (Core, Theme, Plugin etc.) übersetzbar zu machen.

Text im Code wird üblicherweise in englischer Sprache verfasst. Damit diese Texte in andere Sprachen übertragbar sind, müssen sie entsprechend der Vorgaben von WordPress bzw. gettext im Code eingebunden werden.

Sprachvarianten in POT-, PO- und MO-Dateien organisieren

Übersetzbare Texte werden von gettext in .pot-Dateien (Portable Object Template) geschrieben. Diese bilden die Vorlagen für die tatsächlichen Sprachvarianten. Daraus lassen sich .po-Dateien (Portable Object) generieren, welche jeweils die originalen Zeichenketten sowie die tatsächlichen Übersetzungen für eine bestimmte Sprache enthalten.

Die Dateien müssen gemäß der ICU-Locale der gewünschten Übersetzung benannt werden, die sich aus eine Kombination von Sprach- und Länder-ID ergibt. Für die deutsche Sprache kann es also z. Bsp. die Dateien de_DE.po, de_AT.po sowie de_CH.po geben, um landesspezifische Übersetzungen für Deutschland, Österreich und die Schweiz abzubilden. Für formale Varianten (»Sie« statt »Du«) kann eine Übersetzung in de_DE_formal.po gespeichert werden.

Damit WordPress die Übersetzungen verwenden kann, müssen diese außerdem zwingend im .mo-Format (Machine Object) vorliegen, welches für jede Übersetzung durch Software automatisiert aus den .po-Dateien erstellt werden muss.

Für ein Theme, dass wir selbst entwickeln, folgen wir der Empfehlung der Dokumentation und hinterlegen all diese Dateien im Verzeichnis /languages innerhalb des Theme-Verzeichnisses.

Weitere Informationen zur Internationalisierung von WordPress finden sich im Theme Handbooks.

Textbestandteile übersetzbar machen

Textbestandteile, die ohne besondere Auszeichnung im Code stehen, lassen sich nicht übersetzen. Um Übersetzbarkeit zu ermöglichen, müssen Zeichenketten durch eine Lokalisierungsfunktion geleitet werden. Nur so können sie geparst und schließlich übersetzt werden.

Der Grundaufbau eines übersetzbaren Strings sieht so aus:

 __('Text in original language', 'text-domain');

Innerhalb der Übersetzungsfunktionen stehen der Text, der übersetzbar sein soll, sowie eine Textdomain. Die Textdomain für Themes wird mit der Angaben Text Domain in der Datei styles.css definiert.

/*!
Theme Name: Theme-Name
Text Domain: text-domain
// weitere Angaben …
*/

Durch die Verwendung einer einheitlichen Domäne können alle Strings eines Themes miteinander assoziiert und gemeinsam übersetzt werden. Das ist ratsam, um den Überblick zu behalten. Die Funktion _e() ist äquivalent zu echo __() und kann benutzt werden, wenn Text direkt ausgegeben werden soll.

// nicht übersetzbar
<h1>This is a headline</h1>

// übersetzbar
<h1><?php _e('This is a headline', 'text-domain'); ?></h1>

Wörter abhängig vom Kontext unterschiedlich übersetzen

Für den Fall, dass der selbe Begriff in abweichenden Zusammenhängen unterschiedlich übersetzt werden soll, steht die Funktion _x() zur Verfügung. Dabei wird zwischen Text und Domäne zusätzlich der Kontext als Parameter übergeben, welcher als Hinweis an den Übersetzer übergeben wird.

_x('order', 'sequence', 'text-domain');
_x('order', 'restaurant', 'text-domain');
_x('order', 'tidy', 'text-domain');

Dynamische Inhalte übersetzen

Wenn dynamische Daten innerhalb einer statischen, übersetzbaren Zeichenfolge übergeben werden sollen, muss die Übersetzungsfunktion mit den PHP-Funktion printf() bzw. sprintf() kombiniert werden. Damit können wir Variablen in Zeichenketten einfügen. Die Zeichenkombination %s muss vorhanden sein (auch in den Übersetzungsdateien) und wird durch den Wert der Variablen ersetzt.

printf(__('Phone number: %s.', 'text-domain'), $phone_number);

Singular und Plural unterscheiden

Wenn sich die Strings für Singular und Plural unterscheiden, muss die Funktion _n() zum Einsatz kommen. In diesem Fall werden Singulartext, Pluraltext, die Anzahl sowie die Textdomain an die Funktion übergeben, wobei die Anzahl eine Variable ist, deren Wert bestimmt, ob die Singularform (Wert = 1) oder die Pluralform (Wert > 1) ausgegeben wird.

printf(
   _n('%s person', '%s people', $count, 'text-domain'), 
   number_format_i18n($count)
);

Auf diese Weise lassen sich neben Texten, die Besuchenden der Website angezeigt werden, auch Texte im Redaktionsbereich übersetzbar machen. Das kann bspw. beim Anlegen von Custom Taxonomies oder Custom Post Types sinnvoll sein.

// Registrierung eines neuen Post Types in WordPress mit entsprechenden Beschriftung im WordPress-Admin-Bereich
 
register_post_type('custom', array(
   'label' => __('Custom Items', 'text-domain'),
   'description' => __('Contains all Custom Items', 'text-domain'),
   // weitere Argumente …
));

In der WordPress-Dokumentation sind weitere Übersetzungsfunktionen beschrieben, die in bestimmten Kontexten verwendet werden können oder sollten.

Themes und Plugins übersetzen

Wenn ein WordPress-Theme oder -Plugin korrekt für die Internationalisierung umgesetzt ist, müssen die darin enthaltenen, typischerweise in Englisch verfassten, übersetzbaren Textbestandteile noch als Übersetzungsvorlage zur Verfügung gestellt und in gewünschte Sprache(n) überführt werden.

Es gibt Plugins, mit denen Übersetzungen direkt im Admin-Bereich der WordPress-Installation bearbeitet werden können. Wir arbeiten i.d.R. nicht damit, da Sprachdateien für uns zum Theme gehören und nicht zu den redaktionellen Inhalten einer Website.

Mit Desktopanwendungen wie Poedit können wir die Arbeitsschritte in der lokalen Entwicklungsumgebung durchführen. Das kann sinnvoll sein, wenn bspw. Änderungen and Übersetzungen in der Versionsverwaltung erfasst werden sollen.

Screenshot von PoEdit mit einem Beispiel für eine Übersetzung in WordPress von Englisch nach Deutsch. Zu sehen ist der String »Page not Found« mit der Übersetzung »Seite nicht gefunden«
Beispiel für eine Übersetzung von Englisch nach Deutsch in der kostenfreien Version von PoEdit

Die verwendete Software durchsucht das Theme nach übersetzbaren Strings und erstellt automatisch die Vorlagendatei, die mit dem Namen der Textdomain in Theme-Ordner (z.Bsp. text-domain.pot) gespeichert werden kann. Auf Grundlage dieser Datei können nun mit der oben beschriebenen Namenskonvention sprach- und länderspezifische Übersetzungen angelegt und ebenfalls im Theme hinterlegt werden.

Sprachdateien aus dem Theme-Verzeichnis laden

Die generierten Sprachdateien können in einem beliebigen Ordner im Theme abgelegt werden. Es ist zu beachten, dass sie mit der Funktion load_theme_textdomain() geladen werden müssen, damit sie wirksam werden können. Dieser Eintrag erfolgt in der Datei functions.php. Liegen die Übersetzungsdateien im Theme-Root, muss der Pfad nicht angegeben werden. Wird dafür ein Theme-Unterordner benutzt, muss der vollständige Pfad angegeben werden.

// Sprachdateien aus dem Theme-Root laden
load_theme_textdomain('kb')

// Sprachdateienaus dem Theme-Ordner '/languages' laden
load_theme_textdomain('kb', get_template_directory() . '/languages' ); 

Sobald die Sprachdateien vorliegen und korrekt eingebunden sind, werden die Theme-Strings entsprechend übersetzt angezeigt.

Geschrieben von Konstantin Hanke

Benutzerbild

Konstantin arbeitet als Webentwickler bei kulturbanause. Seine Hauptaufgabe ist die technische Umsetzung von klaren, soliden und effizienten Webauftritten und Website-Komponenten. Darüber hinaus kümmert er sich um die Wartung, Optimierung und Weiterentwicklung von bestehenden Websites. Sein besonderes Interesse gilt der Idee von quelloffener, freier Software.

Feedback & Ergänzungen – 2 Kommentare

  1. Christopher Seidel
    schrieb am 26.10.2020 um 16:53 Uhr:

    Super geschriebener und informativer Artikel :-). In diesen Blog werde ich mich noch richtig einlesen

    Antworten
  2. Michaela Bär Words on Adventure
    schrieb am 26.06.2019 um 10:24 Uhr:

    Ich bin zufällig auf Deinen Blog gestoßen. Endlich etwas, das mir wirklich hilft. Natürlich habe ich diverse Möglichkeiten schon hinter mir, aber erst jetzt bin wirklich der Lösung einen Schritt näher. Ich hatte vorher schon diverse Plugins im Einsatz, die mir den Content total verschoben haben. Die Grafik hat es super zerschossen. Wieso weiß ich nicht. Mit der Lösung komm ich sicherlich weiter. Es wird bestimmt 2019 nicht mehr ganz so aktuell sein, aber alles andere klappt nicht. Danke für diesen wertvollen Beitrag ich werde das gleich mal weiterleiten an Kollegen. Viele Grüße, Michaela

    Antworten

Kommentar zu dieser Seite

Wir freuen uns über Anregungen, Ergänzungen oder Hinweise zu Fehlern. Wir lesen jeden Eintrag, veröffentlichen aber nur, was den Inhalt sinnvoll ergänzt.

WordPress-Projekte mit kulturbanause

Wir wissen wovon wir reden. Wir setzen WordPress seit über 10 Jahren erfolgreich ein und realisieren maßgeschneiderte Websites auf Basis dieses großartigen CMS.

WordPress-Leistungsangebot →

Schulungen von kulturbanause

Wir bieten Seminare und Workshops zu den Themen Konzept, Design und Development. Immer up-to-date, praxisnah, kurzweilig und mit dem notwendigen Blick über den Tellerrand.

Übersicht Schulungsthemen →