ASP.NET编程:ASP.NET 多言语的完成(背景动静+前台消...
那做企业软件是不是最好用J2EE?一媒介界面撑持多种言语,在利用ASP.NET自带的多言语计划时碰到以下成绩:
在做办理类的功效时,有增加、修正和检察页面,必要撑持多言语的控件基础不异,但要保护多处,发生冗余(ASP.NET有共享的资本,但它是全局的,不克不及分模块,我们不克不及所模块的信息进在全局资本中);
在页面中必需要指定资本文件中的KEY;
当页面慢来慢多时,页面与资本的婚配其实难以保护;
以是我以为一个幻想的撑持多言语框架,必要有以下特征:
分模块办理数据冗余成绩;
主动婚配页面与资本文件之间的接洽;
易于保护,能经由过程页面疾速定位到资本文件中;
撑持背景动静的多言语完成
撑持前台JS动静的多言语完成
二背景动静多言语的完成
在完成背景动静多言的完成时,次要使用ASP.NET的特征,经由过程修正以后线程的地区言语,来猎取对应版本的资本。由于ASP.NET在处置哀求时,会利用一个独自的线程来实行一次哀求的一切代码,以是我们只必要在一个中央重写以后线程的言语信息,在别的任何中央都能够猎取以后言语版本的资本文件。重写以后线程的地区言语的代码以下:
protectedoverridevoidInitializeCulture()
{
stringlanguage="en";//默许为英文
if(Session["Language"]!=null)language=Session["Language"].ToString();
Thread.CurrentThread.CurrentCulture=CultureInfo.CreateSpecificCulture(language);
Thread.CurrentThread.CurrentUICulture=CultureInfo.CreateSpecificCulture(language);
}
在定名资本文件名时,划定规矩以下:
默许言语的版本间接当一般定名,如定名OrderResource.resx
别的版本的资本文件名,应加上地区称号,如OrderResource.zh-cn.resx,OrderResource.en-us.resx.
将背景动静放在资本文件后,程序中只援用主的资本文件,如许在线程的地区信息变动后,会主动的援用别的言语版本的资本。好比在程序中利用以下代码:
Response.Write(OrderResource.FiledRequired);//当地区信息为英文时,输入"TheFiledisrequired!";当地区信息为中文时,输入"字段必填!"
三前台JS多言语的完成
前台的多言语完成,即在JS中必要弹出一些提醒也必要多言语。前台多言语的完成办法完成有良多,在本例中,我们接纳的一致的办理体例,把JS多言语信息一样放在资本文件中,只不外在一个大众的中央,把资本序列成一个json工具,然后JS中即可以利用了。固然,在完成此功效时,必要做一些缓存的事情。次要代码以下:
publicstaticDictionary<string,string>JsonResources=newDictionary<string,string>();
//把资本文件序列化成JSON
publicstaticstringGetJsonResource()
{
stringkey=string.Format("JSResource.{0}",System.Threading.Thread.CurrentThread.CurrentCulture.Name);
if(!JsonResources.ContainsKey(key))
{
JavaScriptSerializerserialzer=newJavaScriptSerializer();
ResourceSetrs=JSResource.ResourceManager.GetResourceSet(System.Threading.Thread.CurrentThread.CurrentCulture,true,true);
stringjson=string.Format("[{0}]",serialzer.Serialize(rs.OfType<DictionaryEntry>().ToDictionary(x=>x.Key,x=>x.Value)));
JsonResources.Add(key,json);
}
returnJsonResources;
}
protectedoverridevoidOnPreRenderComplete(EventArgse)
{
//输入JSON工具到页面
Page.ClientScript.RegisterStartupScript(Page.GetType(),"","<scriptlanguage="javascript">varjson=eval("+ResourceCache.GetJsonResource()+");JSResource=json;</script>");
}
在页面中就能够利用JSResource工具了,如alert(window.JSResource.JSMsg);
四页面中的元素主动婚配资本文件
此功效有一个条件就是资本文件中的KEY为控件ID而且为页面指定特定资本文件,如许我们就能够为控件主动婚配了。在婚配的过程当中,假如在指定的资本文件中未找到,那末会到大众的文件中查找。
注重:
1>为页面指定特定资本文件,次要是用于多个页面(模块)共享一个资本,模块的巨细能够本人把持;
2>有一个大众的资本文件,在全部项目中,总有一些信息是各个模块所通用的;
次要代码:
publicclassResourceFactory
{
publicstaticResourceAccessGetResource(System.Resources.ResourceManagerresMgr)
{
returnnewResourceAccess(resMgr,CommonResource.ResourceManager);
}
}
publicclassResourceAccess
{
privateResourceManagerresourceManager=null;
privateResourceManagercommonResourceManager=null;
publicResourceAccess(ResourceManagerresourceManager,ResourceManagercommonResourceManager)
{
this.resourceManager=resourceManager;
this.commonResourceManager=commonResourceManager;
}
publicstringGetString(stringname)
{
stringstr=this.resourceManager.GetString(name);
if(string.IsNullOrEmpty(str))
{
str=this.commonResourceManager.GetString(name);
if(string.IsNullOrEmpty(str))
{
str=string.Format("【{0}】notexist",name);
}
}
returnstr;
}
}
publicclassBasePage:Page
{
#regionMultLanguage
protectedoverridevoidInitializeCulture()
{
stringlanguage="en";//默许为英文
if(Session["Language"]!=null)language=Session["Language"].ToString();
Thread.CurrentThread.CurrentCulture=CultureInfo.CreateSpecificCulture(language);
Thread.CurrentThread.CurrentUICulture=CultureInfo.CreateSpecificCulture(language);
}
publicSystem.Resources.ResourceManagerPageResourceManager{set;get;}
privateResourceAccessresourceAccess;
privateLiterallit;
privateButtonbtn;
privateLinkButtonlibtn;
protectedoverridevoidOnPreRenderComplete(EventArgse)
{
//输入JSON工具到页面
Page.ClientScript.RegisterStartupScript(Page.GetType(),"","<scriptlanguage="javascript">varjson=eval("+ResourceCache.GetJsonResource()+");JSResource=json;</script>");
if(!IsPostBack)
{
//绑定页面的文本
if(PageResourceManager!=null)
{
resourceAccess=ResourceFactory.GetResource(PageResourceManager);
//wedonotuserecursion,becauseitcreatetoomuchstack.
foreach(ControlcinPage.Controls)//Largecontrolofpage,likeHTML,Form
{
foreach(ControlchildCinc.Controls)//Normalcontrolofpage,likebutton,literal
{
BindControlLanguage(childC);
foreach(ControlchildCCinchildC.Controls)//Containercontrolofpage(ifonecontrlhaschildcontrols)
{
BindControlLanguage(childCC);
foreach(ControlchildCCCinchildCC.Controls)
{
BindControlLanguage(childCCC);
foreach(ControlchildCCCCinchildCCC.Controls)
{
BindControlLanguage(childCCCC);
}
}
}
}
}
}
}
base.OnPreRenderComplete(e);
}
privatevoidBindControlLanguage(Controlc)
{
if(cisLiteral)
{
lit=(Literal)c;
if(lit.Text=="")
{
lit.Text=resourceAccess.GetString(lit.ID);
}
}
elseif(cisButton)
{
btn=(Button)c;
btn.Text=resourceAccess.GetString(btn.ID);
}
elseif(cisLinkButton)
{
libtn=(LinkButton)c;
if(libtn.Text=="")
{
libtn.Text=resourceAccess.GetString(libtn.ID);
}
}
}
#endregion
}
五最后的效果
英文版本
中版本
全体代码下载
那做企业软件是不是最好用J2EE? 在asp.net虚拟主机的服务提供商中,目前首推的是CNNIC的其中一家域名注册机构---时代互联(www.ckuyun.com),他们早在2001年微软刚推出Asp.net时就推出了对应的Asp.net虚拟主机了,经笔者的使用测试,他提供的Asp.net性能非常的稳定,版本也会定期的更新,目前他的 asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源 最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。 同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。 同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。 Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。 使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。 通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。 JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。
页:
[1]