Silverlight國際化實現方式詳解
作為一個合格的開發人員,應該是對Silverlight這款工具是相當熟悉的。它的應用可以幫助我們輕松的實現一些基于多媒體相關的功能需求。在這里,我們將會了解到有關Silverlight國際化的實現方法。#t#
- < TextBlock Text="{Binding alabel,
Source={StaticResource myStrings}}" />
如果界面上每個文本部分都要手工輸入這么長串東西,遲早得把寫代碼的人搞瘋掉。就算真的有毅力全部輸入,這么一大坨的XAML對看代碼的人無疑也是一種折磨。附帶一提,有些文章提出的國際化方案似乎意猶未盡,在Binding后面還要再加上一個ConvertParameter,難道這些人對裹腳布有特殊的偏好?
我在項目中為了減少Silverlight國際化的工作量,同時也為了讓代碼變得干凈清爽一點,采用了另外一種基于約定的國際化方案。其實背后的道理說穿不值一文錢,就是讓界面上所有待翻譯的文字輸入時遵循一定的格式,比如“rs:alabel”,程序使用VisualTreeHelper這個方便的類遍歷界面上所有組件,找到所有符合規則的文字,然后翻譯成對于當前語言的內容。這個方案簡單而且工作得很好,因為我們的界面中需要國際化的部分90%以上不脫TextBlock、Button和DataGrid這三種組件,如果有特殊的控件不能用此方式進行國際化也沒有關系,畢竟絕大部分工作都能夠很簡單的完成了。
換言之,現在添加控件的時候只要這樣寫:
- < TextBlock Text="rs:alabel" />
這樣是不是簡單多了?
遍歷組件并進行Silverlight國際化的代碼也很簡單,基本上就是對VisualTreeHelper的遞歸調用:
- void MainPage_Loaded(object sender,
RoutedEventArgs e)- {
- LocalizeRecursive(this);
- }
- void LocalizeRecursive(UIElement elem)
- {
- GetLocalizer(elem.GetType()).
Localizer(elem);- int childCount = VisualTreeHelper.
GetChildrenCount(elem);- for (int i = 0; i < childCount; i++)
- {
- var child = VisualTreeHelper.
GetChild(elem, i) as UIElement;- if (child != null)
- LocalizeRecursive(child);
- }
- }
- ILocalizer GetLocalizer(Type type)
- {
- ILocalizer localizer = null;
- if (!_localizers.TryGetValue
(type, out localizer))- localizer = new NullLocalizer();
- return localizer;
- }
- static void RegisterLocalizers()
- {
- _localizers.Add(typeof(TextBlock),
new TextBlockLocalizer());- _localizers.Add(typeof(Button),
new ButtonLocalizer());- _localizers.Add(typeof(DataGrid),
new DataGridLocalizer());- }
幾種Localizer的代碼因為涉及到一些業務上的東西這里就不給出了,基本上無非就是字符串的查找替換而已。
這樣處理以后,Silverlight國際化界面的XAML代碼變得比以前整潔多了。