Mehrsprachigkeit einer Website mit der PHP-gettext()-Funktion für Linux

Mittwoch, 24. Juni 2015 | von PhilVanB | Englisch This article in english


Die Mehrsprachigkeit einer Website oder Webanwendung ist von zentraler Bedeutung in der Webentwicklung. Auch wenn es nicht zwingend erforderlich sein sollte, kann zumindest eine englischsprachige Version einer Website nie schaden. Wie sich ein und derselbe Seiteninhalt in mehreren Sprachen technisch auf einem Linux-System umsetzen lässt sei hier im Folgenden erklärt.

 

Technische Umsetzung mit der PHP-gettext()-Funktion

Um die Mehrsprachigkeit grundsätzlich anzulegen, fügt man etwa in einer index.php-Datei im Root-Verzeichnis der Webanwendung (es geht natürlich auch mit jeder anderen beliebigen PHP-Datei) folgenden PHP-Code ein:

 

putenv('LC_ALL=de_DE.utf8');

setlocale(LC_ALL, de_DE.utf8');

bindtextdomain('index', '/var/www/myApp/locale');

bind_textdomain_codeset('index', "UTF-8");

textdomain('index');

echo _('Hello World');

 

In den Funktionen putenv() und setlocale() in den Zeilen 1 und 2 gibt man die Sprache an, in der die Website gerade dargestellt wird, z.B. de_DE für Deutsch, en_GB für britisches Englisch oder es_ES für Spanisch. Die Sprachkürzel sollten bei einem Sprachwechsel mit PHP dynamisch generiert werden.

 

mo.- und po.-Dateien

Im nächsten Schritt muss eine po.-Datei über die Linux-Konsole erstellt werden. Dazu wechselt man in der Konsole in den Ordner wo sich die Datei mit dem oben erwähnten PHP-Code mit der gettext()-Funktion befindet. Über die Konsole führt man folgenden Befehl aus:

 

xgettext --default-domain=index -k_ index.php

 

Jetzt wurde in diesem Verzeichnis eine index.po-Datei erstellt mit ungefähr folgendem Inhalt:

 

# SOME DESCRIPTIVE TITLE. 
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 
# This file is distributed under the same license as the PACKAGE package. 
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. 
# 
#, fuzzy 
msgid "" 
msgstr "" 
"Project-Id-Version: PACKAGE VERSION\n" 
"Report-Msgid-Bugs-To: \n" 
"POT-Creation-Date: 2014-11-11 11:56+0100\n" 
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" 
"Language-Team: LANGUAGE <LL@li.org>\n" 
"Language: \n" 
"MIME-Version: 1.0\n" 
"Content-Type: text/plain; charset=CHARSET\n" 
"Content-Transfer-Encoding: 8bit\n" 

#: index.php:25 
msgid "Hello World" 
msgstr ""

 

Verzeichnis-Struktur für die Sprachdateien anlegen

Die verschiedenen Sprachdateien, die aus .po– und .mo-Dateien bestehen, müssen in einer ganz bestimmten Ordnerstruktur liegen. Der Pfad zu den Sprachdateien wird der oben im PHP-Code in Zeile 5 erwähnten bindtextdomain()-Funktion übergeben. Im Ordner „locale“ legt man für jede Sprache einen Ordner an. Die Ordnernamen müssen immer die Sprachkürzel der jeweiligen Sprache sein. So heißt der Ordner für deutsch „de_DE“, der Ordner für spanisch „es_ES“, usw. In jedem Sprachordner muss ein weiterer Ordner mit dem Namen „LC_MESSAGES“ angelegt werden. In diesen Ordner legt man schließlich die oben über die Linux-Konsole angelegte .po-Datei.

 

Die Sprachdateien mit Poedit übersetzen

Um die Sprachdateien komfortabel übersetzen zu können ist das Programm Poedit hilfreich. Dieses Programm sollte als nächstes installiert werden, sofern nicht schon vorhanden. Natürlich lassen sich die .po-Dateien auch in einem ganz normalen Texteditor aufrufen und übersetzen. Die Zeile mit „msgid“ beinhaltet dabei immer den Platzhalter, z.B. „Hello World“, der in jeder Sprache immer derselbe ist und auch der PHP-gettext()-Funktion als String übergeben wird. In der zweiten Zeile „msgstr“ befindet sich dann die jeweilige Übersetzung. Mit Poedit kann man nun jede .po-Datei aufrufen, übersetzen und abspeichern. Dabei wird die .mo-Datei erzeugt. Sind alle Übersetzungen fertig und alle .mo-Dateien erzeugt startet man den Server neu. Jetzt sollten die Übersetzungen auf der Website angezeigt werden.

 

Hilfe bei Fehlern

Sollte es zu einer Fehlermeldung kommen, überprüft man, ob in der .po-Datei in der Zeile 9 die  Project-Id-Version gesetzt wurde und vergibt diese ggf. manuell neu.
Auch kann ein Neustarten des Servers helfen oder die Dateirechte der betroffenen Dateien vorübergehend auf 777 setzen.

Des Weiteren ist es wichtig  zu prüfen, ob die entsprechende Sprachdatei überhaupt auf dem System installiert ist und ob den Funktionen putenv() und setlocale() der korrekte Dateinamen übergeben wurde, z.B. ‚de_DE.utf8‘.

Dieser Linux-Befehl überprüft ob eine Sprachdatei überhaupt auf dem System installiert ist:

 

locale -a

 

Weitere hilfreiche Links:

http://mel.melaxis.com/devblog/2005/08/06/localizing-php-web-sites-using-gettext/

http://www.phpbar.de/w/Gettext

http://phptal.org/manual/de/split/gettext.html

https://lingohub.com/blogs/2013/07/php-internationalization-with-gettext-tutorial/

http://stackoverflow.com/questions/5657654/gettext-setup-not-working