在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();
}
5、在form1 中添加一個方法saveconfig,用來修改配置文件。在menuitem2 和menuitem3 的click事件過程中調用s a v e c o n f i g 方法,分別將字符串“chinese”、“english ”寫入配置文件,并調用readresources方法,來更新界面。
private void saveconfig(string p_language){
streamwriter sw=file.createtext("myappconfig.ini");
sw.writeline(p_language);
sw.close();
}
private void menuitem2_click(...){
this.saveconfig("chinese");ci = new cultureinfo("zh-cn");
menuitem2.checked=true; menuitem3.checked=false;
this.readresources();
}
private void menuitem3_click(...){
this.saveconfig("english");
ci = new cultureinfo("en");
menuitem2.checked=false;
menuitem3.checked=true;
this.readresources();
}
6、在按鈕button1的click事件過程中,關閉窗體,結束運行程序。
private void button1_click(...)
{
this.close();
}
六、編譯并運行程序
如果手工編譯源程序,只需點擊“visual studio.net 命令提示”菜單,進入dos方式,輸入下面命令,即可生成二進制的可執行文件myapp.exe,然后輸入myapp,就能運行程序。
f:/csharp/myapp>csc /out:myapp.exe form1.cs
如果是在microsoft visual studio .net 集成開發環境中運行程序,將自動進行編譯,并將編譯的二進制可執行文件放到bin/debug子目錄下。此時,需要注意的是要將myappconfig.ini、myapp.resources 和myapp.zh-cn.resources 這三個文件也復制到bin/debug/子目錄下,程序才能正常運行。
程序第一次運行時,是英文界面(見圖2),點擊菜單“中文”,將變成中文界面(見圖3)。單擊按鈕“exit”,退出程序后,再次運行程序時,直接顯示中文界面。

圖2

圖3