Zunächst erstellt man sich ein Verzeichnis, z.B. locales/
, in dem die Übersetzungsdateien abgelegt werden. Die Verzeichnisstruktur sollte Unterverzeichnisse für jede Sprache, beispielsweise en/
für Englisch, de/
für Deutsch, usw. enthalten und wie folgt aufgebaut sein:
locales/
de/
LC_MESSAGES/
default.po
default.mo
en/
LC_MESSAGES/
...
In diese Verzeichnisse kommen dann die Übersetzungsdateien (*.mo, *.po). Wie diese aufgebaut sind bzw erstellt werden, soll an dieser Stelle nicht weiter erläutert werden.
Einbindung in PHP
So sieht die Einbindung von Gettext in PHP aus:
$locale = 'de_DE';
$directory = './locales'; // diesen Pfad entsprechend anpassen!
$domain = 'default';
setlocale(LC_ALL, $locale.'.utf8'); // 'de_DE.utf8' (wichtig: utf8 ohne '-'!)
putenv('LC_ALL='.$locale);
bindtextdomain($domain, $directory); // 'default', './locales'
textdomain($domain); // 'default'
bind_textdomain_codeset($domain, 'UTF-8');
Zu beachtende Punkte
Gettext funktioniert nicht wie gewünscht? Lokalisierung wird nicht angezeigt? Dies dann kann verschiedene Gründe haben. Hier ein paar Anmerkungen:
Der String in $locale
muss eine gültige Lokalisierung sein, welche auch auf dem System zur Verfügung steht. Ist diese korrekt (bzw. existiert diese), dann gibt setlocale()
true
zurück, andernfalls false
.
Im Fehlerfall sollte man also prüfen, ob das System die angegebene Lokalisierung auch bereitstellt. Das kann man der Ausgabe folgender Zeile entnehmen:
print_r(ResourceBundle::getLocales(''));
Das Encodings (UTF-8) muss bei setlocale()
ohne jeglichen Bindestrich angegeben werden.
Die Angabe ‘default’ bezieht sich auf die Domain, also den Dateinamen der *.mo-Datei. Die *.po-Datei werden übrigens nicht direkt von Gettext verwendet. Diese werden aber benötigt, um die *.mo-Dateien zu erstellen.