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

时间:2015-09-22 11:30:06

标签: c# windows-10 uwp

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

5 个答案:

答案 0 :(得分:29)

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

例如:我支持两种语言" en"和" fr",本地化的消息将显示在文本块中。

  1. 使用Windows.Globalization添加;

  2. 更改" en"的默认语言到" fr"由

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

    Frame.Navigate(this.GetType());
    
  4. 请注意,您需要将PrimaryLanguageOverride与系统区域性进行比较,以设置下次应用启动的语言,因为PrimaryLanguageOverride设置是持久的。如果您启用了页面缓存,当您动态应用其他语言时,您需要先设置Frame.CacheSize = 0;然后再将其设置为清除缓存。

答案 1 :(得分:8)

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”。来自this article的原因:

  

因为否则会创建一个包。这意味着他会削减   将您的应用程序分成不同的部分以优化下载。只要   将下载与设备相关的部件。对于   例如,如果有不同分辨率的资产,则只会   下载适合该设备的那些。同样的事情   语言,它只会下载与之相关的资源文件   设备的语言。因此,如果你试图改变语言,它就会失败   仍然依赖于相同的基础语言,因为其他人不是   安装。

答案 2 :(得分:4)

@ThisWillDoIt和@Herdo

我添加了延迟,以便" First"在我的情况下它会起作用的时间:

Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = languageCode;

await Task.Delay(100);

Frame.Navigate(this.GetType());

希望它有助于你。

答案 3 :(得分:2)

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

修改

ApplicationLanguages.PrimaryLanguageOverride = "en-US";

我查看了属性resourceContext.Languages[0],以便启动我的语言管理器的PropertyChanged事件,该事件是StaticResources App.xaml x:Key = Loc。{ / p>

    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框架而异,可能需要重新启动应用程序。

答案 4 :(得分:0)

不幸的是,如果页面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;