Мне нужно изменить культуры во время выполнения в соответствии с файлами ресурсов для каждой культуры.
Ожидается
Пользователь нажимает кнопку, которая переключается с текущего языка на другой язык , Тексты на странице обновляются в соответствии с файлами ресурсов для каждой культуры.
Фактический
Пользователь нажимает кнопку, которая переключается с текущего языка на другой язык. Тексты на странице обновляются в соответствии с файлами ресурсов для каждой культуры. Как только пользователь выполняет какие-либо действия с любым компонентом (у меня есть несколько переключателей, кнопок и флажков), тексты go возвращаются к тому, что было написано в первый раз. Как будто 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.
services.AddScoped<AppState>();
services.AddMvc().AddMvcLocalization();
services.AddLocalization();
var supportedCultures = new List<CultureInfo> { new CultureInfo("en-US"), new CultureInfo("es-ES") };
services.Configure<RequestLocalizationOptions>(options =>
{
options.DefaultRequestCulture = new RequestCulture("es-ES");
options.SupportedUICultures = supportedCultures;
options.SupportedCultures = supportedCultures;
});
Компоненту добавляется объект AppState, а также объект IStringLocalizer для получения строк из файла ресурсов.
@inject AppState state
@inject IStringLocalizer<Index> _localizer
@implements IDisposable
<div class="uk-container" id="data_container">
<button @onclick="e => CambiarIdioma()">Holadenuevo</button>
<TablaReconocimientos @ref="tablaReconocimientos" searchText="@navigatableSearchInput"></TablaReconocimientos>
</div>
И затем имеет набор событий
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<TablaModos> _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();
}
}
Изображение как пример того, что происходит в данный момент: