WPF应用怎么实现在线切换语言功能,方法可以有好多种:
一、开发两套界面,在点击切换语言时调用相应的界面,最low
二、通过读取事先做好的语言对照表,可以使excel文件、xml文件等,加载之后保存在全局字典或者datatable中都行,从而进行语言切换
三、利用WPF中的动态加载资源字典进行切换。
下面就第三种方法进行阐述:
第一步:使用资源字典,首先新建两个字典文件en-us.xaml、zh-cn.xaml。定义中英文的字符串在这里面【注意:添加xmlns:s="clr-namespace:System;assembly=mscorlib】
zh-cn.xam如下:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib"> <sys:String x:Key="biFile">文件</sys:String> <sys:String x:Key="biHelp">帮助</sys:String> <sys:String x:Key="biAbout">关于</sys:String> <sys:String x:Key="biName">产品名称:</sys:String> <sys:String x:Key="biCopyRight">版权所有:</sys:String> <sys:String x:Key="biWeb">公司网址:</sys:String> <sys:String x:Key="biVersion">版本号:</sys:String> <sys:String x:Key="biSelectDevice">选择设备</sys:String> <sys:String x:Key="biClose">关闭</sys:String> <sys:String x:Key="biSetting">设置</sys:String> <sys:String x:Key="biLanguage">语言</sys:String> </ResourceDictionary>
en-us.xaml如下:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib"> <sys:String x:Key="biFile">File</sys:String> <sys:String x:Key="biHelp">Help</sys:String> <sys:String x:Key="biAbout">About</sys:String> <sys:String x:Key="biName">Product Name:</sys:String> <sys:String x:Key="biCopyRight">CopyRight:</sys:String> <sys:String x:Key="biWeb">Web:</sys:String> <sys:String x:Key="biVersion">Version:</sys:String> <sys:String x:Key="biSelectDevice">Choose Device</sys:String> <sys:String x:Key="biClose">Close</sys:String> <sys:String x:Key="biSetting">Setting</sys:String> <sys:String x:Key="biLanguage">Language</sys:String> </ResourceDictionary>
第二步:讲两个资源字典添加到App.xaml中,这里注意下,因为两个字典中有同样字符,如果没有动态更改,默认后添加的生效
App.xaml如下:
<Application x:Class="CANTest.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors" xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core" StartupUri="MainWindow.xaml" Startup="OnAppStartup_UpdateThemeName" Exit="Application_Exit"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Language\StringResource.zh-CN.xaml" /> <ResourceDictionary Source="Language\StringResource.en-US.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application>
第三步:在Properties.Settings中添加应用程序设置,保存上次关闭程序的语言环境
第四步:在App.Xaml.cs中添加必要的更新语言函数,动态切换,重新加载资源文件
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Linq; using System.Windows; using DevExpress.Xpf.Core; using System.Threading; using System.Globalization; namespace WPFApplication { /// <summary> /// Interaction logic for App.xaml /// </summary> public partial class App : Application { private void OnAppStartup_UpdateThemeName(object sender, StartupEventArgs e) { DevExpress.Xpf.Core.ApplicationThemeHelper.UpdateApplicationThemeName(); } public static string Language { get; set; } protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); GetLanguage(); } private void Application_Exit(object sender, ExitEventArgs e) { SaveLanguage(); //关闭所有线程,即关闭此进程 System.Environment.Exit(0); //MessageBoxManager.Unregister(); } #region Method /// <summary> /// 开机启动默认的语言 /// </summary> private void GetLanguage() { Language = string.Empty; try { Language = CANTest.Properties.Settings.Default.Language.Trim(); } catch (Exception) { } Language = string.IsNullOrEmpty(Language) ? "en-US" : Language; //update Language UpdateLanguage(); } /// <summary> /// 保存语言设置 /// </summary> private void SaveLanguage() { try { CANTest.Properties.Settings.Default.Language = Language; CANTest.Properties.Settings.Default.Save(); } catch (Exception) { } } /// <summary> /// 更换语言包 /// </summary> public static void UpdateLanguage() { List<ResourceDictionary> dictionaryList = new List<ResourceDictionary>(); foreach (ResourceDictionary dictionary in Application.Current.Resources.MergedDictionaries) { dictionaryList.Add(dictionary); } string requestedLanguage = string.Format(@"Language\StringResource.{0}.xaml", Language); ResourceDictionary resourceDictionary = dictionaryList.FirstOrDefault(d => d.Source.OriginalString.Equals(requestedLanguage)); if (resourceDictionary == null) { requestedLanguage = @"Language\StringResource.en-US.xaml"; resourceDictionary = dictionaryList.FirstOrDefault(d => d.Source.OriginalString.Equals(requestedLanguage)); } if (resourceDictionary != null) { Application.Current.Resources.MergedDictionaries.Remove(resourceDictionary); Application.Current.Resources.MergedDictionaries.Add(resourceDictionary); } } #endregion } }
第五步:在界面设计器中需要显示的位置添加动态资源
例如:
<Button x:Name="buttonNewTaskWindow" Content="{DynamicResource File}"/>
<Button x:Name="buttonProperty" Content="{DynamicResource Help}"/>
第六步:增加选择语言命令
/// <summary> /// 语言选择命令 /// </summary> private static RoutedUICommand chooseLanguage = new RoutedUICommand("ChooseLanguage", "ChooseLanguage", typeof(Commands)); public static RoutedUICommand ChooseLanguage { get { return chooseLanguage; } } #region 中英文切换 private void ChooseLanguage_CanExecute(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = true; e.Handled = true; } private void ChooseLanguage_Executed(object sender, ExecutedRoutedEventArgs e) { //英文 if (e.Parameter.ToString() == "en") { App.Language = "en-US"; } //中文 else if (e.Parameter.ToString() == "zh") { App.Language = "zh-CN"; } App.UpdateLanguage(); } #endregion