1. 程式人生 > >自己學會漢化DevExpress控制元件

自己學會漢化DevExpress控制元件

1.   文件導讀
本文件以顏色區分內容的重要性和不同性,閱讀本文件時請注意以下事項:

1.         紅色部分表示需要注意的重點內容;(加粗的尤甚)

2.         藍色部分表示相應於前版本新增的內容;

3.         紫色部分表示跟前版本不同的內容;

本文件的變動歷史都記錄在“修改記錄說明”一節。本文通過用到英文單詞的地方,也是本人理解不是很深刻的地方,如果有什麼好的建議,歡迎指正。不勝感激!我的email:[email protected]

2.   基礎知識
2.1. Net Framework知識
在Visual Studio .NET裡面,本地化資源,比如字串、圖片之類的,都是跟culture(語言文化)有關,這些東西都是儲存在單獨的檔案中並且根據相應的culture設定進行載入,如果要了解怎樣載入你自己的本地化資源,那就需要了解資原始檔的組織結構關係:

1.         .Net在載入資原始檔的時候,它選取資原始檔的方式,可以說是按照自下而上的方式,寫過程式的都知道繼承的概念,有父類之類之說,可以說父類就是上層建築,也就是那些偉大的領導們,而子類就是廣大百姓了,呵呵,這個比喻不是很恰當,純粹娛樂。Framework裡面,父類就對應english,也是唯一的一種沒有自身資原始檔的,其實也並不是沒有,而是存在main assembly裡面。

2.         在父類之下,可以有多種多樣的culture的資源,我們說的culture是指語言文化並不是指windows控制面板中的區域,比如,法國(French簡寫為“fr”)就是一個culture。其實english簡寫成“en”也是一個culture,只不過它比較特別,沒辦法,誰讓現在的it世界是在老外統治著呢。

3.         在這些culture之下,又有一些特定區域的culture,這些特定區域的culture,它有兩點屬性,不僅包含語言文化,還加上區域特色,就好比中國有中國的文化,而福建還有它自身的區域性文化。偶們的官方語言是普通話,而我們福建還有N多種方言,鄙人不才,也就只會一種咱們家鄉的本地話,在同事們聽來,有點外星人嫌疑。老美也有老美的文化,有美式英語和英式英語區分,今天剛看了“姨媽的後現代生活”,就是因為她只會英式英語而不追逐美式英語這個大潮流而被解聘了。

在一個程式試圖載入一個資源的時候,好比一個字串,並且還沒有找到,它就會沿著上面所說的層次結構一層一層的往上爬,直到找到為止。如果仕途有這麼順利那就好了,呵呵。

在進行本地話的過程中,最好的方法是建立相對通用的資原始檔,也就是上文中第2條中的而不是第3條中,就好比我們在漢化的過程中,一般漢化成普通話,而不是漢化成福建話,或者是臺灣話。也就是越通用越好,假設你有一個French Belgian ("fr-BE")的資原始檔,而且它的直接上級就立馬到了最高階english,那麼當你的區域設定改變成French Canadian,系統降會尋找對應的"fr-CA"資源,而此時已經無法找到,就會選用處於main assambly中的資源,也就是英文。下圖顯示的就是你不想看到的場景。

如果你願意,你可以為"fr" culture放置儘可能多的資原始檔,這樣French Canadian的使用者雖然無法看見"fr-BE"的資原始檔,但是它至少可以獲得French的資原始檔,以下圖片就是推薦的方式。


以上我們說的資原始檔,還有另一種比較高雅的叫法,叫Satellite Assemblies,翻譯成中文可以叫做衛星配件,還真有點衛星繞地球的感覺。需要注意的是這些資源配件的strong name必須跟main assembly的相一致,如果它們不匹配的話,也就無法載入了。

2.2. 本地化WinForm
VS提供了較豐富的本地化方法,通過VS開發環境實現本地化有兩種方法,第一種是用系統工具為各種UI元素生成資原始檔,然後把這些資原始檔編譯到衛星配件中去;第二種方法是新增一個資原始檔模版然後使用內建的XML Designer進行編輯;第二種方法的好處是還可以本地化messagebox種出現的文字。

