【问题标题】:Language drop-down not setting culture correctly语言下拉菜单未正确设置文化
【发布时间】:2020-01-02 23:55:59
【问题描述】:

我正在研究这个不错的我们语言选择器,但是当我选择新语言时它似乎没有触发该方法。

这是在 asp.net core 3.1 的局部视图中

@using Microsoft.AspNetCore.Builder
@using Microsoft.AspNetCore.Mvc.Localization
@using Microsoft.Extensions.Options

@inject IViewLocalizer Localizer
@inject IOptions<RequestLocalizationOptions> LocOptions

@{
    var cultureItems = LocOptions.Value.SupportedUICultures
        .Select(c => new SelectListItem { Value = c.Name, Text = c.NativeName })
        .ToList();
    var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~/" : $"~{Context.Request.Path.Value}";
}

<li class="nav-item dropdown">
    <a class="nav-link dropdown-toggle" href="#" id="languageDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
        @Localizer["Language"]
    </a>
    <div class="dropdown-menu" aria-labelledby="languageDropdown">
        @foreach (var language in @cultureItems)
        {
            <a class="dropdown-item" asp-controller="Home" asp-action="SetLanguage" asp-route-culture="@language.Value" asp-route-returnUrl="@returnUrl">@language.Text</a>
        }
    </div>
</li>

它生成以下选择,但它没有到达我的家庭控制器中的路线,这是以下方法。它回到默认我设置的语言方法如下

public IActionResult SetLanguage(string culture, string returnUrl)
{
  Response.Cookies.Append(
            CookieRequestCultureProvider.DefaultCookieName,
            CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
);

  return LocalRedirect(returnUrl);
}

这是我的默认路由路径可能是问题所在

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapRazorPages();

});

我在启动时使用以下配置语言。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
   var supportedCultures = new string[] { "en-GB", "fr-FR" };
   app.UseRequestLocalization(options =>
   options
     .AddSupportedCultures(supportedCultures)
     .AddSupportedUICultures(supportedCultures)
     .SetDefaultCulture("en-gb")
     .RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(context =>
 {
    return Task.FromResult(new ProviderCultureResult("en-gb"));
  }))
        );

更新说明 我根据文档更改为以下内容,但是在下拉值选择后,它仍然没有将文化设置为始终为 en-GB。我正在使用这个文档。

现在触发了正确的方法。

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-3.1#implement-a-strategy-to-select-the-languageculture-for-each-request

<div title="@Localizer["Request culture provider:"] @requestCulture?.Provider?.GetType().Name">
    <form id="selectLanguage" asp-controller="Home" 
          asp-action="SetLanguage" asp-route-returnUrl="@returnUrl" 
          method="post" class="form-horizontal" role="form">
        <label asp-for="@requestCulture.RequestCulture.UICulture.Name">@Localizer["Language:"]</label> <select name="culture"
          onchange="this.form.submit();"
          asp-for="@requestCulture.RequestCulture.UICulture.Name" asp-items="cultureItems">
        </select>
    </form>
</div>

更新 2 我还看到 cookie 浓度可能是问题,但即使我在启动时注释掉这一行,它仍然没有保存。

 services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
      //   options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

更新 3 好的,所以我已经保存了 cookie,并且它根据 chrome 中的开发人员工具正确输入了值。但它仍然将英文版的文本显示在屏幕上。

【问题讨论】:

  • I have got it saving the cookie and it's putting the value correctly in according to the developer tools in chrome. But its still putting the english version of the text on screen. 请检查您是否正确提供并命名resource file(s)。
  • 您在提供者列表的开头插入自定义文化提供者,因此它总是返回“en-gb”而不检查其他提供者。尝试将其插入到不同的索引 .RequestCultureProviders.Insert(2, new CustomRequestCultureProvider) 或使用 add .RequestCultureProviders.Add(new Custom...)

标签: c# asp.net-core


【解决方案1】:

您的CustomRequestCultureProvider 如何设置文化?

您想为您的自定义提供程序或使用 cookie 或路由值来设置文化吗?还是全部按特定顺序?


在您的自定义提供程序的默认实现中,尝试将返回值更改为其他值并检查结果:

return Task.FromResult(new ProviderCultureResult("en-gb"));

很可能自定义文化提供程序总是返回“en-gb”,因此它不会检查请求文化的 cookie 或路由值。


在语言下拉列表中有asp-route-culture:

<a class="dropdown-item" asp-controller="Home" asp-action="SetLanguage" asp-route-culture="@language.Value" asp-route-returnUrl="@returnUrl">@language.Text</a>

但您在路由模式中没有{route} 参数:

pattern: "{controller=Home}/{action=Index}/{id?}"

所以尝试将{culture} 添加到路由模式中:

pattern: "{culture=en-gb}/{controller=Home}/{action=Index}/{id?}"

【讨论】:

  • 已经在返回一个任务项请仔细阅读返回Task.FromResult(new ProviderCultureResult("en-gb"));
猜你喜欢
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
相关资源
最近更新 更多