Samstag, 15. Dezember 2007

PHP, GNU Gettext und Windows...

Falls jemand schon einmal versucht hat, eine multilinguale PHP-Anwendung zu programmieren, wird derjenige sicher schnell gemerkt haben, dass man mit dem Ablegen der zu internationalisierenden Satzteile der Meldungen in Variablen, einer Datei oder Datenbank spätestens dann an die Grenzen stößt, wenn man im Programm an einer Stelle die Meldung in eine Sprache geändert hat und vorhatte, die anderen Sprachen "später" nachzuziehen. Genau dafür gibt es ja GNU Gettext, welches auch als PHP-Modul verfügbar ist. Im Prinzip funktioniert folgendes Beispiel auch:

<?php
// _NUR_ Sprache der Meldungen auf Deutsch setzen
setlocale(LC_MESSAGES, 'de_DE');

// Ort der Uebersetzungstabellen angeben
bindtextdomain("test", "./locale");
textdomain("test");
// Uebersetzung wird nun aus ./locale/de_DE/LC_MESSAGES/test.mo geholt

// Zu uebersetzender Teil
echo _("Hello world");
echo "
";
echo gettext("Goodbye");
?>

Versucht man das Ganze allerdings unter Windows, kann man sich schwarz suchen, warum es nicht funktioniert. Des Rätsels Lösung: Unter Windows ist beim bindtextdomain-Aufruf ein abschließender "/" erforderlich. Dies ist nirgends dokumentiert, lediglich in einem Foreneintrag war dieser "/" vorhanden.
Ich habe diese Erkenntnis -- nebenbei bemerkt -- auch in diesen PHP-Wiki eingetragen.
Interessant ist übrigens auch, dass es ohne "/" am Ende auch geht, wenn man bei setlocale() "de_de" anstatt "de_DE" schreibt. Woher dies kommt, ist mir allerdings völlig schleierhaft...
Für GNU Gettext verwendende C-Programme ist (zumindest in der Cygwin-Umgebung) der abschließende "/" nicht erforderlich.

Keine Kommentare: