Изменение языка в UWP не меняет язык системных функций - только при перезапуске приложения

У меня есть приложение UWP.

И мне нужно изменить локаль на лету, поэтому у меня есть это для смены языка:

Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = language.FourDigitCode;
ResourceContext.GetForViewIndependentUse().Reset();
ResourceContext.GetForCurrentView();

Но есть проблема в том, что язык системных функций не переключается (только после перезапуска приложения), как я могу это исправить?

Вот пример:

Теперь я запускаю этот код:

Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "lv-LV";
ResourceContext.GetForViewIndependentUse().Reset();
ResourceContext.GetForCurrentView();

Пользовательский интерфейс локализуется, но системные функции все еще остаются нелокализованными:

Но когда я перезапускаю приложение, все в порядке:

Любые идеи, как я могу это исправить?

2 ответа

Я боюсь, что нет решения для этого, и то, что вы видели, было разработано. Ссылка на замечания по свойству PrimaryLanguageOverride:

Когда вы устанавливаете PrimaryLanguageOverride, это немедленно отражается в свойстве Languages. Однако это изменение может не вступить в силу немедленно для ресурсов, загруженных в пользовательском интерфейсе приложения. Чтобы приложение реагировало на такие изменения, вы можете прослушивать свойство QualifierValues в контексте ресурса по умолчанию и предпринимать любые действия, которые могут потребоваться для перезагрузки ресурсов. Эти требования могут различаться в зависимости от инфраструктуры пользовательского интерфейса, используемой приложением, и может потребоваться перезапустить приложение.

Для вашего сценария требуется перезагрузка. Я бы посоветовал добавить подсказку, чтобы пользователи могли перезапустить приложение, а также кнопку, чтобы закрыть приложение, как в приложении "Новости".
И чтобы закрыть приложение, мы можем вызвать метод Application.Exit, как показано ниже.

Application.Current.Exit();

Может быть, перезагрузка страницы может это исправить? Попробуйте повторно перейти на ту же страницу. Нашел пример ниже здесь.

//like this
private bool Reload(object param = null)
{
    var type = Frame.CurrentSourcePageType; 
    Frame.Navigate(type, param);
    Frame.BackStack.Remove(Frame.BackStack.Last());
}

// or like this
private bool Reload(object param = null)
{
    var frame = Window.Current.Content as Frame; 
    frame.Navigate(frame.CurrentSourcePageType, param);
    frame.BackStack.Remove(frame .BackStack.Last());
}
Другие вопросы по тегам