AlekseyPopovv,
Разница между с MUI и без MUI в том, что
с MUI пишется
Код:
![Выделить весь код](images/misc/selectcode.png)
!insertmacro MUI_LANGUAGE "Russian"
без MUI пишется
Код:
![Выделить весь код](images/misc/selectcode.png)
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf"
Дальше всё одинаково.
Кроме того локалицацию проще и правильнее прописывать так:
Код:
![Выделить весь код](images/misc/selectcode.png)
; Подключение языковый файлов
; English должен быть первый, т.к. если в списке подключённых языков отсутствует язык системы, то грузится первый по списку
LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf"
; Объявление многоязычной строки:
LangString AlreadyRunningMessage ${LANG_ENGLISH} "The "${APP}" is already running!"
LangString AlreadyRunningMessage ${LANG_RUSSIAN} "Программа "${APP}" уже запущена!"
...
; Использование многоязычной строки:
MessageBox MB_USERICON|MB_OK $(AlreadyRunningMessage)
Abort
Если программа уже запущена, то вместо сообщения с прерыванием запуска можно активировать уже запущенный установщик
Пример
Код:
![Выделить весь код](images/misc/selectcode.png)
!include SingleInstance.nsh
RequestExecutionLevel user
Page instfiles
UninstPage uninstConfirm
Section
DetailPrint A
Sleep 1000
DetailPrint B
Sleep 1000
DetailPrint C
Sleep 1000
DetailPrint D
Sleep 1000
SectionEnd
Section un.
SectionEnd
Function .onInit
${IfThen} ${AlreadyRunning} ${|} ${ActivateAlreadyRunningAndAbort} ${|}
WriteUninstaller $EXEDIR\un1.exe
FunctionEnd
Function un.onInit
${IfThen} ${AlreadyRunning} ${|} ${ActivateAlreadyRunningAndAbort} ${|}
FunctionEnd
SingleInstance.nsh
Код:
![Выделить весь код](images/misc/selectcode.png)
/*
Based on `Allow only one installer instance` example (https://nsis.sourceforge.io/Allow_only_one_installer_instance)
Usage example:
; Define unique mutex name (optional)
!define INSTALLERMUTEXNAME "myVeryUniqueInstallerMutexName"
!define UNINSTALLERMUTEXNAME "myVeryUniqueUninstallerMutexName"
${IfThen} ${AlreadyRunning} ${|} ${ActivateAlreadyRunningAndAbort} ${|}
${If} ${AlreadyRunning}
.. instructions before activate ..
${ActivateAlreadyRunning}
.. instructions after activate ..
Abort
${EndIf}
*/
!ifndef SingleInstance.nsh
!define SingleInstance.nsh
!include LogicLib.nsh
!include WinMessages.nsh
!include Win\WinError.nsh
!include Win\WinUser.nsh
!define AlreadyRunning `"" AlreadyRunning ""`
!macro _AlreadyRunning _a _b _t _f
!insertmacro _LOGICLIB_TEMP
!ifdef __UNINSTALL__
!define /ifndef UNINSTALLERMUTEXNAME '$(^Name)$(^UninstallCaption) Mutex'
!define /redef CHECKALREADYEXISTINGMUTEXNAME '${UNINSTALLERMUTEXNAME}'
!else
!define /ifndef INSTALLERMUTEXNAME '$(^Name)$(^SetupCaption) Mutex'
!define /redef CHECKALREADYEXISTINGMUTEXNAME '${INSTALLERMUTEXNAME}'
!endif
System::Call 'kernel32::CreateMutex(p 0, i 1, t "${CHECKALREADYEXISTINGMUTEXNAME}") ?e'
Pop $_LOGICLIB_TEMP
IntCmpU $_LOGICLIB_TEMP ${ERROR_ALREADY_EXISTS} `${_t}` `${_f}` `${_f}`
!macroend
!define ActivateAlreadyRunning `!insertmacro ActivateAlreadyRunning`
!macro ActivateAlreadyRunning
Push $0 ; Window handle
Push $1 ; Caption we are looking for
Push $2 ; Caption length
Push $3 ; GetWindowText output
StrCpy $0 '' ; Start FindWindow with NULL
!ifdef __UNINSTALL__
StrCpy $1 '$(^UninstallCaption)'
!else
StrCpy $1 '$(^SetupCaption)'
!endif
StrLen $2 $1
IntOp $2 $2 + 1 ; GetWindowText count includes \0
; loop:
FindWindow $0 '#32770' '' '' $0
StrCmp $0 0 +5 ; windownotfound: next
System::Call 'user32::GetWindowText(p r0, t.r3, i r2)'
StrCmp $3 $1 0 -3 ; windowfound: loop:
; windowfound:
SendMessage $0 ${WM_SYSCOMMAND} ${SC_RESTORE} 0 /TIMEOUT=2000 ; Restore the window if it is minimized
System::Call 'user32::SetForegroundWindow(p r0)'
; windownotfound:
Pop $3
Pop $2
Pop $1
Pop $0
!macroend
!define ActivateAlreadyRunningAndAbort `!insertmacro ActivateAlreadyRunningAndAbort`
!macro ActivateAlreadyRunningAndAbort
${ActivateAlreadyRunning}
Abort
!macroend
!endif