2012-03-29 10 views
9

Potrzebuję przykład kodu lub biblioteki, która parsuje nagłówek Accept-Language i zwróci mi preferowany język. RFC2616 stwierdza:Potrzebujesz przykładu, jak uzyskać preferowany język z nagłówka żądania Accept-Language

Pole Accept-Language request-header jest podobna do zaakceptowania, ale ogranicza zbiór języków naturalnych, które są preferowane jako odpowiedź na żądanie. Znaczniki języków są zdefiniowane w sekcji 3.10.

Accept-Language = "Accept-Language" ":" 
        1#(language-range [ ";" "q" "=" qvalue ]) 
    language-range = ((1*8ALPHA *("-" 1*8ALPHA)) | "*") 

Każdy język zasięgu może być podana wartość skojarzony jakości, który oznacza szacunkową wartość preferencji użytkownika dla języków określonych przez tego zakresu. Wartość domyślna to "q = 1".

Dalsze czytanie pokazuje, że jest zbyt wiele "opcjonalnych", "powinno", "może" i innych zwrotów, które uniemożliwiają mi ponowne wymyślenie koła - wszystko, co chcę wiedzieć, to jaki preferuje użytkownik, dowolny przeglądarka odpowiada na to pytanie miliard razy dziennie.

Dowolny fragment kodu w dowolnym języku (z wyjątkiem Lisp i asemblera) byłby pomocny.

Wielkie dzięki z góry!

+0

Huh! Masz coś przeciwko Lisp? :) – shambulator

+0

Podziel przecinkiem (i poprzedzającym spacji, jeśli jest dostępny), a następnie przesłuchaj każdy token. Język to pierwsza część, a następnie (jeśli jest obecna) kod q (priorytet pierwszeństwa). Wreszcie sortuj według wartości q (moje zrozumienie to te bez q należy rozumieć jako "1"). –

+0

@Anton, jestem zły w liczeniu nawiasów :) – Osw

Odpowiedz

1

Spróbuj tego, jego w PHP, ale przy użyciu tego samego regex jestem pewien jego dostosowania do dowolnego języka:

$langs = array(); // used to store values 

if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { 
    // break up string into pieces (languages and q factors) 
    preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse); 

    if (count($lang_parse[1])) { 
     // create a list like "en" => 0.8 
     $langs = array_combine($lang_parse[1], $lang_parse[4]); 

     // set default to 1 for any without q factor 
     foreach ($langs as $lang => $val) { 
      if ($val === '') $langs[$lang] = 1; 
     } 

     // sort list based on value 
     arsort($langs, SORT_NUMERIC); 
    } 
} 

produkuje posortowaną tablicę z pierwszym korzystnym języku:

Array 
(
    [en-ca] => 1 
    [en] => 0.8 
    [en-us] => 0.6 
    [de-de] => 0.4 
    [de] => 0.2 
) 

z przykładu ACCEPT_LANGUAGE nagłówek: en-ca,en;q=0.8,en-us;q=0.6,de-de;q=0.4,de;q=0.2

Working example here

+0

Dzięki, jesteś w sam raz - gmerałem w mojej metodzie, zawsze zwracając "en")) – Osw

26

Rozwiązanie:

namespace ConsoleApplication 
{ 
    using System; 
    using System.Linq; 
    using System.Net.Http.Headers; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      string header = "en-ca,en;q=0.8,en-us;q=0.6,de-de;q=0.4,de;q=0.2"; 
      var languages = header.Split(',') 
       .Select(StringWithQualityHeaderValue.Parse) 
       .OrderByDescending(s => s.Quality.GetValueOrDefault(1)); 
     } 
    } 
} 

Wynik:

enter image description here

+2

@weston: jaka to magia:. Wybierz (StringWithQualityHeaderValue.Parse)? – Zygimantas

+1

Lol, zwany grupą metod http://stackoverflow.com/questions/886822/what-is-a-method-group-in-c – weston

Powiązane problemy