下面我們用一個工程簡單演示一下這兩種本地化步驟:

2.2.1.    用VS生成資原始檔
1.         建立一個工程,我的工程名叫:WindowsApplication2;

2.         設定窗體的Localizable為true;此時Language屬性已經被設定成了“(Default)”;


3.         往窗體上拉一個Text控制元件,還是老規矩,設定它的值為“Hello World”;

4.         設定窗體的Language屬性為“German (Germany)”;

5.         重新設定Text控制元件的值為“Hallo Welt”;

6.         設定窗體的Language屬性為“French (France)”;

7.         再設定Text控制元件的值為“Bonjour le Monde”;

8.         儲存並編譯工程檔案。


這時VS為我們生成的檔案如上圖所示。

9.         按F5執行程式。


生成的檔案如上圖所示,兩個子目錄下分別包含資源配件。如“de-DE”目錄下包含的“WindowsApplication2.resources.dll”。

10.     簡單吧,需要做的工作已經完成了,你已經擁有了一個擁有德文和法文的應用程式了,不過具體顯示什麼就取決於你作業系統的區域配置了。當然你也可以在程式中指定要顯示的語言。下面將通過程式碼的方式詳細說明。

這是需要的名稱空間:

// C#

using System.Globalization;

using System.Threading;

// C#

// Sets the UI culture to French (France)

Application.EnableVisualStyles();

    Application.SetCompatibleTextRenderingDefault(false);

    Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");

Application.Run(new Form1());

經過以上處理,我們現在看到的就是法語了,嘎嘎,太簡單了,似乎沒什麼挑戰性。不過這種硬編碼的方式並不推薦,可以通過使用者喜好設定或者是程式設定來更改介面。

2.2.2.    新增資源模版並編輯

 

新增 Resource File 型別檔案,這裡命名為: WinFormStrings ,然後編輯檔案如下:

法文和德文的新增方法類似,不過需要變動一下檔名,參看下

大致修改的情況如下所示:

resource file name

name

Value

Comment

WinFormStrings.de-DE.resx

strMessage

Hallo Welt

WinFormStrings.fr-FR.resx

strMessage

Bonjour le Monde

資原始檔是新增好了,下面講述如何訪問這些資原始檔

資原始檔是新增好了,下面講述如何訪問這些資原始檔:

1.         新增名稱空間:using System.Resources;

2.         為主視窗新增一個button,不過此時需要注意的是把窗體的Localizable屬性設定為False,否則將無法新增。(我這裡懶得用新專案,還是前文提到的那個專案)

3.         為這個button的Click事件編寫程式碼如下,需要注意的是ResourceManager的引數。且預設的ResourceManager是大小寫敏感的,雖然也可以設定忽略大小寫,不會有造成效能上的損失。

// C#

// Declare a Resource Manager instance

ResourceManager LocRM = new ResourceManager("WindowsApplication1.WinFormStrings"

,typeof(Form1).Assembly);

// Assign the string for the "strMessage" key to a messagebox

MessageBox.Show(LocRM.GetString("strMessage"));

4. 編譯並執行即可顯示效果。

這時如果要更改顯示語言的話,還是使用

Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");

這種方式進行更改。

3.   本地化DevExprss
通過以上知識的瞭解,我們是時候開始進行DevExpress的漢化工作了J。

通常有兩種做法,其一是使用Localizer,不過這種方法還是要編寫一點程式碼,覺得還不是很爽,且這種方法的靈活性不夠,只能本地化為一種語言。另一種方法是使用前文說到的衛星配件的方式,這種方式無需編寫任何程式碼,只需本地化資原始檔之後,編譯成資源配件,並把這些配件放在程式的啟動目錄下即可,就可以改變相應的介面語言,並且可以放置多種語言的配件。這樣的好處是你可以任意的控制你的介面顯示了,想英文就英文,想中文就中文。真是好處多多啊,那我們快開始吧。

