WPF 多语言实现

很多国际化的程序都提供了多语言的选项,这样方便不同国家的使用者更方便的使用软件。这篇博客中将介绍在WPF中实现多语言的方式。

方式一,使用WPF动态资源的方式实现。先简单介绍下StaticResource和DynamicResource,这两者的区别在于动态资源改变后会实时的体现出来,而静态资源只加载一次,后面对资源的任何改变都不会体现出来。显而易见,使用动态资源会降低系统的性能。

新建一个工程,添加ZH.xaml与EN.xaml两个资源文件,用于放置界面显示的文案;

 

MainWindow.xaml:

    <Grid>
        <StackPanel>
            <TextBlock Text="{DynamicResource Greeting}"/>

            <Button Content="{DynamicResource Language}" Width="100" Height="35" Click="SwitchButton_Click"/>
        </StackPanel>
    </Grid>

切换语言方法:

复制代码
        private string _currentLan = string.Empty;
        public MainWindow()
        {
            InitializeComponent();

            _currentLan = "ZH";
        }

        private void SwitchButton_Click(object sender, RoutedEventArgs e)
        {
            string message = TryFindResource("Message") as string;

            MessageBox.Show(message);

            // TODO: 切换系统资源文件
            ResourceDictionary dict = new ResourceDictionary();

            if(_currentLan == "ZH")
            {
                dict.Source = new Uri(@"Resources\Language\EN.xaml", UriKind.Relative);

                _currentLan = "EN";
            }
            else
            {
                dict.Source = new Uri(@"Resources\Language\ZH.xaml", UriKind.Relative);

                _currentLan = "ZH";
            }

            Application.Current.Resources.MergedDictionaries[0] = dict;
        }
复制代码

运行效果:

代码点击这里下载。

方式二,Xml文件+XPath的方式来实现。

项目结构:

新建两个xml文件,Chinese.xml和English.xml。

<?xml version="1.0" encoding="utf-8"?>
<language>
  <resources>
    <resource name="Greeting">你好 WPF世界!</resource>
  </resources>
</language>

使用:

<TextBlock>
    <TextBlock.Text>
       <Binding Source="{StaticResource Lang}" XPath="resource[@name='Greeting']" />
    </TextBlock.Text>
</TextBlock>

切换语言:

复制代码
        private string _currentLang = string.Empty;
        public MainWindow()
        {
            InitializeComponent();

            _currentLang = "Zh";
        }

        private void SwitchButton_Click(object sender, RoutedEventArgs e)
        {
            // TODO: Switch Language

            XmlDataProvider provider = TryFindResource("Lang") as XmlDataProvider;

            if (provider == null)
                return;

            if(_currentLang == "Zh")
            {
                provider.Source = new Uri("Languages/English.xml", UriKind.Relative);

                _currentLang = "En";
            }
            else
            {
                provider.Source = new Uri("Languages/Chinese.xml", UriKind.Relative);

                _currentLang = "Zh";
            }

            provider.Refresh();
        }
复制代码

运行效果:

代码点击这里下载。

当然实现多语言的方式有很多方式,例如:

http://www.codeproject.com/Articles/35159/WPF-Localization-Using-RESX-Files

感谢您的阅读。谢谢!

posted @   Yang-Fei  阅读(13592)  评论(4编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示