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;

这个时候运行界面如下:

 

很好,但是我们看到“确定安装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、英文环境: 

时间: 2024-11-10 00:42:08

Inno Setup:获取isl中的多国语言字串的相关文章

INNO SETUP卸载程序中加入自定义窗体

原文:INNO SETUP卸载程序中加入自定义窗体 [Setup] AppName=My Program AppVerName=My Program v.1.2 DefaultDirName={pf}/My Program [Files] Source: Files/*; DestDir: {app} [Code] const bidDelAll = 1; bidSkipAll = 2; var Form: TSetupForm; CheckListBox: TNewCheckListBox;

关于Servlet、Jsp中的多国语言显示 -- 转自高人

js|servlet|显示 /***有朋友有如此苦心之作,实在感谢,相信它不会怪我转贴吧,他的email是vividq@china.com*/ 关于Servlet.Jsp中的多国语言显示 因为一直不信Java竟会有不能混排显示多国语言的BUG,这个周末研究了一下Servlet.Jsp的多国语言显示的问题,也就是Servlet的多字符集问题,由于我对字符集的概念还不是很清晰所以写出的东西未必是准确的,我是这样理解Java中的字符集的:在运行时,每个字符串对象中存储的都是编码为UNICODE内码的(

OEA 中的多国语言实现

  本篇博客主要描述在 OEA 框架中的多国语言框架的原理及应用.   多国语言常见实现及原理分析     管理软件平台,一般来说,都应该支持多国语言,以支持应用程序走向国际化.OEA 最近也提供了多国语言框架,它可以在修改少量甚至不修改代码的情况下,快速.灵活地,使得整个应用软件支持各个国家的语言.在 .NET 平台上,要实现多国语言切换,一般可以使用资源文件实现:在WPF中,也可以使用动态引用实现.这些可以参考以下几篇文章中讲到的方法:<WP7多国语言支持>.<一种灵活的WPF程序多

java-求字符串中相同最长的字串

问题描述 求字符串中相同最长的字串 用java程序写 题目:输入一行字母组成的字符串,找出其中出现的相同且 长度最长的字符串,输出它及其首字符的位置. 如yyabrdabjcabreg,则输出为abr,3.异常情况输出-1 解决方案 /** * 思路:"abdab" 拆分情况:1.ab abd abda abdab 2.bd bda bdab 3 da dab 4 ab 5 b * * @param str * @return */ public static String find(

关于Servlet、Jsp中的多国语言显示

js|servlet|显示 因为一直不信Java竟会有不能混排显示多国语言的BUG,这个周末研究了一下Servlet.Jsp的多国语言显示的问题,也就是Servlet的多字符集问题,由于我对字符集的概念还不是很清晰所以写出的东西未必是准确的,我是这样理解Java中的字符集的:在运行时,每个字符串对象中存储的都是编码为UNICODE内码的(我觉得所有的语言中都是有相应编码的,因为在计算机内部字符串总是用内码来表示的,只不过一般计算机语言中的字符串编码时平台相关的,而Java则采用了平台无关的UNI

Servlet、Jsp中的多国语言显示

js|servlet|显示 因为一直不信Java竟会有不能混排显示多国语言的BUG,这个周末研究了一下Servlet.Jsp的多国语言显示的问题,也就是Servlet的多字符集问题,由于我对字符集的概念还不是很清晰所以写出的东西未必是准确的,我是这样理解Java中的字符集的:在运行时,每个字符串对象中存储的都是编码为UNICODE内码的(我觉得所有的语言中都是有相应编码的,因为在计算机内部字符串总是用内码来表示的,只不过一般计算机语言中的字符串编码时平台相关的,而Java则采用了平台无关的UNI

浅析Servlet和Jsp中的多国语言显示

因为一直不信Java竟会有不能混排显示多国语言的BUG,这个周末研究了一下Servlet.Jsp的多国语言 显示的问题,也就是Servlet的多字符集问题,由于我对字符集的概念还不是很清晰所以写出的东西未必 是准确的,我是这样理解Java中的字符集的:在运行时,每个字符串对象中存储的都是编码为UNICODE内 码的(笔者认为所有的语言中都是有相应编码的,因为在计算机内部字符串总是用内码来表示的,只不过 一般计算机语言中的字符串编码时平台相关的,而Java则采用了平台无关的UNICODE). Ja

关于Servlet、Jsp中的多国语言显示(续)

js|servlet|显示 续   --- /*** Insert the method's description here.* Creation date: (2001-2-4 17:28:17)* @return java.util.Enumeration*/public Enumeration getParameterNames() {if (pairs == null) return null;return pairs.keys();}/*** Insert the method's

怎么在ABBYY FineReader中识别多国语言文档

  这里将某一同时包含英文和中文文本的文档作为示例. 步骤一:在主工具栏上,从文档语言下拉列表中选择更多语言; 步骤二:在语言编辑器对话框中,从手动指定语言下拉列表中选择中文和英语; 步骤三:扫描或打开图像; 步骤四:如果程序无法检测图像上的所有区域: 1.使用区域编辑工具手动指定区域. 2.指定任何只包含一种语言的区域,选择这些区域并在区域属性面板上指定相应的语言. 重要!该语言仅可指定给类型相同的区域,如果选择类型不同的区域,如文本和表格,则无法指定一种语言. 3.如果需要,从方向下拉列表中