Window Forms應用程式多語言支援

2022-02-02 13:53:19 字數 3495 閱讀 9260

最近有想法準備研究一下可以實時切換而且方便更改的多國語言的應用程式,在網路上搜尋了一些資料,參考了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...

應用程式域

一種邊界,它由公共語言執行庫圍繞同一應用程式範圍內建立的物件建立 即,從應用程式入口點開始,沿著物件啟用的序列的任何位置 應用程式域有助於將在乙個應用程式中建立的物件與在其他應用程式中建立的物件隔離,以使執行時行為可以預知。在乙個單獨的程序中可以存在多個應用程式域。以前使用程序邊界來隔離在同一臺計算...