WPF 实现多语言支持

WPF 多语言有各种实现方式。如 https://www.codeproject.com/Articles/35159/WPF-Localization-Using-RESX-Files,后来发现这个不够直接和简洁,在看到这里 https://www.cnblogs.com/yang-fei/p/4854460.html 这个朋友的实现觉得蛮不错的。

目前我觉得最好的一种或者说最适合我的一种是利用资源字典文件来做--- 就是吧各个语言创建为一个个资源字典文件,在程序启动的时候将选定的一种语言的资源字典文件作为当前的资源文件。

注意点【WPF中实现先登录后启动主程序的方法】 这个文章帮助我解决了在启动主窗口前启动语言选择窗口供用户选择确定一种语言,当关闭这个语言窗口后发现主窗口也关闭了。。。解决方法在那片文章里,可以这样:

public App() {

App.Current.ShutdownMode= ShutdownMode.OnExplicitShutdown;//防止关闭主窗口

}

先创建2个资源字典文件放入Resources\Language 文件夹。

EN.xaml:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:system="clr-namespace:System;assembly=mscorlib">

    <!-- String resource that can be localized -->
    <system:String x:Key="Greeting">en-US Message</system:String>
    <system:String x:Key="Message">hello english message</system:String>
    <system:String x:Key="mainWindTitle">title english</system:String>
    <system:String x:Key="MainWindow_mnu1">Menu item</system:String>
    <system:String x:Key="MainWindow_mnu1_sub">Sub Menuitem</system:String>

</ResourceDictionary>

  

ZH.xaml:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:system="clr-namespace:System;assembly=mscorlib">

    <!-- String resource that can be localized -->
    <system:String x:Key="Greeting">测试字符串</system:String>
    <system:String x:Key="Message">hello 测试的消息</system:String>
    <system:String x:Key="mainWindTitle">标题中文的</system:String>

    <system:String x:Key="MainWindow_mnu1">菜单111</system:String>
    <system:String x:Key="MainWindow_mnu1_sub">子菜单</system:String>

</ResourceDictionary>

  

在APP里包含进来创建的两个语言资源字典文件:

<Application x:Class="MultiLanguangeTest.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Resources\Language\ZH.xaml" />
                <ResourceDictionary Source="Resources\Language\EN.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

  

APP里代码:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;

namespace MultiLanguangeTest
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {

        public App() {

            App.Current.ShutdownMode= ShutdownMode.OnExplicitShutdown;//防止关闭主窗口

        }

        protected override void OnStartup(StartupEventArgs e)
        {

            //启动主窗口之前先启动一个语言选择窗口
            string lang = "";
            SelectLangWind wind = new SelectLangWind();
            wind.ShowDialog();
            lang = wind.lang;

            ResourceDictionary dict = new ResourceDictionary();
           // dict.Source = new Uri(@"Resources\Language\EN.xaml", UriKind.Relative);

            dict.Source = new Uri(@"Resources\Language\"+lang+".xaml", UriKind.Relative);
            Application.Current.Resources.MergedDictionaries.Clear();
            Application.Current.Resources.MergedDictionaries.Add(dict);
            Application.Current.Resources.MergedDictionaries[0] = dict;

          //  base.OnStartup(e);
        }

    }

}

  

主窗口代码:

<Window x:Class="MultiLanguangeTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="{DynamicResource mainWindTitle}" Height="350" Width="525">
    <Grid>
        <Menu Height="33" VerticalAlignment="Top">
            <MenuItem Header="{DynamicResource MainWindow_mnu1}">
                <MenuItem Header="{DynamicResource MainWindow_mnu1_sub}">
                </MenuItem>
            </MenuItem>

            <MenuItem Header="{DynamicResource MainWindow_mnu1}"></MenuItem>
        </Menu>
        <Grid>

        <TextBlock Text="{DynamicResource Greeting}" Margin="0,30,0,0"/>
            <Button VerticalAlignment="Top" Content="{DynamicResource Greeting}" Width="213" Height="35" Click="SwitchButton_Click" Margin="141,132,0,0" HorizontalAlignment="Left"/>
        </Grid>

    </Grid>
