1.定义用户语言设置信息类,对用户选择的语言进行保存,可以用Session,这里选用的是Cookies.
using
System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using CommonUtility;
/**/ /// <summary>
///ASPNET方式下为上下文语言环境提供语言设置对象
/// </summary>
public class ASPNETLocalizer : ILocalizer
{
HttpContext httpContext;
/**//// <summary>
/// 创建对象
/// </summary>
/// <param name="httpResponse">HTTP相应对象</param>
public ASPNETLocalizer()
{
this.httpContext = HttpContext.Current;
}
ILocalizer 成员#region ILocalizer 成员
public string LocalizerName
{
get
{
//由于Cookies有Response.Request之分,所以需要在HttpContext上下文中保存语言信息
if (httpContext.Items[CookiesCenter.Language] == null)
{
var localizerName = Cookies.ReadCookies(httpContext.Request, CookiesCenter.Language);
if (String.IsNullOrEmpty(localizerName))
{
localizerName = "zh-CN";
SetName(localizerName);
}
return localizerName;
}
else
{
return httpContext.Items[CookiesCenter.Language].ToString();
}
}
set
{
SetName(value);
}
}
/**//// <summary>
/// 设置名称
/// </summary>
/// <param name="localizerName">语言名称</param>
void SetName(string localizerName)
{
Cookies.WriteCookies(httpContext.Response, CookiesCenter.Language, localizerName);
httpContext.Items[CookiesCenter.Language] = localizerName;
System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo(localizerName);
System.Threading.Thread.CurrentThread.CurrentCulture = ci;
System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
}
#endregion
}
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using CommonUtility;
/**/ /// <summary>
///ASPNET方式下为上下文语言环境提供语言设置对象
/// </summary>
public class ASPNETLocalizer : ILocalizer
{
HttpContext httpContext;
/**//// <summary>
/// 创建对象
/// </summary>
/// <param name="httpResponse">HTTP相应对象</param>
public ASPNETLocalizer()
{
this.httpContext = HttpContext.Current;
}
ILocalizer 成员#region ILocalizer 成员
public string LocalizerName
{
get
{
//由于Cookies有Response.Request之分,所以需要在HttpContext上下文中保存语言信息
if (httpContext.Items[CookiesCenter.Language] == null)
{
var localizerName = Cookies.ReadCookies(httpContext.Request, CookiesCenter.Language);
if (String.IsNullOrEmpty(localizerName))
{
localizerName = "zh-CN";
SetName(localizerName);
}
return localizerName;
}
else
{
return httpContext.Items[CookiesCenter.Language].ToString();
}
}
set
{
SetName(value);
}
}
/**//// <summary>
/// 设置名称
/// </summary>
/// <param name="localizerName">语言名称</param>
void SetName(string localizerName)
{
Cookies.WriteCookies(httpContext.Response, CookiesCenter.Language, localizerName);
httpContext.Items[CookiesCenter.Language] = localizerName;
System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo(localizerName);
System.Threading.Thread.CurrentThread.CurrentCulture = ci;
System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
}
#endregion
}
由于对Cookies的访问有一定的限制,Request对象时候读,Response对象写,所以我们需要将用户选择语言的值保存在其它对象里面,可以保存在Session里,这里选择保存在HttpContext.Items中。
2.定义HttpModule,每次访问的时候根据用户的设置来改变语言
Code
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using CommonUtility;
/// <summary>
///自定义向实现类提供模块初始化和处置事件。
/// </summary>
public class MYHttpModule : IHttpModule
{
HttpApplication context;
public PhenixHttpModule()
{
}
#region IHttpModule 成员
public void Dispose()
{
UnityContainer.ObjectProvider = null;
context.PostAcquireRequestState -= new EventHandler(context_PostAcquireRequestState);
}
public void Init(HttpApplication context)
{
this.context = context;
context.PostAcquireRequestState += new EventHandler(context_PostAcquireRequestState);
}
void context_PostAcquireRequestState(object sender, EventArgs e)
{
var app = sender as HttpApplication;
if (UnityContainer.ObjectProvider == null)
{
var provider = new ASPNETObjectProvider();
UnityContainer.ObjectProvider = provider;
}
System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo(UnityContainer.GetObject<ILocalizer>().LocalizerName);
System.Threading.Thread.CurrentThread.CurrentCulture = ci;
System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
}
#endregion
}
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using CommonUtility;
/// <summary>
///自定义向实现类提供模块初始化和处置事件。
/// </summary>
public class MYHttpModule : IHttpModule
{
HttpApplication context;
public PhenixHttpModule()
{
}
#region IHttpModule 成员
public void Dispose()
{
UnityContainer.ObjectProvider = null;
context.PostAcquireRequestState -= new EventHandler(context_PostAcquireRequestState);
}
public void Init(HttpApplication context)
{
this.context = context;
context.PostAcquireRequestState += new EventHandler(context_PostAcquireRequestState);
}
void context_PostAcquireRequestState(object sender, EventArgs e)
{
var app = sender as HttpApplication;
if (UnityContainer.ObjectProvider == null)
{
var provider = new ASPNETObjectProvider();
UnityContainer.ObjectProvider = provider;
}
System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo(UnityContainer.GetObject<ILocalizer>().LocalizerName);
System.Threading.Thread.CurrentThread.CurrentCulture = ci;
System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
}
#endregion
}
3.在Web.Config中添加记录
<
httpModules
>
< add name ="MYModule" type ="MYHttpModule" />
</ httpModules >
< add name ="MYModule" type ="MYHttpModule" />
</ httpModules >
4.定义资源文件存取对象ResourceManager
Code
public class ResourceManager
{
XElement ResourceManager;
public Localizer()
{
//可以根据自己的需要处理资源文件的读取
var culture = System.Threading.Thread.CurrentThread.CurrentCulture;
var filepath = HttpContext.Current.Server.MapPath("~/App_Code/"+ culture.Name+"/lang.xml");
xmlLocalizer = XElement.Load(filepath);
}
public Localizer()
: this())
{
}
public string GetString(string id)
{
return return xmlLocalizer.Descendants("resource").Where(p => p.Attribute("name").Value == id).Select(p1 => p1.Value).FirstOrDefault();
}
}
public class ResourceManager
{
XElement ResourceManager;
public Localizer()
{
//可以根据自己的需要处理资源文件的读取
var culture = System.Threading.Thread.CurrentThread.CurrentCulture;
var filepath = HttpContext.Current.Server.MapPath("~/App_Code/"+ culture.Name+"/lang.xml");
xmlLocalizer = XElement.Load(filepath);
}
public Localizer()
: this())
{
}
public string GetString(string id)
{
return return xmlLocalizer.Descendants("resource").Where(p => p.Attribute("name").Value == id).Select(p1 => p1.Value).FirstOrDefault();
}
}
5.在需要赋值的地方,实例化赋值即可
说明:初学ASP.NET,此方案很不成熟,自己练手用。