From bae5ed0f297dbe1a02aac24cc7a6b00e1d9ff41b Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Sat, 2 Jul 2022 10:16:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8A=A8=E6=80=81=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E5=8C=96=E4=B8=80=E6=AC=A1=E6=80=A7=E6=9F=A5=E8=AF=A2,?= =?UTF-8?q?=E6=8F=90=E9=AB=98=E5=90=AF=E5=8A=A8=E9=80=9F=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dynamic/DefaultLocalizationStore.cs | 9 ++++- .../DynamicLocalizationInitializeService.cs | 13 ++++--- .../Dynamic/ILocalizationStore.cs | 6 +++ .../LocalizationManagement/ITextRepository.cs | 2 +- .../LocalizationStore.cs | 39 +++++++++++++++++-- .../EfCoreTextRepository.cs | 13 +++++-- 6 files changed, 67 insertions(+), 15 deletions(-) diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DefaultLocalizationStore.cs b/aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DefaultLocalizationStore.cs index 718764c60..4480ca467 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DefaultLocalizationStore.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DefaultLocalizationStore.cs @@ -10,8 +10,13 @@ namespace LINGYUN.Abp.Localization.Dynamic { public DefaultLocalizationStore() { - } - + } + + public Task>> GetAllLocalizationDictionaryAsync(CancellationToken cancellationToken = default) + { + return Task.FromResult(new Dictionary>()); + } + public Task> GetLanguageListAsync(CancellationToken cancellationToken = default) { return Task.FromResult(new List()); diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DynamicLocalizationInitializeService.cs b/aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DynamicLocalizationInitializeService.cs index 23413032c..5744c2f49 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DynamicLocalizationInitializeService.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DynamicLocalizationInitializeService.cs @@ -23,21 +23,22 @@ namespace LINGYUN.Abp.Localization.Dynamic LocalizationOptions = localizationOptions.Value; } - protected override async Task ExecuteAsync(CancellationToken stoppingToken) + protected async override Task ExecuteAsync(CancellationToken stoppingToken) { try { + var resourceTexts = await Store.GetAllLocalizationDictionaryAsync(stoppingToken); + foreach (var resource in LocalizationOptions.Resources) { foreach (var contributor in resource.Value.Contributors) { if (contributor.GetType().IsAssignableFrom(typeof(DynamicLocalizationResourceContributor))) { - var resourceLocalizationDic = await Store - .GetLocalizationDictionaryAsync( - resource.Value.ResourceName, - stoppingToken); - DynamicOptions.AddOrUpdate(resource.Value.ResourceName, resourceLocalizationDic); + if (resourceTexts.TryGetValue(resource.Value.ResourceName, out var resourceLocalizationDic)) + { + DynamicOptions.AddOrUpdate(resource.Value.ResourceName, resourceLocalizationDic); + } } } } diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/ILocalizationStore.cs b/aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/ILocalizationStore.cs index 09c6c5b21..0c98f3946 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/ILocalizationStore.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/ILocalizationStore.cs @@ -32,5 +32,11 @@ namespace LINGYUN.Abp.Localization.Dynamic Task> GetLocalizationDictionaryAsync( string resourceName, CancellationToken cancellationToken = default); + /// + /// 获取所有资源本地化字典 + /// + /// + /// + Task>> GetAllLocalizationDictionaryAsync(CancellationToken cancellationToken = default); } } diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/ITextRepository.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/ITextRepository.cs index 6d53b3900..e8ca1fd97 100644 --- a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/ITextRepository.cs +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/ITextRepository.cs @@ -15,7 +15,7 @@ namespace LINGYUN.Abp.LocalizationManagement ); Task> GetListAsync( - string resourceName, + string resourceName = null, CancellationToken cancellationToken = default); Task> GetListAsync( diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LocalizationStore.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LocalizationStore.cs index 1402d77f6..8f7e0dce6 100644 --- a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LocalizationStore.cs +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LocalizationStore.cs @@ -31,7 +31,7 @@ namespace LINGYUN.Abp.LocalizationManagement ResourceRepository = resourceRepository; } - public virtual async Task> GetLanguageListAsync( + public async virtual Task> GetLanguageListAsync( CancellationToken cancellationToken = default) { var languages = await LanguageRepository.GetActivedListAsync(cancellationToken); @@ -41,7 +41,7 @@ namespace LINGYUN.Abp.LocalizationManagement .ToList(); } - public virtual async Task> GetLocalizationDictionaryAsync( + public async virtual Task> GetLocalizationDictionaryAsync( string resourceName, CancellationToken cancellationToken = default) { @@ -78,7 +78,40 @@ namespace LINGYUN.Abp.LocalizationManagement return dictionaries; } - public virtual async Task ResourceExistsAsync(string resourceName, CancellationToken cancellationToken = default) + public async virtual Task>> GetAllLocalizationDictionaryAsync(CancellationToken cancellationToken = default) + { + var result = new Dictionary>(); + var textList = await TextRepository.GetListAsync(resourceName: null, cancellationToken: cancellationToken); + + foreach (var resourcesGroup in textList.GroupBy(x => x.ResourceName)) + { + var dictionaries = new Dictionary(); + foreach (var textGroup in resourcesGroup.GroupBy(x => x.CultureName)) + { + var cultureTextDictionaires = new Dictionary(); + foreach (var text in textGroup) + { + // 本地化名称去重 + if (!cultureTextDictionaires.ContainsKey(text.Key)) + { + cultureTextDictionaires[text.Key] = new LocalizedString(text.Key, text.Value.NormalizeLineEndings()); + } + } + + // 本地化语言去重 + if (!dictionaries.ContainsKey(textGroup.Key)) + { + dictionaries[textGroup.Key] = new StaticLocalizationDictionary(textGroup.Key, cultureTextDictionaires); + } + } + + result.Add(resourcesGroup.Key, dictionaries); + } + + return result; + } + + public async virtual Task ResourceExistsAsync(string resourceName, CancellationToken cancellationToken = default) { return await ResourceRepository.ExistsAsync(resourceName, cancellationToken); } diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/EfCoreTextRepository.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/EfCoreTextRepository.cs index b7c3fa412..3e98be8bc 100644 --- a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/EfCoreTextRepository.cs +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/EfCoreTextRepository.cs @@ -48,17 +48,24 @@ namespace LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore } public virtual async Task> GetListAsync( - string resourceName, + string resourceName = null, CancellationToken cancellationToken = default) { var languages = (await GetDbContextAsync()).Set(); + var resources = (IQueryable)(await GetDbContextAsync()).Set(); + if (!resourceName.IsNullOrWhiteSpace()) + { + resources = resources.Where(x => x.Name.Equals(resourceName)); + } + var texts = await GetDbSetAsync(); return await (from txts in texts + join r in resources + on txts.ResourceName equals r.Name join lg in languages on txts.CultureName equals lg.CultureName - where txts.ResourceName.Equals(resourceName) && - lg.Enable + where r.Enable && lg.Enable select txts) .ToListAsync(GetCancellationToken(cancellationToken)); }