Kalle_B: Sprachkennung (HTTP_ACCEPT_LANGUAGE)

Hallöle,

möchte die vom Browser akzeptierte Sprache ermitteln. Meine Opera sendet dieses an den Server:
de,pl;q=0.9,fr;q=0.8,en;q=0.7,ru;q=0.6,es;q=0.5

mein IExplorer 6 dies:
de

Kann ich nun den einzigen Wert bzw. den vor dem ersten Komma nehmen?

Oder gibt's auch sowas:
ru;q=0.8,es;q=0.9,de;q=1.0

oder andere Versionen?

Mein PHP-Zweizeiler:

$arr_lg  = explode( ',', $_SERVER['HTTP_ACCEPT_LANGUAGE'] ); // ru,en;q=0.9,es;q=0.8,de;q=0.7  
if ( $arr_lg[0] ) echo $arr_lg[0];  

Gruß,
Kalle

  1. Kann ich nun den einzigen Wert bzw. den vor dem ersten Komma nehmen?

    Nein - es ist nicht zwangsläufig so, dass jene werte mit Hoher Priorität auch vorne stehen.

    Oder gibt's auch sowas:
    ru;q=0.8,es;q=0.9,de;q=1.0

    Ja.

    aber auch de;q=0,en=q=0.5 wäre möglich - in diesem Fall gilt en, weil alles > 0 gültig ist.

    oder andere Versionen?

    Ja, auch Leerzeichen nach den Kommas sind z.B. erlaubt.

    Mein PHP-Zweizeiler:

    $arr_lg  = explode( ',', $_SERVER['HTTP_ACCEPT_LANGUAGE'] ); // ru,en;q=0.9,es;q=0.8,de;q=0.7

    if ( $arr_lg[0] ) echo $arr_lg[0];

      
    Funzt nicht, da dir die Quality verloren geht  
      
    Du hättest dann  
      
    ru  
    en;q=0.9  
    es;q=0.8  
    de;q=0.7  
      
    Jetzt musst du dafür sorgen, dass du ein key=>value-Paar mit Sprache und Quality hast (Reihenfolge nicht verändern):  
      
    ru=>  
    en=>0.9  
    es=>0.8  
    de=>0.7  
      
    Jetzt musst du erst rausfinden, welche quality "ru" hat (bzw. alle, die keinen Wert haben) - damit musst du dich durchs Array hangeln und beim nächsten Eintrag nachsehen, ob da eine vorhanden ist - wenn ja, nimmst du diese, wenn nein schaust du bei der übernächsten nach usw bis du einen findest oder am Ende des Arrays bist - wenn alle keine Quality haben.  
      
    ru=>0.9  
    en=>0.9  
    es=>0.8  
    de=>0.7  
      
    Jetzt nimmst du die verfügbaren Sprachen deiner Seite  - z.B de und en - und wirfst aus dem gelieferten Array alles Raus, was dem sowieso nicht entspricht  
      
    en=>0.9  
    de=>0.7  
      
    Jetzt nimmst du jenen Eintrag mit der höchsten Priorität, bei gleicher Priorität jenen der zuerst aufscheint - alternativ nimmst du den, der in deiner Priorität der verfügbaren Sprachen zuerst aufscheint.
    
    1. Jetzt musst du erst rausfinden, welche quality "ru" hat (bzw. alle, die keinen Wert haben) - damit musst du dich durchs Array hangeln und beim nächsten Eintrag nachsehen, ob da eine vorhanden ist - wenn ja, nimmst du diese, wenn nein schaust du bei der übernächsten nach usw bis du einen findest oder am Ende des Arrays bist - wenn alle keine Quality haben.

      r verfügbaren Sprachen zuerst aufscheint.

      Das ist natürlich Unsinn, ist keine Quality angegeben wird pauschal 1 angegeben: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

  2. h1 Kalle,

    Guck ma:

    http://aktuell.de.selfhtml.org/artikel/php/httpsprache/

    hat Hotti extra für Dich rausgesucht ;-P

    Hotti

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  3. @@Kalle_B:

    nuqneH

    möchte die vom Browser akzeptierte Sprache ermitteln.

    http_negotiate_language()

    Qapla'

    --
    Volumen einer Pizza mit Radius z und Dicke a: pi z z a
  4. was haltet ihr von diesem Konzept der Sprachenhirarchie im Projekt?

    Kalle

    1. Mich stört folgendes:

      "Beispiel: Im Veranstaltungskalender remso.de ist deutsch die Projektsprache. Wenn versucht wird, das System japanisch aufzurufen, scheitert das mangels japanischer Sprachdateien. Es wird in deutsch angezeigt:www.remso.de/?lg=jp "

      Ich rufe auf:

      http://www.remso.de/?lg=fr

      Ich bekommen den Inhalt in Deutsch.
      Ich sollte aber eine Umleitung erhalten, so dass die deutsche Sprache im Link sichtbar wird.

      Persönlich halte ich automatisierte Content-Negotiation für komplett überflüssig.

      mfg Beat

      --
      ><o(((°>           ><o(((°>
         <°)))o><                     ><o(((°>o
      Der Valigator leibt diese Fische
      1. Ich rufe auf:

        http://www.remso.de/?lg=fr

        Ich bekommen den Inhalt in Deutsch.
        Ich sollte aber eine Umleitung erhalten, so dass die deutsche Sprache im Link sichtbar wird.

        Du versuchst, eine Sprache aufzurufen, die zumindest das Startprogramm nicht kann, also fällt es zurück auf de. Gibt die verlangte Sprache aber weiter an das nächste Programm.

        Klicke mal einen Städtenamen an, es erscheinen die Events dieser Stadt. Oben rechts mit gelbem Hintergrund siehst du, dass fr gefordert ist. Leider hat auch dieses Programm keine fr-Datei.

        Jetzt  klicke mal ein Einzelevent an, die Detailseite kommt. Oben rechts wieder wieder fr als gewünschte Sprache.

        Und nun habe ich schnell für dich eine französiche Datei gemacht und die Wochentage schon mal übersetzt.

        Persönlich halte ich automatisierte Content-Negotiation für komplett überflüssig.

        Ja, dann kannst du persönlich gerne deine Lieblingssprache angeben und der Browser bleibt aussen vor. Manuell immer vor automatisch, auch meine Devise.

        Kalle

        1. Und nun habe ich schnell für dich eine französiche Datei gemacht und die Wochentage schon mal übersetzt.

          Hmm ich bekomme eine mehrheitlich deutsche Seite, die das Wort "Samedi" enthält und der <meta> content-language behauptet "en".

          Wenn du schon Sprachen querfeldein wechselst, solltest du dies durch lang Attribute kennzeichnen. Aber Achtung, dieses Gebiet ist extrem aufwändig.

          mfg Beat

          --
          ><o(((°>           ><o(((°>
             <°)))o><                     ><o(((°>o
          Der Valigator leibt diese Fische
          1. Und nun habe ich schnell für dich eine französiche Datei gemacht und die Wochentage schon mal übersetzt.

            Hmm ich bekomme eine mehrheitlich deutsche Seite, die das Wort "Samedi" enthält

            ja, habe nur die Wochentage übersetzt - war ja ein Schnellschuss, um das Konzept zu zeigen

            und der <meta> content-language behauptet "en".

            Danke für den Hinweis, den sollte man natürlich zuerst anpassen. Da habe ich schon gepennt, als ich en zu de kopiert habe.

            Gruß, Kalle

    2. h1,

      was haltet ihr von diesem Konzept der Sprachenhirarchie im Projekt?

      Das ist schonmal OK, denke ich. Siehe auch meine Anm. im anderen Fred. Und nicht vergessen: Do not break the backbutton, damit ein Besucher zu seiner Muttersprache zurückfindet, falls er sich in der Sprachauswahl verklickert hat ;-)

      Hotti

      --
      Mist, was heißt 'deutsche Sprache' auf по русский??? немецкий язык???
      Backbutton!
      1. @@hotti:

        nuqneH

        Mist, was heißt 'deutsche Sprache' auf по русский??? немецкий язык???

        Ja. Ist aber egal, da die Links zu anderssprachigen Versionen immer in der Zielsprache beschriftet sein sollten. Auf der russischen Seite steht „deutsch“; auf der deutschen „русский“.

        Qapla'

        --
        Volumen einer Pizza mit Radius z und Dicke a: pi z z a
        1. h1,

          Ja. Ist aber egal, da die Links zu anderssprachigen Versionen immer in der Zielsprache beschriftet sein sollten. Auf der russischen Seite steht „deutsch“; auf der deutschen „русский“.

          Da kommt ein kleiner Italiener des Wegs und klickt aus Versehen eine russische Seite aus der bunten Welt der Vielfalt. Auf der russischen Seite steht "deutsch" ... ciao bello ;-)

          Buenos noches,
          Orst Ombre

          </nachti>

          1. Hallo,

            Da kommt ein kleiner Italiener des Wegs und klickt aus Versehen eine russische Seite aus der bunten Welt der Vielfalt. Auf der russischen Seite steht "deutsch" ... ciao bello ;-)

            auf der russischen Seite steht aber hoffentlich auch "Italiano", also muss er "Deutsch" nur wählen, wenn er es unbedingt will.

            Buenos noches,
            Orst Ombre

            Bouna notte,
             Martin

            --
            Success should be measured not so much by the position that one has reached in life,
            but by the obstacles one has overcome while trying to succeed.
            1. auf der russischen Seite steht aber hoffentlich auch "Italiano", also muss er "Deutsch" nur wählen, wenn er es unbedingt will.

              Und wenn da nicht it-Latn steht sondern Italienisch in kyrilischer Schrift?

              mfg Beat

              --
              ><o(((°>           ><o(((°>
                 <°)))o><                     ><o(((°>o
              Der Valigator leibt diese Fische
              1. @@Beat:

                nuqneH

                Und wenn da nicht it-Latn steht sondern Italienisch in kyrilischer Schrift?

                Dann zeugt dies von einem unfähigen Seitenautor und die Website ist vermutlich eh nicht lesenswert.

                Qapla'

                --
                Volumen einer Pizza mit Radius z und Dicke a: pi z z a
                1. Und wenn da nicht it-Latn steht sondern Italienisch in kyrilischer Schrift?
                  Dann zeugt dies von einem unfähigen Seitenautor und die Website ist vermutlich eh nicht lesenswert.

                  OK.
                  Wir finden da oft Selektionsboxen.
                  Wenn du die aufklappst, steht da vielleicht irgendwo iraliano.
                  Aber das label der Box ist angeschrieben mit "Andere Sprache" auf Hinterindisch natürlich.
                  Oder man heisst Wikipedia, und legt für die Sprachwahl gleich eine ganze Spalte hin.

                  mfg Beat

                  --
                  ><o(((°>           ><o(((°>
                     <°)))o><                     ><o(((°>o
                  Der Valigator leibt diese Fische
                  1. Oder man heisst Wikipedia, und legt für die Sprachwahl gleich eine ganze Spalte hin.

                    Finde ich sehr nützlich für mein Projekt. Da rufst du ein deutsches Stichwort auf und hast es in drei dutzend Sprachen, nur jeweils einen Klick entfernt.

                    Und manchmal ook up platt, endlich verständlich.

                    Kalle

                  2. @@Beat:

                    nuqneH

                    Und wenn da nicht it-Latn steht sondern Italienisch in kyrilischer Schrift?
                    Dann zeugt dies von einem unfähigen Seitenautor und die Website ist vermutlich eh nicht lesenswert.

                    OK.
                    Wir finden da oft Selektionsboxen.

                    Dann zeugt dies von einem unfähigen Seitenautor, wenn diese nicht zumindest durch ein verständliches Icon (Globus?) erkennen lassen, dass sie zur Sprachauswahl dienen. Selektionsboxen zur Sprachauswahl sind problematisch und sollten dafür besser nicht eingesetzt werden. [NAVIGATION-SELECT]

                    Grmpf, meine Übersetzung dieses Artikels liegt immer noch halbfertig auf Halde.

                    Qapla'

                    --
                    Volumen einer Pizza mit Radius z und Dicke a: pi z z a
          2. @@hotti:

            nuqneH

            Da kommt ein kleiner Italiener des Wegs und klickt aus Versehen eine russische Seite aus der bunten Welt der Vielfalt. Auf der russischen Seite steht "deutsch"

            Ja und? Wenn er russisch kann, versteht er den Inhalt. Wenn er deutsch kann, versteht er den Link zur deutschsprachigen Seite und kann dort den Inhalt lesen. Kann er weder deutsch noch russisch, kann er mit der Website nichts anfangen – es sei den, sie hält auch eine italienische Sprachversion bereit. Dann ist es egal ob er ursprünglich auf der russischen oder deutschen Seite gelandet ist, er versteht den Link zu seiner Sprachversion, wenn dieser mit „Italiano“ beschriftet ist.

            Qapla'

            --
            Volumen einer Pizza mit Radius z und Dicke a: pi z z a
    3. was haltet ihr von diesem Konzept der Sprachenhirarchie im Projekt?

      Falls Du vorhast, HTTP_ACCEPT_LANGUAGE auszuwerten, mach keine Umleitung per Status 301,2 sondern nutze Rewrite, das ist suchmaschinenfreundlicher.

      Beispiel:
      RewriteRule ^.*.html$   /cgi-bin/show.cgi?q=html

      show.cgi oder ein PHP-Script wertet HTTP_ACCEPT_LANGUAGE aus und holt die Datei in der entsprechenden Sprache aus der DB (Datenquelle).

      Ein Request auf /index.html zeigt so automatisch eine passende )dynamisch erzeugte) Seite _ohne_ dass der Browser zu einer anderen Location umgeleitet werden muss.

      Nur mal so nebenbei ...

      Horst Spitz