DevExpress公司已經為我們準備好了很多東西,官方網站上已經提供了較多語言的資原始檔的下載,最新版本的Dev控制元件,截至2007-3-25該控制元件的本版是7.1.1,中文的資原始檔已經包含如下幾個:

剩下的工作就是按各自的需要自己漢化了。

3.1. 使用Localizer
下面我們以一個簡單的例子描述XtraGrid中的比較符的本地化。程式碼如下所示:

private void Form1_Load(object sender, System.EventArgs e) {

   GridLocalizer.Active = new MyGridLocalizer();

}

public class MyGridLocalizer : GridLocalizer {

   public override string GetLocalizedString(GridStringId id) {

      string ret = "";

      switch(id) {

         // ...

         case GridStringId.CustomFilterDialogConditionEQU : return "=";

         case GridStringId.CustomFilterDialogConditionNEQ : return "<>";

         case GridStringId.CustomFilterDialogConditionGT : return ">";

         case GridStringId.CustomFilterDialogConditionGTE : return ">=";

         case GridStringId.CustomFilterDialogConditionLT : return "<";

         case GridStringId.CustomFilterDialogConditionLTE : return "<=";

         // ...

         default:

            ret = "";

            break;

      }

      return ret;

   }

}

執行程式,我們可以看到如下的效果:

3.2. 建立衛星配件


為了本地化窗體資源,.Net Framework已經為我們提供了相應的工具——WinRes.exe。要了解它的具體使用方法,你檢視相應的MSDN相關文件。

我們先以一個Library來描述它的本地化步驟,就用XtraEditors吧,如果你有Dev的原始碼,你會發現Dev已經把各種資源放在了一個叫做LocalizationRes.resx的資原始檔裡面。

1.         把LocalizationRes.resx檔案拷貝一份到你自己的某個目錄下,重新命名為你需要的culture,比如要本地化為德文的話,就更名為"LocalizationRes.de.resx",當然我們需要的是中文,於是把它更名為LocalizationRes.zh-CHS.resx。窗體或使用者控制元件也都用一個resx檔案,同樣可以使用這種方式漢化。

2.         現在我們可以藉助VS開發環境對這個檔案進行漢化了,如下圖所示:

 


3.         現在我們需要藉助Resgen.exe把這個檔案轉化為一個resources檔案。

resgen LocalizationRes.zh-CHS.resx LocalizationRes.zh-CHS.resources。

4.         把這個資原始檔打包到衛星配件中去,仍然使用VS提供的一個小工具——Al.exe。下面的命令列就是把LocalizationRes.zh-CHS.resources檔案打包成衛星配件了。

al /out:DevExpress.XtraEditors.Resources.Dll /v:0.0.0.0 /culture: zh-CHS /embed:LocalizationRes.zh-CHS.resources,DevExpress.XtraEditors.LocalizationRes.zh-CHS.resources /keyfile:strongkey.snk。

       上面各種引數一目瞭然吧,就不贅述了。需要注意的是keyfile對應的strongkey必須跟DevExpress相應元件指定的strongkey一致。通過al命令也可以把多個resources檔案打包成一個單一的配件。如下面這條命令把多種資源打包成配件。

%al% /out:../zh-CHS/DevExpress.XtraPrinting.%VER_DLL%.Resources.dll /v:%VER_PSYS% /culture:zh-CHS /embed:ComponentEditorForm.zh-CHS.resources,DevExpress.XtraPrinting.ComponentEditorForm.zh-CHS.resources

/embed:LocalizationRes.zh-CHS.resources,LocalizationRes.zh-CHS.resources /embed:HeaderFooterForm.zh-CHS.resources,DevExpress.XtraPrinting.Native.WinControls.HeaderFooterForm.zh-CHS.resources /embed:WatermarkEditorForm.zh-CHS.resources,DevExpress.XtraPrinting.Native.WinControls.WatermarkEditorForm.zh-CHS.resources

