首页 > 其他分享 >不一样的WPF多语言切换方案

不一样的WPF多语言切换方案

时间:2024-05-17 17:55:54浏览次数:22  
标签:文件 resx 语言 切换 WPF Net Resources

前言

  作为技术而言,我并不认为多语言有什么值得深入研究的地方,本来也没打算开这个话题。前段时间看到了群里有朋友在讨论这个,一想到它确实也算一个比较常用的功能,所以决定对它做一个封装,如果您正好需要,希望对您有帮助。

  多语言切换一般有两种方案,一种是使用资源字典(xaml文件)来实现,还有一种是资源文件(resx文件)来实现,xaml文件的方式优点是比较简单,只要替换掉原来的xaml文件就可以实现在运行中切换语言,resx的方式优点是它是官方的推荐方案,很多第三方库都是使用的这种方案,但是它的缺点很明显,那就是不能在运行时切换。

  我们今天采用第二种使用资源文件(resx)的方式,并让它可以在运行时切换,很多人可能就想问,为什么不用第一种资源字典(xaml)的方式呢?那是因为第一种方式它不是官方推荐的方式,对于一个软件来说,可能会引用很多第三方库,如果使用第一种方式可能就需要实现两种多语言切换方案,从软件设计角度来说这不是一个好的方案。

一、使用步骤

1.1 新建WPF项目,引用NuGet包“QS.WPF.Toolkit.GlobalizationSourceGenerator”;

dotnet add package QS.WPF.Toolkit.GlobalizationSourceGenerator --version 1.0.3

1.2 添加资源文件(名称为Resource.resx或Resources.resx);

    1.2.1 将资源文件的访问修饰符改为Public(鼠标双击Resource.resx文件打开);

     1.2.2 添加多语言版本文字(建议使用ResX Manager);

   当然你也可以自己添加,以下是添加后的效果。

 1.3 在界面上绑定资源

<Window
    x:Class="WpfApp20.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:WpfApp20"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:res="clr-namespace:WpfApp20.Resources"
    Title="MainWindow"
    Width="800"
    Height="450"
    mc:Ignorable="d">
    <Grid>
        <TextBlock
            HorizontalAlignment="Center"
            VerticalAlignment="Center"
            Text="{Binding Source={x:Static res:ResourceExtension.Instance}, Path=Welcome}" />
    </Grid>
</Window>

智能提示可用

 设计视图可用

 1.4 语言切换

xaml

<Window
    x:Class="WpfApp20.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:WpfApp20"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:res="clr-namespace:WpfApp20.Resources"
    Title="MainWindow"
    Width="800"
    Height="450"
    FontSize="16"
    mc:Ignorable="d">
    <Grid>
        <StackPanel
            Margin="0,2,2,0"
            HorizontalAlignment="Right"
            VerticalAlignment="Top"
            Orientation="Horizontal">
            <Button Width="80" Click="Button_Click">中文</Button>
            <Button Width="80" Click="Button_Click_1" Margin="2,0,0,0">English</Button>
        </StackPanel>
        <TextBlock
            HorizontalAlignment="Center"
            VerticalAlignment="Center"
            Text="{Binding Source={x:Static res:ResourceExtension.Instance}, Path=Welcome}" />
    </Grid>
</Window>

cs

using System.Windows;

namespace WpfApp20
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            WpfApp20.Resources.ResourceExtension.Instance.CurrentCulture = "zh-CN";
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            WpfApp20.Resources.ResourceExtension.Instance.CurrentCulture = "en-US";
        }
    }
}

完成后效果

二、实现原理

    细心的朋友可能第一个疑问就是ResourceExtension这个类怎么来的,这里使用了一个叫源码生成器的技术(如果没了解过可以自行搜索,了解的话自行略过),它是在编译阶段执行的,通过这个特性,我们可以在编译阶段读取Resource文件,然后根据这个文件里的静态属性来生成ResourceExtension类,这个类实现了属性通知的功能,当CurrentCulture属性被更改后,会循环调用OnPropertyChanged方法来触发所有的属性通知事件,如此就实现了运行时的语言切换。如果对生成的源代码感兴趣可以在项目依赖项的分析器下找到生成的代码。

 三、疑问解答

