成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談靈活的WPF程序多語言支持

開發 開發工具
軟件開發常常會被要求支持多國語言。而且想要軟件有更多的受眾,做好本地化無疑是必然的選擇。對于WPF程序而言,支持多語言的方式實在是多種多樣。本文將介紹靈活的WPF程序多語言支持。

<!--[if !supportLists]--> <!--[endif]-->

微軟的WPF程序多語言支持官方解決方案:使用Resource,并把Resource按語言編譯成獨立DLL,程序會根據系統當前語言設置,自動加載最合適的資源。(這種方法靈活性較差,而且不能滿足多樣的需求,于是網上各種多語言方案紛至沓來。)這里有一篇對官方方案的進一步解釋。

使用XML保存語言文件:放進來只是因為網上的確有這么個解釋方案,雖然沒有什么實用價值……,Resource本來就是XML,還用自己定義一個XML,還XMLDataProvider,還XML-based Data Binding,看著都累……
使用Project Resource的:和上面的類似,不過把字符串全放在Project Resource里,然后用ObjectDataProvider,然后也是使用Data Binding。

Assembly自帶語言:每個Assembly里放上支持的所有語言,使用配置文件設置軟件語言,比微軟的方案更進一步,但是WPF程序多語言支持問題也還是存在的。

<!--[if !supportLists]--><!--[endif]--><!--[if !supportLists]--><!--[endif]--><!--[if !supportLists]--><!--[endif]-->

上面所有的方案都沒有同時解決下面這兩個問題:

<!--[if !supportLists]--> <!--[endif]-->

運行時切換語言。

加入新語言,而不需要重新編譯軟件。

<!--[if !supportLists]--><!--[endif]-->
下面,就來介紹一種更靈活的,解決了上面兩個問題的WPF程序多語言支持方案。

基本方式還是使用Resource,只不過Resource是運行時才加載進來的。解決方案的結構如下圖所示。

<!--[if !vml]-->

解決方案的結構

<!--[endif]-->

1. 解決方案的結構

其中各個語言文件的資源文件放在Resources/Langs文件夾中,這些資源文件不會被編譯到Assembly中,編譯之后的文件結構如下圖所示,語言文件被原樣復制到Output文件夾中。

<!--[if !vml]-->

編譯后的文件結構

<!--[endif]-->

2. 編譯后的文件結構

先來看看程序的運行效果,再來看代碼會比較直觀一些。

<!--[if !vml]-->

英文界面

<!--[endif]-->

3. 英文界面

<!--[if !vml]-->

漢語界面

<!--[endif]-->

4. 漢語界面

下面就是這個界面的代碼。

  1. MainWindow  
  2. <Window x:Class="Localization.DemoWindow" 
  3.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  4.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  5.     xmlns:c="clr-namespace:Localization.Backend.Commands" 
  6.     Title="{DynamicResource MainWindowTitle}" 
  7.     Width="230" Height="150"> 
  8.     <DockPanel LastChildFill="False"> 
  9.         <Menu DockPanel.Dock="Top"> 
  10.             <Menu.CommandBindings> 
  11.                 <x:Static Member="c:LanguageCommands.OpenLanguageBinding"/> 
  12.             Menu.CommandBindings> 
  13.             <MenuItem Header="{DynamicResource LanguageMenuHeader}"> 
  14.                 <MenuItem Header="{DynamicResource EnglishMenuHeader}" 
  15.                           Click="OnLoadEnglishClick"/> 
  16.                 <MenuItem Header="{DynamicResource ChineseMenuHeader}" 
  17.                           Click="OnLoadChineseClick" /> 
  18.                 <Separator/> 
  19.                 <MenuItem Command="c:LanguageCommands.OpenLanguage" 
  20.                           Header="{DynamicResource OpenLanguageFileMenuHeader}"/> 
  21.             MenuItem> 
  22.         Menu> 
  23.     DockPanel> 
  24. Window> 

所有的界面上的文字,都使用DynamicResource引用資源文件中的字符串。資源文件的格式如下(英文資源文件示例):

  1. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  2.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  3.     xmlns:s="clr-namespace:System;assembly=mscorlib"> 
  4.     <s:String x:Key="MainWindowTitle">Localization Demos:String> 
  5.     <s:String x:Key="LanguageMenuHeader">_Languages:String> 
  6.     <s:String x:Key="EnglishMenuHeader">_Englishs:String> 
  7.     <s:String x:Key="ChineseMenuHeader">漢語(_C)s:String> 
  8.     <s:String x:Key="OpenLanguageFileMenuHeader">_Open Language Files:String> 
  9. ResourceDictionary> 

語言文件沒有編譯到Assembly中,使用起來就有些不太一樣。下面是App.xaml文件中設置Application的默認加載語言的方式。

  1. <Application x:Class="Localization.App" 
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  4.     StartupUri="UI\DemoWindow.xaml"> 
  5.     <Application.Resources> 
  6.         <ResourceDictionary> 
  7.             <ResourceDictionary.MergedDictionaries> 
  8.                 <ResourceDictionary Source="pack://siteOfOrigin:,,,/Resources/Langs/en-US.xaml"/> 
  9.             ResourceDictionary.MergedDictionaries> 
  10.         ResourceDictionary> 
  11.     Application.Resources> 
  12. Application> 

