Как добавить новую страницу, используя скрипт NSIS в локальную папку, чтобы создать установщик, а не брать его из программных файлов / NSIS - PullRequest
0 голосов
/ 23 октября 2018

Я пишу файл сценария NSIS, который берет текущую локаль (в нашем случае это «английский») и генерирует установщик.

Здесь мне нужно добавить еще несколько дополнительных функций к этому.

  1. В настоящее время он берет страницы из папки NSIS (C: \ Program Files \ NSIS \ Contrib \ Modern UI 2 \ Pages)

Здесь, если я хочу добавитьмоя собственная страница к этому, как я могу это сделать?Могу ли я создать .nsh файл локально и использовать это?

В этом случае под;страницы! insertmacro ... Нужно ли нам указывать путь?

Аналогично "Языковые файлы".Например, если я хочу добавить свои собственные строки в файл English.nsh, могу ли я скопировать его в локальную папку?и однажды добавлены новые строки, как использовать в сценарии?Потому что теперь по умолчанию он берет его из C: \ Program Files \ NSIS \ Contrib \ Language files.

А также как установить конкретный язык (независимо от локали) в«Функция .onInit»

Ниже фрагмента основного кода, который я использовал:

;NSIS Modern User Interface
;Multilingual Example Script

!pragma warning error all

;--------------------------------
;Include Modern UI

  !include "MUI2.nsh"

;--------------------------------
;General

  ;Properly display all languages (Installer will not work on Windows 95, 98 or ME!)
  Unicode true

  ;Name and file
  Name "Locale Language"
  OutFile "LocaleLanguage.exe"

  ;Default installation folder
  InstallDir "$LOCALAPPDATA\LocaleLanguage"

  ;Get installation folder from registry if available
  InstallDirRegKey HKCU "Software\LocaleLanguage" ""

  ;Request application privileges for Windows Vista
  RequestExecutionLevel user

;--------------------------------
;Interface Settings

  !define MUI_ABORTWARNING

  ;Show all languages, despite user's codepage
  !define MUI_LANGDLL_ALLLANGUAGES

;--------------------------------
;Language Selection Dialog Settings

  ;Remember the installer language
  !define MUI_LANGDLL_REGISTRY_ROOT "HKCU"
  !define MUI_LANGDLL_REGISTRY_KEY "Software\LocaleLanguage"
  !define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"

;--------------------------------
;Pages

  !insertmacro MUI_PAGE_WELCOME
  !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
  !insertmacro MUI_PAGE_COMPONENTS
  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES
  !insertmacro MUI_PAGE_FINISH

  !insertmacro MUI_UNPAGE_WELCOME
  !insertmacro MUI_UNPAGE_CONFIRM
  !insertmacro MUI_UNPAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
  !insertmacro MUI_UNPAGE_COMPONENTS
  !insertmacro MUI_UNPAGE_DIRECTORY
  !insertmacro MUI_UNPAGE_INSTFILES
  !insertmacro MUI_UNPAGE_FINISH

;--------------------------------
;Languages

  !insertmacro MUI_LANGUAGE "English" ; The first language is the default language
  !insertmacro MUI_LANGUAGE "French"
  !insertmacro MUI_LANGUAGE "German"
  !insertmacro MUI_LANGUAGE "Japanese"
  !insertmacro MUI_LANGUAGE "Korean"
  !insertmacro MUI_LANGUAGE "Italian"
  !insertmacro MUI_LANGUAGE "Dutch"
  !insertmacro MUI_LANGUAGE "Danish"
  !insertmacro MUI_LANGUAGE "Greek"
  !insertmacro MUI_LANGUAGE "Russian"
  !insertmacro MUI_LANGUAGE "Portuguese"

;--------------------------------
;Reserve Files

  ;If you are using solid compression, files that are required before
  ;the actual installation should be stored first in the data block,
  ;because this will make your installer start faster.

  !insertmacro MUI_RESERVEFILE_LANGDLL

;--------------------------------
;Installer Sections

