近期由於朋友邀請幫忙給一個開源的游戲“外掛”做一個I18N的解決方案,恰好也是WPF做的,之前有過相關經驗,就忙了一個星期終於搞定了,已經提交給作者了,現在這里做一個分享。
這里分享下我個人Fork的GitHub地址: https://github.com/Cuiyansong/Hearthstone-Deck-Tracker
什么是I18N
簡單來說就是多語言,為什么多語言叫I18N,請參見結語中的引用。
如何實現
其實WPF上實現多語言於winform有些相似,就是更換軟件運行時資源(Resource)。而WPF在這方面有些更先天的優勢---XAML,這里不想詳細展開XAML對Winform的革新,這里想強調的是有了XAML使得WPF做界面綁定時更具有優勢。
對比很多WPF多語言方案,WPFLocalizeExtension具有更多的優勢,當然也有些不足,這是后話,這里我選擇用后者來給大家演示。
本文不會很深入的探討原理,直接介紹如何應用。
1. 引入WPFLocalizeExtension.dll,建議用NuGet,搜索WPFLocalizeExtension,然后依次安裝。(不會用NuGet?點這里)
2. WPFLocalizeExtension.dll 依賴於 XAML Markup Extensions, 實現了更多設計時(Design Time)動態綁定的實現等功能,有興趣的讀者可自行搜索,這也是這個開源框架不同於其他方式的強大之處所在。
3. 在MainWindow.xaml引中加入如下信息:
說明: DesignCultrue=”en-US” ,這個是默認英語設置,其他語言可以更改如zh-CN
DefaultDictonary=”Strings”這個是綁定到多語言文件的前綴<Name>.<Language>.resx
DefaultAssembly=”Hearthstone Deck Tracker”這個是程序集名稱。
4. 綁定界面Visual元素:
綁定方式有3種,具體請參考這里,我選擇了{lex:Loc ABC}這種方式。
5. 增加多語言文件
在項目中添加一個文件夾,如命名”Langs”,然后添加Strings.zh-CN.resx, String.de-DE.resx,Strings.resx,這些文件都是系統類型的資源文件,相信大家看見后綴resx就會知道如何添加 J.
最后就是添加多語言信息了,這里強調一下:這幾個文件中的Key值必須相同(有點啰嗦吧!)
這樣界面上只要 content = {lex:Loc ACTION}就可以了。(這里的content只要是文本類型的均可以綁定字符串,例如某些控件的Header、Text、Content等)
6. 運行時切換語言更新界面:
WPFLocalizeExtension.Engine.LocalizeDictionary.Instance.Culture = System.Globalization.CultureInfo.GetCultureInfo(“zh-CN”);
在軟件中可以把用戶設置的語言保存在Setting文件中,然后每次Form_Load時設置下當前的Cultrue。
7. CodeBehind中綁定多語言Key:
當然,除了UI可以動態綁定,程序中的提示信息也可以綁定Key。
Var Msg = Lang.GetLocalizedString(“ERROR_INFO”);
public static string GetLocalizedString(string key, string resourceFileName = "Strings", bool addSpaceAfter = false) { var localizedString = String.Empty; // Build up the fully-qualified name of the key var assemblyName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; var fullKey = assemblyName + ":" + resourceFileName + ":" + key; var locExtension = new LocExtension(fullKey); locExtension.ResolveLocalizedValue(out localizedString); // Add a space to the end, if requested if (addSpaceAfter) { localizedString += " "; } return localizedString; }
更多
1. 不足:資源文件會生成多個resource.dll分別在根目錄下的相應語言目錄下,文件夾顯得太多,目前我還沒有找到解決辦法,如果誰有解決辦法請告知。
https://github.com/Epix37/Hearthstone-Deck-Tracker/pull/426
2. 此外還有針對多語言中阿拉伯語、希伯來語等特殊語言的布局設計未涉及在文章中。
http://www.oschina.net/translate/building-multilingual-wpf-applications
更新
2015.01.21 WPFLocalizationExtension這個框架在某些情況下導致“設計時”出現界面錯誤,如遇到此問題,請多次嘗試“Clean”項目解決方案並Reload窗體,截止目前GitHub依然沒有解決此問題。
引用
WPF LocalizeExtension官網:http://wpflocalizeextension.codeplex.com/
NuGet配置及使用:http://blog.sina.com.cn/s/blog_674da3040101sv0o.html
翻譯:http://www.oschina.net/translate/building-multilingual-wpf-applications
原文:http://www.codeproject.com/Articles/38751/Building-Multilingual-WPF-Applications