WPF 通过XMl来设置窗体多语言功能

前戏就是要准备俩个或多个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;
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值