如何用FluentValidation返回多语言验证消息并适配Language属性?
解决方案
一、返回包含FR/EN的多语言验证消息字典
如果需要返回示例格式的多语言错误字典,可以在验证完成后,手动为目标属性构建对应语言的消息集合:
首先定义多语言消息映射:
private static readonly Dictionary<string, string> FirstNameRequiredMessages = new Dictionary<string, string> { {"FR", "Erreur"}, {"EN", "Error"} };
然后执行验证并生成结果字典:
var customer = new Customer(); var validator = new CustomerValidator(); var validationResult = validator.Validate(customer); if (!validationResult.IsValid) { var multiLangErrors = new Dictionary<string, string>(); // 针对FirstName的非空错误构建多语言消息 if (validationResult.Errors.Any(e => e.PropertyName == nameof(Customer.FirstName))) { multiLangErrors.Add("FR", FirstNameRequiredMessages["FR"]); multiLangErrors.Add("EN", FirstNameRequiredMessages["EN"]); } // 后续可将multiLangErrors序列化为JSON返回 }
二、根据实体的Language属性返回对应语言的消息
要实现根据实体自身Language属性动态返回对应语言的验证消息,可使用WithMessage的重载方法,直接访问当前验证的实体对象:
修改CustomerValidator类:
public class CustomerValidator : AbstractValidator<Customer> { private static readonly Dictionary<string, string> _firstNameRequiredMessages = new Dictionary<string, string> { {"FR", "Erreur"}, {"EN", "Error"} }; public CustomerValidator() { RuleFor(x => x.FirstName) .NotEmpty() .WithMessage((customer, _) => _firstNameRequiredMessages.TryGetValue(customer.Language, out var msg) ? msg : _firstNameRequiredMessages["EN"]); // 未知语言默认返回英文 } }
使用示例:
// 法语用户验证 var frCustomer = new Customer { Language = "FR" }; var frResult = new CustomerValidator().Validate(frCustomer); // 错误消息为"Erreur" // 英语用户验证 var enCustomer = new Customer { Language = "EN" }; var enResult = new CustomerValidator().Validate(enCustomer); // 错误消息为"Error" // 未知语言用户验证 var unknownCustomer = new Customer { Language = "DE" }; var unknownResult = new CustomerValidator().Validate(unknownCustomer); // 错误消息为默认英文"Error"
如果需要更规范的本地化管理,可使用.resx资源文件配合ResourceManager获取对应文化的消息,避免硬编码字典:
private static readonly ResourceManager _resourceManager = new ResourceManager(typeof(CustomerValidationMessages)); public CustomerValidator() { RuleFor(x => x.FirstName) .NotEmpty() .WithMessage((customer, _) => { var targetCulture = new CultureInfo(customer.Language); return _resourceManager.GetString(nameof(CustomerValidationMessages.FirstNameRequired), targetCulture) ?? _resourceManager.GetString(nameof(CustomerValidationMessages.FirstNameRequired), new CultureInfo("EN")); }); }
内容的提问来源于stack exchange,提问作者TheBoubou
相关产品推荐
相关产品推荐

