Window Forms應用程式多語言支援

來源:互聯網
上載者:User

最近有想法準備研究一下可以即時切換而且方便更改的多國語言的應用程式,在網路上搜尋了一些資料,參考了MSDN的一些資料,最終做出一個簡單的類用於多語言支援。

註:該思路和類參考了《C#的Windows編程中多語言的實現》一文,對其作者表示感謝。
另外順便鄙視一下那些胡亂轉載的網站,連作者名字都給胡亂換了!!!

基本思路是比較簡單:

  1. 在切換語言的時候調入相應XML資源到hash table
  2. 修改介面的時候擷取所有介面元素
  3. 從hash table裡面尋找相應的值
  4. 賦值即可

痛點在於擷取所有介面元素。

對於Windows Form應用程式,訪問Form.Controls可以得到表單包含的控制項。迴圈遍曆所有的控制項並得到其Type,然後對不同的Type進行不同的處理。有些控制項可以包含更多的控制項,意味著需要用一個遞迴調用來遍曆所有的控制項,在我的程式中調用SetSubControls這個子程式來做這個工作。

對於需要顯示的Message,我也在XML檔案中做了定義。每個Message有一個ID號,根據不同的ID號來區分所要顯示的內容。各個語言之間的ID號相同,只是其內容不同而已。

此方法的優點在於

  1. XML檔案中只需提供所在的表單和控制項的名字即可,方便編輯和調試。
  2. 可以方便的建立更多的語言,在不修改程式的情況下可以滿足使用者自訂語言的需要。

根據以上的思路可以設計一個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檔案:

<?xml version="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>

當然,這個類還是比較弱,對於自訂的控制項迴圈遍曆的方法還有待改進,XML檔案的儲存結構也需要更進一步的最佳化,修改Windows Forms的控制項時不能同步更新語言資源等等問題還需要解決。

原始碼和樣本程式下載

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.