簡體   English   中英

使用 NSIS 3.0 編譯時未為 MUI 定義 LANG_ENGLISH

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM