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

ASP.NET Core MVC单套多语言.resx文件本地化实现求助

实现ASP.NET Core MVC全站单套.resx文件本地化

1. 创建全局资源文件

在项目根目录新建Resources文件夹,创建统一命名的资源文件:

  • 默认语言资源:SharedResources.resx(例如作为中文默认资源)
  • 其他语言资源:SharedResources.en-US.resx、SharedResources.ja-JP.resx等,命名规则为[统一前缀].[语言代码].resx,前缀保持一致(这里用SharedResources作为全局资源标识)。

2. 配置本地化服务

修改Program.cs,替换原有的控制器/视图本地化配置,改为全局资源模式:

// 添加本地化服务,指定资源文件存放路径
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");

builder.Services.AddControllersWithViews()
    // 启用视图本地化(若不需要按视图后缀匹配资源可忽略,但保留不影响全局资源使用)
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
    // 配置数据注解验证提示使用全局资源
    .AddDataAnnotationsLocalization(options =>
    {
        options.DataAnnotationLocalizerProvider = (type, factory) =>
            factory.Create(typeof(SharedResources));
    });

// 定义项目支持的语言列表
var supportedCultures = new[]
{
    new CultureInfo("zh-CN"),
    new CultureInfo("en-US"),
    // 按需添加更多语言
};

// 配置请求本地化规则
app.UseRequestLocalization(new RequestLocalizationOptions
{
    DefaultRequestCulture = new RequestCulture("zh-CN"),
    SupportedCultures = supportedCultures,
    SupportedUICultures = supportedCultures
});

3. 在视图中使用全局资源

无需为每个视图单独创建resx,直接注入全局字符串本地化器即可:

@inject IStringLocalizer<SharedResources> Localizer

<div class="page-content">
    <h1>@Localizer["SiteMainTitle"]</h1>
    <p>@Localizer["WelcomeMessage"]</p>
    <button type="submit">@Localizer["SubmitBtnText"]</button>
</div>

4. 在控制器中使用全局资源

通过构造函数注入全局本地化器,直接调用资源键获取对应语言文本:

using Microsoft.Extensions.Localization;

public class HomeController : Controller
{
    private readonly IStringLocalizer<SharedResources> _localizer;

    public HomeController(IStringLocalizer<SharedResources> localizer)
    {
        _localizer = localizer;
    }

    public IActionResult Index()
    {
        ViewData["PageTitle"] = _localizer["HomePageTitle"];
        return View();
    }
}

5. 数据注解本地化支持

模型验证的提示文本会自动读取全局资源,只需在resx中添加对应键值对:

public class UserFormModel
{
    [Required(ErrorMessage = "FieldRequired")]
    [Display(Name = "UserNameLabel")]
    public string UserName { get; set; }
}

在SharedResources.resx中配置:

  • 键:FieldRequired,值:此字段为必填项
  • 键:UserNameLabel,值:用户名

核心优势

  • 全站仅维护一套多语言资源文件,新增语言只需添加对应后缀的resx文件
  • 控制器、视图、数据注解共享同一资源池,避免重复维护
  • 资源键统一管理,减少命名冲突和维护成本

内容的提问来源于stack exchange,提问作者Flaubert TAGU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 05:43:24