开箱即用的FluentValidation提供了很多种语言的默认错误消息。 默认情况下,将使用.NET框架当前UI文化中指定的语言(CultureInfo.CurrentUICulture)的错误消息。
因为每一个验证我们都是可以自定义错误消息的。所以我们可以直接在WithMessage哪边做多语化和本地化。
RuleFor(x => x.Surname).NotNull().WithMessage(x => MyLocalizedMessages.SurnameRequired);
如果我们使用了 本地化的服务类 IStringLocalizer 或者自己的 ILocalizationService 我们就可能用如下的方法来进行翻译
public class PersonValidator : AbstractValidator<Person>
{
public PersonValidator(IStringLocalizer<Person> localizer)
{
RuleFor(x => x.Surname).NotNull().WithMessage(x => localizer["Surname is required"]);
}
}
如果我们要替换所有(或部分)FluentValidation的默认消息,则可以通过实现ILanguageManager接口的自定义类来实现。
例如,NotNull验证器的默认消息为'' must not be Null.。如果要在应用程序中将此消息替换为NotNull验证器的所有用法,则可以编写自定义如下的类:
public class CustomLanguageManager : FluentValidation.Resources.LanguageManager
{
public CustomLanguageManager()
{
AddTranslation("zh-cn", "NotNullValidator", "'{PropertyName}' 不能为Null.");
}
}
然后在程序启动的的时候调用如下的代码
ValidatorOptions.Global.LanguageManager = new CustomLanguageManager();
我们可以完全禁用FluentValidation对本地化的支持,错误消息将变成默认的英语消息,而与线程的CurrentUICulture无关。 可以在程序启动的时候调用如下的代码来设置:
ValidatorOptions.Global.LanguageManager.Enabled = false;
ValidatorOptions.Global.LanguageManager.Culture = new CultureInfo("zh-cn");