首页 > 代码库 > 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     }
View Code

 
    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?";
View Code


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跨页面是肯定存在的,又一次郁闷,于是又有了第三次和第四次的大改才基本完成。