[red]{******************************************************************
用资源文件实现多语言界面的源码。
*******************************************************************}
{******************************************************************
第一步建立并维护一个语言字符串资源文件(*.rc/*.res)。
因每一个exe文件只能有一个字符串资源,所以定义多语言界面的字符串。
就必须定义一个规则。如中文语言ID从1000 ~ 1999,英文语言ID从2000 ~
2999,……等等。之后只须在程序里定义一个变量,这个变量保存语言的基础
ID,如1000、2000、3000、……等等。就可以在程序里实现只需变更这个变量
的基ID,就实现更改程序语言界面。如下面的例子
*******************************************************************}
{******************************************************************
第一步,建立字符串资源。
*******************************************************************}[/red]
STRINGTABLE
begin
[red]// 我这里定义的规则是,菜单基ID是1000 ~ 1999则是中文ID
// 2000 ~ 2999则是英文ID。[/red]
1001 "文件(&F)"
1002 "编辑(&E)"
1003 "选项(&O)"
1004 "帮助(&H)"
1011 "新建(&N)/tCtrl+N"
1012 "-"
1013 "退出(&X)/tAlt+F4"
1021 "撤消(&U)/tCtrl+Z"
1022 "-"
1023 "剪切(&T)/tCtrl+X"
1024 "复制(&C)/tCtrl+C"
1025 "粘贴(&P)/tCtrl+V"
1026 "删除(&D)/tDel"
1031 "设置(&S)..."
1041 "关于(&A)..."
[red]{******************************************************************
这里就是开始定义英语资源ID,注意,除了ID是从2000开始的和中文ID是从1000
开始的不同之外,后面的数值顺序必须和中文ID定义的一样才行。如中文1001是"文件",
则,英语的2001也必须是同样的"File",其它语言的也类似这样定义。
*******************************************************************}[/red]
2001 "&File"
2002 "&Edit"
2003 "&Option"
2004 "Help"
2011 "&New/tCtrl+N"
2012 "-"
2013 "E&xit/tAlt+F4"
2021 "&Undo/tCtrl+Z"
2022 "-"
2023 "Cu&t/tCtrl+X"
2024 "&Copy/tCtrl+C"
2025 "&Paste/tCtrl+V"
2026 "&Del/tDel"
2031 "&Setup..."
2041 "&About..."
END
[red]{******************************************************************
上面的资源文件内容放到一个*.rc文件,然后只须在Cmd命令行上用Delphi的
brcc32.exe编译就可以生成一个*.res文件。命令格式如下:
[blue]brcc32 *.rc[/blue]
*******************************************************************}[/red]
[red]{******************************************************************
下面是Demo演示代码。下面的程序一个菜单、一个ComBoBox控件,其中菜单控
件的菜单项必须先准备好四个菜单项[文件、编辑、选项、帮助],其中[文件]菜单
三个子项[新建、'-'、退出],[编辑]菜单有六个子项[撤消、'-'、剪切、复制、
粘贴、删除]、[选项]菜单有一个子项[设置],[帮助]菜单也一个子项[关于]。
上面的菜单项都是对应前面的字符串资源而设置的。
*******************************************************************}[/red]
var
Form1: TForm1;
LangBaseID:Integer;
[red]// 定义一个语言基ID变量[/red]
implementation
{$R *.dfm}
[red]// 在这里用编译指令将你的*.res资源选入程序中[/red]
[blue]{$R ResName.res}[/blue]
[red]// 写一个获取资源字符串的函数,uID参数是资源字符串的ID值(如1001等)
// 函数成功,则返回对应ID的字符串[/red]
function GetStrings(uID:Integer):String;
var c:array[0..256] of Char;
begin
FillChar(c,sizeof(c),#0);
LoadString(hInstance, uID, c, sizeof(c));
Result := String(c);
end;
procedure TForm1.ComboBox1Click(Sender: TObject);
var i,j,k:Integer;
begin
[red] // 这里开始更改程序语言界面[/red]
if ComBoBox1.ItemIndex = 0 then
Exit
else
if ComBoBox1.ItemIndex = 1 then
LangBaseID := 1000 [red]// 如果选择中文,则将ID基值设为1000[/red]
else
if ComBoBox1.ItemIndex = 2 then
LangBaseID := 2000;
[red]// 如果选择了英文,则将ID基值设为2000[/red]
k := 10;
[red] // 在这里,只须一个循环,就可以实现更换程序语言界面了。[/red]
For i := 0 to MainMenu1.Items.Count - 1do
begin
MainMenu1.Items.Items.Caption := GetStrings(LangBaseID + i + 1);
for j := 0 to MainMenu1.Items.Items.Count - 1do
begin
MainMenu1.Items.Items.Items[j].Caption := GetStrings(LangBaseID+j+k+1);
end;
k := k + 10;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
[red] // 初始化ComBoBox控件,因中文语言基ID是1000,所以将中文语言项放到第一行,英文的放到第二行。[/red]
ComBoBox1.Items.Add('请选择窗口语言界面!');
ComBoBox1.Items.Add('中文语言窗口界面');
ComBoBox1.Items.Add('英文语言窗口界面');
ComboBox1.ItemIndex := 0;
end;
end.