Asa_Language.cs 6.9 KB
using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Xml;

namespace Asa
{
    /// <summary>
    /// 多国语言
    /// </summary>
    public class MultLang
    {
        private bool needSave;
        private XmlDocument xDoc;
        private XmlNode xRoot, xNode;
        private XmlNamespaceManager nsmgr;
        private List<string> file = new List<string>();
        private List<string> name = new List<string>();

        /// <summary>
        /// 多国语言
        /// </summary>
        public MultLang()
        {
            //新建文件夹
            if (!System.IO.Directory.Exists(Common.LANGUAGE_DIR))
                System.IO.Directory.CreateDirectory(Common.LANGUAGE_DIR);

            //获取所有文件
            xDoc = new XmlDocument();
            file.AddRange(System.IO.Directory.GetFiles(Common.LANGUAGE_DIR, "*.xml"));
            foreach (string s in file)
            {
                try
                {
                    xDoc.Load(s);
                    xRoot = xDoc.LastChild;
                    name.Add(((XmlElement)xRoot).GetAttribute("Name"));
                }
                catch (Exception ex)
                {
                    ErrInfo = ex.Message;
                }
            }

            Index = 0;
            if (file.Count == 0) Index = -1;
        }


        //====================属性====================
        /// <summary>
        /// 语言名称
        /// </summary>
        public string[] Name { get { return name.ToArray(); } }

        /// <summary>
        /// 语言总数
        /// </summary>
        public int Count { get { return file.Count; } }

        /// <summary>
        /// 错误信息
        /// </summary>
        public string ErrInfo { get; set; }

        /// <summary>
        /// 索引
        /// </summary>
        public int Index { get; set; }


        //====================公共方法====================
        /// <summary>
        /// 加载语言
        /// </summary>
        /// <param name="frm">窗口</param>
        public void SetLanguage(Form frm)
        {
            if (frm == null) return;
            Open();
            xNode = xRoot;
            if (xRoot == null) return;
            SetLang(frm);
            if (needSave) xDoc.Save(file[Index]);
            needSave = false;
        }

        /// <summary>
        /// 根据名称设置索引
        /// </summary>
        /// <param name="s"></param>
        public void SetIndex(string s)
        {
            int n = name.FindIndex(t => t == s);
            if (n > -1) Index = n;
        }

        /// <summary>
        /// 获取对话框的列表
        /// </summary>
        /// <param name="formName"></param>
        /// <returns></returns>
        public List<string[]> GetDialog(string formName)
        {
            Open();
            if (xRoot == null) return null;
            xNode = xRoot.SelectSingleNode(formName, nsmgr);
            if (xNode == null) return null;
            XmlNode curr = xNode.SelectSingleNode("Dialog", nsmgr);
            if (curr == null)
            {
                xNode.AppendChild(xDoc.CreateElement("Dialog"));
                curr = xNode.SelectSingleNode("Dialog", nsmgr);
                needSave = true;
            }

            XmlNodeList list = curr.ChildNodes;
            List<string[]> rtn = new List<string[]>();
            for (int i = 0; i < list.Count; i++)
            {
                string[] s = new string[2];
                s[0] = list[i].Name;
                s[1] = list[i].InnerText;
                rtn.Add(s);
            }

            if (needSave) xDoc.Save(file[Index]);
            needSave = false;
            return rtn;
        }


        //====================私有方法====================
        /// <summary>
        /// 打开文件
        /// </summary>
        private void Open()
        {
            if (Index < 0 || Index >= file.Count) return;
            xDoc.Load(file[Index]);
            xRoot = xDoc.LastChild;
            if (xRoot == null) return;
            XmlNodeList list = xRoot.SelectNodes("//*");
            nsmgr = new XmlNamespaceManager(xDoc.NameTable);
            foreach (XmlNode n in list)
            {
                if (n.Prefix.Length > 0)
                    nsmgr.AddNamespace(n.Prefix, n.NamespaceURI);
            }
        }

        /// <summary>
        /// 转换字体
        /// </summary>
        /// <param name="s">格式:字体,字号,粗体,斜体</param>
        /// <returns></returns>
        private System.Drawing.Font ConvFont(string s)
        {
            string[] t = s.Split(',');
            float emSize = Convert.ToSingle(t[1]);
            System.Drawing.FontStyle style = System.Drawing.FontStyle.Regular;
            if (t[2] == "B") style |= System.Drawing.FontStyle.Bold;
            if (t[3] == "I") style |= System.Drawing.FontStyle.Italic;
            System.Drawing.Font font = new System.Drawing.Font(t[0], emSize, style);
            return font;
        }

        /// <summary>
        /// 设置语言
        /// </summary>
        /// <param name="list"></param>
        private void SetLang(Control list)
        {
            bool bln;
            if (list.Name == "") return;
            XmlNode curr = xNode.SelectSingleNode(list.Name, nsmgr);
            if (curr == null)
            {
                xNode.AppendChild(xDoc.CreateElement(list.Name));
                curr = xNode.SelectSingleNode(list.Name, nsmgr);
                needSave = true;
            }
            else
            {
                bln = ((XmlElement)curr).HasAttribute("Text");
                if (bln) list.Text = ((XmlElement)curr).GetAttribute("Text");
            }

            foreach (Control ctl in list.Controls)
            {
                if (ctl.Controls.Count > 0)
                {
                    xNode = curr;
                    SetLang(ctl);
                }
                else
                {
                    if (ctl.Name == "") continue;
                    XmlNode temp = curr.SelectSingleNode(ctl.Name, nsmgr);
                    if (temp == null)
                    {
                        curr.AppendChild(xDoc.CreateElement(ctl.Name));
                        temp = curr.SelectSingleNode(ctl.Name, nsmgr);
                        needSave = true;
                    }
                    else
                    {
                        bln = ((XmlElement)temp).HasAttribute("Text");
                        if (bln) ctl.Text = ((XmlElement)temp).GetAttribute("Text");
                        bln = ((XmlElement)temp).HasAttribute("Tag");
                        if (bln) ctl.Tag = ((XmlElement)temp).GetAttribute("Tag");
                        bln = ((XmlElement)temp).HasAttribute("Font");
                        if (bln) list.Font = ConvFont(((XmlElement)temp).GetAttribute("Font"));
                    }
                }
            }
        }
    }
}