Blazor — изменение пользовательского интерфейса CultureInfo во время выполненияC#

Место общения программистов C#
Ответить
Anonymous
 Blazor — изменение пользовательского интерфейса CultureInfo во время выполнения

Сообщение Anonymous »

Мне нужно изменить язык и региональные параметры во время выполнения в соответствии с файлами ресурсов для каждого языка.

Ожидается

Пользователь нажимает кнопку, которая переключается с текущего языка на другой язык. Тексты на странице обновляются в соответствии с файлами ресурсов для каждой культуры.

Фактическое

Пользователь нажимает кнопку, которая переключается с текущего языка на другой язык. Тексты на странице обновляются в соответствии с файлами ресурсов для каждой культуры. Как только пользователь выполняет какое-либо действие над каким-либо компонентом (у меня есть несколько переключателей, кнопок и флажков), тексты возвращаются к тому, что было написано в первый раз. Как будто CultureInfo вообще не изменилась.

Попытки

Создал класс AppState, который внедряется в компоненты

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

    public class AppState
{
public CultureInfo currentCulture { get; private set; } = CultureInfo.CurrentCulture;
public event Action OnChange;
public void ChangeCulture(CultureInfo newCulture)
{
currentCulture = newCulture;
System.Threading.Thread.CurrentThread.CurrentCulture.ClearCachedData();
System.Threading.Thread.CurrentThread.CurrentUICulture.ClearCachedData();
System.Threading.Thread.CurrentThread.CurrentCulture = newCulture;
System.Threading.Thread.CurrentThread.CurrentUICulture = newCulture;
NotifyStateChanged();
}

public CultureInfo getCurrentCulture()
{
if (currentCulture == null)
{
ChangeCulture(CultureInfo.CurrentCulture);
}
return currentCulture;

}

private void NotifyStateChanged() => OnChange?.Invoke();
}
Добавлена ​​локализация проекта в startup.cs и AppState Instante

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

        services.AddScoped();
services.AddMvc().AddMvcLocalization();
services.AddLocalization();
var supportedCultures = new List { new CultureInfo("en-US"), new CultureInfo("es-ES") };
services.Configure(options =>
{
options.DefaultRequestCulture = new RequestCulture("es-ES");
options.SupportedUICultures = supportedCultures;
options.SupportedCultures = supportedCultures;
});
Компонент содержит внедренный AppState, а также объект IStringLocalizer для получения строк из файла ресурсов.

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

@inject AppState state
@inject IStringLocalizer _localizer

@implements IDisposable

Holadenuevo



И затем устанавливаются события

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

    protected override void OnInitialized()
{
_lematizador = new LematizadorService();

state.OnChange += OnCultureChange;
}

public void Dispose()
{
state.OnChange -= OnCultureChange;
}
private void CambiarIdioma()
{
if (state.getCurrentCulture().Equals(new CultureInfo("es-ES")))
{
state.ChangeCulture(new CultureInfo("en-US"));
}
else
{
state.ChangeCulture(new CultureInfo("es-ES"));
}
}

private void OnCultureChange()
{
CultureInfo.CurrentCulture = state.currentCulture;
CultureInfo.CurrentUICulture = state.currentCulture;

StateHasChanged();
}
Итак, теперь при нажатии кнопки, вызывающей CambiarIdioma(), проект работает нормально. Но как только внутри компонента выполняется какое-либо действие (скажем, я проверяю что-то внутри компонента TablaReconocimientos или нажимаю на переключатель), тексты возвращаются в исходные строки.

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

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

@inject AppState state
@inject IStringLocalizer _localizer

@implements IDisposable

@*Component stuff*@

@functions{
protected override void OnInitialized()
{
state.OnChange += OnCultureChange;
}

public void Dispose()
{
state.OnChange -= OnCultureChange;
}

private void OnCultureChange()
{
CultureInfo.CurrentCulture = state.currentCulture;
CultureInfo.CurrentUICulture = state.currentCulture;

StateHasChanged();
}

}
Изображение как пример того, что происходит в данный момент:
Изображение


Подробнее здесь: https://stackoverflow.com/questions/611 ... at-runtime
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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