69 lines
2.5 KiB
C#
69 lines
2.5 KiB
C#
using KonSoft.InternalGateway.Aggregations.Base;
|
|
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations;
|
|
using Volo.Abp.DependencyInjection;
|
|
|
|
namespace KonSoft.InternalGateway.Aggregations.Localization;
|
|
|
|
public class LocalizationAggregation : AggregateServiceBase<ApplicationLocalizationDto>, ILocalizationAggregation,
|
|
ITransientDependency
|
|
{
|
|
public string LocalizationRouteName => "EshopOnAbpLocalization";
|
|
public string LocalizationEndpoint => "api/abp/application-localization";
|
|
protected LocalizationCachedService LocalizationCachedService { get; }
|
|
|
|
public LocalizationAggregation(
|
|
LocalizationCachedService localizationCachedService,
|
|
ILocalizationRemoteService localizationRemoteService)
|
|
: base(localizationRemoteService)
|
|
{
|
|
LocalizationCachedService = localizationCachedService;
|
|
}
|
|
|
|
public async Task<ApplicationLocalizationDto> GetLocalizationAsync(LocalizationRequest input)
|
|
{
|
|
// Check the cache service
|
|
var cachedLocalization = LocalizationCachedService
|
|
.GetManyAsync(input.Endpoints.Keys.ToArray());
|
|
|
|
// Compare cache with input service list
|
|
var missingLocalizationKeys = GetMissingServiceKeys(cachedLocalization, input.Endpoints);
|
|
|
|
if (missingLocalizationKeys.Count != 0)
|
|
{
|
|
// Make request to remote localization service to get missing localizations
|
|
var remoteLocalizationResults =
|
|
await GetMultipleFromRemoteAsync(missingLocalizationKeys, input.Endpoints);
|
|
|
|
// Update localization cache
|
|
foreach (var result in remoteLocalizationResults)
|
|
{
|
|
LocalizationCachedService.Add(result.Key, result.Value);
|
|
}
|
|
|
|
cachedLocalization = LocalizationCachedService
|
|
.GetManyAsync(input.Endpoints.Keys.ToArray());
|
|
}
|
|
|
|
//merge result
|
|
var mergedResult = MergeLocalizationData(cachedLocalization);
|
|
|
|
//return result
|
|
return mergedResult;
|
|
}
|
|
|
|
private static ApplicationLocalizationDto MergeLocalizationData(
|
|
IDictionary<string, ApplicationLocalizationDto> resourceDictionary)
|
|
{
|
|
var localizationDto = new ApplicationLocalizationDto();
|
|
|
|
foreach (var localization in resourceDictionary)
|
|
{
|
|
foreach (var resource in localization.Value.Resources)
|
|
{
|
|
localizationDto.Resources.TryAdd(resource.Key, resource.Value);
|
|
}
|
|
}
|
|
|
|
return localizationDto;
|
|
}
|
|
} |