Microsoft.Extensions.Localization 多语言库的使用

93 阅读3分钟

在 ASP.NET Core Web API 中,官方推荐的多语言库是 Microsoft.Extensions.Localization,它通过资源文件(.resx)实现本地化,支持多语言内容的自动切换。你也可以使用第三方库如 Localization.AspNetCore,但大多数场景下官方库已足够。


用法举例(官方本地化库)

1. 安装 NuGet 包

ASP.NET Core 默认已集成,无需额外安装。如果需要,可以手动安装:

dotnet add package Microsoft.Extensions.Localization

2. 添加资源文件

在项目中添加资源文件,例如:

  • Resources/Controllers.HomeController.zh-CN.resx(中文)
  • Resources/Controllers.HomeController.en-US.resx(英文)

每个资源文件中定义同名的字符串键(如 Welcome),值为对应语言内容。

3. 注册本地化服务

Program.csStartup.cs 中添加:

builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");

4. 控制器中使用本地化

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;

[ApiController]
[Route("[controller]")]
public class HomeController : ControllerBase
{
    private readonly IStringLocalizer<HomeController> _localizer;

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

    [HttpGet("welcome")]
    public IActionResult Welcome()
    {
        var message = _localizer["Welcome"];
        return Ok(message);
    }
}

5. 设置请求语言

通过请求头 Accept-Language 控制返回语言。例如:

  • Accept-Language: zh-CN 返回中文
  • Accept-Language: en-US 返回英文

说明:

  • 资源文件按控制器和语言命名,内容自动切换。
  • 支持多语言内容的自动选择和扩展。
  • 适用于 API 返回多语言提示、错误信息等场景。

更多用法可参考官方文档:ASP.NET Core 本地化

在 ASP.NET Core Web API 项目中,Web API 本身无法直接访问前端的 localStorage,因为 localStorage 是浏览器端的存储机制。但你可以通过前端将当前语言(如 "zh-CN""en-US")保存到 localStorage,并在每次请求时通过 HTTP 请求头(如 Accept-Language)或自定义头部(如 X-Language)传递给后端,后端再根据该值切换语言。

下面是常见的实现方式:


1. 前端保存和发送语言

保存语言到 localStorage:

localStorage.setItem('lang', 'zh-CN');

每次请求时带上语言头:

const lang = localStorage.getItem('lang') || 'en-US';
fetch('/api/home/welcome', {
  headers: {
    'Accept-Language': lang
  }
});

2. 后端读取请求头并切换语言

在 ASP.NET Core Web API 中,可以通过中间件或配置自动读取 Accept-Language,无需手动处理。只需确保已注册本地化服务:

builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");

builder.Services.Configure<RequestLocalizationOptions>(options =>
{
    var supportedCultures = new[] { "en-US", "zh-CN" };
    options.SetDefaultCulture("en-US")
           .AddSupportedCultures(supportedCultures)
           .AddSupportedUICultures(supportedCultures);
});

Program.cs 添加中间件:

var app = builder.Build();

app.UseRequestLocalization();

app.MapControllers();
app.Run();

3. 控制器中使用本地化

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;

[ApiController]
[Route("[controller]")]
public class HomeController : ControllerBase
{
    private readonly IStringLocalizer<HomeController> _localizer;

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

    [HttpGet("welcome")]
    public IActionResult Welcome()
    {
        var message = _localizer["Welcome"];
        return Ok(message);
    }
}

总结:

  • 前端保存语言到 localStorage,并在请求时通过请求头传递。
  • 后端通过本地化中间件自动识别请求头并切换语言,无需手动解析 localStorage。
  • 这样即可实现手动切换语言的效果。

如需自定义头部(如 X-Language),可通过中间件读取并设置 CultureInfo.CurrentCulture,但推荐使用标准的 Accept-Language

你的理解是正确的。
在 ASP.NET Core 中,只要你注册了本地化服务并添加了 UseRequestLocalization() 中间件,框架就会自动根据请求头(如 Accept-Language)切换语言,无需手动解析或设置。你只需要:

  1. 注册本地化服务(AddLocalization)。
  2. 配置支持的语言(Configure<RequestLocalizationOptions>)。
  3. 在管道中添加 UseRequestLocalization()

这些步骤在标准项目模板或官方文档中都是推荐做法,并不是额外操作,而是本地化的标准流程
如果你只注册了本地化服务但没有添加 UseRequestLocalization(),则不会自动根据请求头切换语言。

本质区别:

  • 前端负责把语言信息通过请求头传递给后端。
  • 后端只需标准配置,ASP.NET Core 会自动识别和切换,无需你手动解析头部或设置语言。

所以,第二种方法里的配置其实就是 ASP.NET Core 的标准做法,和第一种前端传递语言信息是配套的,不是多余,也不是重复,而是必须的标准流程。