不需重新編譯,就可以改成不同語言的版本 |
|
t0922610976
一般會員 ![]() ![]() 發表:11 回覆:16 積分:15 註冊:2003-09-02 發送簡訊給我 |
兩岸三地的系統需求頻繁,寫起程式來,有時要繁体,有時要簡体,甚至是日,韓..等語言.往往在開發上,只好利用 delphi 的 translation tool來設定及編譯,往往使用上又需要編譯成各語言版本,當版本昇級後,又要面臨痛苦的重新設定.很麻煩. EEP或是AP程式透過多國語言元件以及語言檔的設定,不需重新Compile或是修改Source Code,就可以改成不同語言(語系)的版本.。 [元件規格] 每個BPL獨立一個語言檔,和BPL同名,和BPL(EXE)檔放在同一個路徑下,附檔名預設是*.LNG。在Delphi的設計時期可以透過元件把Form上面需要Export的元件屬性(例如Caption, Font.Name, Font.CharSet等…)存到語言檔裡面。所有程式碼的訊息內容一樣透過元件管理並Export到語言檔.,執行時元件會自動載入語言檔的設定取代畫面上的元件屬性及訊息。 [新增元件] 在EEP Common Tools這個元件盤上, 新增 MultiLangComp 元件, 可以直接貼在Form或是DataModule上面使用。 [使用方式] 元件屬性與Method:
TMultilangComp基本屬性:ResourceItems, 每個ResourceItem代表一組字串變數設定(Resource String), VarName是變數名稱, VarValue是變數內容,畫面上如果需要顯示字串訊息的話(例如ShowMessage, Exception的訊息),都要透過ResourceItem的設定,執行時透過變數名稱取得訊息內容。 另外直接在MultiLangComp上面Double Click可以開啟變數的編輯程式,把所有的變數集中在Memo上設定,格式為 VarName=VarValue (不需額外的引號), 每一行就代表一個變數,按確定之後就會存到MultiLangComp的ResourceItems裡面。 定義好的變數,在程式裡面可以呼叫MultiLangComp.GetVar這支Method取得變數內容
function GetVar(VarName: string): string; 根據傳入的VarName回傳定義的變數內容,如果找不到VarName, 則回傳VarName。
匯出語言檔:在MultiLangComp元件上按右鍵,最上面有兩個選項,Edit Resource Items…可以開啟變數編輯程式(同上,和在元件上Double Click效果相同),第二個選項 Export To Language File…就是匯出語言檔的設定。
選擇Export To Language File…之後, 會出現匯出的設定畫面 匯出語言檔的設定畫面分為兩個部分,畫面上方是MultiLangComp從Form上面取得的元件屬性和訊息內容;畫面下方會開啟BPL輸出路徑同名的LNG檔案 按更新語言檔按鈕之後,系統就會比對元件屬性和語言設定檔的內容,覆蓋最新的屬性內容到語言檔。覆蓋的模式有兩種:「全部覆蓋」就是如果語言檔有同名的屬性,就會用畫面的設定覆蓋語言檔的設定;如果「不是全部覆蓋」,遇到語言檔已經存在的屬性就不會再做更新。覆蓋的選項預設是不會全部覆蓋,避免覆蓋掉已經修改過的語言檔,更新完成之後系統就會詢問是否儲存語言設定檔,存檔後就Export完成。
[多國語言元件支援的元件屬性] 為了不使語言檔的內容過於冗長,所以MultiLangComp並不支援所有元件的字串屬性,只會偵測部分的元件屬性,以下是MultiLangComp可以處理的元件屬性。
所有元件: 1. Caption 2. Font.Name 3. Font.CharSet 其他類別屬性: 1. TDBGrid.Columns : Title.Caption , Font.Name, Font.CharSet, Title.Font.Name, Title.Font.CharSet 2. TListView.Columns: Caption 3. TUpdateComponent.FieldAttrs: ChineseName 4. TrefValComponent.RefVals[i].LookupGridColumnDatas: TitleCaption [語言檔檔案格式] 語言檔基本上是以INI檔案格式存放,預設有兩個Section: [Common Settings]:一般畫面上的FontName和CharSet大部分都是由Form統一設定,甚至每個系統也都可能使用統一的設定,所以Common Settings這個Section目前定義了兩個屬性,針對整個BPL或是Exe的字型設定,如果有使用Common Settings的話就不用再去每個Form或是每個元件改字型設定,這邊提供的是統一的設定,不過如果Form或是元件有另外的FontName或是CharSet設定,可以做在Form本身的語言設定裡面,執行時會以Form本身的設定為主:
[Common Settings]
Font.Name=新細明體
Font.CharSet=DEFAULT_CHARSET [Resource Strings]:存放MultiLangComp的ResourceItems,格式為VarName=VarValue,請注意!每個語言設定檔只會有一個Resource Strings的Section,意即同一個BPL(EXE)檔的MultiLangComp都共用這個Section,所以同一個BPL每個Form上面的MultiLangComp的變數名稱不可重複。如果重複的話,在Export的時候只會Export一次.。建議如果BPL裡面有很多Unit的話,變數名稱前面最好使用Unit Name當作識別,這樣語言檔也較好管理,例如: [Resource Strings] MenuDM_FormNotRegistered=Form ''%s'' 沒有註冊! MenuDM_NotForm=''%s'' 不是一個Form! ApDepends_esStrUpdate=修改 ApDepends_esStrCancel=取消 ApDepends_esStrPrior=上一筆 ApDepends_esStrNext=下一筆 ApDepends_esStrSave=存檔 AncestorFM2_SNOT_EDIT=TInfoDBEdit的OnGetNextEdit只能傳回Edit元件! AncestorFM2_SCANT_FOCUS=TInfoDBEdit的OnGetNextEdit傳回一個不能 AncestorFM2_SICD_NOT_FOUND=找不到對應的InfoClientDataset! 每個變數名稱前面都加上Unit Name_,這樣所有的Resource Strings就不會混亂,也比較好找。 畫面屬性的存放方式也是用 屬性名稱=屬性值 的格式存放,存放的Section是以Form Name為命名,例如Form Name是fmWF_TEST03, 匯出的語言檔就會有fmWF_TEST03這個Section,存放格式如同下面的例子,比較特殊的像是InfoDbGrid1.Columns[0].Title.Caption就是代表InfoDBGrid1的第0個Column的Title.Caption屬性,或是像rcMaster.RefVals[0].LookupGridColumnDatas[0].TitleCaption 就代表rcMaster第0個RefVal的第0個LookupGridcolumnData的TitleCaption屬性, 要修改成不同語系的內容就可以直接尋找元件對應的屬性設定即可 [fmWF_TEST03] Caption=fmWF_TEST03 btnViewFirst.Caption=首筆 btnViewPrior.Caption=前筆 btnViewNext.Caption=次筆 InfoDBGrid1.Columns[0].Title.Caption=出貨單編號 InfoDBGrid1.Columns[1].Title.Caption=出貨單說明 InfoDBGrid1.Columns[2].Title.Caption=客戶編號 TabSheet1.Caption=資料內容 illINVO_NO.Caption=出貨單編號 illINVO_DESC.Caption=出貨單說明 rcMaster.RefVals[0].LookupGridColumnDatas[0].TitleCaption=客戶編號 rcMaster.RefVals[0].LookupGridColumnDatas[1].TitleCaption=客戶名稱 [執行結果] 上述的語言檔存放在和BPL(EXE)相同的路徑下才會有作用,如果畫面上有貼多國語言元件但是沒有語言檔的話,元件不會有任何作用。如果有存放語言檔的話,就以語言檔的設定為主,執行的時候會置換畫面上的屬性。以ClientRun.bin上面的Login為例子,原本執行的畫面如下: 在畫面上貼了MultiLangComp,並Export語言檔之後,在UClient路徑下就多了一個ClientRun.LNG這個檔案。如果需要修改畫面的Caption及語系資料的話,可以直接打開一般的文字編輯程式修改,存檔後下次執行就會按照語言檔設定的內容呈現。如果把ClientRun.LNG裡面所有元件的Caption都改成英文,不需重新Compile。
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |