Avatar

Tagesnamen im Header (General)

by Auge ⌂, Monday, November 07, 2022, 12:50 (21 days ago) @ Willi

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

--
Trenne niemals Müll, denn er hat nur eine Silbe!


Complete thread:

 RSS Feed of thread