热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

cwinform多语言xml实现方法,C#的Winform多語言實現(XML文件)

使用XML文件實現Winform多語言切換,本博文提供的代碼可以實現簡體中文、繁體中文、英文的切換。如果需要增加其它語言的切換,只需要編寫相應的語言的X

使用XML文件實現Winform多語言切換,本博文提供的代碼可以實現簡體中文、繁體中文、英文的切換。如果需要增加其它語言的切換,只需要編寫相應的語言的XML文件即可。 並且,當修改了語言之后,會更新所有打開的窗口。先貼幾張圖展示一下效果。

程序下載1:點擊打開鏈接

http://download.csdn.net/detail/softimite_zifeng/9731573

程序下載2(升級版):點擊打開鏈接

http://download.csdn.net/detail/softimite_zifeng/9731577

1. 簡體中文

a5e274e25a8193b25e75dafe297facde.png

2. 繁體中文

93866343db5c92d936fcded47533a6ec.png

3. 英文

49a51c430d9d8a36fcdf1d855476ec60.png

下面子豐介紹一下實現的過程:

1. 編寫相應語言的XML文件。子豐以英文為例,將同一個窗口中需要更改語言的控件,寫一個同一個

的中,如下面所示,為上面兩個窗口的XML文件(English.xml)。

LoginForm

PasswordForm

2. 編寫一個XML文件(DefaultLanguage.xml),用於保存當前設置的默認語言。當下次啟動程序時,會讀取該文件,從而將程序的語言設置為上次程序關閉時的語言。

ChineseSimplified

3. 如下圖所示,是3種語言的XML文件以及保存默認語言的XML文件。注:必須將這4個XML文件屬性中的“

復制到輸出目錄”設置為“

如果較新則復制”,否則,程序在運行過程中會找不到這4個文件。

0b63f1b5e8a55e41f26f4dfa742a9fdf.png

b9d77110e829453cc30d2de382af5980.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

462e00457621a3c4d4af247174689b91.png

292bcba22cb7c3cc8b85728f584c327e.png



推荐阅读
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
author-avatar
wocanimagebi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有