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

能否在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:40:26