Культура в веб-API не используется FluentValidation

У меня есть веб-API, и в global.asax я устанавливаю следующую культуру:

protected void Application_PostAuthenticateRequest()
{
  var culture = CultureInfo.CreateSpecificCulture("nl-BE");
  Thread.CurrentThread.CurrentCulture = culture;
  Thread.CurrentThread.CurrentUICulture = culture;
}

Я добавил Fluent Validation для.NET nuget, и поэтому в папке 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.

У кого-нибудь есть идея, что я делаю не так?

2 ответа

Решение

Благодаря совету Стейна я начал изучать, как я могу использовать свои собственные ресурсы для быстрой проверки, и вот как я это сделал.

В 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 Validation будет искать переводы в соответствующем файле ресурсов.

Файлы ресурсов находятся в отдельном проекте. Здесь все ключи Fluent Validation определены, как inclusivebetween_error и т. Д. Кроме того, там определены различные свойства, такие как WeightValue.

Наконец, в валидаторе WithLocalizedName используется для локализации имен свойств:

RuleFor(command => command.WeightValue).InclusiveBetween(20, 200).WithLocalizedName(() => Prim.Mgp.Infrastructure.Resources.nl_BE.WeightValue);       

я использовал этот код

       RuleFor(rule => rule.CultureName).Must(BeValidateCultureInfo).WithMessage(errorMessage => string.Format(CultureNameInvalidMessage, errorMessage.Locale));

  private bool BeValidateCultureInfo(string locale)
{
    if (string.IsNullOrWhiteSpace(locale))
        return true;
    try
    {
        var cultureInfo = CultureInfo.GetCultureInfo(locale);
        return true;
    }
    catch 
    {
        return false;
    }
}
Другие вопросы по тегам