Contenido Plugin(s): Localization (mehrsprachige Plugins)

Programmiert man seine Plugins nur für deutsche Intranets, so ist Mehrsprachigkeit kein so wichtiges Thema. Sobald man aber für das WeltWeitWeb programmiert, häufen sich die Anfragen nach anderen Sprachen.


Leider bin ich da beim Programmieren auch nicht immer so konsequent, in manchen Modulen und Plugins denglischt es gar sehr. Ich versuche jedoch zumeist im Quelltext in englisch zu schreiben und zur Ausgabe anstehende Texte mit der gettext-Funktion in Contenido zu übersetzen.
Der Vorteil, den ich gegenüber der recht häufig zu findenden language-Datei sehe, ist eine Ausgabe der Texte zumindest in englisch, auch bei fehlender Definition in der Übersetzung. Bei language-Dateien wird zumeist nur die gewünschte eingebunden, fehlt dort die Definition, wird halt nix angezeigt, was zu teilweise auch lustigen Anzeigen für den Benutzer führen kann. Meistens ist es aber so wohl nicht gewünscht.

Contenido liefert recht ausgereifte Funktionen, die auf die gettext-extension aufsetzen, mit. Ich durfte schon bei der Optimierung und Verbesserung dieser Corefunktionen mitwirken.
Es gibt 3 Varianten dieser Funktion(en), welche da sind

  • mi18n(„text for translation“);
    wird in Modulen für die eingebaute Modulübersetzung verwendet.
  • i18n(„text for translation“);
    wird im Core verwendet.
  • i18n(„text for translation“, $sPluginName);
    wird in Plugins verwendet, wobei $sPluginName der Name des root-Ordners des Plugins ist (Groß-/Kleinschreibung beachten!)

Da es hier um Plugins geht, interessiert uns erst mal nur die 3. Version. Die Variable $sPluginName definieren wir am Besten zu Beginn jeder php-Datei, damit sie auch definitiv mit unserem Pluginnamen gesetzt ist, falls sie noch von weiteren Plugins genutzt wird. Ich gehe sogar noch hin und lösche sie am Ende der Datei explizit per unset().

Bisher wird aber nun noch nicht wirklich was übersetzt, nutzen wir das Ganze in einem Plugin, wird nur unser englischer Text in den php-Dateien angezeigt.
Wir brauchen nun mo und po, die richtigen Verzeichnisse dafür und ein Tool um po zu bearbeiten, welches sich interessanterweise PoEdit nennt.

Keine Angst, hierbei handelt es sich um „jugendfreies“ Material und man benötigt auch keine „Rolle Papier“, .po und .mo sind die Dateiendungen der benötigten Sprachdateien, wobei .po mit PoEdit bearbeitet werden kann, und .mo die von gettext benötigte Version ist.
Eine ausführliche und bebilderte Anleitung zu PoEdit habe ich hier gefunden.
Achtet bitte darauf bei Punkt 5. Pfade den Pfad zu den php-Dateien richtig einzugeben und bei Punkt 6. Schlüsselwörter unsere Contenidofunktion i18n anzugeben.

Den Katalog (.po)  speichert man dann am Besten gleich im richtigen Verzeichnis, welches für unser Plugin myPlugin/locale/de_DE/LC_MESSAGES ist, da wir ja vom Englischen ins Deutsche übersetzen wollen, und mit dem richtigen Namen, dem Namen des Plugins. Nun sollte PoEdit alle im Pfad liegenden Dateien nach zu übersetzenden Stellen durchsuchen und diese dann anzeigen.

Nachdem wir mit unserer Übersetzung fertig sind, auf Speichern drücken und PoEdit speichert zusätzlich eine mo-Datei im gleichen Verzeichnis unter dem gleichen Namen.
Diese wird jetzt von der i18n-Funktion von Contenido genutzt, sobald wir uns im Backend in dieser Sprache (hier Deutsch) anmelden.

Haben wir nun unser Plugin erweitert, haben sich also Texte gändert, sind hinzu gekommen oder weg gefallen, rufen wir PoEdit für unsere po-Datei auf, lassen den Katalog aktualisieren, übersetzen die neuen Textpassagen und speichern wieder. Wieder wird eine neue mo-Datei erstellt und Alles ist gut. 🙂

Beispiel(e)

Habe ich hier aus guten Grund keine angegeben. Ich schreibe ja an der Artikelserie Contenido Plugin(s) entwickeln, in der zu gegebener Zeit die Ausführung Beispielhaft gezeigt wird.

Soweit zum Thema Localization bei Contenido Plugins.
Und wie immer, Fragen und Anregungen sind natürlich willkommen. 😉