Используйте параметр культуры в маршруте, чтобы изменить культуру - PullRequest
0 голосов
/ 19 апреля 2020

В приложении Asp. Net 3.1 при запуске у меня для локализации указано следующее:

  application.UseRequestLocalization(new RequestLocalizationOptions {
    DefaultRequestCulture = new RequestCulture("pt"),
    SupportedCultures = new[] { new CultureInfo("en"), new CultureInfo("pt") },
    SupportedUICultures = new[] { new CultureInfo("en"), new CultureInfo("pt") }
  });

  application.UseEndpoints(x => {
    x.MapDefaultControllerRoute();
  });

Я использую маршрутизацию атрибутов на контроллерах:

[HttpGet("about")]
public IActionResult Index() => View();

Я могу просматривать содержимое в правильной культуре, используя:

/about?culture=pt
/about?culture=en

Но мне бы хотелось иметь культуру в качестве параметра маршрута, поэтому я обновил его до:

[HttpGet("{culture?}/about")]
public IActionResult Index() => View();

Однако, Когда я получаю доступ, культура не меняется:

/pt/about
/en/about

Как я могу это сделать?

1 Ответ

1 голос
/ 19 апреля 2020

Из коробки UseRequestLocalization поддерживает следующие заказанные RequestCultureProviders:

  1. QueryStringRequestCultureProvider
  2. CookieRequestCultureProvider
  3. AcceptLanguageHeaderRequestCultureProvider

Добавив "{culture?}" к ограничению HttpGet, вы превратили его в параметр маршрута. Это поддерживается, но должно быть настроено. Вот пример:

var requestLocalizationOptions = new RequestLocalizationOptions {
    DefaultRequestCulture = new RequestCulture("pt"),
    SupportedCultures = new[] { new CultureInfo("en"), new CultureInfo("pt") },
    SupportedUICultures = new[] { new CultureInfo("en"), new CultureInfo("pt") }
};

requestLocalizationOptions.RequestCultureProviders.Add(
    new RouteDataRequestCultureProvider());

application.UseRequestLocalization(requestLocalizationOptions);

Если вы хотите, чтобы RouteDataRequestCultureProvider был проверен первым, добавьте его в качестве first поставщика:

requestLocalizationOptions.RequestCultureProviders.Insert(
    0, new RouteDataRequestCultureProvider());

Встроенный -в метод расширения, AddInitialRequestCultureProvider, используется та же реализация, что и выше. Используя это выглядит так:

requestLocalizationOptions.AddInitialRequestCultureProvider(
    new RouteDataRequestCultureProvider());
...