Deutsche Monate
Bernd
- php
Guten Morgen,
ich möchte gerne die Monate in deutsche angezeigt haben:
date_default_timezone_set('Europe/Berlin');
$html_title = date('Y / F', $timestamp);
Als Ausgabe erhalte ich
2018 / March
Wie kann ich den Monat auf deutsch umstellen?
Tach!
Wie kann ich den Monat auf deutsch umstellen?
Zitat aus dem PHP-Handbuch zu date() im Abaschitt Examples, kurz vor Notes: "To format dates in other languages, you should use the setlocale() and strftime() functions instead of date()."
dedlfix.
Hallo,
schade, dann muss ich mir etwas anderes einfallen lassen. Das ganze Kalender Script welches ich nicht selber geschrieben habe baut auf date() auf.
Tach!
schade, dann muss ich mir etwas anderes einfallen lassen. Das ganze Kalender Script welches ich nicht selber geschrieben habe baut auf date() auf.
Wenn du sowieso Änderungen vornehmen muss, um die Anzeige lokalisiert zu bekommen, warum änderst du dann nicht von date() zu strftime()? Die Basis ist in beiden Fällen der Unix-Timestamp. date() und strftime() sind lediglich verschiedene Funktionen für die Darstellung. Sie können grundlegend dasselbe, nur die Details der Verwendung ist unterschiedlich. Problematisch Ein wenig herausfordernd sehe ich es nur dann an, wenn die Format-Strings programmatisch erzeugt werden und sich Erstellung und Verwendung durchs ganze Programm ziehen. Solange der Formatstring jedoch nur lokal begrenzt existiert, sehe ich einen Wechsel zu strftime() als unproblematisch an.
dedlfix.
@@dedlfix
Die Basis ist in beiden Fällen der Unix-Timestamp. date() und strftime() sind lediglich verschiedene Funktionen für die Darstellung. Sie können grundlegend dasselbe, nur die Details der Verwendung ist unterschiedlich.
ProblematischEin wenig herausfordernd sehe ich es nur dann an, wenn die Format-Strings programmatisch erzeugt werden und sich Erstellung und Verwendung durchs ganze Programm ziehen.
Ich sehe das schon als problematisch falsch an. date()
bzw. strftime()
sollten bei der Ausgabe Verwendung finden und kein bisschen vorher.
LLAP 🖖
Tach!
Die Basis ist in beiden Fällen der Unix-Timestamp. date() und strftime() sind lediglich verschiedene Funktionen für die Darstellung. Sie können grundlegend dasselbe, nur die Details der Verwendung ist unterschiedlich.
ProblematischEin wenig herausfordernd sehe ich es nur dann an, wenn die Format-Strings programmatisch erzeugt werden und sich Erstellung und Verwendung durchs ganze Programm ziehen.Ich sehe das schon als
problematischfalsch an.date()
bzw.strftime()
sollten bei der Ausgabe Verwendung finden und kein bisschen vorher.
Vielleicht hast du das falsch verstanden. Ich sagte und meinte die Format-Strings, nicht die Funktionsaufrufe.
Anwendungsfall: Welches Format Verwendung finden soll, ist nicht fest vorgegeben, sondern soll vom Anwender bestimmt werden können. Dazu muss eine entsprechende Information in der Datenhaltung festgehalten werden, und dann zieht siche die Formatierinformation eben durchs Programm vom Festlegen durch den Anwender bis hin zu den Ausgaben mit entsprechender Datenhaltungsbefragung.
Eine Frage des Details ist es, ob man wirklich die Format-Strings (von date()) nimmt, oder ob man einen generischen Enum-Wert nimmt, also sich die Liste an verwendbaren Werten anderweitig definiert und erst zu Verwendung den konkreten Format-String erzeugt. Das kommt ja auch darauf an, wieviel Flexibilität man dem Anwender geben möchte.
dedlfix.
Hallo,
ich werde mir die Funktion strftime() die Tage etwas genauer ansehen.
Jetzt habe ich es erst einmal wie folgt gelöst
$monate = array(
1=>"Januar",
2=>"Februar",
3=>"März",
4=>"April",
5=>"Mai",
6=>"Juni",
7=>"Juli",
8=>"August",
9=>"September",
10=>"Oktober",
11=>"November",
12=>"Dezember"
);
// H3 Title
$html_title = $monate[$month] . " " . date('Y', $timestamp);
@@Bernd
ich werde mir die Funktion strftime() die Tage etwas genauer ansehen.
Tu das. Die spricht übrigens auch österreichisch.
Jetzt habe ich es erst einmal wie folgt gelöst
Buh!
LLAP 🖖
<?php
$loc_de = setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu');
echo "Gewählte Locale-Einstellung: '$loc_de'";
?>
Wenn das scheinbar nichts (genauer: false) zurück gibt, dann fehlen schlicht und einfach Sprachbibliotheken auf dem System. PHP nutzt dafür keine eigenen. (Zitat aus dem Handbuch: "Es ist durchaus möglich, dass Ihre C-Bibliothek nicht alle angegebenen Formatierungszeichen erkennt.")
Um das zu beheben sollte durch einen Administrator auf dem Server das Paket locales-all
installiert werden. (eg. ~> sudo apt install locales-all
).
Das sind allerdings rund 127MB. Wie auf einem Server einzelne Locales generiert werden können beschreibt Thomas Krenn. Dort finden sich auch weitere Informationen.
Danach ergibt:
<?php
echo setlocale (LC_ALL, 'de_DE.UTF-8') . "\n";
echo strftime ('%B', time() ) . "\n";
wie folgt:
de_DE
März
Falls Du den Monat in ISO-8859-15 oder Windows-1252-Kodierung ausgeben möchtest:
setlocale (LC_ALL, 'de_DE@euro');
Hi there,
Du hast letzten Endes eh das einzig richtige gemacht. Mit dem Zeitaufwand, in dem Du Dir da irgendetwas überlegst und im Forum Rat suchst, Dich quälst, ob Du beim Studium des Handbuchs nicht irgendetwas unglaublich Wichtiges übersehen hast, hättest Du schon hundertmal einfach ein Array mit deutschen Monatsnamen anlegen können (sogar mit Deinem komischen 'Januar'😉). Ein anderer jedenfalls hat in der selben Zeit schon die Rechnung gestellt, das sollte man nie vergessen…
Ein anderer jedenfalls hat in der selben Zeit schon die Rechnung gestellt, das sollte man nie vergessen…
Nun ja. Dann müsste man sich bei einer Internationalisierung der Webseite allerdings womöglich eine Menge Monatsnamen für die Sprachen heraussuchen … Beispiel für Linux-Server mit installiertem Paket "locale-all":
<?php
$sprachen=explode("\n", `locale -a`);
foreach ($sprachen as $s) {
if ( strpos ( $s, '.utf8' ) ) {
$sprache = str_replace('.utf8', '.UTF-8', $s );
if ( $l = setlocale ( LC_ALL, $sprache ) ) {
echo $l . " :\t" . strftime ('%B', time() ) . "\n";
}
}
}
Ergebnis: (152 Zeilen)
aa_DJ.UTF-8 : Ciggilta Kudo
af_ZA.UTF-8 : Maart
an_ES.UTF-8 : marzo
ar_AE.UTF-8 : مارس
ar_BH.UTF-8 : مارس
ar_DZ.UTF-8 : مارس
ar_EG.UTF-8 : مارس
ar_IQ.UTF-8 : مارس
ar_JO.UTF-8 : آذار
ar_KW.UTF-8 : مارس
ar_LB.UTF-8 : آذار
ar_LY.UTF-8 : مارس
ar_MA.UTF-8 : مارس
ar_OM.UTF-8 : مارس
ar_QA.UTF-8 : مارس
ar_SA.UTF-8 : آذار
ar_SD.UTF-8 : مارس
ar_SY.UTF-8 : آذار
ar_TN.UTF-8 : مارس
ar_YE.UTF-8 : مارس
ast_ES.UTF-8 : marzu
be_BY.UTF-8 : Сакавік
bg_BG.UTF-8 : март
bhb_IN.UTF-8 : March
br_FR.UTF-8 : Meurzh
bs_BA.UTF-8 : Mart
ca_AD.UTF-8 : març
ca_ES.UTF-8 : març
ca_ES.UTF-8@valencia : març
ca_FR.UTF-8 : març
ca_IT.UTF-8 : març
cs_CZ.UTF-8 : březen
cy_GB.UTF-8 : Mawrth
da_DK.UTF-8 : marts
de_AT.UTF-8 : März
de_BE.UTF-8 : März
de_CH.UTF-8 : März
de_DE.UTF-8 : März
de_LI.UTF-8 : März
de_LU.UTF-8 : März
el_CY.UTF-8 : Μάρτιος
el_GR.UTF-8 : Μάρτιος
en_AU.UTF-8 : March
en_BW.UTF-8 : March
en_CA.UTF-8 : March
en_DK.UTF-8 : March
en_GB.UTF-8 : March
en_HK.UTF-8 : March
en_IE.UTF-8 : March
en_NZ.UTF-8 : March
en_PH.UTF-8 : March
en_SG.UTF-8 : March
en_US.UTF-8 : March
en_ZA.UTF-8 : March
en_ZW.UTF-8 : March
eo_US.UTF-8 : Marto
eo.UTF-8 : Marto
es_AR.UTF-8 : marzo
es_BO.UTF-8 : marzo
es_CL.UTF-8 : marzo
es_CO.UTF-8 : marzo
es_CR.UTF-8 : marzo
es_DO.UTF-8 : marzo
es_EC.UTF-8 : marzo
es_ES.UTF-8 : marzo
es_GT.UTF-8 : marzo
es_HN.UTF-8 : marzo
es_MX.UTF-8 : marzo
es_NI.UTF-8 : marzo
es_PA.UTF-8 : marzo
es_PE.UTF-8 : marzo
es_PR.UTF-8 : marzo
es_PY.UTF-8 : marzo
es_SV.UTF-8 : marzo
es_US.UTF-8 : marzo
es_UY.UTF-8 : marzo
es_VE.UTF-8 : marzo
et_EE.UTF-8 : märts
eu_ES.UTF-8 : martxoa
eu_FR.UTF-8 : martxoa
fi_FI.UTF-8 : maaliskuu
fo_FO.UTF-8 : mars
fr_BE.UTF-8 : mars
fr_CA.UTF-8 : mars
fr_CH.UTF-8 : mars
fr_FR.UTF-8 : mars
fr_LU.UTF-8 : mars
ga_IE.UTF-8 : Márta
gd_GB.UTF-8 : Am Màrt
gl_ES.UTF-8 : Marzo
gv_GB.UTF-8 : Mayrnt
he_IL.UTF-8 : מרץ
hr_HR.UTF-8 : Ožujak
hsb_DE.UTF-8 : Měrc
hu_HU.UTF-8 : március
id_ID.UTF-8 : Maret
is_IS.UTF-8 : mars
it_CH.UTF-8 : marzo
it_IT.UTF-8 : marzo
iw_IL.UTF-8 : מרץ
ja_JP.UTF-8 : 3月
ka_GE.UTF-8 : მარტი
kk_KZ.UTF-8 : Наурыз
kl_GL.UTF-8 : martsi
ko_KR.UTF-8 : 3월
ku_TR.UTF-8 : adar
kw_GB.UTF-8 : Mys Merth
lg_UG.UTF-8 : Marisi
lt_LT.UTF-8 : kovo
lv_LV.UTF-8 : marts
mg_MG.UTF-8 : martsa
mi_NZ.UTF-8 : Poutū-te-rangi
mk_MK.UTF-8 : март
ms_MY.UTF-8 : Mac
mt_MT.UTF-8 : Marzu
nb_NO.UTF-8 : mars
nl_BE.UTF-8 : maart
nl_NL.UTF-8 : maart
nn_NO.UTF-8 : mars
oc_FR.UTF-8 : març
om_KE.UTF-8 : Bitooteessa
pl_PL.UTF-8 : marzec
pt_BR.UTF-8 : março
pt_PT.UTF-8 : Março
ro_RO.UTF-8 : martie
ru_RU.UTF-8 : Март
ru_UA.UTF-8 : Март
sk_SK.UTF-8 : marec
sl_SI.UTF-8 : marec
so_DJ.UTF-8 : Bisha Saddexaad
so_KE.UTF-8 : Bisha Saddexaad
so_SO.UTF-8 : Bisha Saddexaad
sq_AL.UTF-8 : mars
st_ZA.UTF-8 : Tlhakubele
sv_FI.UTF-8 : mars
sv_SE.UTF-8 : mars
tcy_IN.UTF-8 : ಮಾರ್ಚ್
tg_TJ.UTF-8 : Марта
th_TH.UTF-8 : มีนาคม
tl_PH.UTF-8 : Marso
tr_CY.UTF-8 : Mart
tr_TR.UTF-8 : Mart
uk_UA.UTF-8 : березень
uz_UZ.UTF-8 : Mart
wa_BE.UTF-8 : måss
xh_ZA.UTF-8 : eyoKwindla
yi_US.UTF-8 : מאַרץ
zh_CN.UTF-8 : 三月
zh_HK.UTF-8 : 三月
zh_SG.UTF-8 : 三月
zh_TW.UTF-8 : 三月
zu_ZA.UTF-8 : uNdasa
Noch spannender wird es mit der Formatanweisung "%x", der "bevorzugten" Ausgabeformatierung ohne Uhrzeit.
Hi there,
Ein anderer jedenfalls hat in der selben Zeit schon die Rechnung gestellt, das sollte man nie vergessen…
Nun ja. Dann müsste man sich bei einer Internationalisierung der Webseite allerdings womöglich eine Menge Monatsnamen für die Sprachen heraussuchen
Weil das eh so viele machen. Ich arbeite seit fast 40 Jahre in dieser Branche. Bis heute hab ich erst ein einziges Mal etwas mit "Internationalisierung" zu tun gehabt, das war vor 20 Jahren und hatte mit Webseiten absolut nichts zu tun…
Ein anderer jedenfalls hat in der selben Zeit schon die Rechnung gestellt, das sollte man nie vergessen…
Nun ja. Dann müsste man sich bei einer Internationalisierung der Webseite allerdings womöglich eine Menge Monatsnamen für die Sprachen heraussuchen … Beispiel für Linux-Server mit installiertem Paket "locale-all":
Ne, eben nicht Locale. Wenn die Sprache ausgehandelt werden soll bzw. der Anwender diese bestimmen möchte, ist die Spracheinstellung des Servers so ziemlich irrelevant.
MfG
@@pl
Ne, eben nicht Locale. Wenn die Sprache ausgehandelt werden soll bzw. der Anwender diese bestimmen möchte, ist die Spracheinstellung des Servers so ziemlich irrelevant.
Na eben doch Locale. Ensprechend der ausgehandelten Sprache möchte man die Seite in ebendieser serverseitig generieren und deshalb serverseitig die Sprache entsprechend setzen.
LLAP 🖖
hi Gunnar,
Ne, eben nicht Locale. Wenn die Sprache ausgehandelt werden soll bzw. der Anwender diese bestimmen möchte, ist die Spracheinstellung des Servers so ziemlich irrelevant.
Na eben doch Locale. Ensprechend der ausgehandelten Sprache möchte man die Seite in ebendieser serverseitig generieren und deshalb serverseitig die Sprache entsprechend setzen.
Du bist damit vom Provider abhängig, also was der an locale verfügbar macht. Im shared host Betrieb oft nur en. Und das ist eben der Unterschied zwischen Theorie und Praxis 😉
Tach!
Du bist damit vom Provider abhängig, also was der an locale verfügbar macht. Im shared host Betrieb oft nur en. Und das ist eben der Unterschied zwischen Theorie und Praxis 😉
In der Praxis hat man auch das Ergebnis des Unicode-CLDR-Projekt (Unicode Common Locale Data Repository) zur Verfügung und ist damit unabhängig von der Systeminstallation.
dedlfix.
Tach!
Du bist damit vom Provider abhängig, also was der an locale verfügbar macht. Im shared host Betrieb oft nur en. Und das ist eben der Unterschied zwischen Theorie und Praxis 😉
In der Praxis hat man auch das Ergebnis des Unicode-CLDR-Projekt (Unicode Common Locale Data Repository) zur Verfügung und ist damit unabhängig von der Systeminstallation.
Perl's DateTime::Locale::Data - Locale data generated from CLDR
Das Modul macht unabhängig von Locale will aber auch erst installiert sein. Gibt es was vergleichbares in PHP?
MfG
my $dt = DateTime->now( locale => 'fr' );
print "Aujourd'hui le mois est " . $dt->month_name, "\n";
Ca va 😉
Tach!
Das Modul macht unabhängig von Locale will aber auch erst installiert sein. Gibt es was vergleichbares in PHP?
Ich habe keine Ahnung, inwieweit das vergleichbar ist, aber "PHP CLDR" als Suchwörterkombination findet mehrere Projekte, die sich damit beschäftigen.
dedlfix.
Tach!
Das Modul macht unabhängig von Locale will aber auch erst installiert sein. Gibt es was vergleichbares in PHP?
Ich habe keine Ahnung, inwieweit das vergleichbar ist, aber "PHP CLDR" als Suchwörterkombination findet mehrere Projekte, die sich damit beschäftigen.
Punic sieht doch richtig gut aus. Als PHP Entwickler würde ich mich in diese Richtung orientieren, zumal das offensichtlich pure PHP ist -- Pfade legen, require, fertig.
MfG
Punic sieht doch richtig gut aus. Als PHP Entwickler würde ich mich in diese Richtung orientieren, zumal das offensichtlich pure PHP ist -- Pfade legen, require, fertig.
Funktioniert prima 😉
dimanche 11 mars 2018
Sonntag, 11 März 2018
воскресенье, 11 марта 2018
MfG
Ne, eben nicht Locale
Doch (set-)locale. Das ist die variable Nutzereinstellung (nicht nur) für Zeitformate und hat mit "Spracheinstellung des Servers" eigentlich nichts zu tun. Es können am selben Server gleichzeitig (theoretisch unbegrenzt) viele Nutzersitzungen mit unterschiedlich gesetzten Lokalisierungseinstellungen ablaufen. Und sogar innerhalb dieser Nutzersitzung, sogar "per Thread" geändert werden. Letztendlich sind die via HTTP-Request auf einem Webserver ausgelösten Aktivitäten auch nichts anderes als Threads.
Ich wüsste nicht, warum ich auf diese bequeme Möglichkeit zur Formatierung insbesondere von Datumsangaben verzichten sollte.
Ich habe mal aus den Ausgaben von
<?php
$sprachen = explode( "\n", `locale -a` );
foreach ($sprachen as $s) {
if ( strpos ( $s, '.utf8' ) ) {
$sprache = str_replace( '.utf8', '.UTF-8', $s );
if ( $l = setlocale ( LC_ALL, $sprache ) ) {
echo $l . " :\t" . strftime ( '%x', strtotime( '-1 days' ) ) . "\n";
}
}
}
manuell ein paar krasse Fälle herausgesucht.
en_US.UTF-8 : 03/09/2018
it_IT.UTF-8 : 09/03/2018
tl_PH.UTF-8 : 03/09/18
uz_UZ.UTF-8 : 09/03/18
Will man sich die in verschiedenen Gegenden der Welt verständlichen Datumsformate selbst bauen müsste man dieses sonst auch noch quasi manuell übersetzen — sonst hat man womöglich am 3. September 15000 kreischende zwölf bis Vierzehnjährige nebst den anhängigen, stets terrorverdächtigen Hubschraubermüttern und oropaxtragenden, weit gereisten, völlig entnervten und also schwer gewaltbereiten Vätern vor dem Volkspalast obwohl das Konzert des Backfischhypnotiseurs schon am 9. März war.
Das will keiner haben, also mache ich es lieber richtig.
hi mein Lieber,
Das will keiner haben, also mache ich es lieber richtig.
Dan zeigt doch mal anhand einer Demo wie die in Accept-Language gesendete bevorzugte Sprache bis zur Ausgabe einer dieser Sprache entsprechenden Datumsangabe durchgereicht wird.
😉
Ja, das ist gut aber leider auch eine fixe Idee 😉
Wie dem Gunnar schon geschrieben, auf der eigenen Kiste kannst Du das sicher so machen, auf einem shared host jedoch bist Du darauf angewiesen was für locale Dein Provider da installiert hat. Da ist es schon besser, sich von Anfang an mit einer eigenen Bibliothek von setlocale()
unabhängig zu machen.
Ob dafür eine Eigenentwicklung oder OpenSource zum Einsatz kommt ist dann wieder eine andere Frage, da kommt es darauf an wie umfangreich die Mehrsprachigkeit sein soll.
Schönen Sonntag.
auf einem shared host jedoch bist Du darauf angewiesen was für locale Dein Provider da installiert hat.
Dem würde ich wohl recht schnell klarmachen, dass das die Installation des Pakets "locale-all" zu PHP dazugehört, jedenfalls wenn man als "Hoster" gelten will.
auf einem shared host jedoch bist Du darauf angewiesen was für locale Dein Provider da installiert hat.
Dem würde ich wohl recht schnell klarmachen, dass das die Installation des Pakets "locale-all" zu PHP dazugehört,
Das wäre mir neu. Ich bin davon ausgegangen daß PHP intern locale.h
genutzt wird, das ist eine c-Library und diese Library kann nur Locale vermitteln die auf dem System installiert sind. Auf einer Workstation bzw. PC ist es schon sinnvoll möglichst viele Locale vorzuhalten, auf einem Server hingegen nicht: Da beschänkt sich das i.d.R. auf eine Zeitzone, eine Sprache und einen Zeichensatz.
Schönen Sonntag 😉
@@klawischnigg
Du hast letzten Endes eh das einzig richtige gemacht. Mit dem Zeitaufwand, in dem Du Dir da irgendetwas überlegst und im Forum Rat suchst, Dich quälst, ob Du beim Studium des Handbuchs nicht irgendetwas unglaublich Wichtiges übersehen hast, hättest Du schon hundertmal einfach ein Array mit deutschen Monatsnamen anlegen können (sogar mit Deinem komischen 'Januar'😉). Ein anderer jedenfalls hat in der selben Zeit schon die Rechnung gestellt, das sollte man nie vergessen…
Du isst wohl dein Fleisch auch roh‽ Mit dem Zeitaufwand, in dem andere ihr Essen garen, würzen, abschmecken, bist du in der selben Zeit schon längst satt‽
LLAP 🖖
@@klawischnigg
Du isst wohl dein Fleisch auch roh‽ Mit dem Zeitaufwand, in dem andere ihr Essen garen, würzen, abschmecken, bist du in der selben Zeit schon längst satt‽
Nein, aber ich muß mir das gegarte, gewürzte und abgeschmeckte Essen selbst bezahlen, ich leb' davon, daß ich meine Leistung verrechne, nicht, daß ich mir Gedanken über die vielleicht existierende bestmögliche Lösung mache…