diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI/wwwroot/libs/abp/abp.js b/src/Volo.Abp.AspNetCore.Mvc.UI/wwwroot/libs/abp/abp.js index aec598b609..12f596ce7f 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI/wwwroot/libs/abp/abp.js +++ b/src/Volo.Abp.AspNetCore.Mvc.UI/wwwroot/libs/abp/abp.js @@ -69,6 +69,44 @@ abp.log.log(logObject, abp.log.levels.FATAL); }; + /* LOCALIZATION ***********************************************/ + + abp.localization = abp.localization || {}; + + abp.localization.values = {}; + + abp.localization.localize = function (key, sourceName) { + sourceName = sourceName || abp.localization.defaultResourceName; + + var source = abp.localization.values[sourceName]; + + if (!source) { + abp.log.warn('Could not find localization source: ' + sourceName); + return key; + } + + var value = source[key]; + if (value == undefined) { + return key; + } + + var copiedArguments = Array.prototype.slice.call(arguments, 0); + copiedArguments.splice(1, 1); + copiedArguments[0] = value; + + return abp.utils.formatString.apply(this, copiedArguments); + }; + + abp.localization.getResource = function (name) { + return function () { + var copiedArguments = Array.prototype.slice.call(arguments, 0); + copiedArguments.splice(1, 0, name); + return abp.localization.localize.apply(this, copiedArguments); + }; + }; + + abp.localization.defaultResourceName = undefined; + /* NOTIFICATION *********************************************/ //Defines Notification API, not implements it diff --git a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationBuilder.cs b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationBuilder.cs new file mode 100644 index 0000000000..2b6176fbe0 --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationBuilder.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Localization; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Localization; + +namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations +{ + public class ApplicationConfigurationBuilder : IApplicationConfigurationBuilder, ITransientDependency + { + private readonly AbpLocalizationOptions _localizationOptions; + private readonly IServiceProvider _serviceProvider; + + public ApplicationConfigurationBuilder(IOptions localizationOptions, IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + _localizationOptions = localizationOptions.Value; + } + + public Task Get() + { + var config = new ApplicationConfigurationDto + { + Localization = GetLocalizationConfig() + }; + + return Task.FromResult(config); + } + + private ApplicationLocalizationConfigurationDto GetLocalizationConfig() + { + //TODO: Optimize & cache + + var localizationConfig = new ApplicationLocalizationConfigurationDto(); + + foreach (var resource in _localizationOptions.Resources) + { + var dictionary = new Dictionary(); + + var localizer = _serviceProvider.GetRequiredService(typeof(IStringLocalizer<>).MakeGenericType(resource.ResourceType)) as IStringLocalizer; + + foreach (var localizedString in localizer.GetAllStrings()) + { + dictionary[localizedString.Name] = localizedString.Value; + } + + var resourceShortName = resource.ResourceType + .GetCustomAttributes(true) + .OfType() + .FirstOrDefault()?.Name ?? resource.ResourceType.FullName; + + localizationConfig.Values[resourceShortName] = dictionary; + } + + return localizationConfig; + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationDto.cs b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationDto.cs new file mode 100644 index 0000000000..fa8786efe2 --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationDto.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations +{ + public class ApplicationConfigurationDto + { + public ApplicationLocalizationConfigurationDto Localization { get; set; } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationsController.cs b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationsController.cs new file mode 100644 index 0000000000..29606f6dcc --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationsController.cs @@ -0,0 +1,24 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; + +namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations +{ + public class ApplicationConfigurationController : AbpController + { + private readonly IApplicationConfigurationBuilder _configurationBuilder; + + public ApplicationConfigurationController(IApplicationConfigurationBuilder configurationBuilder) + { + _configurationBuilder = configurationBuilder; + } + + public async Task GetAll() + { + //TODO: 1. Make an API + //TODO: 2. Make a script generation controller + + var userConfig = await _configurationBuilder.Get(); + return Json(userConfig); + } + } +} diff --git a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationConfigurationDto.cs b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationConfigurationDto.cs new file mode 100644 index 0000000000..716061d507 --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationConfigurationDto.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations +{ + public class ApplicationLocalizationConfigurationDto + { + public Dictionary> Values { get; set; } + + public ApplicationLocalizationConfigurationDto() + { + Values = new Dictionary>(); + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/IApplicationConfigurationBuilder.cs b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/IApplicationConfigurationBuilder.cs new file mode 100644 index 0000000000..4b2f98311c --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/IApplicationConfigurationBuilder.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations +{ + public interface IApplicationConfigurationBuilder + { + Task Get(); + } +} \ No newline at end of file diff --git a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ProxyScripting/AbpServiceProxiesController.cs b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ProxyScripting/AbpServiceProxiesController.cs index 9be8853a48..4edfeaa9fa 100644 --- a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ProxyScripting/AbpServiceProxiesController.cs +++ b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ProxyScripting/AbpServiceProxiesController.cs @@ -3,7 +3,7 @@ using Volo.Abp.Http.ProxyScripting; namespace Volo.Abp.AspNetCore.Mvc.ProxyScripting { - //TODO: [DontWrapResult] + //TODO: abp area? //TODO: [DisableAuditing] public class AbpServiceProxiesController : AbpController { diff --git a/src/Volo.Abp.Identity.Web/Areas/Identity/Localization/Resource/IdentityResource.cs b/src/Volo.Abp.Identity.Web/Areas/Identity/Localization/Resource/IdentityResource.cs index 69b81c54f1..b047fbe0f5 100644 --- a/src/Volo.Abp.Identity.Web/Areas/Identity/Localization/Resource/IdentityResource.cs +++ b/src/Volo.Abp.Identity.Web/Areas/Identity/Localization/Resource/IdentityResource.cs @@ -1,5 +1,8 @@ -namespace Volo.Abp.Identity.Web.Areas.Identity.Localization.Resource +using Volo.Abp.Localization; + +namespace Volo.Abp.Identity.Web.Areas.Identity.Localization.Resource { + [ShortLocalizationResourceName("AbpIdentityWeb")] public class IdentityResource { diff --git a/src/Volo.Abp/Volo/Abp/Localization/AbpLocalizationOptions.cs b/src/Volo.Abp/Volo/Abp/Localization/AbpLocalizationOptions.cs index 42e5d9ef3f..8375a557f9 100644 --- a/src/Volo.Abp/Volo/Abp/Localization/AbpLocalizationOptions.cs +++ b/src/Volo.Abp/Volo/Abp/Localization/AbpLocalizationOptions.cs @@ -3,7 +3,6 @@ public class AbpLocalizationOptions { public LocalizationResourceList Resources { get; } - public AbpStringLocalizerList Resolvers { get; } public AbpLocalizationOptions() { diff --git a/src/Volo.Abp/Volo/Abp/Localization/ShortLocalizationResourceNameAttribute.cs b/src/Volo.Abp/Volo/Abp/Localization/ShortLocalizationResourceNameAttribute.cs new file mode 100644 index 0000000000..c84fe060b4 --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/Localization/ShortLocalizationResourceNameAttribute.cs @@ -0,0 +1,14 @@ +using System; + +namespace Volo.Abp.Localization +{ + public class ShortLocalizationResourceNameAttribute : Attribute + { + public string Name { get; } + + public ShortLocalizationResourceNameAttribute(string name) + { + Name = name; + } + } +} \ No newline at end of file