使用NSIS 3.0编译时,MUI的LANG_ENGLISH未定义

hon*_*onk 4 windows nsis mui

我刚刚从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)
    [...]
Run Code Online (Sandbox Code Playgroud)

在安装脚本的结尾,我还添加了以下行:

!insertmacro MUI_LANGUAGE "English"
Run Code Online (Sandbox Code Playgroud)

在Windows 7上,使用NSIS 2.51(及更低版本)时,它将在没有任何警告的情况下进行编译。但是,使用NSIS 3.0进行编译时,对于每LangString行我都会收到以下警告:

使用语言ID 1033,“ $ {LANG_ENGLISH}”不是有效的语言ID![...]

LANG_ENGLISH使用NSIS 3.0时似乎不再定义。我可以通过在安装脚本中添加以下行来消除警告:

!define LANG_ENGLISH 1033
Run Code Online (Sandbox Code Playgroud)

但是,对于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"
Run Code Online (Sandbox Code Playgroud)

我知道,MUI_LANGUAGE脚本末尾的行看起来很奇怪。但是,我不能将该行放在脚本的前面,因为这样我会收到以下警告:

在MUI_LANGUAGE之后插入了MUI_PAGE_ * [...]

如果我把MUI_LANGUAGE行放在甚至前面!insertmacro MUI_PAGE_WELCOME,那么我还会收到以下警告:

MUI_LANGUAGE应该在MUI_ [UN] PAGE_ *宏之后插入[...]

And*_*ers 5

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

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

LANG_xyz定义是在LoadLanguageFile使用指令加载xyz.nlf时由该指令创建的。MUI LoadLanguageFile在其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
Run Code Online (Sandbox Code Playgroud)