From bdf63a2f86b00c8cf83f375477ddc463bcf226d6 Mon Sep 17 00:00:00 2001 From: zpc Date: Sun, 15 Dec 2024 00:53:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E8=AF=AD=E8=A8=80v1.01?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/AppController.cs | 12 +++++++++ .../CloudGaming.Code/AppExtend/AppLanguage.cs | 17 ++++++++++-- .../AppExtend/AppRequestConfig.cs | 4 +-- .../CloudGaming.Code/AppExtend/AppService.cs | 26 ++++++++++++++++++- .../AppExtend/CloudGamingBase.cs | 2 +- .../Cache/Special/GameEntityCache.cs | 9 ++++--- .../Filter/CustomResultFilter.cs | 10 +++++-- .../MiddlewareExtend/MemoryCacheMiddleware.cs | 2 +- .../MiddlewareExtend/RedisCacheMiddleware.cs | 2 +- .../Utility/ObjectExtensions.cs | 2 +- 10 files changed, 71 insertions(+), 15 deletions(-) diff --git a/src/CloudGaming/Api/CloudGaming.Api/Controllers/AppController.cs b/src/CloudGaming/Api/CloudGaming.Api/Controllers/AppController.cs index 9d20e81..44867c0 100644 --- a/src/CloudGaming/Api/CloudGaming.Api/Controllers/AppController.cs +++ b/src/CloudGaming/Api/CloudGaming.Api/Controllers/AppController.cs @@ -1,4 +1,5 @@ using CloudGaming.Api.Base; +using CloudGaming.Code.AppExtend; using CloudGaming.Code.Config; using CloudGaming.DtoModel; @@ -39,4 +40,15 @@ public class AppController : CloudGamingControllerBase return appConfig; } + /// + /// 保存多语言缓存 + /// + /// + [HttpGet] + public bool SaveLanguageCache() + { + CloudGamingBase cloudGamingBase = new CloudGamingBase(ServiceProvider); + AppLanguage.SaveLanguageCache(cloudGamingBase); + return true; + } } diff --git a/src/CloudGaming/Code/CloudGaming.Code/AppExtend/AppLanguage.cs b/src/CloudGaming/Code/CloudGaming.Code/AppExtend/AppLanguage.cs index c55ee0b..6576307 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/AppExtend/AppLanguage.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/AppExtend/AppLanguage.cs @@ -72,6 +72,8 @@ public static class AppLanguage return languageDic; } + + /// /// 加载多语言配置 /// @@ -103,14 +105,25 @@ public static class AppLanguage /// /// /// - public static string LanguageToJson(AppConfig appConfig) + public static string LanguageToJson(AppConfig appConfig, string language) { var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; - var appLanguage = GetAppConfigLanguage(appConfig); + var appLanguage = GetAppLanguage(appConfig, language); var json = JsonConvert.SerializeObject(appLanguage, settings); return json; } + + public static void SaveLanguageCache(CloudGamingBase cloudGamingBase) + { + var languages = cloudGamingBase.AppConfig.GetLanguages(); + foreach (var language in languages) + { + var json = LanguageToJson(cloudGamingBase.AppConfig, language); + cloudGamingBase.RedisCache.StringSet($"language:{language}", json); + + } + } } diff --git a/src/CloudGaming/Code/CloudGaming.Code/AppExtend/AppRequestConfig.cs b/src/CloudGaming/Code/CloudGaming.Code/AppExtend/AppRequestConfig.cs index 08f3b6a..425a394 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/AppExtend/AppRequestConfig.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/AppExtend/AppRequestConfig.cs @@ -11,7 +11,7 @@ namespace CloudGaming.Code.AppExtend /// /// app 请求信息 /// - public class AppRequestConfig(HttpRequest? httpRequest) + public class AppRequestConfig(HttpRequest? httpRequest, AppConfig appConfig) { private string channel { get; set; } /// @@ -106,7 +106,7 @@ namespace CloudGaming.Code.AppExtend { if (!(httpRequest?.Headers.TryGetValue("Language", out var _language) ?? false)) { - _language = "zh"; + _language = appConfig.DefaultLanguage ?? "zh"; } language = _language; } diff --git a/src/CloudGaming/Code/CloudGaming.Code/AppExtend/AppService.cs b/src/CloudGaming/Code/CloudGaming.Code/AppExtend/AppService.cs index d462e33..bcf8fbf 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/AppExtend/AppService.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/AppExtend/AppService.cs @@ -1,5 +1,7 @@ using CloudGaming.Code.Game; +using HuanMeng.DotNetCore.Redis; + using System; using System.Collections.Generic; using System.Linq; @@ -28,7 +30,7 @@ public class AppService(IServiceProvider scopeFactory) : IHostedService CloudGamingBase cloudGamingBase = new CloudGamingBase(scopedProvider); //加载图片缓存 cloudGamingBase.Cache.AppImageCache.ReloadData(); - //cloudGamingBase.RedisCache.StringGet("language"); + //cloudGamingBase.RedisCache.StringGet("languages"); //appConfig.InitAppLanguage(); } @@ -38,6 +40,28 @@ public class AppService(IServiceProvider scopeFactory) : IHostedService public Task StopAsync(CancellationToken cancellationToken) { + //var appConfigs = AppConfigurationExtend.AppConfigs.Where(it => it.Key != "default") + // .Select(it => it.Value) + // .ToList(); + + //// 为每个项目启动一个独立的任务 + //foreach (var appConfig in appConfigs) + //{ + // using var scope = scopeFactory.CreateScope(); + // var scopedProvider = scope.ServiceProvider; + // var app = scopedProvider.GetRequiredService(); + // appConfig.ToAppConfig(app); + // var languages = appConfig.GetLanguages(); + // CloudGamingBase cloudGamingBase = new CloudGamingBase(scopedProvider); + // ////加载图片缓存 + // //cloudGamingBase.Cache.AppImageCache.ReloadData(); + + // foreach (var language in languages) + // { + // var json = AppLanguage.LanguageToJson(appConfig, language); + // cloudGamingBase.RedisCache.StringSet($"languages:{language}", json); + // } + //} return Task.CompletedTask; } } diff --git a/src/CloudGaming/Code/CloudGaming.Code/AppExtend/CloudGamingBase.cs b/src/CloudGaming/Code/CloudGaming.Code/AppExtend/CloudGamingBase.cs index a9c22f3..83546fc 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/AppExtend/CloudGamingBase.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/AppExtend/CloudGamingBase.cs @@ -219,7 +219,7 @@ namespace CloudGaming.Code.AppExtend { if (appRequestInfo == null) { - appRequestInfo = new AppRequestConfig(HttpContextAccessor?.HttpContext?.Request); + appRequestInfo = new AppRequestConfig(HttpContextAccessor?.HttpContext?.Request, AppConfig); } return appRequestInfo; } diff --git a/src/CloudGaming/Code/CloudGaming.Code/Cache/Special/GameEntityCache.cs b/src/CloudGaming/Code/CloudGaming.Code/Cache/Special/GameEntityCache.cs index f207d42..979343c 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Cache/Special/GameEntityCache.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Cache/Special/GameEntityCache.cs @@ -26,14 +26,14 @@ namespace CloudGaming.Code.Cache.Special /// /// 游戏缓存表 /// - public class GameEntityCache(DAO dao, IDatabase database, IMapper mapper, AppConfig appConfig) : CommonDataEntityCache(GameEntityCache.GameEntityCacheLock, 60 * 60 * 24 * 7), ICacheClearLocalData + public class GameEntityCache(DAO dao, IDatabase database, IMapper mapper, AppConfig appConfig,string language) : CommonDataEntityCache(GameEntityCache.GameEntityCacheLock, 60 * 60 * 24 * 7), ICacheClearLocalData { public static object GameEntityCacheLock; - public override string key => $"{appConfig.Identifier}:game:gameInfo"; + public override string key => $"{appConfig.Identifier}:game:gameInfo:{language}"; - public string locaKey => $"lock:gameInfo"; - public string RedisKey => $"cache:game:gameInfo"; + public string locaKey => $"lock:gameInfo:{language}"; + public string RedisKey => $"cache:game:gameInfo:{language}"; public override List GetDataList() { @@ -65,6 +65,7 @@ namespace CloudGaming.Code.Cache.Special var game = gameListDict[gameCbt.GameId]; var gameInfo = mapper.Map(gameCbt); game.ToGameInfo(gameInfo); + //game.GameName gameInfo.GameType = GetGameExtendedAttributes(gameChildList, gameCbt.GameId, 1, gameTypesDict); gameInfo.GameTags = GetGameExtendedAttributes(gameChildList, gameCbt.GameId, 2, gameTagsDict); if (!gameUserShare.TryGetValue(gameCbt.GameId, out string NickName)) diff --git a/src/CloudGaming/Code/CloudGaming.Code/Filter/CustomResultFilter.cs b/src/CloudGaming/Code/CloudGaming.Code/Filter/CustomResultFilter.cs index 43b2689..8c1f16c 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Filter/CustomResultFilter.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Filter/CustomResultFilter.cs @@ -1,7 +1,11 @@ +using CloudGaming.Code.AppExtend; + using Newtonsoft.Json; +using static SKIT.FlurlHttpClient.Wechat.TenpayV3.Models.CreateApplyForSubMerchantApplymentRequest.Types.Business.Types.SaleScene.Types; + namespace CloudGaming.Code.Filter; @@ -44,6 +48,7 @@ public class CustomResultFilter : IResultFilter // 获取当前用户的信息 if (objectResult.Value != null) { + //GetAppApiLanguage var httpContext = context.HttpContext; var path = httpContext.Request.Path.Value ?? ""; var apiPrefix = path.Replace('/', '.').TrimStart('.'); @@ -88,13 +93,14 @@ public class CustomResultFilter : IResultFilter } } } - var language = _appConfig.GetAppLanguage(apiPrefix); + string c = cloudGamingBase.AppRequestInfo.Language; + var languageDic = _appConfig.GetAppApiLanguage(c, apiPrefix); var dic = value.ToDictionaryOrList(false, apiPrefix, it => cloudGamingBase.Cache.AppImageCache[it], (value, prefix, isArray) => { if (value.ContainsChineseOptimized()) { //中文 - var v = language.GetOrAdd(value, value); + var v = languageDic.GetOrAdd(prefix, value); if (!string.IsNullOrEmpty(v)) { return v; diff --git a/src/CloudGaming/Code/CloudGaming.Code/MiddlewareExtend/MemoryCacheMiddleware.cs b/src/CloudGaming/Code/CloudGaming.Code/MiddlewareExtend/MemoryCacheMiddleware.cs index 0cd044c..0a391b3 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/MiddlewareExtend/MemoryCacheMiddleware.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/MiddlewareExtend/MemoryCacheMiddleware.cs @@ -114,7 +114,7 @@ namespace CloudGaming.Code.MiddlewareExtend private string GenerateCacheKey(HttpRequest request, AppConfig appConfig) { - var appRequestInfo = new AppRequestConfig(request); + var appRequestInfo = new AppRequestConfig(request, appConfig); // 基于请求路径和查询参数生成缓存键 var cacheKey = $"{appConfig.Identifier}:{request.Path.Value.Replace('/', '.').TrimStart('.')}:{(string.IsNullOrEmpty(request.QueryString.Value) ? "default" : request.QueryString)}:{appRequestInfo.Key}"; return cacheKey; diff --git a/src/CloudGaming/Code/CloudGaming.Code/MiddlewareExtend/RedisCacheMiddleware.cs b/src/CloudGaming/Code/CloudGaming.Code/MiddlewareExtend/RedisCacheMiddleware.cs index 39987d5..89fe41c 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/MiddlewareExtend/RedisCacheMiddleware.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/MiddlewareExtend/RedisCacheMiddleware.cs @@ -104,7 +104,7 @@ namespace CloudGaming.Code.MiddlewareExtend private string GenerateCacheKey(HttpRequest request, AppConfig appConfig) { - var appRequestInfo = new AppRequestConfig(request); + var appRequestInfo = new AppRequestConfig(request, appConfig); var cacheKey = $"cache:api:{request.Path.Value.Replace('/', '.').TrimStart('.')}:{appRequestInfo.Key}:{(string.IsNullOrEmpty(request.QueryString.Value) ? "default" : request.QueryString)}"; return cacheKey; } diff --git a/src/CloudGaming/Utile/HuanMeng.DotNetCore/Utility/ObjectExtensions.cs b/src/CloudGaming/Utile/HuanMeng.DotNetCore/Utility/ObjectExtensions.cs index 9b6a7c9..653a880 100644 --- a/src/CloudGaming/Utile/HuanMeng.DotNetCore/Utility/ObjectExtensions.cs +++ b/src/CloudGaming/Utile/HuanMeng.DotNetCore/Utility/ObjectExtensions.cs @@ -107,7 +107,7 @@ public static class ObjectExtensions } if (!string.IsNullOrEmpty(stringValue) && languageFunc != null) { - stringValue = languageFunc?.Invoke(stringValue, propertyPath, false) ?? ""; + stringValue = languageFunc?.Invoke(stringValue, propertyPath, isEnumerable) ?? ""; } keyValuePairs[accessor.PropertyName] = stringValue; continue;