服务端的TigerApi 框架,基于.NET6 2024 版本
Rodney Chen
2024-05-31 fff3c95476203d3800a350c0b2ad73954f8e68ae
优化多语言逻辑
已修改4个文件
已添加1个文件
152 ■■■■■ 文件已修改
Tiger.Api/Language.db 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Api/Tiger.Api.csproj 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business/BizSettings.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business/Language/Biz.Language.cs 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.IBusiness/Core/ApiConfig.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Api/Language.db
Binary files differ
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>
Tiger.Business/BizSettings.json
@@ -79,7 +79,7 @@
    }
  },
  //默认语言
  "DefaultLanguage": "zh-CN",
  "DefaultLanguage": "zh-cn",
  //当前项目
  "CurrentProject": "MqBarcode",
  "JuDian": "XCSJ",
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>
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