Browse Source

Add `AbpEnumLocalizer`.

pull/15271/head
maliming 3 years ago
parent
commit
3973ea1db9
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 25
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelperService.cs
  2. 3
      framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs
  3. 1
      framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/EnumHelper.cs
  4. 4
      framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/ExtensionPropertyComponentBase.cs
  5. 2
      framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/SelectExtensionProperty.razor.cs
  6. 67
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpEnumLocalizer.cs
  7. 4
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpInternalLocalizationHelper.cs
  8. 11
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/IAbpEnumLocalizer.cs
  9. 47
      framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpEnumLocalizer_Tests.cs
  10. 6
      framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalizationTestModule.cs
  11. 9
      framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/Validation/en.json
  12. 9
      framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/en.json

25
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelperService.cs

@ -22,17 +22,20 @@ public class AbpSelectTagHelperService : AbpTagHelperService<AbpSelectTagHelper>
private readonly HtmlEncoder _encoder;
private readonly IAbpTagHelperLocalizer _tagHelperLocalizer;
private readonly IStringLocalizerFactory _stringLocalizerFactory;
private readonly IAbpEnumLocalizer _abpEnumLocalizer;
public AbpSelectTagHelperService(
IHtmlGenerator generator,
HtmlEncoder encoder,
IAbpTagHelperLocalizer tagHelperLocalizer,
IStringLocalizerFactory stringLocalizerFactory)
IStringLocalizerFactory stringLocalizerFactory,
IAbpEnumLocalizer abpEnumLocalizer)
{
_generator = generator;
_encoder = encoder;
_tagHelperLocalizer = tagHelperLocalizer;
_stringLocalizerFactory = stringLocalizerFactory;
_abpEnumLocalizer = abpEnumLocalizer;
}
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
@ -264,24 +267,12 @@ public class AbpSelectTagHelperService : AbpTagHelperService<AbpSelectTagHelper>
foreach (var enumValue in enumType.GetEnumValues())
{
var memberName = enumType.GetEnumName(enumValue);
var localizedMemberName = AbpInternalLocalizationHelper.LocalizeWithFallback(
var localizedMemberName = _abpEnumLocalizer.GetString(enumType, enumValue,
new[]
{
containerLocalizer,
_stringLocalizerFactory.CreateDefaultOrNull()
},
new[]
{
$"Enum:{enumType.Name}.{enumValue}",
$"Enum:{enumType.Name}.{memberName}",
$"{enumType.Name}.{enumValue}",
$"{enumType.Name}.{memberName}",
memberName
},
memberName
);
containerLocalizer,
_stringLocalizerFactory.CreateDefaultOrNull()
});
selectItems.Add(new SelectListItem
{
Value = enumValue.ToString(),

3
framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs

@ -176,6 +176,7 @@ public abstract class AbpCrudPageBase<
{
[Inject] protected TAppService AppService { get; set; }
[Inject] protected IStringLocalizer<AbpUiResource> UiLocalizer { get; set; }
[Inject] public IAbpEnumLocalizer AbpEnumLocalizer { get; set; }
protected virtual int PageSize { get; } = LimitedResultRequestDto.DefaultMaxResultCount;
@ -626,7 +627,7 @@ public abstract class AbpCrudPageBase<
if (propertyInfo.Type.IsEnum)
{
column.ValueConverter = (val) =>
EnumHelper.GetLocalizedMemberName(propertyInfo.Type, val.As<ExtensibleObject>().ExtraProperties[propertyInfo.Name], StringLocalizerFactory);
AbpEnumLocalizer.GetString(propertyInfo.Type, val.As<ExtensibleObject>().ExtraProperties[propertyInfo.Name], new IStringLocalizer[]{ StringLocalizerFactory.CreateDefaultOrNull() });
}
yield return column;

1
framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/EnumHelper.cs

@ -10,6 +10,7 @@ namespace Volo.Abp.BlazoriseUI.Components.ObjectExtending;
public static class EnumHelper
{
[Obsolete("Use IAbpEnumLocalizer instead.")]
public static string GetLocalizedMemberName(Type enumType, object value, IStringLocalizerFactory stringLocalizerFactory)
{
var memberName = enumType.GetEnumName(value);

4
framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/ExtensionPropertyComponentBase.cs

@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Localization;
using Volo.Abp.AspNetCore.Components.Web;
using Volo.Abp.Data;
using Volo.Abp.Localization;
using Volo.Abp.ObjectExtending;
namespace Volo.Abp.BlazoriseUI.Components.ObjectExtending;
@ -17,6 +18,9 @@ public abstract class ExtensionPropertyComponentBase<TEntity, TResourceType> : O
[Inject]
public IStringLocalizerFactory StringLocalizerFactory { get; set; }
[Inject]
public IAbpEnumLocalizer AbpEnumLocalizer { get; set; }
[Inject]
public IValidationMessageLocalizerAttributeFinder ValidationMessageLocalizerAttributeFinder { get; set; }

2
framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/SelectExtensionProperty.razor.cs

@ -30,7 +30,7 @@ public partial class SelectExtensionProperty<TEntity, TResourceType>
selectItems.Add(new SelectItem<int>
{
Value = (int)enumValue,
Text = EnumHelper.GetLocalizedMemberName(PropertyInfo.Type, enumValue, StringLocalizerFactory)
Text = AbpEnumLocalizer.GetString(PropertyInfo.Type, enumValue, new []{ StringLocalizerFactory.CreateDefaultOrNull() })
});
}

67
framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpEnumLocalizer.cs

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

4
framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpInternalLocalizationHelper.cs

@ -1,4 +1,5 @@
using Microsoft.Extensions.Localization;
using System;
using Microsoft.Extensions.Localization;
namespace Volo.Abp.Localization;
@ -22,6 +23,7 @@ public static class AbpInternalLocalizationHelper
/// Return value if none of the localizers has none of the keys.
/// </param>
/// <returns></returns>
[Obsolete("Use IAbpEnumLocalizer instead.")]
public static string LocalizeWithFallback(
IStringLocalizer[] localizers,
string[] keys,

11
framework/src/Volo.Abp.Localization/Volo/Abp/Localization/IAbpEnumLocalizer.cs

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

47
framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpEnumLocalizer_Tests.cs

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

6
framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalizationTestModule.cs

@ -19,6 +19,8 @@ public class AbpLocalizationTestModule : AbpModule
Configure<AbpLocalizationOptions>(options =>
{
options.DefaultResourceType = typeof(LocalizationTestResource);
options.Resources
.Add<LocalizationTestValidationResource>("en")
.AddVirtualJson("/Volo/Abp/Localization/TestResources/Base/Validation");
@ -35,8 +37,8 @@ public class AbpLocalizationTestModule : AbpModule
options.Resources
.Get<LocalizationTestResource>()
.AddVirtualJson("/Volo/Abp/Localization/TestResources/SourceExt");
options.GlobalContributors.Add<TestExternalLocalizationContributor>();
});
}
}
}

9
framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/Validation/en.json

@ -2,6 +2,11 @@
"culture": "en",
"texts": {
"ThisFieldIsRequired": "This field is required",
"MaxLenghtErrorMessage": "This field can be maximum of '{0}' chars"
"MaxLenghtErrorMessage": "This field can be maximum of '{0}' chars",
"Enum:BookType.Undefined": "Undefined from ValidationResource",
"Enum:BookType.0": "Undefined with value 0 from ValidationResource",
"BookType.Adventure": "Adventure from ValidationResource",
"BookType.1": "Adventure with value 1 from ValidationResource",
"Biography": "Biography from ValidationResource"
}
}
}

9
framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/en.json

@ -6,6 +6,11 @@
"CarPlural": "Cars",
"MaxLenghtErrorMessage": "This field's length can be maximum of '{0}' chars",
"Universe": "Universe",
"FortyTwo": "Forty Two"
"FortyTwo": "Forty Two",
"Enum:BookType.Undefined": "Undefined",
"Enum:BookType.0": "Undefined with value 0",
"BookType.Adventure": "Adventure",
"BookType.1": "Adventure with value 1",
"Biography": "Biography"
}
}
}

Loading…
Cancel
Save