繁体   English   中英

在RunTime上即时更改应用程序语言

[英]Change App language at RunTime on-the-fly

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

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

如何在不重新启动应用程序的情况下强制在运行时更新所有自定义控件的文本?

用这个:

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));

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

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

您可以在源代码的帮助下在运行时更改应用程序的语言。 我从这里获得了帮助并操纵了我的应用程序的语言设置页面,如下所示:
在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM