*.po und *.mo Sprachdateien erstellen
Für die Realisierung von mehrsprachigen Anwendungen können Entwickler und Programmierer gettext-Funktionen nutzen. Bei GNU gettext handelt es sich um eine GNU-Internationalisierungsbibliothek, die bei vorhandener Installation der Bibliothek von PHP über eine API angesprochen werden kann.
An Hand eines Beispiels, welches den Code für ein sehr einfach gehaltenes Plugin enthält, möchten wir die Vorgehensweise für eine Übersetzung mit Hilfe von WP-Funktionen und *.po/*.mo Sprachdateien erläutern.
Es sei angemerkt, die die Vorgehensweise bei Übersetzung an sich gestaltet sich nicht besonders schwierig, insofern der Entwickler der englischen und der deutschen Sprache mächtig ist. Aber und nun kommt das große Aber, die Ausgabe muss dazu verändert werden und dabei sollte sehr sorgfältig vorgegangen werden, um keine Sicherheitslücken zu schaffen. Auf keinen Fall sollten zum Beispiel WP-Funktionen (wie esc_html und andere) bei einer Umstellung der Ausgabe entfernt werden, falls diese in der Original-Version des Plugins vorhanden waren.
Code für ein kleines Plugin, welches auf allen Seiten eine Zeile mit dem Satz ‘The autumn is golden.’ einblendet:
<?php /** * Plugin Name: Erster Sprachtest * Description: Blendet am Ende des Contents auf allen Seiten den Satz 'The autumn is golden.' ein. */ add_filter( 'the_content', 'erweitere_den_inhalt' ); function erweitere_den_inhalt( $content ) { $erweiterung = '<span style="color: #ffa800">'. esc_html('The autumn is golden.'). '</span>'; return $content.$erweiterung; } ?>
Um nun den in einem Plugin enthaltenen Text zweisprachig auszugeben, müssen zuerst zwei Sprachdateien erstellt werden. Für die Erstellung der *.po/*.mo Sprachdateien eignen sich das Plugin Codestyling Localization und weiterhin der Editor Poedit.
Download bei:
Ob nun dem Plugin oder dem Editor der Vorzug zu geben ist, kann von unserer Seite aus nicht beurteilt werden, da bisher nur der Editor getestet wurde, mit dem auch die Sprachdateien für das Beispiel auf dieser Seite erzeugt wurden.
Vor der Übersetzung wurde eine sprachdatei-de_DE.po mit folgendem Eintrag vorbereitet, wobei der Kommentar mit der Zeilennummer nicht viel mehr als eine Gedächtnisstütze ist, die jedoch anderen Programmierern das Auffinden von einzelnen Textpassagen erleichtert.
#: sprachtest.php:21 msgid "The autumn is golden." msgstr "Der Herbst ist golden."
Aus dieser Datei werden zwei Dateien (eine sprachdatei-de_DE.mo und eine sprachdatei-de_DE.po) erzeugt, wobei folgende Angaben ergänzt werden:
msgid "" msgstr "" "Project-Id-Version: Ein Sprachtest\n" "POT-Creation-Date: \n" "PO-Revision-Date: \n" "Last-Translator: Melewo <ist_geheim@example.com>\n" "Language-Team: Coderteam <ist_geheim@example.com>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de_DE\n" "X-Generator: Poedit 1.6.5\n" #: sprachtest.php:21 msgid "The autumn is golden." msgstr "Der Herbst ist golden."
Ein Hinweis:
*.po – Die Endung po steht für ‘Portable Object’ und dient als Vorlage.
*.mo – Die Endung mo steht für ‘Message Object’ und enthält die binären Daten.
Die so erstellten Sprachdateien wurden im Beispiel in einem zusätzlich innerhalb des Plugins erstellten Unterverzeichnis mit dem Namen /languages abgelegt.
Änderungen innerhalb eines Plugins
Das Erstellen von Sprachdateien allein genügt jedoch für die Übersetzung von Plugins noch nicht. Zusätzlich muss die Ausgabe angepasst werden und eine Funktion zum Laden der Sprachdateien definiert werden.
Wichtig und unbedingt zu beachten ist, dass die Textdomain nur aus dem ersten Teil des Dateinamens der Sprachdateien besteht. Nach dem zweiten Teil sucht hingegen WordPress allein, um die lokale Einstellung zu verwenden und verbindet diesen zweiten Teil unter Verwendung eines Bindestrichs mit der Textdomain.
Ausgabe bzw. String für Rückgabe vorher:
esc_html('The autumn is golden.').
Bei der Änderung ist die öffnende Klammer durch zwei vorausgehende Unterstriche zu ergänzen. Eine direkte Ausgabe ist ebenfalls mit _e() möglich, doch hierzu bitte erst im Codex von WordPress über die Unterschiede beider Varianten belesen. Weiterhin muss innerhalb der Klammer getrennt durch ein Komma die Textdomain (Name der Sprachdatei vor den Länderkürzeln) als Parameter mit angegeben werden.
esc_html__('The autumn is golden.', 'sprachdatei').
Abschließend muss das zukünftig mehrsprachige Plugin eine zusätzlich Funktion erhalten, mit der die Textdomain geladen wird. Zum Laden der Textdomain stellt WP die Funktion load_plugin_textdomain zur Verfügung, die über die Hooks plugins_loaded oder init eingehakt werden können. Beachtenswert hierbei ist, dass der Pfad zur Sprachdatei und die Textdomain richtig angegeben werden.
Im Beispiel: Pfad: /languages/ Textdomain: sprachdatei URL: .../wp-content/plugins/sprachtest/languages/sprachdatei-de_DE.mo
Codes des geänderten Plugins:
<?php /** * Plugin Name: Sprachtest * Text Domain: sprachdatei * Description: Die Funktion mit plugins_loaded oder init einhaken. */ add_action( 'plugins_loaded', 'lade_sprachdatei_fuers_plugin' ); function lade_sprachdatei_fuers_plugin() { $pfad = dirname(plugin_basename(__FILE__)).'/languages/'; load_plugin_textdomain( 'sprachdatei', false, $pfad ); } add_filter( 'the_content', 'erweitere_den_content' ); function erweitere_den_content( $content ) { $uebersetze = '<span style="color: #ffa800">'. esc_html__('The autumn is golden.', 'sprachdatei'). '</span>'; return $content.$uebersetze; } ?>
Ausgabe: Der Herbst ist golden.