Language.cs 8.0 KB
using System;
using System.Xml;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Drawing;

namespace Asa.Face
{
    /// <summary>
    /// 多语言类
    /// </summary>
    public class Language
    {
        private XmlDocument _doc;
        private string[] _file;    //XML文件的路径
        private int _index = -1;
        private Dictionary<string, string> DialogText = new Dictionary<string, string>();
        private List<ClsLangForm> langForm = new List<ClsLangForm>();

        /// <summary>
        /// 多语言
        /// </summary>
        /// <param name="path"></param>
        public Language(string path)
        {
            if (!System.IO.Directory.Exists(path))
                System.IO.Directory.CreateDirectory(path);
            _file = System.IO.Directory.GetFiles(path, "*.xml");

            _doc = new XmlDocument();
            Name = new string[_file.Length];
            for (int i = 0; i < _file.Length; i++)
            {
                _doc.Load(_file[i]);
                Name[i] = _doc.LastChild.Attributes["Name"].Value;
            }
        }



        /// <summary>
        /// 语言名称
        /// </summary>
        public string[] Name { private set; get; }

        /// <summary>
        /// 语言索引
        /// </summary>
        public int Index
        {
            set
            {
                if (value > -1 && value < _file.Length)
                {
                    _index = value;
                    LoadLanguage();
                    foreach (Form frm in Application.OpenForms)
                    {
                        if (frm is SurForm)
                            SetLanguage((SurForm)frm);
                    }
                }
            }
            get
            {
                return _index;
            }
        }

        /// <summary>
        /// 加载语言
        /// </summary>
        /// <param name="name"></param>
        public void Load(string name)
        {
            int idx = Array.FindIndex(Name, s => s == name);
            Index = idx;
        }

        /// <summary>
        /// 对话框
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public string Dialog(string key)
        {
            if (_index == -1) return "";
            if (DialogText.TryGetValue(key, out string value))
                return value;
            else
                return "";
        }

        /// <summary>
        /// 创建窗口的文本
        /// </summary>
        /// <param name="frm"></param>
        public void CreateForm(SurForm frm)
        {
            if (_index == -1) return;
            _doc.Load(_file[_index]);
            XmlNode root = _doc.LastChild;
            XmlElement ele;
            XmlNode node = root.SelectSingleNode(frm.Name);
            if (node == null)
            {
                ele = _doc.CreateElement(frm.Name);
                root.AppendChild(ele);
            }
            else
            {
                node.RemoveAll();
                ele = (XmlElement)node;
            }

            ele.SetAttribute("Text", frm.Text);
            ele.SetAttribute("Font", ConvFont(frm.TitleFont));
            GetLang(ele, frm);

            _doc.Save(_file[_index]);
        }

        /// <summary>
        /// 设置语言
        /// </summary>
        /// <param name="frm"></param>
        public void SetLanguage(SurForm frm)
        {
            int langIdx = langForm.FindIndex(s => s.FormLang.Name == frm.Name);
            if (langIdx == -1) return;
            frm.Text = langForm[langIdx].FormLang.Text;
            frm.TitleFont = langForm[langIdx].FormLang.Font;
            SetLang(langIdx, frm);
        }






        private void LoadLanguage()
        {
            _doc.Load(_file[_index]);
            XmlNode root = _doc.LastChild;
            langForm.Clear();
            DialogText.Clear();

            foreach (XmlNode node in root.ChildNodes)
            {
                if (node.Name == "Dialog")
                {
                    foreach (XmlNode tt in node.ChildNodes)
                        DialogText.Add(tt.Name, tt.InnerText);
                }
                else
                {
                    ClsLangForm lang = new ClsLangForm();
                    lang.FormLang.Name = node.Name;
                    if (node.Attributes["Text"] != null) lang.FormLang.Text = node.Attributes["Text"].Value;
                    if (node.Attributes["Font"] != null) lang.FormLang.Font = ConvFont(node.Attributes["Font"].Value);
                    if (node.Attributes["Tag"] != null) lang.FormLang.Tag = node.Attributes["Tag"].Value;
                    foreach (XmlNode tt in node.ChildNodes)
                    {
                        ClsLangText ll = new ClsLangText();
                        ll.Name = tt.Name;
                        if (tt.Attributes["Text"] != null) ll.Text = tt.Attributes["Text"].Value;
                        if (tt.Attributes["Font"] != null) ll.Font = ConvFont(tt.Attributes["Font"].Value);
                        if (tt.Attributes["Tag"] != null) ll.Tag = tt.Attributes["Tag"].Value;
                        lang.ControlLang.Add(ll);
                    }
                    langForm.Add(lang);
                }
            }

        }

        private void SetLang(int langIndex, Control ctl)
        {
            foreach (Control cc in ctl.Controls)
            {
                if (cc.Name == "") continue;
                int idx = langForm[langIndex].ControlLang.FindIndex(s => s.Name == cc.Name);
                if (idx > -1)
                {
                    cc.Text = langForm[langIndex].ControlLang[idx].Text;
                    if (cc is SurPanel)
                        ((SurPanel)cc).TitleFont = langForm[langIndex].ControlLang[idx].Font;
                    else
                        cc.Font = langForm[langIndex].ControlLang[idx].Font;
                    cc.Tag = langForm[langIndex].ControlLang[idx].Tag;
                }
                if (cc.HasChildren)
                    SetLang(langIndex, cc);
            }

        }

        private void GetLang(XmlElement ele, Control ctl)
        {
            foreach (Control cc in ctl.Controls)
            {
                if (cc.Name == "") continue;
                XmlElement ele1 = _doc.CreateElement(cc.Name);
                ele1.SetAttribute("Text", cc.Text);
                ele1.SetAttribute("Font", ConvFont(cc.Font));
                ele.AppendChild(ele1);
                if (cc.HasChildren)
                    GetLang(ele, cc);
            }
        }

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

        /// <summary>
        /// 转换字体
        /// </summary>
        /// <param name="f">字体</param>
        /// <returns></returns>
        private string ConvFont(Font f)
        {
            string[] s = new string[4];
            s[0] = f.Name;
            s[1] = f.Size.ToString();
            if (f.Bold) s[2] = "B";
            if (f.Italic) s[3] = "I";
            return string.Join(",", s);
        }

        private class ClsLangForm
        {
            public ClsLangText FormLang;
            public List<ClsLangText> ControlLang;

            public ClsLangForm()
            {
                FormLang = new ClsLangText();
                ControlLang = new List<ClsLangText>();
            }
        }

        private class ClsLangText
        {
            public string Name = "";
            public string Text = "";
            public Font Font = null;
            public string Tag = "";
        }
    }
}