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