使用 WPF 以编程方式更改语言/资源

问题描述 投票:0回答:2

我有一个 DropDown(使用 MahApps,如果这很重要),我想用它来在我的程序中“动态”切换语言。

语言班

namespace SAM
{
    public class Language
    {
        public string Title { get; set; }
        public string Culture { get; set; }
    }
}

更改语言

private void DropLanguage_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
    Language lang = DropLanguage.SelectedItem as Language;
    System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang.Culture);
}

我将所有字符串作为资源

Resources.resx
(默认)和
Resources.en.resx
(英语)

3个问题我不明白

  • 从下拉列表中选择“英语”时,语言不会立即更改,但是当我单击某项时。其他,例如“关闭”(它询问“确定?”),语言已更改。
  • 直接位于 .xaml 文件中的字符串(如
    <TextBlock Text="{x:Static p:Resources.Config_HeaderBar_Find_Speaker}" />
    )根本不会更新。
  • 奖励:我如何切换回默认语言,因为
    new CultureInfo(lang.Culture);
    需要一个参数,而对于默认语言,我有
    Culture = null
    (因为 Resources.resx 的名称中没有任何内容)。将文件更改为
    Resources.default.resx
    会严重扰乱我的代码...
c# wpf xaml
2个回答
4
投票

我尝试解决类似的问题。对我来说最简单的解决方案是将所有 Window 内容移动到 UserControl 并使用方法freshLanguage()为窗口创建一个界面。然后我从模型中调用:

private void SetLanguage(string cultureName)
    {
        var cul = new System.Globalization.CultureInfo(cultureName);
        Properties.Resources.Culture = cul;
        System.Globalization.CultureInfo.DefaultThreadCurrentCulture = cul;
        System.Globalization.CultureInfo.DefaultThreadCurrentUICulture = cul;
        System.Threading.Thread.CurrentThread.CurrentUICulture = cul;
        System.Threading.Thread.CurrentThread.CurrentCulture = cul;

        InitializeHamburgerMenu();
        MainWindowView.RefreshLanguage();
        RaisePropertyChanged("Title");
    }

窗口中的 RefreshLanguage 看起来像:

 public void RefreshLanguage()
    {
        GlobalUserControl content = new GlobalUserControl("Views/SettingsPage.xaml");
        ContentPresenter_GlobalUserControl.Content = content;
    }

在我的例子中,UserControl 提供导航,因此我将最后导航的 URI 作为参数传递。因此,如果您需要保留状态,可以将其作为参数传递给新的 UserControl。 重新创建用户控件会导致所有字符串重新加载,而无需重新创建窗口。也许在这里调用

GC.Collect();
是个好主意,但这取决于您的场景。

关于默认的中立文化。对我来说,打电话

SetLanguage("")


0
投票

有2件事

Thread.CurrentThread.CurrentCulture  

Thread.CurrentThread.CurrentUICulture

为了设置这些值,请使用静态方法

CultureInfo.GetCultureInfo(String langCode)

其中参数 langCode 的一些示例是以下字符串

"de-DE"
"en-US"

等等

更多信息请访问

https://msdn.microsoft.com/en-us/library/yck8b540(v=vs.110).aspx

因此,总的来说,这些代码行应该有助于德语的改变:

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("de-DE");
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("de-DE");
© www.soinside.com 2019 - 2024. All rights reserved.