近期由于朋友邀請幫忙給一個開源的遊戲“外挂”做一個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依然沒有解決此問題。
引用
I18N:http://baike.baidu.com/link?url=4a1hNzarT1W0tiQy7Hiviy-X8_N7O9nLlNJrrx2DxNneInZ4vbnT9ZrdBszGLPaJ-LsxF73Zqjy74ezss7V-bq
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
作者:Stephen Cui
出處:http://www.cnblogs.com/cuiyansong
版權聲明:文章屬于本人及部落格園共有,凡是沒有标注[轉載]的,請在文章末尾加入我的部落格位址。
如果您覺得文章寫的還不錯,請點選“推薦一下”,謝謝。