diff --git a/src/CloudGaming/Code/CloudGaming.Code/AppExtend/AppLanguage.cs b/src/CloudGaming/Code/CloudGaming.Code/AppExtend/AppLanguage.cs
new file mode 100644
index 0000000..c55ee0b
--- /dev/null
+++ b/src/CloudGaming/Code/CloudGaming.Code/AppExtend/AppLanguage.cs
@@ -0,0 +1,116 @@
+using Newtonsoft.Json;
+using Newtonsoft.Json.Serialization;
+
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CloudGaming.Code.AppExtend;
+///
+/// app多语言
+///
+public static class AppLanguage
+{
+ ///
+ /// 多语言管理
+ ///
+ public static ConcurrentDictionary>>> AppConfigLanguages { get; set; } = new ConcurrentDictionary>>>();
+
+ ///
+ /// 获取当前项目的多语言配置
+ ///
+ ///
+ ///
+ public static ConcurrentDictionary>> GetAppConfigLanguage(this AppConfig appConfig)
+ {
+ if (!AppConfigLanguages.TryGetValue(appConfig.Identifier, out var language))
+ {
+ language = new ConcurrentDictionary>>();
+ AppConfigLanguages.TryAdd(appConfig.Identifier, language);
+ }
+ return language;
+ }
+
+ ///
+ /// 获取当前接口的多语言配置
+ ///
+ ///
+ /// api地址
+ ///
+ public static ConcurrentDictionary> GetAppLanguage(this AppConfig appConfig, string language)
+ {
+ var dic = GetAppConfigLanguage(appConfig);
+
+ if (!dic.TryGetValue(language, out var languageDic))
+ {
+ languageDic = new ConcurrentDictionary>();
+ dic.TryAdd(language, languageDic);
+ }
+
+ return languageDic;
+ }
+
+ ///
+ /// 获取当前接口的多语言配置
+ ///
+ ///
+ /// api地址
+ ///
+ public static ConcurrentDictionary GetAppApiLanguage(this AppConfig appConfig, string language, string api)
+ {
+ var dic = GetAppLanguage(appConfig, language);
+
+ if (!dic.TryGetValue(api, out var languageDic))
+ {
+ languageDic = new ConcurrentDictionary();
+ dic.TryAdd(api, languageDic);
+ }
+
+ return languageDic;
+ }
+
+ ///
+ /// 加载多语言配置
+ ///
+ ///
+ ///
+ public static void InitAppLanguage(this AppConfig appConfig, string _language, string json)
+ {
+ if (AppConfigLanguages == null)
+ {
+ AppConfigLanguages = new ConcurrentDictionary>>>();
+ }
+ //获取当前项目的多语言配置
+ var appLanguage = AppConfigLanguages.GetOrAdd(appConfig.Identifier, (t) => new ConcurrentDictionary>>());
+ //初始化json数据
+ var cacheLanguage = JsonConvert.DeserializeObject>>(json);
+ //重新定义当前项目的多语言
+ var innerDict = new ConcurrentDictionary>();
+ foreach (var item in cacheLanguage)
+ {
+
+ var t = new ConcurrentDictionary(item.Value);
+ innerDict.TryAdd(item.Key, t);
+ }
+ appLanguage.AddOrUpdate(_language, (t) => innerDict, (t, o) => innerDict);
+ }
+
+ ///
+ /// 保存多语言配置
+ ///
+ ///
+ ///
+ public static string LanguageToJson(AppConfig appConfig)
+ {
+ var settings = new JsonSerializerSettings
+ {
+ ContractResolver = new CamelCasePropertyNamesContractResolver()
+ };
+ var appLanguage = GetAppConfigLanguage(appConfig);
+ var json = JsonConvert.SerializeObject(appLanguage, settings);
+ return json;
+ }
+}
diff --git a/src/CloudGaming/Code/CloudGaming.Code/AppExtend/AppService.cs b/src/CloudGaming/Code/CloudGaming.Code/AppExtend/AppService.cs
index 3b084fc..d462e33 100644
--- a/src/CloudGaming/Code/CloudGaming.Code/AppExtend/AppService.cs
+++ b/src/CloudGaming/Code/CloudGaming.Code/AppExtend/AppService.cs
@@ -28,6 +28,9 @@ public class AppService(IServiceProvider scopeFactory) : IHostedService
CloudGamingBase cloudGamingBase = new CloudGamingBase(scopedProvider);
//加载图片缓存
cloudGamingBase.Cache.AppImageCache.ReloadData();
+ //cloudGamingBase.RedisCache.StringGet("language");
+ //appConfig.InitAppLanguage();
+
}
return Task.CompletedTask;
}
diff --git a/src/CloudGaming/Code/CloudGaming.Code/Filter/CustomResultFilter.cs b/src/CloudGaming/Code/CloudGaming.Code/Filter/CustomResultFilter.cs
index aa61198..43b2689 100644
--- a/src/CloudGaming/Code/CloudGaming.Code/Filter/CustomResultFilter.cs
+++ b/src/CloudGaming/Code/CloudGaming.Code/Filter/CustomResultFilter.cs
@@ -88,15 +88,22 @@ public class CustomResultFilter : IResultFilter
}
}
}
- var dic = value.ToDictionaryOrList(apiPrefix, it => cloudGamingBase.Cache.AppImageCache[it]);
+ var language = _appConfig.GetAppLanguage(apiPrefix);
+ var dic = value.ToDictionaryOrList(false, apiPrefix, it => cloudGamingBase.Cache.AppImageCache[it], (value, prefix, isArray) =>
+ {
+ if (value.ContainsChineseOptimized())
+ {
+ //中文
+ var v = language.GetOrAdd(value, value);
+ if (!string.IsNullOrEmpty(v))
+ {
+ return v;
+ }
+ }
+ return value;
+ });
objectResult.Value = dic;
}
- //else
- //{
- // //value = objectResult.Value;
- //}
-
-
sw.Stop();
context.HttpContext.Response.Headers.TryAdd("X-Request-Duration-Filter", sw.Elapsed.TotalMilliseconds.ToString());
}
diff --git a/src/CloudGaming/Utile/HuanMeng.DotNetCore/Utility/ObjectExtensions.cs b/src/CloudGaming/Utile/HuanMeng.DotNetCore/Utility/ObjectExtensions.cs
index 83b139f..9b6a7c9 100644
--- a/src/CloudGaming/Utile/HuanMeng.DotNetCore/Utility/ObjectExtensions.cs
+++ b/src/CloudGaming/Utile/HuanMeng.DotNetCore/Utility/ObjectExtensions.cs
@@ -44,15 +44,15 @@ public static class ObjectExtensions
/// 要转换的对象。
/// 属性路径的可选前缀。
/// 对象的字典或列表表示形式。
- public static object ToDictionaryOrList(this object obj, string prefix = "", Func? imageFunc = null)
+ public static object ToDictionaryOrList(this object obj, bool isEnumerable, string prefix = "", Func? imageFunc = null, Func? languageFunc = null)
{
if (obj == null) return null;
return obj switch
{
_ when IsPrimitiveType(obj) => obj,
- IEnumerable enumerable => TransformCollection(enumerable, prefix, imageFunc),
- _ => TransformObject(obj, prefix, imageFunc)
+ IEnumerable enumerable => TransformCollection(enumerable, prefix, imageFunc, languageFunc),
+ _ => TransformObject(obj, isEnumerable, prefix, imageFunc, languageFunc)
};
}
@@ -62,13 +62,13 @@ public static class ObjectExtensions
/// 要转换的集合。
/// 集合中每个属性路径的前缀。
/// 转换后的项列表。
- private static List