【发布时间】: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。我正在使用这个文档。
现在触发了正确的方法。
<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