前戏就是要准备俩个或多个xml,里面就是放置对应的语言如下:
英文的
<?xml version="1.0" encoding="utf-8" ?>
<en-US>
<Form>
<Name>FrmLogin</Name>
<Title>DATA MANAGEMENT SYSTEM OF BATTERY TESTER - LOGIN</Title>
<Controls>
<Control Name="btnLogin">LOGIN</Control>
<Control Name="pwBox">PLEASE ENTER YOUR PASSWORD TO ENTER THE SYSTEM</Control>
</Controls>
<TextInfo>
<Text Name="BatteryTester">BATTERY TESTER</Text>
<Text Name="OnlineMonitoring">ONLINE MONITORING</Text>
</TextInfo>
</Form>
</en-US>
中文的
<?xml version="1.0" encoding="utf-8" ?>
<zh-CN>
<Form>
<Name>FrmLogin</Name>
<Title>蓄电池测试仪数据管理系统 - 登录</Title>
<Controls>
<Control Name="btnLogin">登录</Control>
<Control Name="pwBox">请输入密码进入系统</Control>
</Controls>
<TextInfo>
<Text Name="BatteryTester">蓄电池测试仪</Text>
<Text Name="OnlineMonitoring">在线监测</Text>
</TextInfo>
</Form>
</zh-CN>
**
这些做好了之后,就可以在前台选择语言了,通过XmlDocument将选择的语音放置到字典集合中 Dictionary<string, string>
**
public void LoadCaptionLanguagesXml()
{
XmlDocument doc = new XmlDocument();
//通过选择的语音来找到对应的xml路径,将其保存到全局变量 GlobalProperty.GlobalProperty.root 中
string path = AppDomain.CurrentDomain.BaseDirectory + "Languages\\caption." + cbLanguage.SelectedValue.ToString() + ".xml";
if (File.Exists(path))
doc.Load(path);
else
return;
GlobalProperty.GlobalProperty.root = doc.DocumentElement;
}
那么问题就来了,一个程序有很多的窗体,像这样一遍一遍的读取很麻烦怎么办?这样的话我们可以通过XmlNodeList方法来读取对应的xml节点显示每个对应的窗体的语音如下。
public static string ReadXMLText(string frmName, string language, Grid MainGrid)
{
try
{
Dictionary<string, string> DicLang = new Dictionary<string, string>();
XmlElement root = GlobalProperty.GlobalProperty.root;
//读取对应的窗体 frmName 就是窗体的名称对应的就是xml中的FrmLogin
XmlNodeList nodeTitleList = root.SelectNodes("Form [Name='" + frmName + "']/Title");
DicLang.Add(frmName, nodeTitleList[0].InnerText);
//DicLang.Add(frmName, nodeTitleList[0].Attributes["Name"].Value);
XmlNodeList nodeList = root.SelectNodes("Form[Name='" + frmName + "']/Controls/Control");
foreach (XmlNode node in nodeList)
{
DicLang.Add(node.Attributes["Name"].Value, node.InnerText);
}
SetControlContent(MainGrid, DicLang);
return DicLang[frmName];
}
catch (Exception ex)
{
throw ex;
}
}
调用方法
this.Title = MultiLanguage.ReadXMLText("FrmLogin", cbLanguage.SelectedValue.ToString(), MainGrid);//根据选中语言给控件控件文本赋值
具体方法代码如下
using Panuon.UI.Silver;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Xml;
namespace UpperMachineSystem
{
public class MultiLanguage
{
public static Dictionary<string, string> DicLanguage = new Dictionary<string, string>();
//读取对应语言的xml文档
public static string ReadXMLText(string frmName, string language, Grid MainGrid)
{
try
{
Dictionary<string, string> DicLang = new Dictionary<string, string>();
XmlElement root = GlobalProperty.GlobalProperty.root;
XmlNodeList nodeTitleList = root.SelectNodes("Form [Name='" + frmName + "']/Title");
DicLang.Add(frmName, nodeTitleList[0].InnerText);
//DicLang.Add(frmName, nodeTitleList[0].Attributes["Name"].Value);
XmlNodeList nodeList = root.SelectNodes("Form[Name='" + frmName + "']/Controls/Control");
foreach (XmlNode node in nodeList)
{
DicLang.Add(node.Attributes["Name"].Value, node.InnerText);
}
SetControlContent(MainGrid, DicLang);
return DicLang[frmName];
}
catch (Exception ex)
{
throw ex;
}
}
public static Dictionary<string,string> GetReadXMLText(string frmName, string language)
{
try
{
Dictionary<string, string> DicLang = new Dictionary<string, string>();
XmlElement root = GlobalProperty.GlobalProperty.root;
XmlNodeList nodeTitleList = root.SelectNodes("Form [Name='" + frmName + "']/Title");
DicLang.Add(frmName, nodeTitleList[0].InnerText);
//DicLang.Add(frmName, nodeTitleList[0].Attributes["Name"].Value);
XmlNodeList nodeList = root.SelectNodes("Form[Name='" + frmName + "']/Controls/Control");
foreach (XmlNode node in nodeList)
{
DicLang.Add(node.Attributes["Name"].Value, node.InnerText);
}
return DicLang;
}
catch (Exception ex)
{
throw ex;
}
}
public static void SetControlContent(Grid MainGrid, Dictionary<string, string> DicLang)
{
foreach (System.Windows.UIElement element in MainGrid.Children)
{
if (element is Grid)
SetControlContent((Grid)element, DicLang);
else if (element is Button)
((Button)element).Content = DicLang.ContainsKey(((Button)element).Name) ? DicLang[((Button)element).Name] : ((Button)element).Content;
else if (element is PasswordBox)
PasswordBoxHelper.SetWatermark((PasswordBox)element, DicLang.ContainsKey(((PasswordBox)element).Name) ? DicLang[((PasswordBox)element).Name] : "");
else if (element is TabControl)
SetTabControlContent((TabControl)element, DicLang);
else if (element is DockPanel)
SetDockPanelContent((DockPanel)element, DicLang);
else if (element is StackPanel)
SetStackPanelContent((StackPanel)element, DicLang);
else if (element is TextBox)
TextBoxHelper.SetWatermark((TextBox)element, DicLang.ContainsKey(((TextBox)element).Name) ? DicLang[((TextBox)element).Name] : ((TextBox)element).Text);
else if (element is TextBlock)
((TextBlock)element).Text = DicLang.ContainsKey(((TextBlock)element).Name) ? DicLang[((TextBlock)element).Name] : ((TextBlock)element).Text;
else if (element is GroupBox)
((GroupBox)element).Header = DicLang.ContainsKey(((GroupBox)element).Name) ? DicLang[((GroupBox)element).Name] : ((GroupBox)element).Header;
else if(element is CheckBox)
((CheckBox)element).Content= DicLang.ContainsKey(((CheckBox)element).Name) ? DicLang[((CheckBox)element).Name] : ((CheckBox)element).Content;
}
}
private static void SetTabControlContent(TabControl tabControl, Dictionary<string, string> DicLang)
{
foreach (TabItem ti in tabControl.Items)
{
ti.Header = DicLang.ContainsKey(ti.Name) ? DicLang[ti.Name] : ti.Header;
}
}
private static void SetDockPanelContent(DockPanel dockPanel, Dictionary<string, string> DicLang)
{
foreach (System.Windows.UIElement element in dockPanel.Children)
{
if (element is Grid)
SetControlContent((Grid)element, DicLang);
else if (element is DockPanel)
SetDockPanelContent((DockPanel)element, DicLang);
if (element is Button)
((Button)element).Content = DicLang.ContainsKey(((Button)element).Name) ? DicLang[((Button)element).Name] : ((Button)element).Content;
else if (element is TabControl)
SetTabControlContent((TabControl)element, DicLang);
else if (element is TextBox)
TextBoxHelper.SetWatermark((TextBox)element, DicLang.ContainsKey(((TextBox)element).Name) ? DicLang[((TextBox)element).Name] : ((TextBox)element).Text);
else if (element is TextBlock)
((TextBlock)element).Text = DicLang.ContainsKey(((TextBlock)element).Name) ? DicLang[((TextBlock)element).Name] : ((TextBlock)element).Text;
}
}
public static void SetStackPanelContent(StackPanel stackPanel, Dictionary<string, string> DicLang)
{
foreach (System.Windows.UIElement element in stackPanel.Children)
{
if (element is Grid)
SetControlContent((Grid)element, DicLang);
else if (element is DockPanel)
SetDockPanelContent((DockPanel)element, DicLang);
if (element is Button)
((Button)element).Content = DicLang.ContainsKey(((Button)element).Name) ? DicLang[((Button)element).Name] : ((Button)element).Content;
else if (element is TabControl)
SetTabControlContent((TabControl)element, DicLang);
else if (element is TextBox)
TextBoxHelper.SetWatermark((TextBox)element, DicLang.ContainsKey(((TextBox)element).Name) ? DicLang[((TextBox)element).Name] : ((TextBox)element).Text);
else if (element is TextBlock)
((TextBlock)element).Text = DicLang.ContainsKey(((TextBlock)element).Name) ? DicLang[((TextBlock)element).Name] : ((TextBlock)element).Text;
else if (element is RadioButton)
((RadioButton)element).Content = DicLang.ContainsKey(((RadioButton)element).Name) ? DicLang[((RadioButton)element).Name] : ((RadioButton)element).Content;
else if (element is StackPanel)
SetStackPanelContent((StackPanel)element, DicLang);
else if (element is PasswordBox)
PasswordBoxHelper.SetWatermark((PasswordBox)element, DicLang.ContainsKey(((PasswordBox)element).Name) ? DicLang[((PasswordBox)element).Name] : "");
}
}
public static Dictionary<string, string> ReadXMLText(string frmName, string language)
{
try
{
Dictionary<string, string> DicLang = new Dictionary<string, string>();
XmlElement root = GlobalProperty.GlobalProperty.root;
XmlNodeList nodeTitleList = root.SelectNodes("Form [Name='" + frmName + "']/Title");
DicLang.Add(frmName, nodeTitleList[0].InnerText);
XmlNodeList nodeList = root.SelectNodes("Form[Name='" + frmName + "']/TextInfo/Text");
foreach (XmlNode node in nodeList)
{
DicLang.Add(node.Attributes["Name"].Value, node.InnerText);
}
return DicLang;
}
catch (Exception ex)
{
throw ex;
}
}
public static Dictionary<string, string> ReadXMLText(string language)
{
try
{
Dictionary<string, string> DicLang = new Dictionary<string, string>();
XmlDocument doc = new XmlDocument();
string path = AppDomain.CurrentDomain.BaseDirectory + "Languages\\message." + language + ".xml";
if (File.Exists(path))
doc.Load(path);
else
return null;
XmlElement root = doc.DocumentElement;
XmlNodeList nodeMessageList = root.SelectNodes("Messages[Name='MessageType']/MessageType");
foreach (XmlNode node in nodeMessageList)
{
DicLang.Add(node.Attributes["Name"].Value, node.InnerText);
}
nodeMessageList = root.SelectNodes("Messages[Name='Message']/Message");
foreach (XmlNode node in nodeMessageList)
{
DicLang.Add(node.Attributes["Name"].Value, node.InnerText);
}
return DicLang;
}
catch (Exception ex)
{
throw ex;
}
}
}
}