mirror of https://github.com/abpframework/abp.git
12 changed files with 162 additions and 26 deletions
@ -0,0 +1,67 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using Microsoft.Extensions.Localization; |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace Volo.Abp.Localization; |
|||
|
|||
public class AbpEnumLocalizer : IAbpEnumLocalizer, ISingletonDependency |
|||
{ |
|||
protected readonly IStringLocalizerFactory StringLocalizerFactory; |
|||
|
|||
public AbpEnumLocalizer(IStringLocalizerFactory stringLocalizerFactory) |
|||
{ |
|||
StringLocalizerFactory = stringLocalizerFactory; |
|||
} |
|||
|
|||
public virtual string GetString(Type enumType, object enumValue) |
|||
{ |
|||
return GetStringInternal(enumType, enumValue, StringLocalizerFactory.CreateDefaultOrNull()); |
|||
} |
|||
|
|||
public virtual string GetString(Type enumType, object enumValue, params IStringLocalizer[] specifyLocalizers) |
|||
{ |
|||
return GetStringInternal(enumType, enumValue, specifyLocalizers); |
|||
} |
|||
|
|||
protected virtual string GetStringInternal(Type enumType, object enumValue, params IStringLocalizer[] specifyLocalizers) |
|||
{ |
|||
var memberName = enumType.GetEnumName(enumValue); |
|||
var localizedString = GetStringOrNull( |
|||
specifyLocalizers, |
|||
new[] |
|||
{ |
|||
$"Enum:{enumType.Name}.{enumValue}", |
|||
$"Enum:{enumType.Name}.{memberName}", |
|||
$"{enumType.Name}.{enumValue}", |
|||
$"{enumType.Name}.{memberName}", |
|||
memberName |
|||
} |
|||
); |
|||
|
|||
return localizedString ?? memberName; |
|||
} |
|||
|
|||
protected virtual string GetStringOrNull(IStringLocalizer[] localizers, IEnumerable<string> keys) |
|||
{ |
|||
foreach (var key in keys) |
|||
{ |
|||
foreach (var l in localizers) |
|||
{ |
|||
if (l == null) |
|||
{ |
|||
continue; |
|||
} |
|||
|
|||
var localizedString = l[key]; |
|||
if (!localizedString.ResourceNotFound) |
|||
{ |
|||
return localizedString.Value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
return null; |
|||
} |
|||
} |
|||
@ -0,0 +1,11 @@ |
|||
using System; |
|||
using Microsoft.Extensions.Localization; |
|||
|
|||
namespace Volo.Abp.Localization; |
|||
|
|||
public interface IAbpEnumLocalizer |
|||
{ |
|||
string GetString(Type enumType, object enumValue); |
|||
|
|||
string GetString(Type enumType, object enumValue, IStringLocalizer[] specifyLocalizers); |
|||
} |
|||
@ -0,0 +1,47 @@ |
|||
using Microsoft.Extensions.Localization; |
|||
using Shouldly; |
|||
using Volo.Abp.Localization.TestResources.Base.Validation; |
|||
using Volo.Abp.Testing; |
|||
using Xunit; |
|||
|
|||
namespace Volo.Abp.Localization; |
|||
|
|||
public class AbpEnumLocalizer_Tests : AbpIntegratedTest<AbpLocalizationTestModule> |
|||
{ |
|||
private readonly IAbpEnumLocalizer _enumLocalizer; |
|||
|
|||
public AbpEnumLocalizer_Tests() |
|||
{ |
|||
_enumLocalizer = GetRequiredService<IAbpEnumLocalizer>(); |
|||
} |
|||
|
|||
[Fact] |
|||
public void GetString_Test() |
|||
{ |
|||
using (CultureHelper.Use("en")) |
|||
{ |
|||
_enumLocalizer.GetString(typeof(BookType), BookType.Undefined).ShouldBe("Undefined"); |
|||
_enumLocalizer.GetString(typeof(BookType), BookType.Adventure).ShouldBe("Adventure"); |
|||
_enumLocalizer.GetString(typeof(BookType), 0).ShouldBe("Undefined with value 0"); |
|||
_enumLocalizer.GetString(typeof(BookType), 1).ShouldBe("Adventure with value 1"); |
|||
_enumLocalizer.GetString(typeof(BookType), BookType.Biography).ShouldBe("Biography"); |
|||
|
|||
var specifyLocalizer = new[] |
|||
{ |
|||
GetRequiredService<IStringLocalizerFactory>().Create<LocalizationTestValidationResource>() |
|||
}; |
|||
_enumLocalizer.GetString(typeof(BookType), BookType.Undefined, specifyLocalizer).ShouldBe("Undefined from ValidationResource"); |
|||
_enumLocalizer.GetString(typeof(BookType), BookType.Adventure, specifyLocalizer).ShouldBe("Adventure from ValidationResource"); |
|||
_enumLocalizer.GetString(typeof(BookType), 0, specifyLocalizer).ShouldBe("Undefined with value 0 from ValidationResource"); |
|||
_enumLocalizer.GetString(typeof(BookType), 1, specifyLocalizer).ShouldBe("Adventure with value 1 from ValidationResource"); |
|||
_enumLocalizer.GetString(typeof(BookType), BookType.Biography, specifyLocalizer).ShouldBe("Biography from ValidationResource"); |
|||
} |
|||
} |
|||
} |
|||
|
|||
enum BookType |
|||
{ |
|||
Undefined, |
|||
Adventure, |
|||
Biography, |
|||
} |
|||
Loading…
Reference in new issue