咱們會看到不少支持多語言的網站,有些早期的網站在首頁會有一個連接,讓用戶本身來選但願看到中文,仍是英文,如今的網站則不須要了,這些網站能夠根據用戶使用的語言來顯示不一樣語言的版本。好比,你在使用簡體中文,打開網頁,會看到一個簡體中文的網頁,你在使用英文,輸入同一個地址,就會看到一個英文的頁面。php
服務器是如何知道用戶但願看到何種語言版本的頁面呢?html
對於網站來講,一個網站要服務海量的用戶,使用服務器來記住用戶的語言是很麻煩的,這個工做仍是從瀏覽器開始,若是瀏覽器本身告訴服務器但願使用的語言,服務器不就簡單了嗎?web
各類瀏覽器均可以設置但願使用的語言,在 IE 中,選擇設置,彈出對話框以後,能夠設置語言首選項。數組
點擊語言,彈出語言首選項對話框。瀏覽器
在控制面板中進行設置。服務器
對於 Chrome 來講,在高級設置中。函數
點擊語言和輸入設置。網站
當瀏覽器向服務器發出請求的時候,瀏覽器會在請求頭中添加一個特殊的請求頭 Accept-Language 來講明瀏覽器端設置的語言類型,若是你剛纔注意的話,會發現咱們能夠設置多個語言,並且能夠調整順序,在 Accept-Language 頭中,它們按着你設置的順序依次出現。每種語言使用逗號 (,) 進行分隔。ui
各類瀏覽器的 Accept-Language 以下所示。spa
IE 的語言
Accept-Language en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3
Chrome 的語言
Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4
FireFox 的語言
Accept-Language: en-us,zh-cn;q=0.8,en;q=0.5,zh;q=0.3
慢着,q 又是什麼呢?在 HTTP 協議中有一個詳細的說明,點擊這裏的連接能夠查看詳細說明: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html。簡單來講,語言能夠攜帶一個「q」值,來表示用戶對該語言的喜愛程度,這個值在 0 - 1 之間,默認爲 1。
在咱們服務器端代碼中,能夠直接獲取到瀏覽器在請求中攜帶的語言設置,在 .NET 中,HttpRequest 表示瀏覽器發出的請求,屬性 UserLanguages 就表示 Accept-Language 中傳遞的語言,已經根據優先級進行了排序,並且已經根據逗號 (,) 進行了拆分。這個屬性是一個字符串數組。
代碼中
string[] languages = Request.UserLanguages;
好比,咱們但願取出第一個語言,就能夠經過 Request.UserLanguages[0] 來獲取到了。
獲取的語言從程序的角度來講僅僅是一個表示語言的字符串,從面向對象的角度來講,咱們須要一個對象來表示語言,這個類就是 CurtureInfo 類,它定義在命名空間 System.Globalization 中。能夠經過 MSDN 來查看它的定義。
一般,咱們將表示語言的字符串經過構造函數傳遞給 CultureInfo。
CultureInfo info = new CultureInfo(culture);
若是你剛纔仔細查看的話,會發現 IE 發送的語言代碼與 Chrome 是不同的。你會發現表示簡體中文實際上有四種寫法:
這些寫法是從哪裏來的呢,在 MSDN 中有詳細的說明
CultureInfo 類將根據 RFC 4646 爲每一個區域性指定一個惟一的名稱。 名稱是語言關聯的 ISO 639 小寫雙字母區域性代碼和國家/地區關聯的 ISO 3166 大寫雙字母子區域性代碼的組合。
好比 zh 就表示中文,Han: 漢字 ,S: Simplified 簡體字,T: Tranditional 繁體字,而 cn 表示中國地區代碼。
區域性名稱的格式爲 兩個小寫字符的語言代碼>-兩個大寫字符的國家地區碼。 例如 「zh-CN」 表明「中文(簡體中文)」,「en-US」表明「英語(美國)」。 在雙字母語言代碼不可用的狀況中,將使用從 ISO 639-2 派生的三字母代碼。
請注意,某些區域性名稱還指定 ISO 15924 書寫符號。 例如,中文有簡體和繁體之分,這種名稱可使用 兩字符的語言碼-書寫標記-兩字符的國家地區碼形式。 例如「zh-Hans-CN」表明「簡體中文(中國)」。 對於 Windows Vista 以前的操做系統,包含書寫符號的區域性名稱使用languagecode2-country/regioncode2-scripttag 的模式,例如「uz-UZ-Cyrl」表明「烏茲別克語(烏茲別克斯坦,西里爾語)」。
非特定區域性只能由雙字母小寫語言代碼指定。 例如,fr指定「法語」的非特定區域性,de指定「德語」的非特定區域性。
那麼,zh 就表示非特定區域的中文,en 就表示非特定區域的英文。
可是,須要注意的是,CultureInfo 不支持 zh-Hans-CN 寫法,若是你使用了,會收到這樣一個異常。
zh-Hans-CN 是無效的區域性標識符。
你可使用 zh, zh-cn, zh-Hans, 可是,不能使用 zh-Hans-CN 來構建 CultureInfo 對象。