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

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM