【kein】ASP.Net本地化/國際化解決方案原理和程式碼示例

iDotNetSpace發表於2008-07-23

解決方案原理:
ASP.NET本地化支援
通過 CultureInfo 類可以訪問區域設定的屬性。
此外,ASP.NET 基於每個執行緒和請求跟蹤預設區域性的兩個屬性:用於區域設定相關函式預設值的 CurrentCulture,
和用於區域設定特定的資源資料查詢的 CurrentUICulture。

解決方案主要包含幾個部分組成:
1:客戶設定語言的控制元件,一般會包含在每個頁面,使得使用者可以隨時切換區域
控制元件ascx程式碼

<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
<asp:ListItem Text="English Version" Value="en-US">asp:ListItem>
<asp:ListItem Text="中 文 版" Value="zh-CN">asp:ListItem>
asp:DropDownList>

控制元件CS事件程式碼

 1 protected void Page_Load(object sender, EventArgs e)
 2        {
 3          if (!Page.IsPostBack){
 4             if (Request.Cookies[Settings.Default.Cookies_Language] == null || Request.Cookies[Settings.Default.Cookies_Language].Value == "")
 5             {
 6                    foreach (ListItem li in DropDownList1.Items)
 7                    {
 8                      if (li.Value == "")
 9                         li.Selected = true;
10                    }
11             }
12             else
13             {
14                    foreach (ListItem li in DropDownList1.Items)
15                    {
16                      if (li.Value.ToLower() == Request.Cookies[Settings.Default.Cookies_Language].Value.ToLower())
17                         li.Selected = true;
18                    }
19             }
20          }
21        }
22 
23        protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
24        {
25          Response.Redirect("~/ChangeLanguage.aspx?Language=" + DropDownList1.SelectedValue + "&url=" + Server.UrlEncode(Request.Url.PathAndQuery) ,true);
26        }ChangeLanguage中間頁面程式碼:
27 public partial class ChangeLanguage : System.Web.UI.Page
28 {
29        protected void Page_Load(object sender, EventArgs e)
30        {
31          Response.Cookies["Language"].Value = Request["Language"];
32          Response.Cookies["Language"].Expires = DateTime.Now.AddDays(1000);
33          
34          Response.Redirect(Server.UrlDecode(Request["url"]));
35        }
36 }
37 


2:在每頁載入時會判斷當前使用者選擇的區域,一般在頁面的基類中實現。
當使用者初次進入網站識別客戶端瀏覽器,
當使用者曾經選擇了區域,載入選擇區域

 1 /**//// 
 2        /// 本地化
 3        /// 
 4        protected override void InitializeCulture()
 5        {
 6          if (Request.Cookies[Settings.Default.Cookies_Language] != null && Request.Cookies[Settings.Default.Cookies_Language].Value != null && Request.Cookies[Settings.Default.Cookies_Language].Value != "")
 7          {
 8             setCulture();
 9          }
10          else
11          {//設定Cookie
12             Response.Cookies[Settings.Default.Cookies_Language].Value =
13                    (Request.Headers["accept-language"].Split(",".ToCharArray())[0]);
14             Response.Cookies[Settings.Default.Cookies_Language].Expires = DateTime.Now.AddDays(1000);
15             setCulture();
16          }
17          base.InitializeCulture();
18        }
19 
20 
21        private void setCulture()
22        {
23 
24          try
25          {
26             String selectedLanguage = Request.Cookies[Settings.Default.Cookies_Language].Value;
27             UICulture = selectedLanguage;
28             Culture = selectedLanguage;
29 
30             System.Threading.Thread.CurrentThread.CurrentCulture =
31                    System.Globalization.CultureInfo.CreateSpecificCulture(selectedLanguage);
32             System.Threading.Thread.CurrentThread.CurrentUICulture = new
33                    System.Globalization.CultureInfo(selectedLanguage);
34          }
35          catch //( Exception ex )
36          {
37             Response.Cookies.Clear();// [Settings.Default.Cookies_Language].d
38             //throw;
39          }
40        }
41 

3:當然是為每個頁面準備資原始檔。
這個是個體力活,
ASPNET.ascx.en.resx 表示英文的
ASPNET.ascx.zh.resx 這個表示中文的,當然還可以分為更加細的區域,比如zh-CN/zh-HK/zh-TW

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-407068/,如需轉載,請註明出處,否則將追究法律責任。

相關文章