diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.csproj
index 911782697b..9d05c9e34b 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.csproj
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.csproj
@@ -17,6 +17,7 @@
+
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientModule.cs
index 3f1ed47435..6c306073c5 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientModule.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientModule.cs
@@ -1,6 +1,7 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Caching;
using Volo.Abp.Http.Client;
+using Volo.Abp.Localization;
using Volo.Abp.Modularity;
namespace Volo.Abp.AspNetCore.Mvc.Client
@@ -8,7 +9,8 @@ namespace Volo.Abp.AspNetCore.Mvc.Client
[DependsOn(
typeof(AbpHttpClientModule),
typeof(AbpAspNetCoreMvcContractsModule),
- typeof(AbpCachingModule)
+ typeof(AbpCachingModule),
+ typeof(AbpLocalizationModule)
)]
public class AbpAspNetCoreMvcClientModule : AbpModule
{
@@ -21,6 +23,11 @@ namespace Volo.Abp.AspNetCore.Mvc.Client
RemoteServiceName,
asDefaultServices: false
);
+
+ Configure(options =>
+ {
+ options.GlobalContributors.Add();
+ });
}
}
}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/CachedApplicationConfigurationClient.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/CachedApplicationConfigurationClient.cs
index 557b7c8835..4ceb8bdd1c 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/CachedApplicationConfigurationClient.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/CachedApplicationConfigurationClient.cs
@@ -1,4 +1,5 @@
using System;
+using System.Globalization;
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
using Microsoft.Extensions.Caching.Distributed;
@@ -45,7 +46,7 @@ namespace Volo.Abp.AspNetCore.Mvc.Client
async () => await Proxy.Service.GetAsync(),
() => new DistributedCacheEntryOptions
{
- AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(30) //TODO: Should be configurable. Default value should be higher (5 mins would be good).
+ AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(60) //TODO: Should be configurable. Default value should be higher (5 mins would be good).
}
);
@@ -59,7 +60,7 @@ namespace Volo.Abp.AspNetCore.Mvc.Client
protected virtual string CreateCacheKey()
{
- return $"ApplicationConfiguration_{CurrentUser.Id?.ToString("N") ?? "Anonymous"}";
+ return $"ApplicationConfiguration_{CurrentUser.Id?.ToString("N") ?? "Anonymous"}_{CultureInfo.CurrentUICulture.Name}";
}
}
}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/CachedApplicationConfigurationClientExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/CachedApplicationConfigurationClientExtensions.cs
new file mode 100644
index 0000000000..601a2d1088
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/CachedApplicationConfigurationClientExtensions.cs
@@ -0,0 +1,13 @@
+using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations;
+using Volo.Abp.Threading;
+
+namespace Volo.Abp.AspNetCore.Mvc.Client
+{
+ public static class CachedApplicationConfigurationClientExtensions
+ {
+ public static ApplicationConfigurationDto Get(this ICachedApplicationConfigurationClient client)
+ {
+ return AsyncHelper.RunSync(client.GetAsync);
+ }
+ }
+}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/RemoteLocalizationContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/RemoteLocalizationContributor.cs
new file mode 100644
index 0000000000..d994a84335
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/RemoteLocalizationContributor.cs
@@ -0,0 +1,70 @@
+using System.Collections.Generic;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Localization;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Logging.Abstractions;
+using Volo.Abp.Localization;
+
+namespace Volo.Abp.AspNetCore.Mvc.Client
+{
+ public class RemoteLocalizationContributor : ILocalizationResourceContributor
+ {
+ private LocalizationResource _resource;
+ private ICachedApplicationConfigurationClient _applicationConfigurationClient;
+ private ILogger _logger;
+
+ public void Initialize(LocalizationResourceInitializationContext context)
+ {
+ _resource = context.Resource;
+ _applicationConfigurationClient = context.ServiceProvider.GetRequiredService();
+ _logger = context.ServiceProvider.GetService>()
+ ?? NullLogger.Instance;
+ }
+
+ public LocalizedString GetOrNull(string cultureName, string name)
+ {
+ var resource = GetResourceOrNull();
+ if (resource == null)
+ {
+ return null;
+ }
+
+ var value = resource.GetOrDefault(name);
+ if (value == null)
+ {
+ return null;
+ }
+
+ return new LocalizedString(name, value);
+ }
+
+ public void Fill(string cultureName, Dictionary dictionary)
+ {
+ var resource = GetResourceOrNull();
+ if (resource == null)
+ {
+ return;
+ }
+
+ foreach (var keyValue in resource)
+ {
+ dictionary[keyValue.Key] = new LocalizedString(keyValue.Key, keyValue.Value);
+ }
+ }
+
+ private Dictionary GetResourceOrNull()
+ {
+ var resource = _applicationConfigurationClient
+ .Get()
+ .Localization.Values
+ .GetOrDefault(_resource.ResourceName);
+
+ if (resource == null)
+ {
+ _logger.LogWarning($"Could not find the localization resource {_resource.ResourceName} on the remote server!");
+ }
+
+ return resource;
+ }
+ }
+}
\ No newline at end of file