Internationalisierung/Mehrsprachigkeit von PHP Projekten mit .po und .mo


Für ein mehrsprachiges PHP Projekt sollte man von Anfang an alle Wörter auslagern bzw. markieren, die in einer anderen Sprache übersetzt werden sollen. Dazu bietet sich die in PHP enthaltene Funktion gettext an:

<?php echo gettext("Einen schönen Tag noch"); ?>

oder der Alias (welcher nicht zu empfehlen ist, weil man nicht danach zu kann ordentlich)

<?php echo _("Einen schönen Tag noch"); ?>

Damit kann man zu übersetzenden Text markieren und später übersetzen lassen und dann dynamisch austauschen lassen , wenn auf der englischen Webseiten gesurft wird.

Wenn man sein Projekt mit gettext programmiert hat, kann man am Ende ganz einfach tabellenartige Dateien generieren aus dem Quellcode mit Poedit. Dort kann mann sehr übersichtlich die Übersetzung der Strings eintragen bis hin zu Pluralformen von Wörtern.

Poedit konfigurieren

Nach der Installation sollte ein neuer Katalog angelegt werden:

Datei->neuer Katalog

es sollte für den Zeichensatz UTF-8 und der Zeichensatz des Quellcodes ausgewählt werden (auch UTF-8 in den meisten Fällen). Unter Quellpfade muss der relative Pfad ausgewählt werden, der alle Dateien mit Übersetzungen mit gettext im PHP enthält, z.B“…/../../” bei einer Verzeichnis Struktur:

project_name/lang/en_US/LC_MESSAGES/project.po
project_name/index.php

Um automatisch .mo Dateien zu generieren im selben Verzeichnis, die im PHP verwendet werden muss unbedingt die folgende Funktion aktiviert werden unter Datei->Einstellungen->Editor:

Automatisch .mo-Datei beim Speichern erstellen

automatisch .mo Dateien erstellen aktivieren

Die Sprache umstellen

Automatisch verwendet PHP den String, der in der gettext-Funktion übergeben wird.

Die passenden Übersetzungsdatei muss im Ordner

project_name/lang/en_US/LC_MESSAGES/project.mo

gespeichert sein.

Um eine Übersetzung aus einer .mo-Datei zu verwenden muss man folgenden Code verwenden:

    putenv('LC_ALL=en_US');
    setlocale (LC_ALL, 'en_US');

    // Angeben des Pfads der Übersetzungstabellen
    bindtextdomain("project", "../lang");

    // Domain auswählen
    textdomain("project");

Dann sollte die Funktion

<?php echo gettext("Einen schönen Tag noch"); ?>

den Text “Have a nice Day” ausgeben.

gettext Debuggen

    if (!function_exists("gettext"))
    {
        echo "gettext is not installed";
    }

     //Test, ob die Sprache auf dem System installiert ist. Achtung, ist unter Windows mit Xampp nicht der Fall, nicht testbar!
    echo "Local Exist?: ".setlocale(LC_ALL, 'en_US'); //sollte en_US ausgeben

Achtung beim Entwickeln unter Windows/MAC mit Xampp:

Die setlocale Funktion funktioniert nur, wenn die entsprechenden Sprachpakete installiert sind mit denselben Namen. Unter Windows sind andere Namen zu verwenden und der Ordner müssten umbenannt werden, weshalb ein Testen nur auf einem Linux Server möglich ist.

Bsp. Windows Sprach Locales:

setlocale(LC_ALL, 'english_usa', 'english_america', 'english_united states', 'english_united-states', 'english_us');

andere Nachteile dieser Variante:

- Gettext ist nicht threadsicher

Deswegen kann als Alternative die Translate-Komponente des Zend Frameworks verwendet werden.

Zend Translate

Der Zend_Translate Gettext-Adapter ist nicht mit Hilfe von PHPs Gettext-Erweiterung realisiert worden. Der Gettext-Adapter kann also verwendet werden, selbst wenn die Gettext-Erweiterung nicht verfügbar ist. Ausserdem ist der Adapter im Gegensatz zur Gettext-Erweiterung threadsicher.

Nachteil: Gettext-Dateien werden in einem machinenlesbaren Format gespeichert und sind nicht ohne Tools lesbar (Poedit, siehe oben).

Mehr Informationen: Zend Translate.