【问题标题】:Change App language at RunTime on-the-fly在运行时即时更改应用程序语言
【发布时间】:2013-12-19 03:34:16
【问题描述】:

我目前正在开发一个 Metro 应用程序,在该应用程序中,用户可以在运行时更改当前语言,并且所有加载的自定义控件都必须根据新语言更新其文本。问题是当我使用以下代码更改语言时,应用程序语言会发生变化,但它只会在我重新启动应用程序时更新文本,因为已经呈现的页面和控件已被缓存。

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

我应该怎么做才能在运行时强制更新所有自定义控件的文本而不重新启动我的应用程序?

【问题讨论】:

    标签: c# windows-runtime windows-8.1


    【解决方案1】:

    使用这个:

    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. 在按钮单击时更改 PrimaryLanguageOverride,然后重新加载页面 2. 在页面结构中重置资源;问题是我必须单击两次按钮才能实际更改当前页面上的文本
    • 我遇到了同样的问题,谢谢你我解决了!真的很奇怪
    【解决方案2】:

    为了立即响应,您需要重置资源管理器的上下文。

    对于 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

    【讨论】:

    • 您知道如何在 Windows Phone 8.1 上执行此操作吗?它在 Win8.1 上运行良好,但在 WinPhone8.1 上,如果不重新启动应用程序,语言不会更新。
    【解决方案3】:

    您可以借助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 页面后面的代码上做了什么之前,您必须按照前面所述的链接实现代码。并且可能会注意到我正在使用 windows phone 8

    【讨论】:

      猜你喜欢
      • 2014-09-03
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多