Tina: Problem mit Spracheinstellung bei Kalender

Hallo,

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).

Kann mir da jemand helfen?

Gruß, Tina

  1. 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

    1. Hey Christian,

      vielen Dank für die schnelle (und ausführliche) Antwort! Das werde ich gleich mal umsetzen.

      Gruß, Tina

    2. Hallo Christian,

      entschuldigung, wenn ich jetzt hier mal eine eigene Nachfrage zwischenschiebe.

      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...)

      Grundsätzlich sind mir deine Ausführungen natürlich klar. Wenn ich jetzt also ein Script schreibe, um es auf _meinem_ Webserver einzusetzen, wo ich ja die ganzen Gegebenheiten kenne, dann kann ich aber schon mit setlocale() arbeiten, oder?

      Klar - wenn ich das Script mal auf einem anderen Server einsetzen will/ muss, dann ...

      Gruß Gunther

      1. Hallo Gunther,

        Wenn ich jetzt also ein Script schreibe, um es auf _meinem_ Webserver einzusetzen, wo ich ja die ganzen Gegebenheiten kenne, dann kann ich aber schon mit setlocale() arbeiten, oder?

        Klar. Auf Deinem Server kannst Du nämlich dafür sorgen, dass

        a) PHP nicht mit Threads arbeitet
            [Dies ist ein Ausschlusskritierium! Wenn PHP mit Threads arbeitet (weil
            PHP z.B. als Apache-Modul installiert ist und Apache2 mit dem Worker-MPM
            installiert ist), dann funktioniert setlocale() grundsätzlich (!) nicht
            korrekt, weil sich das immer auf den Gesamtprozess, nie auf den Einzel-
            thread bezieht.

        b) Die Locales die Du willst auch existieren. (Notfalls unter Linux z.B.
            localedef ausführen)

        Daher: Wenn Du Kontrolle über die Umgebung hast, spricht nichts dagegen. Für portable Software (d.h. dort, wo man keine Kontrolle über die Umgebnug hat) muss man sich zwangsläufig eine eigene Lösung überlegen (oder eine andere vorgefertigte nutzen).

        Viele Grüße,
        Christian

    3. echo $begrüßung;

      Zwei kleine Ergänzungen:

      $monate = array (
        1 => 'Januar',
        2 => 'Februar',
        //...
        12 => 'Dezember'
      );

      Wenn man einen nummerischen Key angibt, nummeriert PHP die weiteren Elemente fortlaufend weiter. Es reicht also, $monate = array(1 => 'Januar', 'Februar', ..., 'Dezember'); zu schreiben und kann sich das (wie ich finde) umständlich zu tippende => sparen.

      $wochentage = array (
        0 => 'Sonntag',
        1 => 'Montag',
        //...
        6 => 'Samstag'

      Hier kann man die Keys gleich ganz weglassen, da sie von PHP automatisch von 0 an durchgezählt werden.

      Man kann natürlich die Keys auch explizit mit angeben, dann sieht man gleich was Phase ist, und muss nicht den PHP-Mechanismus zur Key-Erzeugung kennen, um diese Codestücke zu verstehen.

      echo "$verabschiedung $name";