WordPress Multi-Language – Teil 1: Themes und Plugins

Im Zuge meiner Projekte musste ich eine bestehende WordPress Seite in Multi-Language umbauen. In den nächsten Tagen möchte ich dokumentieren welche Erfahrungen ich dabei gemacht habe. Im ersten Teil beschäftige ich mich mit der Übersetzung von Plugins und Themes.

Helferfunktionen

In meiner functions.php habe ich eine Funktion eingebaut, die mir die derzeitige Sprache returniert. Hier sieht man auch das ich im folgenden Verlauf der Umbauten einen qTranslate Fork (mqtranslate) verwende.

function currentLanguage() {
 if(function_exists('qtrans_getLanguage')) {
    return qtrans_getLanguage();
 }
 return substr(get_locale(),0,2);
}

Texte

Im ersten Schritt müssen alle im Theme verwendeten Strings mit gettext Tags (__() oder _e() ) samt einer eindeutigen Text Domäne versehen werden z.B. <h1><?= __("Meine Überschrift", "meintheme_theme"); ?>

Für kompliziertere Strings kann man gettext auch in Verwendung mit sprintf verwenden z.B. so: <?= sprintf(__("Ihre Suche ergab %d Treffer.","meintheme_theme"),$total_results) ?>

Bilder

Bilder habe ich immer mit der  entsprechenden Sprachkennung abgespeichert also z.B. header_de.jpg und header_en.jpg und diese dann so: <img src="view/img/header_<?= currentLanguage(); ?>" alt="<?= __("Header Image","meintheme_theme") " /> integriert

.MO / .PO Files erstellen

Danach muss man sogenannte .mo und .po Files erstellen. Dafür habe ich mir auch ein kleines Bash Script gebaut, das mir mit Hilfe von xgettext (auf OS X mit Hilfe von brew installiert) sogenannte .pot Files (Templates / Vorlagen für die einzelnen Sprachfiles) erzeugt.

touch messages.po
find ../ -type f -iname "*.php" | xgettext --from-code utf-8 --language=PHP -c/ --keyword=__ --keyword=_e -j -f -
cp messages.po messages.pot
rm messages.po

Dieses Script kommt in einen Subfolder languages/ im Theme Verzeichnis  und wird mit chmod +x ausführbar gemacht. Wenn man es ausführt erzeugt es einen .POT Datei die man danach für die .PO Files verwenden kann. Dazu installiert man sich POEdit und legtmit der Funktion „Datei/Neu aus POT Datei“ einen neuen Katalog an. Danach trägt man die Meta Daten ein (Übersetzer/Sprache usw.) und übersetzt alle Einträge. Danach z.B. für Englisch wie vorgeschlagen als en_US.po abspeichern. POedit kompiliert auch automatisch das MO File.

Info am Rande: Es gibt auch noch andere Wege POT Files zu erzeugen, dazu findet man im WordPress Codex mehr Infos. POEdit kann in der Pro Variante anscheinend auch WordPress Installationen auslesen und die notwendigen Files generieren.

MO Files im Theme laden

In der functions.php folgenden Part hinzufügen:

function meintheme_theme_setup(){
   load_theme_textdomain('meintheme_theme', get_template_directory() . '/languages');
}
add_action('after_setup_theme', 'meintheme_theme_setup');

MO Files im Plugin laden

Achtung bei Plugins – bei diesen ist der Vorgang geringfügig anders. Die .po Files müssen dort als namedesplugins_plugin-en_US.po abgespeichert  und z.B. so geladen werden:

class MeinPlugin {
    public function init_all() {
        load_plugin_textdomain('meinplugin_plugin', false, basename( dirname( __FILE__ ) ) . '/languages' );
    }
    public function init() {
        add_action('init', array($this,'init_all'));
    }
}

Multi-Language Ajax Calls

Bei Ajax Calls wird die Sprache nicht rechtzeitig? geladen – eine Google Suche hat mir folgenden Stackoverflow Snippet erbracht:

/* http://wordpress.stackexchange.com/questions/121732/gettext-does-not-translate-when-called-in-ajax http://wordpress.stackexchange.com/a/168760 */
function set_locale_for_frontend_ajax_calls() {
 if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX && substr( $_SERVER['HTTP_REFERER'], 0, strlen( admin_url() ) ) != admin_url() ) {
 load_theme_textdomain( "meintheme_theme", get_template_directory() . '/languages' );
 }
}

Dann muss man noch die ajax Url mit Sprache definieren also z.B. so:

var ajaxurl = '<?php echo admin_url('admin-ajax.php?lang='.currentLanguage()); ?>';

 Sonstiges

Ich hab in meinen meisten Themes eine Theme-Options Seite für z.B. Kurztexte, Metatags etc. – dort habe ich Multi-Language anfangs einfach durch eine Eingabebox pro Sprache realisiert. Ich habe im weiteren Verlauf mqtranslate verwendet, damit kann man dann die dort verwendeten Sprach Tags auch z.B. in den Theme Options verwenden. Dazu mehr im 2. Teil.

Schreibe einen Kommentar

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