当前位置: 首页 > news >正文

WPF-实现多语言的静态(需重启)与动态切换(不用重启)

目录

一、多语言切换(需重启)

1、配置文件添加Key

2、新增附加属性当前选择语言

3、创建资源文件

 4、初始化多语言集合

5、切换多语言并更新配置文件

6、应用程序启动根据配置切换多语言

 7、使用

二、多语言切换(无需重启)

1、创建多语言标记扩展基类

2、添加资源转换器

3、创建资源文件

4、继承基类创建指定资源文件扩展

5、添加资源文件管理

6、切换语言

7、使用

8、后台使用多语言

①获取多语言资源字符串

②后台绑定


一、多语言切换(需重启)

1、配置文件添加Key

	<appSettings><add key="language" value="zh-CN"/></appSettings>

2、新增附加属性当前选择语言

        public CultureInfo SelectLanguage{get => (CultureInfo)GetValue(SelectLanguageProperty);set => SetValue(SelectLanguageProperty, value);}public static readonly DependencyProperty SelectLanguageProperty =DependencyProperty.Register("SelectLanguage", typeof(CultureInfo), typeof(MainWindow));

3、创建资源文件

 4、初始化多语言集合

        public ObservableCollection<CultureInfo> CultureInfos { get; private set; } = new ObservableCollection<CultureInfo>();private void Window_Loaded(object sender, RoutedEventArgs e){var dir =Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);var curs = CultureInfo.GetCultures(CultureTypes.AllCultures);foreach (CultureInfo cur in curs){if (string.IsNullOrWhiteSpace(cur.Name)) continue;string landir = Path.Combine(dir, cur.Name);if (Directory.Exists(landir)) CultureInfos.Add(cur);}if (CultureInfos.Any(cur => cur.Name.Equals("zh-CN", StringComparison.OrdinalIgnoreCase)) is false){var cur = curs.FirstOrDefault(c => c.Name.Equals("zh-CN", StringComparison.OrdinalIgnoreCase));if (cur != null) CultureInfos.Add(cur);}SelectLanguage = Thread.CurrentThread.CurrentCulture;}

5、切换多语言并更新配置文件

        protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e){base.OnPropertyChanged(e);if (e.Property == SelectLanguageProperty){if (SelectLanguage == Thread.CurrentThread.CurrentCulture) return;Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);if (ConfigurationManager.AppSettings["language"] is null)config.AppSettings.Settings.Add("language", SelectLanguage.Name);elseconfig.AppSettings.Settings["language"].Value = SelectLanguage.Name;config.Save();ConfigurationManager.RefreshSection("appSettings");}}

6、应用程序启动根据配置切换多语言

   /// <summary>/// App.xaml 的交互逻辑/// </summary>public partial class App : Application{protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);var lan= ConfigurationManager.AppSettings["language"];if (!string.IsNullOrWhiteSpace(lan)){CultureInfo culture = new CultureInfo(lan);Thread.CurrentThread.CurrentCulture = culture;Thread.CurrentThread.CurrentUICulture = culture;}}}

 7、使用

①映射命名空间

xmlns:rs="clr-namespace:WpfApp8.Resources"

②示例

    <Grid><GroupBox x:Name="gbox"><Grid><Button Width="100"Height="80"Background="LightGray"Content="{x:Static rs:SRS.TestLan}" /><ComboBox Width="150"Height="50"HorizontalAlignment="Left"VerticalContentAlignment="Center"DisplayMemberPath="NativeName"ItemsSource="{Binding Path=CultureInfos, ElementName=MW}"SelectedItem="{Binding Path=SelectLanguage, ElementName=MW}" /></Grid></GroupBox></Grid>

二、多语言切换(无需重启)

安装Nuget包:WpfExtensions.Xaml

1、创建多语言标记扩展基类

    /// <summary>/// 多语言绑定扩展基类 /// </summary>/// <typeparam name="T">多语言文件资源类</typeparam>[MarkupExtensionReturnType(typeof(object))]public class LanguageExtensionBase<T> : MarkupExtension where T : class{private static readonly ResourceConverter ResourceConverter = new ResourceConverter();[ConstructorArgument("Key")]public ComponentResourceKey Key { get; set; }public LanguageExtensionBase(string key){Key = new ComponentResourceKey(typeof(T), key);}public override object ProvideValue(IServiceProvider serviceProvider){if (Key == null){throw new NullReferenceException("Key cannot be null at the same time.");}IProvideValueTarget provideValueTarget = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;if (provideValueTarget == null){throw new ArgumentException("The serviceProvider must implement IProvideValueTarget interface.");}if (provideValueTarget.TargetObject?.GetType().FullName == "System.Windows.SharedDp"){return this;}return new Binding("Value"){Source = new I18nSource(Key, provideValueTarget.TargetObject),Mode = BindingMode.OneWay,Converter = ResourceConverter}.ProvideValue(serviceProvider);}}

2、添加资源转换器

    /// <summary>/// 资源转换器/// </summary>public class ResourceConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){Bitmap val = (Bitmap)((value is Bitmap) ? value : null);if (val == null){Icon val2 = (Icon)((value is Icon) ? value : null);if (val2 != null){return ToBitmapSource(val2.ToBitmap());}return value;}return ToBitmapSource(val);}public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotSupportedException();}[DllImport("gdi32")]private static extern int DeleteObject(IntPtr o);public ImageSource ToBitmapSource(Bitmap bitmap){IntPtr ptr = bitmap.GetHbitmap(); //obtain the HbitmapBitmapSource bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(ptr, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());DeleteObject(ptr); //release the HBitmapreturn bitmapSource;}}

