ASP.NET Core Web 应用程序中的语言不会更改

2023-12-04

我遵循全球化与本土化 and 构建简单的多语言 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>

添加到页脚_Layout the

<div class="col-md-6 text-right">
    @await Html.PartialAsync("_SelectLanguagePartial")
</div>

并像这样配置 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;    

});

我添加了一个Resources文件夹并在其中

Views.Home.Index.es.resx
Views.Home.Index.en.resx
Views.Shared._Layout.es.resx
Views.Shared._Layout.en.resx

我也做了Install-Package Microsoft.AspNetCore.Authentication.Cookies

当我加载主页视图时,我选择了西班牙语选项。但是,当我尝试选择“英语”时,它会加载,但会回滚西班牙语版本,因此我最终无法看到英文内容。哪里有问题?


即使您已使用 Joe Auddette 的答案更新了代码,也为那些无法使其工作的人添加额外的答案。

The 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);
}

IsEssential源码中有如下注释:

指示此 cookie 对于应用程序的运行是否至关重要 正确。如果为 true,则可能会绕过同意策略检查。这 默认值为 false。

and the 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;
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET Core Web 应用程序中的语言不会更改 的相关文章

随机推荐