You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 01:15:31