首页 > 代码库 > ASP.NET系统国际化总结
ASP.NET系统国际化总结
引言
系统要求同时支持中英文,以前对国际化这块只是听说过,从来没有自己动手过,提到国际化那么首先肯定想到的就是资源文件,也确实是这样,于是乎我从开始着手系统国际化功能时前前后后共投入了4次时间段,每次大概都在1-2个小时左右,从而让我觉的不能轻视他,否则会乱套。
国际化都需要做那些工作呢?
1、当然是资源文件。它是系统国际化工作的第一道关口,资源文件需要准备中文和英文两种,也就是Resource.resx和Resource-en.resx文件,我使用的全局资源文件。
2、系统菜单。 正常的业务逻辑,我们的系统菜单数据都是存在数据库中的,那么如何决定从数据库读取中文字段还是英文字段呢,就需要有一个标识到决定,这个标识就是Session,用Session来记录当前系统用户选择的何种语言。
3、aspx页面中的文字。
4、js文件中的汉字。
5、如果你在使用HTML控件之外还用了服务器控件呢?
准备工作
1、资源文件。分别对应中文和英文资源文件
2、BasePage页面,依赖资源文件的页面都需要继承BasePage页面,这个页面应该众所周知。
1 public partial class BasePage : System.Web.UI.Page 2 { 3 #region 变量 4 5 protected ResourceManager rmCommon = new ResourceManager("Resources.Resource.zh-cn", Assembly.GetExecutingAssembly()); 6 #endregion 7 8 #region Page_Load 9 10 protected void Page_Load(object sender, EventArgs e) 11 { 12 13 } 14 #endregion 15 16 #region 系统语种 17 18 protected SysLanguage JrscLanguage 19 { 20 get 21 { 22 if (Session["Language"] != null) 23 { 24 if (Session["Language"].ToString() == "zh-CN") 25 { 26 return SysLanguage.Chinese; 27 } 28 else 29 { 30 return SysLanguage.English; 31 } 32 } 33 else 34 { 35 //如果当前无法获取系统语种则默认为汉语 36 return SysLanguage.Chinese; 37 } 38 } 39 40 41 } 42 #endregion 43 44 #region 初始化多语言环境 45 46 /// <summary> 47 /// 初始化多语言环境 48 /// </summary> 49 protected override void InitializeCulture() 50 { 51 try 52 { 53 54 55 string language = Request.Form["__EventTarget"]; 56 57 if (!string.IsNullOrEmpty(language)) 58 { 59 string LanguageId = Request.Form[language]; 60 if (!String.IsNullOrEmpty(LanguageId)) 61 { 62 SetCulture(LanguageId); 63 } 64 } 65 else 66 { 67 if (Session["Language"] != null) 68 { 69 string curL = Session["Language"].ToString(); 70 } 71 } 72 73 if (Session["Language"] != null) 74 { 75 string curL = Session["Language"].ToString(); 76 if (string.IsNullOrEmpty(curL)) 77 curL = "zh-CN"; 78 else if (curL.ToLower().Contains("zh")) 79 curL = "zh-CN"; 80 else 81 curL = "en-US"; 82 83 84 CultureInfo ci = Thread.CurrentThread.CurrentCulture; 85 string cur = ci.TwoLetterISOLanguageName; 86 string curName = ci.Name; 87 88 if (curName.ToLower() != curL.ToLower()) 89 SetCulture(curL); 90 } 91 92 base.InitializeCulture(); 93 } 94 catch (Exception ex) 95 { 96 Console.WriteLine(ex.ToString()); 97 } 98 } 99 protected bool IsLogin = true;100 protected override void OnInit(EventArgs e)101 {102 base.OnInit(e);103 }104 105 protected void SetCulture(string languageId)106 {107 try108 {109 //Session["Language"] = languageId;110 111 CultureInfo ci = CultureInfo.CreateSpecificCulture(languageId);112 Thread.CurrentThread.CurrentCulture = ci;113 ci = new CultureInfo(languageId);114 Thread.CurrentThread.CurrentUICulture = ci;115 116 }117 catch (Exception ex)118 {119 Console.WriteLine(ex.ToString());120 languageId = "en-US";121 CultureInfo ci = CultureInfo.CreateSpecificCulture(languageId);122 Thread.CurrentThread.CurrentCulture = ci;123 ci = new CultureInfo(languageId);124 Thread.CurrentThread.CurrentUICulture = ci;125 126 }127 }128 129 #endregion130 131 132 133 134 135 136 }
3、存放在js中需要国际化的文字
var js_language = "";js_language = $.cookie(‘js_language‘);var Logout = new Array();Logout["zh-CN"] = "您是否确认退出系统吗?";Logout["en-US"] = "Are you sure to exit?";
aspx页面国际化
页面继承BasePage后,就可以使用<%=this.GetGlobalResourceObject("Resource","Home_Page")%> 获取对应文字
系统菜单国际化
当页面经登录页面选择语种后,将语种选项存入Session中, 在首页加载菜单时根据该选项读取相应菜单显示文字,其他页面需要的文字同理解决。 有时首页也需要添加国际化切换功能,当在首页中切换时需要更新该Session标识,也就是我在BasePage中定义的Session["Language"]。
js文件内文字国际化
提到js文件内的文字国际化可就是一个不小的体力活了,把js脚本写在aspx页面中,那么可以按照页面的访问方式来访问即可,如果是单独的js文件,则就需要民工时的劳动了。于是用到准备工作中提到的js文件,每个需要翻译的词组定义一个数组,数组放对应的语种和对应的翻译文字, 这里还要用到一个Cookie, 在你使用时根据Cookie的值来选择相应语种。
服务器控件文字国际化
这点我就奇怪了,也是今天才发现的,为毛我在服务器控件的Text也直接写<%%>时就报错呢? 没办法的情况下,用了个笨方法,只能在Page_Init函数中根据Session["Language"]来翻译了。
总结
首先,国际化总体情况是个纯体力活,需要分别考虑资源文件、aspx页面、js文件。 起初我没在意,认为把资源文件准备好就行了,经过前前后后4次大改后我发现这些细节性问题还是要认真对待,在我第二次大改时我在后台是Session也用,Cookie也用,切换语种后发现Cookie存放的值跨页面后就找不到了,要知道Cookie跨页面是肯定存在的,又一次郁闷,于是又有了第三次和第四次的大改才基本完成。