PHP: setlocale() funktioniert nicht? Lösung für deutsche Datumsangaben (in WordPress)
sk, den 27. Februar 2013Wer in PHP Datumsangaben mithilfe der date()
-Funktion ausgeben will, muss sich entweder mit englischen Monatsnamen zufrieden geben oder sich eine Lösung „basteln“. Das geht relativ einfach – benötigt wird lediglich die setlocale()
-Funktion und das Wissen, dass date()
immer nur Englisch sprechen wird.
Schritt 1: Server-Konfiguration
Wer seine Webseite auf einem Shared-Webspace-Hoster speichert, der fragt am besten seinen Hoster. Wer selbst Hand anlegen kann, ind er Regel auf einem vServer oder einem root-Server, der sollte überprüfen, ob die notwendigen Sprachpakete installiert sind. Dies richtet unter Linux der Befehl locale -a
. Genauer eingrenzen kann man das Ganze, wenn man direkt nach der Sprache sucht, die man verwenden möchte. Sollte das Deutsch sein, kommt einfach der grep
-Befehl dazu: locale -a | grep de_DE
.
Schritt 2: Sprache einstellen
Nun muss im PHP-Script festgelegt werden, welche Sprache für lokalisierte Ausgaben verwendet werden soll. Dafür ist der Befehl setlocale()
zuständig.1 Wenn der Server bereits auf Deutsch eingestellt ist, kann dies sogar entfallen, aber verlassen sollte man sich darauf nicht. Die $category
wird im PHP-Handbuch aufgeführt. Für alle Sprachkategorien wird sie einfach auf LC_ALL
gesetzt, wenn explizit nur Zeitangaben gemeint sind, sollte LC_TIME
genutzt werden. Die weiteren Parameter bezeichnen die Sprach-Kürzel, die der locale
-Befehl auf der Konsole ausgegeben hat. Auf einem Debian-Server dürfte de_DE@euro
eine gute Wahl sein. Ansonsten lohnt abermals ein Blick in die PHP-Dokumentation, wo alle gängigen Sprachnamen aufgeführt sind. PHP wird in der Reihenfolge der Parameter alle Sprachen ausprobieren und fällt im Zweifel auf die Standardsprache des Servers zurück. Bei uns heißt der Befehl also: setlocale(LC_ALL, 'de_DE@euro');
Schritt 3: date() kann nur Englisch!
Wer sich nun nach der Einstellung mit echo date('j. F Y');
das aktuelle Datum ausgeben lassen will, wird feststellen, dass trotz setlocale()
nur „15. February 2013“ angezeigt wird. Das liegt daran, dass die date()
-Funktion generell nur englische Bezeichnungen ausgeben wird.2
Schritt 4: Mit strftime() zum Ziel
Die Lösung heißt in dem Fall strftime()
3, denn diese Funktion greift auf die übersetzten Begriffe zurück und nutzt dabei die Sprache, die mittels setlocale()
eingestellt wurde. Will man also den „15. Februar 2013“ ausgegeben sehen, lautet der korrekte Befehl echo strftime('%d. %B %Y');
. Welche Variablen es sonst noch gibt, verrät die PHP-Dokumentation.
Deutsches Datum im WordPress-Template
Ursächlich für diese Anleitung war die Suche nach einer Möglichkeit, „schöne“ Datumsangaben in der Artikel-Auflistung eines WordPress-Templates zu erzeugen. Ursprünglich lautete der Code im Template wie folgt:
<?php echo get_the_date("j. F Y"); ?>
Die Funktion get_the_date()
4 erwartet als Parameter ein Format, das mit der date()
-Funktion von PHP kompatibel ist. strftime()
wiederum verlangt einen Unix-Timestamp, wenn nicht die aktuelle Uhrzeit benötigt wird. Laut date()
ist der Unix-Timestamp mit einem „U“ zu haben. Demzufolge kann man obige Funktion einfach anpassen, sodass eine deutsche Ausgabe ermöglicht wird:
<?php echo strftime("%e. %B %Y", get_the_date("U")); ?>