解決方案原理:
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事件代碼
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack){
if (Request.Cookies[Settings.Default.Cookies_Language] == null || Request.Cookies[Settings.Default.Cookies_Language].Value == "")
{
foreach (ListItem li in DropDownList1.Items)
{
if (li.Value == "")
li.Selected = true;
}
}
else
{
foreach (ListItem li in DropDownList1.Items)
{
if (li.Value.ToLower() == Request.Cookies[Settings.Default.Cookies_Language].Value.ToLower())
li.Selected = true;
}
}
}
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
Response.Redirect("~/ChangeLanguage.aspx?Language=" + DropDownList1.SelectedValue + "&url=" + Server.UrlEncode(Request.Url.PathAndQuery) ,true);
}
ChangeLanguage中間頁面代碼:
public partial class ChangeLanguage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Cookies["Language"].Value = Request["Language"];
Response.Cookies["Language"].Expires = DateTime.Now.AddDays(1000);
Response.Redirect(Server.UrlDecode(Request["url"]));
}
}
2:在每頁載入時會判斷目前使用者選擇的地區,一般在頁面的基類中實現比如類名:BasePage。
當使用者初次進入網站識別用戶端瀏覽器,
當使用者曾經選擇了地區,載入選擇地區
/**//// <summary>
/// 本地化
/// </summary>
protected override void InitializeCulture()
{
if (Request.Cookies[Settings.Default.Cookies_Language] != null && Request.Cookies[Settings.Default.Cookies_Language].Value != null && Request.Cookies[Settings.Default.Cookies_Language].Value != "")
{
setCulture();
}
else
{//設定Cookie
Response.Cookies[Settings.Default.Cookies_Language].Value =
(Request.Headers["accept-language"].Split(",".ToCharArray())[0]);
Response.Cookies[Settings.Default.Cookies_Language].Expires = DateTime.Now.AddDays(1000);
setCulture();
}
base.InitializeCulture();
}
private void setCulture()
{
try
{
String selectedLanguage = Request.Cookies[Settings.Default.Cookies_Language].Value;
UICulture = selectedLanguage;
Culture = selectedLanguage;
System.Threading.Thread.CurrentThread.CurrentCulture =
System.Globalization.CultureInfo.CreateSpecificCulture(selectedLanguage);
System.Threading.Thread.CurrentThread.CurrentUICulture = new
System.Globalization.CultureInfo(selectedLanguage);
}
catch //( Exception ex )
{
Response.Cookies.Clear();// [Settings.Default.Cookies_Language].d
//throw;
}
}
3:當然是為每個頁面準備資源檔。
這個是個體力活,
ASPNET.ascx.en.resx 表示英文的
ASPNET.ascx.zh.resx 這個表示中文的,當然還可以分為更加細的地區,比如zh-CN/zh-HK/zh-TW
4:當然要記得,把你的頁面都要繼承你的基類
public partial class Index : PageBase
from : http://asp.51aspnet.net/showtopic-103.aspx