很多国际化的程序都提供了多语言的选项,这样方便不同国家的使用者更方便的使用软件。这篇博客中将介绍在WPF中实现多语言的方式。

方式一,使用WPF动态资源的方式实现。先简单介绍下StaticResource和DynamicResource,这两者的区别在于动态资源改变后会实时的体现出来,而静态资源只加载一次,后面对资源的任何改变都不会体现出来。显而易见,使用动态资源会降低系统的性能。

新建一个工程,添加ZH.xaml与EN.xaml两个资源文件,用于放置界面显示的文案;

MainWindow.xaml:

    <Grid>
<StackPanel>
<TextBlock Text="{DynamicResource Greeting}"/> <Button Content="{DynamicResource Language}" Width="100" Height="35" Click="SwitchButton_Click"/>
</StackPanel>
</Grid>

切换语言方法:

        private string _currentLan = string.Empty;
public MainWindow()
{
InitializeComponent(); _currentLan = "ZH";
} 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[] = dict;
}

运行效果:

代码点击这里下载。

方式二,Xml文件+XPath的方式来实现。

项目结构:

新建两个xml文件,Chinese.xml和English.xml。

<?xml version="1.0" encoding="utf-8"?>
<language>
<resources>
<resource name="Greeting">你好 WPF世界!</resource>
</resources>
</language>

使用:

<TextBlock>
<TextBlock.Text>
<Binding Source="{StaticResource Lang}" XPath="resource[@name='Greeting']" />
</TextBlock.Text>
</TextBlock>

切换语言:

        private string _currentLang = string.Empty;
public MainWindow()
{
InitializeComponent(); _currentLang = "Zh";
} private void SwitchButton_Click(object sender, RoutedEventArgs e)
{
// TODO: Switch Language XmlDataProvider provider = TryFindResource("Lang") as XmlDataProvider; if (provider == null)
return; if(_currentLang == "Zh")
{
provider.Source = new Uri("Languages/English.xml", UriKind.Relative); _currentLang = "En";
}
else
{
provider.Source = new Uri("Languages/Chinese.xml", UriKind.Relative); _currentLang = "Zh";
} provider.Refresh();
}

运行效果:

代码点击这里下载。

当然实现多语言的方式有很多方式,例如:

http://www.codeproject.com/Articles/35159/WPF-Localization-Using-RESX-Files

感谢您的阅读。谢谢!

WPF 多语言实现的更多相关文章

  1. 项目笔记---WPF多语言方案

    近期由于朋友邀请帮忙给一个开源的游戏“外挂”做一个I18N的解决方案,恰好也是WPF做的,之前有过相关经验,就忙了一个星期终于搞定了,已经提交给作者了,现在这里做一个分享. 这里分享下我个人Fork的 ...

  2. WPF多语言化的实现

    Metro插件系统系列就暂时停一下,这次我们讨论一下WPF的资源本地化实现,主要用到的:CultureInfo,ResourceManger,MarkupExtension,RESX文件,这些都是.N ...

  3. winform/WPF 多语言的实现

    WPF实现起来非常现代化,可以参考 https://www.cnblogs.com/yang-fei/p/4854460.html winform主要说一下实现过程和注意点,实现参考AutoUpdat ...

  4. WPF 多语言 多资源 多皮肤 处理方案

    同时兼容这么多需求的解决方案 我想到的 只有通过 动态切换加载资源字典  前端用绑定的模式 达到托管最大化 多语言举例 我编辑了 两个 语言包 一个中文 一个英文  (语言包这个最好用T4 写个模板, ...

  5. WPF 多语言解决方案 - Multilingual App Toolkit

    1.首先安装Multilingual App Toolkit   2.新建项目,在VS中点击"工具" -> "Multilingual App Toolkit&qu ...

  6. WPF 多语言

    1.http://www.cnblogs.com/bear831204/archive/2009/03/17/1414026.html 2.http://www.cnblogs.com/horan/a ...

  7. WPF 实际国际化多语言界面

    前段时候写了一个WPF多语言界面处理,个人感觉还行,分享给大家.使用合并字典,静态绑定,动态绑定.样式等东西 效果图 定义一个实体类LanguageModel,实际INotifyPropertyCha ...

  8. WPF 实现多语言支持

    WPF 多语言有各种实现方式.如 https://www.codeproject.com/Articles/35159/WPF-Localization-Using-RESX-Files,后来发现这个 ...

  9. WPF四年,尤不足以替代WinForm

    WPF四年,尤不足以替代WinForm WPF出山已四年,作为官方内定的下一代UI系统掌门,没少露脸.但这个新掌门能否胜任,仍是众多开发者的心头之虑.通过对VisualStudio 2010的编辑器部 ...

随机推荐

  1. VMware12中CentOS7网络设置

    VMware提供了三种将虚拟网卡和物理网卡捆绑起来的方式,即桥接(Bridge)模式,网络地址转换(Network Address Transformation, NAT)模式和主机(Host Onl ...

  2. sruts2 自定义类型转换器

    1.1.1    Struts2中自定义类型转换器:(了解) 类型转换的过程是双向的过程: JSP---->Action参数提交:String---Date. Action---->JSP ...

  3. java切换VPN让你像幽灵一样出现在全国各地

    在很多情况下,有些网络应用的需求会要求模拟人在不同地区访问网站和应用.因而切换IP也就应运而生了,然而IP作为一种稀缺资源不是随便可以获得的.因而会想到应用程序切换VPN来达到全国不同地区访问网络.因 ...

  4. Unity3d《Shader篇》Logo闪光特效

    Shader "Custom/Flash" { Properties { _MainTex ("Base (RGB)", 2D) = "white&q ...

  5. QT Creator调用动态链接库实例

    #include<iostream> #include <QLibrary> using namespace std; int main() { cout<<&qu ...

  6. 20145213《Java程序设计》实验报告一:Java开发环境的熟悉(Windows+IDEA)

    20145213<Java程序设计>实验报告一:Java开发环境的熟悉(Windows+IDEA) 实验要求 使用JDK编译.运行简单的Java程序. 使用IDEA编辑.编译.运行.调试J ...

  7. addsubview跟insertsubview的区别

    子视图是以栈的方式存放的. 每次addsubview时都是在最后面添加. 每次在addsubview前和addsubview后可以看看[self.view.subViews count]: 你看看你的 ...

  8. October 8th 2016 Week 41st Saturday

    When ambition ends, happiness begins. 野心消亡之日,正是快乐破茧之时. If I don't have the wish to be a useful man, ...

  9. Android 毛玻璃效果

    muzei live wallpaper https://github.com/romannurik/muzei

  10. php 租房子练习

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...