2012-03-29 6 views
9

Ho bisogno di un esempio di codice o di una libreria che analizzerebbe l'intestazione Accept-Language e restituisce la lingua preferita. RFC2616 afferma che:È necessario un esempio su come ottenere la lingua preferita dall'intestazione della richiesta Accept-Language

Il campo Accept-Language request-header è simile ad accettare, ma limita l'insieme di linguaggi naturali che sono preferiti come risposta alla richiesta. I tag della lingua sono definiti nella sezione 3.10.

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

Ogni lingua-gamma può essere dato un valore di qualità associata che rappresenta una stima della preferenze dell'utente per le lingue specificati da tale intervallo. Il valore di qualità è impostato su "q = 1".

Ulteriore lettura dimostra che ci sono troppi "optional", "dovrebbe", "potrebbe" e altri giri di discorso che mi impediscono di reinventare la ruota - tutto quello che voglio sapere è ciò che l'utente lingua preferisce, qualsiasi il browser risponde a questa domanda miliardi di volte al giorno.

Qualsiasi snippet di codice in qualsiasi lingua (eccetto Lisp e Assembler per favore) sarebbe utile.

Molte grazie in anticipo!

+0

Eh! Hai qualcosa contro Lisp? :) – shambulator

+0

Dividi con la virgola (e lo spazio precedente se disponibile), quindi interrogare ogni token. La lingua è la prima parte, quindi (se presente) un q-code (priorità delle preferenze). Infine, ordina per valori q (la mia comprensione è che quelli senza q devono essere intesi come "1"). –

+0

@Anton, non sono bravo a contare le parentesi :) – Osw

risposta

1

Prova questo, la sua in PHP, ma utilizzando lo stesso regex sono sicuro che la sua adattabile a qualsiasi linguaggio:

$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); 
    } 
} 

produce un array ordinato con la lingua preferita prima:

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

Dall'esempio ACCEPT_LANGUAGE intestazione: en-ca,en;q=0.8,en-us;q=0.6,de-de;q=0.4,de;q=0.2

Working example here

+0

Grazie, sei appena in tempo - stavo guardando il mio metodo di stub restituendo sempre "en")) – Osw

26

Soluzione:

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)); 
     } 
    } 
} 

Risultato:

enter image description here

+2

@weston: che tipo di magia è: .Select (StringWithQualityHeaderValue.Parse)? – Zygimantas

+1

Lol, chiamato gruppo metodo http://stackoverflow.com/questions/886822/what-is-a-method-group-in-c – weston

Problemi correlati