我有一个Web API,在global.asax中,我将文化设置如下:
protected void Application_PostAuthenticateRequest()
{
var culture = CultureInfo.CreateSpecificCulture("nl-BE");
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
}
我已经添加了.NET nuget的Fluent Validation,因此在bin文件夹中,我有/nl/FluentValidation.resources.dll。
接下来,我有一个验证器,如:
public class AddWeightCommandValidator : AbstractValidator<AddWeightCommand>
{
public AddWeightCommandValidator()
{
RuleFor(command => command.PatientId).GreaterThan(0);
RuleFor(command => command.WeightValue).InclusiveBetween(20, 200);
}
}
这是从我的命令中调用的,例如:
new AddWeightCommandValidator().ValidateAndThrow(request);
问题是验证消息仍然是英语而不是荷兰语。
如果我进行调试,则在调用验证程序之前,立即在CurrentUICulture和CurrentCulture上正确设置区域性。
有人知道我在做什么错吗?
最佳答案
感谢Stijn的技巧,我开始研究如何使用自己的资源进行Fluent Validation,这就是我的方法。
在global.asax中,设置了区域性,并根据该区域性设置了Fluent Validation的资源提供者类型:
protected void Application_PostAuthenticateRequest()
{
// Set culture
var culture = CultureInfo.CreateSpecificCulture("nl-BE");
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
// Set Fluent Validation resource based on culture
switch (Thread.CurrentThread.CurrentUICulture.ToString())
{
case "nl-BE":
ValidatorOptions.ResourceProviderType = typeof(Prim.Mgp.Infrastructure.Resources.nl_BE);
break;
}
}
此后,Fluent验证将在适当的资源文件中查找翻译。
资源文件位于单独的项目中。在此,定义了所有Fluent Validation密钥,例如inclusivebetween_error等。此外,在其中定义了各种属性(如WeightValue)。
最后,在验证器中,WithLocalizedName用于本地化属性名称:
RuleFor(command => command.WeightValue).InclusiveBetween(20, 200).WithLocalizedName(() => Prim.Mgp.Infrastructure.Resources.nl_BE.WeightValue);