如何在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
相关产品推荐
相关产品推荐

