使用XML文件實現Winform多語言切換,本博文提供的代碼可以實現簡體中文、繁體中文、英文的切換。如果需要增加其它語言的切換,只需要編寫相應的語言的XML文件即可。 並且,當修改了語言之后,會更新所有打開的窗口。先貼幾張圖展示一下效果。
程序下載1:點擊打開鏈接
http://download.csdn.net/detail/softimite_zifeng/9731573
程序下載2(升級版):點擊打開鏈接
http://download.csdn.net/detail/softimite_zifeng/9731577
1. 簡體中文
![a5e274e25a8193b25e75dafe297facde.png](https://img8.php1.cn/3cdc5/fefd/78c/a5d10ec3c1967094.png)
2. 繁體中文
![93866343db5c92d936fcded47533a6ec.png](https://img8.php1.cn/3cdc5/fefd/78c/38701f21c7e5f114.png)
3. 英文
![49a51c430d9d8a36fcdf1d855476ec60.png](https://img8.php1.cn/3cdc5/fefd/78c/e7d6e62095b3b14f.png)
下面子豐介紹一下實現的過程:
1. 編寫相應語言的XML文件。子豐以英文為例,將同一個窗口中需要更改語言的控件,寫一個同一個
的中,如下面所示,為上面兩個窗口的XML文件(English.xml)。
LoginForm
PasswordForm
2. 編寫一個XML文件(DefaultLanguage.xml),用於保存當前設置的默認語言。當下次啟動程序時,會讀取該文件,從而將程序的語言設置為上次程序關閉時的語言。
ChineseSimplified
3. 如下圖所示,是3種語言的XML文件以及保存默認語言的XML文件。注:必須將這4個XML文件屬性中的“
復制到輸出目錄”設置為“
如果較新則復制”,否則,程序在運行過程中會找不到這4個文件。
![0b63f1b5e8a55e41f26f4dfa742a9fdf.png](https://img8.php1.cn/3cdc5/fefd/78c/136e908197a35067.png)
![b9d77110e829453cc30d2de382af5980.png](https://img8.php1.cn/3cdc5/fefd/78c/105f4845d15800be.png)
4. 創建一個靜態類(MultiLanguage.cs)用於編寫與切換語言相關的變量和代碼。
(1)變量DefaultLanguage,用於保存當前默認語言
//當前默認語言
public static string DefaultLanguage = "ChineseSimplified";
(2)函數GetDefaultLanguage用於從DefaultLanguage.xml中讀取當前默認語言
///
/// 讀取當前默認語言
///
/// 當前默認語言
public static string GetDefaultLanguage()
{
string defaultLanguage = "ChineseSimplified";
XmlReader reader = new XmlTextReader("Languages/DefaultLanguage.xml");
XmlDocument doc = new XmlDocument();
doc.Load(reader);
XmlNode root = doc.DocumentElement;
//選取DefaultLangugae節點
XmlNode node = root.SelectSingleNode("DefaultLanguage");
if (node != null)
{
//取出節點中的內容
defaultLanguage = node.InnerText;
}
reader.Close();
reader.Dispose();
return defaultLanguage;
}
(3)函數SetDefaultLanguage修改當前默認語言
///
/// 修改默認語言
///
/// 待設置默認語言
public static void SetDefaultLanguage(string lang)
{
DataSet ds = new DataSet();
ds.ReadXml("Languages/DefaultLanguage.xml");
DataTable dt = ds.Tables["Softimite"];
dt.Rows[0]["DefaultLanguage"] = lang;
ds.AcceptChanges();
ds.WriteXml("Languages/DefaultLanguage.xml");
DefaultLanguage = lang;
}
(4)函數ReadXMLText用於從XML語言文件中讀取控件在該語言下的值
///
/// 從XML文件中讀取需要修改Text的內容
///
/// 窗口名,用於獲取對應窗口的那部分內容
/// 目標語言
///
private static Hashtable ReadXMLText(string frmName, string lang)
{
try
{
Hashtable hashResult = new Hashtable();
XmlReader reader = null;
//判斷是否存在該語言的配置文件
if (!(new System.IO.FileInfo("Languages/" + lang + ".xml")).Exists)
{
return null;
}
else
{
reader = new XmlTextReader("Languages/" + lang + ".xml");
}
XmlDocument doc = new XmlDocument();
doc.Load(reader);
XmlNode root = doc.DocumentElement;
//獲取XML文件中對應該窗口的內容
XmlNodeList nodeList = root.SelectNodes("Form[Name='" + frmName + "']/Controls/Control");
foreach (XmlNode node in nodeList)
{
try
{
//修改內容為控件的Text值
XmlNode node1 = node.SelectSingleNode("@name");
XmlNode node2 = node.SelectSingleNode("@text");
if (node1 != null)
{
hashResult.Add(node1.InnerText.ToLower(), node2.InnerText);
}
}
catch { }
}
reader.Close();
reader.Dispose();
return hashResult;
}
catch
{
return null;
}
}
(5)函數LoadLanguage用於加載語言或切換語言
///
/// 加載語言
///
/// 加載語言的窗口
public static void LoadLanguage(Form form)
{
//獲取當前默認語言
string language = GetDefaultLanguage();
//根據用戶選擇的語言獲得表的顯示文字
Hashtable hashText = ReadXMLText(form.Name, language);
if (hashText == null)
{
return;
}
//獲取當前窗口的所有控件
Control.ControlCollection sonControls = form.Controls;
try
{
//遍歷所有控件
foreach (Control control in sonControls)
{
if (control.GetType() == typeof(Panel)) //Panel
{
GetSetSubControls(control.Controls, hashText);
}
else if (control.GetType() == typeof(GroupBox)) //GroupBox
{
GetSetSubControls(control.Controls, hashText);
}
else if (control.GetType() == typeof(TabControl)) //TabControl
{
GetSetSubControls(control.Controls, hashText);
}
else if (control.GetType() == typeof(TabPage)) //TabPage
{
GetSetSubControls(control.Controls, hashText);
}
if (hashText.Contains(control.Name.ToLower()))
{
control.Text = (string)hashText[control.Name.ToLower()];
}
}
if (hashText.Contains(form.Name.ToLower()))
{
form.Text = (string)hashText[form.Name.ToLower()];
}
}
catch { }
}
///
/// 獲取並設置控件中的子控件
///
/// 父控件
/// 哈希表
private static void GetSetSubControls(Control.ControlCollection controls, Hashtable hashText)
{
try
{
foreach (Control control in controls)
{
if (control.GetType() == typeof(Panel)) //Panel
{
GetSetSubControls(control.Controls, hashText);
}
else if (control.GetType() == typeof(GroupBox)) //GroupBox
{
GetSetSubControls(control.Controls, hashText);
}
else if (control.GetType() == typeof(TabControl)) //TabControl
{
GetSetSubControls(control.Controls, hashText);
}
else if (control.GetType() == typeof(TabPage)) //TabPage
{
GetSetSubControls(control.Controls, hashText);
}
if (hashText.Contains(control.Name.ToLower()))
{
control.Text = (string)hashText[control.Name.ToLower()];
}
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
5. 在主窗口的Load事件中調用函數MultiLanguage.GetDefaultLanguage讀取DefaultLanguage.xml,並將ComboBox賦值為當前默認語言,即簡體中文、繁體中文或英文。
private void LoginForm_Load(object sender, EventArgs e)
{
//設置combobox的值
string language = MultiLanguage.GetDefaultLanguage();
if (language == "ChineseSimplified")
{
languageTxt.Text = "簡體中文(默認)";
}
else if (language == "Chinese")
{
languageTxt.Text = "繁體中文";
}
else if (language == "English")
{
languageTxt.Text = "English";
}
}
6. 在每個窗口的Load事件中調用函數MultiLanguage.LoadLanguage,使窗口在出現時即顯示為當前默認語言。
private void PasswordForm_Load(object sender, EventArgs e)
{
//加載語言
MultiLanguage.LoadLanguage(this);
}
7. 編寫用於切換語言的ComboBox的SelectedIndexChanged事件,使得當用於選擇對應的語言時,程序會切換到該語言。
//切換語言
private void languageTxt_SelectedIndexChanged(object sender, EventArgs e)
{
languageTxt.Enabled = false;
if (languageTxt.Text == "簡體中文(默認)")
{
//修改默認語言
MultiLanguage.SetDefaultLanguage("ChineseSimplified");
//對所有打開的窗口重新加載語言
foreach (Form form in Application.OpenForms)
{
MultiLanguage.LoadLanguage(form);
}
}
else if (languageTxt.Text == "繁體中文")
{
//修改默認語言
MultiLanguage.SetDefaultLanguage("Chinese");
//對所有打開的窗口重新加載語言
foreach (Form form in Application.OpenForms)
{
MultiLanguage.LoadLanguage(form);
}
}
else if (languageTxt.Text == "English")
{
//修改默認語言
MultiLanguage.SetDefaultLanguage("English");
//對所有打開的窗口重新加載語言
foreach (Form form in Application.OpenForms)
{
MultiLanguage.LoadLanguage(form);
}
}
languageTxt.Enabled = true;
}
8. 此外,子豐還對上述代碼進行了完善和改進。
(1) 使用配置文件App.config代替DefaultLanguage.xml文件保存當前默認語言
(2) 實現DataGridView控件的列頭的語言切換
(3) 對上述代碼可能出現的異常進行的處理和提示
程序下載(升級版):點擊打開鏈接
http://download.csdn.net/detail/softimite_zifeng/9731577
![ea83b1c4bf95d45f17db3ad97aed2f97.png](https://img8.php1.cn/3cdc5/fefd/78c/8bf58caea435abe8.png)
![462e00457621a3c4d4af247174689b91.png](https://img8.php1.cn/3cdc5/fefd/78c/091590ff7ce2ea6e.png)
![292bcba22cb7c3cc8b85728f584c327e.png](https://img8.php1.cn/3cdc5/fefd/78c/2df88c8dfc648a86.png)