首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Inno设置中,对于带有预处理指令的消息,我可以使用.isl文件吗?

在Inno设置中,对于带有预处理指令的消息,我可以使用.isl文件吗?
EN

Stack Overflow用户
提问于 2020-11-20 15:28:54
回答 1查看 195关注 0票数 1

我定义了一个变量:

代码语言:javascript
复制
#define AppVersion "5.0"

在我的脚本的“messages”部分中,有很多来自Default.isl文件的标准消息。下面是一个示例:

代码语言:javascript
复制
[Messages]
en.WelcomeLabel1=Welcome to [name] {#AppVersion} Setup program. This program will install [name] {#AppVersion} on your computer.
en.SelectDirDesc=Where should [name] {#AppVersion} be installed?
en.SelectDirLabel3=Setup will install [name] {#AppVersion} into the following folder.

我不喜欢所有这些消息都驻留在我的脚本中,我想将它们传输到相应的.isl文件中。问题是我不能在{#AppVersion}文件中使用.isl,因为它被解释为简单的文本。是否有办法覆盖.isl文件中的这些消息,同时考虑到它们包含{#AppVersion}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-20 15:49:45

对于这个特定情况,应用程序名称和版本,有一个简单的解决方案:

How can I rewrite predefined messages for the WelcomePage in different languages in Inno Setup?

如果您需要注入少量其他信息,请参见下面的.

关于最终解决方案,请参见Full preprocessor support in Inno Setup language files (isl)

如果需要注入一些自定义信息,可以像这样对.isl文件进行预处理:

代码语言:javascript
复制
#define Token1 "value1"
#define Token2 "value2"

#define PreprocessLanguage(Path) \
  Local[0] = GetEnv("TEMP") + "\" + ExtractFileName(Path), \
  Local[1] = \
    "-ExecutionPolicy Bypass -Command """ + \
    "$contents = Get-Content '" + CompilerPath + "\" + Path + "'; " + \
    "$contents = $contents -replace '[token1]', '" + Token1 +"'; " + \
    "$contents = $contents -replace '[token2]', '" + Token2 +"'; " + \
    "Set-Content -Path '" + Local[0] + "' -Value $contents;" + \
    """", \
  Exec("powershell.exe", Local[1], , , SW_HIDE), \
  Local[0]

[Languages]
Name: "en"; MessagesFile: {#PreprocessLanguage("Default.isl")}
Name: "nl"; MessagesFile: {#PreprocessLanguage("Languages\Dutch.isl")}

上面的示例将[token1][token2]的所有出现替换为Token1Token2预处理变量的值。

从理论上讲,通过使用PowerShell、FileReadStringChangeSaveStringToFile函数,可以在预处理器中完全实现这一点,而无需调用StringChange

代码语言:javascript
复制
#define Token1 "value1"
#define Token2 "value2"

#define PreprocessLanguageLines(Handle, OutPath) \
    !FileEof(Handle) ? \
      Local[0] = FileRead(Handle), \
      Local[0] = StringChange(Local[0], "[token1]", Token1), \
      Local[0] = StringChange(Local[0], "[token1]", Token2), \
      SaveStringToFile(OutPath, Local[0] + NewLine, 1, 0), \
      PreprocessLanguageLines(Handle, OutPath) \
    : ""

#define PreprocessLanguage(Path) \
  Local[0] = GetEnv("TEMP") + "\" + ExtractFileName(Path), \
  SaveStringToFile(Local[0], "", 0, 0), \
  Local[1] = FileOpen(CompilerPath + "\" + Path), \
  PreprocessLanguageLines(Local[1], Local[0]), \
  FileClose(Local[1]), \
  Local[0]

但是,使用简单的函数方法,您将遇到预处理器的递归限制,因为语言文件有太多的行。它可以通过每次递归读取多行来解决,但这是一个黑客。

通过使用#sub,它应该可以工作。但这是一团乱。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64932221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档