WordPress-Themes für Mehrsprachigkeit und Übersetzungen vorbereiten
Um Textbestandteile eines WordPress-Themes übersetzbar zu machen, müssen Theme-Dateien entsprechend vorbereitet und Übersetzungsvorlagen angelegt werden.
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.
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.
Super geschriebener und informativer Artikel :-). In diesen Blog werde ich mich noch richtig einlesen
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