/keyfile:%KEYFILE%

       通過這裡大家可以看出,已經把幾個窗體的資源也打進來了,不過需要注意的是/embed裡的第二個引數要加上窗體或控制元件所在的名稱空間。

現在衛星配件已經制作出來了,現在需要把它配置到一個地方以便Framework能夠找到它。通常有兩種方法,一種是直接把它放到GAC中,方便省事;另一種是把它們放到具體的程式目錄下。

要放到GAC裡面,簡單的方法就是直接把衛星配件拖放到“Windows/assembly”目錄下,如果非要顯得自己專業一點的話,也可以使用Microsoft提供的工具gacutil,使用如下命令:

gacutil /i:LocalizerRes.zh-CHS.resources.dll

如果不放到GAC中,那就放在你的程式的所在目錄下,放置的時候也有一點學問,下面的這個圖顯示的是邏輯目錄結構:

其實很簡單,看另一個圖可能直觀點:

其實很簡單,看另一個圖可能直觀點:

以下的程式碼用於設定所選用的資源:

static void Main()

{

    System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("de");

    Application.Run(new Form1());

}

       還是這麼簡單,事實上只要把資源配件放到目錄下即可,無需進行硬編碼即可完成本地化工作,那是因為我們一般預設的CurrentUICulture就是zh-CHS。

目前為止我們就完成了需要做的大部分工作了,剩下的就是大家想到什麼然後給我提提意見或建議,我再進行改進,初次執筆,感覺舉筆維艱,寫的挺生硬的,將就著看吧,呵呵,,

相關推薦

自己學會DevExpress控制元件

1.   文件導讀 本文件以顏色區分內容的重要性和不同性,閱讀本文件時請注意以下事項: 1.         紅色部分表示需要注意的重點內容;(加粗的尤甚) 2.         藍色部分表示相應於前版本新增的內容; 3.         紫色部分表示跟前版本不同的內容; 本

DevExpress控制元件詳解

第一章WinForm漢化所有Developer Express .NET產品都有本地化資源,比如按鈕屬性,控制元件屬性描述,選單項,確認和錯誤的資訊等等,所有這些資源字串可以很容易地被翻譯成各種語言。  如何實現上述的漢化呢?DX漢化總結下來一般分三種形式:一種是利用已經漢化

Delphi 在DLL中使用DevExpress控制元件時出錯解決辦法

測試環境 DevExpress VCL 14.1.3 和XE7 問題:在dll使用cxGrid控制元件時  如果不新增列標題 則不報錯   查詢無資料集顯示,如果加上標題 就報錯了 這段為報錯部分 function TcxCustomGridTableItem.CanFilt

Winform DevExpress控制元件庫(二) 使用SplashScreenManager控制元件定製程式載入頁面

SplashScreenManager控制元件:主要作用是顯示在進行耗時操作時的等待介面;   位於 工具箱 -> Navigation & Layout(導航欄與佈局類控制元件) 目錄下;   在工具箱輸入名稱SplashScreenManager檢索,然後直接拖拽

DEVexpress控制元件使用 ASPxGridView 製作報表帶子表的 備忘

利用ASPxGridView製作報表                 <dx:ASPxGridView ID="grdProductivity

HTML5學習第6篇—video:自己實現video的播放控制元件(新增樣式版)

     本篇部落格接著上一篇文章,實現了一個帶樣式的video播放控制元件,程式碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">

HTML5學習第5篇—viedo:自己實現viedo的播放控制元件(簡版)

      最近正在學習html5新增的媒體元素video,為了能夠更熟悉video的屬性、方法和事件,決定自己實現一下video的播放控制元件,因為是初學,只是寫了個簡版。程式碼如下: <!DOCTYPE html> <html lang="en

DevExpress控制元件cxGrid實現多列模糊匹配輸入的完美解決方案

本方案不需要修改控制元件原始碼,是完美解決cxgrid或TcxDBExtLookupComboBox支援多列模糊匹配快速輸入的最佳方案!! 小哥摸索多日,終於搞定cxgrid和TcxDBExtLookupComboBox可以支援多列模糊查詢輸入了! 縱觀網上的方案,不是

