![](/img/trans.png)
[英]NSIS MUI_WELCOMEFINISHPAGE_BITMAP not shown on Windows 10
[英]LANG_ENGLISH undefined for MUI when compiling with NSIS 3.0
我剛剛從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_* 宏之后 [...]
該警告是 NSIS 3 中的新警告,但編譯器行為未更改,此時 NSIS 2 中也未定義 LANG_ENGLISH。
該警告為您提供了有關正在發生的事情的提示:當編譯器到達您的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
需要在定義任何語言字符串之前插入宏。 在語言定義之前和使用它們之前插入宏。
!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 中並沒有什么不同——也許這是新的警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.