2012-03-29 6 views
9

मुझे एक कोड उदाहरण या पुस्तकालय की आवश्यकता है जो Accept-Language शीर्षलेख को पार्स करेगा और मुझे पसंदीदा भाषा वापस कर देगा। RFC2616 कहा गया है कि:स्वीकृति-भाषा अनुरोध शीर्षलेख से पसंदीदा भाषा कैसे प्राप्त करें इस पर एक उदाहरण की आवश्यकता है

स्वीकार करें-भाषा अनुरोध हेडर फ़ील्ड स्वीकार करने के लिए समान है, लेकिन प्राकृतिक भाषाओं कि अनुरोध करने के लिए एक प्रतिक्रिया के रूप में पसंद किया जाता है के सेट पर प्रतिबंध है। भाषा टैग को धारा 3.10 में परिभाषित किया गया है।

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

प्रत्येक भाषा दूरी एक संबद्ध गुणवत्ता मूल्य जो कि सीमा द्वारा निर्दिष्ट भाषाओं के लिए उपयोगकर्ता की प्राथमिकता के एक अनुमान का प्रतिनिधित्व करता दी जा सकती है। गुणवत्ता मान "q = 1" पर डिफ़ॉल्ट होता है।

अतिरिक्त पठन चलता देखते हैं कि बहुत सारे "वैकल्पिक", "चाहिए", "हो सकता है" और है कि मुझे पहिया पुनर्रचना करने से रोकने के भाषण के अन्य बदल जाता है - सब मैं जानना चाहता हूँ कि क्या भाषा उपयोगकर्ता पसंद है, किसी भी है ब्राउज़र दिन में अरब बार इस सवाल का जवाब देता है।

किसी भी भाषा में कोई भी कोड स्निपेट (लिस्प और असेंबलर को छोड़कर) सहायक होगा।

अग्रिम में बहुत धन्यवाद!

+0

हुह! लिस्प के खिलाफ कुछ मिला? :) – shambulator

+0

अल्पविराम (और उपलब्ध होने पर पूर्व स्थान) द्वारा विभाजित करें, फिर प्रत्येक टोकन से पूछताछ करें। भाषा पहला भाग है, फिर (यदि मौजूद है) एक क्यू-कोड (प्राथमिकता प्राथमिकता)। अंत में, q मानों द्वारा क्रमबद्ध करें (मेरी समझ है कि बिना क्यू के उन लोगों को "1" के रूप में समझा जाना है)। –

+0

@ एंटन, मैं ब्रांड्स को गिनने में बुरा हूं :) – Osw

उत्तर

1

इस प्रयास करें, पीएचपी में अपनी लेकिन एक ही regex मुझे यकीन है कि किसी भी भाषा के लिए अपने अनुकूलनीय हूँ का उपयोग कर:

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

उदाहरण से:

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

पहले पसंद की भाषा के साथ एक क्रमबद्ध सरणी का उत्पादन ACCEPT_LANGUAGE हैडर: en-ca,en;q=0.8,en-us;q=0.6,de-de;q=0.4,de;q=0.2

Working example here

+0

धन्यवाद, आप बस समय पर हैं - मैं हमेशा "एन" लौटने पर अपनी स्टब विधि पर गॉगलिंग कर रहा था)) – Osw

26

समाधान:

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

परिणाम:

enter image description here

+2

@ वेस्टर्न: यह किस तरह का जादू है: चयन करें (स्ट्रिंगविथ क्वालिटी हैडर वैल्यू.पर्स)? – Zygimantas

+1

लॉल, एक विधि समूह कहा जाता है http://stackoverflow.com/questions/886822/what-is-a-method-group-in-c – weston

संबंधित मुद्दे