我的安装程序适合20个部分翻译。部分翻译具有大量的英文GUI,而在各自的语言中只有某些部分。为了使用安装程序实现这一点,我在物理上复制默认的英语isl文件,并将语言名称属性重命名为20种语言中的每种语言。然后,我使用安装程序脚本中的这些文件将这些语言添加到下拉列表中,供用户选择。
这意味着,对于我的自定义消息,我必须为20种语言中的每一种复制它们。目前,我正在手动执行此操作,但我想知道从现在开始是否可以使用ISPP进行管理?
因此,我们从以下自定义消息开始:
; Automatic Backup Settings Wizard Page
English.pageAutoBackupTitle=Automatic Backup
English.pageAutoBackupDescription=Configure automatic backup settings.
English.lblBackupWhat=What to backup:
English.radBackupWhatNone=Don't perform any backup when the program shuts down
English.radBackupWhatComplete=Make a complete backup when the program shuts down
English.radBackupWhatEssential=Only make an essential backup when the program shuts down
English.lblBackupMode=How to backup:
English.radBackupModeAuto=Perform automatically when the program is shut down
English.radBackupModeManual=Prompt the user when the program is shut down
English.lblPromptMode=Also prompt to backup at the following intervals while the application is running:
English.cmbPromptModeItemNever=Never prompt to backup
English.cmbPromptModeItemDaily=Prompt to backup everyday
English.cmbPromptModeItemWeekly=Prompt to backup once a week
English.cmbPromptModeItemMonthly=Prompt to backup once a month
English.lblBackupFolder=Where to backup:
English.btnButtonBrowse=Browse ...
我们希望为下列语言标识符复制它们:
我知道我不需要添加自定义消息,因为安装程序将默认为英语,但之后我会收到编译器关于缺少消息定义的警告。
发布于 2020-05-25 08:00:31
预处理器有两种机制来重复某些代码,既有优点,也有缺点。
用户定义过程
使用用户定义过程,您想要重复的代码具有更高的可读性--您基本上使用了与编写普通脚本相同的语法(即使语法突出显示在编辑器中也能使用),您只需使用{#Var}
语法注入变量部分。
重复代码的长度实际上是没有限制的。
但是导致代码重复的代码比较笨拙,因为过程不能使用参数,所以您必须通过“全局变量”传递变量部分。但是,在您的例子中,有一个参数,没有递归,这不是一个很大的限制。
#sub DefaultMessages
{#Lang}.pageAutoBackupTitle=Automatic Backup
{#Lang}.pageAutoBackupDescription=Configure automatic backup settings.
{#Lang}.lblBackupWhat=What to backup:
; ...
#endsub
#define Lang
#expr Lang = "German"
#expr DefaultMessages
#expr Lang = "French"
#expr DefaultMessages
; ...
如果愿意,可以使用顺序计算运算符(逗号)将变量赋值和过程调用放在同一行:
#define Lang
#expr Lang = "German", DefaultMessages
#expr Lang = "French", DefaultMessages
; ...
用户定义函数
用户定义函数可以接受参数,因此从编程的角度来看,它们更简洁--并且允许递归(在本例中不相关)。
但这段代码的可读性不强。并且有一个内部的预处理器堆栈限制,这使得解决方案无法扩展。
#define DefaultMessages(Lang) \
Lang + ".pageAutoBackupTitle=Automatic Backup" + NewLine + \
Lang + ".pageAutoBackupDescription=Configure automatic backup settings." + NewLine + \
Lang + ".lblBackupWhat=What to backup:" + NewLine \
; ...
#emit DefaultMessages("German")
#emit DefaultMessages("French")
; ...
另一个示例显示使用这两种方法实现相同的功能,请参见:
发布于 2020-05-26 07:29:10
我加入这个答案只是为了让用户知道一个更好的方法来解决我的情况。
我最近在Inno安装支持频道上被告知(由于我的问题是另一个问题),这是很偶然的:
它按照顺序加载
MessageFiles
,然后是脚本中的消息。最后一个赢了。 前缀值也会在脚本中赢得无前缀值。 因此,您应该将所有的English
默认值放入一个.isl文件中,该文件在特定于语言的.isl
文件之前列出。在真正的语言文件中没有指定的任何内容都将使用以前文件中的默认值。 或者,如果您不希望对自定义消息使用.isl
文件,则可以在脚本中直接指定没有前缀的English
默认值,以及直接在脚本中使用适当前缀的实际翻译,省略尚未翻译的任何内容。同样,任何缺少特定于语言的前缀值的内容都将默认为非前缀值。 如果同时执行这两种操作,那么脚本中的任何内容(前缀与否)都会覆盖.isl
文件中的任何内容。
因此,我简化了我的自定义消息文件:
[CustomMessages]
; ==================================================================
; These are the default custom messages.
; They are used by:
; - Amharic
; - Aukan
; - Cebuano
; - English
; - Filipino
; - Gujarati
; - Gun
; - HaitianCreole
; - Lingala
; - Malagasy
; - Maltese
; - Punjabi
; - Saramaccan
; - Sesotho
; - Setswana
; - Sranantongo
; - Swahili
; - Tamil
; - Tsonga
; - Twi
; - Vietnamese
; - Zulu
pageAutoBackupTitle=Automatic Backup
pageAutoBackupDescription=Configure automatic backup settings.
lblBackupWhat=What to backup:
radBackupWhatNone=Don't perform any backup when the program shuts down
radBackupWhatComplete=Make a complete backup when the program shuts down
radBackupWhatEssential=Only make an essential backup when the program shuts down
lblBackupMode=How to backup:
radBackupModeAuto=Perform automatically when the program is shut down
radBackupModeManual=Prompt the user when the program is shut down
lblPromptMode=Also prompt to backup at the following intervals while the application is running:
cmbPromptModeItemNever=Never prompt to backup
cmbPromptModeItemDaily=Prompt to backup everyday
cmbPromptModeItemWeekly=Prompt to backup once a week
cmbPromptModeItemMonthly=Prompt to backup once a month
lblBackupFolder=Where to backup:
所有语言前缀翻译都在同一个文件中。使用这种方法,我实际上并不需要使用#sub
/ #endsub
机制。
https://stackoverflow.com/questions/61991526
复制相似问题