mirror of https://github.com/abpframework/abp.git
committed by
GitHub
83 changed files with 1935 additions and 375 deletions
@ -0,0 +1,25 @@ |
|||
// This file is automatically generated by ABP framework to use MVC Controllers from CSharp
|
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.Application.Dtos; |
|||
using Volo.Abp.Http.Client; |
|||
using Volo.Abp.Http.Modeling; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Http.Client.ClientProxying; |
|||
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; |
|||
|
|||
// ReSharper disable once CheckNamespace
|
|||
namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClientProxies; |
|||
|
|||
[Dependency(ReplaceServices = true)] |
|||
[ExposeServices(typeof(IAbpApplicationLocalizationAppService), typeof(AbpApplicationLocalizationClientProxy))] |
|||
public partial class AbpApplicationLocalizationClientProxy : ClientProxyBase<IAbpApplicationLocalizationAppService>, IAbpApplicationLocalizationAppService |
|||
{ |
|||
public virtual async Task<ApplicationLocalizationDto> GetAsync(ApplicationLocalizationRequestDto input) |
|||
{ |
|||
return await RequestAsync<ApplicationLocalizationDto>(nameof(GetAsync), new ClientProxyRequestTypeValue |
|||
{ |
|||
{ typeof(ApplicationLocalizationRequestDto), input } |
|||
}); |
|||
} |
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
// This file is part of AbpApplicationLocalizationClientProxy, you can customize it here
|
|||
// ReSharper disable once CheckNamespace
|
|||
namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClientProxies; |
|||
|
|||
public partial class AbpApplicationLocalizationClientProxy |
|||
{ |
|||
} |
|||
@ -0,0 +1,87 @@ |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.Extensions.Options; |
|||
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Localization; |
|||
using Volo.Abp.Localization.External; |
|||
|
|||
namespace Volo.Abp.AspNetCore.Mvc.Client; |
|||
|
|||
public class RemoteExternalLocalizationStore : IExternalLocalizationStore, ITransientDependency |
|||
{ |
|||
protected ICachedApplicationConfigurationClient ConfigurationClient { get; } |
|||
protected AbpLocalizationOptions LocalizationOptions { get; } |
|||
|
|||
public RemoteExternalLocalizationStore( |
|||
ICachedApplicationConfigurationClient configurationClient, |
|||
IOptions<AbpLocalizationOptions> localizationOptions) |
|||
{ |
|||
ConfigurationClient = configurationClient; |
|||
LocalizationOptions = localizationOptions.Value; |
|||
} |
|||
|
|||
public virtual LocalizationResourceBase GetResourceOrNull(string resourceName) |
|||
{ |
|||
var configurationDto = ConfigurationClient.Get(); |
|||
return CreateLocalizationResourceFromConfigurationOrNull(resourceName, configurationDto); |
|||
} |
|||
|
|||
public virtual async Task<LocalizationResourceBase> GetResourceOrNullAsync(string resourceName) |
|||
{ |
|||
var configurationDto = await ConfigurationClient.GetAsync(); |
|||
return CreateLocalizationResourceFromConfigurationOrNull(resourceName, configurationDto); |
|||
} |
|||
|
|||
public virtual async Task<string[]> GetResourceNamesAsync() |
|||
{ |
|||
var configurationDto = await ConfigurationClient.GetAsync(); |
|||
return configurationDto |
|||
.Localization |
|||
.Resources |
|||
.Keys |
|||
.Where(x => !LocalizationOptions.Resources.ContainsKey(x)) |
|||
.ToArray(); |
|||
; } |
|||
|
|||
public virtual async Task<LocalizationResourceBase[]> GetResourcesAsync() |
|||
{ |
|||
var configurationDto = await ConfigurationClient.GetAsync(); |
|||
var resources = new List<LocalizationResourceBase>(); |
|||
|
|||
foreach (var resource in configurationDto.Localization.Resources) |
|||
{ |
|||
if (LocalizationOptions.Resources.ContainsKey(resource.Key)) |
|||
{ |
|||
continue; |
|||
} |
|||
|
|||
resources.Add(CreateNonTypedLocalizationResource(resource.Key, resource.Value)); |
|||
} |
|||
|
|||
return resources.ToArray(); |
|||
} |
|||
|
|||
protected virtual LocalizationResourceBase CreateLocalizationResourceFromConfigurationOrNull( |
|||
string resourceName, |
|||
ApplicationConfigurationDto configurationDto) |
|||
{ |
|||
var resourceDto = configurationDto.Localization.Resources.GetOrDefault(resourceName); |
|||
|
|||
if (resourceDto == null) |
|||
{ |
|||
return null; |
|||
} |
|||
|
|||
return CreateNonTypedLocalizationResource(resourceName, resourceDto); |
|||
} |
|||
|
|||
protected virtual NonTypedLocalizationResource CreateNonTypedLocalizationResource( |
|||
string resourceName, |
|||
ApplicationLocalizationResourceDto resourceDto) |
|||
{ |
|||
return new NonTypedLocalizationResource(resourceName) |
|||
.AddBaseResources(resourceDto.BaseResources); |
|||
} |
|||
} |
|||
@ -0,0 +1,9 @@ |
|||
namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; |
|||
|
|||
public class ApplicationConfigurationRequestOptions |
|||
{ |
|||
/// <summary>
|
|||
/// Set to true to fill the Values property in <see cref="ApplicationConfigurationDto.Localization"/>.
|
|||
/// </summary>
|
|||
public bool IncludeLocalizationResources { get; set; } = true; |
|||
} |
|||
@ -0,0 +1,10 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
|
|||
namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; |
|||
|
|||
[Serializable] |
|||
public class ApplicationLocalizationDto |
|||
{ |
|||
public Dictionary<string, ApplicationLocalizationResourceDto> Resources { get; set; } |
|||
} |
|||
@ -0,0 +1,11 @@ |
|||
using System.ComponentModel.DataAnnotations; |
|||
|
|||
namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; |
|||
|
|||
public class ApplicationLocalizationRequestDto |
|||
{ |
|||
[Required] |
|||
public string CultureName { get; set; } |
|||
|
|||
public bool OnlyDynamics { get; set; } |
|||
} |
|||
@ -0,0 +1,12 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
|
|||
namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; |
|||
|
|||
[Serializable] |
|||
public class ApplicationLocalizationResourceDto |
|||
{ |
|||
public Dictionary<string, string> Texts { get; set; } |
|||
|
|||
public string[] BaseResources { get; set; } |
|||
} |
|||
@ -0,0 +1,9 @@ |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.Application.Services; |
|||
|
|||
namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; |
|||
|
|||
public interface IAbpApplicationLocalizationAppService : IApplicationService |
|||
{ |
|||
Task<ApplicationLocalizationDto> GetAsync(ApplicationLocalizationRequestDto input); |
|||
} |
|||
@ -0,0 +1,91 @@ |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.Extensions.Localization; |
|||
using Microsoft.Extensions.Options; |
|||
using Volo.Abp.Application.Services; |
|||
using Volo.Abp.Localization; |
|||
using Volo.Abp.Localization.External; |
|||
|
|||
namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; |
|||
|
|||
public class AbpApplicationLocalizationAppService : |
|||
ApplicationService, |
|||
IAbpApplicationLocalizationAppService |
|||
{ |
|||
protected IExternalLocalizationStore ExternalLocalizationStore { get; } |
|||
protected AbpLocalizationOptions LocalizationOptions { get; } |
|||
|
|||
public AbpApplicationLocalizationAppService( |
|||
IExternalLocalizationStore externalLocalizationStore, |
|||
IOptions<AbpLocalizationOptions> localizationOptions) |
|||
{ |
|||
ExternalLocalizationStore = externalLocalizationStore; |
|||
LocalizationOptions = localizationOptions.Value; |
|||
} |
|||
|
|||
public async Task<ApplicationLocalizationDto> GetAsync(ApplicationLocalizationRequestDto input) |
|||
{ |
|||
using (CultureHelper.Use(input.CultureName)) |
|||
{ |
|||
var resources = LocalizationOptions |
|||
.Resources |
|||
.Values |
|||
.Union( |
|||
await ExternalLocalizationStore.GetResourcesAsync() |
|||
).ToArray(); |
|||
|
|||
var localizationConfig = new ApplicationLocalizationDto { |
|||
Resources = new Dictionary<string, ApplicationLocalizationResourceDto>(resources.Length) |
|||
}; |
|||
|
|||
foreach (var resource in resources) |
|||
{ |
|||
var dictionary = new Dictionary<string, string>(); |
|||
var localizer = await StringLocalizerFactory.CreateByResourceNameOrNullAsync(resource.ResourceName); |
|||
if (localizer != null) |
|||
{ |
|||
Dictionary<string, LocalizedString> staticLocalizedStrings = null; |
|||
|
|||
if (input.OnlyDynamics) |
|||
{ |
|||
staticLocalizedStrings = (await localizer.GetAllStringsAsync( |
|||
includeParentCultures: true, |
|||
includeBaseLocalizers: false, |
|||
includeDynamicContributors: false |
|||
)).ToDictionary(x => x.Name); |
|||
} |
|||
|
|||
var localizedStringsWithDynamics = await localizer.GetAllStringsAsync( |
|||
includeParentCultures: true, |
|||
includeBaseLocalizers: false, |
|||
includeDynamicContributors: true |
|||
); |
|||
|
|||
foreach (var localizedString in localizedStringsWithDynamics) |
|||
{ |
|||
if (input.OnlyDynamics) |
|||
{ |
|||
var staticLocalizedString = staticLocalizedStrings.GetOrDefault(localizedString.Name); |
|||
if (staticLocalizedString != null && |
|||
localizedString.Value == staticLocalizedString.Value) |
|||
{ |
|||
continue; |
|||
} |
|||
} |
|||
|
|||
dictionary[localizedString.Name] = localizedString.Value; |
|||
} |
|||
} |
|||
|
|||
localizationConfig.Resources[resource.ResourceName] = |
|||
new ApplicationLocalizationResourceDto { |
|||
Texts = dictionary, |
|||
BaseResources = resource.BaseResourceNames.ToArray() |
|||
}; |
|||
} |
|||
|
|||
return localizationConfig; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
using System.Threading.Tasks; |
|||
using Microsoft.AspNetCore.Mvc; |
|||
|
|||
namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; |
|||
|
|||
[Area("abp")] |
|||
[RemoteService(Name = "abp")] |
|||
[Route("api/abp/application-localization")] |
|||
public class AbpApplicationLocalizationController: AbpControllerBase, IAbpApplicationLocalizationAppService |
|||
{ |
|||
private readonly IAbpApplicationLocalizationAppService _localizationAppService; |
|||
|
|||
public AbpApplicationLocalizationController(IAbpApplicationLocalizationAppService localizationAppService) |
|||
{ |
|||
_localizationAppService = localizationAppService; |
|||
} |
|||
|
|||
[HttpGet] |
|||
public virtual async Task<ApplicationLocalizationDto> GetAsync(ApplicationLocalizationRequestDto input) |
|||
{ |
|||
return await _localizationAppService.GetAsync(input); |
|||
} |
|||
} |
|||
@ -0,0 +1,69 @@ |
|||
using System; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.AspNetCore.Mvc; |
|||
using Microsoft.Extensions.Localization; |
|||
using Microsoft.Extensions.Options; |
|||
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; |
|||
using Volo.Abp.Auditing; |
|||
using Volo.Abp.Http; |
|||
using Volo.Abp.Json; |
|||
using Volo.Abp.Localization; |
|||
using Volo.Abp.Minify.Scripts; |
|||
|
|||
namespace Volo.Abp.AspNetCore.Mvc.Localization; |
|||
|
|||
[Area("Abp")] |
|||
[Route("Abp/ApplicationLocalizationScript")] |
|||
[DisableAuditing] |
|||
[RemoteService(false)] |
|||
[ApiExplorerSettings(IgnoreApi = true)] |
|||
public class AbpApplicationLocalizationScriptController : AbpController |
|||
{ |
|||
protected AbpApplicationLocalizationAppService LocalizationAppService { get; } |
|||
protected AbpAspNetCoreMvcOptions Options { get; } |
|||
protected IJsonSerializer JsonSerializer { get; } |
|||
protected IJavascriptMinifier JavascriptMinifier { get; } |
|||
|
|||
public AbpApplicationLocalizationScriptController( |
|||
AbpApplicationLocalizationAppService localizationAppService, |
|||
IOptions<AbpAspNetCoreMvcOptions> options, |
|||
IJsonSerializer jsonSerializer, |
|||
IJavascriptMinifier javascriptMinifier) |
|||
{ |
|||
LocalizationAppService = localizationAppService; |
|||
JsonSerializer = jsonSerializer; |
|||
JavascriptMinifier = javascriptMinifier; |
|||
Options = options.Value; |
|||
} |
|||
|
|||
[HttpGet] |
|||
[Produces(MimeTypes.Application.Javascript, MimeTypes.Text.Plain)] |
|||
public async Task<ActionResult> GetAsync(ApplicationLocalizationRequestDto input) |
|||
{ |
|||
var script = CreateScript( |
|||
await LocalizationAppService.GetAsync(input) |
|||
); |
|||
|
|||
return Content( |
|||
Options.MinifyGeneratedScript == true |
|||
? JavascriptMinifier.Minify(script) |
|||
: script, |
|||
MimeTypes.Application.Javascript |
|||
); |
|||
} |
|||
|
|||
private string CreateScript(ApplicationLocalizationDto localizationDto) |
|||
{ |
|||
var script = new StringBuilder(); |
|||
|
|||
script.AppendLine("(function(){"); |
|||
script.AppendLine(); |
|||
script.AppendLine( |
|||
$"$.extend(true, abp.localization, {JsonSerializer.Serialize(localizationDto, indented: true)})"); |
|||
script.AppendLine(); |
|||
script.Append("})();"); |
|||
|
|||
return script.ToString(); |
|||
} |
|||
} |
|||
@ -1,10 +1,66 @@ |
|||
namespace Microsoft.Extensions.Localization; |
|||
using System.Threading.Tasks; |
|||
using JetBrains.Annotations; |
|||
using Volo.Abp; |
|||
|
|||
namespace Microsoft.Extensions.Localization; |
|||
|
|||
public static class AbpStringLocalizerFactoryExtensions |
|||
{ |
|||
[CanBeNull] |
|||
public static IStringLocalizer CreateDefaultOrNull(this IStringLocalizerFactory localizerFactory) |
|||
{ |
|||
return (localizerFactory as IAbpStringLocalizerFactoryWithDefaultResourceSupport) |
|||
return (localizerFactory as IAbpStringLocalizerFactory) |
|||
?.CreateDefaultOrNull(); |
|||
} |
|||
|
|||
[CanBeNull] |
|||
public static IStringLocalizer CreateByResourceNameOrNull( |
|||
this IStringLocalizerFactory localizerFactory, |
|||
string resourceName) |
|||
{ |
|||
return (localizerFactory as IAbpStringLocalizerFactory) |
|||
?.CreateByResourceNameOrNull(resourceName); |
|||
} |
|||
|
|||
[NotNull] |
|||
public static IStringLocalizer CreateByResourceName( |
|||
this IStringLocalizerFactory localizerFactory, |
|||
string resourceName) |
|||
{ |
|||
var localizer = localizerFactory.CreateByResourceNameOrNull(resourceName); |
|||
if (localizer == null) |
|||
{ |
|||
throw new AbpException("Couldn't find a localizer with given resource name: " + resourceName); |
|||
} |
|||
|
|||
return localizer; |
|||
} |
|||
|
|||
[ItemCanBeNull] |
|||
public static async Task<IStringLocalizer> CreateByResourceNameOrNullAsync( |
|||
this IStringLocalizerFactory localizerFactory, |
|||
string resourceName) |
|||
{ |
|||
var abpLocalizerFactory = localizerFactory as IAbpStringLocalizerFactory; |
|||
if (abpLocalizerFactory == null) |
|||
{ |
|||
return null; |
|||
} |
|||
|
|||
return await abpLocalizerFactory.CreateByResourceNameOrNullAsync(resourceName); |
|||
} |
|||
|
|||
[NotNull] |
|||
public async static Task<IStringLocalizer> CreateByResourceNameAsync( |
|||
this IStringLocalizerFactory localizerFactory, |
|||
string resourceName) |
|||
{ |
|||
var localizer = await localizerFactory.CreateByResourceNameOrNullAsync(resourceName); |
|||
if (localizer == null) |
|||
{ |
|||
throw new AbpException("Couldn't find a localizer with given resource name: " + resourceName); |
|||
} |
|||
|
|||
return localizer; |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,16 @@ |
|||
using System.Threading.Tasks; |
|||
using JetBrains.Annotations; |
|||
|
|||
namespace Microsoft.Extensions.Localization; |
|||
|
|||
public interface IAbpStringLocalizerFactory |
|||
{ |
|||
[CanBeNull] |
|||
IStringLocalizer CreateDefaultOrNull(); |
|||
|
|||
[CanBeNull] |
|||
IStringLocalizer CreateByResourceNameOrNull([NotNull] string resourceName); |
|||
|
|||
[ItemCanBeNull] |
|||
Task<IStringLocalizer> CreateByResourceNameOrNullAsync([NotNull] string resourceName); |
|||
} |
|||
@ -1,9 +0,0 @@ |
|||
using JetBrains.Annotations; |
|||
|
|||
namespace Microsoft.Extensions.Localization; |
|||
|
|||
public interface IAbpStringLocalizerFactoryWithDefaultResourceSupport |
|||
{ |
|||
[CanBeNull] |
|||
IStringLocalizer CreateDefaultOrNull(); |
|||
} |
|||
@ -0,0 +1,9 @@ |
|||
using System.Threading.Tasks; |
|||
using Microsoft.Extensions.Localization; |
|||
|
|||
namespace Volo.Abp.Localization; |
|||
|
|||
public interface IAsyncLocalizableString |
|||
{ |
|||
Task<LocalizedString> LocalizeAsync(IStringLocalizerFactory stringLocalizerFactory); |
|||
} |
|||
@ -0,0 +1,19 @@ |
|||
using System.Threading.Tasks; |
|||
using Microsoft.Extensions.Localization; |
|||
|
|||
namespace Volo.Abp.Localization; |
|||
|
|||
public static class LocalizableStringExtensions |
|||
{ |
|||
public static async Task<LocalizedString> LocalizeAsync( |
|||
this ILocalizableString localizableString, |
|||
IStringLocalizerFactory stringLocalizerFactory) |
|||
{ |
|||
if (localizableString is IAsyncLocalizableString asyncLocalizableString) |
|||
{ |
|||
return await asyncLocalizableString.LocalizeAsync(stringLocalizerFactory); |
|||
} |
|||
|
|||
return localizableString.Localize(stringLocalizerFactory); |
|||
} |
|||
} |
|||
@ -0,0 +1,17 @@ |
|||
using System.Threading.Tasks; |
|||
using JetBrains.Annotations; |
|||
|
|||
namespace Volo.Abp.Localization.External; |
|||
|
|||
public interface IExternalLocalizationStore |
|||
{ |
|||
[CanBeNull] |
|||
LocalizationResourceBase GetResourceOrNull([NotNull] string resourceName); |
|||
|
|||
[ItemCanBeNull] |
|||
Task<LocalizationResourceBase> GetResourceOrNullAsync([NotNull] string resourceName); |
|||
|
|||
Task<string[]> GetResourceNamesAsync(); |
|||
|
|||
Task<LocalizationResourceBase[]> GetResourcesAsync(); |
|||
} |
|||
@ -0,0 +1,28 @@ |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace Volo.Abp.Localization.External; |
|||
|
|||
public class NullExternalLocalizationStore : IExternalLocalizationStore, ISingletonDependency |
|||
{ |
|||
public LocalizationResourceBase GetResourceOrNull(string resourceName) |
|||
{ |
|||
return null; |
|||
} |
|||
|
|||
public Task<LocalizationResourceBase> GetResourceOrNullAsync(string resourceName) |
|||
{ |
|||
return Task.FromResult<LocalizationResourceBase>(null); |
|||
} |
|||
|
|||
public Task<string[]> GetResourceNamesAsync() |
|||
{ |
|||
return Task.FromResult(Array.Empty<string>()); |
|||
} |
|||
|
|||
public Task<LocalizationResourceBase[]> GetResourcesAsync() |
|||
{ |
|||
return Task.FromResult(Array.Empty<LocalizationResourceBase>()); |
|||
} |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.Extensions.Localization; |
|||
|
|||
namespace Volo.Abp.Localization; |
|||
|
|||
public interface IAbpStringLocalizer : IStringLocalizer |
|||
{ |
|||
IEnumerable<LocalizedString> GetAllStrings( |
|||
bool includeParentCultures, |
|||
bool includeBaseLocalizers, |
|||
bool includeDynamicContributors |
|||
); |
|||
|
|||
Task<IEnumerable<LocalizedString>> GetAllStringsAsync( |
|||
bool includeParentCultures |
|||
); |
|||
|
|||
Task<IEnumerable<LocalizedString>> GetAllStringsAsync( |
|||
bool includeParentCultures, |
|||
bool includeBaseLocalizers, |
|||
bool includeDynamicContributors |
|||
); |
|||
|
|||
Task<IEnumerable<string>> GetSupportedCulturesAsync(); |
|||
} |
|||
@ -1,13 +1,20 @@ |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.Extensions.Localization; |
|||
|
|||
namespace Volo.Abp.Localization; |
|||
|
|||
public interface ILocalizationResourceContributor |
|||
{ |
|||
bool IsDynamic { get; } |
|||
|
|||
void Initialize(LocalizationResourceInitializationContext context); |
|||
|
|||
LocalizedString GetOrNull(string cultureName, string name); |
|||
|
|||
void Fill(string cultureName, Dictionary<string, LocalizedString> dictionary); |
|||
|
|||
Task FillAsync(string cultureName, Dictionary<string, LocalizedString> dictionary); |
|||
|
|||
Task<IEnumerable<string>> GetSupportedCulturesAsync(); |
|||
} |
|||
|
|||
@ -1,9 +0,0 @@ |
|||
using System.Collections.Generic; |
|||
using Microsoft.Extensions.Localization; |
|||
|
|||
namespace Volo.Abp.Localization; |
|||
|
|||
public interface IStringLocalizerSupportsInheritance |
|||
{ |
|||
IEnumerable<LocalizedString> GetAllStrings(bool includeParentCultures, bool includeBaseLocalizers); |
|||
} |
|||
@ -0,0 +1,35 @@ |
|||
using System.Collections.Generic; |
|||
using JetBrains.Annotations; |
|||
|
|||
namespace Volo.Abp.Localization; |
|||
|
|||
public abstract class LocalizationResourceBase |
|||
{ |
|||
[NotNull] |
|||
public string ResourceName { get; } |
|||
|
|||
public List<string> BaseResourceNames { get; } |
|||
|
|||
[CanBeNull] |
|||
public string DefaultCultureName { get; set; } |
|||
|
|||
[NotNull] |
|||
public LocalizationResourceContributorList Contributors { get; } |
|||
|
|||
public LocalizationResourceBase( |
|||
[NotNull] string resourceName, |
|||
[CanBeNull] string defaultCultureName = null, |
|||
[CanBeNull] ILocalizationResourceContributor initialContributor = null) |
|||
{ |
|||
ResourceName = Check.NotNullOrWhiteSpace(resourceName, nameof(resourceName)); |
|||
DefaultCultureName = defaultCultureName; |
|||
|
|||
Contributors = new LocalizationResourceContributorList(); |
|||
BaseResourceNames = new(); |
|||
|
|||
if (initialContributor != null) |
|||
{ |
|||
Contributors.Add(initialContributor); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,17 @@ |
|||
using JetBrains.Annotations; |
|||
|
|||
namespace Volo.Abp.Localization; |
|||
|
|||
public class NonTypedLocalizationResource : LocalizationResourceBase |
|||
{ |
|||
public NonTypedLocalizationResource( |
|||
[NotNull] string resourceName, |
|||
[CanBeNull] string defaultCultureName = null, |
|||
[CanBeNull] ILocalizationResourceContributor initialContributor = null |
|||
) : base( |
|||
resourceName, |
|||
defaultCultureName, |
|||
initialContributor) |
|||
{ |
|||
} |
|||
} |
|||
@ -0,0 +1,36 @@ |
|||
using Shouldly; |
|||
using Xunit; |
|||
|
|||
namespace Volo.Abp.Localization; |
|||
|
|||
public class CultureHelper_Tests |
|||
{ |
|||
[Fact] |
|||
public void IsCompatibleCulture() |
|||
{ |
|||
CultureHelper.IsCompatibleCulture("tr", "tr").ShouldBeTrue(); |
|||
CultureHelper.IsCompatibleCulture("tr", "tr-TR").ShouldBeTrue(); |
|||
|
|||
CultureHelper.IsCompatibleCulture("en", "tr").ShouldBeFalse(); |
|||
CultureHelper.IsCompatibleCulture("en", "tr-TR").ShouldBeFalse(); |
|||
|
|||
CultureHelper.IsCompatibleCulture("en-US", "en").ShouldBeFalse(); |
|||
CultureHelper.IsCompatibleCulture("en-US", "en-GB").ShouldBeFalse(); |
|||
|
|||
CultureHelper.IsCompatibleCulture("zh", "zh-CN").ShouldBeTrue(); |
|||
CultureHelper.IsCompatibleCulture("zh", "zh-HK").ShouldBeTrue(); |
|||
CultureHelper.IsCompatibleCulture("zh", "zh-MO").ShouldBeTrue(); |
|||
CultureHelper.IsCompatibleCulture("zh", "zh-SG").ShouldBeTrue(); |
|||
CultureHelper.IsCompatibleCulture("zh", "zh-TW").ShouldBeTrue(); |
|||
CultureHelper.IsCompatibleCulture("zh", "zh-Hans").ShouldBeTrue(); |
|||
CultureHelper.IsCompatibleCulture("zh", "zh-Hant").ShouldBeTrue(); |
|||
CultureHelper.IsCompatibleCulture("zh-Hans", "zh-CN").ShouldBeTrue(); |
|||
CultureHelper.IsCompatibleCulture("zh-Hans", "zh-SG").ShouldBeTrue(); |
|||
CultureHelper.IsCompatibleCulture("zh-Hant", "zh-HK").ShouldBeTrue(); |
|||
CultureHelper.IsCompatibleCulture("zh-Hant", "zh-MO").ShouldBeTrue(); |
|||
CultureHelper.IsCompatibleCulture("zh-Hant", "zh-TW").ShouldBeTrue(); |
|||
|
|||
CultureHelper.IsCompatibleCulture("zh-Hans", "zh-HK").ShouldBeFalse(); |
|||
CultureHelper.IsCompatibleCulture("zh-Hant", "zh-SG").ShouldBeFalse(); |
|||
} |
|||
} |
|||
@ -0,0 +1,62 @@ |
|||
using System.Threading.Tasks; |
|||
using Microsoft.Extensions.Localization; |
|||
using Shouldly; |
|||
using Volo.Abp.DynamicProxy; |
|||
using Volo.Abp.Testing; |
|||
using Xunit; |
|||
|
|||
namespace Volo.Abp.Localization; |
|||
|
|||
public class AbpStringLocalizerFactory_Tests : AbpIntegratedTest<AbpLocalizationTestModule> |
|||
{ |
|||
private readonly IStringLocalizerFactory _factory; |
|||
|
|||
public AbpStringLocalizerFactory_Tests() |
|||
{ |
|||
_factory = GetRequiredService<IStringLocalizerFactory>(); |
|||
} |
|||
|
|||
[Fact] |
|||
public void Factory_Type_Should_Be_AbpStringLocalizerFactory() |
|||
{ |
|||
ProxyHelper.UnProxy(_factory).ShouldBeOfType<AbpStringLocalizerFactory>(); |
|||
} |
|||
|
|||
[Fact] |
|||
public void Should_Create_Resource_By_Name() |
|||
{ |
|||
using (CultureHelper.Use("en")) |
|||
{ |
|||
var localizer = _factory.CreateByResourceNameOrNull("Test"); |
|||
localizer.ShouldNotBeNull(); |
|||
localizer["CarPlural"].Value.ShouldBe("Cars"); |
|||
} |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Create_Resource_By_Name_Async() |
|||
{ |
|||
using (CultureHelper.Use("en")) |
|||
{ |
|||
var localizer = await _factory.CreateByResourceNameOrNullAsync("Test"); |
|||
localizer.ShouldNotBeNull(); |
|||
localizer["CarPlural"].Value.ShouldBe("Cars"); |
|||
} |
|||
} |
|||
|
|||
[Fact] |
|||
public void Should_Throw_Exception_For_Unknown_Resource_Names() |
|||
{ |
|||
Assert.Throws<AbpException>( |
|||
() => _factory.CreateByResourceName("UnknownResourceName") |
|||
); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Throw_Exception_For_Unknown_Resource_Names_Async() |
|||
{ |
|||
await Assert.ThrowsAsync<AbpException>( |
|||
async () => await _factory.CreateByResourceNameAsync("UnknownResourceName") |
|||
); |
|||
} |
|||
} |
|||
@ -1,6 +0,0 @@ |
|||
namespace Volo.Abp.Localization.TestResources.Base.CountryNames; |
|||
|
|||
public sealed class LocalizationTestCountryNamesResource |
|||
{ |
|||
|
|||
} |
|||
@ -0,0 +1,6 @@ |
|||
namespace Volo.Abp.FeatureManagement.Blazor.Components.FeatureSettingGroup; |
|||
|
|||
public class FeatureSettingViewModel |
|||
{ |
|||
public bool HasManageHostFeaturesPermission { get; set; } |
|||
} |
|||
Loading…
Reference in new issue