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

Ale*_*SRG 16 c# windows-10 uwp

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

Ala*_*SFT 31

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

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

  1. 使用Windows.Globalization添加;

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

    ApplicationLanguages.PrimaryLanguageOverride = "fr";
    
    Run Code Online (Sandbox Code Playgroud)
  3. 重新导航到当前页面以刷新UI.

    Frame.Navigate(this.GetType());
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 这个解决方案每次都适用于我,但第一语言改变了.在第一次语言更改后,我必须手动单击导航元素才能加载具有新语言的页面.对于之后的每个语言更改,页面将使用正确的语言自动刷新.当按照建议更改CachSize时,甚至会发生此行为. (5认同)
  • 可以通过在构造器中重置ResourceContext来解决,idk为什么 (2认同)

Pét*_*zsó 10

Alan Yao回答的一些补充.有一个缺失的部分:在Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride重新导航到当前页面之后设置和之前,您必须调用这两个函数:

Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Reset();
Windows.ApplicationModel.Resources.Core.ResourceContext.GetForViewIndependentUse().Reset();
Run Code Online (Sandbox Code Playgroud)

这样您就不需要Task.Delay()Michael Woolsey提到的解决方法.

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

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