Section "Dummy Section" SecDummy

  SetOutPath "$INSTDIR"

  ;ADD YOUR OWN FILES HERE...

  ;Store installation folder
  WriteRegStr HKCU "Software\Locale Language" "" $INSTDIR

  ;Create uninstaller
  WriteUninstaller "$INSTDIR\Uninstall.exe"

SectionEnd

;--------------------------------
;Installer Functions

Function .onInit

 ; !insertmacro MUI_LANGDLL_DISPLAY

FunctionEnd

;--------------------------------
;Descriptions

  ;USE A LANGUAGE STRING IF YOU WANT YOUR DESCRIPTIONS TO BE LANGAUGE SPECIFIC

  ;Assign descriptions to sections
  !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
    !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} "A test section."
  !insertmacro MUI_FUNCTION_DESCRIPTION_END


;--------------------------------
;Uninstaller Section

Section "Uninstall"

  ;ADD YOUR OWN FILES HERE...

  Delete "$INSTDIR\Uninstall.exe"

  RMDir "$INSTDIR"

  DeleteRegKey /ifempty HKCU "Software\Locale Language"

SectionEnd

;--------------------------------
;Uninstaller Functions

Function un.onInit

  !insertmacro MUI_UNGETLANGUAGE

FunctionEnd

ОБНОВЛЕНИЕ:

Нижеэто обновленный код с использованием файлов английского и шведского языков .nsh.

!pragma warning error all

;--------------------------------
;Include Modern UI

  !include "MUI2.nsh"
  !include LogicLib.nsh
  !include nsDialogs.nsh

;--------------------------------
;General

  ;Properly display all languages (Installer will not work on Windows 95, 98 or ME!)
  Unicode true

  ;Name and file
  Name "Locale Language"
  OutFile "LocaleLanguage.exe"

  ;Default installation folder
  InstallDir "$LOCALAPPDATA\LocaleLanguage"

  ;Get installation folder from registry if available
  InstallDirRegKey HKCU "Software\LocaleLanguage" ""

  ;Request application privileges for Windows Vista
  RequestExecutionLevel user

;--------------------------------
;Interface Settings

  !define MUI_ABORTWARNING

  ;Show all languages, despite user's codepage
  !define MUI_LANGDLL_ALLLANGUAGES

;--------------------------------
;Language Selection Dialog Settings

  ;Remember the installer language
  !define MUI_LANGDLL_REGISTRY_ROOT "HKCU"
  !define MUI_LANGDLL_REGISTRY_KEY "Software\LocaleLanguage"
  !define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"

;--------------------------------
;Pages
Page Custom mycustompage
  !insertmacro MUI_PAGE_INSTFILES

  !insertmacro MUI_UNPAGE_INSTFILES

;--------------------------------
;Languages

  !insertmacro MUI_LANGUAGE "English" ; The first language is the default language
  !insertmacro MUI_LANGUAGE "Swedish"

;--------------------------------
;Reserve Files

  ;If you are using solid compression, files that are required before
  ;the actual installation should be stored first in the data block,
  ;because this will make your installer start faster.

  !insertmacro MUI_RESERVEFILE_LANGDLL

  ;Including the English and Swedish nsh files from the below path
  !include "E:\prakash\LangTesting\LanguageFiles\English.nsh"
  !include "E:\prakash\LangTesting\LanguageFiles\Swedish.nsh"

;--------------------------------
;Installer Sections

Section "Dummy Section" SecDummy

  SetOutPath "$INSTDIR"

  ;ADD YOUR OWN FILES HERE...

  ;Store installation folder
  WriteRegStr HKCU "Software\Locale Language" "" $INSTDIR

  ;Create uninstaller
  WriteUninstaller "$INSTDIR\Uninstall.exe"

SectionEnd

; To use the strings defined in English.nsh and Swedish.nsh files

!define MUI_PAGE_HEADER_TEXT "$(mypagetitle)"
!define MUI_PAGE_HEADER_SUBTEXT "$(mypagesubtitle)"
!define MUI_PAGE_DEFAULT_TEXT "$(defaulttext)"

var TextHandle


Function mycustompage
    !insertmacro MUI_HEADER_TEXT $(mypagetitle) $(mypagesubtitle)
    nsDialogs::Create 1018
    Pop $0

    ${NSD_CreateText} 0 13u 100% 12u "$(defaulttext)"
    Pop $TextHandle
    nsDialogs::Show
