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

   

ASP.NET系统国际化总结,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。