在C#中有多種使用資源文件的方法,能夠很方便地開發全球通用的應用程序。本文通過一個簡單的小例子,來講解在C#中如何利用資源文件,快速開發一個多種語言版本的程序。本例中只有一個窗體,三個控件,能夠根據用戶的設置以中文或英文界面運行。開發環境是Windows 2000 Professional、Microsoft Visual Studio.NET 2002。具體開發步驟如下:
一、新建項目
啟動Microsoft Visual Studio .NET,新建一個C#項目MyApp,本例工程存放於F:\Csharp\MyApp。
二、添加控件
在Form1 窗體上添加三個控件(見圖1):主菜單MainMenu、標簽Label1和按鈕Button1。Label1和Button1控件的屬性均采用缺省設置。MainMenu控件中添加三個菜單項menuItem1、menuItem2、menuItem3。Text屬性分別設為“語言”、“中文”和“English”。menuItem2、
menuItem3 的RadioCheck屬性設為True。
圖 1
三、創建配置文件
在項目中添加一個文本文件MyAppConfig.ini,保存當前程序的語言版本設置。該文件中只有一行內容。如果是“English”,則表示程序為英文版;如果是“Chinese”則為中文版。這裡暫且保存為“English”。
四、創建資源文件
.NET中的資源文件有三種: 文本(.txt )文件、XML 格式的.Resx 文件和.Resources 文件。文本文件只能包含形如“ 名稱= 值”格式的字符串資源。.Resx文件和.Resources 文件中不僅能保存字符串資源,還能保存圖像等可序列化的持久對象資源。但是只有.resources 文件格式的資源文件才能被嵌入到運行庫可執行文件中,或被編譯為附屬程序集。利用Visual Studio .NET 中自帶的資源文件生成器
(Resgen.exe),可以將.txt文件和.Resx文件轉換為.resources 文件格式。本例中只用到了字符串資源,所以在項目中添加兩個文本文件Resource_zh.txt 和Reource_en.txt。
Reource_en.txt 文件中的內容:
menuItem1_Name=Language button1_Name=Exit label1_Text=This is English version!
Resource_zh.txt 文件中的內容:
menuItem1_Name=語言 button1_Name=退出 label1_Text=這是中文版!
需要注意的是Resource_zh.txt文件中含有漢字,必須以UTF-8編碼保存。在Visual Studio .NET集成開發環境中,可以先點擊“文件”菜單中的“高級保存選項”,選中UTF-8編碼格式,再保存文件。
然後,點擊“程序”菜單中的“Visual Studio .NET命令提示”菜單,進入DOS方式,輸入以下兩行命令,生成程序中能夠訪問的資源文件MyApp.resources和MyApp.zh-CN.resources。英文資源文件MyApp.resources 作為默認的後備資源文件。MyApp.zh-CN.resources
是中文資源文件,文件名中的“MyApp”是資源文件的根名稱,必須與後備資源文件的根名稱相同,“zh-CN”指定資源文件的區域性。
F:\Csharp\MyApp>resgen Resource_en.txt,MyApp.resources
F:\Csharp\MyApp>resgen Resource_zh.txt,MyApp.zh-CN.
resources
五、修改代碼
1、在代碼的開頭添加需引用的命名空間。
using System.Globalization; using System.Resources; using System.Threading; using System.IO;
2、在Form1 中定義兩個字段ci和rm。CultureInfo對象ci用來指定讀取資源文件時的區域性。ResourceManager對象rm用來在指定的資源文件中讀取資源。
CultureInfo ci = new CultureInfo(""); Res ource Manag er rm = Res ource Manag er.CreateFileBasedResourceManager("MyAPP", ".", null);
3、在Form1中添加一個方法ReadResources,用來讀取相應資源文件中的字符串資源,來修改界面菜單、標簽和按鈕上文字顯示。
private void ReadResources(){ this.menuItem1.Text = rm.GetString("menuItem1_Text",ci) ; this.button1.Text = rm.GetString("button1_Text",ci); this.label1.Text = rm.GetString("label1_Text",ci); this.Refresh(); }
4、在Form1 的Load事件處理過程中,根據配置文件的內容,調用ReadResources方法,讀取資源,顯示程序界面。
private void Form1_Load(...) { StreamReader sr=File.OpenText("MyAppConfig.ini"); if (sr.ReadLine()=="Chinese"){ ci = new CultureInfo("zh-CN"); menuItem2.Checked=true; } else { ci = new CultureInfo("en"); menuItem3.Checked=true; } sr.Close(); this.ReadResources(); }