|
|
|
|
@ -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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|