前面的內容基本上沒有什么和別的方案不一樣的地方,下面才是最重要的一點,就是如何運行時切換語言的呢?答案就是,只要把上面代碼里的ResourceDictionary替換掉就OK了,界面會自動刷新。下面就是實現替換功能的代碼。  

  1. public class LanguageHelper  
  2.     {  
  3.         /// <summary> 
  4.         ///   
  5.         /// summary> 
  6.         /// <param name="languagefileName">param> 
  7.         public static void LoadLanguageFile(string languagefileName)  
  8.         {  
  9.             Application.Current.Resources.MergedDictionaries[0] = new ResourceDictionary()  
  10.             {  
  11.                 Source = new Uri(languagefileName, UriKind.RelativeOrAbsolute)  
  12.             };  
  13.         }  
  14.     } 

參數languagefileName可以是文件的絕對路徑,如:C:\en-US.xaml或是和App.xaml里一樣的相對路徑。順便解釋一下,那個“pack://siteOfOrigin:,,,”無非就是當前執行程序的所在目錄。

以目前的測試結果來看,即使界面上有大量的細粒度文字。切換語言的速度也是一瞬間的事兒,如果慢,也是因為xaml文件過大,讀文件用了不少時間。

WPF程序多語言支持缺陷

其實這才是最重要的,很多文章介紹一項技術的時候都會把這個技術夸得天花亂墜,卻對潛在的缺陷或問題避而不談。

缺陷就在于,不是所有的東西都是可以運行是更新的。比如***一個菜單項是用Command實現的,如下代碼所示:

  1. <MenuItem Command="c:LanguageCommands.OpenLanguage" 
  2.  Header="{DynamicResource OpenLanguageFileMenuHeader}"/> 

RoutedUICommand本身就已經定義了Text屬性用來顯示在界面上,完全沒有必要為使用了這個Command的MenuItem設置Header屬性。但是這里為什么還是設置了呢?因為目前還沒有找到簡單的方案改變Command的Text后能自動地更新界面。因為Command的Text屬性不是一個Dependency Property。為了自動更新界面,不得不為MenuItem設置Header屬性。

【編輯推薦】

  1. Visual Studio 2010截圖曝光 以WPF開發UI
  2. 為WPF項目創建單元測試
  3. 詳解Silverlight和WPF互相擴展
  4. 教你如何理解WPF中的Template類
  5. 詳談WPF開發中的數據虛擬化
責任編輯:彭凡 來源: cnblogs
相關推薦

2011-07-26 10:09:08

iPhone 多語言 國際化

2009-08-03 17:33:01

ASP.NET多語言支

2014-07-09 09:20:06

WPFWPF應用

2010-01-06 13:41:51

.NET Framew

2022-07-19 16:54:50

iPaaSServerlessFaaS平臺

2023-08-09 09:36:04

Azure AI微軟

2024-01-12 10:01:07

框架編程

2020-04-14 09:50:02

2014-04-16 14:50:20

Spark

2009-08-31 17:13:09

2024-02-06 12:50:08

AI訓練

2011-08-05 17:54:33

Cocoa Touch 多語言

2012-04-19 11:40:21

Titanium

2009-08-25 10:44:50

C#實現多語言

2025-06-23 10:15:00

VSCodeMaple Mono編程

2021-09-07 10:17:35

iOS多語言適配設計

2021-06-29 21:48:32

開源語言架構

2013-07-04 10:54:27

Windows 8.1系統升級

2013-01-09 16:21:56

醫療護理成功案例

2022-08-09 07:22:15

語言數據庫程序
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产高潮好爽受不了了夜夜做 | 国产午夜精品久久久 | 精品小视频 | 国产精品永久免费视频 | 精品影院| 毛片在线免费播放 | 亚洲国产一区二区视频 | 日本淫视频 | 成人午夜免费福利视频 | 久在线 | 精品欧美一区二区精品久久 | 七七婷婷婷婷精品国产 | 国产资源一区二区三区 | 久久久免费在线观看 | 狠狠av| 日本免费一区二区三区四区 | 可以在线看的黄色网址 | 天堂久久久久久久 | 久久久久久久久久毛片 | 日韩精品在线一区 | 天天干视频 | 欧美精品在线观看 | 亚洲欧美一区二区三区视频 | 国产日韩欧美一区 | 欧州一区 | 2019天天操| 懂色一区二区三区免费观看 | 草久在线| 国产专区在线 | www.一区二区 | 国产精品一卡二卡三卡 | 看毛片的网站 | 最新黄色在线观看 | 狠狠操天天操 | 日本理论片好看理论片 | 欧美性生活一区二区三区 | 一级a性色生活片久久毛片波多野 | 粉嫩av在线 | 黄色毛片在线观看 | 狠狠狠| 亚洲三区视频 |