2016-08-10 3 views
0

주로 NSIS 2.51에서 NSIS 3.0으로 업그레이드되었습니다. 주로 새 버전 supports Windows 10이 사용되었습니다.NSIS 3.0으로 컴파일 할 때 LANG_ENGLISH가 정의되지 않았습니다.

제 설치 프로그램의 경우 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}"언어 ID 1033을 사용하여 유효한 언어 ID하지 않습니다! [...]

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 줄을 추가하는 경우

MUI_LANGUAGE가 MUI_ [UN] PAGE_ * 매크로 다음에 삽입해야

[...]

: 심지어 !insertmacro MUI_PAGE_WELCOME 전에, 나는 또한 다음과 같은 경고를 얻을 수 0

답변

3

경고는 NSIS 3에서 새로 추가되었지만 컴파일러 동작은 변경되지 않았으며 LANG_ENGLISH는 NSIS 2의 해당 시점에서 정의되지 않았습니다.

경고는 당신에게 무슨 일이 일어나고 있는지에 대한 힌트를 제공합니다 : 컴파일러가 당신의 LangString 문에 도달 할 때 아직 정의되지 않은 LANG_ENGLISH을 컴파일러는 숫자로 문자열 ${LANG_ENGLISH} 변환을 시도하고 실패하고 번호 변환 기능 있도록 LangString에 대한 문서를 보면 언어 ID로 0을 전달하면 마지막으로 사용한 /로드 된 언어가 사용된다는 것을 알 수 있습니다. 이 시점에서 언어가로드되지 않은 경우 기본 언어가 영어로 남아 있습니다.

LANG_xyz 정의는 xyz.nlf를로드 할 때 LoadLanguageFile 명령어를 사용할 때 작성됩니다. MUI는 MUI_LANGUAGE 매크로 내부 LoadLanguageFile를 호출 그래서 당신의 해결책은 매크로 MUI_LANGUAGE 아래 LangString 문으로 이동하는 것입니다 :

!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 
+0

감사합니다, Anders. 나는 MUI'insertmacro' 라인,'LangString' 라인, 그리고 페이지 기능을 섞어 놓았다. 나는 당신이 말한대로 모든 것을 재정비하고 경고가 사라졌습니다. 그리고 스크립트는 여전히 작동하고 있습니다;) – honk

+0

순서는 정말 엄격하지 않습니다. 함수는 MUI.Hsh를 따라와 MUI_HEADER_TEXT가 존재하고 LangString은 MUI_LANGUAGE 뒤에 $ {LANG_XYZ}을 사용합니다 ... – Anders

+0

이 나타납니다. 내 주요 문제는 세 개의 사용자 정의 페이지가 있고 페이지에 속한 모든 명령을 그룹화했다는 것입니다. – honk

1

언어 문자열을 정의하기 전에 매크로를 삽입해야합니다. 언어 정의 앞에 그리고 매크로를 사용하기 전에 매크로를 삽입하십시오.

!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의 모든 다르지 않다 - 어쩌면 새로운이다 경고입니다.

+0

난 당신이 제안하는 명령 순서를 변경하려고합니다. 'MUI_ [UN] PAGE_ * macros' 뒤에는 MUI_LANGUAGE가 삽입되어야하기 때문에 모든 명령의 순서에 대한 오해가 있습니다. 나는 MUI 정의를 해당 페이지 함수 바로 앞에 놓았으므로, 다음에'MUI_LANGUAGE' 라인이 오기 전에 그것들을 함께 움직이려고 할 것이다. – honk