Christian Seiler: Problem mit Spracheinstellung bei Kalender

Beitrag lesen

Hallo Tina,

ich habe einen Kalender programmiert, der grundsätzlich in Englisch angezeigt wird (also die Monatsnamen und Wochentage). Ich hätte das aber gern auf deutsch. Hab's schon mit setlocale versucht, das scheint er aber zu ignorieren. Egal, welche Sprache ich versuche einzustellen, der Kalender bleibt englisch (oder hab ich was falsch gemacht? Das ist doch einfach: setlocale (LC_TIME, 'de_DE'); oder nicht??)
Ich benutze gmmktime und gmstrftime (und das sollte doch eigentlich auf setlocale ansprechen).

Unter UNIX ja (sofern das Betriebssystem eine korrekte Locale-Datenbank hat).

Unter Windows will setlocale() andere Parameter haben:

setlocale (LC_TIME, 'deu_deu');

Das *sollte* unter Windows funktionieren (geht dafür unter UNIX wieder nicht).

Allerdings würde ich generell von setlocale() und automatischen Monats/Wochentagsnamen abraten. Denn:

* Man verlässt sich auf externe Gegebenheiten. Zum Beispiel *muss* ein deutsches Locale unter Linux nicht existieren - man kann zum Beispiel auch nur ein Englisches und Französisches haben.
 * Es ist betriebssystemabhängig (Windows anders als UNIX)
 * Es ist nicht threadsicher (gut, meistens kein Problem, weil PHP sowieso nicht in Treads ausgeführt wird, aber naja...)

Ich würde viel eher dazu raten, Dir nur die numerischen Wochentage / Monate an PHP zurückgeben zu lassen und dann den Text selbst zu erzeugen:

$monate = array (  
  1 => 'Januar',  
  2 => 'Februar',  
  //...  
  12 => 'Dezember'  
);  
$monat = $monate[gmstrftime ('%m', $stamp)];

Und analog:

$wochentage = array (  
  0 => 'Sonntag',  
  1 => 'Montag',  
  //...  
  6 => 'Samstag'  
);  
$wochentag = $wochentage[gmstrftime ('%w', $stamp)];

Du kannst Dir natürlich auch eine Funktion schreiben, die Dir das abnimmt:

function gmstrftime_locale ($format, $stamp = null) {  
  static $monate = array (  
    1 => 'Januar',  
    2 => 'Februar',  
    //...  
    12 => 'Dezember'  
  );  
  static $wochentage = array (  
    0 => 'Sonntag',  
    1 => 'Montag',  
    //...  
    6 => 'Samstag'  
  );  
  if ($stamp === null) {  
    $stamp = time ();  
  }  
  $monat = $monate[gmstrftime ('%m', $stamp)];  
  $wochentag = $wochentage[gmstrftime ('%w', $stamp)];  
  // Wochentags- und Monatsnamen vorab ersetzen  
  $format = str_replace (array ('%A', '%B'), array ($wochentag, $monat), $format);  
  // Nun den Rest automatisch ersetzen  
  return gmstrftime ($format, $stamp);  
}

(Ja, ich weiß, funktioniert nicht 100%ig korrekt und %a und %b und irgendwelche zusammengesetzten Formate berücksichtige ich auch nicht, sollte aber für die Mehrzahl aller Fälle ausreichen)

Viele Grüße,
Christian