Inno Setup:获取isl中的多国语言字串

原文 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;

这个时候运行界面如下:

Inno Setup:获取isl中的多国语言字串 - 乂乂 - 一个人,一支烟  ·~~
 

很好,但是我们看到“确定安装Eee Docking?”这个字串是写死在Code代码中的,如果软件支持多国语言安装,是不是需要写n次MessageBox?这样显然不合理。

其实我们很多人会用isl文件来做多国语言翻译,而“确定安装Eee Docking?”之类的翻译信息会放在isl文件中。如下面ChineseSimp.isl文件中的SetupLdrStartupMessage字串就表示了我们需要表达的意思:

Inno Setup:获取isl中的多国语言字串 - 乂乂 - 一个人,一支烟  ·~~
 
当然,你也可以直接把这些翻译字段写在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;
结果看起来会是这样:
Inno Setup:获取isl中的多国语言字串 - 乂乂 - 一个人,一支烟  ·~~
 
“将在你的电脑上安装 %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、中文环境:
Inno Setup:获取isl中的多国语言字串 - 乂乂 - 一个人,一支烟  ·~~
 2、英文环境: 
Inno Setup:获取isl中的多国语言字串 - 乂乂 - 一个人,一支烟  ·~~

你可能感兴趣的:(Inno Setup)