lixx: setlocale und gettext

Hallo Leute!

Ich beschäftige mich gerade mit setlocale und gettext für die Internationaliesierung. Jetzt wird in der Doku diese funktion hoch gelobt. Nur habe ich meine Schwierigkeiten damit.

Zum kompilieren der mo- und po-Dateien verwende ich die PEAR-Klasse "File_Gettext". Das funzt soweit super. Gedacht ist, dass bei einer Änderung einer Sprachdatei die mo- und po-Dateien neu kompiliert werden.

Mein PHP-Code sieht in etwa so aus:
----------------------------
$this->currentLanguage = 'de_DE';

putenv('LANGUAGE='.$this->currentLanguage);
putenv('LANG='.$this->currentLanguage);

bind_textdomain_codeset($this->localeDomain, $this->localeCharSet);
bindtextdomain($this->localeDomain, $this->localePath);

setlocale(LC_MESSAGES, $this->currentLanguage);

textdomain($this->localeDomain);

echo gettext('header').NL;
echo gettext('title').NL.NL;
----------------------------

Die po-Datei sieht in etwa so aus:
----------------------------
msgid ""
msgstr ""
"Project-Id-Version: xxx\n"
"Report-Msgid-Bugs-To: system\n"
"POT-Creation-Date: 2009-06-06T17:05:18+0200\n"
"PO-Revision-Date: 2009-06-06T17:05:18+0200\n"
"Last-Translator: by system\n"
"Language-Team: system\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"

msgid "title"
msgstr "Titel"

msgid "header"
msgstr "Headline"
----------------------------

Nun habe ich das Problem, dass gettext() nicht immer wunschgemäß den String ausgibt. Mal wird er angezeigt, mal wird nur die msgid angezeigt – also je nach Luftdruck. Dass der String mal angezeigt wird, sagt mir, dass die mo-Datei korrekt ist.

Aber mach ich da was falsch, oder woran liegt das?

lg lixx

  1. Nach weiteren Recherchen und Tests bin ich zur Überzeugung gekommen, dass setlocale und gettext für die Internationalisierung von Scripten voll für den Hugo sind.

    Die Hauptgründe:

    • Die Anwendung ist viel zu kompliziert.
    • Um eine Sprachdatei anzulegen muss man ein commanline-tool einsetzen oder die Pear-Klasse File_Gettext einsetzen, deren Entwicklung eingestellt wurde.
    • Der Apache-Server muss nach jeder Änderung der Sprechdatei neu gestartet werden, was bei einer raschen Änderung oder z.B. bei Updates unzumutbar ist.
    • Weiters kann nicht davon ausgegangen werden, dass jeder Web-Server setlocale – oder alle Sprachen – unterstützt.
    • Bei Datenbankabfragen kann es zu Problemen kommen, wenn z.B. Dezimalzahlen vorkommen, die zuerst mit einem Punkt abgespeichert wurden (12.45), aber bei einen Sprachwechsel mit einem Komma gesucht werden (12,45).

    Daher rate ich von der Verwendung ab!

    lg lixx