C#(Winform) 當前執行緒不在單執行緒單元中,因此無法例項 ActiveX 控制元件

解決方案: 1、在主執行緒中例項化此ActiveX控制元件 2、將建立此Active控制元件的執行緒設定為單執行緒。       Thread.ApartmentState 獲取或設定此執行緒的單元狀態。             newThread= new Thre

duilib Webkit核心dui瀏覽器控制元件

改進: 1、跟其他duilib控制元件一樣,不包含視窗 2、將onURLChanged和onTitleChanged傳送到到Notify裡處理 效果: 不足的地方: 1、改變大小時會閃屏(等大神來改進) 2、contextMenuEv

eclipse視覺開發控制元件

一、控制元件介紹 Eclipse並不自帶GUI的視覺化開發工具,那麼如果要在Eclipse進行視覺化的GUI開發,就需要依靠第三方的外掛。 1. Visual Editor Eclipse官方提供了一個叫做Visual Editor(VE)的開源GUI外掛,功能還是比較強。

Winform DevExpress控制元件庫(三) 使用NavBarControl控制元件定製導航欄

NavBarControl控制元件:主要作用是製作包含多個選項組並且每個組裡包含多個子選項的導航欄;位於 工具箱 -> Navigation & Layout(導航欄與佈局類控制元件) 目錄下;在工具箱輸入名稱NavBarControl檢索,然後直接拖拽到面板上

DevExpress控制元件-ButtonEdit控制元件的使用(圖文)

5、在屬性管理器中Properties下的Buttons裡,可以進入EditorButton集合編輯器設定文字框右側的按鈕。文字框右側的按鈕可以有不止一個,在EditorButton集合編輯器中都可以進行設定。在文字框右側的按鈕,都是DevExpress.XtraEditors.Controls.Edit

自己編寫vb進度條控制元件

主程式程式碼: Option Explicit Dim i As Double Private Sub Command1_Click() i = 0 Timer1.Enabled = True End Sub Private Sub Timer1_Timer

如何在VS工具箱中新增DevExpress控制元件

①使用控制檯進入DevExpress安裝目錄:    cd D:\Program Files (x86)\DevExpress 14.1\Components\Tools ②新增DevExpress控制元件:   ToolboxCreator.exe/ini:toolboxcreator.ini ③移除De

[DevExpress控制元件應用]XtraGrid: 改變當前單元格外框的顏色

{            if (CanDraw(rect) ==false)                return;            Brush brush = Brushes.Red;    //紅色外框            g.FillRectangle(brush, new Rectan

devexpress控制元件中的gridControl設定某個單元格屬性

前提:有一列RepositoryItemCheckEdit複選框列,和一列RepositoryItemButtonEdit按鈕列,特定條件下這行的複選框和按鈕不可用。效果圖如下: 原理是在程式碼中宣告新的物件,給新的物件賦屬性值,再用新的物件替換原有的物件。 程式碼如下

自己實現的資料表格控制元件(dataTable),支援自定義樣式和標題資料、ajax等各種自定義設定以及分頁自定義

一、前言 也沒什麼好說的嘛,用了蠻多github上開源的能夠實現dataTable功能的表格外掛,不過都預設繫結樣式啊,資料格式也設定的比較死,所以忍不住自己實現了一個簡單的可自定義樣式和自定義資料返回格式的資料表格外掛,原生js是保留的,後面如果更新新版本的話會去除對jq

控制元件子類控制元件超類

子類化: 子 類化是這樣一種技術,它允許一個應用程式截獲發往另一個視窗的訊息。一個應用程式通過截獲屬於另一個視窗的訊息,從而實現增加、監視或者修改那個視窗的缺 省行為。子類化是用來改變或者擴充套件一個已存在的視窗的行為、而不用重新開發的有效途徑。想要獲得那些預定義控制元件視窗

DevExPress控制元件中ComboBoxEdit動態繫結資料

List<string> strList = new List<string>(); //strList.Add()獲取資料後