【问题标题】:How to add the new page using NSIS script in the local folder to create the installer instead of taking it from program files /NSIS如何使用本地文件夹中的 NSIS 脚本添加新页面以创建安装程序,而不是从程序文件 /NSIS 中获取它
【发布时间】:2019-03-27 13:43:25
【问题描述】:

我编写了 NSIS 脚本文件,它采用当前语言环境(在我们的例子中是“英语”)并生成安装程序。

在这里,我需要添加一些额外的功能。

  1. 目前它正在从 NSIS 文件夹 (C:\Program Files\NSIS\Contrib\Modern UI 2\Pages) 中获取页面

如果我想在这里添加我自己的页面,我该怎么做?我可以在本地创建 .nsh 文件并使用它吗?

在这种情况下 ;页面 !insertmacro ... 我们需要给出路径吗?

  1. 与“语言文件”类似。例如,如果我想将自己的字符串添加到 English.nsh 文件中,我可以将其复制到本地文件夹吗?并且一旦添加了新字符串如何在脚本中使用?因为现在默认情况下它是从 C:\Program Files\NSIS\Contrib\Language 文件中获取的。

  2. 以及如何在“Function .onInit”中设置特定语言(不考虑语言环境)

在我用过的基本代码sn-p下面:

;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 和 Swedish.nsh 文件,并包含了这些文件。然后定义那些字符串。当我跑步时,它总是以“瑞典语”显示。它没有以英语显示。请让我知道这是正确的方法吗?还需要任何更改吗?在这里,我评论了 ;Descriptions 部分,因为它引发了一些错误。为什么我们需要这个;描述部分?

【问题讨论】:

    标签: nsis


    【解决方案1】:

    你不应该修改 NSIS 包含的 .NSH 文件,通常有一种方法可以覆盖特定的东西。

    需要使用one的自定义页面插件来创建自定义页面:

    !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
    

    您可以通过在.onInit 中将语言ID 写入$Language 来设置语言。您还可以使用语言选择对话框。 MUI 自述文件向您展示了如何使用 LangStrings 进行部分描述...

    【讨论】:

    • 嗨 Anders,我们可以为英语和瑞典语字符串使用单独的 .nsh 文件吗?默认情况下,可以根据语言环境选择合适的文件吗?是的,我看过与语言选择对话框相关的示例。但根据我的要求,没有从对话框中选择语言的选项。直接基于系统区域设置(语言),它应该显示该特定语言。
    • 1) 是的,如果您愿意,您可以为不同的语言使用不同的 .nsh 文件(!包括只是将内容“粘贴”到您的 .nsi 中)。理想情况下,您应该将它们保存为带有 BOM 的 UTF-8。 2) NSIS 已经尝试在 .onInit (GetUserDefaultUILanguage) 之前选择正确的语言。
    • 嗨,Anders,我根据您的建议更新了我的代码(在原帖的更新部分中添加),还为英语和瑞典语添加了单独的 .nsh 文件。当我运行时,它总是以瑞典语显示。我也不确定我的更改是否正确。请提出建议。
    • 从 .onInit 中删除代码,它可以强制瑞典语。如果您希望 NSIS 选择最佳语言,请从 .onInit 中删除所有代码。
    • 好的,如果我从 .OnInit 中删除代码,我可以使用 System::Call 'kernel32::GetUserDefaultUILanguage() i.r10' 来获取默认的系统语言环境吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    相关资源
    最近更新 更多