0

我正在学习界面本地化并在 Visual Studio 2008 中使用 WPF。我的程序的目标是让用户可以单击按钮并更改窗口中显示的语言。当用户单击按钮时,我一直在尝试在代码隐藏部分的运行时更改我的资源文件。

我已经阅读了这个问题:Programmatically change resource file language (resx) in Code Behind

但是,这似乎不是我的解决方案,因为我想对按钮单击事件进行上述更改。当我尝试这样做时,似乎我无法使用此解决方案,因为来自其他问题的受保护函数无法进入动作事件中。

根据上一个问题,这是我没有运气的尝试:

/// Change to English-US
        private void Button2_Click(object sender, RoutedEventArgs e)
        {
            protected override void InitializeCulture()
            {
               base.InitializeCulture();
               System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
            }
        }

/// Change to German
        private void Button3_Click(object sender, RoutedEventArgs e)
        {
            protected override void InitializeCulture()
            {
               base.InitializeCulture();
               System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE");
            }
        }

我已经在学校和自己编程了几年了,所以我不是一个绝对的菜鸟。但是,我是 C# 和 WPF 的新手,这就是我现在正在使用的。据我所知,你不能在一个函数中拥有一个函数,就像我在我的代码中那样。我把它放在那里的唯一原因是因为我需要它来处理按钮单击事件。

对此的帮助将不胜感激。

这是新代码:

namespace LocalizationConcept
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            Properties.Resources.Culture = new CultureInfo(ConfigurationManager.AppSettings["Culture"]);
            ///InitializeComponent();
        }

        /// Exit Button
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            System.Environment.Exit(0);
        }

        private void ChangeCulture(string cultureKey)
        {
            try
            {
                System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureKey);
            }
            catch (Exception err)
            {
                System.Environment.Exit(0);
            }
        }

        private void Button2_Click(object sender, RoutedEventArgs e)
        {
            ChangeCulture("en-US");
        }

        private void Button3_Click(object sender, RoutedEventArgs e)
        {
            ChangeCulture("de-DE");
        }
    }
}
4

2 回答 2

1

谈到本地化和全球化,WPF 似乎不支持 Winforms 的相同功能。尽管我发现了一些有趣的文章,它们逐步展示了如何在运行时动态替换语言。

  • WPF 本地化 - 即时语言选择
    • 它提供了在运行时即时替换语言的选项
    • 它比基于 XPath 的蹩脚 XML 绑定解决方案执行得更好
    • 它可以通过样式、控制模板和数据模板使用
    • 它使用默认和自定义格式化程序翻译带有参数的格式化文本
    • 它提供了一个翻译自定义标记扩展来编写优雅的 XAML

  • WPF 运行时本地化
    • 在运行时切换文化 - 自动更新所有本地化元素
    • 使用现有的资源文件结构(*.resx 文件),可以在 Visual Studio 中维护
    • 保持对在 Expression Blend(以及其他 XAML 设计应用程序)中工作的本地化元素的设计时支持
于 2013-07-08T18:28:59.037 回答
0

它不需要在它自己的功能中(尽管它可能是)。考虑以下:

    private void ChangeCulture(string cultureKey)
    {
        try
        {
            System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureKey);
        }
        catch (Exception err)
        {
            // That culture probably doesn't exist
        }
    }

    private void ButtonA_Click(object sender, EventArgs args)
    {
        ChangeCulture("en-US");
    }

    private void ButtonB_Click(object sender, EventArgs args)
    {
        ChangeCulture("de-DE");
    }

编辑:

我在另一篇文章中发现了这个,并获得了 +100 赏金,所以我想这是一个很好的解决方案。一探究竟。

于 2013-07-08T18:30:32.893 回答