7.5. Übersetzungsdateien erstellen

Die meiste Arbeit, also das Einpflegen und nutzen von Übersetzungsstrings in Ihren PHP-Dateien, haben Sie schon hinter sich. Jetzt fehlt nur noch eines: Das erstellen einer Übersetzungsdatei, so dass diese später von WordPress gelesen und verwendet werden kann.

Am Anfang einer Internationalisierung steht immer eine leere Übersetzungsdatei. Sie wird an alle Übersetzer ausgeliefert, die diese dann in ihre eigene Sprache übersetzen können. Sie müssen jetzt also lernen, wie Sie eine noch nicht übersetzte Internationalisierungsdatei erstellen.

Portable-Object- (PO) und Message-Object- (MO) Dateien

Die gerade angesprochene „leere“ Übersetzungsdatei hat immer die Endung *.po. (z.B. mm_trans.po). Sie ist die editierbare Datei die dann vom Übersetzer kopiert und in die eigene Sprache übersetzt wird (z.B. mm_trans-de_DE.po). Die Ausgangssprache ist, wie bereits am Anfang dieses Kapitels angesprochen, US-Englisch (en_US). Ausgehend von dieser Sprache werden alle anderen Übersetzungen vorgenommen.

Die *.po-Dateien können mit Hilfe von Übersetzungs-Tools bearbeitet werden. Das wohl populärste Tool ist PoEdit. Es wandelt die PO-Dateien in so genannte *.mo-Dateien um. Das sind binäre Dateien die dann mit dem eigentlichen Plugin ausgeliefert werden können. Im Umkehrschluss bedeutet das: die *.po-Dateien sind zum reinen Betrieb des Plugins nicht nötig. Sie sind sozusagen nur der Vermittler zwischen dem Menschen (bzw. der Software) und der von Maschinen lesbaren MO-Datei.

WordPress liest die Sprachdatei in der Sprache, die der Benutzer gewählt hat aus. Das kann zum Beispiel de_DE sein. Im Plugin-Verzeichnis wird dann nach einer Datei mm_trans-de_DE.mo gesucht und geladen, falls diese existiert. Ansonsten wird immer die Standardsprache ausgegeben (US-Englisch).

Software- und Web-Tools zur Übersetzung

Eine PO-Datei erstellen

PoEdit ist am einfachsten zu verwenden. Es ist erhältlich für Mac, Windows und Linux. Damit wird es zum idealen Helfer bei der Übersetzung von Plugins. Aus diesem Grund zeige ich in den nachfolgenden Schritten, wie sich eine Übersetzungsdatei mit diesem Programm erstellen lässt.

Als Vereinbarung treffen wir, dass die Sprachdateien sich im Verzeichnis langs des Plugin-Ordners befinden sollen. Als Beispiel nehmen wir folgendes Plugin, welches wir bereits in Kapitel 4.1. erstellt haben. Es erstellt einen Menüpunkt, legt dadurch eine neue Seite im Administrationsbereich an und zeigt dort einen kleinen Text an, der ebenfalls übersetzt werden soll.

Festlegungen:

  1. Als Plugin-Namen wählen wir ABC-Plugin.
  2. Das Plugin-Verzeichnis nennen wir abc-plugin.
  3. Die Übersetzungsstrings erhalten die Textdomain abc.
<?php
/*
Plugin Name: ABC-Plugin
Plugin URI: http://my-website.com/abc-plugin/
Description: This plugin displays ABC.
Author: Max Mustermann
Author URI: http://my-website.com/
Version: 1.0.0
Text Domain: abc
Domain Path: /langs/
*/

load_plugin_textdomain( 'abc', false, dirname( plugin_basename( __FILE__ ) ) . '/langs/' );


add_action( 'admin_menu', 'mm_admin_menu' );

function mm_admin_menu() {
	add_menu_page(
		__( 'My Title', 'abc' ),
		__( 'My Menu', 'abc' ),
		'manage_options',
		'mm-meins',
		'mm_main_page_render',
		plugins_url( 'pacman.png', __FILE__ )
	);

	add_submenu_page(
		'mm-meins',
		__( 'My Subheading Title', 'abc' ),
		__( 'Submenu', 'abc' ),
		'manage_options',
		'mm-meins-unter-1',
		'mm_sub1_page_render'
	);
}

function mm_main_page_render() {
	?>
	<h1><?php _e( 'My Title', 'abc' ); ?></h1>
<?php
}

function mm_sub1_page_render() {
	echo '<h1>' . __( 'My Subheading Title', 'abc' ) . '</h1>';
}

?>

Auf Github ansehen

Hinweis:
Zum Zeitpunkt des Schreibens lag die Version 1.6.5. von PoEdit vor. Es kann also sein, dass sich zukünftige Versionen leicht durch die hier vorliegende unterscheiden.

