多语言开发
一、使用步骤
1.新建默认语言
点击主程序properties里面的setting,新建一条默认语言。
string language = Properties.Settings.Default.DefaultLanguage;
来获取到当前语言
2.建画面语言
这个项目只需要英语和中文。我就只建了2个xml。
注意这里的名字需要和你在setting里的值对应。
下面是xml的内容。
<?xml version="1.0" encoding="utf-8" ?>
<Softimite Language="简体中文">
<Form>
<!--登录界面-->
<Name>FrmLogin</Name>
<Controls>
<Control name="label3" text="账号"/>
<Control name="label2" text="语言"/>
<Control name="LoginBtn" text="登录"/>
<Control name="CancelBtn" text="取消"/>
</Controls>
</Form>
</Softimite>
图片是建的英文,代码块是中文。
对应的UI如图所示。
结构就是中间是你的窗体名称
里面放控件
里面写控件名称 text里面就写你需要显示在UI上的文字内容。
3.建多语言类
上面把基础工作完成后就开始新建一个多语言类。可以直接复制我下面的代码。
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
namespace ToolCabinet
{
public class MLanguage
{
// 修改默认语言
public static void SetDefaultLanguage(string lang)
{
ToolCabinet.Properties.Settings.Default.DefaultLanguage = lang;
ToolCabinet.Properties.Settings.Default.Save();
}
//从XML文件中读取需要修改Text的內容
private static Hashtable ReadXMLText(string frmName, string lang)
{
try
{
Hashtable hashResult = new Hashtable();
XmlReader reader = null;
string paths2 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, lang + ".xml");
if (!(new System.IO.FileInfo(paths2)).Exists)
{
return null;
}
else
{
reader = new XmlTextReader(paths2);
}
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;
}
}
// 加载语言
public static void LoadLanguage(Form form)
{
//获取当前默认语言
string language = ToolCabinet.Properties.Settings.Default.DefaultLanguage;
//根据用户选择的语言获得表的显示文字
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);
}
else if (control.GetType() == typeof(TableLayoutPanel)) //TabPage
{
GetSetSubControls(control.Controls, hashText);
}
else if (control.GetType() == typeof(MenuStrip)) //TabPage
{
GetSetSubControlss(control, 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);
}
else if (control.GetType() == typeof(DataGridView))
{
GetSetSubControlsGrid(control, hashText);
}
else if (control.GetType() == typeof(TableLayoutPanel)) //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);
}
}
private static void GetSetSubControlss(Control controls, Hashtable hashText)
{
try
{
MenuStrip ms = (MenuStrip)controls;
foreach (ToolStripMenuItem control in ms.Items)
{
if (control.DropDownItems.Count > 0)
{
foreach (ToolStripDropDownItem dropControl in control.DropDownItems)
{
if (hashText.Contains(dropControl.Name.ToLower()))
{
dropControl.Text = (string)hashText[dropControl.Name.ToLower()];
}
}
}
if (hashText.Contains(control.Name.ToLower()))
{
control.Text = (string)hashText[control.Name.ToLower()];
}
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
private static void GetSetSubControlsGrid(Control controls, Hashtable hashText)
{
try
{
DataGridView ms = (DataGridView)controls;
for (int z = 0; z < ms.Columns.Count; z++)
{
ms.Columns[z].HeaderText = (string)hashText[ms.Columns[z].Name.ToLower()];
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
}
4.使用多语言类
1.获取到当前语言
string language = Properties.Settings.Default.DefaultLanguage;
2.设置当前语言
MLanguage.LoadLanguage(this);
3.如果更改语言了需要更改完成后保存当前语言,这个根据你选择自行更改
MLanguage.SetDefaultLanguage("lang-US");
总结
以上就是个人对winform多语言的一个实现方法,如果大家有高恒好的方法可以互相交流。