6

我刚从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_* 宏 [...]

4

2 回答 2

8

该警告在 NSIS 3 中是新的,但编译器行为没有改变,LANG_ENGLISH 也没有在 NSIS 2 中定义。

该警告会提示您正在发生的事情:当编译器到达您的LangString语句时 LANG_ENGLISH 尚未定义,因此编译器尝试将字符串转换${LANG_ENGLISH}为数字并且失败并且数字转换函数返回 0。如果您查看在您的文档中LangString看到,如果您将 0 作为语言 id 传递,它将使用最后使用/加载的语言。如果此时没有加载任何语言,则保留默认语言,即英语。

LANG_xyz 定义是由LoadLanguageFile指令在您使用它加载 xyz.nlf 时创建的。MUILoadLanguageFile在其MUI_LANGUAGE宏内部调用,因此您的解决方案只需将LangString语句移动到MUI_LANGUAGE宏下方:

!include MUI2.nsh

Page Custom MyPageCreate
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

LangString PAGE_INSTALL_TYPE_TITLE ${LANG_ENGLISH} "Installation Type"
LangString PAGE_INSTALL_TYPE_SUBTITLE ${LANG_ENGLISH} "Choose installation type."

Function MyPageCreate
!insertmacro MUI_HEADER_TEXT $(PAGE_INSTALL_TYPE_TITLE) $(PAGE_INSTALL_TYPE_SUBTITLE)
nsDialogs::Create 1018
Pop $0
${If} $0 == error
    Abort
${EndIf}
${NSD_CreateLabel} 0 0 100% 12u "Hello world!"
Pop $0
nsDialogs::Show
FunctionEnd
于 2016-08-12T18:18:01.760 回答
2

在定义任何语言字符串之前,需要插入宏。在您的语言定义之前和使用它们之前插入宏。

!insertmacro MUI_LANGUAGE "English"

LangString PAGE_INSTALL_TYPE_TITLE ${LANG_ENGLISH} "Installation Type"
LangString PAGE_INSTALL_TYPE_SUBTITLE ${LANG_ENGLISH} "Choose installation type."

据我记得,这在 NSIS 2 中没有任何不同——也许它是新的警告

于 2016-08-11T11:17:14.527 回答