</Window>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace MultiLanguangeTest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        private string _currentLan = string.Empty;

        public MainWindow()
        {
            InitializeComponent();
            Loaded += MainWindow_Loaded;
            _currentLan = "EN";
        }

        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            App.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;//回复退出模式
        }

        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.Clear();
             Application.Current.Resources.MergedDictionaries.Add(dict);
             Application.Current.Resources.MergedDictionaries[0] = dict;

        }

    }
}

  

贴上选择语言的窗口代码:

<Window x:Class="MultiLanguangeTest.SelectLangWind"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="SelectLangWind" Height="234.231" Width="447.692">
    <Grid>
        <ComboBox Name="comLang" HorizontalAlignment="Left" Margin="153,78,0,0" VerticalAlignment="Top" Width="120">
            <ComboBoxItem  Content="English" Tag="EN"/>
            <ComboBoxItem  Content="简体中文" Tag="ZH"/>

        </ComboBox>
        <Button Content="OK" HorizontalAlignment="Left" Margin="159,134,0,0" VerticalAlignment="Top" Width="114" Height="24" Click="btnOK_Click"/>
        <Label Content="choose language" HorizontalAlignment="Left" Margin="153,36,0,0" VerticalAlignment="Top" Width="138"/>

    </Grid>
</Window>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace MultiLanguangeTest
{
    /// <summary>
    /// Interaction logic for SelectLangWind.xaml
    /// </summary>
    public partial class SelectLangWind : Window
    {
        public SelectLangWind()
        {
            InitializeComponent();
        }

        public string lang = "EN";
        private void btnOK_Click(object sender, RoutedEventArgs e)
        {
            if (comLang.SelectedIndex < 0) return;
            lang = ""+(comLang.SelectedItem as ComboBoxItem).Tag;
            Close();

        }

    }
}

  

源代码: https://files.cnblogs.com/files/wgscd/MultiLanguangeTest.zip

原文地址:https://www.cnblogs.com/wgscd/p/10938303.html

时间: 2024-10-12 05:24:43

WPF 实现多语言支持的相关文章

WPF使用X:Static做多语言支持

原文:WPF使用X:Static做多语言支持 让程序支持多语言,一般把需要显示的字符串保存在一个资源类的static属性中. <!--[if !supportLists]--> <!--[endif]--> 微软的WPF程序多语言支持官方解决方案:使用Resource,并把Resource按语言编译成独立DLL,程序会根据系统当前语言设置,自动加载最合适的资源.(这种方法灵活性较差,而且不能满足多样的需求,于是网上各种多语言方案纷至沓来.)这里有一篇对官方方案的进一步解释. 使用X

WPF 多语言支持插件的开发

本文介绍一种支持在设计时和运行时来动态更改程序运行语言支撑的实现方法.WPF多语言支持我们期望能够实现以下功能: (1)能够与WPF的XAML直接集成: (2)支持编码方式来访问资源: (3)支持在运行时动态切换和动态编辑语言. 1 概述 以往多语言方式都是使用Resource文件来支持,这个文件最终会编译成资源dll文件.以这种方式实现多语言的优点是在开发的时候可以直接使用IDE,但是缺点就是动态性支撑较差,要实现动态语言切换比较麻烦,并且无法实现在运行时实现语言编辑.下图是语言切换的页面.

WPF条形码控件支持大多数流行的一维和二维条形码Barcode Professional

Barcode Professional for WPF是一款轻量级的 .NET 程序集,为你的WPF程序生成高质量的基于矢量的条码控件,支持大多数流行的一维和二维条形码:Code 39, Code 128, GS1-128, GS1 DataBar (RSS-14),  EAN 13 & UPC, Postal (USPS, British Royal Mail, Australia Post, DHL, etc.), Data Matrix, QR Code, PDF 417, UPS Ma