PO-Datei erstellen

  1. Öffnen Sie PoEdit.
  2. Erstellen Sie eine neue Übersetzung (“Datei“ » “Neu“).
    Abb. 6.5.3.1: Neue Datei erstellen
  3. Wählen Sie als Standardsprache “Englisch“ aus, wenn Sie danach gefragt werden.
    Abb. 6.5.3.1.b: Sprache wählen
  4. Speichern (“Datei“ » “Speichern untern“ ) Sie diese sofort im Sprachverzeichnis des Plugins ab. In unserem Beispiel also hier: abc-plugin/langs/. Als Dateinamen wählen Sie, wie Sie es gelernt haben, die Textdomain: abc.po.

Katalog konfigurieren

  1. Klicken Sie im Menü auf “Katalog“ » “Eigenschaften“ . Ein Fenster mit drei Tabs öffnet sich.
    Abb. 6.5.3.2: Katalog Eigenschaften

Im Tab “Übersetzungseinstellungen“:

Abb. 6.5.3.2.b: Übersetzungseinstellungen
Abb. 6.5.3.2.b: Übersetzungseinstellungen
  1. Geben Sie als Projektnamen den Pluginnamen ein. Bei uns also ABC Plugin.
  2. Unter “Sprache“ wählen Sie Englisch aus, falls noch nicht geschehen (das ist die Standardsprache).
  3. Als “Zeichensatz“ und “Zeichensatz des Quellcodes“ sollten Sie immer UTF-8 wählen.
  4. Den Rest können Sie vorerst leer lassen.

Im Tab “Quell-Pfade“:

  1. Klicken Sie auf den “Neues Element“ Button um eine neue Zeile hinzuzufügen. Geben Sie dann lediglich zwei Punkte ein (..). Zwei Punkte bedeuten in diesem Fall, dass das Quellverzeichnis eine Ebene höher liegt.

Im Tab “Schlüsselwörter aus Quelltexten“:

  1. Klicken Sie auf den “Neues Element“ Button um eine neue Zeile hinzuzufügen. Geben Sie Zeile für Zeile folgendes ein:
    • __
    • _e
    • _x:1,2c
    • _ex:1,2c
    • esc_attr__
    • esc_attr_e
    • esc_attr_x:1,2c
    • esc_html__
    • esc_html_e
    • esc_html_x:1,2
    • _n:1,2
    • _nx:4c,1,2
    • _n_noop:1,2
    • _nx_noop:4c,1,2

Sie sehen: die Schlüsselwörter sind alle Funktionen, die WordPress Ihnen bereitstellt um Texte zu übersetzen.

Abb. 6.5.3.2.c: Schlüsselwörter aus Quelltexten
Abb. 6.5.3.2.c: Schlüsselwörter aus Quelltexten
  1. Bestätigen Sie alle Änderungen mit einem Klick auf “OK“.
  2. Anschließend sollten Sie Ihren Katalog speichern (“Datei“ » “Speichern“).

Daten in die Referenzdatei einlesen

Wenn der Katalog konfiguriert wurde, können Sie mit dem Button “Aktualisieren“ alle Übersetzungen einlesen.

Abb. 6.5.3.3: Strings einlesen
Abb. 6.5.3.3: Strings einlesen

Nach dem Einlesen teilt sich der Bildschirm, je nach Übersetzung, in mehrere Teile. Im obersten Teil sehen sie alle Strings die zu übersetzen sind. Dabei werden die Strings fett dargestellt, die noch nicht übersetzt wurden. Die nicht-fett dargestellten Strings, wurden bereits übersetzt.

Anschließend sehen Sie im Fenster “Quelltext“ den originalen (englischen) Text der übersetzt werden muss. Im Fenster “Übersetzung“ können Sie dann Ihre eigene Übersetzung in Ihrer Sprache angeben.

Abb. 6.5.3.3.b: Übersetzungsoberfläche
Abb. 6.5.3.3.b: Übersetzungsoberfläche

Speichern Sie die Datei abc.po an dieser Stelle ab ohne etwas zu übersetzen. Wir nutzen diese Datei lediglich als Referenz. Das bedeutet: diese Datei ist lediglich die Ausgangsdatei für alle anderen Übersetzer.

Daten übersetzen

Da Sie nun die Referenzdatei abc.po erstellt haben, können Sie diese dazu benutzen, die eigentlichen Strings direkt zu übersetzen. Dazu machen Sie am besten eine Kopie auf Betriebssystemebene und hängen am Ende das Länder- und Sprachkürzel an. Die Struktur sieht immer so aus:

{Textdomain}-{Sprachkürzel}_{Länderkürzel}.po

Für die Deutsche Sprache wäre das z.B. abc-de_DE.po. Für die Schweiz wäre auch folgendes gültig: abc-de_CH.po.

