From fff3c95476203d3800a350c0b2ad73954f8e68ae Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期五, 31 五月 2024 16:56:11 +0800
Subject: [PATCH] 优化多语言逻辑

---
 Tiger.Business/Language/Biz.Language.cs |  142 ++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 132 insertions(+), 10 deletions(-)

diff --git a/Tiger.Business/Language/Biz.Language.cs b/Tiger.Business/Language/Biz.Language.cs
index 9fe3765..1e17b51 100644
--- a/Tiger.Business/Language/Biz.Language.cs
+++ b/Tiger.Business/Language/Biz.Language.cs
@@ -16,6 +16,7 @@
 using NetTaste;
 using System.Xml.Linq;
 using Tiger.IBusiness;
+using System.Data;
 
 namespace Tiger.Business
 {
@@ -40,6 +41,8 @@
         /// </summary>
         public class Language : ILanguage
         {
+            private static string curLocale => BizConfig.DefaultLanguage;
+            private static DataTable langDT;
             private static Dictionary<string, Dictionary<string, string>> _dictionary = InitDictionary();
             public static Dictionary<string, Dictionary<string, string>> Dictionary => _dictionary;
             public Dictionary<string, Dictionary<string, string>> GetDictionary() => InitDictionary();
@@ -52,22 +55,51 @@
                 _dictionary = new();
                 try
                 {
-                    var assembly = Assembly.GetExecutingAssembly();
-                    var declaringType = MethodBase.GetCurrentMethod().DeclaringType;
-                    var resource = assembly.GetManifestResourceNames().ToList();
-                    var langs = resource.Where(q => q.StartsWith($"{declaringType.Namespace}.{declaringType.Name}")).OrderBy(q => q).ToList();
-                    foreach (var lang in langs)
+                    #region From Resource
+                    //var assembly = Assembly.GetExecutingAssembly();
+                    //var declaringType = MethodBase.GetCurrentMethod().DeclaringType;
+                    //var resource = assembly.GetManifestResourceNames().ToList();
+                    //var langs = resource.Where(q => q.StartsWith($"{declaringType.Namespace}.{declaringType.Name}")).OrderBy(q => q).ToList();
+                    //foreach (var lang in langs)
+                    //{
+                    //    var prefix = lang.Replace($"{declaringType.Namespace}.{declaringType.Name}.", "").Replace($".json", "");
+                    //    using (StreamReader reader = new StreamReader(assembly.GetManifestResourceStream(lang), Encoding.UTF8))
+                    //    {
+                    //        string langJson = reader.ReadToEnd();
+                    //        if (!langJson.IsNullOrEmpty())
+                    //        {
+                    //        	GetDicItem(JObject.Parse(langJson), prefix);
+                    //        }
+                    //    }
+                    //}
+                    #endregion
+
+                    #region From DB
+                    var langFile = new FileInfo(@$"{AppDomain.CurrentDomain.BaseDirectory}Language.db");
+                    var db = new Database() { Name = langFile.Name, Type = SqlSugar.DbType.Sqlite, ConnectionString = @$"DataSource={langFile.FullName}" }.Client;
+                    
+                    langDT = db.Queryable<dynamic>().AS("Dictionary").ToDataTable();
+                    foreach (DataRow row in langDT.Rows)
                     {
-                        var prefix = lang.Replace($"{declaringType.Namespace}.{declaringType.Name}.", "").Replace($".json", "");
-                        using (StreamReader reader = new StreamReader(assembly.GetManifestResourceStream(lang), Encoding.UTF8))
+                        var key = row["Key"].ToString();
+                        var dic = new Dictionary<string, string>();
+                        foreach (DataColumn col in langDT.Columns)
                         {
-                            string langJson = reader.ReadToEnd();
-                            if (!langJson.IsNullOrEmpty())
+                            if (col.ColumnName.StartsWith("L@"))
                             {
-                            	GetDicItem(JObject.Parse(langJson), prefix);
+                                dic.Add(col.ColumnName.Replace("L@", ""), row[col].ToString());
                             }
                         }
+                        if (_dictionary.ContainsKey(key))
+                        {
+                            _dictionary[key] = dic;
+                        }
+                        else
+                        {
+                            _dictionary.Add(key, dic);
+                        }
                     }
+                    #endregion
                     return _dictionary;
                 }
                 catch (Exception ex)
@@ -118,12 +150,24 @@
                     }
                 }
             }
