如何在 .NET Core - Web API 中显示基于文化的正确资源语言?
How to display correct resource language base on culture in .NET Core - Web API?
我有一个问题,语言资源没有根据文化显示正确的值,我对 ASP.NET 核心 Web 应用程序 没有问题,但是在 Web API 无法正常工作。
库 => .NET Core 3.1 - Class 库
Language.resx 和 Language.vi.resx
网络 API => .NET Core 3.1
本地化中间件在Startup.Configure方法中启用如下:
然后在控制器中,我有一个动作来获取当前的文化和资源的价值,但是它总是return英语的价值
https://localhost:5051/api/home/test?culture=en-US
https://localhost:5051/api/home/test?culture=vi-VN
您需要在 ASP.Net Core Web API 中配置本地化,稍有不同。
首先,文件夹命名和控制器的主要问题。您需要具有相同的资源命名和控制器。更多关于 Microsoft documentation。此外,资源文件夹应位于 ASP.Net Core Web API.
的同一项目中
例如:HomeController 和 Resources/Controllers.HomeController.en-US.resx 或 Resources/Controllers/HomeController.en-US.resx
我创建了新的 ASP.Net Core Web API 项目并执行以下步骤:
- 在
ConfigureServices()
中添加此代码:
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCulters = new List<CultureInfo>()
{
new CultureInfo("en-US"),
new CultureInfo("fr-FR")
};
options.DefaultRequestCulture = new RequestCulture(supportedCulters.FirstOrDefault());
options.SupportedCultures = supportedCulters;
options.SupportedUICultures = supportedCulters;
});
- 在
Configure()
中添加此代码:
var requestLocalizationOptions = app.ApplicationServices.GetRequiredService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(requestLocalizationOptions.Value);
- 创建新资源Resources/Controllers/HomeController.en-US.resx和Resources/Controllers/HomeController.fr-FR.resx
- 在
HomeController
中添加如下代码:
private readonly IStringLocalizer<HomeController> _localizer;
public HomeController(IStringLocalizer<HomeController> localizer)
{
_localizer = localizer;
}
[HttpGet]
public ActionResult Get()
{
var currentLanguage = CultureInfo.CurrentCulture;
var result = $"{currentLanguage}-{_localizer["Hello"].Value}";
return Ok(result);
}
终于,它正常工作了。
英文文本
法国文字
单独程序集中本地化资源的解决方案
执行以下步骤:
- 在单独项目的文件夹
Resources
中创建空的 class Language
。
- 创建 Language.en-US.resx 和 Language.fr-FR.resx
- 在
HomeController
中注入以下代码
private readonly IStringLocalizer<Language> _localizer;
public HomeController(IStringLocalizer<Language> localizer)
{
_localizer = localizer;
}
最后,对于单独的程序集项目,它可以正常工作。
我有一个问题,语言资源没有根据文化显示正确的值,我对 ASP.NET 核心 Web 应用程序 没有问题,但是在 Web API 无法正常工作。
库 => .NET Core 3.1 - Class 库
Language.resx 和 Language.vi.resx
网络 API => .NET Core 3.1
本地化中间件在Startup.Configure方法中启用如下:
然后在控制器中,我有一个动作来获取当前的文化和资源的价值,但是它总是return英语的价值
https://localhost:5051/api/home/test?culture=en-US
https://localhost:5051/api/home/test?culture=vi-VN
您需要在 ASP.Net Core Web API 中配置本地化,稍有不同。
首先,文件夹命名和控制器的主要问题。您需要具有相同的资源命名和控制器。更多关于 Microsoft documentation。此外,资源文件夹应位于 ASP.Net Core Web API.
的同一项目中例如:HomeController 和 Resources/Controllers.HomeController.en-US.resx 或 Resources/Controllers/HomeController.en-US.resx
我创建了新的 ASP.Net Core Web API 项目并执行以下步骤:
- 在
ConfigureServices()
中添加此代码:
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCulters = new List<CultureInfo>()
{
new CultureInfo("en-US"),
new CultureInfo("fr-FR")
};
options.DefaultRequestCulture = new RequestCulture(supportedCulters.FirstOrDefault());
options.SupportedCultures = supportedCulters;
options.SupportedUICultures = supportedCulters;
});
- 在
Configure()
中添加此代码:
var requestLocalizationOptions = app.ApplicationServices.GetRequiredService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(requestLocalizationOptions.Value);
- 创建新资源Resources/Controllers/HomeController.en-US.resx和Resources/Controllers/HomeController.fr-FR.resx
- 在
HomeController
中添加如下代码:
private readonly IStringLocalizer<HomeController> _localizer;
public HomeController(IStringLocalizer<HomeController> localizer)
{
_localizer = localizer;
}
[HttpGet]
public ActionResult Get()
{
var currentLanguage = CultureInfo.CurrentCulture;
var result = $"{currentLanguage}-{_localizer["Hello"].Value}";
return Ok(result);
}
终于,它正常工作了。
英文文本
法国文字
单独程序集中本地化资源的解决方案
执行以下步骤:
- 在单独项目的文件夹
Resources
中创建空的 classLanguage
。 - 创建 Language.en-US.resx 和 Language.fr-FR.resx
- 在
HomeController
中注入以下代码
private readonly IStringLocalizer<Language> _localizer;
public HomeController(IStringLocalizer<Language> localizer)
{
_localizer = localizer;
}
最后,对于单独的程序集项目,它可以正常工作。