我有一个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);

10-08 14:06