我定义了一个变量:
#define AppVersion "5.0"在我的脚本的“messages”部分中,有很多来自Default.isl文件的标准消息。下面是一个示例:
[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}
发布于 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文件进行预处理:
#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]的所有出现替换为Token1和Token2预处理变量的值。
从理论上讲,通过使用PowerShell、FileRead、StringChange和SaveStringToFile函数,可以在预处理器中完全实现这一点,而无需调用StringChange。
#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,它应该可以工作。但这是一团乱。
https://stackoverflow.com/questions/64932221
复制相似问题