引言
系統要求同時支持中英文,以前對國際化這塊只是聽說過,從來沒有自己動手過,提到國際化那么首先肯定想到的就是資源文件,也確實是這樣,於是乎我從開始着手系統國際化功能時前前后后共投入了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 }
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跨頁面是肯定存在的,又一次郁悶,於是又有了第三次和第四次的大改才基本完成。
