首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Inno安装语言文件(isl)中的完全预处理器支持

Inno安装语言文件(isl)中的完全预处理器支持
EN

Stack Overflow用户
提问于 2020-11-23 11:39:23
回答 1查看 223关注 0票数 1

我在安装程序中使用三种语言,目前我正在脚本中执行所有重写操作。下面是一个例子:

代码语言:javascript
复制
[Messages]
en.SetupWindowTitle=Setup - %1 {#AppVersion}
ru.SetupWindowTitle=Установка - %1 {#AppVersion}
ua.SetupWindowTitle=Встановлення - %1 {#AppVersion}
en.SetupAppRunningError=Setup has detected that {#SetupSetting('VersionInfoOriginalFileName')} is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit.
ru.SetupAppRunningError=Обнаружен запущенный экземпляр {#SetupSetting('VersionInfoOriginalFileName')}.%n%nПожалуйста, закройте все экземпляры приложения, затем нажмите «OK», чтобы продолжить, или «Отмена», чтобы выйти.
ua.SetupAppRunningError=Виявлено запущений екземпляр {#SetupSetting('VersionInfoOriginalFileName')}.%n%nБудь ласка, закрийте всі копії програми та натисніть «OK» для продовження, або «Скасувати» для виходу.
[CustomMessages]
en.AppRunningError=Setup has detected that {#AppExeName} is currently running.%n%nPlease, close the {#AppExeName} application, then click «OK» to continue or «Cancel» to exit. 
ru.AppRunningError=В памяти находится {#AppExeName}.%n%nЗавершите работу {#AppExeName} и нажмите «OK», чтобы продолжить, или «Отмена», чтобы выйти. 
ua.AppRunningError=В пам'яті знаходиться {#AppExeName}.%n%nЗавершіть роботу {#AppExeName} та натисніть «OK» для продовження, або «Скасувати» для виходу. 

我在脚本中覆盖了很多消息。我想知道,在考虑到我使用的预处理器指令( .isl )的情况下,向{#...}文件传输所有这些重写的最有效方法是什么。我可以使用FmtMessage(...),但这意味着我必须对每一条消息都包含FmtMessage(...)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-23 12:17:29

首先检查一下,是否有一些较小的侵入性解决方案可能无法满足您的需求:

Can I use .isl files for the messages with preprocessor directives in Inno Setup?

如果您想在.isl文件中获得完整的预处理器支持,可以通过实际的Inno设置预处理器传递它们:

  • 用所有变量定义(和一些支持代码)计算出公共包含文件(defines.iss):

//定义#定义AppVersion "1.2.3“//更多定义. //支持代码#定义PreprocessedTranslationFile GetEnv("TEMP") + "\lang.isl”#定义SavePreprocessedTranslation() SavePreprocessedTranslation()

  • 在您的.iss和所有..isl的开头包含该文件:

#包括"defines.iss"

  • 在所有..isl的末尾调用SavePreprocessedTranslation

#expr SavePreprocessedTranslation()

  • 使预处理程序对修改后的.isl文件调用iscc。当然会失败,因为.isl不是有效的.iss,但是iscc的预处理部分应该完成并创建预处理的.isl文件。

# DebugPreprocessLanguage 0#定义PreprocessLanguage(路径)\ Local = "C:\Program (x86)\Inno Setup 6\ISCC.exe",\ DeleteFileNow(PreprocessedTranslationFile),\ Local1 = DebugPreprocessLanguage?SourcePath + "\islpreprocess.log“:"nul",\ Local2 = "/C”+Local+“+ Path +”+ ">>“+”Local1 +“”2>&1“,\ Exec("cmd",Local2,SourcePath,SW_HIDE),\ (FileExists(PreprocessedTranslationFile) x x\\Path+”未能预处理“),\ Local3 = GetEnv("TEMP") + "\“+ExtractFileName(路径),\ CopyFile(PreprocessedTranslationFile,Local3),\ DeleteFileNow(PreprocessedTranslationFile),\ Local3

  • 并在[Languages]部分中使用预处理的.isl文件。

语言名称:"en";MessagesFile:{#PreprocessLanguage("Default.isl")}名称:"nl";MessagesFile:

如果有问题,请将DebugPreprocessLanguage设置为1以查看.isl预处理器输出。

您甚至可以通过让预处理程序在调用..isl之前将#include "defines.iss"#expr SavePreprocessedTranslation()自动添加到..isl中来改进这个过程。

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

https://stackoverflow.com/questions/64967700

复制
相关文章

相似问题

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