chore(installer): Windows 安装包打包工具(Inno Setup)

- build_installer.ps1 一键打包:stage→windeployqt补Qt运行时(绕过ADS卡死)→VC运行时→ISCC
- geopro.iss:中文/英文向导,Program Files安装,自动装vc_redist,快捷方式,卸载
- lang/ChineseSimplified.isl 向导简体中文语言包
- .gitignore 排除 installer 生成物(staging/dist/redist)
This commit is contained in:
gaozheng 2026-06-18 20:28:57 +08:00
parent b97ea68109
commit 05041299fa
5 changed files with 734 additions and 0 deletions

5
.gitignore vendored
View File

@ -47,3 +47,8 @@ docs/_validate/
# ---- Large redundant archive (sample data kept unpacked in folder) ----
docs/剖面网格数据的色阶数据2等文件.tar
# ---- Installer build artifacts (生成物,见 installer/README.md) ----
/installer/staging/
/installer/dist/
/installer/redist/

66
installer/README.md Normal file
View File

@ -0,0 +1,66 @@
# Geopro Windows 安装包
把已构建的 `geopro_desktop` 打包成单个 Inno Setup 安装程序(带安装向导、开始菜单/桌面快捷方式、卸载程序,并自动安装 VC++ 运行时)。
## 一键打包
```powershell
# 1) 先构建 Release若尚未构建
build.bat app
# 2) 打包(默认版本 3.0.0,文件名带当天日期)
powershell -ExecutionPolicy Bypass -File installer\build_installer.ps1
```
产物:`installer\dist\Geopro_Setup_<版本>-<yyyyMMdd>.exe`
### 常用参数
| 参数 | 说明 |
|------|------|
| `-Version 3.1.0` | 指定版本号(最终文件名 `Geopro_Setup_3.1.0-<日期>.exe` |
| `-Rebuild` | 打包前先 `build.bat rebuild` 干净重编 |
| `-QtPrefix D:/Qt/6.11.1/msvc2022_64` | 指定 Qt 路径(默认从 `CMakePresets.json` 解析) |
| `-SkipDeploy` | 跳过 windeployqt不推荐仅 staging 已补齐时用) |
## 打包流程build_installer.ps1 做了什么)
1. **stage** — 把 `build/release/src/app` 复制到 `installer/staging`,剔除构建产物
`CMakeFiles/`、`*_autogen/`、`*.pdb`、`*.log`、`*.cmake`)。
2. **windeployqt** — 在 staging 上补齐 Qt 运行时缺件:`D3Dcompiler_47.dll`、`opengl32sw.dll`
(软件 OpenGL 回退、WebEngine QML、各类插件。
> 自动绕过已知坑:`qt6advanceddocking.dll` 名字带 `qt6` 前缀会被 windeployqt 误判为 Qt 模块、
> 去 `Qt\bin` 找它而报错中止——脚本临时把它拷进 `Qt\bin`,跑完即删。
3. **redist** — 确保 `vc_redist.x64.exe` 就位(缺则从本机 Visual Studio 复制)。
4. **ISCC** — 调用 Inno Setup 编译 `geopro.iss`LZMA2/max 固实压缩,输出到 `dist/`
## 安装包行为
- 默认装入 `C:\Program Files\Geopro`(需管理员权限)。
- 仅在系统**未安装** VC++ 2015-2022 x64 运行时时,静默安装 `vc_redist.x64.exe`
- 创建开始菜单项;桌面快捷方式为可选项(默认不勾)。
- 程序日志/配置写入 `%LOCALAPPDATA%\Geomative\Geopro3`,与安装目录解耦。
- 向导支持简体中文 / 英文。
## 前置依赖(打包机)
| 工具 | 获取方式 |
|------|----------|
| Inno Setup 6 | `winget install --id JRSoftware.InnoSetup -e` |
| Qt 6.11.1 (msvc2022_64) | 含 `windeployqt.exe`,已是构建依赖 |
| Visual Studio 2022/2026 (C++) | 提供 `vc_redist.x64.exe`,已是构建依赖 |
## 仓库内/生成物
入库(打包工具本体):
- `geopro.iss` — Inno Setup 脚本
- `build_installer.ps1` — 一键打包工具
- `lang/ChineseSimplified.isl` — 向导简体中文语言包
- `README.md`
不入库(每次生成,见 `.gitignore`
- `staging/` — 临时部署副本
- `redist/` — 复制来的 `vc_redist.x64.exe`
- `dist/` — 最终安装包

View File

@ -0,0 +1,157 @@
<#
.SYNOPSIS
Geopro Windows 安装包一键打包工具
.DESCRIPTION
把已构建的 geopro_desktop 部署目录打包成单个 Inno Setup 安装程序
1) stage build/release/src/app 复制到 installer\staging剔除构建产物
CMakeFiles / *_autogen / *.pdb / *.log / *.cmake
2) deploy staging 上跑 windeployqt 补齐 Qt 运行时缺件
D3Dcompiler_47 / opengl32sw / WebEngine QML / 各插件
自动绕过 ADS 卡死问题qt6advanceddocking.dll 被误判为 Qt 模块
3) redist 确保 VC++ 运行时安装器 vc_redist.x64.exe 就位缺则从 VS 复制
4) compile 调用 ISCC 编译 geopro.iss输出到 installer\dist\
工具链Qt / ISCC / VS vc_redist全部自动定位便于换机复用
.PARAMETER Version
产品版本号默认 3.0.0最终文件名为 Geopro_Setup_<Version>-<yyyyMMdd>.exe
.PARAMETER Rebuild
先执行 build.bat rebuild 做一次干净重编再打包默认使用现有构建产物
.PARAMETER SkipDeploy
跳过 windeployqt 步骤仅当确认 staging 已补齐时使用不推荐
.PARAMETER QtPrefix
Qt 安装前缀默认从 CMakePresets.json CMAKE_PREFIX_PATH 解析
.EXAMPLE
powershell -ExecutionPolicy Bypass -File installer\build_installer.ps1
.EXAMPLE
powershell -ExecutionPolicy Bypass -File installer\build_installer.ps1 -Version 3.1.0 -Rebuild
#>
[CmdletBinding()]
param(
[string]$Version = '3.0.0',
[switch]$Rebuild,
[switch]$SkipDeploy,
[string]$QtPrefix
)
$ErrorActionPreference = 'Stop'
$InstallerDir = $PSScriptRoot
$RepoRoot = Split-Path $InstallerDir -Parent
$BuildAppDir = Join-Path $RepoRoot 'build\release\src\app'
$StageDir = Join-Path $InstallerDir 'staging'
$RedistDir = Join-Path $InstallerDir 'redist'
$DistDir = Join-Path $InstallerDir 'dist'
$IssFile = Join-Path $InstallerDir 'geopro.iss'
$ExeName = 'geopro_desktop.exe'
$BuildDate = Get-Date -Format 'yyyyMMdd'
function Info($m){ Write-Host "[pack] $m" -ForegroundColor Cyan }
function Warn($m){ Write-Host "[pack] $m" -ForegroundColor Yellow }
function Die($m){ Write-Host "[pack] ERROR: $m" -ForegroundColor Red; exit 1 }
# --- 0. 可选:干净重编 -------------------------------------------------------
if ($Rebuild) {
Info '执行 build.bat rebuild干净重编...'
& (Join-Path $RepoRoot 'build.bat') rebuild
if ($LASTEXITCODE -ne 0) { Die "build.bat rebuild 失败 (exit $LASTEXITCODE)" }
}
# --- 1. 定位 Qt / windeployqt ----------------------------------------------
if (-not $QtPrefix) {
$presets = Join-Path $RepoRoot 'CMakePresets.json'
if (Test-Path $presets) {
try {
$j = Get-Content $presets -Raw | ConvertFrom-Json
foreach ($p in $j.configurePresets) {
if ($p.cacheVariables.CMAKE_PREFIX_PATH) {
$QtPrefix = $p.cacheVariables.CMAKE_PREFIX_PATH; break
}
}
} catch { }
}
}
if (-not $QtPrefix) { $QtPrefix = 'D:/Qt/6.11.1/msvc2022_64' }
$QtBin = Join-Path ($QtPrefix -replace '/','\') 'bin'
$WinDeploy = Join-Path $QtBin 'windeployqt.exe'
# --- 2. 定位 ISCC -----------------------------------------------------------
$IsccCandidates = @(
"$env:LOCALAPPDATA\Programs\Inno Setup 6\ISCC.exe",
"${env:ProgramFiles(x86)}\Inno Setup 6\ISCC.exe",
"$env:ProgramFiles\Inno Setup 6\ISCC.exe"
)
$Iscc = $IsccCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1
if (-not $Iscc) { $Iscc = (Get-Command ISCC.exe -ErrorAction SilentlyContinue).Source }
if (-not $Iscc) {
Die '未找到 Inno Setup (ISCC.exe)。请先安装winget install --id JRSoftware.InnoSetup -e'
}
# --- 3. 校验构建产物 --------------------------------------------------------
$BuiltExe = Join-Path $BuildAppDir $ExeName
if (-not (Test-Path $BuiltExe)) {
Die "未找到构建产物 $BuiltExe`n请先构建build.bat app或加 -Rebuild 参数)"
}
Info "构建产物: $BuiltExe ($([math]::Round((Get-Item $BuiltExe).Length/1MB,2)) MB, 修改于 $((Get-Item $BuiltExe).LastWriteTime))"
# --- 4. stage复制部署目录、剔除构建产物 -----------------------------------
Info 'stage 部署副本(剔除 CMakeFiles / *_autogen / *.pdb / *.log / *.cmake...'
if (Test-Path $StageDir) { Remove-Item $StageDir -Recurse -Force }
New-Item -ItemType Directory -Force $StageDir | Out-Null
robocopy $BuildAppDir $StageDir /E `
/XD CMakeFiles geopro_desktop_autogen `
/XF *.pdb *.log cmake_install.cmake *.ilk *.exp `
/NFL /NDL /NJH /NJS /MT:8 | Out-Null
if ($LASTEXITCODE -ge 8) { Die "robocopy 失败 (exit $LASTEXITCODE)" }
# --- 5. windeployqt 补齐 Qt 运行时(绕过 ADS 卡死) -------------------------
if (-not $SkipDeploy) {
if (-not (Test-Path $WinDeploy)) { Die "未找到 windeployqt: $WinDeploy(用 -QtPrefix 指定 Qt 路径)" }
Info 'windeployqt 补齐 Qt 运行时缺件...'
# qt6advanceddocking.dll 名字带 qt6 前缀windeployqt 会误当 Qt 模块去 Qt\bin 找它并报错中止。
# 临时把它拷进 Qt\bin 让 windeployqt 能读其依赖(实为 Qt6Core/Gui/Widgets跑完即删。
$adsName = 'qt6advanceddocking.dll'
$adsTmp = Join-Path $QtBin $adsName
$adsPreexisted = Test-Path $adsTmp
if (-not $adsPreexisted) { Copy-Item (Join-Path $StageDir $adsName) $adsTmp -Force }
try {
& $WinDeploy --release --no-translations --compiler-runtime (Join-Path $StageDir $ExeName) | Out-Null
if ($LASTEXITCODE -ne 0) { Die "windeployqt 失败 (exit $LASTEXITCODE)" }
} finally {
if (-not $adsPreexisted) { Remove-Item $adsTmp -Force -ErrorAction SilentlyContinue }
}
}
# --- 6. VC++ 运行时安装器就位 -----------------------------------------------
New-Item -ItemType Directory -Force $RedistDir | Out-Null
$VcRedist = Join-Path $RedistDir 'vc_redist.x64.exe'
if (-not (Test-Path $VcRedist)) {
Info 'vc_redist.x64.exe 缺失,从 Visual Studio 复制...'
$vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
$vsPath = & $vswhere -all -prerelease -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath | Select-Object -Last 1
$found = Get-ChildItem (Join-Path $vsPath 'VC\Redist') -Filter 'vc_redist.x64.exe' -Recurse -ErrorAction SilentlyContinue |
Sort-Object FullName -Descending | Select-Object -First 1
if (-not $found) { Die '未找到 vc_redist.x64.exe请手动放入 installer\redist\' }
Copy-Item $found.FullName $VcRedist -Force
}
# --- 7. ISCC 编译 -----------------------------------------------------------
New-Item -ItemType Directory -Force $DistDir | Out-Null
$stageMB = [math]::Round((Get-ChildItem $StageDir -Recurse -File | Measure-Object Length -Sum).Sum/1MB,1)
Info "staging 载荷 $stageMB MB开始用 Inno Setup 编译安装包..."
& $Iscc "/DAppVersion=$Version" "/DBuildDate=$BuildDate" $IssFile
if ($LASTEXITCODE -ne 0) { Die "ISCC 编译失败 (exit $LASTEXITCODE)" }
# --- 8. 收尾报告 ------------------------------------------------------------
$out = Join-Path $DistDir "Geopro_Setup_$Version-$BuildDate.exe"
if (Test-Path $out) {
Info '打包完成 ✓'
Write-Host " 安装包: $out"
Write-Host " 大小 : $([math]::Round((Get-Item $out).Length/1MB,1)) MB"
} else {
Warn "ISCC 返回成功,但未找到预期产物 $out(检查 installer\dist\"
}

88
installer/geopro.iss Normal file
View File

@ -0,0 +1,88 @@
; ============================================================================
; Geopro — Windows 安装包脚本 (Inno Setup 6)
;
; 本脚本不直接手动编译,而是由 build_installer.ps1 调用:
; - 该脚本会先把 build/release/src/app 部署副本 stage 到 installer\staging
; 跑 windeployqt 补齐 Qt 运行时缺件D3Dcompiler / opengl32sw / WebEngine 等),
; 再用 /D 命令行宏把版本号与构建日期传进来。
; 也可手动编译(用 staging 现有内容、默认版本号):
; "%LOCALAPPDATA%\Programs\Inno Setup 6\ISCC.exe" geopro.iss
;
; 产物installer\dist\Geopro_Setup_<版本>-<日期>.exe
; ============================================================================
; ---- 版本/日期:默认值,可被 build_installer.ps1 的 /D 宏覆盖 ----
#ifndef AppVersion
#define AppVersion "3.0.0"
#endif
#ifndef BuildDate
#define BuildDate "dev"
#endif
#define AppName "Geopro"
#define AppPublisher "Geomative"
#define AppExeName "geopro_desktop.exe"
[Setup]
; AppId 必须保持稳定,升级/卸载据此识别同一程序——切勿修改此 GUID。
AppId={{B1C23792-2FFC-4326-89DA-B592D50DDF16}
AppName={#AppName}
AppVersion={#AppVersion}
AppVerName={#AppName} {#AppVersion} ({#BuildDate})
AppPublisher={#AppPublisher}
DefaultDirName={autopf}\{#AppName}
DefaultGroupName={#AppName}
DisableProgramGroupPage=yes
UninstallDisplayName={#AppName} {#AppVersion}
UninstallDisplayIcon={app}\{#AppExeName}
OutputDir={#SourcePath}\dist
OutputBaseFilename=Geopro_Setup_{#AppVersion}-{#BuildDate}
Compression=lzma2/max
SolidCompression=yes
WizardStyle=modern
; 仅 64 位Qt/VTK 均为 x64 构建)
ArchitecturesAllowed=x64compatible
ArchitecturesInstallIn64BitMode=x64compatible
; 装入 Program Files 并需安装 VC++ 运行时——要求管理员权限
PrivilegesRequired=admin
; 失败时在 %TEMP% 留安装日志,便于排障
SetupLogging=yes
[Languages]
Name: "zh"; MessagesFile: "{#SourcePath}\lang\ChineseSimplified.isl"
Name: "en"; MessagesFile: "compiler:Default.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
; 主载荷staging 全量exe + 全部 DLL + 插件目录 + WebEngine 资源),递归打包
Source: "{#SourcePath}\staging\*"; DestDir: "{app}"; Flags: recursesubdirs createallsubdirs ignoreversion
; VC++ 运行时安装器:临时落地、装完即删
Source: "{#SourcePath}\redist\vc_redist.x64.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall
[Icons]
Name: "{group}\{#AppName}"; Filename: "{app}\{#AppExeName}"; WorkingDir: "{app}"
Name: "{group}\{cm:UninstallProgram,{#AppName}}"; Filename: "{uninstallexe}"
Name: "{autodesktop}\{#AppName}"; Filename: "{app}\{#AppExeName}"; WorkingDir: "{app}"; Tasks: desktopicon
[Run]
; 安装 Microsoft Visual C++ 运行时(仅在系统未安装时执行;退出码被 Inno 忽略,已装则静默跳过)
Filename: "{tmp}\vc_redist.x64.exe"; Parameters: "/install /quiet /norestart"; \
StatusMsg: "正在安装 Microsoft Visual C++ 运行时..."; Check: VCRedistNeeded
; 安装结束可选立即启动
Filename: "{app}\{#AppExeName}"; Description: "{cm:LaunchProgram,{#AppName}}"; \
WorkingDir: "{app}"; Flags: nowait postinstall skipifsilent
[Code]
// 检测 VC++ 2015-2022 x64 运行时是否已安装64 位 + WOW6432Node 两个视图都查)
function VCRedistNeeded: Boolean;
var
installed: Cardinal;
begin
Result := True;
if RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64', 'Installed', installed) and (installed = 1) then
Result := False
else if RegQueryDWordValue(HKLM, 'SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64', 'Installed', installed) and (installed = 1) then
Result := False;
end;

View File

@ -0,0 +1,418 @@
; *** Inno Setup version 6.5.0+ Chinese Simplified messages ***
;
; To download user-contributed translations of this file, go to:
; https://jrsoftware.org/files/istrans/
;
; Note: When translating this text, do not add periods (.) to the end of
; messages that didn't have them already, because on those messages Inno
; Setup adds the periods automatically (appending a period would result in
; two periods being displayed).
;
; Maintained by Zhenghan Yang
; Email: 847320916@QQ.com
; Translation based on network resource
; The latest Translation is on https://github.com/kira-96/Inno-Setup-Chinese-Simplified-Translation
;
[LangOptions]
; The following three entries are very important. Be sure to read and
; understand the '[LangOptions] section' topic in the help file.
LanguageName=简体中文
; If Language Name display incorrect, uncomment next line
; LanguageName=<7B80><4F53><4E2D><6587>
; About LanguageID, to reference link:
; https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c
LanguageID=$0804
; About CodePage, to reference link:
; https://docs.microsoft.com/en-us/windows/win32/intl/code-page-identifiers
LanguageCodePage=936
; If the language you are translating to requires special font faces or
; sizes, uncomment any of the following entries and change them accordingly.
;DialogFontName=
;DialogFontSize=9
;DialogFontBaseScaleWidth=7
;DialogFontBaseScaleHeight=15
;WelcomeFontName=Segoe UI
;WelcomeFontSize=14
[Messages]
; *** 应用程序标题
SetupAppTitle=安装
SetupWindowTitle=安装 - %1
UninstallAppTitle=卸载
UninstallAppFullTitle=%1 卸载
; *** Misc. common
InformationTitle=信息
ConfirmTitle=确认
ErrorTitle=错误
; *** SetupLdr messages
SetupLdrStartupMessage=现在将安装 %1。您想要继续吗
LdrCannotCreateTemp=无法创建临时文件。安装程序已中止
LdrCannotExecTemp=无法执行临时目录中的文件。安装程序已中止
HelpTextNote=
; *** 启动错误消息
LastErrorMessage=%1。%n%n错误 %2: %3
SetupFileMissing=安装目录中缺少文件 %1。请修正这个问题或者获取程序的新副本。
SetupFileCorrupt=安装文件已损坏。请获取程序的新副本。
SetupFileCorruptOrWrongVer=安装文件已损坏,或是与这个安装程序的版本不兼容。请修正这个问题或获取新的程序副本。
InvalidParameter=无效的命令行参数:%n%n%1
SetupAlreadyRunning=安装程序正在运行。
WindowsVersionNotSupported=此程序不支持当前计算机运行的 Windows 版本。
WindowsServicePackRequired=此程序需要 %1 服务包 %2 或更高版本。
NotOnThisPlatform=此程序不能在 %1 上运行。
OnlyOnThisPlatform=此程序只能在 %1 上运行。
OnlyOnTheseArchitectures=此程序只能安装到为下列处理器架构设计的 Windows 版本中:%n%n%1
WinVersionTooLowError=此程序需要 %1 版本 %2 或更高。
WinVersionTooHighError=此程序不能安装于 %1 版本 %2 或更高。
AdminPrivilegesRequired=在安装此程序时您必须以管理员身份登录。
PowerUserPrivilegesRequired=在安装此程序时您必须以管理员身份或有权限的用户组身份登录。
SetupAppRunningError=安装程序发现 %1 当前正在运行。%n%n请先关闭正在运行的程序然后点击“确定”继续或点击“取消”退出。
UninstallAppRunningError=卸载程序发现 %1 当前正在运行。%n%n请先关闭正在运行的程序然后点击“确定”继续或点击“取消”退出。
; *** 启动问题
PrivilegesRequiredOverrideTitle=选择安装程序模式
PrivilegesRequiredOverrideInstruction=选择安装模式
PrivilegesRequiredOverrideText1=%1 可以为所有用户安装(需要管理员权限),或仅为您安装。
PrivilegesRequiredOverrideText2=%1 可以仅为您安装,或为所有用户安装(需要管理员权限)。
PrivilegesRequiredOverrideAllUsers=为所有用户安装(&A)
PrivilegesRequiredOverrideAllUsersRecommended=为所有用户安装(&A) (建议选项)
PrivilegesRequiredOverrideCurrentUser=仅为我安装(&M)
PrivilegesRequiredOverrideCurrentUserRecommended=仅为我安装(&M) (建议选项)
; *** 其他错误
ErrorCreatingDir=安装程序无法创建目录“%1”
ErrorTooManyFilesInDir=无法在目录“%1”中创建文件因为里面包含太多文件
; *** 安装程序公共消息
ExitSetupTitle=退出安装程序
ExitSetupMessage=安装程序尚未完成。如果现在退出,将不会安装该程序。%n%n您之后可以再次运行安装程序完成安装。%n%n现在退出安装程序吗
AboutSetupMenuItem=关于安装程序(&A)...
AboutSetupTitle=关于安装程序
AboutSetupMessage=%1 版本 %2%n%3%n%n%1 主页:%n%4
AboutSetupNote=
TranslatorNote=简体中文翻译由Kira(847320916@qq.com)维护。项目地址https://github.com/kira-96/Inno-Setup-Chinese-Simplified-Translation
; *** 按钮
ButtonBack=< 上一步(&B)
ButtonNext=下一步(&N) >
ButtonInstall=安装(&I)
ButtonOK=确定
ButtonCancel=取消
ButtonYes=是(&Y)
ButtonYesToAll=全是(&A)
ButtonNo=否(&N)
ButtonNoToAll=全否(&O)
ButtonFinish=完成(&F)
ButtonBrowse=浏览(&B)...
ButtonWizardBrowse=浏览(&R)...
ButtonNewFolder=新建文件夹(&M)
; *** “选择语言”对话框消息
SelectLanguageTitle=选择安装语言
SelectLanguageLabel=选择安装时使用的语言。
; *** 公共向导文字
ClickNext=点击“下一步”继续,或点击“取消”退出安装程序。
BeveledLabel=
BrowseDialogTitle=浏览文件夹
BrowseDialogLabel=在下面的列表中选择一个文件夹,然后点击“确定”。
NewFolderName=新建文件夹
; *** “欢迎”向导页
WelcomeLabel1=欢迎使用 [name] 安装向导
WelcomeLabel2=现在将安装 [name/ver] 到您的电脑中。%n%n建议您在继续安装前关闭所有其他应用程序。
; *** “密码”向导页
WizardPassword=密码
PasswordLabel1=这个安装程序有密码保护。
PasswordLabel3=请输入密码,然后点击“下一步”继续。密码区分大小写。
PasswordEditLabel=密码(&P)
IncorrectPassword=您输入的密码不正确,请重新输入。
; *** “许可协议”向导页
WizardLicense=许可协议
LicenseLabel=请在继续安装前阅读以下重要信息。
LicenseLabel3=请仔细阅读下列许可协议。在继续安装前您必须同意这些协议条款。
LicenseAccepted=我同意此协议(&A)
LicenseNotAccepted=我不同意此协议(&D)
; *** “信息”向导页
WizardInfoBefore=信息
InfoBeforeLabel=请在继续安装前阅读以下重要信息。
InfoBeforeClickLabel=准备好继续安装后,点击“下一步”。
WizardInfoAfter=信息
InfoAfterLabel=请在继续安装前阅读以下重要信息。
InfoAfterClickLabel=准备好继续安装后,点击“下一步”。
; *** “用户信息”向导页
WizardUserInfo=用户信息
UserInfoDesc=请输入您的信息。
UserInfoName=用户名(&U)
UserInfoOrg=组织(&O)
UserInfoSerial=序列号(&S)
UserInfoNameRequired=您必须输入用户名。
; *** “选择目标目录”向导页
WizardSelectDir=选择目标位置
SelectDirDesc=您想将 [name] 安装在哪里?
SelectDirLabel3=安装程序将安装 [name] 到下面的文件夹中。
SelectDirBrowseLabel=点击“下一步”继续。如果您想选择其他文件夹,点击“浏览”。
DiskSpaceGBLabel=至少需要有 [gb] GB 的可用磁盘空间。
DiskSpaceMBLabel=至少需要有 [mb] MB 的可用磁盘空间。
CannotInstallToNetworkDrive=安装程序无法安装到一个网络驱动器。
CannotInstallToUNCPath=安装程序无法安装到一个 UNC 路径。
InvalidPath=您必须输入一个带驱动器卷标的完整路径,例如:%n%nC:\APP%n%n或UNC路径%n%n\\server\share
InvalidDrive=您选定的驱动器或 UNC 共享不存在或不能访问。请选择其他位置。
DiskSpaceWarningTitle=磁盘空间不足
DiskSpaceWarning=安装程序至少需要 %1 KB 的可用空间才能安装,但选定驱动器只有 %2 KB 的可用空间。%n%n您一定要继续吗
DirNameTooLong=文件夹名称或路径太长。
InvalidDirName=文件夹名称无效。
BadDirName32=文件夹名称不能包含下列任何字符:%n%n%1
DirExistsTitle=文件夹已存在
DirExists=文件夹:%n%n%1%n%n已经存在。您一定要安装到这个文件夹中吗
DirDoesntExistTitle=文件夹不存在
DirDoesntExist=文件夹:%n%n%1%n%n不存在。您想要创建此文件夹吗
; *** “选择组件”向导页
WizardSelectComponents=选择组件
SelectComponentsDesc=您想安装哪些程序组件?
SelectComponentsLabel2=选中您想安装的组件;取消您不想安装的组件。然后点击“下一步”继续。
FullInstallation=完全安装
; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language)
CompactInstallation=简洁安装
CustomInstallation=自定义安装
NoUninstallWarningTitle=组件已存在
NoUninstallWarning=安装程序检测到下列组件已安装在您的电脑中:%n%n%1%n%n取消选中这些组件不会卸载它们。%n%n确定要继续吗
ComponentSize1=%1 KB
ComponentSize2=%1 MB
ComponentsDiskSpaceGBLabel=当前选择的组件需要至少 [gb] GB 的磁盘空间。
ComponentsDiskSpaceMBLabel=当前选择的组件需要至少 [mb] MB 的磁盘空间。
; *** “选择附加任务”向导页
WizardSelectTasks=选择附加任务
SelectTasksDesc=您想要安装程序执行哪些附加任务?
SelectTasksLabel2=选择您想要安装程序在安装 [name] 时执行的附加任务,然后点击“下一步”。
; *** “选择开始菜单文件夹”向导页
WizardSelectProgramGroup=选择开始菜单文件夹
SelectStartMenuFolderDesc=安装程序应该在哪里放置程序的快捷方式?
SelectStartMenuFolderLabel3=安装程序将在下列“开始”菜单文件夹中创建程序的快捷方式。
SelectStartMenuFolderBrowseLabel=点击“下一步”继续。如果您想选择其他文件夹,点击“浏览”。
MustEnterGroupName=您必须输入一个文件夹名。
GroupNameTooLong=文件夹名或路径太长。
InvalidGroupName=无效的文件夹名字。
BadGroupName=文件夹名不能包含下列任何字符:%n%n%1
NoProgramGroupCheck2=不创建开始菜单文件夹(&D)
; *** “准备安装”向导页
WizardReady=准备安装
ReadyLabel1=安装程序准备就绪,现在可以开始安装 [name] 到您的电脑。
ReadyLabel2a=点击“安装”继续此安装程序。如果您想重新考虑或修改任何设置,点击“上一步”。
ReadyLabel2b=点击“安装”继续此安装程序。
ReadyMemoUserInfo=用户信息:
ReadyMemoDir=目标位置:
ReadyMemoType=安装类型:
ReadyMemoComponents=已选择组件:
ReadyMemoGroup=开始菜单文件夹:
ReadyMemoTasks=附加任务:
; *** TExtractionWizardPage 向导页面与 ExtractArchive
ExtractingLabel=正在解压文件...
ButtonStopExtraction=停止解压(&S)
StopExtraction=您确定要停止解压吗?
ErrorExtractionAborted=解压已中止
ErrorExtractionFailed=解压失败:%1
; *** 压缩文件解压失败详情
ArchiveIncorrectPassword=压缩文件密码不正确
ArchiveIsCorrupted=压缩文件已损坏
ArchiveUnsupportedFormat=不支持的压缩文件格式
; *** TDownloadWizardPage 向导页面和 DownloadTemporaryFile
DownloadingLabel2=正在下载文件...
ButtonStopDownload=停止下载(&S)
StopDownload=您确定要停止下载吗?
ErrorDownloadAborted=下载已中止
ErrorDownloadFailed=下载失败:%1 %2
ErrorDownloadSizeFailed=获取下载大小失败:%1 %2
ErrorProgress=无效的进度:%1 / %2
ErrorFileSize=文件大小错误:预期 %1实际 %2
; *** “正在准备安装”向导页
WizardPreparing=正在准备安装
PreparingDesc=安装程序正在准备安装 [name] 到您的电脑。
PreviousInstallNotCompleted=先前的程序安装或卸载未完成,您需要重启您的电脑以完成。%n%n在重启电脑后再次运行安装程序以完成 [name] 的安装。
CannotContinue=安装程序不能继续。请点击“取消”退出。
ApplicationsFound=以下应用程序正在使用将由安装程序更新的文件。建议您允许安装程序自动关闭这些应用程序。
ApplicationsFound2=以下应用程序正在使用将由安装程序更新的文件。建议您允许安装程序自动关闭这些应用程序。安装完成后,安装程序将尝试重新启动这些应用程序。
CloseApplications=自动关闭应用程序(&A)
DontCloseApplications=不要关闭应用程序(&D)
ErrorCloseApplications=安装程序无法自动关闭所有应用程序。建议您在继续之前,关闭所有在使用需要由安装程序更新的文件的应用程序。
PrepareToInstallNeedsRestart=安装程序必须重启您的计算机。计算机重启后,请再次运行安装程序以完成 [name] 的安装。%n%n是否立即重新启动
; *** “正在安装”向导页
WizardInstalling=正在安装
InstallingLabel=安装程序正在安装 [name] 到您的电脑,请稍候。
; *** “安装完成”向导页
FinishedHeadingLabel=[name] 安装完成
FinishedLabelNoIcons=安装程序已在您的电脑中安装了 [name]。
FinishedLabel=安装程序已在您的电脑中安装了 [name]。您可以通过已安装的快捷方式运行此应用程序。
ClickFinish=点击“完成”退出安装程序。
FinishedRestartLabel=为完成 [name] 的安装,安装程序必须重新启动您的电脑。要立即重启吗?
FinishedRestartMessage=为完成 [name] 的安装,安装程序必须重新启动您的电脑。%n%n要立即重启吗
ShowReadmeCheck=是,我想查阅自述文件
YesRadio=是,立即重启电脑(&Y)
NoRadio=否,稍后重启电脑(&N)
; used for example as 'Run MyProg.exe'
RunEntryExec=运行 %1
; used for example as 'View Readme.txt'
RunEntryShellExec=查阅 %1
; *** “安装程序需要下一张磁盘”提示
ChangeDiskTitle=安装程序需要下一张磁盘
SelectDiskLabel2=请插入磁盘 %1 并点击“确定”。%n%n如果这个磁盘中的文件可以在下列文件夹之外的文件夹中找到请输入正确的路径或点击“浏览”。
PathLabel=路径(&P)
FileNotInDir2=“%2”中找不到文件“%1”。请插入正确的磁盘或选择其他文件夹。
SelectDirectoryLabel=请指定下一张磁盘的位置。
; *** 安装阶段消息
SetupAborted=安装程序未完成安装。%n%n请修正这个问题并重新运行安装程序。
AbortRetryIgnoreSelectAction=选择操作
AbortRetryIgnoreRetry=重试(&T)
AbortRetryIgnoreIgnore=忽略错误并继续(&I)
AbortRetryIgnoreCancel=关闭安装程序
RetryCancelSelectAction=选择操作
RetryCancelRetry=重试(&T)
RetryCancelCancel=取消(&C)
; *** 安装状态消息
StatusClosingApplications=正在关闭应用程序...
StatusCreateDirs=正在创建目录...
StatusExtractFiles=正在提取文件...
StatusDownloadFiles=正在下载文件...
StatusCreateIcons=正在创建快捷方式...
StatusCreateIniEntries=正在创建 INI 条目...
StatusCreateRegistryEntries=正在创建注册表条目...
StatusRegisterFiles=正在注册文件...
StatusSavingUninstall=正在保存卸载信息...
StatusRunProgram=正在完成安装...
StatusRestartingApplications=正在重启应用程序...
StatusRollback=正在撤销更改...
; *** 其他错误
ErrorInternal2=内部错误:%1
ErrorFunctionFailedNoCode=%1 失败
ErrorFunctionFailed=%1 失败;错误代码 %2
ErrorFunctionFailedWithMessage=%1 失败;错误代码 %2.%n%3
ErrorExecutingProgram=无法执行文件:%n%1
; *** 注册表错误
ErrorRegOpenKey=打开注册表项时出错:%n%1\%2
ErrorRegCreateKey=创建注册表项时出错:%n%1\%2
ErrorRegWriteKey=写入注册表项时出错:%n%1\%2
; *** INI 错误
ErrorIniEntry=在文件“%1”中创建 INI 条目时出错。
; *** 文件复制错误
FileAbortRetryIgnoreSkipNotRecommended=跳过此文件(&S) (不推荐)
FileAbortRetryIgnoreIgnoreNotRecommended=忽略错误并继续(&I) (不推荐)
SourceIsCorrupted=源文件已损坏
SourceDoesntExist=源文件“%1”不存在
SourceVerificationFailed=源文件验证失败: %1
VerificationSignatureDoesntExist=签名文件“%1”不存在
VerificationSignatureInvalid=签名文件“%1”无效
VerificationKeyNotFound=签名文件“%1”使用了未知密钥
VerificationFileNameIncorrect=文件名不正确
VerificationFileTagIncorrect=文件标签不正确
VerificationFileSizeIncorrect=文件大小不正确
VerificationFileHashIncorrect=文件哈希值不正确
ExistingFileReadOnly2=无法替换现有文件,它是只读的。
ExistingFileReadOnlyRetry=移除只读属性并重试(&R)
ExistingFileReadOnlyKeepExisting=保留现有文件(&K)
ErrorReadingExistingDest=尝试读取现有文件时出错:
FileExistsSelectAction=选择操作
FileExists2=文件已经存在。
FileExistsOverwriteExisting=覆盖已存在的文件(&O)
FileExistsKeepExisting=保留现有的文件(&K)
FileExistsOverwriteOrKeepAll=为所有冲突文件执行此操作(&D)
ExistingFileNewerSelectAction=选择操作
ExistingFileNewer2=现有的文件比安装程序将要安装的文件还要新。
ExistingFileNewerOverwriteExisting=覆盖已存在的文件(&O)
ExistingFileNewerKeepExisting=保留现有的文件(&K) (推荐)
ExistingFileNewerOverwriteOrKeepAll=为所有冲突文件执行此操作(&D)
ErrorChangingAttr=尝试更改下列现有文件的属性时出错:
ErrorCreatingTemp=尝试在目标目录创建文件时出错:
ErrorReadingSource=尝试读取下列源文件时出错:
ErrorCopying=尝试复制下列文件时出错:
ErrorDownloading=下载文件时出错:
ErrorExtracting=解压压缩文件时出错:
ErrorReplacingExistingFile=尝试替换现有文件时出错:
ErrorRestartReplace=重启并替换失败:
ErrorRenamingTemp=尝试重命名下列目标目录中的一个文件时出错:
ErrorRegisterServer=无法注册 DLL/OCX%1
ErrorRegSvr32Failed=RegSvr32 失败;退出代码 %1
ErrorRegisterTypeLib=无法注册类库:%1
; *** 卸载显示名字标记
; used for example as 'My Program (32-bit)'
UninstallDisplayNameMark=%1 (%2)
; used for example as 'My Program (32-bit, All users)'
UninstallDisplayNameMarks=%1 (%2, %3)
UninstallDisplayNameMark32Bit=32 位
UninstallDisplayNameMark64Bit=64 位
UninstallDisplayNameMarkAllUsers=所有用户
UninstallDisplayNameMarkCurrentUser=当前用户
; *** 安装后错误
ErrorOpeningReadme=尝试打开自述文件时出错。
ErrorRestartingComputer=安装程序无法重启电脑,请手动重启。
; *** 卸载消息
UninstallNotFound=文件“%1”不存在。无法卸载。
UninstallOpenError=文件“%1”不能被打开。无法卸载。
UninstallUnsupportedVer=此版本的卸载程序无法识别卸载日志文件“%1”的格式。无法卸载
UninstallUnknownEntry=卸载日志中遇到一个未知条目 (%1)
ConfirmUninstall=您确认要完全移除 %1 及其所有组件吗?
UninstallOnlyOnWin64=仅允许在 64 位 Windows 中卸载此程序。
OnlyAdminCanUninstall=仅使用管理员权限的用户能完成此卸载。
UninstallStatusLabel=正在从您的电脑中移除 %1请稍候。
UninstalledAll=已顺利从您的电脑中移除 %1。
UninstalledMost=%1 卸载完成。%n%n有部分内容未能被删除但您可以手动删除它们。
UninstalledAndNeedsRestart=为完成 %1 的卸载,需要重启您的电脑。%n%n立即重启电脑吗
UninstallDataCorrupted=文件“%1”已损坏。无法卸载
; *** 卸载状态消息
ConfirmDeleteSharedFileTitle=删除共享的文件吗?
ConfirmDeleteSharedFile2=系统表示下列共享的文件已不有其他程序使用。您希望卸载程序删除这些共享的文件吗?%n%n如果删除这些文件但仍有程序在使用这些文件则这些程序可能出现异常。如果您不能确定请选择“否”在系统中保留这些文件以免引发问题。
SharedFileNameLabel=文件名:
SharedFileLocationLabel=位置:
WizardUninstalling=卸载状态
StatusUninstalling=正在卸载 %1...
; *** Shutdown block reasons
ShutdownBlockReasonInstallingApp=正在安装 %1。
ShutdownBlockReasonUninstallingApp=正在卸载 %1。
; The custom messages below aren't used by Setup itself, but if you make
; use of them in your scripts, you'll want to translate them.
[CustomMessages]
NameAndVersion=%1 版本 %2
AdditionalIcons=附加快捷方式:
CreateDesktopIcon=创建桌面快捷方式(&D)
CreateQuickLaunchIcon=创建快速启动栏快捷方式(&Q)
ProgramOnTheWeb=%1 网站
UninstallProgram=卸载 %1
LaunchProgram=运行 %1
AssocFileExtension=将 %2 文件扩展名与 %1 建立关联(&A)
AssocingFileExtension=正在将 %2 文件扩展名与 %1 建立关联...
AutoStartProgramGroupDescription=启动:
AutoStartProgram=自动启动 %1
AddonHostProgramNotFound=您选择的文件夹中无法找到 %1。%n%n您要继续吗