Deutsch English
WordPress Read this post in English

Datumsformatierung in WordPress

Achtung: Dieser Post ist ziemlich alt. Insbesondere die Vorschläge unter Punkt 2 und 3 sind nicht mehr zeitgemäß. Neuere Hinweise zur Datumsformatierung mit qTranslate gibt es hier.

Nach dem Update auf WordPress 2.5 hatte ich – wie offensichtlich viele andere auch – das Problem, daß Datum und Uhrzeit der Posts nicht mehr lokalisiert wurden. Wochentags‑ und Monatsnamen wurden nicht mehr übersetzt, und auch über die Anzahl der Kommentare wurde man nur noch mit einem englischen „x comments“ informiert. Die vielfach empfohlene setlocale()-Funktion brachte keine Besserung – wieso sollte sie auch? Schließlich hatte ich sowohl WordPress als auch PHP bereits in den Konfigurationsdateien auf deutsch eingestellt.

Wieso, weshalb, warum, kann ich leider auch nicht sagen, aber ich habe nach einigem Ausprobieren Lösungen gefunden, die zumindest für mich funktionieren.

1.) Lokalisierter Kommentar-Link

Mein Template verwendete die Funktion comments_popup_link(), um den Link zu den Kommentaren zu erzeugen. Früher wurde dieser Link automatisch ins Deutsche übersetzt, also z. B. „Keine Kommentare“ anstatt „No comments“. Seit Version 2.5 jedoch klappt das nicht mehr. Also habe ich in meinem Template die Zeile

<?php comments_popup_link() ?>

ersetzt durch

<a href="<?php comments_link(); ?>"><?php comments_number(); ?>

Im Gegesatz zu comments_popup_link() zeigt die Funktion comments_number() die Anzahl der Kommentare – und eben auch die dazugehörigen Wörter wie „keine“, „Kommentar“ und „Kommentare“ – brav auf deutsch an. Da sie aber den Link zu den Kommentaren nicht selbst erzeugt, muß man diesen eben noch mit comments_link() drum herum bauen.

2.) Lokalisierte Datumsanzeige bei Posts

Anstelle von the_date() bzw. _e(the_date('l, d. F Y, H:i','','',FALSE)) setzte ich in meinem Template folgendes ein:

_e(
    htmlentities(
        strftime('%A, %e. %B %Y um %R Uhr',
            strtotime(
                the_date('Y/m/d H:i', '', '', FALSE)
            )
        )
    )
)

(Natürlich kann man das einfach hintereinander weg schreiben – ich habe es jetzt nur der Lesbarkeit halber so gemacht.)

Was macht diese Codezeile?

Grob gesagt sorgt sie dafür, daß das Datum nicht direkt mittels the_date() ausgegeben wird, sondern zur weiteren Formatierung an strftime() weitergegeben wird. Im Gegensatz zu the_date() funktioniert nämlich bei strftime() die Lokalisierung einwandfrei.

Wer es genau wissen will:
  1. Zuerst wird mithilfe von the_date() das Postdatum in die Form „Jahr/Monat/Tag Stunde:Minute“ gebracht, also z. B. 2008/05/11 10:30.
  2. Dieses Datum wird dann an strtotime() weitergereicht, welches daraus einen Unix-Timestamp macht, z. B. 1210494600.
  3. Und dieser Timestamp wird schließlich an die Funktion strftime() übergeben, mit der man das Datum entsprechend seiner Ländereinstellung beliebig formatieren kann. Juhu!
  4. Drumherum habe ich noch ein htmlentities() gepackt, damit man anstelle von „März“ nicht ein „M?rz“ zu lesen bekommt.

Die verschiedenen Formatierungsparameter von strftime() findet man bei php.net. Das oben gezeigte Beispiel '%A, %e. %B %Y um %R Uhr' würde folgendes ausgeben: Sonntag, 11. Mai 2008 um 10:30 Uhr

Mehrere lokalisierte Datumsformate mit qTranslate

Wer wie ich für die Mehrsprachigkeit seiner Seite das Plugin qTranslate verwendet, der kann mithilfe von Language-Tags ganz einfach verschiedene Datumsformate für die verschiedenen Sprachen angeben. So möchte ich z. B., dass das deutsche Datum im Format „Sonntag, 11. Mai 2008 um 10:30 Uhr“ ausgegeben wird, das englische dagegen als „Sunday, 11 May 2008 at 10:30 am“. Man schreibt also das Ganze einfach zweimal hin mit den entsprechenden Language-Tags und Datumsformaten. Das sieht dann folgendermaßen aus:

_e(
    '<!--:de-->'.htmlentities(
        strftime('%A, %e. %B %Y um %R Uhr', 
            strtotime(
                the_date('Y/m/d H:i', '', '', FALSE)
            )
        )
    )
    .'<!--:--><!--:en-->'.htmlentities(
        strftime('%A, %e %B %Y at %I:%M %P', 
            strtotime(
                the_date('Y/m/d H:i', '', '', FALSE)
            )
        )
    ).'<!--:-->'
)