Wir machen mit der Datei abc-de_DE.po weiter. Es wurde also eine Kopie der Referenzdatei abc.po erstellt. Diese öffnen wir nun und fangen an, zu übersetzen.

Abb. 6.5.3.4: Übersetzen
Abb. 6.5.3.4: Übersetzen

Am Ende muss die Datei wieder gespeichert werden (“Datei“ » “Speichern“). Danach wird vollautomatisch auch die jeweilige *.mo-Datei erstellt. In unserem Beispiel wäre das also abc-de_DE.mo. Sie wird dann von WordPress zur Übersetzung benutzt.

Abb. 6.5.3.4.b: Gegenüberstellung nicht-übersetztes und übersetztes Menü
Abb. 6.5.3.4.b: Gegenüberstellung nicht-übersetztes und übersetztes Menü

Kontext-Inhalte übersetzen

Da wir oben alle Schlüsselwörter korrekt eingegeben haben, erkennt PoEdit auch Kontext-Inhalte vollautomatisch.

Ergänzen wir unser Beispiel (bzw. die Funktion mm_main_page_render()) wie folgt:

<?php
function mm_main_page_render() {
	?>
	<h1><?php _e( 'My Title', 'abc' ); ?></h1>
	<ul>
		<li><?php _e( 'This is a normal sentence.', 'abc' ); ?></li>
		<li>
			<button class="button"><?php _ex( 'Button', 'Button label', 'abc' ); ?></button>
		</li>
		<li><?php echo _n( 'You have one post.', 'You have far more posts.', count( wp_count_posts( 'post' ) ), 'abc' ) ?></li>
	</ul>
<?php
}

Komplettes Beispiel auf Github ansehen

Danach öffnen wir unsere Sprachdatei abc-de_DE.po erneut, klicken “Aktualisieren“ und erhalten sofort alle neuen Übersetzungen.

Wie Sie sehen, hat die Beschriftung des Buttons den Kontext „Button label“ erhalten. Somit lässt sich für den Übersetzter erkennen, in welchen Zusammenhang die Übersetzung steht oder wo diese zu finden ist.

Abb. 6.5.3.5: Kontexte werden erkannt
Abb. 6.5.3.5: Kontexte werden erkannt

Singular- und Plural-Übersetzungen

Unser erweitertes Beispiel enthält noch eine Eigenheit: Nämlich das Übersetzen von Plural- und Singular-Sätzen. Als Eingangswert der Funktion _n() wurde wp_count_posts() gewählt. Wenn also nur einen Artikel in der Datenbank existiert, wird der Singular-Satz ausgegeben. Andernfalls die Pluralform davon.

PoEdit zeigt Ihnen das ebenfalls an. Und zwar anhand eines aufgespalteten Fensters:

Abb. 6.5.3.6: Übersetzung von Singular und Plural
Abb. 6.5.3.6: Übersetzung von Singular und Plural

Je nach Sprache bzw. Pluralform wird die Oberfläche anders dargestellt. In deutscher Sprache sieht sie wie in der Abbildung aus. Durch Klick auf “Eins“ und “Andere“ wechseln Sie zwischen Singular- und Plural hin- und her.

Hinweis
Nicht in jedem Land ist die Pluralform die gleiche wie in der Deutschen Sprache. Sie lässt sich gesondert einstellen. Und zwar unter “Katalog“ » “Eigenschaften“ » Tab: “Übersetzungseinstellungen.“
PoEdit kümmert sich bei den meisten Sprachen automatisch um die richtige Pluralform. Wenn Sie eine andere, nicht unterstützte Sprache benötigen, können Sie natürlich auch die eigene Pluralform eingeben. Sie finden dann Hilfe im Wiki von PoEdit: http://poedit.net/trac/wiki/Doc/PluralForms

Mehrere Text-Domains in einer Quelle

PoEdit kann leider keine Textdomains unterscheiden1. Beispiel:

<?php
echo __( 'This is in Text Domain abc', 'abc' );
echo __( 'This is in Text Domain xyz', 'xyz' );
?>

Beide Sätze werden in PoEdit angezeigt, obwohl nur einer davon effektiv übersetzt wird. Nämlich derjenige, dessen Textdomain per WordPress korrekt registriert wurde:

<?php
load_plugin_textdomain( 'abc', false, dirname( plugin_basename( __FILE__ ) ) . '/langs/' );
?>

In unserem Fall wäre das der String mit der Textdomain abc. Der andere Satz bliebe komplett unübersetzt. Es sei denn Sie erstellen eine neue PO-Datei mit diesem Satz und registrieren die dabei entstandene *.mo-Datei ebenfalls mittels load_plugin_textdomain().

  1. https://twitter.com/PoeditApp/status/464279423823646720; Abgerufen am 26.05.2014 ↩︎