項目筆記---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?點這里

                       

 

  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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM