Ser*_*rge 1 asp.net-core asp.net-core-localization asp.net-core-1.1
我遵循全球化和本地化以及构建简单的多语言ASP.NET Core网站教程,为我的应用程序添加语言切换。
因此,我创建了局部视图
@using Microsoft.AspNetCore.Builder
@using Microsoft.AspNetCore.Http.Features
@using Microsoft.AspNetCore.Localization
@using Microsoft.AspNetCore.Mvc.Localization
@using Microsoft.Extensions.Options
@inject IViewLocalizer Localizer
@inject IOptions<RequestLocalizationOptions> LocOptions
@{
var requestCulture = Context.Features.Get<IRequestCultureFeature>();
var cultureItems = LocOptions.Value.SupportedUICultures
.Select(c => new SelectListItem { Value = c.Name, Text = c.DisplayName })
.ToList();
}
<div title="@Localizer["Request culture provider:"] @requestCulture?.Provider?.GetType().Name">
<form id="selectLanguage" asp-controller="Home"
asp-action="SetLanguage" asp-route-returnUrl="@Context.Request.Path"
method="post" class="form-horizontal" role="form">
@Localizer["Language:"]
<select name="culture"
onchange="this.form.submit();"
asp-for="@requestCulture.RequestCulture.UICulture.Name" asp-items="cultureItems"></select>
</form>
</div>
Run Code Online (Sandbox Code Playgroud)
添加在页脚_Layout的
<div class="col-md-6 text-right">
@await Html.PartialAsync("_SelectLanguagePartial")
</div>
Run Code Online (Sandbox Code Playgroud)
并像这样配置Startup.cs:
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]
{
new CultureInfo("es"),
new CultureInfo("en")
};
options.DefaultRequestCulture = new RequestCulture(culture: "es", uiCulture: "es");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
});
Run Code Online (Sandbox Code Playgroud)
我添加了一个Resources文件夹,并在其中
Views.Home.Index.es.resx
Views.Home.Index.en.resx
Views.Shared._Layout.es.resx
Views.Shared._Layout.en.resx
Run Code Online (Sandbox Code Playgroud)
我也做了 Install-Package Microsoft.AspNetCore.Authentication.Cookies
加载主视图时,我选择了西班牙语选项。但是,当我尝试选择“英语”时,它会加载,但会回滚西班牙语版本,因此我最终看不到英语内容。问题出在哪里?
即使您已经用Joe Auddette的答案更新了代码,也为那些没有用的人添加了一个额外的答案。
该CookieOptions阻止我很长一段时间,使事情的工作:
[HttpPost]
public IActionResult SetLanguage(string culture, string returnUrl)
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions
{
Expires = DateTimeOffset.UtcNow.AddYears(1),
IsEssential = true, //critical settings to apply new culture
Path = "/",
HttpOnly = false,
}
);
return LocalRedirect(returnUrl);
}
Run Code Online (Sandbox Code Playgroud)
IsEssential 在源代码中有以下注释:
指示此cookie对于应用程序正常运行是否必不可少。如果为true,则可以绕过同意策略检查。默认值为false。
并且consent policy设置在startup.cs
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;
});
Run Code Online (Sandbox Code Playgroud)
您是否添加了JavaScript以使语言选择器回发?
(function () {
$("#selectLanguage select").change(function () {
$(this).parent().submit();
});
}());
Run Code Online (Sandbox Code Playgroud)
您是否在Configure中连接了quest本地化中间件?
var locOptions= app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(locOptions.Value);
Run Code Online (Sandbox Code Playgroud)
您是否在HomeController中添加了这样的方法:
[HttpPost]
public IActionResult SetLanguage(string culture, string returnUrl)
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
);
return LocalRedirect(returnUrl);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4614 次 |
| 最近记录: |