|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
那做企业软件是不是最好用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[key];
}
protectedoverridevoidOnPreRenderComplete(EventArgse)
{
//输入JSON工具到页面
Page.ClientScript.RegisterStartupScript(Page.GetType(),"","<scriptlanguage="javascript">varjson=eval("+ResourceCache.GetJsonResource()+");JSResource=json[0];</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[0];</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? |
|