Blazor - Изменение пользовательского интерфейса CultureInfo во время выполнения - PullRequest
1 голос
/ 08 апреля 2020

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

Ожидается

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

Фактический

Пользователь нажимает кнопку, которая переключается с текущего языка на другой язык. Тексты на странице обновляются в соответствии с файлами ресурсов для каждой культуры. Как только пользователь выполняет какие-либо действия с любым компонентом (у меня есть несколько переключателей, кнопок и флажков), тексты 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();
    }

}

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

...