微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Blazor WebAssembly 客户端数据注释本地化 示例属性法语输出示例

如何解决Blazor WebAssembly 客户端数据注释本地化 示例属性法语输出示例

Asp.net 核心服务器端本地化有很好的文档记录并且对我有用。但是如何在 Blazor webassembly 客户端的 DTO 模型上本地化 DataAnnotations?

在服务器端,我添加了下面的代码并且 DataAnnotations 已本地化。一切都按预期工作。

...
services
.AddRazorPages()              .AddViewLocalization(Microsoft.AspNetCore.Mvc.Razor.LanguageViewLocationExpanderFormat.Suffix)
                .AddDataAnnotationsLocalization(
                    options =>
                    {
                        options.DataAnnotationLocalizerProvider = (type,factory) =>
                        {
                            return factory.Create(typeof(CommonStrings));
                        };

                    });
...

但是我如何在 Blazor 客户端(webassembly)上做同样的事情? 例如,我有这个位于客户端的模型:

public class ApplicationUserDTO
    {
        public string Id { get; set; }

        [required(ErrorMessage ="Field {0} is required")]
        [display(Name ="First name")]
        public string FirstName { get; set; }

        [required]
        [display(Name = "Last name")]
        public string LastName { get; set; }

        [required]
        [display(Name = "Email")]
        public string Email { get; set; }

        [required]
        [display(Name = "Username")]
        public string Username { get; set; }


    }

我想通过 <EditForm> 组件将其发布到后端,然后在客户端进行验证。 我还想像在 aspnet.core 服务器上一样对其进行本地化 - 错误/验证消息和显示名称...

我尝试使用 LocalizedValidator 组件:

    public class MessageValidatorBase<TValue> : ComponentBase,Idisposable
    {
        private FieldIdentifier _fieldIdentifier;
        private EventHandler<ValidationStateChangedEventArgs> _stateChangedHandler
            => (sender,args) => StateHasChanged();
        [CascadingParameter]
        private EditContext EditContext { get; set; }
        [Parameter]
        public Expression<Func<TValue>> For { get; set; }
        [Parameter]
        public string Class { get; set; }
        protected IEnumerable<string> ValidationMessages =>
            EditContext.GetValidationMessages(_fieldIdentifier);
        protected override void OnInitialized()
        {
            _fieldIdentifier = FieldIdentifier.Create(For);
            EditContext.OnValidationStateChanged += _stateChangedHandler;
        }
        public void dispose()
        {
            EditContext.OnValidationStateChanged -= _stateChangedHandler;
        }
    }

然后创建组件:

@typeparam TValue
@inherits MessageValidatorBase<TValue>
@inject StringLocalizationService _localizer
@foreach (var message in ValidationMessages)
{
    <div class="@Class">
        @_localizer[message]
        
    </div>
}

但问题是我已经在这里得到扩展的字符串。例如,如果我有这样的错误消息“字段 {0} 是必需的”我得到“字段名字是必需的”,它不会被本地化,因为我没有该键的资源,我不打算为每个属性名称翻译相同的错误消息...

[编辑] 我只是想知道是否有一些琐碎的事情我没有做,而不是完全自己实现

解决方法

WebAssembly 示例。

示例属性

[MaxLength(5,ErrorMessageResourceName = "LengthError",ErrorMessageResourceType = typeof(Resources.App))]
public string Prefix { get; set; }

在您的客户端中创建一个名为 Resources 的文件夹。 为每种语言添加一个 `.resx' 文件以及一个默认值(无语言)。

enter image description here

确保您将访问修饰符设置为 Public enter image description here

法语输出示例。

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。