在 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.cs 或 Startup.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)切换语言,无需手动解析或设置。你只需要:
- 注册本地化服务(
AddLocalization)。 - 配置支持的语言(
Configure<RequestLocalizationOptions>)。 - 在管道中添加
UseRequestLocalization()。
这些步骤在标准项目模板或官方文档中都是推荐做法,并不是额外操作,而是本地化的标准流程。
如果你只注册了本地化服务但没有添加 UseRequestLocalization(),则不会自动根据请求头切换语言。
本质区别:
- 前端负责把语言信息通过请求头传递给后端。
- 后端只需标准配置,ASP.NET Core 会自动识别和切换,无需你手动解析头部或设置语言。
所以,第二种方法里的配置其实就是 ASP.NET Core 的标准做法,和第一种前端传递语言信息是配套的,不是多余,也不是重复,而是必须的标准流程。