1. 程式人生 > >C#的Winform多語言實現(XML檔案)

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個檔案。


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 版