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

如何在ASP.NET Core MVC .NET 6中给本地化字符串传递参数?

解决方案

1. 调整模型的特性配置

不要在Required特性中硬写错误消息,而是配合[Display]特性指定字段的显示名称,让错误消息中的{0}占位符对应这个显示名:

using System.ComponentModel.DataAnnotations;

namespace aaeamis.Models
{
    public class OrganizationModel
    {
        public int OrganizationId { get; set; }

        [Display(Name = "Organization Name")]
        [Required(ErrorMessage = "The {0} field is required")]
        public string OrganizationName { get; set; }

        [Display(Name = "Location")]
        [Required(ErrorMessage = "The {0} field is required")]
        public string Location { get; set; }

        public int CreatedBy { get; set; }
        public DateTime CreatedAt { get; set; } = DateTime.Now;
    }
}

2. 实现支持参数格式化的PO本地化服务

确保你的PO文件读取逻辑能处理带占位符的翻译字符串,在获取到翻译文本后,用传入的参数填充占位符:

public class PoLocalizationService
{
    // 假设你已经实现了从PO文件读取翻译的逻辑
    private readonly Dictionary<string, string> _translations;

    public PoLocalizationService()
    {
        // 初始化读取PO文件到_translations字典
        _translations = LoadPoTranslations();
    }

    public string GetLocalizedText(string key, params object[] args)
    {
        if (_translations.TryGetValue(key, out var translatedText))
        {
            return args.Length > 0 ? string.Format(translatedText, args) : translatedText;
        }
        // 找不到翻译时返回原键
        return key;
    }

    private Dictionary<string, string> LoadPoTranslations()
    {
        // 这里写读取PO文件的逻辑,比如解析msgid和msgstr
        return new Dictionary<string, string>
        {
            {"The {0} field is required", "موجودیت {0} لازمی میباشد"}
        };
    }
}

3. 替换默认验证适配器,注入本地化逻辑

ASP.NET MVC默认的验证消息处理不会自动调用你的本地化服务,需要自定义验证适配器提供器来对接:

public class LocalizedValidationAdapterProvider : IValidationAttributeAdapterProvider
{
    private readonly IValidationAttributeAdapterProvider _defaultProvider = new DataAnnotationsValidationAttributeAdapterProvider();
    private readonly PoLocalizationService _localizationService;

    public LocalizedValidationAdapterProvider(PoLocalizationService localizationService)
    {
        _localizationService = localizationService;
    }

    public IAttributeAdapter GetAdapter(ValidationAttribute attribute, IStringLocalizer stringLocalizer)
    {
        var adapter = _defaultProvider.GetAdapter(attribute, stringLocalizer);
        
        if (attribute is RequiredAttribute requiredAttr)
        {
            // 重写错误消息生成逻辑,传入字段显示名作为参数
            requiredAttr.ErrorMessage = context =>
            {
                var fieldName = context.ModelMetadata.DisplayName;
                return _localizationService.GetLocalizedText("The {0} field is required", fieldName);
            };
        }

        return adapter;
    }
}

在Startup中注册服务

将自定义的本地化服务和验证适配器注册到依赖注入容器:

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<PoLocalizationService>();
    services.AddSingleton<IValidationAttributeAdapterProvider, LocalizedValidationAdapterProvider>();
    
    services.AddControllersWithViews();
}

4. 确认PO文件格式

保持PO文件中的占位符与代码一致:

msgid "The {0} field is required"
msgstr[0] "موجودیت {0} لازمی میباشد"

这样配置后,当模型验证触发必填项错误时,系统会自动将[Display(Name)]指定的字段名传入本地化服务,替换翻译文本中的{0}占位符,输出正确的本地化错误消息。

内容的提问来源于stack exchange,提问作者Najeeb Anwari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:15:36