2017-07-22

【Delphi2010】DKLang Localization Package 建立 多國語言程式

參考資料 ----
DKLang Localization Package
Installation
Duplicate case label issue #8
DKLang Translation Editor


Delphi 6(含) 以上的 Delphi 版本皆可使用,開放原始碼,免費,簡單易用,功能強大!!

視自己的 Delphi 版本,到 DKLang 官網下載對應的 DKLang,因為老灰鴨還在用 Delphi2010,所以我下載的 DKLang 版本為 4.01

解壓後,將解壓出來的資料夾放至您所屬意位置,老灰鴨的習慣是放在 Delphi 安裝目錄下的 lib 資料夾

C:\Embarcadero\RAD Studio\7.0\lib\3rdparty\dklang-dklang-4.01



安裝元件


* 開啟 Packages 資料夾下的 dklang.bpl
compile

 
case wsPropVal[i] of
    'A'..'Z', 'a'..'z', #161..High(Char):    // 這行會出錯
        begin
            Result := True;
            Break;
        end;
end;

改成

case wsPropVal[i] of
    'A'..'Z', 'a'..'z', #$161..High(Char):    // 在 161 的左方加上 $ 就能通過 compile 了
        begin
            Result := True;
            Break;
        end;
end;
 

* 接著開啟 dcldklang12
compile
install


安裝完成後, 會出現在元件盤的 System 頁籤



* 按功能表的 Tools
Options...
Environment Options
Delphi Options
Library - Win32
Library path



加入 dkLang 的路徑,就可以開始使用 dkLang



在解壓後的 dkLang 資料夾下有 Examples 資料夾,包含幾個範例程式,可供您參考如何使用 dkLang;直接開啟 compile "Simple" 這個範例程式就可以看到執行結果了。

====================

試著建立自己的專案驗證一下 ----

* 建立一個新專案,專案名稱為 Project1

* 在 Form1 上放一顆 TDKLanguageController 元件,name 屬性設為 cbLanguage

* 放一個 ButtonCaption = "測試"



* 將專案存檔,您會看到專案所在的目錄有一個與專案同名的 Project1.dklang,以純文字編輯器(如:Notepad++) 開啟 Project1.dklang

Project1.dklang 內容:
 
[Form1]
Caption=00000001,測試
Button1.Caption=00000002,測試
cbLanguage.Text=00000003,cbLanguage
 

下載並安裝 DKLang Translation Editor,選擇 來源語言 和 要翻譯成何種語言,在本例,來源語言是繁體中文,要翻譯成簡體中文。




開始編寫,將粗體字改成 簡體中文。



翻譯完成,存檔,檔名為 cn.lng
cn.lng 內容
 
SourceLANGID=1028
LANGID=2052
Generator=DKLang Translation Editor v3.0
LastModified=2017-07-22 00:49:57

[Form1]
00000001=测试
00000002=测试
00000003=cbLanguage

[$CONSTANTS]
 



Form1OnCreatecbLanguageOnChange 寫入下面的程式碼
 
procedure TForm1.cbLanguageChange(Sender: TObject);
var
    iIndex: Integer;
begin
    iIndex := cbLanguage.ItemIndex;
    if iIndex<0 then
        iIndex := 0; // When there's no valid selection in cbLanguage we use the default language (Index=0)
    LangManager.LanguageID := LangManager.LanguageIDs[iIndex];
end;

procedure TForm1.FormCreate(Sender: TObject);
var
    i: Integer;
begin
    // Scan for language files in the app directory and register them in the LangManager object
    LangManager.ScanForLangFiles(ExtractFileDir(ParamStr(0)), '*.lng', False);
    // Fill cbLanguage with available languages
    for i := 0 to LangManager.LanguageCount-1 do
        cbLanguage.Items.Add(LangManager.LanguageNames[i]);
    // Index=0 always means the default language
    cbLanguage.ItemIndex := 0;
end;
 

* compile 後執行程式