【问题标题】:C# change app language programmatically UWP realtimeC# 以编程方式更改应用程序语言 UWP 实时
【发布时间】:2019-02-20 22:47:39
【问题描述】:

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

【问题讨论】:

  • 在应用启动时设置CurrentUICulture属性。
  • 我知道。但是我需要更改语言而不立即重新启动。我们需要将其更改为正在运行的应用程序。

标签: c# windows-10 uwp


【解决方案1】:

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

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

  1. 使用 Windows.Globalization 添加;

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

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

    Frame.Navigate(this.GetType());
    

请注意,您需要将 PrimaryLanguageOverride 与系统文化进行比较以设置下次应用启动的语言,因为 PrimaryLanguageOverride 设置是持久的。如果您启用了页面缓存,当您动态应用不同的语言时,您需要先设置Frame.CacheSize = 0; 来清除缓存,然后再将其设置回来。

【讨论】:

  • 这个解决方案每次都对我有用,但第一种语言会改变。第一次更改语言后,我必须手动单击导航元素才能加载新语言的页面。对于之后的每次语言更改,页面都会使用正确的语言自动刷新。甚至在按照建议更改 CachSize 时也会发生此行为。
  • @ThisWillDoIt 你找到解决这个问题的方法了吗?否则,将其报告为错误可能是最好的主意...!?
  • 我让另一个应用程序正常运行并将它们相互比较。我仍然不知道为什么这种行为会发生在应用程序中(github.com/theWalli/EurekaRemake)。如果我决定在另一轮检查后报告它,那么最好/官方的地方是哪里?
  • 可以通过在构造函数中重置 ResourceContext 来解决,我知道为什么
  • 您好,如何刷新用户控件以更新最新语言?我的登录布局是 usercontrol :(
【解决方案2】:

对艾伦·姚的回答有所补充。少了一件: 设置Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride后,重新导航到当前页面之前,必须调用这两个函数:

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

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

最后一步更重要:创建商店包时,应确保将“生成应用程序包”设置值设置为“从不”。原因来自this article

否则,它将创建一个捆绑包。意思是他会砍 您的应用程序分成不同的部分以优化下载。仅有的 将下载与设备相关的部分。为了 例如,如果有不同分辨率的资产,它只会 下载适合设备的。同样的事情 语言,它只会下载与 设备的语言。因此,如果您尝试更改语言,它会下降 仍然依靠相同的基础语言,因为其他人不是 已安装。

【讨论】:

  • 出色的回复,避免了破坏 UI 流动性的解决方法(UI 线程延迟)。
【解决方案3】:

@ThisWillDoIt 和@Herdo

我添加了一个延迟,以便“第一次”在我的情况下起作用:

Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = languageCode;

await Task.Delay(100);

Frame.Navigate(this.GetType());

希望它对你有用。

【讨论】:

  • @Charlie 阅读我上面的 Péter Bozsó 答案,应该可以回答您的问题。
【解决方案4】:

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

修改后

ApplicationLanguages.PrimaryLanguageOverride = "en-US";

为了启动我的 LanguageManager 的 PropertyChanged 事件,我查看了属性 resourceContext.Languages[0],这是在 App.xamlx: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 框架而异,并且可能需要重新启动应用。

【讨论】:

  • 是 ApplicationLanguages.PrimaryLanguageOverride = "en-US";应该使用。
【解决方案5】:

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

【讨论】:

  • Window.Current.Content as Frame 为 NULL
猜你喜欢
  • 2018-08-09
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 2012-05-29
  • 2023-03-24
相关资源
最近更新 更多