|
|
|
@ -5,6 +5,7 @@ using Microsoft.Extensions.DependencyInjection; |
|
|
|
using Microsoft.Extensions.Localization; |
|
|
|
using Microsoft.Extensions.Logging; |
|
|
|
using Microsoft.Extensions.Logging.Abstractions; |
|
|
|
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; |
|
|
|
using Volo.Abp.Localization; |
|
|
|
|
|
|
|
namespace Volo.Abp.AspNetCore.Mvc.Client; |
|
|
|
@ -25,87 +26,137 @@ public class RemoteLocalizationContributor : ILocalizationResourceContributor |
|
|
|
?? NullLogger<RemoteLocalizationContributor>.Instance; |
|
|
|
} |
|
|
|
|
|
|
|
public LocalizedString GetOrNull(string cultureName, string name) |
|
|
|
public virtual LocalizedString GetOrNull(string cultureName, string name) |
|
|
|
{ |
|
|
|
var resource = GetResourceOrNull(); |
|
|
|
/* cultureName is not used because remote localization can only |
|
|
|
* be done in the current culture. */ |
|
|
|
|
|
|
|
return GetOrNullInternal(_resource.ResourceName, name); |
|
|
|
} |
|
|
|
|
|
|
|
protected virtual LocalizedString GetOrNullInternal(string resourceName, string name) |
|
|
|
{ |
|
|
|
var resource = GetResourceOrNull(resourceName); |
|
|
|
if (resource == null) |
|
|
|
{ |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
var value = resource.GetOrDefault(name); |
|
|
|
if (value == null) |
|
|
|
var value = resource.Texts.GetOrDefault(name); |
|
|
|
if (value != null) |
|
|
|
{ |
|
|
|
return null; |
|
|
|
return new LocalizedString(name, value); |
|
|
|
} |
|
|
|
|
|
|
|
return new LocalizedString(name, value); |
|
|
|
foreach (var baseResource in resource.BaseResources) |
|
|
|
{ |
|
|
|
value = GetOrNullInternal(baseResource, name); |
|
|
|
if (value != null) |
|
|
|
{ |
|
|
|
return new LocalizedString(name, value); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
public void Fill(string cultureName, Dictionary<string, LocalizedString> dictionary) |
|
|
|
public virtual void Fill(string cultureName, Dictionary<string, LocalizedString> dictionary) |
|
|
|
{ |
|
|
|
/* cultureName is not used because remote localization can only |
|
|
|
* be done in the current culture. */ |
|
|
|
|
|
|
|
FillInternal(_resource.ResourceName, dictionary); |
|
|
|
} |
|
|
|
|
|
|
|
protected virtual void FillInternal(string resourceName, Dictionary<string, LocalizedString> dictionary) |
|
|
|
{ |
|
|
|
var resource = GetResourceOrNull(); |
|
|
|
var resource = GetResourceOrNull(resourceName); |
|
|
|
if (resource == null) |
|
|
|
{ |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
foreach (var keyValue in resource) |
|
|
|
foreach (var baseResource in resource.BaseResources) |
|
|
|
{ |
|
|
|
FillInternal(baseResource, dictionary); |
|
|
|
} |
|
|
|
|
|
|
|
foreach (var keyValue in resource.Texts) |
|
|
|
{ |
|
|
|
dictionary[keyValue.Key] = new LocalizedString(keyValue.Key, keyValue.Value); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public async Task FillAsync(string cultureName, Dictionary<string, LocalizedString> dictionary) |
|
|
|
public virtual async Task FillAsync(string cultureName, Dictionary<string, LocalizedString> dictionary) |
|
|
|
{ |
|
|
|
/* cultureName is not used because remote localization can only |
|
|
|
* be done in the current culture. */ |
|
|
|
|
|
|
|
await FillInternalAsync(_resource.ResourceName, dictionary); |
|
|
|
} |
|
|
|
|
|
|
|
protected virtual async Task FillInternalAsync(string resourceName, Dictionary<string, LocalizedString> dictionary) |
|
|
|
{ |
|
|
|
var resource = await GetResourceOrNullAsync(); |
|
|
|
var resource = await GetResourceOrNullAsync(resourceName); |
|
|
|
if (resource == null) |
|
|
|
{ |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
foreach (var baseResource in resource.BaseResources) |
|
|
|
{ |
|
|
|
await FillInternalAsync(baseResource, dictionary); |
|
|
|
} |
|
|
|
|
|
|
|
foreach (var keyValue in resource) |
|
|
|
foreach (var keyValue in resource.Texts) |
|
|
|
{ |
|
|
|
dictionary[keyValue.Key] = new LocalizedString(keyValue.Key, keyValue.Value); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public Task<IEnumerable<string>> GetSupportedCulturesAsync() |
|
|
|
public virtual Task<IEnumerable<string>> GetSupportedCulturesAsync() |
|
|
|
{ |
|
|
|
/* This contributor does not know all the supported cultures by the |
|
|
|
remote localization resource, and it is not needed on the client side */ |
|
|
|
return Task.FromResult((IEnumerable<string>)Array.Empty<string>()); |
|
|
|
} |
|
|
|
|
|
|
|
private Dictionary<string, string> GetResourceOrNull() |
|
|
|
protected virtual ApplicationLocalizationResourceDto GetResourceOrNull(string resourceName) |
|
|
|
{ |
|
|
|
var applicationConfigurationDto = _applicationConfigurationClient.Get(); |
|
|
|
|
|
|
|
var resource = applicationConfigurationDto |
|
|
|
.Localization.Values |
|
|
|
.GetOrDefault(_resource.ResourceName); |
|
|
|
|
|
|
|
if (resource == null) |
|
|
|
{ |
|
|
|
_logger.LogWarning($"Could not find the localization resource {_resource.ResourceName} on the remote server!"); |
|
|
|
} |
|
|
|
|
|
|
|
return resource; |
|
|
|
return GetResourceOrNull(applicationConfigurationDto, resourceName); |
|
|
|
} |
|
|
|
|
|
|
|
private async Task<Dictionary<string, string>> GetResourceOrNullAsync() |
|
|
|
protected virtual async Task<ApplicationLocalizationResourceDto> GetResourceOrNullAsync(string resourceName) |
|
|
|
{ |
|
|
|
var applicationConfigurationDto = await _applicationConfigurationClient.GetAsync(); |
|
|
|
return GetResourceOrNull(applicationConfigurationDto, resourceName); |
|
|
|
} |
|
|
|
|
|
|
|
var resource = applicationConfigurationDto |
|
|
|
protected virtual ApplicationLocalizationResourceDto GetResourceOrNull( |
|
|
|
ApplicationConfigurationDto applicationConfigurationDto, |
|
|
|
string resourceName) |
|
|
|
{ |
|
|
|
var resource = applicationConfigurationDto.Localization.Resources.GetOrDefault(resourceName); |
|
|
|
if (resource != null) |
|
|
|
{ |
|
|
|
return resource; |
|
|
|
} |
|
|
|
|
|
|
|
var legacyResource = applicationConfigurationDto |
|
|
|
.Localization.Values |
|
|
|
.GetOrDefault(_resource.ResourceName); |
|
|
|
.GetOrDefault(resourceName); |
|
|
|
|
|
|
|
if (resource == null) |
|
|
|
if (legacyResource != null) |
|
|
|
{ |
|
|
|
_logger.LogWarning($"Could not find the localization resource {_resource.ResourceName} on the remote server!"); |
|
|
|
return new ApplicationLocalizationResourceDto |
|
|
|
{ |
|
|
|
Texts = legacyResource, |
|
|
|
BaseResources = Array.Empty<string>() |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
return resource; |
|
|
|
_logger.LogWarning($"Could not find the localization resource {resourceName} on the remote server!"); |
|
|
|
return null; |
|
|
|
} |
|
|
|
} |
|
|
|
|