Inno Setup Preprocessor 能否用于构建一组重复的自定义消息?
Can Inno Setup Preprocessor be used to build a duplicated set of custom messages?
我的安装程序支持 20 个部分 翻译。部分翻译具有英语的大部分 GUI 和各自语言的某些部分。为了通过安装程序实现这一点,我复制了默认的英语 isl 文件并将语言名称 属性 重命名为二十种语言中的每一种。然后我在安装程序脚本中使用这些文件将这些语言添加到下拉列表中供用户选择。
这意味着对于我的自定义消息,我必须为 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 ...
我们想为以下语言标识符复制它们:
- 阿姆哈拉语
- 奥坎
- 宿雾语
- 菲律宾语
- 古吉拉特语
- 枪
- 海地克里奥尔语
- 林加拉语
- 马达加斯加
- 马耳他语
- 旁遮普语
- 萨拉马坎
- 塞索托语
- 塞茨瓦纳
- 斯拉南通戈
- 斯瓦希里语
- 泰米尔语
- 特松加
- 双胞胎
- 祖鲁语
我知道我不需要添加自定义消息,因为安装程序默认为英语,但随后我收到了关于缺少消息定义的编译器警告。
预处理器有两种机制如何重复一些代码,各有优缺点。
用户定义的程序
使用 User defined procedures,您想要重复的代码更具可读性——您基本上使用与编写普通脚本相同的语法(甚至语法高亮显示在编辑器中也有效),您只需使用 {#Var}
语法来注入变量部分。
重复代码的长度几乎没有限制。
但是导致代码重复的代码比较笨拙,因为过程不能带参数,所以你必须通过"global variables"传递变量部分。但是在你的情况下,只有一个参数并且没有递归,这不是一个很大的限制。
#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
; ...
用户自定义函数
User defined functions 可以接受参数,因此从编程的角度来看,它们更简洁——并且允许递归(在这种情况下不相关)。
但是代码可读性不是很好。并且存在内部预处理器堆栈限制,这使得解决方案不可扩展。
#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")
; ...
另一个示例显示了使用这两种方法实现相同的功能,请参阅:
我添加这个答案只是为了让用户知道我的情况有更好的方法。
我最近在 Inno Setup Support 频道被告知(很偶然,因为我的问题是不同的):
It loads the MessageFiles
in order, followed by the messages in the
script. Last one wins.
And prefixed values win over un-prefixed values within the script as
well.
So you should put all your English
defaults into an .isl file that is
listed before the language-specific .isl
file. Anything not specified
in the real language file will use the defaults from the previous
files.
Or alternatively if you do not want to use .isl
files for your custom
messages, then you can specify your English
defaults without prefix
and your actual translations with the appropriate prefix directly in
your script, omitting anything not yet translated. Again, anything
that's missing a language-specific-prefixed value will default back
to the un-prefixed value.
If you do both things, then anything in the script (prefixed or not)
will always override anything in the .isl
files.
所以我简化了自定义消息文件:
[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
机制。
我的安装程序支持 20 个部分 翻译。部分翻译具有英语的大部分 GUI 和各自语言的某些部分。为了通过安装程序实现这一点,我复制了默认的英语 isl 文件并将语言名称 属性 重命名为二十种语言中的每一种。然后我在安装程序脚本中使用这些文件将这些语言添加到下拉列表中供用户选择。
这意味着对于我的自定义消息,我必须为 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 ...
我们想为以下语言标识符复制它们:
- 阿姆哈拉语
- 奥坎
- 宿雾语
- 菲律宾语
- 古吉拉特语
- 枪
- 海地克里奥尔语
- 林加拉语
- 马达加斯加
- 马耳他语
- 旁遮普语
- 萨拉马坎
- 塞索托语
- 塞茨瓦纳
- 斯拉南通戈
- 斯瓦希里语
- 泰米尔语
- 特松加
- 双胞胎
- 祖鲁语
我知道我不需要添加自定义消息,因为安装程序默认为英语,但随后我收到了关于缺少消息定义的编译器警告。
预处理器有两种机制如何重复一些代码,各有优缺点。
用户定义的程序
使用 User defined procedures,您想要重复的代码更具可读性——您基本上使用与编写普通脚本相同的语法(甚至语法高亮显示在编辑器中也有效),您只需使用 {#Var}
语法来注入变量部分。
重复代码的长度几乎没有限制。
但是导致代码重复的代码比较笨拙,因为过程不能带参数,所以你必须通过"global variables"传递变量部分。但是在你的情况下,只有一个参数并且没有递归,这不是一个很大的限制。
#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
; ...
用户自定义函数
User defined functions 可以接受参数,因此从编程的角度来看,它们更简洁——并且允许递归(在这种情况下不相关)。
但是代码可读性不是很好。并且存在内部预处理器堆栈限制,这使得解决方案不可扩展。
#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")
; ...
另一个示例显示了使用这两种方法实现相同的功能,请参阅:
我添加这个答案只是为了让用户知道我的情况有更好的方法。
我最近在 Inno Setup Support 频道被告知(很偶然,因为我的问题是不同的):
It loads the
MessageFiles
in order, followed by the messages in the script. Last one wins.And prefixed values win over un-prefixed values within the script as well.
So you should put all your
English
defaults into an .isl file that is listed before the language-specific.isl
file. Anything not specified in the real language file will use the defaults from the previous files.Or alternatively if you do not want to use
.isl
files for your custom messages, then you can specify yourEnglish
defaults without prefix and your actual translations with the appropriate prefix directly in your script, omitting anything not yet translated. Again, anything that's missing a language-specific-prefixed value will default back to the un-prefixed value.If you do both things, then anything in the script (prefixed or not) will always override anything in the
.isl
files.
所以我简化了自定义消息文件:
[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
机制。