Культура в веб-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;
}
}