在路由中使用 culture 参数改变文化

Use culture parameter in route to change culture

在 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

我该怎么做?

开箱即用,UseRequestLocalization 支持以下 ordered 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,请将其添加为 第一个 提供商:

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

内置扩展方法AddInitialRequestCultureProvider使用与上述相同的实现。使用它看起来像这样:

requestLocalizationOptions.AddInitialRequestCultureProvider(
    new RouteDataRequestCultureProvider());