Language.cs 9.5 KB
using System;
using System.Xml;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Drawing;
using System.Diagnostics;
using System.Text.RegularExpressions;
using System.IO;
using System.Data.SqlTypes;
using System.Resources;
using System.Runtime.Remoting.Metadata.W3cXsd2001;
using System.Xml.Linq;

namespace Asa.FaceControl
{
    /// <summary>
    /// 多语言类
    /// </summary>
    public static class Language
    {
        private static XmlDocument xmlDoc;
        private static string filePath;    //XML文件的路径
        private static int nameIndex = -1;
        //private static readonly Dictionary<string,Dictionary<string, string>> dialogText = new();
        private static readonly Dictionary<string, Dictionary<string, ClsLangText>> langForm = new();

        /// <summary>
        /// 语言名称
        /// </summary>
        public static List<string> Name { private set; get; } = new();
        public static string CurrentLng { private set; get; } = "zh-CN";



        /// <summary>
        /// 加载语言路径
        /// </summary>
        /// <param name="path"></param>
        public static void LoadPath(string path)
        {
            filePath = path;
            var files = System.IO.Directory.GetFiles(path, "*.lngres");

            foreach (var file in files)
            {
                var lngid = Path.GetFileNameWithoutExtension(file);
                if (lngid.ToLower() == "en-US".ToLower())
                {
                    Name.Add("English");
                }
                else if (lngid.ToLower() == "zh-CN".ToLower())
                {
                    Name.Add("简体中文");
                }                                

                langForm.Add(lngid, new Dictionary<string, ClsLangText>());
                var lngfs = File.ReadAllLines(file);
                foreach (var lts in lngfs)
                {
                    var lds = lts.Split('\t');
                    if (lds.Length < 3)
                        continue;
                    var key = lds[0];
                    var value = lds[2];
                    var fnt = lds.Length > 3 ? lds[3] : "";

                    ClsLangText clsLangText = new ClsLangText();
                    clsLangText.Font = ConvFont(fnt);
                    clsLangText.Name = key;
                    clsLangText.Text = value;
                    if (!langForm[lngid].ContainsKey(key))
                        langForm[lngid].Add(key, clsLangText);
                }
            }
            LoadLanguage("zh-CN");
        }

        /// <summary>
        /// 加载语言
        /// </summary>
        /// <param name="name"></param>
        public static void LoadLanguage(string name)
        {
            switch (name)
            {
                case "简体中文":
                    CurrentLng = "zh-CN";
                    break;
                case "English":
                    CurrentLng = "en-US";
                    break;
                default:
                    CurrentLng = "zh-CN";
                    break;
            }
        }

        /// <summary>
        /// 对话框
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string Dialog(string key,string defaulttxt="")
        {
            if (!langForm.ContainsKey(CurrentLng)) return "";
            var dk = "Dialog_" + key;
            if (langForm[CurrentLng].TryGetValue(dk, out var value))
                return value.Text;
            else
            {
                SetNoLangXML("Dialog", key, defaulttxt);
                return defaulttxt;
            }
        }

        /// <summary>
        /// 设置语言
        /// </summary>
        /// <param name="frm"></param>
        public static void SetLanguage(FormBase frm)
        {
            if (!langForm.ContainsKey(CurrentLng) || !langForm[CurrentLng].ContainsKey(frm.Name + "_" + frm.Name))
                return;
            frm.Text = langForm[CurrentLng][frm.Name+"_"+ frm.Name].Text;
            frm.TitleFont = langForm[CurrentLng][frm.Name + "_" + frm.Name].Font;
            SetLang(frm.Name, frm);
        }

        /// <summary>
        /// 设置语言
        /// </summary>
        /// <param name="ctl"></param>
        public static void SetLanguage(Control ctl)
        {
            SetLang(ctl.Name, ctl);
        }

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

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





        ///// <summary>
        ///// 设置语言
        ///// </summary>
        ///// <param name="frm"></param>
        //public static void SetLanguage(Form 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 static void SetLang(string frmname, Control ctl)
        {
            if (!langForm.ContainsKey(CurrentLng))
                return;

            foreach (Control cc in ctl.Controls)
            {
                if (cc.Name == "") continue;
                var fn = frmname+"_"+cc.Name;
                var idx = langForm[CurrentLng].ContainsKey(fn);
                if (idx)
                {
                    //Debugger.Break();
                    cc.Text = langForm[CurrentLng][fn].Text;
                    if (cc is FacePanel)
                        ((FacePanel)cc).TitleFont = langForm[CurrentLng][fn].Font;
                    else
                        cc.Font = langForm[CurrentLng][fn].Font;
                    //cc.Tag = langForm[langIndex].ControlLang[idx].Tag;
                }
                else {
                    if (!string.IsNullOrWhiteSpace(cc.Text) && HasChinese(cc.Text))
                    {
                        if (cc.Tag == null || cc.Tag.ToString() != "not")
                        {
                            SetNoLangXML(frmname, cc.Name, cc.Text);
                        }
                    }
                }
                if (cc.HasChildren)
                    SetLang(frmname,cc);
            }
        }
        static void SetNoLangXML(string formname, string controlname, string text)
        {
            string att = "";
            if (formname == "Dialog")
                att = $"{formname}_{controlname}\t{text}\t\t\r\n";
            else
            {
                if (CurrentLng == "简体中文")
                    att = $"{formname}_{controlname}\t{text}\t\t微软雅黑,12,,\r\n";
                else
                    att = $"{formname}_{controlname}\t{text}\t\tArial,12,,\r\n";
            }
            File.AppendAllText(Path.Combine(filePath, CurrentLng + ".lngres"), att);
        }
        static bool HasChinese(string txt)
        {

            //for (int i = 0; i < txt.Length; i++)
            //{
            if (Regex.IsMatch(txt.ToString(), @"[\u4E00-\u9FA5]+"))
                return true;
            //}
            return false;
        }
        /// <summary>
        /// 转换字体
        /// </summary>
        /// <param name="s">格式:字体,字号,粗体,斜体</param>
        /// <returns></returns>
        private static Font ConvFont(string s)
        {
            if (string.IsNullOrWhiteSpace(s))
                return null;
            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(t[0], emSize, style);
            return font;
        }

        ///// <summary>
        ///// 转换字体
        ///// </summary>
        ///// <param name="f">字体</param>
        ///// <returns></returns>
        //private static string ConvFont(Font f)
        //{
        //    if (f == null)
        //        return "";
        //    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 static string Tag = "";
        }
    }
}