如何在静态方法中使用XLocalizer翻译验证提示信息
使用XLocalizer翻译扩展方法中的错误提示
核心实现思路
要完成错误提示的翻译,需在扩展方法中获取IXLocalizer服务实例,通过它处理消息本地化,同时兼顾属性自定义错误消息与默认提示的翻译逻辑。
修改后的完整代码
using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.ViewFeatures; using System.Linq.Expressions; using System.Reflection; using XLocalizer; using XLocalizer.ErrorMessages; public static class HtmlHelperExtensions { public static IHtmlContent InvalidTooltipFor<TModel, TResult>(this IHtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TResult>> expression) { var builder = new HtmlContentBuilder(); var memberExpression = (MemberExpression)expression.Body; var property = typeof(TModel).GetProperty(memberExpression.Member.Name); if (property == null) return builder; // 从请求服务容器中获取XLocalizer实例 var localizer = htmlHelper.ViewContext.HttpContext.RequestServices.GetService<IXLocalizer<SharedResource>>(); // 若未使用自定义资源类,可改用全局XLocalizer: // var localizer = htmlHelper.ViewContext.HttpContext.RequestServices.GetService<IXLocalizer>(); // 获取属性的显示名称(优先取DisplayAttribute配置的名称并翻译) var displayName = memberExpression.Member.Name; var displayAttr = property.GetCustomAttributes(typeof(DisplayAttribute), true).FirstOrDefault() as DisplayAttribute; if (displayAttr != null && !string.IsNullOrEmpty(displayAttr.Name)) { displayName = localizer[displayAttr.Name]; } // 处理RequiredAttribute的错误消息翻译 var requiredAttr = property.GetCustomAttributes(typeof(RequiredAttribute), true).FirstOrDefault() as RequiredAttribute; if (requiredAttr != null) { string errorMessage; if (!string.IsNullOrEmpty(requiredAttr.ErrorMessage)) { // 翻译自定义错误消息,传入显示名称作为占位符参数 errorMessage = localizer[requiredAttr.ErrorMessage, displayName]; } else { // 翻译默认必填提示,替换占位符为显示名称 errorMessage = localizer[ErrorMessagesKeys.TheFieldIsRequired, displayName]; } builder.AppendHtml($"<div class=\"invalid-tooltip\">{errorMessage}</div>"); } return builder; } }
关键细节说明
- XLocalizer服务获取:通过
htmlHelper.ViewContext.HttpContext.RequestServices访问服务容器,解析对应资源类的IXLocalizer实例,保证本地化上下文正确。 - 显示名称优化:优先读取
DisplayAttribute配置的友好名称并翻译,替代生硬的属性名,提升用户体验。 - 错误消息翻译逻辑:
- 若属性配置了自定义
ErrorMessage,直接翻译该消息并传入显示名称填充占位符。 - 若使用默认提示,调用XLocalizer内置的
ErrorMessagesKeys.TheFieldIsRequired键,该键对应默认英文提示,会自动匹配你配置的中文翻译。
- 若属性配置了自定义
- 资源文件配置:需在对应中文资源文件(如
SharedResource.zh-CN.resx)中添加翻译条目,例如:
自定义错误消息也需在资源文件中添加对应的键值对。<data name="TheFieldIsRequired" xml:space="preserve"> <value>{0}字段为必填项。</value> </data>
内容的提问来源于stack exchange,提问作者jstuardo
相关产品推荐
相关产品推荐

