一、概述
MSDN上有一個系列專門介紹.Net應和程序的本地化跟全球化,可以查看:http://msdn.microsoft.com/en-us/library/1021kkz0.ASPx
對我們來說,本地化的主要工作應該是語言翻譯,本文從.Net應用程序最基本的本地化解決方案說起,嘗試尋找更為高效的本地化之道。
二、資源文件
MS提供了一個相對簡便的本地化方案:使用資源文件(.resx),相信大家都比較熟悉它的用法,這裡給一個簡例:
--新建WinForm項目
--添加Button,text=OK
--選中窗體,修改Language屬性為Chinese (People’s Republic of China),此時localizable自動變成True。同時將Button的文本改成“確定”,此時VS自動添加了一個帶語言標識的.resx文件:Form1.zh-CN.resx
--將窗體Form1的Language重新設置成default,編譯,可見button的文本為“OK”
--修改Form1的構造器,在InitializeComponent()前添加一行:
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");
編譯,此時button的文本為“確定”。你可以在bin目錄下找到一個zh-CN文件夾,裡面是包含資源信息的dll(即所謂有的附屬程序集)。通常來說,你不需要一個窗體一窗體去設置CurrentThread.CurrentUICulture,因為顧名思義,這是對整個線程有效的。
除了上面由VS自動生成的資源文件外,通常,你可能還需要一些單獨的資源文件:
--新添項目,比如CommonHelper,添加兩個.resx文件:CommonText.resx, CommonText.zh-CN.resx
--在COmmonText.resx中添加一條名為“msg1”,值為“for your information”的資源
--在CommonText.zh-CN.resx中添加一條名為“msg1”,值為“提示信息”的資源
--在上一個項目中Form1的Button click事件方法中加上:
ResourceManager rm = new ResourceManager(typeof(CommonHelper.CommonText));
MessageBox.Show(rm.GetString("msg1"));
這樣,你的提示信息也不用硬編碼在代碼中了,可以從資源文件中讀取。
三、如何提高效率?
上面提到的本地化方案是基礎,但是對於現實中的某些項目,可能存在成百上千個頁面或者usercontrol,那麼除了一個一個去添加帶語言標識的資源文件並且由開發人員對照的翻譯表一個個添加內容外,有沒有比較方便的方法?答案是肯定的。首先先介紹兩個MS提供的工具:RESGEN.exe, AL.exe。
RESGEN.exe:資源文件生成器,如上圖,它可以將.resx文件生成.resources文件,對於後者這種形式,我們不作深究。命令格式:RESGEN yourresxname.resx outputname.resources
AL.exe:程序集鏈接器,如上圖,它可以將若干.resources文件鏈接成dll文件。命令格式:
al /t:lib /embed:xx1.resources /embed:xx2.resources /culture:zh-CN /out:outputname.resources.dll
值得注意的一點是,傳給AL.exe的.resources文件的文件名需要包含其名稱空間,例如:CommonHelper.CommonText.zh-CN.resources
有了這兩個工具,我們就可以對整個系統中本地化工作(語言翻譯)統一進行處理了,這裡不提供程序,只給出方案的步驟:
1)編寫工具遍歷讀取系統中的所有.resx文件,獲取其中需要翻譯的item,由於.resx本質是XML文件,所以這項工作容易完成。
2)將上一步所取得的內容規范存儲,比如存儲在XML文件中。
3)另寫一小工具讀取上一步所得xml文件並提供界面,將此程序交於及xml專業翻譯公司翻譯,並得翻譯後的XML文件。
4)據翻譯後的XML文件,生成.resx文件。由於.resx文件格式固定,所以這一步也容易實現。
5)使用RESGEN.exe AL.exe生成附屬程序集dll,並將所有dll置於以culture縮寫為名稱的文件中,比如zh-CN或en-GB,文件夾置於bin目錄下。
Ps,另有一篇相關文章,有興趣大家可以點此鏈接:http://www.codeproject.com/KB/aspnet/LocalizationGlobalizPart2.ASPx?display=Print