Silverlight国际化实现方式详解

作为一个合格的开发人员,应该是对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());
  28. }

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

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

文章名称:Silverlight国际化实现方式详解
转载来于:http://www.mswzjz.cn/qtweb/news38/418838.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能