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.Api/Language.db | 0 Tiger.Api/Tiger.Api.csproj | 5 + Tiger.Business/BizSettings.json | 2 Tiger.IBusiness/Core/ApiConfig.cs | 3 Tiger.Business/Language/Biz.Language.cs | 142 ++++++++++++++++++++++++++++++++++++++++++++--- 5 files changed, 140 insertions(+), 12 deletions(-) diff --git a/Tiger.Api/Language.db b/Tiger.Api/Language.db new file mode 100644 index 0000000..dcb1c4b --- /dev/null +++ b/Tiger.Api/Language.db Binary files differ diff --git a/Tiger.Api/Tiger.Api.csproj b/Tiger.Api/Tiger.Api.csproj index ebd8e7b..2dc0c39 100644 --- a/Tiger.Api/Tiger.Api.csproj +++ b/Tiger.Api/Tiger.Api.csproj @@ -120,5 +120,10 @@ <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup> + <ItemGroup> + <None Update="Language.db"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + </ItemGroup> <ProjectExtensions><VisualStudio><UserProperties appsettings_1json__JsonSchema="" autofac_4template_1json__JsonSchema="https://json.schemastore.org/appsettings.json" autofac_4transaction_1json__JsonSchema="https://json.schemastore.org/appsettings.json" /></VisualStudio></ProjectExtensions> </Project> diff --git a/Tiger.Business/BizSettings.json b/Tiger.Business/BizSettings.json index 2b1fe95..e997ef3 100644 --- a/Tiger.Business/BizSettings.json +++ b/Tiger.Business/BizSettings.json @@ -79,7 +79,7 @@ } }, //榛樿璇█ - "DefaultLanguage": "zh-CN", + "DefaultLanguage": "zh-cn", //褰撳墠椤圭洰 "CurrentProject": "MqBarcode", "JuDian": "XCSJ", 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> diff --git a/Tiger.IBusiness/Core/ApiConfig.cs b/Tiger.IBusiness/Core/ApiConfig.cs index a586213..3e4d6d7 100644 --- a/Tiger.IBusiness/Core/ApiConfig.cs +++ b/Tiger.IBusiness/Core/ApiConfig.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Security.AccessControl; using System.Text; namespace Tiger.IBusiness @@ -179,7 +180,7 @@ { public static IConfiguration Configuration => RheaConfig.Configuration; public static string DB_ModelAssembly => RheaConfig.DB_ModelAssembly; - public static string DefaultLanguage => Configuration["DefaultLanguage"] ?? "en"; + public static string DefaultLanguage => Configuration?["DefaultLanguage"] ?? "en-us"; public static void InitConfig(IConfiguration _configuration, Dictionary<string, Dictionary<string, string>> language) { //Init Rhea -- Gitblit v1.9.3