Изменение языка в 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());
}