﻿# 如何讓 ASP.NET 依據瀏覽器指定的語系自動選用資源檔

當要利用 ASP.NET 開發多國語系的網站時，我們通常都會利用資源檔 (Resource File; \*.resx) 定義網頁中會用到的文字，而且每一種語系就可以定義一組翻譯資料。不過若要讓 ASP.NET 可以讓使用者在第一次進入網站時自動選取該使用者預設的語系進行顯示是再好不過的了，只是 ASP.NET 在預設的情況下這個特性是關閉的。

![在 Internet Explorer 中設定「語言」的地方](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/d71c4312cc83aed9ca51-image_3.png "在 Internet Explorer 中設定「語言」的地方") 

若要設定**整個網站**進行自動語系判斷，可以修改 web.config 的設定即可全站套用：

```
<globalization 
    culture="auto" 
    uiCulture="auto" 
    enableClientBasedCulture="true" />
```

在 <system.web> 下的 <globalization> 設定中至少必須設定 culture, uiCulture 與 enableClientBasedCulture 這三個屬性才會生效！

雖說這樣設定很方便，但是當使用者需要自行選取顯示語系時，這樣子就不夠了。一般的開發技巧都是透過 Cookie 儲存使用者選用的語系進行判斷，當使用者選取不同語系時，就將選用的語系儲存在 Cookie 中，例如：

```
Response.Cookies["Lang"] = "zh-TW";
```

而你必須在 Global.asax 中的 Application\_BeginRequest 事件中設定指定 UICulture 的程式碼，才可以讓 ASP.NET 依據使用者瀏覽器中的 Cookie 進行判斷：

```
protected void Application_BeginRequest(Object sender, EventArgs e)
{
    HttpCookie cLang = Request.Cookies["Lang"];

    if (cLang != null)
    {
        System.Threading.Thread.CurrentThread.CurrentCulture 
            = new System.Globalization.CultureInfo(cLang.Value);
        System.Threading.Thread.CurrentThread.CurrentUICulture 
            = new System.Globalization.CultureInfo(cLang.Value);
    }
}
```

這樣就可以同時達到以下兩個需求：

1.  使用者第一次蒞臨網站時會依據瀏覽器指定的語系**自動選用**資源檔
2.  使用者可自行指定特定語系進行網站瀏覽

這裡所看到的 Thread.CurrentThread.CurrentCulture 與 Thread.CurrentThread.CurrentUICulture 有不同的意義：

-   Culture 屬性: 負責判定與文化特性相關功能的結果 (例如: 日期、數字和貨幣格式等)。
-   UICulture 屬性: 負責覺得要為網頁載入哪一國的資源檔。

如果你想查詢所有可用 Culture 清單，可以參考以下程式碼 ( 記得看註解說明 )：

```
CultureInfo[] allCultures = CultureInfo.GetCultures(CultureTypes.AllCultures);

foreach (CultureInfo culture in allCultures)
{
    // 必須要是中性文化特性的 Culture 才能指派給 Thread.CurrentThread.CurrentCulture
    // 所以一定要是 xx-XX 格式的 Culture 字串才不會出錯!
    if (!Regex.IsMatch(culture.ToString(), @"^[a-z]{2}-[A-Z]{2}$")) continue;
    
    // 可以設定給 CurrentCulture 與 CurrentUICulture 的字串值 ( 設定在 Cookie 中 )
    string strCulture = culture.ToString();  // 例如: zh-TW
    
    // 英文名稱
    string strEngName = culture.EnglishName; // 例如: Chinese (Traditional)
    
    // 本地名稱 ( 以當地的文字顯示 )
    string strNatName = culture.NativeName;  // 例如: 中文(繁體)
}
```

註：同樣的技巧一樣適用於 ASP.NET MVC 建置的網站。

**相關連結**

-   [HOW TO：設定 ASP.NET Web 網頁全球化的文化特性和 UI 文化特性](http://msdn.microsoft.com/zh-tw/library/bz9tc508.aspx)
-   [Thread.CurrentCulture 屬性](http://msdn.microsoft.com/zh-tw/library/system.threading.thread.currentculture.aspx)
-   [Thread.CurrentUICulture 屬性](http://msdn.microsoft.com/zh-tw/library/system.threading.thread.currentuiculture.aspx)
-   [globalization 項目 (ASP.NET 設定結構描述)](http://msdn.microsoft.com/zh-tw/library/hy4kkhe0\(VS.80\).aspx)
-   [Localization in ASP.NET 2.0](http://www.ondotnet.com/pub/a/dotnet/2005/08/08/localizingaspnet20.html)
-   [.NET 應用系統全球化(一)](http://dotnetframework.blogspot.com/2008/12/net.html)
-   [.NET 應用系統全球化(二)](http://dotnetframework.blogspot.com/2008/12/net_13.html)
-   [.NET 應用系統全球化(三)](http://dotnetframework.blogspot.com/2008/12/net_22.html)
