Запрошенная локализованная культура QueryString не работает в моделях ASP. NET Core Razor Page с AJAX Запросом. - PullRequest
0 голосов
/ 23 апреля 2020

Мы наблюдаем странное поведение при многоязычной разработке в ASP. NET Приложение на основе страниц Core Razor, объект IStringLocalizer, который мы используем на страницах .cs html, распознает выбранную в настоящее время культуру и переводит все правильные элементы находятся в файле .cs html в соответствии с файлами ресурсов выбранной культуры, но тот же объект, который используется в файлах моделей страниц (например, .cs html .cs), всегда переводится на язык браузера по умолчанию при запросе через AJAX Метод GET или POST . Это не в состоянии признать в настоящее время выбранную культуру. Используется QueryStringRequestCultureProvider.

Это то, что работает на странице .cs html и ее перевод в соответствии с культурой, выбранной в String

@page
@inject IStringLocalizer<IndexModel> localizer  
@model IndexModel
@{
    ViewData["Title"] = "Home page";
    var requestCultureFeature = HttpContext.Features.Get<IRequestCultureFeature>();
    var requestCulture = requestCultureFeature.RequestCulture;
}     
<div class="text-center">
    <h1 class="display-4">@localizer["Welcome"]</h1>        
</div>

<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.3.1.min.js"></script>
<script lang="javascript">
    $(document).ready(function () {

        $("#btnnsubmit").click(function () {
            var obj = {};
            obj.name = "name";

            //url
            $.ajax({
                type: "Get",
                url: '/Index?handler=callingAjax',
                data: obj,
                dataType: "html",
                contentType: "application/json; charset=utf-8",
                success: function () {
                    debugger;

                },
                error: function () {

                }
            });
        });
    });

</script>

Это то, что я сделал в моделях страниц (т.е. в .cs html .cs страницах) и всегда переводится на язык браузера по умолчанию.

    public class IndexModel : PageModel
    {
        public string Message { get; set; }

        private readonly ILogger log;

        private readonly IStringLocalizer<IndexModel> localizer;

        public IndexModel(ILogger<IndexModel> log, IStringLocalizer<IndexModel> _localizer)
        {
            this.log = log;
            localizer = _localizer;
        }

         public void OnGet()
         {
        // Called on page load without AJAX
        //Localization is working here, gives translation based on selected 
          //language 
            string str = _localizer["InvalidLoginAttempt"];
         }

    public IActionResult OnGetCallingAjax()
    {  
        int MaxThreads = 1;
        // Called using AJAX
        //Localization is not working here, always gives translation based on 
          //browsers default language, 
        string str1 = _localizer["InvalidLoginAttempt"];

        string message = "SUCCESS";
        return new JsonResult(new
        {
            Error = false,
            Message = message,
            // lstlang = lstlanguage
        });
    }
  }

Ниже приведены настройки файла запуска.

public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<RequestLocalizationOptions>(options =>
            {
                var supportedCultures = new[]
                 {
                    new CultureInfo("de"),
                    new CultureInfo("fr"),
                    new CultureInfo("en"),
                    new CultureInfo("nl"),
                 };
                options.DefaultRequestCulture = new RequestCulture("de");               
                options.SupportedCultures = supportedCultures;
                options.SupportedUICultures = supportedCultures;  
                options.RequestCultureProviders = new List<IRequestCultureProvider>
                {
                  new QueryStringRequestCultureProvider(),
                  new CookieRequestCultureProvider()
                };
            });

            services.AddSession(options => {
                options.IdleTimeout = TimeSpan.FromMinutes(30);
            });

            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => false;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });            

            services.AddSession(options => {
                options.IdleTimeout = TimeSpan.FromMinutes(30); //default is 20 min
            });

            services.AddLocalization(options => options.ResourcesPath = "Resources");
            services.AddMemoryCache();
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix);
            services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddLog4Net();
            Log4NetFilters.Set(               // filter out the standard log messages with source "Microsoft"
              source: "Microsoft",
              filteredLogLevel: LogLevel.Information);

            ILogger logger = loggerFactory.CreateLogger<Program>();
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }

            app.UseStaticFiles();
            //app.UseRouting();
            app.UseSession();
            app.UseCookiePolicy();
            app.UseHttpsRedirection();

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

            app.UseMvc();
        }
...