2012-03-29 56 views
9

Tôi cần một ví dụ hoặc thư viện mã sẽ phân tích cú pháp tiêu đề Accept-Language và trả lại ngôn ngữ ưa thích cho tôi. RFC2616 khẳng định rằng:Cần một ví dụ về cách nhận ngôn ngữ ưa thích từ tiêu đề yêu cầu Chấp nhận Ngôn ngữ

Trường Accept-Language request-tiêu đề cũng tương tự như Chấp nhận, nhưng hạn chế các thiết lập của ngôn ngữ tự nhiên được ưa chuộng như một phản ứng ứng yêu cầu. Các thẻ ngôn ngữ được định nghĩa trong phần 3.10.

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

Mỗi ngôn ngữ tầm CÓ THỂ được đưa ra một giá trị chất lượng có liên quan mà đại diện cho một ước tính ưu tiên của người dùng cho các ngôn ngữ định bởi phạm vi đó. Giá trị chất lượng mặc định là "q = 1".

Đọc thêm cho thấy có quá nhiều "tùy chọn", "nên", "có thể" và các phiên nói khác ngăn tôi phát minh lại bánh xe - tất cả những gì tôi muốn biết là người dùng ngôn ngữ nào thích, trình duyệt trả lời câu hỏi này hàng tỷ lần mỗi ngày.

Bất kỳ đoạn mã nào bằng bất kỳ ngôn ngữ nào (ngoại trừ Lisp và Assembler) đều hữu ích.

Rất cám ơn trước!

+0

Huh! Có gì chống lại Lisp? :) – shambulator

+0

Tách bằng dấu phẩy (và dấu cách trước nếu có), sau đó thẩm vấn từng mã thông báo. Ngôn ngữ là phần đầu tiên, sau đó (nếu có) một mã q (ưu tiên ưu tiên). Cuối cùng, sắp xếp theo giá trị q (sự hiểu biết của tôi là những giá trị không có q được hiểu là "1"). –

+0

@Anton, tôi không thể đếm được dấu ngoặc đơn :) – Osw

Trả lời

1

Hãy thử điều này, nó trong PHP nhưng sử dụng regex cùng tôi chắc chắn rằng khả năng thích nghi của mình cho bất kỳ ngôn ngữ:

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

tạo ra một mảng được sắp xếp với ngôn ngữ ưa thích đầu tiên:

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

Từ ví dụ ACCEPT_LANGUAGE tiêu đề: en-ca,en;q=0.8,en-us;q=0.6,de-de;q=0.4,de;q=0.2

Working example here

+0

Cảm ơn, bạn chỉ trong thời gian - Tôi đã goggling tại phương pháp sơ khai của tôi luôn luôn trở về "en")) – Osw

26

Giải pháp:

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

Kết quả:

enter image description here

+2

@weston: loại ma thuật này là: .Select (StringWithQualityHeaderValue.Parse)? – Zygimantas

+1

Lol, được gọi là nhóm phương pháp http://stackoverflow.com/questions/886822/what-is-a-method-group-in-c – weston

Các vấn đề liên quan