C#的Winform多語言實現(XML檔案)
使用XML檔案實現Winform多語言切換,本博文提供的程式碼可以實現簡體中文、繁體中文、英文的切換。如果需要增加其它語言的切換,只需要編寫相應的語言的XML檔案即可。 並且,當修改了語言之後,會更新所有開啟的視窗。先貼幾張圖展示一下效果。
http://download.csdn.net/detail/softimite_zifeng/9731573
程式下載2(升級版):點選開啟連結
http://download.csdn.net/detail/softimite_zifeng/9731577
1. 簡體中文
2. 繁體中文
3. 英文
下面子豐介紹一下實現的過程:
1. 編寫相應語言的XML檔案。子豐以英文為例,將同一個視窗中需要更改語言的控制元件,寫一個同一個<Form></Form>的<Controls></Controls>中,如下面所示,為上面兩個視窗的XML檔案(English.xml)。
<?xml version="1.0" encoding="utf-8" ?> <Softimite Language="簡體中文"> <Form> <!--登入介面--> <Name>LoginForm</Name> <Controls> <Control name="LoginForm" text="Login"/> <Control name="accountLab" text="Account"/> <Control name="passwordLab" text="Password"/> <Control name="languageLab" text="Language"/> <Control name="loginBtn" text="Login"/> <Control name="passwordBtn" text="Modify pwd"/> </Controls> </Form> <Form> <!--修改密碼介面--> <Name>PasswordForm</Name> <Controls> <Control name="PasswordForm" text="Modify Password"/> <Control name="accountLab" text="Account"/> <Control name="passwordLab" text="Old password"/> <Control name="newpasswordLab" text="New password"/> <Control name="modifyBtn" text="Modify"/> </Controls> </Form> </Softimite>
2. 編寫一個XML檔案(DefaultLanguage.xml),用於儲存當前設定的預設語言。當下次啟動程式時,會讀取該檔案,從而將程式的語言設定為上次程式關閉時的語言。
<?xml version="1.0" encoding="utf-8" ?>
<Softimite Language="預設語言">
<DefaultLanguage>ChineseSimplified</DefaultLanguage>
</Softimite>
3. 如下圖所示,是3種語言的XML檔案以及儲存預設語言的XML檔案。注:必須將這4個XML檔案屬性中的“複製到輸出目錄4. 建立一個靜態類(MultiLanguage.cs)用於編寫與切換語言相關的變數和程式碼。
(1)變數DefaultLanguage,用於儲存當前預設語言
//當前預設語言
public static string DefaultLanguage = "ChineseSimplified";
(2)函式GetDefaultLanguage用於從DefaultLanguage.xml中讀取當前預設語言
/// <summary>
/// 讀取當前預設語言
/// </summary>
/// <returns>當前預設語言</returns>
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修改當前預設語言
/// <summary>
/// 修改預設語言
/// </summary>
/// <param name="lang">待設定預設語言</param>
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語言檔案中讀取控制元件在該語言下的值
/// <summary>
/// 從XML檔案中讀取需要修改Text的內容
/// </summary>
/// <param name="frmName">視窗名,用於獲取對應視窗的那部分內容</param>
/// <param name="lang">目標語言</param>
/// <returns></returns>
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用於載入語言或切換語言
/// <summary>
/// 載入語言
/// </summary>
/// <param name="form">載入語言的視窗</param>
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 { }
}
/// <summary>
/// 獲取並設定控制元件中的子控制元件
/// </summary>
/// <param name="controls">父控制元件</param>
/// <param name="hashResult">雜湊表</param>
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
相關推薦
C#的Winform多語言實現(XML檔案)
使用XML檔案實現Winform多語言切換,本博文提供的程式碼可以實現簡體中文、繁體中文、英文的切換。如果需要增加其它語言的切換,只需要編寫相應的語言的XML檔案即可。 並且,當修改了語言之後,會更新所有開啟的視窗。先貼幾張圖展示一下效果。 http://d
C#的Winform多語言實現(resx檔案)
使用resx檔案實現Winform多語言切換,本博文提供的程式碼可以實現簡體中文、繁體中文、英文的切換。如果需要增加其它語言的切換,只需要編寫相應的語言的resx檔案即可。 並且,當修改了語言之後,會更新所有開啟的視窗。先貼幾張圖展示一下效果。 程式下載連線:ht
C#的Winform多語言實現(API翻譯)
呼叫百度翻譯API實現Winform多語言切換,本博文提供的程式碼可以實現簡體中文、繁體中文、英文的切換。如果需要增加其它語言的切換,只需要呼叫API將其翻譯為想要的語言 即可。 並且,當修改了語言之後,會更新所有開啟的視窗。 呼叫API翻譯可以
QT in VS 多語言實現(中英文切換)
最近專案需要軟體具有中英文雙語切換功能,而QT又自帶此功能,現將實現方式記錄下來。 說到中英文切換,少不了要了解QT的內部編碼方式。在此就不詳述QT編碼方式了,具體可參考 徹底弄懂Qt的編碼。只需要記住QT採用utf-8編碼!window作業系統採用ansi編
C# WinForm中如何自定義config檔案(XML檔案),並且讀取和儲存它
我這裡以連結資料庫為例子, 其中書寫的Config的xml檔案如下: <?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings> <add k
Spring的IoC和DI的實現(XML檔案配置)
一.簡介 IoC和DI好處 Spring的依賴注入和控制反轉的功能是Spring很重要的一部分,通過這兩個功能可以對系統進行解耦,也不需要瑣碎的控制被依賴物件的宣告週期; 實現步驟 IoC和DI的核心是通過Spring容器來管理bean,控制bean的宣告週期,並提供給依賴
模擬退火演算法與C語言實現(TSP問題)
1簡介: 模擬退火來自冶金學的專有名詞退火。退火是將材料加熱後再經特定速率冷卻,目的是增大晶粒的體積,並且減少晶格中的缺陷。材料中的原子原來會停留在使內能有區域性最小值的位置,加熱使能量變大,原子會離開原來位置,而隨機在其他位置中移動。退火冷卻時速度較慢,使得原子有較多可能
Prim演算法的C語言實現(鄰接矩陣)
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h> #define MAX 100
漢諾塔C語言實現(純程式碼)
(本篇只為記錄程式碼,不加註解)a、b、c三座塔,將n個從小到大(自上而下)的圓盤從a移動到c,移動期間小圓盤必須在大圓盤上面,問移動步驟。#include<stdio.h> int main() { void hanoi(int n,char one
QT in VS 多語言實現(中英文切換,每個步驟都有截圖,只有UTF8才能讓Qt語言家正確讀取。先qApp->removeTranslator,然後installTranslator,每個類都要寫上槽函數RetranslateUI)
har hang 刷新 編碼方式 enum utf 工具 orm 中英文切換 最近項目需要軟件具有中英文雙語切換功能,而QT又自帶此功能,現將實現方式記錄下來。 說到中英文切換,少不了要了解QT的內部編碼方式。在此就不詳述QT編碼方式了,具體可參考 徹底弄懂Qt的編碼。只需
C#WInform 從DataTable中匯出XML檔案
private bool ExportXML(string filepath) { bool flag = true; try
VUE實現Studio管理後臺(三):支援多語言國際化(vue-i18n)
RXEditor的第一版本是英文版,有些朋友看起來覺得不習慣,後來因為惰性,不願意再修改舊程式碼加入中文版,這次提前就把這個問題解決了,克服惰性最好的方式,就是想到就儘快去做,避免拖延。 本來計劃在介面的右上角,做一個下拉選單選擇語言。下拉選單的工作量稍稍有些大,並且很少有隨時切換介面語言的需求。最終確定獲取
20 字元裝置驅動相關的函式和引數及實現(虛擬檔案)
字元裝置驅動相關的函式和引數及實現(虛擬檔案) 使用者程序呼叫函式順序: open ---> kernel ---> cdev.ops->open(..) read ---> kernel ---> cdev.ops->read(
【vue 進階指南 一】多語言國際化(中英文切換)
vue + element-ui + vue-i18n 多語言國際化 1.element-ui 並不支援最新版的vue-i8n 外掛,開發時注意i18n的版本,當然本示例成功解決版本不相容的問題,詳細說明請看element官方文件:http://eleme
RadioGroup裡RadioButton顯示多行實現(非常簡單)
RadioGroup顯示多行實現步驟 RadioGroup裡面包裹的RadioButton的特性是單選和互斥,該種需求在專案中用到的比較多。 RadioButton實現多行顯示的話就失去了本來的特性。 網上多數是自定義來處理這種需求,來實現單選和互斥。
用c++實現 c++順序表的實現(採用模板)
函式實現資料的插入(頭插&&尾插)、刪除(頭刪&&尾刪)、查詢、按位置插入、按位置刪除、順序表求長、順序表清除、順序表摧毀、資料的逆置以及資料排序 main函式 #include"SeqList.h"//順序表 void main() {
【Mac】資料夾多語言設定(漢化)
當我們使用Mac中文語言的時候,使用終端Terminal看到的資料夾列表和直接在Finder裡面看到的不一樣。經常我們使用一箇中文的資料夾在終端cd選擇的時候切換輸入法會感覺比較噁心。 但是系統預設的幾個資料夾“桌面”,“下載”等在終端看到的卻是英文的 “De
死磕Spring之IoC篇 - BeanDefinition 的載入階段(XML 檔案)
> 該系列文章是本人在學習 Spring 的過程中總結下來的,裡面涉及到相關原始碼,可能對讀者不太友好,請結合我的原始碼註釋 [Spring 原始碼分析 GitHub 地址](https://github.com/liu844869663/spring-framework) 進行閱讀 > > Spring 版
死磕Spring之IoC篇 - BeanDefinition 的解析階段(XML 檔案)
> 該系列文章是本人在學習 Spring 的過程中總結下來的,裡面涉及到相關原始碼,可能對讀者不太友好,請結合我的原始碼註釋 [Spring 原始碼分析 GitHub 地址](https://github.com/liu844869663/spring-framework) 進行閱讀 > > Spring 版
死磕Spring之IoC篇 - 解析自定義標籤(XML 檔案)
> 該系列文章是本人在學習 Spring 的過程中總結下來的,裡面涉及到相關原始碼,可能對讀者不太友好,請結合我的原始碼註釋 [Spring 原始碼分析 GitHub 地址](https://github.com/liu844869663/spring-framework) 進行閱讀 > > Spring 版