如何在 .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.

的同一项目中

例如:HomeControllerResources/Controllers.HomeController.en-US.resxResources/Controllers/HomeController.en-US.resx

我创建了新的 ASP.Net Core Web API 项目并执行以下步骤:

  1. 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;
});
  1. Configure() 中添加此代码:
var requestLocalizationOptions = app.ApplicationServices.GetRequiredService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(requestLocalizationOptions.Value);
  1. 创建新资源Resources/Controllers/HomeController.en-US.resxResources/Controllers/HomeController.fr-FR.resx
  2. 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);
}

终于,它正常工作了。

英文文本

法国文字

单独程序集中本地化资源的解决方案

执行以下步骤:

  1. 在单独项目的文件夹 Resources 中创建空的 class Language
  2. 创建 Language.en-US.resxLanguage.fr-FR.resx

  1. HomeController中注入以下代码
private readonly IStringLocalizer<Language> _localizer;
public HomeController(IStringLocalizer<Language> localizer)
{
    _localizer = localizer;
}

最后,对于单独的程序集项目,它可以正常工作。