WordPress-Themes updatesicher übersetzen

WordPress Themes bieten über *.mo- und *.po-Dateien im Regelfall eine relativ einfache Möglichkeit zur Übersetzung. Im Normalfall werden in einem Unterverzeichnis languages (machmal auch lang oder language) die entsprechenden Übersetzungsdateien abgelegt und schon ist das Theme übersetzt.

Problematisch wird es jedoch, wenn ein Update für ein Theme vorliegt. Der WordPress-interne Update-Mechanismus überschreibt das komplette Theme-Verzeichnis mit den neuen Dateien, somit auch das Verzeichnis, das die Übersetzung enthält. Aus diesem Grund sind nach einem Update im Regelfall die Übersetzungen weg.

Allerdings wäre WordPress nicht WordPress, wenn es nicht eine relativ einfache Lösung zur Behebung des Problems gäbe. Die Lösung heißt Child Themes.

Ein Child Theme erstellen

Ein Child-Theme ist ein Theme, das die Einstellungen und Eigenschaften des eigentlichen Themes übernimmt. Hintergrund dieses Child-Theme-Konstrukts ist, dass das eigentliche Theme (das Eltern-Theme oder Parent-Theme) aktualisiert werden kann, ohne das die Anpassungen im Child-Theme überschrieben werden.

Um ein Child-Theme anzulegen, muss im WordPress-Themes-Verzeichnis ein neues Verzeichnis angelegt werden. Im Folgenden heißt mein fiktives Theme my-base-theme. Das Child Theme heißt in meinem Beispielfall my-child-theme. Also muss zunächst unterhalb vom Themes-Verzeichnis (wp-content/themes/) ein Verzeichnis my-child-theme angelegt werden. In diesem Verzeichnis muss eigentlich nur die Datei style.css vorhanden sein, die jedoch einer speziellen Form entsprechen muss. Schon hat man ein funktionierendes Child-Theme.

Die Datei style.css muss mit folgendem Inhalt beginnen:

/*
 Theme Name:   My Child Theme
 Theme URI:    http://example.com/my-child-theme/
 Description:  Child Theme for My Base THeme
 Author:       Sebastian Widmann
 Author URI:   http://example.com
 Template:     my-base-theme
 Version:      1.0.0
 Tags:         light, dark, two-columns
 Text Domain:  my-child-theme
*/

@import url("../my-base-theme/style.css");

Was passiert hier? Im Prinzip entspricht die Stylesheet-Datei der eines „normalen“ Themes. Besonderheit ist der Punkt Template:, wo angegeben ist, was als Parent-Theme genutzt werden soll. Zweite Besonderheit ist die Zeile @import url(„../my-base-theme/style.css“);, über die die CSS-Datei des Parent Themes eingebunden wird.

Nun kann beliebiger CSS-Code folgen, der dann den CSS-Code des Parent-Themes überschreibt oder ergänzt. Über weitere PHP-Dateien können bestimmte Parts der Website verändert werden (beispielsweise der Footer), über eine Datei functions.php kann dem Theme weiterer Code hinzugefügt werden.

Das Übersetzungsproblem für Themes beheben

Um jetzt das Problem zu beheben, wird genau diese functions.php-Datei benötigt. Bevor diese jedoch angelegt wird, muss in der functions.php des Parent-Themes folgende Zeile gesucht werden:

load_theme_textdomain( 'my-base-theme', $template_directory . '/languages' );

Diese ist Voraussetzung, damit das Theme übersetzt werden kann. In der oben genannten Zeile ist my-base-theme als Text-Doamin angegeben und dem Theme wird mitgeteilt, dass es Übersetzungen im /languages des Themes suchen soll.

Damit es jetzt nicht im /languages des Parent-Themes, sondern im /languages des Child-Themes suchen soll, muss nun die Datei functions.php im Child-Theme-Verzeichnis angelegt werden. In diese Datei wird folgender Code eingefügt:
<?php

function my_child_theme_theme_setup() {
    load_child_theme_textdomain( 'my-base-theme', get_stylesheet_directory() . '/languages' );
}
add_action( 'after_setup_theme', 'my_child_theme_theme_setup' );

Die Text-Domain (in obigem Beispiel my-base-theme) muss natürlich an das jeweilige Theme angepasst werden. Nun können im Verzeichnis /languages des Child-Themes die Übersetzungs-Dateien abgelegt werden. Ein Update das Parent-Themes überschreibt diese Dateien dadurch nicht mehr.

Besonderheit beim Genesis-Framework

Beim Genesis-Framework gibt es eine Besonderheit, die das Thema vereinfacht (auch hier beschrieben). Hier reicht es, in der functions.php des Child Themes folgenden Code direkt am Anfang der Datei einzufügen (in jedem Fall vor der Zeile require_once(TEMPLATEPATH.’/lib/init.php’);:

<?php
define('GENESIS_LANGUAGES_DIR', STYLESHEETPATH.'/languages');
define('GENESIS_LANGUAGES_URL', STYLESHEETPATH.'/languages');

Das bewirkt, dass die Genesis-Übersetzungsdateien im languages-Verzeichnis des Child-Themes abgelegt werden können.

Nachdem die oben beschriebenen Anpassungen durchgeführt wurden, kann das Parent-Theme beliebig aktualisiert werden, ohne dass dadurch weitere Anpassungen notwendig sind. Nur neue Übersetzungs-Strings oder eine geänderte Text-Domain würden Anpassungen erfordern.

Schreibe einen Kommentar