3、创建资源文件

4、继承基类创建指定资源文件扩展

    /// <summary>/// 多语言绑定扩展/// </summary>[MarkupExtensionReturnType(typeof(object))]internal class LanguageExtension : LanguageExtensionBase<DefaultLanguage>{public LanguageExtension(string key) : base(key){}}

5、添加资源文件管理

try
{I18nManager.Instance.Add(Resource.ResourceManager);
}
catch (ArgumentException) 
{
}

6、切换语言

var culture = new CultureInfo("en-US");
I18nManager.Instance.CurrentUICulture = culture;
System.Threading.Thread.CurrentThread.CurrentCulture = culture;

7、使用

①映射命名空间到XAML

xmlns:Lan="clr-namespace:SqlSugarTest.Lan"

 ②资源文件中添加多语言资源

③示例

                    <GroupBox Header="多语言测试"><Menu Height="NaN" HorizontalAlignment="Center"VerticalAlignment="Center"Background="{x:Null}"FontSize="12" FontWeight="Bold"><MenuItem Margin="3" Padding="10,8"HorizontalAlignment="Center"HorizontalContentAlignment="Center"Header="{Lan:Language MultiLanguage}"><MenuItem Margin="3" Padding="10,5"Click="MenuItem_Click_CN" Header="CN-中" /><MenuItem Margin="3" Padding="10,5"Click="Button_Click_EN" Header="US-英" /><MenuItem Margin="3" Padding="10,5"Header="Test"><MenuItem Margin="3" Padding="10,5"Header="111" /><MenuItem Margin="3" Padding="10,5"Header="222" /></MenuItem></MenuItem></Menu></GroupBox>

8、后台使用多语言

①获取多语言资源字符串

        /// <summary>/// 获取Key资源/// </summary>/// <param name="key"></param>/// <param name="resource"></param>/// <returns></returns>public static string GetString(string key, ResourceManager resource = null){if (resource == null)return DefaultLanguage.ResourceManager.GetString(key, I18nManager.Instance.CurrentUICulture);elsereturn resource.GetString(key, I18nManager.Instance.CurrentUICulture);}
MessageBox.Show(GetString(nameof(DefaultLanguage.Test)));

②后台绑定

        static readonly ResourceConverter converter = new ResourceConverter();/// <summary>/// 按自定义数据绑定多语言/// </summary>/// <typeparam name="T">自定义数据源</typeparam>/// <param name="key">数据关键字</param>/// <returns></returns>public static BindingBase GetBinding<T>(string key, object element = null){var Key = new ComponentResourceKey(typeof(T), key);return new Binding("Value"){Source = new I18nSource(Key, element),Mode = BindingMode.OneWay,Converter = converter};}
 menu_Test.SetBinding(MenuItem.HeaderProperty, GetBinding<DefaultLanguage>(nameof(DefaultLanguage.Test)));

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 设备实时数据采集:开启制造业智能化、自动化的新篇章
  • 编译原理(极速版)
  • 单元格里显示曲线
  • 2024.8.22(Docker)
  • swagger使用
  • 京东2025届秋招 算法开发工程师 第2批笔试
  • 【Unity脚本】使用脚本修改游戏对象静态属性
  • DHCP DNS 欺骗武器化——实用指南
  • 蓝队技能-应急响应篇钓鱼攻击邮件与文件EML还原蠕虫分析线索定性
  • k8s教程
  • 【C语言】进程和线程详解
  • 日志组件导致的内存溢出问题分析
  • Java 4.2 - MySQL
  • Swift 中的影像魔术:Core Video 的高级应用
  • Swift模块化:构建高效可维护代码的秘诀
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【Linux系统编程】快速查找errno错误码信息
  • avalon2.2的VM生成过程
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • ES2017异步函数现已正式可用
  • iOS编译提示和导航提示
  • JavaScript DOM 10 - 滚动
  • mongodb--安装和初步使用教程
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • MySQL-事务管理(基础)
  • Nodejs和JavaWeb协助开发
  • October CMS - 快速入门 9 Images And Galleries
  • webpack4 一点通
  • windows下如何用phpstorm同步测试服务器
  • 安卓应用性能调试和优化经验分享
  • 构建工具 - 收藏集 - 掘金
  • 解析 Webpack中import、require、按需加载的执行过程
  • 前端路由实现-history
  • 删除表内多余的重复数据
  • 使用agvtool更改app version/build
  • 我这样减少了26.5M Java内存!
  • 小试R空间处理新库sf
  • 用element的upload组件实现多图片上传和压缩
  • ionic异常记录
  • ​2020 年大前端技术趋势解读
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • #Linux(Source Insight安装及工程建立)
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (done) 两个矩阵 “相似” 是什么意思?
  • (SpringBoot)第二章:Spring创建和使用
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (六)Flink 窗口计算
  • (一) springboot详细介绍
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)清华学霸演讲稿:永远不要说你已经尽力了