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

       

  • 相关阅读:
    Hiveserver2高可用实现
    centos7 mysql数据库安装和配置
    ubuntu18.04 安装hadoop 2.7.3+hive 2.3.4
    imx6 RGB LCD
    imx6 KEY_ROW4 power output high fail
    ar1020 驱动移植 无效
    24C02 Twr
    undefined reference to `switch_dev_unregister'
    cannot open /proc/bus/usb/devices, No such file or directory
    imx6dl i2c4 support
  • 原文地址:https://www.cnblogs.com/sword-successful/p/3813958.html
Copyright © 2011-2022 走看看