В .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. **Поддержка сессий и пользователей**:
Если ваше приложение требует аутентификации, вы можете хранить настройки языка в профиле пользователя в базе данных, чтобы они сохранялись между сессиями.
Используя один из этих подходов, вы сможете контролировать, какая культура используется в вашем приложении, не позволяя браузеру автоматически изменять её при обновлении страницы.