现在我就描述如何用TsiLang组件包来开发多语言程序。它可以从http://www.sicomponents.com/tsilang1.html下载。写这篇文章时最新的版本是4.9。
要利用TsiLang组件包你首先要将它安装到Delphi IDE中。如果你使用安装程序并且你有Delphi 3或以上版本,它已在Delphi IDE中安装好了。否则你可以阅读"INSTALL.TXT" 来指导你安装。
我们将用已包含在Delphi标准版中的Richedit例子来演示TsiLang组件包的几个特征。让我们用16步来建立多语言程序:
在Delphi中打开RICHEDIT.DPR工程。
从Delphi菜单中选择"Tools|TsiLang Expert",打开TsiLang Expert。 这时会出现TsiLang Expert窗口,其中有工程窗体的列表。
窗体列表中选择主窗体(MainForm), 你将看到停用的按钮现在激活来。点击标题为"0"(它指示选定窗体的语言数)的按钮,在出现的编辑框中填写你所需要的选定窗体的语言数,例如2,你将得到双语程序。
在窗体列表中双击MainForm,将出现TsiLang Captions Editor(标题编辑器),你可以输入组件"Caption"属性的第二种语言的翻译值。
输入第二种语言的翻译值。我们将德语作为第二语言,而将英语作为重要语言。
点击Expert上的工具条,用同样的方法翻译所有其他的属性。
对第二个窗体重复这些动作。
现在我们翻译原文件中的所有字符常量。选择MainForm并在Expert的菜单中选择 "File|Source|With form…",你将看到你的单元的原文件中出现的所有字符常量。
你可以从这一列表中删去你不想是多语言的任意常量:选择常量的所在行并点击"Delete" 按钮。正如你将看到的,第一列常量的字符串ID,相等的变量这个ID是一样的;第二列显示字符常量值;第三列显示替代文本,你可以任意修改;第四列显示常量在源文件中出现的行号。所有的字符串常量分别调用TsiLang组件的GetText()被替换。这一方法根据字符串ID和当前界面的语言返回字符串。在我们的例子中,我们将删除IDS_0、 IDS_2 和IDS_3 这几行,然后点击"Replace"按钮。
这以后,所有放置在窗体TsiLang组件的"Strings"属性的字符常量和你的源代码中的字符串,将被分别调用TsiLang的GetText()方法而替换。这样只要双击TsiLang组件的"Strings"属性打开TsiLang Strings Editor,就可以输入字符串的翻译。
为了建立真正的双语工程,需要将TSaveDialog, TOpenDialog, TFontDialog和TPrintDialog组件替换为"SiDialogs"面板页中的TsiSaveDialog, TsiOpenDialog, TsiFontDialog和TsiPrintDialog组件。设置"siLang"属性使它们与TsiLang链接。在Object Inspector中双击TsiLang组件的"DlgsCaptions"属性打开TsiLang Strings Editor,输入普通对话框字符串的翻译。
现在,将TsiLangDispatcher(它可以在组件面板的"SiComponents"页中找到)加入MainForm。设置NumOfLanguages属性为2并在LangNames属性中输入语言名字(英语和德语)。
选择窗体中的TsiLang组件并设置LangDispatcher属性。你可以看到TsiLang的LangNames属性随TsiLangDispatcher的同一属性变化。TsiLangDispatcher协助管理语言切换过程,当你改变了它的ActiveLanguage属性,所有与之相链接的TsiLang属性跟着改变。
激活工程的第二个窗体(AboutBox),在Reabout的uses子句中添加REMain。选择AboutBox的TsiLang组件并设置其LangDispatcher属性为主窗体的TsiLangDispatcher组件。
现在是最后也是最简单的一步:加入语言切换的实现。下面是一个例子:
在主窗体的主菜单中加入一"Language"的一级菜单,在其中加入"English"和"German"两个菜单项,设置它们的"RadioItem"属性为TRUE。设置"English"的"Tag"属性为"1","German"的为"2"。
选择两个菜单项并添加其OnClick事件处理函数,注意两项设置同一个事件处理函数。此函数代码为:
procedure TMainForm.German1Click(Sender: TObject);
begin
siLangDispatcher1.ActiveLanguage := TComponent(Sender).Tag;
TMenuItem(Sender).Checked := True;
end;
编译工程并执行,选择你的工程是双语的了。
按照上面方法你可以在一个可执行文件中包含多语言支持。你不需要附加文件、数据库之类的东西。但是你可以用TsiLangRT或是TsiLangRTSE来替代TsiLang,生成较小的多语言程序。这些组件允许使用存储多语言翻译的外部文件。TsiLangRT还有内置的编辑器,允许用户自己为程序修改和添加新的语言,不需要你的帮助。TsiLangRTSE为SIL Editor程序提供COM接口。由于SIL Editor程序是自由软件,你可以把它们随你的程序提供给用户,使他们方便的编辑SIL文件。
你还可以将翻译保存在附带的Dictionary Manager中,以便为将来的其他程序使用。所有的TsiLang编辑器都允许自动化翻译过程。你总是可以用储存在Dictionary Manager中的翻译,使工程的翻译自动化。
如你所看到的,用TsiLang Components Suite建立多语言程序是相当简单迅速的。你可以在SiComponents的主页(http://www.sicomponents.com/)找到在线帮助和更多的信息。