Silverlight国际化实现方式详解
创始人
2024-06-19 04:21:20
0

作为一个合格的开发人员,应该是对Silverlight这款工具是相当熟悉的。它的应用可以帮助我们轻松的实现一些基于多媒体相关的功能需求。在这里,我们将会了解到有关Silverlight国际化的实现方法。#t#

  1. < TextBlock Text="{Binding alabel, 
    Source={StaticResource myStrings}}"
     /> 

 

如果界面上每个文本部分都要手工输入这么长串东西,迟早得把写代码的人搞疯掉。就算真的有毅力全部输入,这么一大坨的XAML对看代码的人无疑也是一种折磨。附带一提,有些文章提出的国际化方案似乎意犹未尽,在Binding后面还要再加上一个ConvertParameter,难道这些人对裹脚布有特殊的偏好?

我在项目中为了减少Silverlight国际化的工作量,同时也为了让代码变得干净清爽一点,采用了另外一种基于约定的国际化方案。其实背后的道理说穿不值一文钱,就是让界面上所有待翻译的文字输入时遵循一定的格式,比如“rs:alabel”,程序使用VisualTreeHelper这个方便的类遍历界面上所有组件,找到所有符合规则的文字,然后翻译成对于当前语言的内容。这个方案简单而且工作得很好,因为我们的界面中需要国际化的部分90%以上不脱TextBlock、Button和DataGrid这三种组件,如果有特殊的控件不能用此方式进行国际化也没有关系,毕竟绝大部分工作都能够很简单的完成了。

换言之,现在添加控件的时候只要这样写:

  1. < TextBlock Text="rs:alabel" /> 

这样是不是简单多了?

遍历组件并进行Silverlight国际化的代码也很简单,基本上就是对VisualTreeHelper的递归调用:

  1. void MainPage_Loaded(object sender, 
    RoutedEventArgs e)  
  2. {  
  3. LocalizeRecursive(this);  
  4. }  
  5. void LocalizeRecursive(UIElement elem)  
  6. {  
  7. GetLocalizer(elem.GetType()).
    Localizer(elem);  
  8. int childCount = VisualTreeHelper.
    GetChildrenCount(elem);  
  9. for (int i = 0; i < childCount; i++)  
  10. {  
  11. var child = VisualTreeHelper.
    GetChild(elem, i) as UIElement;  
  12. if (child != null)  
  13. LocalizeRecursive(child);  
  14. }  
  15. }  
  16. ILocalizer GetLocalizer(Type type)  
  17. {  
  18. ILocalizer localizer = null;  
  19. if (!_localizers.TryGetValue
    (type, out localizer))  
  20. localizer = new NullLocalizer();  
  21. return localizer;  
  22. }  
  23. static void RegisterLocalizers()  
  24. {  
  25. _localizers.Add(typeof(TextBlock), 
    new TextBlockLocalizer());  
  26. _localizers.Add(typeof(Button),
     new ButtonLocalizer());  
  27. _localizers.Add(typeof(DataGrid), 
    new DataGridLocalizer());  

 

 

几种Localizer的代码因为涉及到一些业务上的东西这里就不给出了,基本上无非就是字符串的查找替换而已。

这样处理以后,Silverlight国际化界面的XAML代码变得比以前整洁多了。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...