已經用過WPF/Silverlight的朋友們應該對於ResourceDictionary不陌生。不過,ResourceDictionary除了用來存放Style、Storyboard等等資源之外,也可以拿來實作多國語系喔!!而且透過ResourceDictionary的方式來實作多國語系,一樣可以達到執行時期動態的語系切換功能!!
廢話不多說,以下來來跟各位分享這個簡單的方式,也歡迎有興趣的朋友跟著一步一步做看看喔!!
已經用過WPF/Silverlight的朋友們應該對於ResourceDictionary不陌生。不過,ResourceDictionary除了用來存放Style、Storyboard等等資源之外,也可以拿來實作多國語系喔!!而且透過ResourceDictionary的方式來實作多國語系,一樣可以達到執行時期動態的語系切換功能!!
廢話不多說,以下就來跟各位分享這個簡單的方式,也歡迎有興趣的朋友跟著一步一步做看看喔!!
Step 1:建立WPF應用程式
首先,跟上一篇一樣,請自行建立一個WPF專案,有看前兩篇的朋友們應該就對下面的使用者介面很熟悉了~
而該介面原始Xaml如下:
基本上到這邊應該都不會有什麼問題,大家可以執行看看自己寫的小範例,看看是不是能正常的運作,正常的話就可以繼續下一個步驟囉!!
Step 2:建立存放語系ResourceDictionary檔的資料夾
請透過Visual Studio中的Solution Explorer,在專案裡自行建立一個用來存檔ResourceDictionary的資料夾,以我自己的例子,我把這個資料夾取名為Cultures。
Step 3:在建立好的資料夾中新增各語系的ResourceDictionary檔
在剛剛建立好的資料夾上按下滑鼠右鍵,點選Add -> ResourceDictionary...,我們要先建立一個預設的語系資源檔。
為語系ResourceDictionary檔命名,這邊我使用StringResource.xaml當預設語系檔的名稱。
這系列的範例中語系資源會影響到的都只有文字的部份,所以我們得要在ResourceDictionary中透過建立字串的方式,提供給控制項做DataBinding,而為了要在ResourceDictionary中建立字串,我們得在StringResource.xaml的NameSpace中加入對System這個NameSpace的引用,可以這樣寫:
再來就可以依照我們的需要,在StringResource.xaml建立字串啦~這邊要注意,之後控制項得透過x:Key來存取我們定義好的字串,所以千萬要小心,別打錯字了喔!
建立完預設語系的ResourceDictionary之後,我們一樣透過複製檔案的方式,複製出供其他語系使用的ResourceDictionary檔,這邊要注意的是,記得要在檔名的後面加入語系對應的名稱簡碼喔!!例如我的預設語系檔名是StringResource.xaml,正體中文的語系資源檔名就得是StringResources.zh-TW.xaml,英文則是StringResources.en-US.xaml。我建立出來的正體中文資源檔和英文資源檔的內容則分別如下:
Step 4:修改語系ResourceDictionary檔的BuildAction、Copy to Output Dictionary和CustomTool屬性值
透過Solution Explorer全選所有我們建立好的語系ResourceDictionary檔。
接著在Properties視窗中將所有語系ResourceDictionary檔的BuildAction的值改為Content、Copy to Output Dictionary的值改為Copy always,最後將CustomTool的值清空。
Step 5:加入System.Windows.Form參考
會要做這一步,是為了我們要在執行期的時候動態的透過程式去取得可用的語系ResourceDictionary。
Step 6:在Settings.settings檔中加入預設語系的設定值
透過Solution Explorer,開啟位於專案中Properties資料夾裡面的Settings.settings檔。
接著在裡面加入一組名稱為DefaultCulture,型別為CultureInfo,值為en-US的設定,方法如下:
在第一個空白列的Name欄位中輸入DefaultCulture,然後在Type下拉選單中點選最下方的Browse...,並在跳出來的Select a Type視窗中如下圖點選到System.Globalization.CultureInfo。
最後在Value欄位中輸入en-US,完成後請記得存檔喔!!
Step 7:在專案中加入多語系小幫手Class檔
接下來的動作要寫一大堆的程式,不過我已經幫大家寫好了~當作是我送給大家的禮物,還請大家笑納(不過這篇的CulturesHelper和其他方式所要使用的CulturesHelper內容可不一樣喔,千萬別搞錯了!!)~
加入之後,請記得依照自己的需求在該Class中加入NameSpace喔!!另外,也請依照自己的ResourceDictionary檔的命名和存放的資料夾名稱,自行修改_resourcePrefix和_culturesFolder的值。
Step 8:修改App.xaml檔
接著我們要在App.xaml中預先載入一個語系的資源檔,以便後續DataBinding進行,這邊通常直接使用預設語系的資源檔就行了!如果要修改設計階段使用的語系,也是直接在這邊修改就可以囉!
Step 9:透過DataBinding將相對應的資源繫結到控制項
接著我們只需要透過簡單的DataBinding(例如Text="{DynamicResources KeyName}"),就可以輕鬆的存取語系ResourceDictionary中的字串啦~
如果覺得這樣有點麻煩,也可以透過Expression Blend來進行DataBinding的設定喔(這對Designer來說是一大方便啊!!)~~
例如我想針對Languages:這個TextBlock的Text屬性設定DataBinding,我只需要從Blend中點選Text右邊的Advanced options小白點,並且在跳出來的選單中展開Local Resource,就會出現所有我們定義好的字串Key值讓我們挑選啦!!
來看看繫結完的MainWindow.xaml會變怎樣吧~
要取得有哪些語系可用的話,只需要像上面的例子一樣,將CulturesHelper設為DataSource,再透過它的SupportedCultures屬性,就可以取出偵測到可用的語系有哪些。
Step 10:加入動態切換語系的部份
最後,說好的執行時期動態切換呢!?跟上一篇的方式一樣,只需要在語言下拉選單的選項被改變了之後,呼叫CulturesHelper中的ChangeCulture方法就行啦!!
來看看執行的畫面~
切換!!~~
最後的最後,一樣奉上成品的原始碼,請自行服用: