ASP.Net本地化/国际化解决方案原理和代码示例

解决方案原理:
ASP.NET本地化支持
通过 CultureInfo 类可以访问区域设置的属性。
此外,ASP.NET 基于每个线程和请求跟踪默认区域性的两个属性:用于区域设置相关函数默认值的 CurrentCulture,
和用于区域设置特定的资源数据查找的 CurrentUICulture。

解决方案主要包含几个部分组成:
1:客户设置语言的控件,一般会包含在每个页面,使得用户可以随时切换区域
控件ascx代码

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

控件CS事件代码
None.gif protected   void  Page_Load( object  sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif            
if (!Page.IsPostBack)dot.gif{
InBlock.gif                
if (Request.Cookies[Settings.Default.Cookies_Language] == null || Request.Cookies[Settings.Default.Cookies_Language].Value == "")
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
foreach (ListItem li in DropDownList1.Items)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        
if (li.Value == "")
InBlock.gif                            li.Selected 
= true;
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }

InBlock.gif                
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
foreach (ListItem li in DropDownList1.Items)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        
if (li.Value.ToLower() == Request.Cookies[Settings.Default.Cookies_Language].Value.ToLower())
InBlock.gif                            li.Selected 
= true;
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

None.gif
None.gif        
protected   void  DropDownList1_SelectedIndexChanged( object  sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            Response.Redirect(
"~/ChangeLanguage.aspx?Language=" + DropDownList1.SelectedValue + "&url=" + Server.UrlEncode(Request.Url.PathAndQuery) ,true);
ExpandedBlockEnd.gif        }
ChangeLanguage中间页面代码:
None.gif public  partial  class  ChangeLanguage : System.Web.UI.Page
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        
protected void Page_Load(object sender, EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Response.Cookies[
"Language"].Value = Request["Language"];
InBlock.gif            Response.Cookies[
"Language"].Expires = DateTime.Now.AddDays(1000);
InBlock.gifInBlock.gif           
InBlock.gif
InBlock.gif            Response.Redirect(Server.UrlDecode(Request[
"url"]));
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }

2:在每页加载时会判断当前用户选择的区域,一般在页面的基类中实现比如类名:BasePage。
当用户初次进入网站识别客户端浏览器,
当用户曾经选择了区域,加载选择区域
ExpandedBlockStart.gif ContractedBlock.gif /**/ /// <summary>
InBlock.gif        
/// 本地化
ExpandedBlockEnd.gif        
/// </summary>

None.gif          protected   override   void  InitializeCulture()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
if (Request.Cookies[Settings.Default.Cookies_Language] != null && Request.Cookies[Settings.Default.Cookies_Language].Value != null && Request.Cookies[Settings.Default.Cookies_Language].Value != "")
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                setCulture();
ExpandedSubBlockEnd.gif            }

InBlock.gif            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{//设置Cookie
InBlock.gif
                Response.Cookies[Settings.Default.Cookies_Language].Value =
InBlock.gif                    (Request.Headers[
"accept-language"].Split(",".ToCharArray())[0]);
InBlock.gif                Response.Cookies[Settings.Default.Cookies_Language].Expires 
= DateTime.Now.AddDays(1000);
InBlock.gif                setCulture();
ExpandedSubBlockEnd.gif            }

InBlock.gif            
base.InitializeCulture();
ExpandedBlockEnd.gif        }

None.gif
None.gif
None.gif        
private   void  setCulture()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif
InBlock.gif            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                String selectedLanguage 
= Request.Cookies[Settings.Default.Cookies_Language].Value;
InBlock.gif                UICulture 
= selectedLanguage;
InBlock.gif                Culture 
= selectedLanguage;
InBlock.gif
InBlock.gif                System.Threading.Thread.CurrentThread.CurrentCulture 
=
InBlock.gif                    System.Globalization.CultureInfo.CreateSpecificCulture(selectedLanguage);
InBlock.gif                System.Threading.Thread.CurrentThread.CurrentUICulture 
= new
InBlock.gif                    System.Globalization.CultureInfo(selectedLanguage);
ExpandedSubBlockEnd.gif            }

InBlock.gif            
catch //( Exception ex )
ExpandedSubBlockStart.gifContractedSubBlock.gif
            dot.gif{
InBlock.gif                Response.Cookies.Clear();
// [Settings.Default.Cookies_Language].d
InBlock.gif                
//throw;
ExpandedSubBlockEnd.gif
            }

ExpandedBlockEnd.gif        }

3:当然是为每个页面准备资源文件。
这个是个体力活,
ASPNET.ascx.en.resx 表示英文的
ASPNET.ascx.zh.resx 这个表示中文的,当然还可以分为更加细的区域,比如zh-CN/zh-HK/zh-TW

4:当然要记得,把你的页面都要继承你的基类
   public partial class Index : PageBase
   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值