Zwar stellt qTranslate eine eigene Funktionen zur Formatierung des Postdatums bereit, die das Ganze etwas abkürzen würde:

_e(
    '<!--:de-->'.
    qtrans_formatPostDateTime('%A, %e. %B %Y um %R Uhr')
    .'<!--:--><!--:en-->'.
    qtrans_formatPostDateTime('%A, %e %B %Y at %I:%M %P')
    .'<!--:-->'
)

Doch leider hat diese bei mir nicht funktioniert – das Ergebnis sah immer so oder so ähnlich aus: %PM, %Europe/Berlin. %487 %2008 u05 %R 121050249512. Inzwischen habe ich herausgefunden, daß die qTranslate-Funktionen ebenfalls nur mit einem date()-Format umgehen kann, obwohl der Autor hier ausdrücklich geschrieben hat, den Funktionen sei ein strftime()-Format zu übergeben. Warum das so ist, weiß ich nicht – evtl. liegt es daran, daß ich WordPress 2.5 verwende, welches bisher noch nicht vollständig von qTranslate unterstützt wird. Jedenfalls erklärt das die merkwürdige Ausgabe, denn A steht bei date() für ein großgeschriebenes „AM“ bzw. „PM“, e steht für die Zeitzone etc.

Beim Datum der Kommentare hingegen sah ich mich gezwungen, die von qTranslate beigesteuerte Datumsfunktion zu verwenden, da ich von WordPress selbst aus bisher keine finden konnte, die das Datum einfach nur zurückgibt, anstatt es sofort anzuzeigen. Da ich ja nun herausgefunden hatte, wie die qTranslate-Funktionen in Wirklichkeit ticken, habe ich das folgendermaßen gelöst:

_e(
    '<!--:de-->'.htmlentities(
        strftime('%A, %e. %B %Y um %R Uhr', 
            strtotime(
                qtrans_formatCommentDateTime('Y/m/d H:i')
            )
        )
    ).'<!--:--><!--:en-->'.htmlentities(
        strftime('%A, %e %B %Y at %I:%M %P', 
            strtotime(
                qtrans_formatCommentDateTime('Y/m/d H:i')
            )
        )
    ).'<!--:-->'
)


Kommentare

  1. 23. November 2011
    12:17 Uhr

    Matthew flag

    Hi, thanks very much for this, it helped me finish manipulating the post date in WordPress into Spanish.

    Here’s the code that ended up working for me, in case it’s useful for anyone else:

    This gives you the following format: “Jueves, 9 de junio, 2011″


    Ginchen: Damn, my backtick code insertion plugin was disabled … Sorry. Maybe you can post your code again, it should be working now!

  2. 2. Oktober 2010
    1:07 Uhr

    Natalia flag

    DANKE DANKE DANKE!

  3. 16. Juli 2008
    20:38 Uhr

    Detlef flag

    Hallo Ginchen,

    du bist echt genial, hab es umgesetzt wenn du mal kucken willst:
    http://www.divadlokufr.net/wordpress

    Lieben Dank

    Detlef

  4. 16. Juli 2008
    17:27 Uhr

    Detlef flag

    Hallo Ginchen,

    wie hast du denn den Blogtitel durch qtranslate übersetzt???

    Mein header sieht so aus:
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <link rel="stylesheet" href="" type="text/css" media="screen" />


    Anmerkung: Also, erst mal habe ich den Blogtitel im Backend unter „Einstellungen“ → „Blogtitel“ mit Language-Tags eingetragen. Dort steht also:

    [:de]Ginchens Blog[:en]Ginchen's Blog

    Die Browser-Titelleiste im Format „Ginchens Blog » Name des Posts“ entsteht wie folgt:

    &lt;title&gt;&lt;?php bloginfo('name'); ?&gt;&lt;?php wp_title(); ?&gt;&lt;/title&gt;

    Und die Überschrift ganz oben auf der Seite, die gleichzeitig ein Link zur Startseite ist, geht so:

    &lt;a href=&quot;&lt;?php
    	echo get_settings('home');
    	_e('[:de]/[:en]/en/'); ?&gt;"&gt;
    	&lt;?php bloginfo('name'); ?&gt;
    &lt;/a&gt;

    Dadurch wird je nach Sprache „/en/“ ans Ende des Links angehängt oder eben nur ein Slash.

Kommentieren

Erlaubtes HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <p> <pre lang="" line="" escaped=""> <q cite=""> <strike> <strong> <img src="" alt="" class="" width="" height=""> | Codeschnipsel können in `backticks` gepostet werden. Beispiel: `<?php echo "Hi!"; ?>`