C#以编程方式更改应用程序语言UWP实时

在我的应用程序中,每个语言字符串资源都是单独存储的,并根据语言环境的类型显示。 我想在应用程序设置中更改语言。 如何在语言选择后立即将其应用于用户界面?

我们可以使用ApplicationLanguages.PrimaryLanguageOverride在运行时更改语言而无需重新启动应用程序。

例如:我有两种语言支持“en”和“fr”,本地化的消息将显示在textblock中。

  1. 使用Windows.Globalization添加;

  2. 将默认语言从“en”更改为“fr”

    ApplicationLanguages.PrimaryLanguageOverride = "fr"; 
  3. 重新导航到当前页面以刷新UI。

     Frame.Navigate(this.GetType()); 

请注意,您需要将PrimaryLanguageOverride与系统区域性进行比较,以设置下次应用启动的语言,因为PrimaryLanguageOverride设置是持久的。 如果您启用了页面缓存,当您动态应用其他语言时,您需要通过设置Frame.CacheSize = 0;来清除缓存Frame.CacheSize = 0; 先把它放回去。

Alan Yao回答的一些补充。 缺少一个:在设置Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride ,在重新导航到当前页面之前,必须调用以下两个函数:

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

这样您就不需要Michael Woolsey提到的Task.Delay()变通方法。

另一个重要的最后一步:创建Store包时,应确保将“Generate app bundle”设置值设置为“Never”。 本文的原因:

否则,它会创建一个包。 这意味着他会将您的应用程序分成不同的部分以优化下载。 仅下载与设备相关的部件。 例如,如果有不同分辨率的资产,则只下载适合该设备的资产。 对于语言来说,它只会下载与设备语言相关的资源文件。 因此,如果您尝试更改语言,它仍将落在相同的基本语言上,因为其他语言未安装。

@ThisWillDoIt和@Herdo

我添加了一个延迟,以便在我的情况下它可以工作的“第一”时间:

 Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = languageCode; await Task.Delay(100); Frame.Navigate(this.GetType()); 

希望它有助于你。

有一个MSDN页面描述了Windows 8.1中关于语言的新篇章。

修改后

 ApplicationLanguages.PrimaryLanguageOverride = "en-US"; 

我看了属性resourceContext.Languages[0] ,以便启动我的LanguageManager的PropertyChanged事件,这是一个在App.xaml中用x:Key = Loc声明的StaticResources

  private void ButtonEn_OnClick(object sender, RoutedEventArgs e) { ApplicationLanguages.PrimaryLanguageOverride = "en-US"; UpdateLang("en-US"); } private async void UpdateLang(string newLang) { var resourceContext = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView(); while (true) { if (resourceContext.Languages[0] == newLang) { var loc = Application.Current.Resources["Loc"] as LanguagesManager; loc.ChangeLang(); break; } await Task.Delay(100); } } 

while (true)仅用于测试,实际上最好通过“备份”来逃避,因为

这些要求可能因应用程序使用的UI框架而异,可能需要重新启动应用程序。

不幸的是,如果NavigationCacheMode设置为页面的"Required" ,则上述答案都没有帮助。 这是解决我的问题的代码。

 ApplicationLanguages.PrimaryLanguageOverride = language; await Task.Delay(300); Frame rootFrame = Window.Current.Content as Frame; rootFrame.Content = null; rootFrame = null; rootFrame = new Frame(); rootFrame.Navigate(typeof(MainPage), null); Window.Current.Content = rootFrame;