Мы наблюдаем странное поведение при многоязычной разработке в 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();
}