using HMI.Core.Entity; using HMI.Core.Setting; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Windows; using System.Windows.Markup; namespace HMI.Core.Util { public class LangUtil { public static List langs = new List() { new LangInfo("zh-CN","中文"), new LangInfo("en-US","English") }; private static ResourceDictionary currentResource; private static Dictionary ResourceMap = new Dictionary(); private static Dictionary JsonMap = new Dictionary(); static LangUtil() { } private static string GetLang() { var lang = SystemSetting.Instance.CurrentLanguage; if (string.IsNullOrEmpty(lang)) lang = CultureInfo.CurrentUICulture.ToString(); return lang; } public static void LoadLang() { var lang = GetLang(); if (!ResourceMap.ContainsKey(lang)) return; var newLang = ResourceMap[lang]; if (currentResource == newLang) { return; } if (currentResource != null) { Application.Current.Resources.MergedDictionaries.Remove(currentResource); } currentResource = newLang; Application.Current.Resources.MergedDictionaries.Add(currentResource); } public static void Load() { try { /// 按Json加载 //LoadAllDataByJson(); /// 下面是按xaml加载 LoadAllDataByXaml(); LoadLang(); } finally { } } public static string Get(string key) { var lang = GetLang(); if (!JsonMap.ContainsKey(lang)) return key; if (!JsonMap[lang].ContainsKey(key)) return key; return JsonMap[lang][key].ToString(); } private static void LoadDataByJson(string lang) { string langFolder = PathHelper.LangFolder; string folder = Path.Combine(langFolder, lang); if (!Directory.Exists(folder)) { return; } string[] files = Directory.GetFiles(folder, "*.json", SearchOption.AllDirectories); foreach (var path in files) { try { using (FileStream stream = File.Open(path, FileMode.Open)) { using (StreamReader streamReader = new StreamReader(stream)) { JsonTextReader jsonTextReader = new JsonTextReader(streamReader); JObject jsonObject = (JObject)JToken.ReadFrom(jsonTextReader); if (!JsonMap.ContainsKey(lang)) { JsonMap[lang] = jsonObject; } else { foreach (var item in jsonObject) { JsonMap[lang][item.Key] = item.Value; } } } } } catch (Exception ex) { } } } private static void LoadXamlFromJson(string lang) { LoadDataByJson(lang); if (!JsonMap.ContainsKey(lang)) return; JObject json = JsonMap[lang]; var resource = new ResourceDictionary(); foreach (var item in json) { resource.Add(item.Key, item.Value.ToString()); } ResourceMap[lang] = resource; } private static void LoadDataByXaml(string lang) { string langFolder = PathHelper.LangFolder; string folder = Path.Combine(langFolder, lang); if (!Directory.Exists(folder)) { return; } string[] files = Directory.GetFiles(folder, "*.xaml", SearchOption.AllDirectories); foreach (var path in files) { try { using (FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read)) { var resource = (ResourceDictionary)XamlReader.Load(stream); if (!ResourceMap.ContainsKey(lang)) { ResourceMap[lang] = resource; } else { ResourceMap[lang].MergedDictionaries.Add(resource); } } } catch (Exception ex) { } } } private static void LoadAllDataByJson() { foreach (var lang in langs) { LoadDataByJson(lang.Code); } } private static void LoadAllDataByXaml() { foreach (var lang in langs) { LoadXamlFromJson(lang.Code); } } } public static class LangReader { public static string lang(this object dp, string key, params object[] datas) { return string.Format(LangUtil.Get(key), datas); } } }