본문 바로가기
IT/개발환경

NSIS 다국어 커스텀

by rapker 2023. 4. 14.
반응형

 

NSIS Editor에서 다국어 지원 기능으로 스크립트를 만들고 테스트를 해보니 몇 가지 마음에 들지 않는 부분이 보입니다.

 

첫 번째로

nsis 기본 기능으로는 다국어 인스톨러 만들면, 기본적으로 설치할 때 언어를 묻는 창이 뜨지만

한번 설치된 후 삭제하지 않고 두번 째 설치 부터는 언어를 묻지 않구요

 

 

두 번째로

메세지 박스의 언어별 예외 처리가 자동으로 뽑히지 않았습니다.

 

세 번째

메세지 박스 제목은 다국어를 사용할 수 없음!!

 

 

다행히 NSIS 다국어의 모든 내용이 있는 샘플을 찾아 이 것들을 해결할 수 있었고 정리합니다.

참고 - 링크

근데 없어질 지도 모르니까 file로

NSIS_MultiLanguage.nsi
0.01MB

 

아니~

설치할 때는 다국어 지원 잘 해주면서 삭제할 때는 왜이리 지원이 부실하지? 라는 생각이.....


728x90

 

 

자 이제 NSIS 스크립트에서 다국어의 주요 내용을 살펴봅니다.

 

설치할 때 마다 언어 선택창을 띄워줍니다.

;Always show the language selection dialog (override the stored value)
!define MUI_LANGDLL_ALWAYSSHOW

 

설치할 때 선택한 언어를 registry에 등록할 키 (uninstall할 때 사용하기위해)

; Language Selection Dialog Settings
!define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language"

 

    지원할 언어 목록
; Language files
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Korean"

 

인스톨 시작 시 언어 선택창 출력

Function .onInit
  !insertmacro MUI_LANGDLL_DISPLAY
FunctionEnd

 

메세지 박스 제목 다국어 지원을 위해 윈도우 시스템메세지 박스 사용

!macro MsgBox out text title flags
   System::Call "user32::MessageBox(i $HWNDPARENT, t '${text}', t '${title}', i ${flags}) i.s"
   Pop ${out}
!macroend

 

언인스톨할 때 다국어 지원하기 위한 커스텀

Function un.onUninstSuccess
	HideWindow

	${Switch} $LANGUAGE 
		${Case} ${LANG_ENGLISH} 
			StrCpy $msgText "$(^Name) has been completely removed."
			StrCpy $msgTitle $(^Name)
			${Break} 
		${Case} ${LANG_KOREAN} 
			StrCpy $msgText "$(^Name)는(은) 완전히 제거되었습니다."
			StrCpy $msgTitle $(^Name)
			${Break} 
	${EndSwitch}
	
	!insertmacro MsgBox $0 $msgText $msgTitle 0x0
FunctionEnd

Function un.onInit
	!insertmacro MUI_UNGETLANGUAGE
	
	${Switch} $LANGUAGE 
		${Case} ${LANG_ENGLISH} 
			StrCpy $msgText "Are you sure you want to remove $(^Name)?"
			StrCpy $msgTitle $(^Name)
			${Break} 
		${Case} ${LANG_KOREAN} 
			StrCpy $msgText "$(^Name)을(를) 제거하시겠습니까?"
			StrCpy $msgTitle $(^Name)
			${Break} 
	${EndSwitch}
	
	!insertmacro MsgBox $0 $msgText $msgTitle 0x1
	
	${If} $0 == 1
		Goto NoAbort
	${EndIf}
	Abort
	
	NoAbort:
FunctionEnd

 

반응형

 

최종 내용

; Script generated by the HM NIS Edit Script Wizard.

; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "응용 프로그램"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "나의 회사, Inc."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\AppMainExe.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

; MUI 1.67 compatible ------
!include "MUI.nsh"

;Always show the language selection dialog (override the stored value)
!define MUI_LANGDLL_ALWAYSSHOW

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

; Language Selection Dialog Settings
!define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language"

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE "testAppLicence.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!define MUI_FINISHPAGE_RUN "$INSTDIR\AppMainExe.exe"
!insertmacro MUI_PAGE_FINISH

; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES



; Language files
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Korean"

; MUI end ------

Var msgText
Var msgTitle

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "Setup.exe"
InstallDir "$PROGRAMFILES\응용 프로그램"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show
ShowUnInstDetails show

