判斷瀏覽器語系及製作多語系網站

判斷瀏覽器語系及製作多語系網站

最近有一個專案用到了中文跟英文兩個語系,也讓我第一次接觸到如何寫一個

多語系的網站,下面紀錄一些判斷瀏覽器語系的方法,以及一些心得。

 

用來判斷瀏覽器語系的方法還真不少,這邊列出三個

Controller


public class HomeController : Controller
{
       public ActionResult Index()
       {
           //Request.UserLanguages返回string陣列
           string[] str1 = Request.UserLanguages;
           ViewData["UserLanguages"] = str1;


           //Request.ServerVariables抓語系的key是HTTP_ACCEPT_LANGUAGE
           //返回字串
           string str2 = Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"];
           ViewData["ServerVariables"] = str2;

           return View();
       }


}

View


<%var UserLanguages = ViewData["UserLanguages"] as string[]; %>
<h2>用Request.UserLanguages找出來的語系</h2>
<%foreach (var item in UserLanguages)
  { %>
<%=item %><br />
<%} %>


 <h2>用Request.UserLanguages找出來的語系</h2>
 <%=ViewData["ServerVariables"]%>




 <h2>用Js找出來的語系</h2>
 <span id="js_language"></span>
 <script type="text/javascript">
   $(function () {
       var lang = window.navigator.userLanguage || window.navigator.language;
       $("#js_language").text(lang) ;
   });
  </script>

用三種不同的方法所查詢到的結果

1cb720b02f004f909f68cbc11d33b4ac

有了這些,就可以去判別該導向哪個網頁,或是用哪種資源檔。

如果還要讓使用者可以選擇語系的話,通常會把使用者選擇的語系存在cookie裡

Controller


//選擇中文語系
 public ActionResult Chinese()
 {
     HttpCookie cookie = new HttpCookie("lang");
     cookie.Value = "ch";
     cookie.Expires = DateTime.Now.AddYears(1);
     Response.Cookies.Add(cookie);
     return RedirectToAction("Index");
 }


 //選擇英文語系
 public ActionResult English()
 {
     //建一個HttpCookie,名字為lang
     HttpCookie cookie = new HttpCookie("lang");
     cookie.Value = "en";
     //到期時間設為一年
     cookie.Expires = DateTime.Now.AddYears(1);
     //加入cookie
     Response.Cookies.Add(cookie);
     return RedirectToAction("Index");
 }

View


<h2>Cookie的value</h2>
 <%if (Request.Cookies["lang"] != null)
   { %>
   <%=Request.Cookies["lang"].Value %>
 <%} %>

 

完成之後

c8e35d67d45b4fdba6a95ddd8ab0da6c

可以看到有抓到cookie的value

aa0e33145ad04c118f7d9608c165c29e

另外在瀏覽器的cookie視窗中也可以看到確實有存進這個cookie

f109e9846a90414a9fca7bcb13210a86

 

所以用這種方法,可以在使用者第一次進入網站時去判斷他有沒有這個cookie

如果有的話,就依照cookie的值去判別他所要的語系

如果沒有的話,就依照瀏覽器的預設語系替使用者新增cookie

過幾天再來寫資源檔要怎麼用~

 

補充:

Request.ServerVariables有很多key

用Request.ServerVariables.AllKeys把所有key找出來

 

ALL_HTTP                            客戶端發送的所有HTTP標頭,前綴HTTP_  

 

ALL_RAW                            戶端發送的所有HTTP標頭,其結果和客戶端發送時一樣,沒有前綴HTTP_

 

APPL_MD_PATH                 應用程序的元數據庫路徑

 

APPL_PHYSICAL_PATH     與應用程序元數據庫路徑相應的物理路徑

 

AUTH_TYPE                        是用戶訪問受保護的腳本時,服務器用於檢驗用戶的驗證方法

 

AUTH_USER                       代證的用戶名

 

AUTH_PASSWORD             當使用基本驗證模式時,客戶在密碼對話框中輸入的密碼

 

LOGON_USER

 

REMOTE_USER

 

CERT_COOKIE                      唯一的客戶證書ID號

 

CERT_FLAGS                         戶證書標誌,如有客戶端證書,則bit0為0如果客戶端證書驗證無效

                                                ,bit1被設置為1

 

CERT_ISSUER                        用戶證書中的發行者字段

 

CERT_KEYSIZE                     安全套接字層連接關鍵字的位數,如128

 

CERT_SECRETKEYSIZE       服務器驗證私人關鍵字的位數如1024

 

CERT_SERIALNUMBER        客戶證書的序列號字段

 

CERT_SERVER_ISSUER        服務器證書的發行者字段

 

CERT_SERVER_SUBJECT     服務器證書的主題字段

 

CERT_SUBJECT                     客戶端證書的主題字段

 

CONTENT_LENGTH              客戶端發出內容的長度

 

CONTENT_TYPE                    客戶發送的form內容或HTTPPUT的數據類型

 

GATEWAY_INTERFACE

 

HTTPS                                     如果請求穿過安全通道(SSL),則返回ON如果請求來

                                                 自非安全通道,則返回OFF

 

HTTPS_KEYSIZE                    安全套接字層連接關鍵字的位數,如128

 

HTTPS_SECRETKEYSIZE       服務器驗證私人關鍵字的位數如1024

 

HTTPS_SERVER_ISSUER       服務器證書的發行者字段

 

HTTPS_SERVER_SUBJECT     服務器證書的主題字段

 

INSTANCE_ID                          IIS實例的ID號

 

INSTANCE_META_PATH        響應請求的IIS實例的元數據庫路徑

 

LOCAL_ADDR                         返回接受請求的服務器地址

 

PATH_INFO                              客戶端提供的路徑信息

 

PATH_TRANSLATED              通過由虛擬至物理的映射後得到的路徑

 

QUERY_STRING                      查詢字符串內容

 

REMOTE_ADDR                      發出請求的遠程主機的IP地址

 

REMOTE_HOST                        發出請求的遠程主機名稱

 

REMOTE_PORT

 

REQUEST_METHOD                 提出請求的方法比如GET、HEAD、POST等等

 

SCRIPT_NAME                          執行腳本的名稱

 

SERVER_NAME                        服務器的主機名、DNS地址或IP地址

 

SERVER_PORT                         接受請求的服務器端口號

 

SERVER_PORT_SECURE         如果接受請求的服務器端口為安全端口時,則為1,否則為0

 

SERVER_PROTOCOL               服務器使用的協議的名稱和版本

 

SERVER_SOFTWARE               應答請求並運行網關的服務器軟件的名稱和版本

 

URL                                            返回服務器地址

 

HTTP_CONNECTION               返回內容:Keep-Alive

 

HTTP_KEEP_ALIVE

 

HTTP_ACCEPT

 

HTTP_ACCEPT_CHARSET          瀏覽者使用的字元集

 

HTTP_ACCEPT_ENCODING         返回內容如:gzip,deflate

 

HTTP_ACCEPT_LANGUAGE       返回內容如:en-us

 

HTTP_COOKIE

 

HTTP_HOST                                    返回服務器地址

 

HTTP_REFERER                             請求的字符串內容

 

HTTP_USER_AGENT                  返回內容:Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1)