Hallo
im Kopf eines Postings steht ja als erstes der Titel des Beitrages und dann eine Zeile mit ein paar Informationen von wem und wann der Beitrag erstellt wurde. Da steht auch der Tag dabei aber trotz der Einstellung Deutsch" in englisch. Wo kann ich das anpassen?
Ich habe mich nun auch durch den Quelltext kämpfen müssen und bin dabei einer Ungereimtheit auf die Spur gekommen.
Anhand des Beispiels der Einzelpostingansicht habe ich nachvollzogen, was passiert. In dem Skript entry.inc.php
wird in Zeile 54 der aus dem Datenbankeintrag stammende Unix-Zeitstempel mit der Funktion format_time
behandelt. Ihr wird das aus dem $lang
-Schlüssel time_format_full
stammende, sprachabhängige Datumsformat und der Zeitstempel übergeben. Die Funktion selbst ist in der functions.inc.php ab Zeile 1677 definiert und verweist auf die PHP-Funktion date
. In der Doku zu date
wird bezüglich des Formats auf den Doku-Eintrag für date_format
verwiesen.
In der deutschen Sprachdatei ist für den Schlüssel time_format_full
der Wert l, d.m.Y, H:i
notiert. In der Doku zu date_format
[/link] ist für l
folgendes angegeben:
l (kleines 'L') | Vollständige textuelle Darstellung eines Tages | Sunday bis Saturday
Wir können erst einmal festhalten, dass aus der PHP-seitigen Behandlung ein englischsprachiger Wochentagsname herausfällt. Dass PHP von sich aus keine automatische Übersetzung in eine per locale angegebene Zielsprache enthält, sollte klar sein.
Wir sind aber noch nicht am Ende. Der Wert der Variablen $entrydata['formated_time']
, die den in entry.inc.php, Zeile 54 formatierten Datumsstring aufnimmt, wird in Zeile 254 an das Smarty-Objekt und damit an das Template übergeben. Dort wird es (unter Anderem) in Zeile 31 benutzt, um die Metadaten des Beitrags zusammenzubauen. Das folgende ist der gesamte Abschnitt für das HTML-Element, das diese Informationen nachher anzeigen soll.
<p class="author">{*{assign var=formated_time value=$disp_time|date_format:#time_format_full#}*}{if $location}{#posted_by_location#|replace:"[name]":$name|replace:"[email_hp]":$email_hp|replace:"[location]":$location|replace:"[time]":$formated_time}{else}{#posted_by#|replace:"[name]":$name|replace:"[email_hp]":$email_hp|replace:"[time]":$formated_time}{/if} <span class="ago">({if $ago.days>1}{#posting_several_days_ago#|replace:"[days]":$ago.days_rounded}{else}{if $ago.days==0 && $ago.hours==0}{#posting_minutes_ago#|replace:"[minutes]":$ago.minutes}{elseif $ago.days==0 && $ago.hours!=0}{#posting_hours_ago#|replace:"[hours]":$ago.hours|replace:"[minutes]":$ago.minutes}{else}{#posting_one_day_ago#|replace:"[hours]":$ago.hours|replace:"[minutes]":$ago.minutes}{/if}{/if})</span>{if $admin && $ip} <span class="ip">({$ip})</span>{/if}{if $pid!=0} <span class="op-link"><a href="index.php?id={$pid}" title="{#original_posting_linktitle#|replace:"[name]":$data.$pid.name}">@ {$data.$pid.name}</a></span>{/if}{if $edited}{*{assign var=formated_edit_time value=$edit_time|date_format:#time_format_full#}*}<br />
<span class="edited">{#edited_by#|replace:"[name]":$edited_by|replace:"[time]":$formated_edit_time}</span>{/if}</p>
Ich ziehe mal den relevanten Teil neu formatiert heraus.
{*{assign var=formated_time value=$disp_time|date_format:#time_format_full#}*}
{if $location}
{#posted_by_location#|replace:"[name]":$name|replace:"[email_hp]":$email_hp|replace:"[location]":$location|replace:"[time]":$formated_time}
{else}
{#posted_by#|replace:"[name]":$name|replace:"[email_hp]":$email_hp|replace:"[time]":$formated_time}
{/if}
Speziell die erste Zeile interessiert hier, da danach der "fertige" Wert nur noch ausgegeben wird. Die erste Zeile des obigen Blocks nochmal neu formatiert.
{*
{
assign var=formated_time
value=$disp_time|date_format:#time_format_full#
}
*}
Das Smarty-Skript holt sich mit assign
die Variable formated_time
(an Smarty in entry.inc.php, Zeile 254 übergeben), weist ihr den Wert von $disp_time
zu und formatiert diesen mit der Angabe time_format_full aus der Sprachdatei. Also wird auch hier das Datumsformat l, d.m.Y H:i
mit dem englischsprachigen Wochentagsnamen angewandt.
Womit wir bei der oben angekündigten Ungereimtheit wären.
$disp_time
ist der ursprüngliche, aus dem Datenbankeintrag stammende und in entry.inc.php in Zeile 31 mit der Funktion format_time
formatierte und an die PHP-Variable $entrydata['formated_time']
übergebene Wert. Es gibt also schon ein formatiertes Datum, das in entry.inc.php, Zeile 254 an die Smarty-Variable formated_time
übergeben wird und nun wieder mit seinem Ausgangswert überschrieben wird, der seinerseits danach wieder so formatiert wird, wie der soeben überschriebene Wert von formated_time
.
Wenn Alex noch aktiv wäre, könnte man ihn fragen, was seine Motivation für dieses Konstrukt war. Ich würde fast vermuten, dass er das erst mit dem einen System implementiert hat und dann auf das andere System gewechselt ist, ohne alle Stellen der Implementierung mit dem ersten System "aufzuräumen".
Long story short: PHP bietet von sich aus keine Möglichkeit, mit bordeigenen Mitteln den Wochentag sprachabhängig anzugeben. Es ist aber prinzipiell kein Problem, die Wochentage in den Sprachdateien anzugeben und mit einer eigenen Funktion, die die numerische Angabe des Wochentags, die aus dem Datum zu extrahieren ist, in die Wochentagsnamen aus den Sprachdateien zu übersetzen.
Tschö, Auge