LocalizedPage
出自ProgWiki
目錄 |
用途
- 多語系頁面支援。(需另行設定相關的多語系資源檔在 /App_LocalResources 目錄下)
相關檔案(第1版)
- 使用UserControl MultiLangSelect
LocalizedPage.cs
- Path: ~\App_Code\LocalizedPage.cs
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Threading; using System.Globalization; /// <summary> /// 所有需要地區化资源切换的頁面基礎類別 /// </summary> public class LocalizedPage : System.Web.UI.Page { //設定語系時,每個頁面一定要 Override 的 Method protected override void InitializeCulture() { //從 Session 中取出 user 所做的語系選項 string strSelectLang = Session["SelectLang"] as string; //如果 Session["SelectLang"] 不存在, 改抓 url 的 lang 參數 if (strSelectLang == null) strSelectLang = Page.Request.QueryString["lang"]; //若為第一次執行(為null) 或 MasterPage 下拉選單選第一個選項後的 PostBack(為空值""), //則先套用 user 自己 IE 中第一個設定的語言 if (String.IsNullOrEmpty(strSelectLang) == true) return; Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(strSelectLang); Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; base.InitializeCulture(); } public string GetLocalString(string strResourceKey) { string strRet = GetLocalResourceObject(strResourceKey) as string; return strRet; } //public string GetGlobalString(string strResourceKey, string strClassName) //{ // string strRet = GetGlobalResourceObject(strClassName, strResourceKey) as string; // return strRet; //} }
MultiLangSelect.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="MultiLangSelect.ascx.cs" Inherits="MultiLangSelect" %> <asp:DropDownList ID="DropDownList_MultiLangSelect" runat="server" Font-Size="X-Small" Width="96px" AutoPostBack="True" OnSelectedIndexChanged="DropDownList_MultiLangSelect_SelectedIndexChanged" meta:resourcekey="DropDownList_MultiLangSelectResource1" ToolTip="選擇你要顯示的語言" > <asp:ListItem meta:resourcekey="ML_WaitSelect" Text="--language--"></asp:ListItem> <asp:ListItem meta:resourcekey="ML_ZhTw" Text="繁體中文"></asp:ListItem> <asp:ListItem meta:resourcekey="ML_EnUs" Text="English"></asp:ListItem> </asp:DropDownList>
MultiLangSelect.ascx.cs
using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class MultiLangSelect : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { //切換語系後, 重設DropDownList已選擇的項目 if (!this.IsPostBack) { string strSelectLang = Session["SelectLang"] as string; //如果 Session["SelectLang"] 不存在, 改抓 url 的 lang 參數 if (strSelectLang == null) strSelectLang = Page.Request.QueryString["lang"]; if (strSelectLang != null) { if (this.DropDownList_MultiLangSelect.SelectedValue != strSelectLang) { this.DropDownList_MultiLangSelect.SelectedValue = strSelectLang; } } } } protected void DropDownList_MultiLangSelect_SelectedIndexChanged(object sender, EventArgs e) { //取得目前網頁的檔名 string strOriginalPage = Page.Request.Url.Segments[Request.Url.Segments.Length - 1]; //Page.ClientQueryString 為 QueryString 中 ? 號後面的參數集。 string strNewQueryString = Page.ClientQueryString; string strSelectLang; System.Text.StringBuilder objSB = new System.Text.StringBuilder(); if (this.DropDownList_MultiLangSelect.SelectedValue == "NoSel") { //套用 user 自己 IE 中第一個設定的語言 strSelectLang = ""; //下拉選單的語言選項存在Session中 Session["SelectLang"] = strSelectLang; //若使用者多次更換語系,QueryString 的 lang 參數只顯示最新的一次 if (strNewQueryString.IndexOf("lang") != -1) { if (strNewQueryString.Length >= 11) strNewQueryString = strNewQueryString.Substring(11); else strNewQueryString = String.Empty; } objSB.Append(strOriginalPage).Append("?lang=").Append("NoSel"); if (strNewQueryString != String.Empty) objSB.Append("&").Append(strNewQueryString); Response.Redirect(objSB.ToString()); } else { //以轉址方式套用語系 strSelectLang = this.DropDownList_MultiLangSelect.SelectedValue; //下拉選單的語言選項存在Session中 Session["SelectLang"] = strSelectLang; //Page.ClientQueryString 為 QueryString 中 ? 號後面的參數集。 strNewQueryString = Page.ClientQueryString; //若使用者多次更換語系,QueryString 的 lang 參數只顯示最新的一次 if (strNewQueryString.IndexOf("lang") != -1) { if (strNewQueryString.Length >= 11) strNewQueryString = strNewQueryString.Substring(11); else strNewQueryString = String.Empty; } objSB.Append(strOriginalPage).Append("?lang=").Append(strSelectLang); if (strNewQueryString != String.Empty) objSB.Append("&").Append(strNewQueryString); Response.Redirect(objSB.ToString()); } } }
使用範例(第1版)
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Culture="auto" meta:resourcekey="PageResource1" UICulture="auto" %> <%@ Register Src="MultiLangSelect.ascx" TagName="MultiLangSelect" TagPrefix="uc1" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>未命名頁面</title> </head> <body> <form id="form1" runat="server"> <div> <uc1:MultiLangSelect id="MultiLangSelect1" runat="server"> </uc1:MultiLangSelect> <br /> <br /> <asp:Label ID="Label1" runat="server" Text="中文(台灣)" meta:resourcekey="Label1Resource1"></asp:Label> <br /> <br /> <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label></div> </form> </body> </html>
Default.aspx.cs
using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class _Default : LocalizedPage //System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { this.Label2.Text = this.GetLocalString("String1"); } }
相關檔案(第2版)
- 改以URL後的lang參數做為判斷
LocalizedPage.cs
- Path: ~\App_Code\LocalizedPage.cs
using System; using System.Data; using System.Text; using System.Web.UI; using System.Web.Security; using System.Threading; using System.Globalization; /// <summary> /// 所有需要地區化资源切换的頁面基礎類別 /// </summary> public class LocalizedPage : System.Web.UI.Page { //設定語系時,每個頁面一定要 Override 的 Method protected override void InitializeCulture() { string strSelectLang = Page.Request.QueryString["lang"]; if (String.IsNullOrEmpty(strSelectLang) == true) strSelectLang = Session["SelectLang"] as string; //若為第一次執行(為null) 或 MasterPage 下拉選單選第一個選項後的 PostBack(為空值""), //則先套用 user 自己 IE 中第一個設定的語言 if (String.IsNullOrEmpty(strSelectLang) == true) return; Session["SelectLang"] = strSelectLang; Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(strSelectLang); Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; base.InitializeCulture(); } public string GetLocalString(string strResourceKey) { string strRet = GetLocalResourceObject(strResourceKey) as string; return strRet; } }