Blazor WebAssembly 客户端数据注释本地化
Blazor WebAssembly Client DataAnnotations Localization
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; }
}
我想 post 它通过 <EditForm>
组件后端,在我这样做之前在客户端进行验证。
我还想像在 aspnet.core 服务器上一样对其进行本地化 - Error/validation 消息和显示名称...
我尝试使用 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”文件以及一个默认文件(无语言)。
确保将访问修饰符设置为 Public
法语输出示例。
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; }
}
我想 post 它通过 <EditForm>
组件后端,在我这样做之前在客户端进行验证。
我还想像在 aspnet.core 服务器上一样对其进行本地化 - Error/validation 消息和显示名称...
我尝试使用 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”文件以及一个默认文件(无语言)。
确保将访问修饰符设置为 Public