【问题标题】:Blazor WebAssembly Client DataAnnotations LocalizationBlazor WebAssembly 客户端数据注释本地化
【发布时间】:2021-01-06 21:08:05
【问题描述】:

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}”的错误消息,我会得到“需要字段名字”,因为我没有具有该键的资源并且我不打算进行本地化为每个属性名称翻译相同的错误消息...

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

【问题讨论】:

标签: localization client blazor data-annotations webassembly


【解决方案1】:

WebAssembly 示例。

示例属性

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

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

确保将访问修饰符设置为Public

法语输出示例。

【讨论】:

  • 我只想补充一点,如果你想本地化 DisplayAttribute,你必须避免 Name 属性中的空格。我有“名字”并且我收到错误“无法检索属性'名称',因为本地化失败。类型'Resources.Resource'不是公共的......”即使它是公共的并且“名字”键存在,尽快因为我有“名字”而不是一切都开始工作......
  • @Darftagan 这是将资源设置为公共的结果,这也指示编译器生成静态类。属性名称当然不能包含空格。为了解决这个问题,我使用单独的 .resx 文件进行数据注释。
  • 我同意。我只是提到它,以防有人拥有带有空格的键的资源。
猜你喜欢
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 2022-06-19
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
相关资源
最近更新 更多