Christian Seiler: ACCEPT_LANGUAGE

Beitrag lesen

Hallo Linker,

Das soll auch nicht 'sehr verlockend' sein ;-) ist aber gültig.
(Schau mal nach http://toter-link.de )
PS: Das Bild auf toter-link.de hat meine Frau dort platziert.

Ok. ;-)

Da wir gerade dabei wären: ich hab' mich jetzt mal an die Arbeit gemacht und bin mit dem Ergebnis recht zufrieden:

------------------------------------------------------------------------------------------
// detect browser language
function lang_getfrombrowser ($allowed_languages, $default_language) {
        // did the browser send any information
        if (empty($_SERVER["HTTP_ACCEPT_LANGUAGE"])) {
                // no? => return default language
                return $default_language;
        }

// split the array
        $accepted_languages = preg_split("/,\s*/", $_SERVER["HTTP_ACCEPT_LANGUAGE"]);

// init the values to default values
        $current_lang = $default_language;
        $current_q = 0;

// no go through all the languages specified
        foreach ($accepted_languages as $accepted_language) {
                // tryp to get all information about it
                $res = preg_match ("/^([a-z]{1,8}(?:-[a-z]{1,8})*)(?:;\s*q=(0(?:.[0-9]{1,3})?|1(?:.0{1,3})))?$/", $accepted_language, $matches);

// did it match
                if (!$res) {
                        // no? then ignore it
                        continue;
                }

// now get the language code and separate it
                $lang_code = explode ('-', $matches[1]);

// was a quality supplied?
                if (isset($matches[2])) {
                        // use this one
                        $lang_quality = (float)$matches[2];
                } else {
                        // compability mode: assume quality of 1
                        $lang_quality = 1.0;
                }

// until the array is empty
                while (count ($lang_code)) {
                        // see if language code matches
                        if (in_array (join ('-', $lang_code), $allowed_languages)) {
                                // look at the quality
                                if ($lang_quality > $current_q) {
                                        // use that language
                                        $current_lang = join ('-', $lang_code);
                                        $current_q = $lang_quality;
                                        // break up the while loop
                                        break;
                                }
                        }
                        // if the constant CONTENT_NEGOTIATE_STRICT is set, don't test minimalized versions of this language
                        if (defined ('CONTENT_NEGOTIATE_STRICT')) {
                                // break up the while loop
                                break;
                        }
                        // pop the array
                        array_pop ($lang_code);
                }
        }

// return the language found
        return $current_lang;
}
------------------------------------------------------------------------------------------

Zur Erklärung: Der Header wird zuerst aufgeteilt am Kommazeichen. Danach wird jedes einzelne Strück analysiert. Dabei wird der Sprachcode nach den Bindestrichen getrennt in ein Array geschrieben. Dieses Array wird wieder zusammengefügt und es wird getestet, ob die Sprache a) passt und b) die Qualität höher als eine vorige ist. Wenn das der Fall ist, wird die Sprache genommen. Wenn das _nicht_ der Fall ist, dann wird mit array_pop der letzte Teil des Arrays entfernt und dann wird nochmal geprüft, solange bis der Array zuende ist. Man kann dieses Verhalten, das nicht 100% RFC-konform ist, aber manchmal wünschenswert, durch die Konstante CONTENT_NEGOTIATE_STRICT abstellen, d.h. wenn diese definiert ist, testet er nur den Sprachcode selber und nicht minimalisierte Varianten davon.

Anregungen? Weitere Kritik?

Sollte aber auch aus deinen Projekten verband werden, wenn es _gar nicht_ anders geht nimm lieber $GLOBALS['config']. (meine Meinung)

Du hast ja recht, aber wie sagt man so schön? Ich war jung und brauchte die Zeit. ;-)

Grüße,

Christian

--
Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
0 39

httpd.conf

andy
  • webserver
  1. 0
    Christoph Schnauß
    1. 0
      Christian Seiler
      1. 0
        Christoph Schnauß
        1. 0
          Christian Seiler
        2. 0
          Der Linker aus www.php4-forum.de
          1. 0
            Christoph Schnauß
            1. 0
              Christian Seiler
              1. 0

                RFC2616-konformes parsen von Accept-Language

                Christian Seiler
                • php
                1. 0
                  Orlando
                  1. 0
                    Christian Seiler
                    1. 0
                      Orlando
                      1. 0
                        Christian Seiler
                        • menschelei
                        1. 0

                          (OT) Kein spezifisches Thema ;-)

                          Orlando
                          1. 0

                            (OT) Nichts besonderes ;-)

                            Christian Seiler
                            1. 0

                              (OT) Chat-o-Rama ;-)

                              Orlando
                              1. 0

                                (OT) Ähm, ja, irgendein Titel halt ;-)

                                Christian Seiler
  2. 0
    Christian Seiler
  3. 0
    Sven Rautenberg
  4. 0
    andy
  5. 0
    andy
  6. 0
    andy
    1. 0

      ACCEPT_LANGUAGE

      Der Linker
      • php
      1. 0
        Christian Seiler
        1. 0
          Der Linker
          1. 0
            Linker
          2. 0
            Christian Seiler
            1. 0
              Der Linker
              1. 0
                Christian Seiler
                1. 0
                  Der Linker
                  1. 0
                    Christian Seiler
                    1. 0
                      Der Linker
                      1. 0
                        Christian Seiler
                        1. 0
                          Der Linker
                          1. 0
                            Christian Seiler
                            1. 0

                              Auf Wiedersehen

                              Der Linker
                              • menschelei
                        2. 0
                          Harry
                          1. 0
                            Harry
                          2. 0
                            Christian Seiler