Можно ли запретить автоматическое изменение свойства CultureInfo.CurrentUICulture?

Я хочу изменить язык на странице вручную при нажатии кнопки, но замечаю, что локализация сбрасывается после обновления страницы. <br/> Я использую IStringLocalizer для локализации, и он зависит от CultureInfo.CurrentUICulture, которая, как я понимаю, обновляется браузером при перезагрузке страницы. <br/> Вот код настройки WebApplication: <br/> <pre><code class="cs">var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorComponents().AddInteractiveServerComponents();
builder.Services.AddLocalization();

var app = builder.Build();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAntiforgery();
app.UseRequestLocalization(options =&gt;
{
	options.AddSupportedCultures(["ru-RU", "en-US"]);
	options.AddSupportedUICultures(["ru-RU", "en-US"]);
	options.SetDefaultCulture("ru-RU");
});
app.MapRazorComponents&lt;App&gt;().AddInteractiveServerRenderMode();

app.Run();</code></pre>
  • 8 января 2025 г. 15:14
Ответы на вопрос 1
В .NET приложении, использующем ASP.NET Core, изменение текущей культуры (CultureInfo.CurrentUICulture) обычно происходит на уровне каждого HTTP-запроса. Когда страница обновляется, браузер отправляет новый запрос на сервер, и в этом запросе иногда используется культура, определяемая заголовками Accept-Language, которые отправляет браузер. Это может привести к тому, что ваше вручную установленное значение будет сбрасываться.

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

1. **Сохранение языка в Cookie**:
   Вы можете сохранять выбранный язык в Cookie. Это позволит вам извлекать и использовать его для установки текущей культуры при каждом запросе.

   Пример кода для установки Cookie и чтения его:

   ```csharp
   app.UseRequestLocalization(options =>
   {
       var supportedCultures = new[] { "ru-RU", "en-US" };
       options.AddSupportedCultures(supportedCultures);
       options.AddSupportedUICultures(supportedCultures);
       options.SetDefaultCulture("ru-RU");
       
       options.RequestCultureProviders.Insert(0, new CookieRequestCultureProvider());
   });

   public class LanguageController : Controller
   {
       [HttpPost]
       public IActionResult ChangeLanguage(string culture)
       {
           Response.Cookies.Append(
               CookieRequestCultureProvider.DefaultCookieName,
               CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
               new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
           );

           return Redirect(Request.Headers["Referer"].ToString());
       }
   }
   ```

   В этом примере вы создаете метод `ChangeLanguage`, который устанавливает Cookie с выбранной культурой. После этого происходит редирект на предыдущую страницу.

2. **Использование параметров запроса**:
   Вы также можете передавать выбранную культуру через параметры запроса, а затем устанавливать её в `RequestLocalizationOptions`.

   Пример:

   ```csharp
   app.UseRequestLocalization(options =>
   {
       var supportedCultures = new[] { "ru-RU", "en-US" };
       options.AddSupportedCultures(supportedCultures);
       options.AddSupportedUICultures(supportedCultures);
       options.SetDefaultCulture("ru-RU");

       options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider());
   });

   public class RouteDataRequestCultureProvider : RequestCultureProvider
   {
       public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
       {
           var culture = httpContext.Request.Query["culture"].ToString();
           if (!string.IsNullOrEmpty(culture))
           {
               return Task.FromResult(new ProviderCultureResult(culture, culture));
           }

           return Task.FromResult<ProviderCultureResult>(null);
       }
   }
   ```

   Затем при смене языка вы будете отправлять пользователя на тот же URL, добавляя к нему параметр `?culture=ru-RU` или `?culture=en-US`.

3. **Поддержка сессий и пользователей**:
   Если ваше приложение требует аутентификации, вы можете хранить настройки языка в профиле пользователя в базе данных, чтобы они сохранялись между сессиями.

Используя один из этих подходов, вы сможете контролировать, какая культура используется в вашем приложении, не позволяя браузеру автоматически изменять её при обновлении страницы.
Похожие вопросы