При StateHasChanged() языковая культура возвращается к языку по умолчанию (Blazor).C#

Место общения программистов C#
Anonymous
При StateHasChanged() языковая культура возвращается к языку по умолчанию (Blazor).

Сообщение Anonymous »

Я реализовал два языка в приложении Blazor: у меня есть CultureSelector (выбор языков) и CultureController, который устанавливает культуру в виде файла cookie. Я также использую IStringLocalizer с файлами ресурсов для сопоставления каждого из них. Это работает до тех пор, пока моя страница бритвы под названием «DevicePage.razor» не получит данные через поток, который выглядит примерно так:

Код: Выделить всё

 stream = await StreamSubscriber.CreateAsync(clusterClient, "facility", FacilityId, async (entry) =>
{

if (entry.FacilityId == FacilityId)
{
await InvokeAsync(() =>
{

if (!Devices.ContainsKey(entry.Id))
{
return;
}
else
{
Devices[entry.Id].Entries.Add(entry);
StateHasChanged();

}

});
Всякий раз, когда запускается StateHasChanged(), это выглядит почти так, как будто пользовательский интерфейс переключается между новым языком и языком по умолчанию (а иногда и прямо к ключу используемых файлов ресурсов).
Мой CultureController:

Код: Выделить всё

[Route("[controller]/[action]")]
public class CultureController : Controller
{
public IActionResult Set(string culture, string redirectUri)
{
if (culture != null)
{
HttpContext.Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(
new RequestCulture(culture, culture)));
}

return LocalRedirect(redirectUri);
}
}
CultureSelector:

Код: Выделить всё



[img]https://upload.wikimedia.org/wikipedia/commons/8/83/Flag_of_the_United_Kingdom_%283-5%29.svg[/img]
English



[img]https://upload.wikimedia.org/wikipedia/commons/d/d9/Flag_of_Norway.svg[/img]
Norsk



@code {
private CultureInfo selectedCulture = CultureInfo.CurrentCulture;

private CultureInfo[] supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("nb-NO"),
};

private async Task OnCultureChanged(CultureInfo newCulture)
{
if (CultureInfo.CurrentCulture != newCulture)
{
var uri = new Uri(Navigation.Uri)
.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped);
var cultureEscaped = Uri.EscapeDataString(newCulture.Name);
var uriEscaped = Uri.EscapeDataString(uri);

Navigation.NavigateTo(
$"Culture/Set?culture={cultureEscaped}&redirectUri={uriEscaped}",
forceLoad: true);
}
}
}
Возможно, есть вещи, о которых я не знаю, которые, вероятно, очевидны для того, как следует использовать StateHasChanged(), но наверняка есть и другие шаги, которые я упускаю или пропустил через голову. как этого не допустить? Сообщите мне, если информации не хватает, и о том, что я могу предоставить, чтобы помочь вам понять причину проблемы.
Я пробовал множество вещей:

[*]Установите CultureInfo.CurrentCulture на контроллере. – Я ожидал, что он сможет изменить культуру во время выполнения, поскольку он продолжал возвращать en-GB, но как я читаю в Интернете, это не так.
[*]Установите CultureInfo.DefaultThreadCurrentCulture и CultureInfo.DefaultThreadCurrentUICulture. На самом деле это решило проблему очень плохим способом, насколько я понимаю, это меняется не только для пользователя, но и для всех, кто обращается к странице. И я мог вызвать это только через метод настройки контроллера и CultureSelector, и я понятия не имел, как и где получить доступ к файлу cookie, чтобы затем установить Культуру, если веб-сайт внезапно перезапустится.
< /ol>
Я пробовал и другие вещи, но мне казалось, что я никогда не понимал, что на самом деле делаю, чтобы иметь возможность правильно объяснить это здесь.

Подробнее здесь: https://stackoverflow.com/questions/787 ... guage-blaz

Вернуться в «C#»