WPF 实现语言在线切换

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

 

 

转载于:https://www.cnblogs.com/SparkZG/p/7443850.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值