原文 http://zwkufo.blog.163.com/blog/static/25882512010101041626803/?suggestedreading&wumii
用InnoSetup做安装包的时候,在iss文件中写[Code]经常会用MessageBox,像是这样:
[Code]
function InitializeSetup(): boolean;
begin
if MsgBox('确定安装Eee Docking?', mbInformation, MB_OKCancel) = IDOK then
result := true
else
result := false;
end;
这个时候运行界面如下:
很好,但是我们看到“确定安装Eee Docking?”这个字串是写死在Code代码中的,如果软件支持多国语言安装,是不是需要写n次MessageBox?这样显然不合理。
其实我们很多人会用isl文件来做多国语言翻译,而“确定安装Eee Docking?”之类的翻译信息会放在isl文件中。如下面ChineseSimp.isl文件中的SetupLdrStartupMessage字串就表示了我们需要表达的意思:
当然,你也可以直接把这些翻译字段写在iss文件的[Messages]或者[CustomMessages]中,但是这个不在这次的讨论范围内。
OK,现在如果能得到这个字串就可以完全解决支持多国语言安装包的MessageBox翻译问题。
InnoSetup中有一个获取isl中特定ID字串的函数:
function SetupMessage(const ID: TSetupMessageID): String;
而这里的TSetupMessageID为 'msg'+'isl文件中的字段',如我们需要这里的SetupLdrStartupMessage,则TSetupMessageID:=’msgTSetupMessageID‘ 。好了,现在代码可以修改如下:
[Code]
function InitializeSetup(): boolean;
var S: String;
begin
S := SetupMessage(msgSetupLdrStartupMessage);
if MsgBox(S, mbInformation, MB_OKCancel) = IDOK then
result := true
else
result := false;
end;
结果看起来会是这样:
“将在你的电脑上安装%1”?!其实如果足够仔细,你会发现在isl中其实有大量的 " %1 ”、" %2 ” 标记,用于留给User(好吧:打包者)自定义。我翻遍InnoSetup的Help文档,没有什么形式的API可以填充这个 " %1 "!
但是故事没有到这里结束,有一个最简单的方法可以避免这么尴尬的事情,那就是直接用你想要的文字替换它!现在最后的代码可以这样:
[Code]
function InitializeSetup(): boolean;
var S: String;
begin
S := SetupMessage(msgSetupLdrStartupMessage);
StringChange(S, '%1', 'EeeDocking');
if MsgBox(S, mbInformation, MB_OKCancel) = IDOK then
result := true
else
result := false;
end;
好了,结果如你想象的那样完美:
1、中文环境:
2、英文环境: