ASP.NET Core MVC, заданная культура потоков не имеет эффекта - PullRequest
0 голосов
/ 12 мая 2019

Я имею дело с мультиязычным сайтом.

У меня есть частичное представление , где мой подход заключается в установке определенного языка для моего сайта.

<form asp-controller="Language" asp-action="SetLanguage" method="post" class="form-horizontal">
    <label>Language:</label>
    <select name="culture">
        <option value="hu">Magyar</option>
        <option value="eng">English</option>
    </select>
    <button type="submit" class="btn btn-link navbar-btn navbar-link">Change</button>
</form>

Пока я отлаживаю, я могу проверить, что культура была установлена ​​правильно, но когда мой RedirectToPage(...) позвонил, я снова отлаживаю, и мой CurrentThread.CurrentCulture возвращается к тому же, что и был.

public IActionResult SetLanguage(string culture)
{
    string cookieCultureValue = culture;
    Response.Cookies.Append(
        CookieRequestCultureProvider.DefaultCookieName,
        CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(cookieCultureValue)),
        new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
    );

    Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);

    return RedirectToPage("/Index");
}

Как я мог решить эту проблему? Я правильно делаю эту мультиязычность?

1 Ответ

1 голос
/ 13 мая 2019

ASP.Net Core, он больше сосредоточен на асинхронном кодировании, то есть задачи выполняются для каждой части.Таким образом, действие контроллера - это 1 задача.RedirectToPage - это еще одна задача (или несколько задач).

Задачи выполняются в разных потоках (посредством TaskSchedular) с использованием пула (повторное использование потоков по завершении задачи).И поэтому нет гарантии, что он будет запущен в том же потоке.

Вы можете попробовать CultureInfo.DefaultThreadCurrentCulture в вашем методе SetLanguage, как показано ниже:

CultureInfo newCulture = new CultureInfo(culture);

CultureInfo.DefaultThreadCurrentCulture = newCulture;
CultureInfo.DefaultThreadCurrentUICulture = newCulture;

Тогдаполучить CurrentThread.CurrentCulture в индексе

var currentCulture = Thread.CurrentThread.CurrentCulture;
...