andy: httpd.conf

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

Ich moechte das meine index.html.de geladen wird, es funktioniert aber nicht, kann mir jemand sagen, was falsch ist

LoadModule negotiation_module modules/mod_negotiation.so

AddLanguage en .en
AddLanguage fr .fr
AddLanguage de .de
AddLanguage es .es

LanguagePriority  de es en fr

AddType application/x-httpd-php .php .php3 .php4 .htm .html .de .es .en

DirectoryIndex welcome.php welcome.php3 index.php4 index.php3 index.php index.html index.htm

  1. hi andy ;-)

    Ich moechte das meine index.html.de geladen wird, es funktioniert aber nicht, kann mir jemand sagen, was falsch ist

    ja, natürlich kann das jemand

    schau mal:

    DirectoryIndex welcome.php welcome.php3 index.php4 index.php3 index.php index.html index.htm

    hier hast du die vorgegebene Eintragung ""index.html.de" einfach rausgestrichen. Schreib sie wieder rein, und alles wird gut.

    Andrerseits: was hast du davon? Damit kommst du auf die von apache.org mitgeleiferte Beispielseite. Du wirst doch hoffentlich nicht selbst eine neue "eigene" index.html.de geschrieben haben? Die Extension "de" gilt nur lokal als Hilfestellunf für DAU's. Deine "DirectoryIndex"-Anweisung ist schon ganz korrekt, und wenn du deine wunderbare neue eigene Startseite jetzt ganz einfach "index.html" nennst, ist auch alles gut.

    Grüße aus Berlin

    Christoph S.

    1. Hallo Christoph,

      Die Extension "de" gilt nur lokal als Hilfestellunf für DAU's.

      Wo hast Du denn das her?

      <linksetzer>
      http://httpd.apache.org/docs/content-negotiation.html
      </linksetzer>

      (ich nehme mal den Apache 1.3 an, ansonsten s!docs/!docs-2.0!)

      Grüße,

      Christian

      --
      Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
      1. guten Abend,

        Die Extension "de" gilt nur lokal als Hilfestellung für DAU's.
        Wo hast Du denn das her?

        genau da her, wohin du selbst verweist:

        http://httpd.apache.org/docs/content-negotiation.html

        Und du hast selbst darauf verwiesen, daß die "Sprachendungen" keine allzu große Bedeutung haben, siehe [pref:t=32947&m=179086]. Du formulierst es als "brauchst du nicht"  -  und selbstverständlich hast du recht damit

        (ich nehme mal den Apache 1.3 an, ansonsten s!docs/!docs-2.0!)

        Das ist hier ohne Bedeutung, weil diese "Sprachendungen" von den "Originalindianern" bereits in der 1.3.x verwendet wurden.

        Wichtiger ist etwas andres: andy kommt an dieser nun wirklich sehr einfachen Stelle ins Stolpern. Er hat aber in die "DirectoryIndex"-Anweisung ein paar andere Extensions aufgenommen, die zeigen, daß er sich beispielsweise mit PHP beschäftigen möchte, und er hat an anderen Stellen an der httpd.conf bereits herumgeknabbert, unter anderem an der eigentlich eher unwichtigen "AddLangugae"-Anweisung.

        Das zeigt eher, daß er sich gerade noch über die Bedeutung und Ranghöhe der einzelnen httpd.conf-Einträge klarwerden muß. Wir könnten ihm sicher ein bißchen dabei helfen. Die Frage, warum PHP nicht funktioniert, obwohl in der "DirectoryIndex"-Anweisung doch eine "index.php" vorgesehen ist, müßte eigentlich gleich noch kommen ...

        Grüße aus Berlin

        Christoph S.

        1. Guten Abend Christoph,

          Die Extension "de" gilt nur lokal als Hilfestellung für DAU's.
          Wo hast Du denn das her?
          genau da her, wohin du selbst verweist:

          Könntest Du das bitte zitieren?

          Du willst doch wohl nicht die Debian-Leute als DAUs bezeichnen, oder?
          http://www.debian.org/index.ja.html (ich habe japanisch genommen, weil ich ziemlich sicher sein kann, dass das *nicht* Deine Standardsprache ist ;-))

          Und du hast selbst darauf verwiesen, daß die "Sprachendungen" keine allzu große Bedeutung haben, siehe [pref:t=32947&m=179086]. Du formulierst es als "brauchst du nicht"  -  und selbstverständlich hast du recht damit

          Ich habe mich etwas mißverständlich ausgedrückt, sorry. Ich meinte natürlich nur bei der AddType-Direktive, für die Dateien sind die Endungen schon ok, zumindest, wenn er _kein_ PHP verwendet.

          Wichtiger ist etwas andres: andy kommt an dieser nun wirklich sehr einfachen Stelle ins Stolpern. Er hat aber in die "DirectoryIndex"-Anweisung ein paar andere Extensions aufgenommen, die zeigen, daß er sich beispielsweise mit PHP beschäftigen möchte, und er hat an anderen Stellen an der httpd.conf bereits herumgeknabbert, unter anderem an der eigentlich eher unwichtigen "AddLangugae"-Anweisung.

          Die AddLanguage-Anweisung ist nur bei dynamischen Inhalten unwichtig, bei statischen dagegen doch eher wichtig. Aber Du hast recht, diesen Gedankengang habe ich komplett 'unterdrückt', als ich die Antwort geschrieben habe. Obwohl dies eigentlich das Haupt»problem« ist.

          Die Frage, warum PHP nicht funktioniert, obwohl in der "DirectoryIndex"-Anweisung doch eine "index.php" vorgesehen ist, müßte eigentlich gleich noch kommen ...

          Urgs, daran habe ich gar nicht gedacht...

          Grüße,

          Christian

          --
          Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
        2. Guten Abend,

          Wichtiger ist etwas andres: andy kommt an dieser nun wirklich sehr einfachen Stelle ins Stolpern. Er hat aber in die "DirectoryIndex"-Anweisung ein paar andere Extensions aufgenommen, die zeigen, daß er sich beispielsweise mit PHP beschäftigen möchte, und er hat an anderen Stellen an der httpd.conf bereits herumgeknabbert, unter anderem an der eigentlich eher unwichtigen "AddLangugae"-Anweisung.

          Ich bin es schuld :(
          Ich habe ihn hierher geschickt weil es auf php4-forum.de OT ist und ich keine Lust hatte mich in sein Problem einzuarbeiten.
          Dass er hier genauso sparsam mit seinen Angaben ist hätte ich eigentlich vorhersehen können und ihn entsprechend vorbereiten müssen. :(

          Ein paar Infos könnt ihr aber (wenn ihr wollt) unter http://www.php4-forum.de/forum.php3?nr=122469 nachlesen.

          Gruß
            Der Linker (Nicht verwandt oder verschwägert mit Linksetzer)

          1. hi ;-)

            Ich bin es schuld :(
            Ich habe ihn hierher geschickt weil es auf php4-forum.de OT ist

            naja, daß du ihn hierher geschickt hast, ist ja ok. Es gibt wirklich ein paar Leute hier, die ihm beim "Indianer" weiterhelfen können

            Dass er hier genauso sparsam mit seinen Angaben ist hätte ich eigentlich vorhersehen können und ihn entsprechend vorbereiten müssen. :(

            mach dir nix draus, vielleicht kriegt andy es ja mit

            Ein paar Infos könnt ihr aber (wenn ihr wollt) unter http://www.php4-forum.de/forum.php3?nr=122469 nachlesen.

            bin schon da ... hm

            Grüße aus Berlin

            Christoph S.

            1. Hallo Christoph, Hallo Linker, Hallo andy,

              Ein paar Infos könnt ihr aber (wenn ihr wollt) unter http://www.php4-forum.de/forum.php3?nr=122469 nachlesen.

              Tja, da kann ich jetzt doch etwas sinnvolles beitragen. Ich habe vor einiger Zeit (Sommer, wenn ich mich richtig erinnere) eine PHP-Funktion geschrieben, die die Sprache, die der Browser mitsendet, gemäß RFC2616 parsed. (zumindest *hoffe* ich, dass das korrekt ist)

              Die Funktion erwartet keine Parameter, erwartet aber, dass eine Variable $config existiert, die so initialisiert werden kann:

              $config["default_language"] = "de"; // Standardsprache
              $config["allowed_languages"] = array ("de-at", "de", "it"); // welche Sprachen sind erlaubt?

              Die Funktion gibt die vom Benutzer präferierte Sprache zurück.

              Ich stelle die jetzt mal einfach so in den Raum:

              ---------------------------------------------------------------------------------------
              // detect browser language
              function lang_getfrombrowser () {
                      // import configuration
                      global $config;

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

              // split the array
                      $accepted_languages = split(", ?", $_SERVER["HTTP_ACCEPT_LANGUAGE"]);

              // init the values to default values
                      $current_lang = $config["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-Za-z]{1,8})(-[A-Za-z\-]{1,8})?(;q=(.*))?/", $accepted_language, $matches);

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

              // now separate the language codes
                              $main_code = strtolower($matches[1]);
                              $extra_code = strtolower($matches[2]);

              // was a quality supplied?
                              if (isset($matches[4])) {
                                      // use this one
                                      $lang_quality = (float)$matches[4];
                              } else {
                                      // compability mode: assume quality of 1
                                      $lang_quality = 1.0;
                              }
                              // now see if the language is allowed
                              if (in_array($main_code, $config["allowed_languages"])) {
                                      // and if it also has a higher quality than a previous one
                                      if ($lang_quality > $current_q) {
                                              // use that language
                                              $current_lang = $lang_main;
                                              $current_q = $lang_quality;
                                      }
                              }

              // now see if the combination is allowed
                              if (in_array($main_code . "-" . $extra_code, $config["allowed_languages"])) {
                                      // ad if the quality is higher...
                                      if ($lang_quality > $current_q) {
                                              // use that language
                                              $current_lang = $lang_main . "-" . $lang_extra;
                                              $current_q = $lang_quality;
                                      }
                              }
                      }

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

              Grüße,

              Christian

              --
              Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
              1. Hallo Forum,

                Tja, da kann ich jetzt doch etwas sinnvolles beitragen. Ich habe vor einiger Zeit (Sommer, wenn ich mich richtig erinnere) eine PHP-Funktion geschrieben, die die Sprache, die der Browser mitsendet, gemäß RFC2616 parsed. (zumindest *hoffe* ich, dass das korrekt ist)

                Nachdem der Fragesteller jetzt eine andere Lösung gefunden hat, wollte ich fragen, ob nicht jemand anderes hier Interesse daran hat, vielleicht als TuT-Beitrag?

                Grüße,

                Christian

                --
                Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
                1. Hi Christian,

                  Nachdem der Fragesteller jetzt eine andere Lösung gefunden hat, wollte ich fragen, ob nicht jemand anderes hier Interesse daran hat, vielleicht als TuT-Beitrag?

                  als ob ich hier mitreden könnte ;) Wende dich bitte an Achim Schrepfer (er macht allerdings derzeit Urlaub). Wenn das Thema relevant ist, kann er dir bei der Erstellung eines Beitrages sehr weit entgegenkommen...

                  LG Roland

                  1. Hallo Roland,

                    als ob ich hier mitreden könnte ;)

                    Noch ist es nicht zu spät, PHP und HTTP zu lernen, wenn aber eine gewisse Firma erst mal die Kontrolle über unsere Computer hat, dann... ;-)

                    Im Ernst: Es geht hier einfach darum, dass der Browser die Sprachen mitsendet, die der Benutzer versteht, und dass ich mit dieser Funktion nichts anderes mache, als das mit dem Angebot der Sprachen abzugleichen, in der die Website zur Verfügung steht. Das beste Ergebnis wird zurückgeliefert.

                    Wende dich bitte an Achim Schrepfer (er macht allerdings derzeit Urlaub).

                    War nicht André Laugks für die TuTs zum Thema PHP verantwortlich? Das war zumindest so, als ich meinen Beitrag zu den Verzeichnissen [1] 'abgeliefert' habe.

                    Wenn das Thema relevant ist, kann er dir bei der Erstellung eines Beitrages sehr weit entgegenkommen...

                    Linker hat mich darauf aufmerksam gemacht, dass da noch ein Fehler drin vorhanden ist. Dieser Fehler ist nicht ganz so trivial, wie er scheint. (Aber ich bekomme das noch hin, keine Sorge) Wenn Interesse besteht, werde ich auf jeden Fall den Beitrag schreiben, denn die PEAR-Variante (PEAR will für PHP das sein, was CPAN für Perl und CTAN für TeX ist) ist mir einmal nicht sauber genug und zum zweiten will sich sicherlich nicht jeder in PEAR einarbeiten. (ich mag' die DB-Abstraktion, die Mail-Funktionalität und das Error-Handling - vom Rest bin ich nicht so begeistert)

                    Grüße,

                    Christian

                    [1] http://aktuell.de.selfhtml.org/tippstricks/php/verzeichnisse/

                    --
                    Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
                    1. Hi Christian,

                      Noch ist es nicht zu spät, PHP und HTTP zu lernen, wenn aber eine gewisse Firma erst mal die Kontrolle über unsere Computer hat, dann... ;-)

                      dass ich mit PHP noch warm werde, ist eher unwahrscheinlich...

                      Im Ernst: Es geht hier einfach darum, dass der Browser die Sprachen mitsendet, die der Benutzer versteht, und dass ich mit dieser Funktion nichts anderes mache, als das mit dem Angebot der Sprachen abzugleichen, in der die Website zur Verfügung steht. Das beste Ergebnis wird zurückgeliefert.

                      Das habe ich durchaus verstanden, mir ist 'Content Negotiation' ein Begriff.

                      Wende dich bitte an Achim Schrepfer (er macht allerdings derzeit Urlaub).

                      War nicht André Laugks für die TuTs zum Thema PHP verantwortlich?

                      http://aktuell.de.selfhtml.org/people/devs.htm

                      In tiefer Demut werde ich vor ihm zu Kreuze kriechen... *argh*. Ich habe da etwas verwechselt, passiert mir mit zunehmend grauen Schläfen immer häufiger. Sollte ich jemals die ZFF stellen, ersuche ich um den virtuellen Gnadenschuss. Kurz davor bitte...

                      Wenn Interesse besteht, werde ich auf jeden Fall den Beitrag schreiben,

                      André meinte, er sei momentan ziemlich eingespannt. Zur Not wird er die Bearbeitung einfach Sven umhängen ;p

                      denn die PEAR-Variante (PEAR will für PHP das sein, was CPAN für Perl und CTAN für TeX ist) ist mir einmal nicht sauber genug und zum zweiten will sich sicherlich nicht jeder in PEAR einarbeiten. (ich mag' die DB-Abstraktion, die Mail-Funktionalität und das Error-Handling - vom Rest bin ich nicht so begeistert)

                      Nunja. Wenn du das sagst, will ich's dir glauben ;)

                      LG Roland

                      1. Hallo Roland,

                        Noch ist es nicht zu spät, PHP und HTTP zu lernen, wenn aber eine gewisse Firma erst mal die Kontrolle über unsere Computer hat, dann... ;-)

                        dass ich mit PHP noch warm werde, ist eher unwahrscheinlich...

                        Warum? Ich taste mich jetzt langsam an XML, SVG und Perl heran, ich bin immer bereit, etwas neues zu lernen...

                        In tiefer Demut werde ich vor ihm zu Kreuze kriechen... *argh*.

                        Naja, übertreibs mal nicht... :-)

                        Sollte ich jemals die ZFF stellen, ersuche ich um den virtuellen Gnadenschuss. Kurz davor bitte...

                        Ich hoffe mal, dass Du solange noch bei geistiger Gesundheit bleibst, bis es keine Frames mehr gibt. ;-P

                        Nunja. Wenn du das sagst, will ich's dir glauben ;)

                        Naja, hier im Forum gibt's auch durchaus andere Meinungen dazu, CK mag z.B. die DB-Abstraktion auch nicht... Alles persönliche Vorlieben... Jemand anderes mag vielleicht 'ganz PEAR' nicht.

                        Grüße,

                        Christian

                        --
                        Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
                        1. Hi Christian,

                          dass ich mit PHP noch warm werde, ist eher unwahrscheinlich...

                          Warum?

                          die Syntax finde ich schlichtweg hässlich und es ist mir obendrein unsymphatisch, weil jeder Dummie damit das Forum zumüllt. Objektiv gesehen halt ;)

                          Ich taste mich jetzt langsam an XML, SVG und Perl heran,

                          Ich auch, wobei ich SVG am interessantesten finde. Perl ist mir symphatisch, nur mit XML kann ich momentan in der Praxis noch nicht so recht etwas anfangen. Kommt aber noch.

                          ich bin immer bereit, etwas neues zu lernen...

                          Daran liegt's ja nicht...

                          Ich hoffe mal, dass Du solange noch bei geistiger Gesundheit bleibst, bis es keine Frames mehr gibt. ;-P

                          Dein Wort in Gottes Gehörgang :)

                          [...] Jemand anderes mag vielleicht 'ganz PEAR' nicht.

                          Und ich habe schlicht keine Ahnung, was zu Teufel das sein könnte ;)

                          LG Roland

                          1. Hallo Roland,

                            die Syntax finde ich schlichtweg hässlich

                            Ist sehr an der von Perl und C angelehnt, daher verstehe ich das Argument nicht.

                            und es ist mir obendrein unsymphatisch, weil jeder Dummie damit das Forum zumüllt.

                            Da ist leider was dran... :-(

                            Ich auch, wobei ich SVG am interessantesten finde.

                            ACK.

                            Perl ist mir symphatisch,

                            Elitesprache? *fg* *scnr*

                            [...] Jemand anderes mag vielleicht 'ganz PEAR' nicht.

                            Und ich habe schlicht keine Ahnung, was zu Teufel das sein könnte ;)

                            Eine Sammlung von Erweiterungen (genauer: Klassen) für PHP, die bestimmte Dinge automatisieren, z.B. den Versand von Multipart-Mails oder Datenbankabstraktion. (d.h. ein Datenbankinterface für alle Datenbanken)

                            (BARRIEREFREIHEIT) Flash können selbst Idioten folgen.

                            Den Satz verstehe ich nicht...

                            Grüße,

                            Christian

                            --
                            Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
                            1. Hi Christian,

                              schon wieder ein Posting futsch... :/

                              [PHP...] die Syntax finde ich schlichtweg hässlich

                              Ist sehr an der von Perl und C angelehnt, daher verstehe ich das Argument nicht.

                              Es ist mein subjektives Empfinden, wirklich begründen kann ich's nicht. Vielleicht liegt's auch an der Tagsoup, weil alles in mein geliebtes HTML hineingeklatscht wird.

                              Perl ist mir symphatisch,

                              Elitesprache? *fg* *scnr*

                              Krass 31337! Die meisten Scripts, die ich bisher beackert habe, haben mir ..hm.. gefallen? Sehr subjektiv, ich weiß - ist aber so.

                              [PEAR...]

                              [...]

                              Aha, danke für die Erläuterung.

                              (BARRIEREFREIHEIT) Flash können selbst Idioten folgen.

                              Den Satz verstehe ich nicht...

                              *lol* Entschuldige, aber es passt hier so schön hin *g*. Obigen Satz habe ich schon sehr oft gelesen, zumeist in Mailinglisten (CSS, WAI). Kurz gesagt: Komplexere Inhalte sind mit ein bisschen Klickibunti-Animation auch weniger hellen Leuchten zugänglich. Das ist natürlich ein Fressen für sarkastische Flash-Gegner wie mich ;-)

                              LG Roland

                              1. Hallo Roland,

                                schon wieder ein Posting futsch... :/

                                Mein Beileid.

                                Vielleicht liegt's auch an der Tagsoup, weil alles in mein geliebtes HTML hineingeklatscht wird.

                                Das musst Du nicht, es gibt ja template engines. (ich verwende z.B. Smarty, dieses reingeklatsche, was Du häßlich findest, finde ich auch ekelhaft)

                                *lol* Entschuldige, aber es passt hier so schön hin *g*.

                                Warum?

                                Komplexere Inhalte sind mit ein bisschen Klickibunti-Animation auch weniger hellen Leuchten zugänglich.

                                Ach soooooooo...

                                Das ist natürlich ein Fressen für sarkastische Flash-Gegner wie mich ;-)

                                Dann wünsche ich viel Spaß beim weiteren Signaturschreiben...

                                Grüße,

                                Christian .oO(wir sollten vielleicht mal über EOT nachdenken...)

                                --
                                Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
  2. Hallo andy, (Begrüßungen und Verabschiedungen werden hier übrigens gerne gesehen)

    Ich moechte das meine index.html.de geladen wird, es funktioniert aber nicht, kann mir jemand sagen, was falsch ist

    Hast Du Multiviews aktiviert? (Options Multiviews)

    AddType application/x-httpd-php .php .php3 .php4 .htm .html .de .es .en

    Die Sprachendungen brauchst Du nicht.

    Grüße,

    Christian

    --
    Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
  3. Moin!

    Aus deinem Gestammel hier und dem Thread bei php-forum entnehme ich einen gewissen Sinn - ich kann natürlich auch falsch geraten haben.

    Ich moechte das meine index.html.de geladen wird, es funktioniert aber nicht, kann mir jemand sagen, was falsch ist

    Deine Herangehensweise ist falsch!

    Du willst Content-Negotiation haben, hast aber nicht statische, sondern (und das ist perfekt für die Aufgabe) dynamische Seiten via PHP zur Verfügung.

    Du ignoriest deshalb am besten alles, was du über .htaccess gelesen hast, und nimmst auch alle diesbezüglichen Konfigurationen raus, und fragst einfach in $_SERVER['ACCEPT_LANGUAGE'] ab, welche Sprachen der Browser bevorzugt.

    Dazu gehst du sinnvollerweise so vor, dass du zunächst die enthaltenen Informationen mit explode() an den Kommas aufsplittest in ein Array, und dann vom ersten zum letzten Arrayeintrag durchgehst, ob die ersten beiden Zeichen der Sprachinformation welche sind, die du einer von _dir_ angebotenen Sprache zuordnen kannst. Das ist deshalb wichtig, weil es für deutsch nicht nur "de" gibt, sondern z.B. auch "de-AT". Außerdem könnte ein Browser Präferenzen mit übermitteln, indem ein Parameter q angehängt wird. Das alles spielt sich aber _hinter_ den ersten beiden Buchstaben ab.

    Wenn du herausgefunden hast, welche Sprache der Besucher von deinen angebotenen Sprachen bevorzugt (wenn du keine findest, nimm die, die die meiste Verbreitung in deinem Zielgebiet hat, als Standardwert), dann kannst du diese Sprache in der Session übergeben und bei der nächsten Seite prüfen, ob schon eine Sprache gewählt ist - dann überspringst du den Negotiation-Teil einfach.

    Außerdem mußt du damit rechnen, dass deine Vorauswahl dem Benutzer nicht behagt! Es muß also möglich sein, per Link (und Parameter im Link) die Sprache zu wechseln. Sollte auch relativ leicht gehen: Wenn der Sprachparameter übergeben wird, einfach die gewählte Sprache in der Session ändern, und gut ist. Eine Abfrage, ob die neue Sprache überhaupt existiert, sollte natürlich sein - der Benutzer könnte ansonsten auch mal rumspielen und das System testen!

    - Sven Rautenberg

    --
    "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
  4. Ok, vielen Dank fuer die vielen Antworten.

    Alles in allem sehe ich die Loesung meines Problems nichtmehr in der http.conf

    sondern so in dieser art
    $lg = getenv("HTTP_ACCEPT_LANGUAGE");
    echo$lg;

    nun fehlt mir nur noch aus
    de-de, de;q=0.50 ---------->de
    und en-us ------------->en
    zu machen

    eine frage, sieht das ergebniss von
    getenv("HTTP_ACCEPT_LANGUAGE");
    immer gleich aus ?

    mein gedankengang ist jetzt der, nach den ersten beiden buchstaben einfach abzuschneiden, und da habe ich meine variable
    achso, was erhaelt man bei spanisch ?

  5. Ok, vielen Dank fuer die vielen Antworten.

    Alles in allem sehe ich die Loesung meines Problems nichtmehr in der http.conf

    sondern so in dieser art
    $lg = getenv("HTTP_ACCEPT_LANGUAGE");
    echo$lg;

    nun fehlt mir nur noch aus
    de-de, de;q=0.50 ---------->de
    und en-us ------------->en
    zu machen

    eine frage, sieht das ergebniss von
    getenv("HTTP_ACCEPT_LANGUAGE");
    immer gleich aus ?

    mein gedankengang ist jetzt der, nach den ersten beiden buchstaben einfach abzuschneiden, und da habe ich meine variable
    achso, was erhaelt man bei spanisch ?

  6. total sieht es jetzt so aus:

    if(!$lg1){
      $lg = getenv("HTTP_ACCEPT_LANGUAGE");
      $lg1 = substr("$lg",0,2);
      $lg1 = "en";
      if($lg == "en")$lg1 = "en";
      if($lg == "de")$lg1 = "de";
      if($lg == "es")$lg1 = "sp";
    }
    $lg1 als sessionvariable usw.

    und es machts.....
    nochmals vielen Dank.

    1. Hi Andy,

      so kannst du es _nicht_ machen!

      total sieht es jetzt so aus:
      if(!$lg1){
        $lg = getenv("HTTP_ACCEPT_LANGUAGE");
        $lg1 = substr("$lg",0,2);
        $lg1 = "en";
        if($lg == "en")$lg1 = "en";
        if($lg == "de")$lg1 = "de";
        if($lg == "es")$lg1 = "sp";
      }
      $lg1 als sessionvariable usw.

      Wenn zB. jemand das 'it, it-ch;q=0.80, de-ch;q=0.60, de;q=0.40, de-de;q=0.20 ' als ACCEPT_LANGUAGE hat bekommt er $lg1=en das ist nicht OK denn er möchte ja 'de' wenn es 'it' nicht gibt.

      Auch die Lösung von Christian hat damit Probleme, aber es gibt ja Google :-)
      Das hier habe ich gefunden:
      http://www.wikipedia.org/pipermail/wikitech-l/2002-October/001068.html
      Scheint auf die schnelle getestet OK zu sein.

      Gruß
        Der Linker

      1. Hallo Linker,

        'it, it-ch;q=0.80, de-ch;q=0.60, de;q=0.40, de-de;q=0.20 '
        Auch die Lösung von Christian hat damit Probleme

        Aber nur, weil ich ein Typo drin hatte (man soll halt alten Code testen, bevor man ihn postet - grrrrr):

        Folgende Zeile:
        $current_lang = $lang_main;
        muss duch:
        $current_lang = $main_code;
        ersetzt werden,

        und folgende Zeile:
        $current_lang = $main_code . "-" . $lang_extra;
        muss durch
        $current_lang = $main_code . "-" . $extra_code;
        ersetzt werden - dann klappt es.

        Grüße,

        Christian

        --
        Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
        1. Hallo Christian,

          'it, it-ch;q=0.80, de-ch;q=0.60, de;q=0.40, de-de;q=0.20 '
          Auch die Lösung von Christian hat damit Probleme

          Aber nur, weil ich ein Typo drin hatte (man soll halt alten Code testen, bevor man ihn postet - grrrrr):

          OK nun passt es fast. :-)
          Denn wenn ich folgendes habe
          $config['default_language'] = 'de';
          $config['allowed_languages'] = array ('de-ch', 'de-at','de', 'en');
          bekomme ich von lang_getfrombrowser() leider 'de' und nicht 'de-ch' was ja mit q=0.60 angegeben ist.

          Es währe schön wenn man/frau auch Länder abhängigen Inhalt anbieten könnte und nicht nur nach der Sprache.

          Was ich mich gerade Frage, gibt es sowas schon im PEAR?
          Wenn nicht könntest du es PEAR tauglich machen und....

          Gruß
            Der Linker

          1. Hallo Christian,

            na da mach ich mal die Ingrid

            Was ich mich gerade Frage, gibt es sowas schon im PEAR?

            http://pear.php.net/manual/en/core.http.http.php

            Gruß
               Der Linker

          2. Hallo Linker,

            $config['default_language'] = 'de';
            $config['allowed_languages'] = array ('de-ch', 'de-at','de', 'en');
            bekomme ich von lang_getfrombrowser() leider 'de' und nicht 'de-ch' was ja mit q=0.60 angegeben ist.

            Urgs, ja, Schönheitsfehler, vertausche die beiden Blöche, die mit den folgenden Kommentaren anfangen:

            // now see if the language is allowed
            // now see if the combination is allowed

            Dann sollte es klappen.

            Was ich mich gerade Frage, gibt es sowas schon im PEAR?

            Ähm, ja, wieso mache ich mir eigentlich die Arbeit nochmal? http://pear.php.net/manual/en/core.http.http.php (HTTP::negotiateLanguage)

            Moment mal, hab' gerade in den Source geschaut, die Implementation von denen ist nicht sehr sauber, zum einen verwendet sie die ereg-Funktionen (ok, ich nehme auch split, sollte ich vielleicht austauschen) und zum anderen arbeitet sie nicht konform. (sie erlaubt gar keine Bindestriche und eine beliebige Anzahl an Buchstaben für den Ländercode, dabei sind für den ersten Teil 1-8 Buchstaben erlaubt, und für den zweiten Teil (nach dem ersten Bindestrich) 1-8 Buchstaben und weitere Bindestriche erlaubt)

            Mal ein paar Beispiele:

            Code                      Erlaubt?      von PEAR akzeptiert?
            ------------------------------------------------------------
            x-klingon                 X             -
            hallodiesisteinesprache   -             X
            x-diesisteinesprache      -             -
            de-ch                     X             -
            de-at                     X             -
            de-ch-zuer                X             -
            de-ch-zuerich             -             -
            dech-zuerich              X             -
            de-a-b-c                  X             -
            ------------------------------------------------------------
            de                        X             X
            at                        X             X
            it                        X             X
            es                        X             X
            fr                        X             X

            (ob die o.g. Sprachcodes teilweise Sinn ergeben, ist eine andere Frage)

            Außerdem gibt's einen Fallback auf die Länder-TLD, was IMHO bestenfalls grober Unfug ist.

            Grüße,

            Christian

            --
            Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
            1. Hallo Christian,

              [schnipp]

              Was ich mich gerade Frage, gibt es sowas schon im PEAR?
              Ähm, ja, wieso mache ich mir eigentlich die Arbeit nochmal? http://pear.php.net/manual/en/core.http.http.php (HTTP::negotiateLanguage)

              Moment mal, hab' gerade in den Source geschaut,

              Aber nicht in's CVS

              die Implementation von denen ist nicht sehr sauber, zum einen verwendet sie die ereg-Funktionen (ok, ich nehme auch split, sollte ich vielleicht austauschen)

              Da hast du recht ist nicht ganz sauber.

              und zum anderen arbeitet sie nicht konform. (sie erlaubt gar keine Bindestriche und eine beliebige Anzahl an Buchstaben für den Ländercode, dabei sind für den ersten Teil 1-8 Buchstaben erlaubt, und für den zweiten Teil (nach dem ersten Bindestrich) 1-8 Buchstaben und weitere Bindestriche erlaubt)

              Die aktuelle version 1.16 erlaubt Bindestriche
              http://cvs.php.net/diff.php/pear/HTTP/HTTP.php?r1=1.15&r2=1.16&ty=h

              Und so ganz bin ich mit deiner Beschreibung der 'Language Tags' nicht einverstanden. So wie ich das verstehe sollte es so sein:
              ([A-Za-z]{1,8})(-[A-Za-z]{1,8})*

              Mal ein paar Beispiele:

              Ich verwende mal deine Tabelle

              Code                      Erlaubt?      von PEAR 1.16 akzeptiert?
              ------------------------------------------------------------
              x-klingon                 X             X
              hallodiesisteinesprache   -             X
              x-diesisteinesprache      -             X
              de-ch                     X             X
              de-at                     X             X
              de-ch-zuer                X             X
              de-ch-zuerich             X             X
              ^^^^^^^^^^^^^^
              Das (denke ich) ist OK
              http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.10

              x-pig-latin               X             X

              dech-zuerich              X             X
              de-a-b-c                  X             X
              ------------------------------------------------------------
              de                        X             X
              at                        X             X
              it                        X             X
              es                        X             X
              fr                        X             X

              (ob die o.g. Sprachcodes teilweise Sinn ergeben, ist eine andere Frage)

              :-) http://toter-link.de/php/Smiley.html

              Außerdem gibt's einen Fallback auf die Länder-TLD, was IMHO bestenfalls grober Unfug ist.

              Da hast du recht, was das soll kann ich mir auch nicht vorstellen.

              Gruß
                Der Linker

              1. Hallo Linker,

                Die aktuelle version 1.16 erlaubt Bindestriche
                http://cvs.php.net/diff.php/pear/HTTP/HTTP.php?r1=1.15&r2=1.16&ty=h

                Achso, ein "pear download HTTP" hatte mir leider nur die 1.1 geliefert.

                Und so ganz bin ich mit deiner Beschreibung der 'Language Tags' nicht einverstanden. So wie ich das verstehe sollte es so sein:
                ([A-Za-z]{1,8})(-[A-Za-z]{1,8})*
                http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.10

                Hmm, da muss ich Dir recht geben, das werde ich noch ändern. Ich hab' da wohl was falsch verstanden. Ich muss an der Funktion noch ein paar Details ändern, um das Mißverständnis auszugleichen.

                Grüße,

                Christian

                --
                Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
                1. Hallo Christian,

                  Die aktuelle version 1.16 erlaubt Bindestriche
                  http://cvs.php.net/diff.php/pear/HTTP/HTTP.php?r1=1.15&r2=1.16&ty=h
                  Achso, ein "pear download HTTP" hatte mir leider nur die 1.1 geliefert.

                  Äm ja klar das ist PEAR 1.1 mit der HTTP.php,v 1.8 und die scheint auch die Offiziell Version zu sein. Aber wie gesagt hat sich im CVS schon einiges getan.

                  Wobei ich das Fehlverhalten bei dem erkennen der 'Language Tags' schon als Bug bezeichnen möchte. Schreibst du den Bugreport? Mein aktives Englisch ist leider annähernd unbrauchbar im Gegensatz zu meinem passivem :(

                  [Die 'Language Tags'..]
                  Hmm, da muss ich Dir recht geben, das werde ich noch ändern. Ich hab' da wohl was falsch verstanden. Ich muss an der Funktion noch ein paar Details ändern, um das Mißverständnis auszugleichen.

                  Kannst du mir das dann zukommen lasen oder muß ich auf deinen Artikel warten?

                  Ich habe da noch ein paar Fragen zu dem Artikel:
                   # Das global $config; wird aber noch verband in der endgültigen Version, oder?
                   # Auf die PEAR Variante gehst du doch mit ein paar Zeilen ein?
                   # Kannst mir nach der Veröffentlichung bescheid sagen, ich lese hier nur unregelmäßig mit?
                        (Ich nehme es dann in meine Link-Sammlung auf, bin schließlich 'Der Linker' :-)

                  Gruß
                    Der Linker

                  1. Hallo Linker,

                    Wobei ich das Fehlverhalten bei dem erkennen der 'Language Tags' schon als Bug bezeichnen möchte. Schreibst du den Bugreport? Mein aktives Englisch ist leider annähernd unbrauchbar im Gegensatz zu meinem passivem :(

                    Den Bugreport gibt's schon, ich habe da noch ein Kommentar hinzugefügt:
                    [http://bugs.php.net/bug.php?id=15423]

                    Kannst du mir das dann zukommen lasen oder muß ich auf deinen Artikel warten?

                    Deine Email, die Du angegeben hast, ist gültig? (toter-link.de klingt nicht sehr verlockend)

                    Das global $config; wird aber noch verband in der endgültigen Version, oder?

                    Ja klar, ich hab' hier einfach mal den Code schnell aus einem Projekt rauskopiert.

                    Auf die PEAR Variante gehst du doch mit ein paar Zeilen ein?

                    Werde ich.

                    Kannst mir nach der Veröffentlichung bescheid sagen, ich lese hier nur unregelmäßig mit?

                    Gerne.

                    Grüße,

                    Christian

                    --
                    Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
                    1. Hallo Christian,

                      Deine Email, die Du angegeben hast, ist gültig? (toter-link.de klingt nicht sehr verlockend)

                      Das soll auch nicht 'sehr verlockend' sein ;-) ist aber gültig.
                      (Schau mal nach http://toter-link.de )

                      Das global $config; wird aber noch verband in der endgültigen Version, oder?

                      Ja klar, ich hab' hier einfach mal den Code schnell aus einem Projekt rauskopiert.

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

                      Kannst mir nach der Veröffentlichung bescheid sagen, ich lese hier nur unregelmäßig mit?

                      Gerne.

                      Danke.

                      Gruß
                        Der Linker

                      PS: Das Bild auf toter-link.de hat meine Frau dort platziert.

                      1. 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.
                        1. Hallo Christian,

                          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) {
                              [schnipp Code]
                          }

                          ist gut geworden gefällt mir.

                          Anregungen? Weitere Kritik?

                          Hmm... <ganzkleinundleise>ja</ganzkleinundleise>

                          Das steuern über eine Konstante halte ich in diesem Fall für keine gute Idee.
                          Warum?
                          Es ist zwar in normalen Web-Anwendungen sehr unwahrscheinlich das die Funktion mehr als einmal aufgerufen wird, aber es gibt ja auch noch andere Bereiche in denen PHP zum Einsatz kommt. Und eine Konstante ist, wie ihr Name es beschreibt, nun mal konstant, einmal gesetzt kann man sie zur Laufzeit eines Skripts nicht ändern.
                          Stell dir mal ein PHP-GTK Mailprogramm vor das 'X-Accept-Language:' aus den Mails auswertet... (Damit die Änderungen wirksam werden Starten sie das Programm neu)

                          Weiterhin schlage vor dass das Standartverhalten der Funktion RFC-konform ist aber ein deutliche Empfehlung auf die andere Verhaltensweise geben wird. Da mag zwar ein wenig komisch klingen aber gerade weil du vor hast sie der Öffentlichkeit zu überreichen halte ich es für besser die RFCs zu würdigen.

                          Zur Lösung der beiden Vorschläge dachte ich an folgendes:
                          Die Funktion bekommt einen Dritten optionalen Parameter
                          function lang_getfrombrowser ($allowed_languages, $default_language, $CONTENT_NEGOTIATE_STRICT = TRUE) {
                          .
                          ..
                          if ($CONTENT_NEGOTIATE_STRICT) {
                                  // break up the while loop
                                  break;
                          }
                          ..
                          .
                          Damit ist der Coder gezwungen sich _bewusst_ gegen ein RFC-konformes Verhalten zu entscheiden.

                          Gruß
                            Der Linker

                          PS: Eigentlich sollte man den Code in HTTP::negotiateLanguage durch deinen ersetzten.

                          1. Hallo Linker,

                            (Damit die Änderungen wirksam werden Starten sie das Programm neu)

                            *autsch* ;-) Vielleicht sollte man auch noch den String mit den Sprachen selbst übergeben können, à la

                            function lang_getfrombrowser ($allowed_languages, $default_language, $lang_string = null, $strict_mode = true)
                            {
                                if (!is_string ($lang_string)) {
                                    $lang_string = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
                                }
                                ....
                            }

                            Damit ist der Coder gezwungen sich _bewusst_ gegen ein RFC-konformes Verhalten zu entscheiden.

                            Du hast recht, schließlich spreche ich mich ja sonst auch für die Einhaltung der Standards aus. Die Funktion poste ich hier nicht nochmal, die kommt dann im TuT-Beitrag. (wenn ich ihn dann endlich verfasst habe...)

                            PS: Eigentlich sollte man den Code in HTTP::negotiateLanguage durch deinen ersetzten.

                            Hehe ;-)

                            Ach ja, Harry, zu Deiner Funktion komme ich dann, wenn ich sie kapiert habe. ;-)

                            Grüße,

                            Christian

                            --
                            Ich wünsche allen frohe Weihnachten!
                            Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
                            1. Hallo Christian,

                              habe mir überlegt, ob es noch was zu sagen gibt. Gibt es aber nicht mehr :-)
                              Bin mit allem deiner Meinung.

                              So -- ich verlasse dann wieder dieses Forum, hier gibt es genügend Leute ;-)
                              Vergesse aber bitte nicht mir Bescheid zu sagen, wenn dein 'TuT-Beitrag' fertig ist.

                              Gruß und noch allen ein Glückliches 2003
                                Der Linker

                        2. Holladiewaldfee,

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

                          Na, dann will ich auch mal meine Funktion nicht vorenthalten, die ich irgendwann mal geschrieben habe ;-)

                          ----------------------------------------------------------------

                          function detectlanguage($lstring, $languages)
                          {
                           # Array in Großschreibung
                           while(list($langkey, $langval) = each($languages))
                            $languages[$langkey] = strtoupper($langval);

                          # Einzelne Teile untersuchen
                           $langa = explode(",", strtoupper($lstring));

                          # Ausdruck auswerten
                           for($i=0, $j=count($langa); $i<$j; $i++)
                           { $langa[$i] = Array("pattern" => trim($langa[$i]));

                          # Qualität ermitteln (Vorzug)
                            $langa[$i]["quality"] = preg_replace("/([^;]*)(;q=([0-9]{0,3}.?[0-9]*))?,?$/i","\3", $langa[$i]["pattern"]);
                            if(trim($langa[$i]["quality"])=="")
                            { # Default: 1
                             $langa[$i]["quality"] = "1.0"; }

                          $langa[$i]["position"] = $i;

                          # Sprache ermitteln
                            $langa[$i]["languagestring"] = preg_replace("/([^;]*)(;q=[0-9]{0,3}.?[0-9]*)?,?$/i","\1", $langa[$i]["pattern"]);

                          if(preg_match("/[1]{1,8}(-[A-Z]{1,8}){1,}$/i", $langa[$i]["languagestring"]))
                            { # Mit genauerer Spezifizierung
                             if(preg_match("/[2]{1,8}-[A-Z]{2}$/i", $langa[$i]["languagestring"]))
                             { # Mit Nennung des Landes
                              $langa[$i]["contryabrev"] = preg_replace("/^([A-Z]{1,8}-)([A-Z]{2})$/i", "\2", $langa[$i]["languagestring"]);

                          # Land ermitteln?
                              if(fcms_bDETECTBROWSERCOUNTRY===true)
                              { include("iso3166.cfg.php");
                               if(isset($aIso3166[$langa[$i]["countryabrev"]]))
                                $langa[$i]["country"] = $aIso3166[$langa[$i]["countryabrev"]];
                              }
                             }
                             else
                             { # Mit Nennung des Dialekts
                              $langa[$i]["dialect"] = preg_replace("/^([A-Z]{1,8}-)(.*)$/i", "\2", $langa[$i]["languagestring"]); }
                            }

                          $lang = preg_replace("/^([A-Z]*)(.*)$/i", "\1", $langa[$i]["languagestring"]);

                          # Name der Sprache und Sprachfamilie ermitteln
                            if(strlen($lang)==2 && fcms_sDETECTFULLLANGUAGE===true)
                            { include("iso639.cfg.php");
                             if(isset($aIso639[$lang]))
                             { $langa[$i]["fulllanguage"] = $aIso639[$lang]["language"];
                              $langa[$i]["family"] = $aIso639[$lang]["langgroup"]; }
                            }

                          # Sparchkennung ist ok?
                            if(strlen($lang)<=8)
                            { # Ja
                             $langa[$i]["language"] = $lang; }
                            else
                            { # Nein
                             $langa[$i]["language"] = "unknown"; }
                           }

                          # Nach Priorität sortieren
                           if(count($langa)>1)
                           { # Nur wenn mehr als eine Angabe
                            # Sortieren
                            for($i=0, $j=count($langa)-1; $i<$j; $i++)
                            { for($k=$i+1, $h=count($langa); $k<$h; $k++)
                             { if((floatval($langa[$i]["quality"])<floatval($langa[$k]["quality"])) || (floatval($langa[$i]["quality"])==floatval($langa[$k]["quality"]) && floatval($langa[$i]["position"])>floatval($langa[$k]["position"])))
                              { # Tauschen
                               $temp = $langa[$i];
                               $langa[$i] = $langa[$k];
                               $langa[$k] = $temp;
                              }
                             }
                            }
                            unset($temp);
                           }

                          # Auszunutzende Sprache ermitteln
                           $aReturn = Array();
                           for($i=0, $j=count($langa); $i<$j; $i++)
                           { # Zunächst versuchen, Sprache inkl. Dialekt zu finden:
                            if($langa[$i]["dialect"]!="")
                            { if(in_array($langa[$i]["language"]."-".$langa[$i]["dialect"], $languages))
                             { $aReturn["language"] = $langa[$i]["language"]."-".$langa[$i]["dialect"];
                              if($langa[$i]["fulllanguage"]!="")
                               $aReturn["fulllanguage"] = $langa[$i]["fulllanguage"];
                              break; }
                            }

                          # Sprache ohne Dialekt?
                            if(in_array($langa[$i]["language"], $languages))
                            { $aReturn["language"] = $langa[$i]["language"];
                             if($langa[$i]["fulllanguage"]!="")
                              $aReturn["fulllanguage"] = $langa[$i]["fulllanguage"];
                             break;
                            }
                           }

                          # Hier könnte noch eine Funktion stehen, die bei ergebnisloser Suche versucht,
                           #  die Sprache anhand der Sprachfamilie zuzuordnen

                          # Nichts gefunden?
                           if($aReturn["language"]=="")
                            $aReutrn["language"] = fcms_sDEFAULTLANGUAGE;

                          # Landes-Content: Immer das des erstgenannten Landes:
                           # Hier könnte jetzt noch eine Funktion stehen, die geographisch oder je nach Bevölkerungsgruppe
                           #  das nächstgelegene Land ermittelt, wenn das erstgenannte nicht verfügbar ist ...
                           if(fcms_bDETECTBROWSERCOUNTRY===true)
                           { for($i=0, $j=count($langa); $i<$j; $i++)
                            { if($langa[$i]["country"]!="")
                             { $aReturn["country"] = $langa[$i]["country"];
                              break;
                             }
                            }
                           }

                          # Zurückgeben ...
                           return $aReturn;
                          }

                          ------------------------------------------------------------------

                          Zur Erklärung: Übergeben werden zwei Werte, zum einen der zu parsende String, zum anderen ein Array mit verfügbaren Sprachen.
                          Daneben werkelt die Funktion noch mit ein paar Konstanten rum, fcms_bDETECTBROWSERCOUNTRY, fcms_sDETECTFULLLANGUAGE und fcms_sDEFAULTLANGUAGE. Die Namen sind denke ich selbsterklärend (fcms war der Name des Projektes, für das ich die Funktion geschrieben habe).

                          Die beiden includes enthalten jeweils die ISO-Definitionen für Länder und Sprachen:

                          iso639.cfg.php ----------------------------------------------------------

                          http://www.oasis-open.org/cover/iso639a.html

                          $aIso639 = Array(
                          "AA" => Array("language" => "AFAR", "langgroup" => "HAMITIC"),
                          "AB" => Array("language" => "ABKHAZIAN", "langgroup" => "IBERO-CAUCASIAN"),
                          "AF" => Array("language" => "AFRIKAANS", "langgroup" => "GERMANIC"),
                          "AM" => Array("language" => "AMHARIC", "langgroup" => "SEMITIC"),

                          und so weiter

                          "ZA" => Array("language" => "ZHUANG", "langgroup" => "[       ]"),
                          "ZH" => Array("language" => "CHINESE", "langgroup" => "ASIAN"),
                          "ZU" => Array("language" => "ZULU", "langgroup" => "NEGRO-AFRICAN")
                          );

                          iso3166.cfg.php ---------------------------------------------------------

                          http://www.din.de/gremien/nas/nabd/iso3166ma/codlstp1/db_en.html

                          $aIso3166 = Array(
                          "AF" => "AFGHANISTAN",
                          "AL" => "ALBANIA",
                          "DZ" => "ALGERIA",
                          "AS" => "AMERICAN SAMOA",
                          "AD" => "ANDORRA",

                          usw. usf.

                          "YU" => "YUGOSLAVIA",
                          "ZM" => "ZAMBIA",
                          "ZW" => "ZIMBABWE"
                          );

                          -------------------------------------------------------------------------

                          Zurückgegeben wird ein Array, das in ["language"] die ermittelte Sprache enthält.
                          Was mir noch nicht ganz gefällt ist wie am Ende die Sprache ermittelt wird, da bin ich für alternative Lösungsvorschläge jederzeit offen :-)

                          Anregungen? Weitere Kritik?

                          Dem kann ich mich nur anschließen ;-)

                          Ciao,

                          Harry

                          --
                            (There are only 10 types of people in this world: Those who understand binary and those who don't)

                          1. A-Z ↩︎

                          2. A-Z ↩︎

                          1. Holladiewaldfee,

                            # Nichts gefunden?
                             if($aReturn["language"]=="")
                              $aReutrn["language"] = fcms_sDEFAULTLANGUAGE;

                            ^^
                                     Das ist natürlich ein Buchstabendreher und muß $aReturn heißen ...

                            Ciao,

                            Harry

                            --
                              (There are only 10 types of people in this world: Those who understand binary and those who don't)
                          2. Hallo Harry,

                            Anregungen? Weitere Kritik?

                            Erst einmal: ich halte es für eine nicht so tolle Idee, die Browsersprache, das Land, etc. identifizieren zu wollen... Was machst Du z.B. mit x-klingon? Aber wenn Du es schon machen willst: Ich würde mich auf Auswertungen beschränken, _nachdem_ Du die Sprache ermittelt hast, verbraucht weniger Rechenkapazität.

                            Du missbrauchst übrigens preg_replace - preg_match sagt Dir gar nichts?

                            Ähm, ja, warum speicherst Du erst alle Sprachen in einem Array und sortierst diese dann manuell, wo es doch array_multisort gibt?

                            Naja, ich persönlich würde Auswertungen der Sprache erst machen, wenn Du die Sprache ermittelt hast. Das spart enorm viel Zeit und die Auswertung von Headern sollte _möglichst flott_ gehen.

                            Ach, noch etwas, wozu willst Du die Sprache so haarklein auswerten, Du schreibst die Webseite doch sowieso nicht in so vielen verschiedenen Sprachen...?

                            Meine ehrliche Meinung zu Deiner Funktion: Overkill. Nix für ungut...

                            Grüße,

                            Christian
                            [der jetzt warscheinlich ziemlich destruktiv war]

                            --
                            Ich wünsche allen frohe Weihnachten!
                            Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.