最近有想法準備研究一下可以實時切換而且方便更改的多國語言的應用程式,在網路上搜尋了一些資料,參考了msdn的一些資料,最終做出乙個簡單的類用於多語言支援。
注:該思路和類參考了《c#的windows程式設計中多語言的實現》一文,對其作者表示感謝。
另外順便鄙視一下那些胡亂**的**,連作者名字都給胡亂換了!!!
基本思路是比較簡單:
在切換語言的時候調入相應xml資源到hash table
修改介面的時候獲取所有介面元素
從hash table裡面查詢相應的值
賦值即可
難點在於獲取所有介面元素。
對於windows form應用程式,訪問form.controls可以得到窗體包含的控制項。迴圈遍歷所有的控制項並得到其type,然後對不同的type進行不同的處理。有些控制項可以包含更多的控制項,意味著需要用乙個遞迴呼叫來遍歷所有的控制項,在我的程式中呼叫setsubcontrols這個子程式來做這個工作。
對於需要顯示的message,我也在xml檔案中做了定義。每個message有乙個id號,根據不同的id號來區分所要顯示的內容。各個語言之間的id號相同,只是其內容不同而已。
此方法的優點在於
xml檔案中只需提供所在的窗體和控制項的名字即可,方便編輯和除錯。
可以方便的建立更多的語言,在不修改程式的情況下可以滿足使用者自定義語言的需要。
根據以上的思路可以設計乙個localization類,專門負責語言的切換,包含如下的幾個函式(具體請參閱源**)
public
static
void setlanguage(string lang) //設定全域性語言
public
static
string getmessage(string id) //得到相應的訊息
public
static
void setform(form form) //為form設定語言
private
static
void setdropdownitems(toolstripitemcollection items, hashtable table) //處理選單的dropdown items
private
static
void setsubcontrols(control.controlcollection controls, hashtable table) //處理子控制項
private
static
hashtable readwindowresource(string frmname, string lang) //從xml檔案裡面讀取資源
private
static
void readmessageresource() //讀取訊息資源
以上的幾個靜態函式就構成了類的基本,呼叫的時候只需setlanguage,然後setform即可。
示範xml檔案:
xmlversion
="1.0"
encoding
="utf-8"?>
<
resources
>
<
form
>
<
name
>frmmultilanguagedemo
name
>
<
controls
>
<
control
name
="btnen"
text
="en"/>
<
control
name
="btnchn"
text
="chn"/>
<
control
name
="txtcurrrentlang"
text
="english"/>
<
control
name
="lbltext"
text
="label"/>
<
control
name
="chkbox1"
text
="checkbox"/>
<
control
name
="tabpage1"
text
="page 1"/>
<
control
name
="tabpage2"
text
="page 2"/>
<
control
name
="radiobutton1"
text
="option"/>
<
control
name
="btnshowmsg"
text
="show message"/>
<
control
name
="btnshowwin"
text
="new window"/>
<
control
name
="mnufile"
text
="file"/>
<
control
name
="mnuexit"
text
="exit"/>
<
control
name
="mnuhelp"
text
="help"/>
<
control
name
="mnuoptions"
text
="options"/>
<
control
name
="mnuoption1"
text
="option 1"/>
controls
>
<
name
>frmnewwindow
name
>
<
controls
>
<
control
name
="txttext"
text
="new window"/>
controls
>
form
>
<
messages
>
<
message
id="msg_test"
text
="test message"/>
messages
>
resources
>
ios應用程式和應用程式委託
其實說白了,就是乙個類將自己不願意實現的方法以協議的方式定義,同時在這個類中包含有乙個型別為id 泛型類 的例項變數,如果另乙個類實現了這個協議,那麼另外的這個類就可以作為第乙個類的委託物件,前乙個類將自己不願意實現的類委託給後乙個類。因為第乙個類擁有第二個類的引用,所有第乙個類的例項可以直接呼叫第...
python啟動應用程式和終止應用程式
每天上班,工作需要,電腦上需要每天開機啟動一些軟體,下班時候,需要關掉一些軟體。乙個乙個開啟和關閉貌似是很繁瑣的,於是乎,這個指令碼產生了。系統環境 win7 32位 python 2.7.9 你還需要安裝pywin32。pip install pywin32 啟動應用程式指令碼 coding ut...
應用程式域
一種邊界,它由公共語言執行庫圍繞同一應用程式範圍內建立的物件建立 即,從應用程式入口點開始,沿著物件啟用的序列的任何位置 應用程式域有助於將在乙個應用程式中建立的物件與在其他應用程式中建立的物件隔離,以使執行時行為可以預知。在乙個單獨的程序中可以存在多個應用程式域。以前使用程序邊界來隔離在同一臺計算...