天天看點

項目筆記---WPF多語言方案

  近期由于朋友邀請幫忙給一個開源的遊戲“外挂”做一個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?點這裡)

項目筆記---WPF多語言方案

  2. WPFLocalizeExtension.dll 依賴于 XAML Markup Extensions, 實作了更多設計時(Design Time)動态綁定的實作等功能,有興趣的讀者可自行搜尋,這也是這個開源架構不同于其他方式的強大之處所在。

  3. 在MainWindow.xaml引中加入如下資訊:

項目筆記---WPF多語言方案

  說明: DesignCultrue=”en-US” ,這個是預設英語設定,其他語言可以更改如zh-CN

               DefaultDictonary=”Strings”這個是綁定到多語言檔案的字首<Name>.<Language>.resx

               DefaultAssembly=”Hearthstone Deck Tracker”這個是程式集名稱。

項目筆記---WPF多語言方案

  4. 綁定界面Visual元素:

  綁定方式有3種,具體請參考這裡,我選擇了{lex:Loc ABC}這種方式。

項目筆記---WPF多語言方案
項目筆記---WPF多語言方案

  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

版權聲明:文章屬于本人及部落格園共有,凡是沒有标注[轉載]的,請在文章末尾加入我的部落格位址。

如果您覺得文章寫的還不錯,請點選“推薦一下”,謝謝。