Язык не меняется в веб-приложении ASP.NET Core.

Я следую принципам глобализации и локализации и Создание простого многоязычного Учебники на веб-сайте 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

<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

Когда я загружаю Home View, у меня выбран испанский вариант. Но когда я пытаюсь выбрать «английский», он загружается, но откатывает испанскую версию, поэтому я не могу окончательно увидеть свой контент на английском языке. В чем проблема?


person serge    schedule 24.07.2017    source источник


Ответы (2)


Вы добавили javascript, чтобы сделать обратную передачу выбора языка?

(function () {
$("#selectLanguage select").change(function () {
    $(this).parent().submit();
});
}());

Вы подключили промежуточное ПО локализации запроса в Configure?

var locOptions= app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(locOptions.Value);

Вы добавили метод в 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);
}
person Joe Audette    schedule 24.07.2017
comment
У меня не было первых двух вариантов. Первое не было упомянуто в учебнике, второе я не читал должным образом! Большое спасибо ! Третий был бы исключением, а не случаем :) - person serge; 24.07.2017
comment
Вот только проблема с локализацией DisplayAttribute... конечно это отдельная история, но вроде пока не работает... - person serge; 24.07.2017
comment
stackoverflow.com/questions/37833661/ - person Joe Audette; 24.07.2017
comment
Моя проблема когда-то была другой :) Я использовал пользовательский @Html.DisplayShortNameFor(), поэтому предлагаемое решение здесь stackoverflow.com/questions/45234670/ не учитывает интернационализацию - person serge; 24.07.2017
comment
Стандартный DisplayNameFor работал без доп. - person serge; 24.07.2017

Добавьте дополнительный ответ для тех, у кого он не заработал, даже если вы обновили свой код ответом Джо Оддетта.

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, то проверки политики согласия можно обойти. Значение по умолчанию неверно.

а 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;
});
person Dongdong    schedule 03.12.2018