能否在ASP.NET MVC中重写Localizer("string")方法?
重写ASP.NET Core Localizer默认行为实现字符串转换
要在最小改动原有配置的前提下,给本地化字符串添加自定义转换(比如转大写),可以通过包装原生StringLocalizer的方式实现,无需从头实现整个本地化逻辑,完全复用原有resx加载机制。
步骤1:创建自定义泛型StringLocalizer
实现IStringLocalizer<T>接口,内部注入原生的IStringLocalizer<T>,在获取字符串的方法中嵌入自定义转换逻辑:
using Microsoft.Extensions.Localization; using System.Globalization; public class CustomStringLocalizer<T> : IStringLocalizer<T> { private readonly IStringLocalizer<T> _innerLocalizer; public CustomStringLocalizer(IStringLocalizer<T> innerLocalizer) { _innerLocalizer = innerLocalizer; } // 处理无参数的本地化字符串 public LocalizedString this[string name] { get { var original = _innerLocalizer[name]; return new LocalizedString(original.Name, TransformString(original.Value), original.ResourceNotFound, original.SearchedLocation); } } // 处理带参数的本地化字符串 public LocalizedString this[string name, params object[] arguments] { get { var original = _innerLocalizer[name, arguments]; return new LocalizedString(original.Name, TransformString(original.Value), original.ResourceNotFound, original.SearchedLocation); } } // 获取所有本地化字符串并统一转换 public IEnumerable<LocalizedString> GetAllStrings(bool includeParentCultures) { return _innerLocalizer.GetAllStrings(includeParentCultures) .Select(s => new LocalizedString(s.Name, TransformString(s.Value), s.ResourceNotFound, s.SearchedLocation)); } // 兼容过时的WithCulture方法(.NET Core 3.0+推荐直接使用CultureInfo.CurrentCulture) public IStringLocalizer WithCulture(CultureInfo culture) { var innerWithCulture = _innerLocalizer.WithCulture(culture); return new CustomStringLocalizer<T>(innerWithCulture as IStringLocalizer<T> ?? _innerLocalizer); } // 自定义转换逻辑,可修改为任意你需要的处理规则 private string TransformString(string value) { if (string.IsNullOrEmpty(value)) return value; // 示例:转大写,可替换为添加前缀、替换特定字符等逻辑 return value.ToUpper(); } }
步骤2:替换服务注册
在Program.cs中,保留原有AddViewLocalization配置的基础上,注册自定义的IStringLocalizer<T>以覆盖原生实现:
var builder = WebApplication.CreateBuilder(args); // 原有视图本地化配置保持不变 builder.Services.AddControllersWithViews() .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix); // 替换为自定义StringLocalizer builder.Services.AddTransient(typeof(IStringLocalizer<>), typeof(CustomStringLocalizer<>)); var app = builder.Build(); // 后续中间件配置...
效果验证
完成配置后,无论是控制器中注入IStringLocalizer<HomeController>,还是视图中使用@inject IViewLocalizer Localizer,获取到的本地化字符串都会自动应用TransformString中的转换逻辑。
例如resx文件中存储的"Welcome",通过Localizer["Welcome"]会返回"WELCOME"。
内容的提问来源于stack exchange,提问作者NibblyPig
相关产品推荐
相关产品推荐

