我正在处理多语言站点。
我有一个局部视图,该方法是为网站设置特定语言。
<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");
}
我该如何解决这个问题? 我可以做这种多语言的事情吗?
答案 0 :(得分:1)
ASP.Net Core,它更专注于异步编码,这意味着任务是逐个部分运行的。因此,控制器的动作是一项任务。 RedirectToPage是另一个任务(或多个任务)。
使用池(在任务完成时重新使用线程)在不同线程(由TaskSchedular)中运行任务。因此,没有保证它在同一线程中运行。
您可以在SetLanguage方法中尝试使用CultureInfo.DefaultThreadCurrentCulture Property,如下所示:
CultureInfo newCulture = new CultureInfo(culture);
CultureInfo.DefaultThreadCurrentCulture = newCulture;
CultureInfo.DefaultThreadCurrentUICulture = newCulture;
然后在索引中获得CurrentThread.CurrentCulture
var currentCulture = Thread.CurrentThread.CurrentCulture;