NCsvResourceControl.cs 12.7 KB
using log4net;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.Layout;
using TSA_V.Common;

namespace TSA_V
{
    public class csvR : NCsvResourceControl
    {

    }
    public class NCsvResourceControl : BaseResourceControl
    {


        public NCsvResourceControl()
        {
            LoadData();
            var lngjson = JsonHelper.SerializeObject(LangMap);

            Task.Run(() =>
            {
                return;
                try
                {
                    Task.Delay(10 * 1000).Wait();
                    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);
                    //LanguageChangeEvent?.Invoke(null, EventArgs.Empty);

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

            //LoadData(true);
        }

        public static bool HasFile()
        {
            string file = Application.StartupPath + @"\languageResources\" + "resourcesAll.lngres";
            if (File.Exists(file))
            {
                return true;
            }
            return false;
        }
        private char spilt = '\t';
        private string rPath = Application.StartupPath + @"\languageResources\";
        private void LoadData(bool loadserverdir = false)
        {
            try
            {
                string loadpath = rPath;
                if (loadserverdir)
                    loadpath = Path.Combine(rPath, "server");
                Directory.CreateDirectory(loadpath);
                string[] lngresfiles = Directory.GetFiles(loadpath, "*.lngres");
                string csvFileName = "";
                foreach (var lngresfile in lngresfiles)
                {
                    var lngname = Path.GetFileNameWithoutExtension(lngresfile);
                    if (lngname.Equals("resourcesAll"))
                    {
                        csvFileName = lngresfile;
                    }
                }
                if (File.Exists(csvFileName))
                {
                    LoadCsvFile(csvFileName);
                }
                else
                {
                    foreach (var lngresfile in lngresfiles)
                    {

                        Dictionary<string, string> newLins = new Dictionary<string, string>();
                        List<string> keys = new List<string>();

                        Dictionary<string, string> lngMap;
                        var lngname = Path.GetFileNameWithoutExtension(lngresfile);
                        if (!LangMap.ContainsKey(lngname))
                        {
                            LangMap.Add(lngname, new Dictionary<string, string>());
                        }
                        lngMap = LangMap[lngname];
                        string[] lines = File.ReadAllLines(lngresfile);
                        foreach (string line in lines)
                        {
                            if (string.IsNullOrEmpty(line))
                                continue;

                            string nline = line.Replace("\t\t", spilt + "");
                            string[] array = nline.Split(spilt);
                            if (array.Length >= 4 && array[2] == "")
                            {
                                LogUtil.error("line=" + line);
                            }
                            if (array.Length >= 2)
                            {
                                string key = array[0].Trim();
                                if (key.Equals("Res.OutStringMoveInfo"))
                                {

                                }
                                string value = array[1];
                                if (array.Length >= 3)
                                {
                                    value = array[2];
                                }

                                if (lngMap.ContainsKey(key))
                                {
                                    lngMap[key] = value;
                                    newLins[key] = line;
                                }
                                else
                                {
                                    lngMap.Add(key, value);
                                    keys.Add(key);
                                    newLins.Add(key, line);
                                }
                            }
                        }
                        LOG.Info($"加载{lngresfile}完成,{lngname}共{lngMap.Count}条配置");
                    }
                }
                //try
                //{
                //    if (newLins.Count > 0)
                //    {

                //        string newFileName =  lngresfile+".back"+ DateTime.Now.ToString("yyMMddHHmmss");
                //        List<string> newlineStr = new List<string>();
                //        foreach (string key in keys)
                //        {
                //            newlineStr.Add(newLins[key]);
                //        }
                //        File.WriteAllLines(newFileName, newlineStr.ToArray());
                //    }
                //}
                //catch (Exception ex)
                //{
                //    LOG.Error("backfile error :" + ex.ToString());
                //}
            }


            catch (Exception ex)
            {
                LOG.Error(ex.ToString());
            }
        }
        private void LoadCsvFile(string csvFileName)
        {
            string[] lines = File.ReadAllLines(csvFileName);
            int index = -1;
            foreach (string line in lines)
            {
                index++;
                if (index == 0)
                {
                    continue;
                }
                if (string.IsNullOrEmpty(line))
                    continue;

                string nline = line.Replace("\t\t", spilt + "");
                string[] array = nline.Split(spilt);
                if (array.Length >= 4 && array[0] == "")
                {
                    LogUtil.error("line=" + line);
                    continue;
                }
                //顺序:key,中文,英文,法文
                if (array.Length >= 2)
                {
                    string key = array[0].Trim();
                    string chStr = array[1].Trim();
                    updateLanguageMap(ResourceCulture.China, key, chStr);
                    if (array.Length >= 3)
                    {
                        string enStr = array[2].Trim();
                        updateLanguageMap(ResourceCulture.English, key, enStr);
                    }
                    if (array.Length >= 4)
                    {
                        string frStr = array[3].Trim();
                        updateLanguageMap(ResourceCulture.Russian, key, frStr);
                    }
                }
            }
            LOG.Info($"加载{csvFileName}完成, 共{index}条配置");
        }
        private void updateLanguageMap(string language, string key, string value)
        {
            if (!LangMap.ContainsKey(language))
            {
                LangMap.Add(language, new Dictionary<string, string>());
            }
            LangMap[language][key] = value;
        }

        public override string GetString(string id, string defaultStr)
        {
            string strCurLanguage = defaultStr;
            var haslang = getLangRes(ResourceCulture.CurrLanguage);
            if (!haslang)
            {
                return strCurLanguage;
            }
            try
            {
                LangMap[ResourceCulture.CurrLanguage].TryGetValue(id, out strCurLanguage);

                if ((strCurLanguage == null || strCurLanguage.Equals("")) && (!defaultStr.Equals("")))
                {
                    strCurLanguage = defaultStr;
                    NoIdLog(id, defaultStr);
                }
                else if (strCurLanguage != null && (!strCurLanguage.Equals("")))
                {
                    //如果中文值和英文值和默认值都不一样,需要重新打印

                    if (!strCurLanguage.Equals(defaultStr) && LangMap.ContainsKey("zh-CN") && LangMap.ContainsKey("en-US"))
                    {

                        LangMap["zh-CN"].TryGetValue(id, out string zhStr);
                        if (zhStr != null && zhStr != "" && zhStr != defaultStr)
                        {
                            LangMap["en-US"].TryGetValue(id, out string enStr);
                            if (enStr != null && enStr == defaultStr)
                            {
                            }
                            else
                            {
                                ChangeLog(id, defaultStr);
                            }
                        }

                    }

                }
            }
            catch (Exception ex)
            {
                if (defaultStr.Equals(""))
                {
                }
                else
                {
                    strCurLanguage = "No id:[" + id + "], please add.";
                    strCurLanguage = defaultStr;
                    NoIdLog(id, defaultStr);
                }
            }
            if (strCurLanguage == null)
            {
                strCurLanguage = "";
            }
            return strCurLanguage;
        }
        public override string GetString(string id, string defaultStr, params object[] param)
        {
            string strCurLanguage = GetString(id, defaultStr);
            return String.Format(strCurLanguage, param);
        }
        static HashSet<string> hss = new HashSet<string>();
        protected override void NoIdLog(string id, string defaultStr)
        {

            getLangRes("zh-CN");
            if (!LangMap["zh-CN"].ContainsKey(id) && checkInterid(id) && !hss.Contains(id))
            {
                hss.Add(id);
                LOG.Info("" + id + "\t" + defaultStr);
            }

        }

        static HashSet<string> changeSss = new HashSet<string>();
        private static void ChangeLog(string id, string defaultStr)
        {
            //if (OpenResourceLog && !changeSss.Contains(id))
            //{
            //    changeSss.Add(id);
            //    LOG.Info("CHANGE:" + id + "\t" + defaultStr);
            //}
        }
        private static bool checkInterid(string id)
        {
            return true;
            string[] interstring = new string[] { "_txt", "_lbl" };
            var x = from a in interstring
                    where id.IndexOf(a) > -1
                    select a;
            return x.Count() == 0;
        }



        private bool getLangRes(string lang)
        {
            if (!LangMap.ContainsKey(lang))
            {
                string path = Application.StartupPath + @"\resources\" + lang + ".lngres";
                if (!File.Exists(path))
                {
                    return false;
                }
                string[] lines = File.ReadAllLines(path);
                var map = new Dictionary<string, string>();
                foreach (string line in lines)
                {
                    string[] array = line.Split('\t');
                    if (array.Length >= 3)
                    {
                        string key = array[0];
                        string chinese = array[1];
                        string english = array[2];
                        if (map.ContainsKey(key))
                        {
                            map.Remove(key);
                        }
                        map.Add(key, english);

                    }
                }
                LangMap.Add(lang, map);
                return true;
            }
            return true;

        } 
    }
}