3.1 支持的.Net版本有哪些?

    .Net Framework>=4.5,.Net Core>=5.0。

3.2 为什么资源文件名必须是Resource或Resources?

    因为在.Net Framework WPF项目中,资源文件名默认是Resources,而在.Net Core WPF中资源文件名默认是Resource。

3.3 在.Net Framework WPF项目中引用这个包不起作用?

    .Net Framework项目中使用源生器目前只能手动添加,建议在.Net Core项目中编译成多目标框架版本的方式使用,如果确实要在.Net Framework版本中使用,可以给我留言。

 说明:示例代码会上传到QQ群共享文件,有需要可以前往下载。

QQ群

 

微信群:

 

标签:文件,resx,语言,切换,WPF,Net,Resources
From: https://www.cnblogs.com/qushi2020/p/18198208

相关文章

  • WPF Color ColorConverter.ConvertFromString convert hex to readable color
    stringcolorStr="#FF00008B";ColorbrushColor=(Color)ColorConverter.ConvertFromString(colorStr);  usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows;us......
  • 系统国际化之多语言解决方案| 京东物流技术团队
    1.背景随着京东各业务板块国际化进程的不断推进,诸多业务已经融入了多元文化中,一个一体化的多语言系统解决方案成为各个技术团队讨论的焦点。国际物流系统凭借在国际化领域多年的经验,特别是在系统多语言处理上长期的经验积累,总结了一套标准的系统多语言框架,旨在为大家提供帮助......
  • 打开、关闭、切换App以及清除App进程,操作so easy!
    此文章来源于项目官方公众号:“AirtestProject”版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途#一、前言很多新手同学在写自动化测试脚本的时候,打开、关闭、切换App的方式还是使用最基础的方式,也有同学在交流群内多次询问是否有打开、关闭、切换App以及清除A......
  • 网页布局------鼠标点击标签切换内容
    网页结构<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title&......
  • springboot集成@DS注解实现数据源切换(转载)
    springboot集成@DS注解实现数据源切换启用@DS实现数据源切换POM内添加核心jar包yml配置"核心"-使用@DS注解最后启用@DS实现数据源切换POM内添加核心jar包 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-start......
  • 界面组件DevExpress WPF中文教程 - 如何从CRTX模板文件导入图表设置
    DevExpressWPF 拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中......
  • 鸿蒙HarmonyOS Next应用开发需要学什么语言
    鸿蒙HarmonyOSNext应用开发需要学什么语言?鸿蒙HarmonyOSNext作为华为自主研发的操作系统,其在应用开发方面有着独特的需求和优势。对于想要从事鸿蒙应用开发的开发者来说,掌握合适的编程语言是至关重要的。本文将详细探讨鸿蒙HarmonyOSNext应用开发需要学习的语言,帮助开发者更好......
  • 自研WPF插件系统(沙箱运行及热插拔)
    前言插件化的需求主要源于对软件架构灵活性的追求,特别是在开发大型、复杂或需要不断更新的软件系统时,插件化可以提高软件系统的可扩展性、可定制性、隔离性、安全性、可维护性、模块化、易于升级和更新以及支持第三方开发等方面的能力,从而满足不断变化的业务需求和技术挑战。......
  • 2024年5月份编程语言TIOBE 5 月榜单公布Fortran重返top10
    编程语言是计算机科学中不可或缺的一部分。随着科技的快速发展,各种编程语言也紧随着发展,不断涌现新的编程语言。每年5月份,TIOBE编程语言排行榜会公布当年的5月份编程语言TIOBE榜单。本文将展示2024年5月份编程语言TIOBE5月榜单的相关内,5月TIOBE编程语言榜单已发布,一起来看看......
  • C语言 while (putchar(getchar()) != '!') 解释
    ​ 代码运行到第4行,getchar()需要输入的数据,但是输入的缓冲区没有数据,所以就需要再命令行窗口(黑窗口)输入新的数据​ 这时候getchar()只需要输入1个字符的数据,但是你可以输入多个数据,打回车的时候之前输入的一行数据都会被发送到缓冲区,回车之前都还可以删除刚才输入的数据修改修......