我刚从NSIS 2.51升级到NSIS 3.0,主要是因为新版本支持 Windows 10。
对于我的安装程序,我使用的是现代用户界面 (MUI)。我使用了一些自定义页面。根据文档,我正在使用MUI_HEADER_TEXT
宏在我的自定义页面函数中设置页眉上的文本,例如:
[...]
Page custom InstallType
LangString PAGE_INSTALL_TYPE_TITLE ${LANG_ENGLISH} "Installation Type"
LangString PAGE_INSTALL_TYPE_SUBTITLE ${LANG_ENGLISH} "Choose installation type."
Function InstallType
!insertmacro MUI_HEADER_TEXT $(PAGE_INSTALL_TYPE_TITLE) $(PAGE_INSTALL_TYPE_SUBTITLE)
[...]
在我的安装程序脚本的末尾,我还添加了以下行:
!insertmacro MUI_LANGUAGE "English"
在 Windows 7 上,当使用 NSIS 2.51(及更低版本)时,编译时没有任何警告。但是,在使用 NSIS 3.0 进行编译时,我收到每一LangString
行的以下警告:
"${LANG_ENGLISH}" 不是有效的语言 id,使用语言 id 1033![...]
使用 NSIS 3.0 时似乎LANG_ENGLISH
不再定义。我可以通过在我的安装程序脚本中添加以下行来消除警告:
!define LANG_ENGLISH 1033
但是我应该怎么做才能以正确的方式为 NSIS 3.0 解决这个问题?
包含 4 个页面(2 个自定义页面)的最小、完整且可验证的示例:
!include "MUI2.nsh"
; Page 1.
!insertmacro MUI_PAGE_WELCOME
; Page 2.
Page custom InstallType
LangString PAGE_INSTALL_TYPE_TITLE ${LANG_ENGLISH} "Installation Type"
LangString PAGE_INSTALL_TYPE_SUBTITLE ${LANG_ENGLISH} "Choose installation type."
Function InstallType
!insertmacro MUI_HEADER_TEXT $(PAGE_INSTALL_TYPE_TITLE) $(PAGE_INSTALL_TYPE_SUBTITLE)
nsDialogs::Create /NOUNLOAD 1018
Pop $0
${If} $0 == error
Abort
${EndIf}
${NSD_CreateLabel} 0 4u 100% 12u "Custom page one"
Pop $0
nsDialogs::Show
FunctionEnd
; Page 3.
Page custom InstallVersion
LangString PAGE_VERSION_TITLE ${LANG_ENGLISH} "Version"
LangString PAGE_VERSION_SUBTITLE ${LANG_ENGLISH} "Choose version."
Function InstallVersion
!insertmacro MUI_HEADER_TEXT $(PAGE_VERSION_TITLE) $(PAGE_VERSION_SUBTITLE)
nsDialogs::Create /NOUNLOAD 1018
Pop $0
${If} $0 == error
Abort
${EndIf}
${NSD_CreateLabel} 0 4u 100% 12u "Custom page two"
Pop $0
nsDialogs::Show
FunctionEnd
; Page 4.
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
我知道,MUI_LANGUAGE
脚本末尾的那行看起来很奇怪。但是,我不能更早地将该行放入脚本中,因为我收到以下警告:
MUI_PAGE_* 在 MUI_LANGUAGE [...] 之后插入
如果我把这MUI_LANGUAGE
条线放在之前!insertmacro MUI_PAGE_WELCOME
,那么我也会收到以下警告:
MUI_LANGUAGE 应该插入 MUI_[UN]PAGE_* 宏 [...]