using Tiger.Model; using SqlSugar; using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; using Rhea.Common; using System.Net; using System.Net.Http; using System.Reflection; using System.Linq; using Apache.NMS.ActiveMQ.Commands; using System.IO; using Newtonsoft.Json.Linq; using NetTaste; using System.Xml.Linq; using Tiger.IBusiness; using System.Data; using Tiger.Model.Entitys.MES.Position; namespace Tiger.Business { public partial class Biz { /// /// 多语言翻译,按BizSettings设置的默认语言(DefaultLanguage)翻译 /// /// /// /// public static string T(string key, params object?[] args) => new Locale(key, args).Default(); /// /// 多语言翻译,按传入的语言翻译,传入语言为空则按BizSettings设置的默认语言(DefaultLanguage)翻译 /// /// /// /// public static string T(Locale locale, string language) => language.IsNullOrEmpty() ? locale.Default() : locale[language]; /// /// 多语言对象(未翻译) /// /// /// /// public static Locale L(string key, params object?[] args) => new Locale(key, args); /// /// 国际化语言包 /// public class Language : ILanguage { private static string curLocale => BizConfig.DefaultLanguage; private static DataTable langDT; private static Dictionary> _dictionary = InitDictionary(); public static Dictionary> Dictionary => _dictionary; public Dictionary> GetDictionary() => InitDictionary(); /// /// 获取语言包字典 /// /// public static Dictionary> InitDictionary() { _dictionary = new(); try { #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().AS("Dictionary").ToDataTable(); foreach (DataRow row in langDT.Rows) { var key = row["Key"].ToString(); var dic = new Dictionary(); 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); } } #endregion return _dictionary; } catch (Exception ex) { Logger.Default.Fatal(ex, "获取语言包字典异常"); return new(); } } /// /// 获取字典词条 /// /// /// /// private static void GetDicItem(JToken root, string prefix) { if (root.Type == JTokenType.Object) { foreach (var property in root.Children()) { GetDicItem(property.Value, prefix); } } else if (root.Type == JTokenType.Array) { foreach (var item in root.Children()) { GetDicItem(item, prefix); } } else //if (root.Type == JTokenType.Property || root.Type == JTokenType.String || root.Type == JTokenType.Integer || root.Type == JTokenType.Float || root.Type == JTokenType.Boolean || root.Type == JTokenType.Date || root.Type == JTokenType.Bytes) { var prefixs = ($"{prefix}.{root.Path}").Split('.'); var key = string.Join(".", prefixs.SkipLast(1)); if (!_dictionary.ContainsKey(key)) { _dictionary.Add(key, new()); } var keyDic = _dictionary[key]; if (_dictionary.ContainsKey(prefixs.Last())) { keyDic[prefixs.Last()] = root.ToString(); } else { keyDic.Add(prefixs.Last(), root.ToString()); } } } /// /// 获取语言包 /// /// /// public string GetJson(string locale) { //return GetJsonFromResource(locale); return GetJsonFromDB(locale); } /// /// 获取语言包 /// /// /// public string GetJsonFromResource(string locale) { var result = new JObject(); 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) { var parent = lang.Replace($"{declaringType.Namespace}.{declaringType.Name}.", "").Replace($".json", "").Split(".", StringSplitOptions.RemoveEmptyEntries); var node = result; foreach (var item in parent) { if (node.ContainsKey(item)) { node = node[item] as JObject; } else { var itemNode = new JObject(); node.Add(item, itemNode); node = itemNode; } } using (StreamReader reader = new StreamReader(assembly.GetManifestResourceStream(lang), Encoding.UTF8)) { string langJson = reader.ReadToEnd(); if (!langJson.IsNullOrEmpty()) { JObject objs = SelectLocale(JObject.Parse(langJson), locale ?? ""); foreach (var obj in objs) { node.Add(obj.Key, obj.Value); } } } } return result.ToString(); } catch (Exception ex) { return ex.StackTraceMessage(); } } /// /// 获取本地语言包 /// /// /// 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().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(); 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(); } } /// /// 选择语言 /// /// /// /// private static JObject SelectLocale(JObject json, string locale) { var result = new JObject(); foreach (var obj in json) { if (obj.Value.HasValues && obj.Value.First().HasValues && !obj.Value.First().First().HasValues) { if((obj.Value as JObject).ContainsKey(locale)) { result.Add(obj.Key, obj.Value[locale].ToString()); } else { result.Add(obj.Key, obj.Value.First().First().ToString()); //result.Add(obj.Key, SelectLocale(obj.Value as JObject, locale)); } } else { if (obj.Value.Type == JTokenType.Object) { result.Add(obj.Key, SelectLocale(obj.Value as JObject, locale)); } else { result.Add(obj.Key, obj.Value?.ToString()); } } } return result; } } } }