Имя культуры не изменяется в URL после изменения языка в ASP.Net Core 2.2. - PullRequest
0 голосов
/ 14 февраля 2019

Я следую учебнику https://joonasw.net/view/aspnet-core-localization-deep-dive, чтобы добавить переключатель языка для моего приложения.

Моя проблема в том, что имя культуры не меняется в URL браузера после перехода на другой язык с помощьюустановите флажок.

Шаг за шагом:

  • Я запускаю приложение, оно открывается на венгерском языке по умолчанию (hu-HU)
  • Я меняю язык с помощьюустановите флажок на английский, и содержимое страницы изменится на английский, но в URL-адресе браузера я снова вижу / hu-HU /.Он не меняется на '/en-US/'.

Мой очищенный код:

Startup.cs

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        #region Cookies
        services.Configure<CookiePolicyOptions>(options =>
        {
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });
        #endregion

        #region Localization
        services.AddLocalization(options => options.ResourcesPath = "");
        services.TryAddSingleton<IStringLocalizer, ZLocalizer>();
        services.Configure<RequestLocalizationOptions>(
        options =>
        {
            var supportedCultures = new List<CultureInfo>
            {
               new CultureInfo("en-US"),
               new CultureInfo("hu-HU"),
            };
            options.DefaultRequestCulture = new RequestCulture(culture: "hu-HU", uiCulture: "hu-HU");
            options.SupportedCultures = supportedCultures;
            options.SupportedUICultures = supportedCultures;
            services.AddSingleton(options);
        });
        #endregion

        services.AddMvc()
        #region Localization
            .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
            .AddDataAnnotationsLocalization(o =>
            {
                o.DataAnnotationLocalizerProvider = (type, factory) =>
                {
                    return factory.Create(typeof(SharedResources));
                };
            })
        #endregion
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env )
    {
        app.UseCookiePolicy();

        #region Multilanguage
        var localizationOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
        app.UseRequestLocalization(localizationOptions.Value);
        #endregion

        // Multilanguage and culture injection around UseMvc
        app.UseRouter(routes =>
        {
            routes.MapMiddlewareRoute("{culture=hu-HU}/{*mvcRoute}", subApp =>
            {
                #region Multilanguage
                subApp.UseRequestLocalization(localizationOptions.Value);
                #endregion

                subApp.UseMvc(mvcRoutes =>
                {
                    mvcRoutes.MapRoute(
                        name: "hidehome",
                        template: "{culture=hu-HU}/{action=Index}/{id?}",
                        defaults: new { controller = "Home" }
                        );

                    mvcRoutes.MapRoute(
                        name: "default",
                        template: "{culture=hu-HU}/{controller=Home}/{action=Index}/{id?}");
                });
            });
        });
    }
}

Частичное представление

@using System.Globalization;
@using Microsoft.AspNetCore.Builder;
@using Microsoft.Extensions.Options;
@using Microsoft.AspNetCore.Localization;

@inject IOptions<RequestLocalizationOptions> LocOps

@{
    var requestCulture = Context.Features.Get<IRequestCultureFeature>();
    var cultureItems = LocOps.Value.SupportedUICultures
        .Select(c => new SelectListItem { Value = c.Name, Text = c.DisplayName })
        .ToList();
}

<div title="@Lang["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">
        @Lang["Language:"] <select name="culture"
                                        onchange="this.form.submit();"
                                        asp-for="@requestCulture.RequestCulture.UICulture.Name" asp-items="cultureItems"></select>
    </form>
</div>

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),
                    //IsEssential = true,  //critical settings to apply new culture 
                    //Path = "/",
                    //HttpOnly = false,
                }
            );

            return LocalRedirect(returnUrl);
        }


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