2013-12-03 2 views
9

В настоящее время я разрабатываю приложение метро, ​​в котором пользователь может изменить текущий язык во время выполнения, и все загружаемые пользовательские элементы управления должны обновить свой текст относительно нового языка. Проблема заключается в том, что при изменении языка с помощью следующего кода язык приложения изменяется, но он обновляет текст только при перезагрузке приложения, потому что страницы и элементы управления, которые уже отображаются, кэшируются.Изменить язык приложения на RunTime на лету

LocalizationManager.UICulture = new System.Globalization.CultureInfo((string)((ComboBoxItem)e.AddedItems[0]).Tag); 
Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = ((ComboBoxItem)e.AddedItems[0]).Tag as String; 

Что нужно сделать, чтобы принудительно обновить текст всех пользовательских элементов управления во время выполнения без перезагрузки моего приложения?

ответ

2

Используйте это:

var NewLanguage = (string)((ComboBoxItem)e.AddedItems[0]).Tag; 

Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = NewLanguage; 

Windows.ApplicationModel.Resources.Core.ResourceContext.GetForViewIndependentUse().Reset(); 
//Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Reset(); 

Windows.ApplicationModel.Resources.Core.ResourceManager.Current.DefaultContext.Reset(); 

, а затем перезагрузить страницу, используя метод Navigate:

if (Frame != null) 
    Frame.Navigate(typeof(MyPage)); 
+1

У меня была какая-то странная проблема, когда я нажимал кнопку, чтобы изменить язык, короткая короткая история: 1. измените PrimaryLanguageOverride на кнопку, а затем перезагрузите страницу 2. на странице перезагружать исходники; проблема в том, что мне пришлось дважды щелкнуть по кнопке, чтобы на самом деле изменить текст на текущей странице. –

+0

У меня была такая же проблема, благодаря вам я исправил ее! это действительно странно – PrisonMike

1

Чтобы сразу ответить, вам необходимо сбросить контекст диспетчера ресурсов.

Для Windows 8.1: var resourceContext = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView();

resourceContext.Reset();

Вам все равно придется принудительно перерисовать свою страницу и, таким образом, повторно запросить ресурсы, чтобы изменения произошли. Для Windows 8, вы можете увидеть https://timheuer.com/blog/archive/2013/03/26/howto-refresh-languages-winrt-xaml-windows-store.aspx

+1

Знаете ли вы, как это сделать на Windows Phone 8.1? Он отлично работает на Win8.1, но на WinPhone8.1 язык не обновляется без перезапуска приложения. –

+0

спасибо, по крайней мере, работал на Win8.1 (планшет/рабочий стол) – Quincy

1

Вы можете изменить язык приложения во время выполнения с помощью this Исходный код. Я принял помощь от этого и манипулировали страницу настроек языка моего приложения следующим образом:
В languageSettings.xaml.cs:

public partial class LanguageSettings : PhoneApplicationPage 
    { 
     public LanguageSettings() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnNavigatedTo(NavigationEventArgs e) 
     { 
      base.OnNavigatedTo(e); 

      if (ChangeLanguageCombo.Items.Count == 0) 
      { ChangeLanguageCombo.Items.Add(LocalizationManager.SupportedLanguages.En); 
       ChangeLanguageCombo.Items.Add(LocalizationManager.SupportedLanguages.Bn); 
      } 
      SelectChoice(); 
     } 



     private void ButtonSaveLang_OnClick(object sender, RoutedEventArgs e) 
     { 
      //Store the Messagebox result in result variable 

      MessageBoxResult result = MessageBox.Show("App language will be changed. Do you want to continue?", "Apply Changes", MessageBoxButton.OKCancel); 

      //check if user clicked on ok 
      if (result == MessageBoxResult.OK) 
      { 

       var languageComboBox = ChangeLanguageCombo.SelectedItem; 

       LocalizationManager.ChangeAppLanguage(languageComboBox.ToString()); 
       //Application.Current.Terminate(); I am commenting out because I don't neede to restart my app anymore. 
      } 
      else 
      { 
       SelectChoice(); 
      } 
     } 

     private void SelectChoice() 
     { 
      //Select the saved language 

      string lang = LocalizationManager.GetCurrentAppLang(); 
      if(lang == "bn-BD") 
       ChangeLanguageCombo.SelectedItem = ChangeLanguageCombo.Items[1]; 
      else 
      { 
       ChangeLanguageCombo.SelectedItem = ChangeLanguageCombo.Items[0]; 
      } 
     } 
    } 

*** Примечание: Прежде чем понять, что я сделал на LanguageSettings код страницы позади, вам должен реализовать коды из ссылки, как указано ранее. А также можно отметить, что я работаю над окном телефона 8

Смежные вопросы