编程语言
首页 > 编程语言> > c# – 本地化文件无法在MVC ASP.NET Core 2.2中呈现Razor页面

c# – 本地化文件无法在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文件的正确点.我也期待名字的某个地方.

解决方法:

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

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

使用此设置,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

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

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

注意

有两种方法可以通过服务为请求本地化配置RequestLocalizationOptions.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;
    }

    //..
}

标签:c,localization,asp-net-core,asp-net-core-2-2
来源: https://codeday.me/bug/20190522/1152388.html