WPF数据国际化解决方案

16 篇文章 5 订阅
2 篇文章 0 订阅

 在WPF中界面国际化很容易实现,但是数据国际化确实是一个难题。为了解决项目中的需求,我设计了解决方案。

思路:
1.在数据库中,需要国际化的字段存放国际化key值;
2.在xaml中创建多套国际化,key为数据库中的值;
3.切换国际化时,加载不同的xaml;
4.通过key值获取对应的字符串。

步骤:
1.数据库表设计,使用了sqlite数据库

添加数据

2.创建WPF项目,添加Chinese.xaml和English.xaml国际化文件
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
					xmlns:sys="clr-namespace:System;assembly=mscorlib"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
	<sys:String x:Key="language">语言</sys:String>
	<sys:String x:Key="language_chinese">中文</sys:String>
	<sys:String x:Key="language_english">英语</sys:String>

	<sys:String x:Key="name">姓名</sys:String>
	<sys:String x:Key="st_name_zhangsan">张三</sys:String>
	<sys:String x:Key="st_name_lisi">李四</sys:String>
	<sys:String x:Key="st_name_wangwu">王五</sys:String>
	<sys:String x:Key="st_name_sonny">圣尼</sys:String>
</ResourceDictionary>

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
					xmlns:sys="clr-namespace:System;assembly=mscorlib"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
	<sys:String x:Key="language">Language</sys:String>
	<sys:String x:Key="language_chinese">Chinese</sys:String>
	<sys:String x:Key="language_english">English</sys:String>

	<sys:String x:Key="name">Name</sys:String>
	<sys:String x:Key="st_name_zhangsan">Zhang San</sys:String>
	<sys:String x:Key="st_name_lisi">Li Si</sys:String>
	<sys:String x:Key="st_name_wangwu">Wang Wu</sys:String>
	<sys:String x:Key="st_name_sonny">Sonny</sys:String>
</ResourceDictionary>

3.在自定义实体类中获取国际化字符串
public class StudentI18N:Student {
	/// <summary>
	/// 国际化-Name
	/// </summary>
	public string NameI18N {
		get {
			object obj=Application.Current.FindResource(Name);
			string str=obj as string;
			return str;
		}
	}

	public override string ToString() {
		return NameI18N;
	}
}

4.切换国际化文件
private void ChangeI18N(string language) {
	Application.Current.Resources.MergedDictionaries.Clear();
	Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary {
		Source=new Uri("Resources/"+language+".xaml",UriKind.Relative),
	});

	LoadStudents();

	ReportPropertyChanged("IsEnglishChecked");
	ReportPropertyChanged("IsChineseChecked");
	ReportPropertyChanged("Students");			
}


见效果图:

切换成英语后的效果图:

 

优点:“相对”轻松地实现了数据国际化
缺点:国际化的信息保存在xaml中,而不是数据库中,如果xaml的信息能从数据库中读取,然后动态生成就更好。
不管如何,至少达到了要求。

完整案例下载地址:http://download.csdn.net/source/3462991

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值