我在写多语言支持时用到的东西

我在写多语言支持时用到的东西 絮叨絮叨:好久不来写了,竟然支持markdown 了. 我也是在项目里的wiki 里干刚接触了一些, 来这里也试试.然后悲催的发现,mac 电脑在markdown下直接上传图片有bug @2015-08-19 20:28:13.一会试一下链接版的吧. 我们的37度手环一不小心要卖到国外去了,自然要支持多国家多语言啦. 等卖到阿拉伯世界的时候,我会再补充RTL(Right To Left)相关的内容. 本文仅涉及安卓(Android)客户端的实现, 服务器后台的部分没

在VC工程中添加多语言支持[转]

随着贸易国际化,在软件开发过程中,常会碰到需在现有中文版软件加入多语言支持的情况.由于不同语言版本间的差别通常仅是软件操作界面的不同,为实现多语言支持,使用纯资源DLL是一个不错的解决之道.所谓纯资源DLL是指只包含资源的DLL,譬如:快捷键.对话框.字符串.菜单.工具条.位图.图标.版本信息等等. 具体做法是:利用VC可视化编辑环境为每种语言制作一套资源ID一一对应的资源集并编译生成DLL文件.应用程序初始化时按预设的语言设置选择合适的资源DLL调入,使用资源时依据资源ID进行访问,这样即可实

一个轻客户端,多语言支持,去中心化,自动负载,可扩展的实时数据写服务的实现方案讨论

背景 背景是设计一个实时数据接入的模块,负责接收客户端的实时数据写入(如日志流,点击流),数据支持直接下沉到HBase上(后续提供HBase上的查询),或先持久化到Kafka里,方便后续进行一些计算和处理,再下沉到文件系统或做别的输出. 在设计中,对于客户端和服务端有这么些目标. 客户端需要支持多语言(Java,C++),做得尽量轻量级,只要连上服务端的ip:port,以RPC的形式调用简单的write就可以把数据写出去.客户端不承担任何逻辑的处理,服务端的负载均衡对客户端是透明的. 服务端想要

iOS-生成国际化包-配置App多语言支持

如果你的App需要支持多国语言.那么,就应该为你的App应用添加“国际化”支持. “国际化”乍看很高深.其实,苹果xCode都为我们设置好了,我们只需要简单的配置,就能够完成. “国际化”顾名思义,就是要让各国的人使用你的App应用时,显示用户本国的母语. 网上也有很多这样的帖子,但是,xCode在进化,很多东西,已经移动了位置或者变的更加简便了.这样,我们不能再看老帖子了. 不多废话! xCode 5.0下生成“国际化”语言包. 1.创建国际化语言文件:文件名必须为:Localizable.s

MVC4多语言支持

第一步 建立资源文件 为WEB项目添加Resource文件夹,然后在Resource文件夹下添加两个resx文件en-US.resx和zh-CN.resx文件. 使用Resgen.exe将resx转为resource文件(Resgen.exe可以放到windows/system32或windows/syswow64下),cmd运行下列语句: resgen D:\WORKSPACE\Locale\Locale\Resource\en-US.resx D:\WORKSPACE\Locale\Loca

Android多语言支持以及各国语言Values文件夹命名规则

创建好的项目工程由于需求 需要做多国语言的支持  下面介绍怎么快捷的创建文件夹 建好一个android 的项目后,默认的res下面 有layout.values.drawable等目录 这些都是程序默认的资源文件目录,如果要实现多语言版本的话,我们就要添加要实现语言的对应的资源文件. 首先我们点击添加Android Xml File按钮,在Resource Type中选择Values 在File中输入string.xml ,会出现下面的界面: 下面 以添加一个 英语(美国):values-en-