FunctionEnd

;--------------------------------
;Installer Functions

Function .onInit

 ; !insertmacro MUI_LANGDLL_DISPLAY
 ;$LANGUAGE
 System::Call 'KERNEL32::GetTickCount()i.r0' ; Get a "random" number
IntOp $0 $0 & 1
${If} $0 <> 0
    StrCpy $Language ${LANG_SWEDISH} ; Force Swedish
${Else}
    !insertmacro MUI_LANGDLL_DISPLAY ; Let the user choose a language
${EndIf}

FunctionEnd

;--------------------------------
;Descriptions

  ;USE A LANGUAGE STRING IF YOU WANT YOUR DESCRIPTIONS TO BE LANGAUGE SPECIFIC

  ;Assign descriptions to sections
  ;!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
   ; !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} "A test section."
  ;!insertmacro MUI_FUNCTION_DESCRIPTION_END


;--------------------------------
;Uninstaller Section



**********
**English.nsh**

;Language: English (1033)


!insertmacro LANGFILE "English" = "English" =

LangString mypagetitle ${LANG_ENGLISH} "Hello"
LangString mypagesubtitle ${LANG_ENGLISH} "World"


***********
**Swedish.nsh**

;Language: Swedish (1053)

!insertmacro LANGFILE "Swedish" = "Svenska" =

LangString mypagetitle ${LANG_SWEDISH} "Bork"
LangString mypagesubtitle ${LANG_SWEDISH} "borkbork"
LangString defaulttext ${LANG_SWEDISH} "Skriva bork bork..."
LangString defaulttext ${LANG_ENGLISH} "Type something here..."

Здесь я создал файлы English.nsh и Sweedish.nsh в своей локальной папке и включил эти файлы.А затем определили эти строки.Когда я бегу, это всегда показывает по-шведски.Это не отображается на английском языке.Пожалуйста, дайте мне знать, это правильный путь?а также какие-либо изменения требуются?Здесь я прокомментировал раздел; описания, потому что он выбрасывает некоторые ошибки.Зачем нам это; Раздел описания?

1 Ответ

0 голосов
/ 23 октября 2018

Вы никогда не должны изменять включенные NSIS .NSH файлы, обычно есть способ переопределить определенные вещи.

Вам нужно использовать один пользовательских плагинов страницы для созданияпользовательская страница:

!include MUI2.nsh
Page Custom mycustompage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English
!insertmacro MUI_LANGUAGE Swedish

LangString ^InstallBtn ${LANG_ENGLISH} "Instaaaaall" ; Override default language string
LangString mypagetitle ${LANG_ENGLISH} "Hello"
LangString mypagesubtitle ${LANG_ENGLISH} "World"
LangString defaulttext ${LANG_ENGLISH} "Type something here..."

LangString mypagetitle ${LANG_SWEDISH} "Bork"
LangString mypagesubtitle ${LANG_SWEDISH} "borkbork"
LangString defaulttext ${LANG_SWEDISH} "Skriva bork bork..."

var TextHandle

!include LogicLib.nsh    
!include nsDialogs.nsh
Function mycustompage
    !insertmacro MUI_HEADER_TEXT $(mypagetitle) $(mypagesubtitle)
    nsDialogs::Create 1018
    Pop $0

    ${NSD_CreateText} 0 13u 100% 12u "$(defaulttext)"
    Pop $TextHandle
    nsDialogs::Show
FunctionEnd

Function .onInit
System::Call 'KERNEL32::GetTickCount()i.r0' ; Get a "random" number
IntOp $0 $0 & 1
${If} $0 <> 0
    StrCpy $Language ${LANG_SWEDISH} ; Force Swedish
${Else}
    !insertmacro MUI_LANGDLL_DISPLAY ; Let the user choose a language
${EndIf}
FunctionEnd

Вы можете установить язык, указав идентификатор языка в $Language в .onInit.Существует также диалог выбора языка, который вы можете использовать.В файле readme из MUI показано, как использовать LangStrings для описания разделов ...

...