diff --git a/framework/src/Volo.Abp.BlazoriseUI/AbpBlazoriseUIModule.cs b/framework/src/Volo.Abp.BlazoriseUI/AbpBlazoriseUIModule.cs index a18e584705..e413683a54 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/AbpBlazoriseUIModule.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/AbpBlazoriseUIModule.cs @@ -1,10 +1,12 @@ using Blazorise; +using Blazorise.Utilities; using Microsoft.AspNetCore.Components; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Volo.Abp.Application; using Volo.Abp.AspNetCore.Components.Web; using Volo.Abp.Authorization; +using Volo.Abp.BlazoriseUI.Utilities; using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; using Volo.Abp.Modularity; @@ -34,6 +36,7 @@ private void ConfigureBlazorise(ServiceConfigurationContext context) }); context.Services.Replace(ServiceDescriptor.Scoped()); + context.Services.Replace(ServiceDescriptor.Singleton()); context.Services.AddSingleton(typeof(AbpBlazorMessageLocalizerHelper<>)); } } diff --git a/framework/src/Volo.Abp.BlazoriseUI/Utilities/AbpValidationMessageLocalizerAttributeFinder.cs b/framework/src/Volo.Abp.BlazoriseUI/Utilities/AbpValidationMessageLocalizerAttributeFinder.cs new file mode 100644 index 0000000000..6a8a50639e --- /dev/null +++ b/framework/src/Volo.Abp.BlazoriseUI/Utilities/AbpValidationMessageLocalizerAttributeFinder.cs @@ -0,0 +1,52 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using Blazorise.Utilities; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.BlazoriseUI.Utilities; + +[Dependency(ReplaceServices = true)] +[ExposeServices(typeof(AbpValidationMessageLocalizerAttributeFinder), typeof(IValidationMessageLocalizerAttributeFinder))] +public class AbpValidationMessageLocalizerAttributeFinder : IValidationMessageLocalizerAttributeFinder, ISingletonDependency +{ + public IEnumerable<(string Index, string Argument)> FindAll(string first, string second) + { + if (string.IsNullOrEmpty(first) || string.IsNullOrEmpty(second)) + { + yield break; + } + + if (first == second) + { + yield break; + } + + const string placeholderPattern = @"\{(\d+)\}"; + var matches = Regex.Matches(second, placeholderPattern); + + if (matches.Count == 0) + { + yield break; + } + + var placeholderIndices = new List(); + foreach (Match match in matches) + { + placeholderIndices.Add(match.Groups[1].Value); + } + + var pattern = placeholderIndices.Aggregate(second, (current, index) => current.Replace("{" + index + "}", "(.+)")); + + var valueMatch = Regex.Match(first, pattern); + if (!valueMatch.Success) + { + yield break; + } + + for (var i = 0; i < placeholderIndices.Count && i + 1 < valueMatch.Groups.Count; i++) + { + yield return (placeholderIndices[i], valueMatch.Groups[i + 1].Value); + } + } +} \ No newline at end of file