Welcome 微信登录

首页 / 网页编程 / ASP.NET / ASP.NET中以后台消息+前台消息+页面自动绑定的方式实现多语言

ASP.NET中以后台消息+前台消息+页面自动绑定的方式实现多语言2014-06-04 cnblogs 初行一 前言

界面支持多种语言,在使用ASP.NET自带的多语言方案时遇到下列问题:

在做管理类的功能时,有添加、修改和查看页面,需要支持多语言的控件基本相同,但要维护多处,产生 冗余(ASP.NET有共享的资源,但它是全局的,不能分 模 块,我们不能所模块的信息入在全局资源中);

在页面中必须要指定资源文件中的KEY;

当页面慢来慢多时,页面与资源的匹配实在难以维护;

所以我认为一个理想的支持多语言框架,需要有以下特性:

分模块解决数据冗余问题;

自动匹配页面与资源文件之间的联系;

易于维护,能通过页面快速定位 到资源文件中;

支持后台消息的多语言实现

支持前台JS消息的多语言实现

二 后台消息多语言的实现

在实现后台消息多言的实现时,主要利用ASP.NET的特性,通过修改当前线程的区域语言,来获取对应版本 的资源。因为ASP.NET在处理请求时,会使用一个单独的线程来执行一次请求的所有代码,所以我们只需要在 一个地方重写当前线程的语言信息,在其它任何地方都可以获取当前语言版本的资源文件。重写当前线程的区 域语言的代码如下:

protected override void InitializeCulture(){string language = "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);//当区域信息为英文时,输出"The Filed is required!";当区域信息为中文时,输出"字段必填!"

三 前台JS多语言的实现

前台的多语言实现,即在JS中需要弹出一些提示也需要多语言。前台多语言的实现方法实现有很多,在本 例中,我们采用的统一的管理方式,把JS多语言信息同样放在资源文件中,只不过在一个公共的地方,把资源 序列成一个json对象,然后JS中便可以使用了。当然,在实现此功能时,需要做一些缓存的工作。主要代码如 下:

public static Dictionary<string, string> JsonResources = new Dictionary<string, string>();//把资源文件序列化成JSONpublic static string GetJsonResource() {string key = string.Format("JSResource.{0}", System.Threading.Thread.CurrentThread.CurrentCulture.Name);if (!JsonResources.ContainsKey(key)) {JavaScriptSerializer serialzer = new JavaScriptSerializer();ResourceSet rs = JSResource.ResourceManager.GetResourceSet(System.Threading.Thread.CurrentThread.CurrentCulture, true, true);string json = string.Format("[{0}]", serialzer.Serialize(rs.OfType<DictionaryEntry>().ToDictionary(x => x.Key, x => x.Value)));JsonResources.Add(key, json);}return JsonResources[key];} protected override void OnPreRenderComplete(EventArgs e){//输出JSON对象到页面Page.ClientScript.RegisterStartupScript(Page.GetType(), "", "<script language="javascript">var json=eval(" + ResourceCache.GetJsonResource() + ");JSResource=json[0];</script>"); }
在页面中就可以使用JSResource对象了,如alert(window.JSResource.JSMsg);