반응형
NSIS Editor에서 다국어 지원 기능으로 스크립트를 만들고 테스트를 해보니 몇 가지 마음에 들지 않는 부분이 보입니다.
첫 번째로
nsis 기본 기능으로는 다국어 인스톨러 만들면, 기본적으로 설치할 때 언어를 묻는 창이 뜨지만
한번 설치된 후 삭제하지 않고 두번 째 설치 부터는 언어를 묻지 않구요
두 번째로
메세지 박스의 언어별 예외 처리가 자동으로 뽑히지 않았습니다.
세 번째
메세지 박스 제목은 다국어를 사용할 수 없음!!
다행히 NSIS 다국어의 모든 내용이 있는 샘플을 찾아 이 것들을 해결할 수 있었고 정리합니다.
참고 - 링크
근데 없어질 지도 모르니까 file로
아니~
설치할 때는 다국어 지원 잘 해주면서 삭제할 때는 왜이리 지원이 부실하지? 라는 생각이.....
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 |