using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infrastructure; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static IRaCIS.Core.Application.Service.Common.SystemMonitor; namespace IRaCIS.Core.Application.Helper { public static class InternationalizationHelper { public static string JsonFileFolder = Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources); private static void VerifyFolder() { if (!Directory.Exists(JsonFileFolder) || !Directory.GetFiles(JsonFileFolder).Any(filePath => Path.GetExtension(filePath).Equals(".json", StringComparison.OrdinalIgnoreCase))) { throw new BusinessValidationFailedException("国际化Json文件目录有误"); } } public static async Task BatchAddJsonKeyValueAsync(List batchAddDtos) { VerifyFolder(); var usJsonPath = Path.Combine(JsonFileFolder, StaticData.En_US_Json); var cnJsonPath = Path.Combine(JsonFileFolder, StaticData.Zh_CN_Json); //更新json 文件 同时更新内存缓存的数据 foreach (var filePath in new string[] { usJsonPath, cnJsonPath }) { var json = await File.ReadAllTextAsync(filePath); JObject jsonObject = JObject.Parse(json, new JsonLoadSettings() { CommentHandling = CommentHandling.Load }); // 添加或更新指定的键值对 if (filePath.Contains(StaticData.En_US_Json)) { foreach (var item in batchAddDtos) { jsonObject[item.Code] = item.Value; StaticData.En_US_Dic[item.Code] = item.Value; } } else { foreach (var item in batchAddDtos) { jsonObject[item.Code] = item.Value; StaticData.Zh_CN_Dic[item.Code] = item.Value; } } await File.WriteAllTextAsync(filePath, jsonObject.ToString()); } } public static async Task AddOrUpdateJsonKeyValueAsync(string key, string value, string valueCN) { VerifyFolder(); var usJsonPath = Path.Combine(JsonFileFolder, StaticData.En_US_Json); var cnJsonPath = Path.Combine(JsonFileFolder, StaticData.Zh_CN_Json); //更新json 文件 同时更新内存缓存的数据 foreach (var filePath in new string[] { usJsonPath, cnJsonPath }) { var json = await File.ReadAllTextAsync(filePath); JObject jsonObject = JObject.Parse(json, new JsonLoadSettings() { CommentHandling = CommentHandling.Load }); // 添加或更新指定的键值对 if (filePath.Contains(StaticData.En_US_Json)) { jsonObject[key] = value; StaticData.En_US_Dic[key] = value; } else { jsonObject[key] = valueCN; StaticData.Zh_CN_Dic[key] = valueCN; } await File.WriteAllTextAsync(filePath, jsonObject.ToString()); } } public static async Task InitInternationlizationDataAndWatchJsonFileAsync(IRepository _repository) { //查询数据库的数据 var toJsonList = await _repository.Where(t => t.InternationalizationType == 1).Select(t => new { t.Code, t.Value, t.ValueCN }).ToListAsync(); //组织成json 文件 var usJsonPath = Path.Combine(JsonFileFolder, StaticData.En_US_Json); var cnJsonPath = Path.Combine(JsonFileFolder, StaticData.Zh_CN_Json); //本地静态文件国际化需要 foreach (var tojsonItem in toJsonList) { StaticData.En_US_Dic[tojsonItem.Code] = tojsonItem.Value; StaticData.Zh_CN_Dic[tojsonItem.Code] = tojsonItem.ValueCN; } File.WriteAllText(usJsonPath, JsonConvert.SerializeObject(StaticData.En_US_Dic)); File.WriteAllText(cnJsonPath, JsonConvert.SerializeObject(StaticData.Zh_CN_Dic)); //监测Json文件变更 实时刷新数据 WatchJsonFile(usJsonPath); WatchJsonFile(cnJsonPath); } public static void WatchJsonFile(string filePath) { if (!File.Exists(filePath)) { throw new BusinessValidationFailedException("国际化Json文件不存在"); } FileSystemWatcher watcher = new FileSystemWatcher(Path.GetDirectoryName(filePath), Path.GetFileName(filePath)); watcher.Changed += (sender, e) => LoadJsonFile(filePath); watcher.EnableRaisingEvents = true; } private static void LoadJsonFile(string filePath) { IConfigurationBuilder builder = new ConfigurationBuilder().AddJsonFile(filePath); IConfigurationRoot enConfiguration = builder.Build(); foreach (IConfigurationSection section in enConfiguration.GetChildren()) { if (filePath.Contains(StaticData.En_US_Json)) { StaticData.En_US_Dic[section.Key] = section.Value; } else { StaticData.Zh_CN_Dic[section.Key] = section.Value; } } } } }