可以把妳的Delphi的窗體文件分給翻譯來翻譯,如果是Delphi7,需要先用Conver.exe來轉換為文本格式。
1、Project-New Application 創建妳的中文版軟件。
2、Project-Language-Add 添加妳的語言,比如美國英語(ENU)。或者File-New-Others-Dll Wizard
3、保存後生成多個文件夾。
4、Project-Build All
5、程序目錄下生成和工程文件同名的語言文件:MyExe.ENU;MyExe.CHN,軟件發布需要帶這些文件。
6、把軟件裏面所有字符串定義為資源字符串。
resourcestring
C_AppTitle = 'xx管理系統';
C_Error = '錯誤';
C_Warning = '警告';
7、在軟件中用如下代碼切換語言:
const
//定義妳的多語言:
ENGLISH = (SUBLANG_ENGLISH_US shl 10) or LANG_ENGLISH;
CHINESE = (SUBLANG_CHINESE_SIMPLIFIED shl 10) or LANG_CHINESE;
uses
ReInit;
...
if LoadNewResourceModule(ENGLISH) <> 0 then
begin
ReInitializeForms();
end;
更多請參考Delphi幫助,裏面寫得更清楚。
其實感覺最好還是用INI文件
把所有語言條目提取出來記錄,並且將INI翻譯成多份(多種語言),程序啟動時從INI文件中加載語言。
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格式的語言文件):