GNU gettext ist eine GNU-Programmbibliothek zur Internationalisierung von Software. Normalerweise wird sie zur Entwicklung von mehrsprachigen Programmen genutzt. Um diese in PHP zu nutzen, sind einige Informationen über die zu verwendende Sprache und der Speicherort der Sprachpakete notwendig. Dieser Artikel gibt eine kurze Beschreibung, wie man diese einrichten kann.
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.
Leave a Reply