1.定义用户语言设置信息类,对用户选择的语言进行保存,可以用Session,这里选用的是Cookies.
由于对Cookies的访问有一定的限制,Request对象时候读,Response对象写,所以我们需要将用户选择语言的值保存在其它对象里面,可以保存在Session里,这里选择保存在HttpContext.Items中。
2.定义HttpModule,每次访问的时候根据用户的设置来改变语言
{
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
{
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,此方案很不成熟,自己练手用。