+
             /// <summary>
             /// 鑾峰彇璇█鍖�
             /// </summary>
             /// <param name="locale"></param>
             /// <returns></returns>
             public string GetJson(string locale)
+            {
+                //return GetJsonFromResource(locale);
+                return GetJsonFromDB(locale);
+            }
+
+            /// <summary>
+            /// 鑾峰彇璇█鍖�
+            /// </summary>
+            /// <param name="locale"></param>
+            /// <returns></returns>
+            public string GetJsonFromResource(string locale)
             {
                 var result = new JObject();
                 try
@@ -171,6 +215,84 @@
             }
 
             /// <summary>
+            /// 鑾峰彇鏈湴璇█鍖�
+            /// </summary>
+            /// <param name="locale"></param>
+            /// <returns></returns>
+            public static string GetJsonFromDB(string locale)
+            {
+                try
+                {
+                    //浠庢湰鍦拌幏鍙栬瑷�鍖�
+                    var result = new JObject();
+                    var langFile = new FileInfo(@$"{AppDomain.CurrentDomain.BaseDirectory}Language.db");
+                    if (!Biz.DataSource.Exists(langFile.Name))
+                    {
+                        Biz.DataSource.Add(new Database()
+                        {
+                            Name = langFile.Name,
+                            Type = SqlSugar.DbType.Sqlite,
+                            ConnectionString = @$"DataSource={langFile.FullName}",
+                        });
+                    }
+                    var db = Biz.DataSource[langFile.Name].Client;
+                    langDT = db.Queryable<dynamic>().AS("Dictionary").ToDataTable();
+                    foreach (DataRow row in langDT.Rows)
+                    {
+                        var key = row["Key"].ToString();
+                        if (key == "routes.demo.editor.editor")
+                        {
+                            ;
+                        }
+                        var parent = key.Split(".", StringSplitOptions.RemoveEmptyEntries);
+                        var node = result;
+                        var dic = new Dictionary<string, string>();
+                        foreach (DataColumn col in langDT.Columns)
+                        {
+                            if (col.ColumnName.StartsWith("L@"))
+                            {
+                                dic.Add(col.ColumnName.Replace("L@", ""), row[col].ToString());
+                            }
+                        }
+                        if (_dictionary.ContainsKey(key))
+                        {
+                            _dictionary[key] = dic;
+                        }
+                        else
+                        {
+                            _dictionary.Add(key, dic);
+                        }
+                        for (int i = 0; i < parent.Length; i++)
+                        {
+                            if (node.ContainsKey(parent[i]))
+                            {
+                                node = node[parent[i]] as JObject;
+                            }
+                            else
+                            {
+                                if (i + 1 == parent.Length)
+                                {
+                                    var value = dic.ContainsKey(locale) ? dic[locale] : dic.First().Value;
+                                    node.Add(parent[i], value.ToString());
+                                }
+                                else
+                                {
+                                    var itemNode = new JObject();
+                                    node.Add(parent[i], itemNode);
+                                    node = itemNode;
+                                }
+                            }
+                        }
+                    }
+                    return result.ToString();
+                }
+                catch (Exception ex)
+                {
+                    return ex.StackTraceMessage();
+                }
+            }
+
+            /// <summary>
             /// 閫夋嫨璇█
             /// </summary>
             /// <param name="json"></param>

--
Gitblit v1.9.3