WPF的本地化是个很常见的成果,我做过的WPF措施大部分都实现了本地化(不管最终有没有用到)。凡是本地化有以下几点需求:
此中只有第一点是须要的。
第二点最好也可以实现,很多时候切换语言只为了看看某个专业术语在英语中的原文是什么,或者姑且打印个英文报表,平时使用还是用中文,用户不想为了这点重启措施。
第三点和第四点虽然很常见,但我从来没实现过,终究文字资源(有时还有少量图片)占用的空间不会太多,大部分WPF措施都没有大到需要考虑安置包巨细,所有语言的资源全部打包进一个安置包就可以了。
WPF本地化技术很成熟,也有几种方案,微软在MSDN给出了详细的介绍WPF 全球化和本地化概述,还有一份陈腐的文档WPF Localization Guidance,整整66页,里面详细介绍了各类WPF本地化的机制。
本文只介绍两种实现以上第1、2点需求的方案。
2. 使用资源词典 2.1 基来源根底理对WPF开发者来说,资源词典必定不会陌生。不过在资源词典里使用string可能对照少。
<Window x:Class="LocalizationDemoWpf.Window1" xmlns="" xmlns:x="" xmlns:d="" xmlns:mc="" xmlns:local="clr-namespace:LocalizationDemoWpf" mc:Ignorable="d" xmlns:system="clr-namespace:System;assembly=mscorlib" Title="Window1" Height="300" Width="300"> <Window.Resources> <system:String x:Key="Chinese">中文</system:String> </Window.Resources> <Grid> <TextBlock Text="{DynamicResource Chinese}"/> </Grid> </Window>
如以上代码所示,在XAML中界说string资源需要先引入 xmlns:system="clr-namespace:System;assembly=mscorlib"定名空间,之后再使用DynamicResource引用这个资源。不要使用StaticResource,这样没法做到动态切换语言。
要使用资源词典实现本地化,需要先创建所需语言的xaml,我在DEMO中创建了en-us.xaml和zh-cn.xaml两个资源词典,里面的包罗的资源布局一致(指数量和Key一样):
<ResourceDictionary xmlns="" xmlns:x="" xmlns:system="clr-namespace:System;assembly=mscorlib" xmlns:local="clr-namespace:LocalizationDemoWpf"> <system:String x:Key="SwitchLanguage">切换语言</system:String> <system:String x:Key="Chinese">中文</system:String> <system:String x:Key="English">英文</system:String> <system:String x:Key="Username">用户名</system:String> <system:String x:Key="Sex">性别</system:String> <system:String x:Key="Address">地点</system:String> <SolidColorBrush x:Key="Background" Color="#88FF0000"/> </ResourceDictionary>
在措施启动时按照CultureInfo.CurrentUICulture或配置项选择对应的资源词典,使用MergedDictionaries的方法加载到措施的资源调集中:
var culture = ReadCultureFromConfig(); var cultureInfo = new System.Globalization.CultureInfo(culture); Thread.CurrentThread.CurrentUICulture = cultureInfo; Thread.CurrentThread.CurrentCulture = cultureInfo; ResourceDictionary dictionary = new ResourceDictionary { Source = new Uri([email protected]"Resources\{culture}.xaml", UriKind.RelativeOrAbsolute) }; Application.Current.Resources.MergedDictionaries[0] = dictionary;
这样本地化的成果就完成了。
2.2 动态切换语言