本地化文件无法有效地在 MVC ASP.NET Core 2.2 中呈现 Razor 页面

Localization file not effective rendering a Razor page in MVC ASP.NET Core 2.2

我的 Razor 页面如下所示。

@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
<h1>@Localizer["Index"]</h1>
...

我的 Startup.cs 包含以下内容。

public void ConfigureServices(IServiceCollection services)
{
  ...
  services.AddLocalization(a => a.ResourcesPath = "/");

  services.Configure<RequestLocalizationOptions>(a =>
  {
    CultureInfo[] supportedCultures = {
      new CultureInfo("sv-SE"),
      new CultureInfo("se")
    };
    a.DefaultRequestCulture = new RequestCulture("se");
    a.SupportedCultures = supportedCultures;
    a.SupportedUICultures = supportedCultures;
  });
  ...
}

我直接在项目的根目录下放置了一个名为 Controllers.HomeController.se.resx 的文件。控制器 HomeController 包含注入。

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

  public HomeController(Context context, IStringLocalizer<HomeController> localizer)
  {
    _context = context;
    _localizer = localizer;
  }
  ...
}

应用程序没有崩溃但是重新生成的字符串是Index而不是RESX文件中的值。我试图尽可能密切地关注 the docs 但显然我错过了一些东西。我需要帮助找到那是什么。

我在构造函数中断点并检查了 _localizer["Index"] 的值。正如预期的那样,未找到文件的标志设置为 true。检查 SearchedLocation 的值给我 Web...Controllers.MemberController。我无法判断这三个点是否是项目根目录中 RESX 文件的正确点。我也期待 se 在名字的某处。

如果你想把你的资源文件放在项目的根目录下,你应该ResourcesPath设置如下

services.AddLocalization(a => a.ResourcesPath = ""); //empty string

使用此设置 SearchedLocation 将为您提供 Web.Controllers.MemberController,它指向项目根目录中的 Controllers.MemberController.resx 文件。

要在视图中使用本地化,您必须遵循 Views.{ControllerName}.{ViewName}.resx 模式。例如,如果您有 HomeControllerAbout 视图,您需要有 Views.Home.About.resx 文件才能使用本地化。

另一个约定资源 reader 在搜索本地化文件时会在各自的文件夹中搜索文件,而不是按点分隔的名称。例如,如果 ResourcesPath 设置为 "Resources",则以下变体相等

Resources.Views.Home.About.resx
Resources\Views.Home.About.resx
Resources\Views\Home.About.resx
Resources\Views\Home\About.resx

因此可以按文件夹构建本地化文件。

并且您没有指定在 Startup.cs 中添加了 app.UseRequestLocalization()。如果您不这样做,您的应用程序将无法确定请求文化,并且它将始终指向默认资源文件。阅读更多 in the docs.

备注

有两种配置 RequestLocalizationOptions 请求本地化的方法,通过 services.Configure<RequestLocalizationOptions> 或将构造的选项对象(或委托)传递给 app.UseRequestLocalization。实际上,这些方法之间没有区别,它们在本地化中间件方面完全相同。但是,如果在应用程序的任何时候您需要获取 RequestLocalizationOptions,您将无法获取传递给 app.UseRequestLocalization 的值。但是用 services.Configure<RequestLocalizationOptions> 很容易实现(这是描述的一般方法 in the docs

public class HomeController : Controller
{
    private readonly RequestLocalizationOptions _requestLocalizationOptions;

    public HomeController(IOptions<RequestLocalizationOptions> options)
    {
        _requestLocalizationOptions = options.Value;
    }

    //..
}