CSDN上有朋友問起如何從已經完成的項目升級到使用多國語言的程式,相信很多朋友也並非從項目的一開始就使用TLMPack的(也確實沒有這個必要),下面我就簡單的介紹一下怎麼樣將已有的項目升級為支援多國語言的項目。
1。在Delphi(或BCB)中安裝TLMPack標準版,關於如何安裝協助檔案中有比較詳細的說明了,這裡不在累述了。(當然安裝標準版的前提是你使用標準的AnsiVCL控制項來開發的程式,如果你使用 TntUnicode控制項來開發程式,那麼相對應,必須使用Unicode版的TLMPack)。
2。開啟你需要升級成多國語言的工程,在每一個Form(以及 QReport,Module等)上放置一個TtlmController控制項,這個控制項的作用是自動改變其所在Form上所有控制項的顯示文字,一般情況下只需要將該控制項放置在Form上就可以了,不需要作任何設定。
3。Form上的控制項現在已經可以自己根據語言設定的變換而自動更新了,那麼像MessageBox()這樣的函數中顯示的文字怎麼辦呢,答案是使用TtlmController的Translate()函數,這個函數可以自動到當前使用的語言檔案中取得文字資源然後作為傳回值返回出來,假設已有一段函數是這樣的:
代碼:
procedure TForm1.Button1Click(Sender:TObject);
begin
MessageBox(Handle, PChar('Say hello to the user!'), 'Message', MB_ICONINFORMATION);
end;
那麼你需要將文字的部分使用Translate函數封裝起來,封裝後就像這樣:
代碼:
procedure TForm1.Button1Click(Sender:TObject);
begin
MessageBox(Handle, PChar(tlmController1.Translate('SayHello', 'Say hello to the user!')), 'Message', MB_ICONINFORMATION);
end;
前面的‘SayHello’是對文字的標識,通過這個標識程式才能從語言檔案中找到正確的資源,後面的文字作用是當語言檔案中不存在需要尋找的資源(或者語言檔案不存在時),該函數預設所返回的內容。
另外,Translate函數還支援同Format()函數一樣的參數顯示,如這樣:
代碼:
procedure TForm1.Button1Click(Sender:TObject);
begin
MessageBox(Handle, PChar(tlmController1.Translate('ComponentCount', 'ComponentCount = %d', [ComponentCount])), 'Message', MB_ICONINFORMATION);
end;
4。以上的MessageBox()函數是出現在Form中的,並且該Form中已經有TtlmController控制項了,所以才可以使用TtlmController的Translate()函數進行文字的轉換,那麼如果你的工程中有一個直接從TObject繼承而來的功能類,它也需要顯示Message,或者需要記載Log文字等,這時候該怎麼辦呢,最簡單的方法是讓這個功能類去調用某個Form中的TtlmController的Translate()函數,但是這樣的缺點是程式可能需要為此做較大的改動,另外語言檔案中的文字也將變得混亂不堪。那麼這個時候最好的解決方案就是使用TtlmObject類,該類同TtlmController類一樣,也有 Translate函數可以使用,但是區別是它不會偵測所在Form的所有控制項,不會對它們進行自動轉換。
以下這個類是個小型的功能類。
代碼:
interface
uses
....;
type
TFunctionClass = class(TObject)
public
procedure ShowMessage();
end;
impenmentation
procedure TFunctionClass.ShowMessage();
begin
ShowMessage(nil, 'Say hello to the user!', 'Message‘, MB_ICONINFORMATION);
end;
end.
使用TtlmObject類後,該類被改造為:
代碼:
interface
uses
...., TLMObject;
type
TFunctionClass = class(TObject)
private
FtlmObject:TtlmObject;
public
constructor Create();
destructor Destroy();override;
procedure ShowMessage();
end;
impenmentation
constructor TFunctionClass.Create();
begin
inherited Create();
FtlmObject:=TtlmObject.Create(self);
end;
destructor TFunctionClass.Destroy();
begin
FtlmObject.Free;
inherited Destroy();
end;
procedure TFunctionClass.ShowMessage();
begin
MessageBox(Handle, PChar(tlmController1.Translate('ComponentCount', 'ComponentCount = %d', [ComponentCount])), 'Message', MB_ICONINFORMATION);
end;
end.
這樣每當使用該功能類中需要文字顯示的函數時,真正使用的文字就是語言檔案中記載的內容了。
5。TLMPack是從外部語言檔案來載入語言文字的,由於完全手工寫一個語言檔案是一件比較枯燥的事,所以你可以使用嚮導控制項來由程式,如果你打算自己手工來撰寫一個語言檔案,那麼可以忽略該小節。
所謂的嚮導控制項是指:TtlmIniGenerator和TtlmXmlGenerator這兩個控制項,它們會在程式運行時,將所有原本需要 TtlmController和TtlmObject讀取的文字,反向輸出到語言檔案中,你所要做的就是在程式的主表單上放置一個 TtlmIniGenerator(這裡假設你要輸出的是Ini格式的語言檔案),然後運行程式,程式啟動並執行過程中會首先出現一個設定對話方塊,詢問產生語言檔案的路徑,以及字元集格式等,一般使用預設的設定直接OK就可以了,該提示對話方塊如:
以後每當程式中有需要轉換文字的代碼被調用到,TtlmIniGenerato都會出現一個提示對話方塊,提示你實際儲存到檔案中的實際文字內容是什麼,一般情況下在這一步都不需要修改任何文字,直接讓它輸出就可以了。你所要做的就是保證程式的每一個需要文字顯示的代碼都被走到一遍,不然文字是不會被輸出的,該對話方塊如所示:
6。現在,假設你已經通過第4步成功的建立了語言檔案,或者你自己手工寫了這麼一個檔案,接著要做的就是將那個語言檔案作為模板,將它複製成不同副檔名的多個檔案(關於每種語言所對應的副檔名,有嚴格的要求,請參考說明檔案中的“字元集”一節),然後針對每種語言修改語言檔案中的文字,以及記得修改語言檔案中的General段中的資訊,每種語言的內容都不同,你可以通過協助檔案的“字元集”一節來獲知它的具體寫法。
7。最後一步,如果剛才主Form上放置過了 TtlmIniGenerator,那麼刪除它。在主Form上放置一個TtlmIniFilter(如果你使用的是Xml格式的語言檔案,那麼需要放置 TtlmXmlFilter),並且設定它的檔案路徑等屬性,以讓它能夠正確找到語言檔案,並且書寫代碼控制 TtlmIniFilter.ActiveLanguage屬性,以達到運行時切換語言的效果,好了,運行程式,修改一下語言試試,程式是不是立刻切換了語言了呢,不論是介面還是顯示的Message,就好像程式根本就是用這種語言開發的一樣。。。是不是很棒?!
TLMPack可以從這裡下載:
http://www.tonixsoft.com/index.php?mmenu_id=0003