Function .onInit
  !insertmacro MUI_LANGDLL_DISPLAY
FunctionEnd

Section "MainSection" SEC01
  SetOutPath "$INSTDIR"
  SetOverwrite ifnewer
  File "AppMainExe.exe"
  CreateDirectory "$SMPROGRAMS\응용 프로그램"
  CreateShortCut "$SMPROGRAMS\응용 프로그램\응용 프로그램.lnk" "$INSTDIR\AppMainExe.exe"
  CreateShortCut "$DESKTOP\응용 프로그램.lnk" "$INSTDIR\AppMainExe.exe"
SectionEnd

Section -AdditionalIcons
  WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
  CreateShortCut "$SMPROGRAMS\응용 프로그램\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
  CreateShortCut "$SMPROGRAMS\응용 프로그램\Uninstall.lnk" "$INSTDIR\uninst.exe"
SectionEnd

Section -Post
  WriteUninstaller "$INSTDIR\uninst.exe"
  WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\AppMainExe.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\AppMainExe.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd


!macro MsgBox out text title flags
   System::Call "user32::MessageBox(i $HWNDPARENT, t '${text}', t '${title}', i ${flags}) i.s"
   Pop ${out}
!macroend

Function un.onUninstSuccess
	HideWindow

	${Switch} $LANGUAGE 
		${Case} ${LANG_ENGLISH} 
			StrCpy $msgText "$(^Name) has been completely removed."
			StrCpy $msgTitle $(^Name)
			${Break} 
		${Case} ${LANG_KOREAN} 
			StrCpy $msgText "$(^Name)는(은) 완전히 제거되었습니다."
			StrCpy $msgTitle $(^Name)
			${Break} 
	${EndSwitch}
	
	!insertmacro MsgBox $0 $msgText $msgTitle 0x0
FunctionEnd

Function un.onInit
	!insertmacro MUI_UNGETLANGUAGE
	
	${Switch} $LANGUAGE 
		${Case} ${LANG_ENGLISH} 
			StrCpy $msgText "Are you sure you want to remove $(^Name)?"
			StrCpy $msgTitle $(^Name)
			${Break} 
		${Case} ${LANG_KOREAN} 
			StrCpy $msgText "$(^Name)을(를) 제거하시겠습니까?"
			StrCpy $msgTitle $(^Name)
			${Break} 
	${EndSwitch}
	
	!insertmacro MsgBox $0 $msgText $msgTitle 0x1
	
	${If} $0 == 1
		Goto NoAbort
	${EndIf}
	Abort
	
	NoAbort:
FunctionEnd

Section Uninstall
  Delete "$INSTDIR\${PRODUCT_NAME}.url"
  Delete "$INSTDIR\uninst.exe"
  Delete "$INSTDIR\AppMainExe.exe"

  Delete "$SMPROGRAMS\응용 프로그램\Uninstall.lnk"
  Delete "$SMPROGRAMS\응용 프로그램\Website.lnk"
  Delete "$DESKTOP\응용 프로그램.lnk"
  Delete "$SMPROGRAMS\응용 프로그램\응용 프로그램.lnk"

  RMDir "$SMPROGRAMS\응용 프로그램"
  RMDir "$INSTDIR"

  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
  SetAutoClose true
SectionEnd

 

 

Unicode 포함된 .nsi 파일 컴파일 할때는 아래와 같이 입력받는 값이 UTF8이라고 명시 해줘야 합니다.

makensis.exe /INPUTCHARSET UTF8 installscript.nsi

 

그렇지 않으면 아래와 같은 오류를 만나게 됩니다.

Processing config: C:\Program Files (x86)\NSIS\nsisconf.nsh
Processing script file: "InstallScript.nsi" (ACP)
Bad text encoding: InstallScript.nsi:506
Error in script "InstallScript.nsi" on line 506 -- aborting creation process

 

반응형
LIST

'IT > 개발환경' 카테고리의 다른 글

AD Connect (1/7) - Windows Server(2019) AD 설치  (0) 2023.04.17
AD, AAD, 복제?, 이중화?, 동기화?  (0) 2023.04.17
Docker Desktop limit  (0) 2023.04.13
Windows Docker Desktop Autorun  (0) 2023.04.13
NSIS script generator  (0) 2023.04.12