gpt4 book ai didi

windows - 使用 NSIS 3.0 编译时 MUI 未定义 LANG_ENGLISH

转载 作者:可可西里 更新时间:2023-11-01 13:55:41 26 4
gpt4 key购买 nike

我刚从 NSIS 2.51 升级至 NSIS 3.0 ,主要是因为新版本supports Windows 10 .

对于我的安装程序,我使用的是 Modern User Interface (MUI) .我使用一些自定义页面。根据documentation ,我正在使用 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}" is not a valid language id, using language 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_* inserted after MUI_LANGUAGE [...]

如果我将 MUI_LANGUAGE 行放在 !insertmacro MUI_PAGE_WELCOME 之前,那么我还会收到以下警告:

MUI_LANGUAGE should be inserted after the MUI_[UN]PAGE_* macros [...]

最佳答案

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

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

LANG_xyz 定义由 LoadLanguageFile 指令创建,当您使用它来加载 xyz.nlf 时。 MUI 在其 MUI_LANGUAGE 宏中调用 LoadLanguageFile,因此您的解决方案只是将 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

关于windows - 使用 NSIS 3.0 编译时 MUI 未定义 LANG_ENGLISH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38879124/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com