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

Don*_*ana 5 c# localization asp.net-core asp.net-core-2.2

我的剃刀页面看起来像这样.

@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
<h1>@Localizer["Index"]</h1>
...
Run Code Online (Sandbox Code Playgroud)

我的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;
  });
  ...
}
Run Code Online (Sandbox Code Playgroud)

我将一个名为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;
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

应用程序不会崩溃,但重新搜索的字符串是Index,而不是RESX文件中的值.我试图尽可能地密切关注文档,但显然我错过了一些东西.我需要帮助找到那将是什么.

我在构造函数中打破并检查了_localizer ["Index"]的值.正如所料,未找到文件的标志设置为true.检查的价值SearchedLocation给我网站... Controllers.MemberController.我不知道这三个点是否是项目根目录中RESX文件的正确点.我期待本身的名义某处了.

Ale*_*der 5

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

services.AddLocalization(a => a.ResourcesPath = ""); //empty string
Run Code Online (Sandbox Code Playgroud)

通过此设置,SearchedLocation您将获得项目根目录中的文件Web.Controllers.MemberController的指向。Controllers.MemberController.resx

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

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

Resources.Views.Home.About.resx
Resources\Views.Home.About.resx
Resources\Views\Home.About.resx
Resources\Views\Home\About.resx
Run Code Online (Sandbox Code Playgroud)

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

而且您没有指定您app.UseRequestLocalization()在Startup.cs. 如果您不这样做,您的应用程序将无法确定请求区域性,并且它将始终指向默认资源文件。在文档中阅读更多内容。

笔记

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

public class HomeController : Controller
{
    private readonly RequestLocalizationOptions _requestLocalizationOptions;

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

    //..
}
Run Code Online (Sandbox Code Playgroud)