Строка запроса локализации net core 5 mvc работает, но маршрутизация не работает

При попытке локализовать мое приложение локализация строки запроса сработала, и заголовок языка также работает, но маршрутизация не работает. Вот мой код:

Startup.cs

public static IServiceCollection AddLocalizationServices(this IServiceCollection services, IConfiguration _config)
{
    string defaultCulture = _config.GetValue<string>("DefaultCulture");
    services.AddLocalization(options => options.ResourcesPath = "Resources");
    services.Configure<RequestLocalizationOptions>(
        options =>
        {
            var supportedCultures = new[]
            {
                new CultureInfo("en"),
                new CultureInfo("ar")
            };

            options.DefaultRequestCulture = new RequestCulture(culture: defaultCulture, uiCulture: defaultCulture);
            options.SupportedCultures = supportedCultures;
            options.SupportedUICultures = supportedCultures;

            options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider()
            {
                Options = options,
                RouteDataStringKey = "lang",
                UIRouteDataStringKey = "lang"
            });
            options.RequestCultureProviders.Insert(1, new QueryStringRequestCultureProvider());
            //options.RequestCultureProviders.Insert(2, new CookieRequestCultureProvider());
            options.RequestCultureProviders.Insert(3, new AcceptLanguageHeaderRequestCultureProvider());
        });

    services.Configure<RouteOptions>(options =>
    {
        options.ConstraintMap.Add("lang", typeof(LanguageRouteConstraint));
    });

    return services;
}

public static IApplicationBuilder AddLocalizationBuilder(this IApplicationBuilder app)
{
    var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
    app.UseRequestLocalization(locOptions.Value);

    return app;
}

public void ConfigureServices(IServiceCollection services)
{
    services.AddLocalizationServices(_config);

    services.AddControllersWithViews()
        .AddDataAnnotationsLocalization(options =>
        {
            options.DataAnnotationLocalizerProvider = (type, factory) =>
            {
                var assemblyName = new AssemblyName(typeof(ValidationResource).GetTypeInfo().Assembly.FullName);
                return factory.Create("ValidationResource", assemblyName.Name);
            };
        });
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        //app.ConfigureExceptionHandler();
    }
    else
    {
        //Global error handling instead of try, catch
        app.ConfigureExceptionHandler();

        //app.UseHsts();
    }

    app.AddLocalizationBuilder();

    //app.UseHttpsRedirection();

    app.UseRouting();

    app.UseAuthorization();

    string defaultCulture = _config.GetValue<string>("DefaultCulture");
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{lang:lang}/{controller=Home}/{action=Index}/{id?}");

        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{*catchall}",
            defaults: new { controller = "Home", action = "RedirectToDefaultLanguage", lang = defaultCulture });
    });
}

_ViewImports.cshtml

@using CoreCMS.MVC
@using CoreCMS.Data
@using Microsoft.Extensions.Localization

@inject IStringLocalizer<SharedResource> _loc

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

Index.cshtml

@_loc["Title"]

При попытке доступа к веб-сайту со следующим URL-адресом: http://localhost:14896/en или http://localhost:14896/ar культура не работает, но при использовании этот URL-адрес http://localhost:14896/?culture=ar или http://localhost:14896/?culture=en культура работает хорошо


person Ahmad Alaa    schedule 08.03.2021    source источник
comment
код выглядит нормально и должен работать до тех пор, пока в запросе присутствует значение маршрута lang. Итак, первый шаг — попробовать отладить, чтобы увидеть, действительно ли существует значение маршрута, ключ которого равен lang. Также вы можете попробовать изучить культуру запроса (проверено через CultureInfo.CurrentCulture), чтобы увидеть, действительно ли она установлена, как можно скорее, убедитесь, что нет никакого другого кода, который изменяет ее на что-то другое.   -  person King King    schedule 08.03.2021
comment
Я отладил приложение, и маршрут lang представляет значение из URL-адреса без каких-либо проблем, и нет другого кода, который изменяет что-то еще, маршрутизация работает хорошо во всех ситуациях, кроме маршрутизации!   -  person Ahmad Alaa    schedule 08.03.2021
comment
чтобы проверить это, вы можете разместить встроенное ПО промежуточного слоя сразу после app.AddLocalizationBuilder() вот так app.Use((context,next) => { /* examine the CultureInfo.CurrentCulture here */ return next();}). Таким образом, вы, по крайней мере, будете уверены, что промежуточное ПО раньше работало или нет.   -  person King King    schedule 08.03.2021
comment
Я проверил культуру в контроллере и обнаружил, что она не меняется для запрошенной культуры при использовании маршрутизации.   -  person Ahmad Alaa    schedule 08.03.2021
comment
Я не очень уверен в том, как используются IRequestCultureProvider, но, если возможно, вы можете сначала попробовать очистить всех поставщиков и добавить только RouteDataRequestCultureProvider, чтобы посмотреть, работает ли он. Это довольно странно, потому что код конфигурации почти стандартный, а сам RouteDataRequestCultureProvider является встроенным провайдером, параметры выглядят нормально...   -  person King King    schedule 08.03.2021
comment
когда я изменяю текущую культуру вручную на основе маршрута lang, она работает нормально: Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(lang); Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);   -  person Ahmad Alaa    schedule 08.03.2021
comment
Я очистил всех провайдеров и просто оставил провайдера маршрута, я сделал все, что вы можете ожидать или не можете, поэтому вы думаете, что мне нужно изменить культуру вручную на основе параметра маршрутизации!?   -  person Ahmad Alaa    schedule 08.03.2021
comment
если у вас нет времени, чтобы решить эту проблему, конечно, это хороший обходной путь (вы даже можете написать inline-middelware, как я прокомментировал ранее, и установить там культуру вручную). Но позже вы должны попытаться решить проблему, это довольно нелепо. Кстати, вот код для RouteDataRequestCultureProvider github .com/dotnet/aspnetcore/blob/ это довольно просто, и поэтому трудно потерпеть неудачу, как в вашем случае.   -  person King King    schedule 08.03.2021
comment
Привет, ребята, RouteDataRequestCultureProvider код отлично работает для параметра строки запроса, как в вашем примере - ?culture=en. Вы должны создать собственную реализацию интерфейса RequestCultureProvider для своей задачи. Взгляните на этот ответ   -  person DarkSideMoon    schedule 09.03.2021
comment
@DarkSideMoon реализация проста, получите значение маршрута и установите соответствующую культуру. RouteDataRequestCultureProvider по умолчанию вполне достаточно. Кстати, OP настраивает свой ключ данных маршрута как lang (а не culture, как используется по умолчанию). Это должно просто работать, и, конечно, это так странно, когда это не работает на его стороне. Иногда мы не можем помочь из-за чего-то глупого, простого, скрытого на стороне ОП.   -  person King King    schedule 10.03.2021