ResourceCulture.cs 12.0 KB
using Newtonsoft.Json;
using OnlineStore.Common;
using OnlineStore.Common;
using OnlineStore.DeviceLibrary;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace OnlineStore
{

    public class ResourceCulture
    {
        public static bool ShowMsg = ConfigAppSettings.GetIntValue(Setting_Init.ShowLanguageMsg).Equals(1);
        public static string China = "zh-CN";
        public static string English = "en-US";
        public static string Japanese = "ja-JP";

        public static string CurrLanguage = "zh-CN";
        public static Dictionary<string, string> defaultMap = new Dictionary<string, string>();

        private static Dictionary<string, Dictionary<string, string>> ResourceMap = null;

        public static event EventHandler LanguageReload;

        public static void SetCurrentCulture(string name)
        {
            if (string.IsNullOrEmpty(name))
            {
                name = "zh-CN";
            }
            CurrLanguage = name;
            Thread.CurrentThread.CurrentCulture = new CultureInfo(name);

            if (ResourceMap == null)
            {
                ResourceControl.GetChinaStringEvent += GetChinaString;
                ResourceControl.GetEnglishStringEvent += GetEnglishString;
                ResourceControl.GetJapaneseStringEvent += GetJapaneseString;
                ResourceControl.GetStrEvent += GetString;
                ResourceControl.GetStringEvent += GetString;
                CSVResourceControl.GetStrEvent += GetString;
                CSVResourceControl.GetStringEvent += GetString;

                ResourceMap = new Dictionary<string, Dictionary<string, string>>();

                LoadData();
                LoadData(true);

                Task.Run(() => {
                    return;
                    try
                    {
                        Task.Delay(10 * 1000).Wait();
                        var lngjson = JsonHelper.SerializeObject(ResourceMap);
                        if (SMF.UploadLangJsonData(lngjson, out SmfResult smfResult))
                        {
                            LogUtil.info("语言资源上传成功");
                        }
                        else
                        {
                            LogUtil.info("语言资源上传失败");
                        }
                        var lngdatas = SMF.DownloadLngData();

                        foreach (var lngdata in lngdatas)
                        {
                            var datalines = lngdata.resourceMap.ToList().Select((kv) => { return kv.Key + "\t\t" + kv.Value; }).ToArray();
                            string lngfilename = "server\\" + lngdata.lanCode + ".lngres";
                            Directory.CreateDirectory(Path.Combine(rPath, "server"));
                            File.WriteAllLines(Path.Combine(rPath, lngfilename), datalines);
                        }
                        LoadData(true);
                        SetCurrentCulture(CurrLanguage);
                        LanguageReload?.Invoke(null, EventArgs.Empty);

                    }
                    catch (Exception e)
                    {
                        LogUtil.info("语言资源处理出错:" + e.ToString());
                    }
                });
            }
        }

        private static char spilt = '\t';
        private static string rPath = Application.StartupPath + @"\resources\";
        private static void LoadData(bool loadserverdir = false)
        {
            string loadpath = rPath;
            if (loadserverdir)
                loadpath = Path.Combine(rPath, "server");
            Directory.CreateDirectory(loadpath);
            string[] lngresfiles = Directory.GetFiles(loadpath, "*.lngres");
            foreach (var lngresfile in lngresfiles)
            {
                Dictionary<string, string> lngMap;
                var lngname = Path.GetFileNameWithoutExtension(lngresfile);
                if (!ResourceMap.ContainsKey(lngname))
                {
                    ResourceMap.Add(lngname, new Dictionary<string, string>());
                }
                lngMap = ResourceMap[lngname];
                string[] lines = File.ReadAllLines(lngresfile);
                foreach (string line in lines)
                {
                    if (string.IsNullOrEmpty(line))
                        continue;

                    string[] array = line.Split(spilt);
                    if (array.Length >= 3)
                    {
                        string key = array[0].Trim();
                        string value = array[2];
                        if (lngMap.ContainsKey(key))
                            lngMap[key] = value;
                        else
                            lngMap.Add(key, value);

                    }
                }
            }
        }
        static Dictionary<string, string> LangName = new Dictionary<string, string>() {
            {"zh-CN","简体中文" },
            {"zh-TW","繁體中文" },
            { "en-US", "English" },
            { "ja-JP", "日本語" },
            { "fr-FR", "Français" },
            { "de-DE", "Deutsche" },
        };

        public static Dictionary<string, string> GetLangList()
        {
            Dictionary<string, string> LangList = new Dictionary<string, string>();
            foreach (var v in LangName)
            {
                if (ResourceMap.ContainsKey(v.Key))
                {
                    if (!LangList.ContainsKey(v.Key))
                        LangList.Add(v.Key, v.Value);
                }
            }
            return LangList;
        }


        public static string GetChinaString(string id, params object[] param)
        {
            string strCurLanguage = gets(China, id);
            return String.Format(strCurLanguage, param); 
        }
        public static string GetEnglishString(string id, params object[] param)
        { 
            string strCurLanguage = gets(English, id);
            return String.Format(strCurLanguage, param); 
        }
        public static string GetJapaneseString(string id, params object[] param)
        { 
            string strCurLanguage = gets(Japanese, id);
            return String.Format(strCurLanguage, param); 
        }
        private static string gets(string language,string  id,string defaultStr="")
        {
            if (String.IsNullOrEmpty(defaultStr))
            {
                defaultStr = id;
            }
            try
            {
                if (ResourceMap != null)
                {
                    if (!ResourceMap.ContainsKey(language))
                    {
                        if (ShowMsg)
                        {
                            LogUtil.debug ("No Language  Resources:[" + id + "], please add");
                        }
                        return defaultStr;
                    }
                    else
                    {
                        if (ResourceMap[language].ContainsKey(id.Trim()))
                        {
                            return  ResourceMap[language][id];
                        }
                        else
                        {
                            NoIdLog(id, defaultStr);
                        }
                    }
                } 
            }
            catch (Exception ex)
            {
                NoIdLog(id, defaultStr);
            }return defaultStr;
        }
        public static string GetString(string id, string defaultStr="")
        {
            string strCurLanguage = defaultStr;
            if (string.IsNullOrEmpty(defaultStr))
            {
                defaultStr = id;
            }
            try
            {
                if (ResourceMap != null)
                {
                    if (!ResourceMap.ContainsKey(CurrLanguage))
                    {
                        if (ShowMsg)
                        {
                            LogUtil.debug("No Language  Resources:[" + id + "], please add");
                        }
                        return defaultStr;
                    }
                    else
                    {
                        if (ResourceMap[CurrLanguage].ContainsKey(id.Trim()))
                        {
                            strCurLanguage = ResourceMap[CurrLanguage][id];
                        }
                        else
                        {
                            NoIdLog(id, defaultStr);
                        }
                    }
                }
                return strCurLanguage;
            }
            catch (Exception ex)
            {
                NoIdLog(id, defaultStr);
            }
            return strCurLanguage;
        }
        public static string GetString(string id, string defaultStr, params object[] param)
        {
            string strCurLanguage = GetString(id, defaultStr);
            return String.Format(strCurLanguage, param);
        }

        private static void NoIdLog(string id, string defaultStr)
        {
            Console.WriteLine("No id:[" + id + "], please add,use default string :" + defaultStr);
            if (defaultStr.Trim().Equals(""))
            {
                return;
            }
          //  if (ShowMsg)
            {
                LogUtil.debug("No id:[" + id + "], please add,use default string :" + defaultStr);
            }
            if (!defaultMap.ContainsKey(id))
            {
                defaultMap.Add(id, defaultStr);
            }
        }
        public static void LogDefaultMap()
        {
            if (ShowMsg)
            {
                LogUtil.info("开始打印缺少的文字配置" + defaultMap.Count);
                LogUtil.RLog("开始打印缺少的文字配置" + defaultMap.Count);
                foreach (string key in defaultMap.Keys)
                {
                    string value = defaultMap[key];
                    LogUtil.info("" + key + spilt + value +spilt +"");
                    LogUtil.RLog("" + key + spilt + value.Replace(spilt,'&') + spilt+"");

                }
                LogUtil.info("结束打印缺少的文字配置");
            }
        }
        private static string spiltStr = "_";
        private static string Text = "Text";
        public static string GetIdStr(string className, string controlName, string propertyName)
        {
            return className + spiltStr + controlName + spiltStr + propertyName;
        }
        public static string GetIdStr(string className, string propertyName)
        {
            return className + spiltStr + propertyName;
        }
        public static string GetTextIdStr(string className, string controlName)
        {
            return className + spiltStr + controlName + spiltStr + Text;
        }
        public static string GetTextIdStr(string className)
        {
            return className + spiltStr + Text;
        }
        public static string GetValue(string value, params object[] param)
        {
            return GetString(value, value, param);
        }
    }

    public class MyMessage
    {
        public static DialogResult Show(string msg, params object[] param)
        {
            string showMsg = ResourceCulture.GetString(msg, msg, param);

            string showTitle = ResourceCulture.GetString("提示");
            return MessageBox.Show( showMsg,showTitle);
        }
        public static DialogResult Show(string msg, string title, MessageBoxButtons but, params object[] param)
        {
            string showMsg = ResourceCulture.GetString(msg, msg, param);
            string showTitle = ResourceCulture.GetString(title, title);
            return MessageBox.Show(showMsg, showTitle, but);
        }
        public static DialogResult ShowIcon(string msg, string title, MessageBoxButtons but, MessageBoxIcon icon, params object[] param)
        {
            string showMsg = ResourceCulture.GetString(msg, msg, param);
            string showTitle = ResourceCulture.GetString(title, title);
            return MessageBox.Show(showMsg, showTitle, but, icon);
        }
    }
}