解决方案原理:
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:在每页加载时会判断当前用户选择的区域,一般在页面的基类中实现。
当用户初次进入网站识别客户端浏览器,
当用户曾经选择了区域,加载选择区域
/**//// <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
Posted on 2008-12-25 23:13  Yongming Ye  阅读(240)  评论(0)    收藏  举报