Файл локализации не эффективен при отображении страницы Razor в MVC ASP.NET Core 2.2 - PullRequest
0 голосов
/ 14 февраля 2019

Моя страница 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.Я пытался максимально точно следовать документам , но, видимо, я что-то упустил.Мне нужна помощь, чтобы найти, что это было бы.

Я остановил точку и проверил значение _localizer ["Index"] в конструкторе.Как и ожидалось, флаг для файла, который не был найден, установлен на true .Проверка значения SearchedLocation дает мне Web ... Controllers.MemberController .Я не могу сказать, являются ли эти три точки правильными для файла RESX в корне проекта.Я тоже ожидал se где-то в названии.

1 Ответ

0 голосов
/ 14 февраля 2019

Если вы хотите поместить файлы ресурсов в корневой каталог проекта, вы должны установить 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

Таким образом, можно структурировать файлы локализации по папкам.

И вы не указали свойдобавлено app.UseRequestLocalization() в вашем Startup.cs.Если вы этого не сделаете, ваше приложение не сможет определить культуру запроса, и оно всегда будет указывать на файл ресурсов по умолчанию.Подробнее в документах .

Примечание

Существует 2 способа настройки 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;
    }

    //..
}
...