; NSIS: 結構化的 LangString 寫作 ; ; 範例: NIS EDIT 2.0b3 中文化多語言包裝。 ; 環境: NSIS 2.0b4, Modern UI 1.64 MAKENSIS.EXE 2003-05-09 ; ; 新版的 (1021) 與 Modern UI 1.66 理論上也可以用。自己用死 ; 了,自己要負責喔。如果你實在不想學多語言安裝,以及如何用 ; LangString 「騙」 NSIS ,那麼這一段對你來說,就是垃圾,你 ; 可以不看。如同 IC 所言,在硬碟毀掉之後還真是個新思維。 ; ; 重點祇有這個字: LangString ; ──其 布局 / 放置變數 / 區段位置統整 ; ; 當然許多人在質疑多語言需要或不需要。我不想多說什麼,你可 ; 以看作品本身,讓使用人的「爽快程度」。當一個語言的統整關 ; 卡突破時,剩下來的,你要加十個語言也沒有關係。你的程式控 ; 制思路,會更加清晰。 ; ; 回到原題。在 NSIS 2.0b1 之前,多語言之下需要寫「字串比 ; 較」的一大堆巨集,如下 ; ; StrCmp $LANGUAGE ${LANGID} "" +3; ; ; 而目前則以 LangString 或 LangStringUp 取代,簡潔許多。說來 ; 簡單,但要把自己寫的舊巨集改換結構,那實在是有點痛苦。為 ; 什麼要改?舊的巨集很方便,一路思路順暢,但多語言除錯時就 ; 像大海撈針一樣。新的方式,會強制把 LangString 全部歸在同 ; 一個位置。 ; ; 有了 LangString ,可以騙到的東西,太多太多了。 ; LangString 祇能用在對話顯示嗎?不能用在捷徑嗎?不能用在節 ; 段名稱控制嗎?不能用在註冊表項,讓他隨著作業系統的不同而寫 ; 入不同的數值嗎? ; ; 但是注意: 每一個 LangString 變數,前後不要附帶任何字串, ; 否則會使 NSIS 無法識別而出錯。 ; ; 簡體描述部分,因為在 BIG5 編碼之下使用 GB2312 ,故 ; 必定有亂碼,還請見諒。如果需要在網頁取得正確編碼, ; 請儲存為 BIG5 plain text ,再來處理。我會另外以 ; attach file 的方式附在板上。 ; ; 我沒有使用任何類似 GUI 的工具。推薦的就剛好是這個範圍本 ; 身所包的,NIS EDIT 2.0b3 。 ; http://search.cpatch.org/download/install/nisedit/cnisedit20b3.exe ; 如果還嫌太麻煩,Joost 的英文版 HTML 入門,只有一頁,建議先看。 ; ; 記得,沒人強迫你要使用多語言,沒人強迫你要 Modern ; UI ,沒人強迫你要歡迎對話方塊。你一樣可以做出一點也 ; 不花俏的,很傳統的安裝程式。不要在那裡廢話什麼 NSIS ; 愈做愈肥大。 ; ; 這些都是自己決定的。 ; ; ■相關閱讀 ; ; NSIS 的作業系統判斷方式 ; http://leoboard.cpatch.org/cgi-bin/topic.cgi?forum=2&topic=165 ; ; NSIS 2.0b4 升級密技 ; http://leoboard.cpatch.org/cgi-bin/topic.cgi?forum=2&topic=125 ; ; NSIS 2.0bxxx 的諸多討論/消息/下載 ; http://leoboard.cpatch.org/cgi-bin/topic.cgi?forum=2&topic=32 ; ; NSIS 2.0 b3 升級密技 ; http://leoboard.cpatch.org/cgi-bin/topic.cgi?forum=2&topic=113 ; ; NSIS 2.0b1多語言腳本寫作密技 (無經驗者,建議先看這一篇) ; http://leoboard.cpatch.org/cgi-bin/topic.cgi?forum=2&topic=54 ;======================================================= ; ■1.定義變數、安裝目錄、輸出檔案、圖示 ;======================================================= ; 只要在這裡寫好,其他的都按照定義的變數下去跑,就省力多了。 ; ;============================== ; 1.1 版本號碼/名稱 ; !define VER_1 1 ;軟體版本號碼 1 ,如 Eudora 4.3.1.2 四位版本號碼 !define VER_2 09 ;軟體版本號碼 2 ;!define VER_3 11 ;軟體版本號碼 3 (* 進階) ;!define VER_4 yyy ;軟體版本號碼 4 (* 進階) ;!define VER_R 2 ;中文化同版本第幾更版 (* 進階) !define MUI_PRODUCT "PIXresizer" ;程式名稱 (可使用大小寫) !define PROGFNHEADER "pixresizer" ;中文化檔案名稱的主要部分 (全部小寫) !define PROGMAINEXE "pixresizer.exe" ;主程式執行檔案名稱 (含.exe) ; ;============================== ; 1.2 讀我檔案/輸出檔案 ; ; 讀我顯示,包括 CHS/CHT/ENU 三個版本。如果你不需要製作 ; 多語言中文化版本,只要考慮一個「讀我」即可。這個讀我, ; 通常拿來放「此中文化的描述檔案」,而非一般軟體的 readme 。 ; ; 檔案命名: (全部小寫)。 ; (cpatch) c + ${PROGFNHEADER} + 版本號碼 _(底線) 第幾中文化版本 . 副檔名 ; (hanzify) ha _(底線) ${PROGFNHEADER} + 版本號碼 _(底線) 作者名 . 擴展名 ; ;!define README "c${PROGFNHEADER}${VER_1}${VER_2}_${VER_R}.txt" !define README_CHS "c${PROGFNHEADER}${VER_1}${VER_2}_gb.txt" !define README_CHT "c${PROGFNHEADER}${VER_1}${VER_2}.txt" !define README_ENU "c${PROGFNHEADER}${VER_1}${VER_2}.txt" OUTFILE "c${PROGFNHEADER}${VER_1}${VER_2}.exe" ;============================== ; 1.3 預設安裝目錄 (尾端不加 \) ; ; 通常會出現在 "C:\Program Files\xxxx " 這種目錄。 ; 也可以使用 ${AppPath} 在註冊表尋找舊版安裝目錄。 ; 如果註冊表的安裝目錄 (尾端 \) 出現,不要使用它,以免發生錯誤。 ;InstallDir "$PROGRAMFILES\${MUI_PRODUCT}" ;InstallDir "${AppPath}" InstallDir "C:\UTIL\${MUI_PRODUCT}" ;============================== ; 1.4 版權影像 ; ; 只需要一個就夠 (一定要 bmp 格式),第二個是拿來花俏用的。 ; 可以只使用一個,或完全不使用。 !define SPLASH1 "cpixresizer109.bmp" ;!define SPLASH2 "basic3.bmp" ;============================== ; 1.5 安裝程式型態 ; ; 中文化/直接安裝版/還是補綴補丁?安裝時出現在 caption 部分。 ; 解除安裝時,也會出現在註冊表。 !define PATCHTYPE_ENU "(CN+TW) localized" !define PATCHTYPE_CHT "(CN+TW) 中文化" !define PATCHTYPE_CHS "(CN+TW) 笢恅趙" ;============================== ; 1.6 用於解除安裝的資訊 ; ; 包含公司全稱/軟體功能概述。會塞在 Uninstall 註冊表內。 !define URLABOUT "http://bluefive.pair.com/pixresizer.htm" !define URLHELP "http://bluefive.pair.com/faq.htm" !define URLUPDATE "http://bluefive.pair.com/updates.htm" !define PUBLISHER "1997-2005 BlueFive Software" ; 前面會自動依語言補上 Copyright (c) 或 版權所有 (c) ,因此後面只要接上年代和公司名稱。 ;======================================================= ; ■2.使用者介面 ;======================================================= ; 這一段的用途,在於強制覆寫 system.nsh 的英文預設設定值, ; 通常只有變更 「字型」「圖示」 ;============================== ; 2.1 字型 ; 安裝介面的字型預設大小 8,一定要改掉,否則在 win98 中文不好看。 ; 如下。雙語言中文化,使用 "Tahoma" 即可。 ; 不需要特別指定「新細明體」或「宋体」。 ;!define MUI_FONT "MS Shell Dlg" ;!define MUI_FONTSIZE "8" ;!define MUI_FONT_HEADER "MS Sans Serif" ;!define MUI_FONTSIZE_HEADER "8" ; ; 上列: NSIS 字型「預設值」,下列: 字型「建議修改值」。 ; ;!define MUI_FONT "Tahoma" ;!define MUI_FONTSIZE "9" ;!define MUI_FONT_HEADER "Tahoma" ;!define MUI_FONTSIZE_HEADER "9" ; 在 NSIS 2.0b4 2003-05-01 之後的版本,不需要再用上述 ; 命令。已由 *.NSH 指定個別語言的字型名稱與大小。 ;============================== ; 2.2 圖示 ; 安裝程式圖示: 通常我使用主程式的圖示,另外用 VC 抽取出來。 ; 解除安裝圖示: 為了讓 [控制台 | 新增/移除程式] 出現正確圖示,還是用同一個圖示。 ; 有時候則使用它附的圖示 (因為看起來不錯)。 ;!define MUI_ICON "${NSISDIR}\Contrib\Icons\modern-install.ico" ;!define MUI_UNICON "${NSISDIR}\Contrib\Icons\modern-uninstall.ico" ; ; 上列: NSIS 圖示「預設值」,風格有點像 InstallShield 6 ,也不錯。 ; 下列: 自訂圖示,請指定正確名稱 !define MUI_ICON "ICO1.ico" !define MUI_UNICON "ICO1.ico" ;============================== ; 2.3 其他 (* 進階) ; 設定風格,這裡是自己可以搞鬼的地方。 !define MUI_UI "${NSISDIR}\Contrib\UIs\modern2.exe" !define MUI_CHECKBITMAP "${NSISDIR}\Contrib\Icons\modern.bmp" !define MUI_FONTSTYLE_HEADER "700" !define MUI_FONT_TITLE "Verdana" !define MUI_FONTSIZE_TITLE "12" !define MUI_FONTSTYLE_TITLE "700" !define MUI_INSTALLCOLORS "/windows" !define MUI_PROGRESSBAR "smooth" !define MUI_SPECIALINI "${NSISDIR}\Contrib\Modern UI\ioSpecial.ini" !define MUI_SPECIALBITMAP "${NSISDIR}\Contrib\Icons\modern-wizard.bmp" !define MUI_BGCOLOR "0xFFFFFF" ;======================================================= ; ■3.多語言系統 ;======================================================= ; 載入 Modern UI\System.nsh 之用。 ;========================== ; 3.1 前置相同變數,視需要而定。 ; ; 通常出現在更換版本時,原腳本的變數校正。 !define MUI_VERSION "${VER_1}.${VER_2}" ;!define NAME "${MUI_PRODUCT}" ;顯示中文化標題,依 ENU/CHT/CHS 語言的不同。 CAPTION /LANG=1033 "${MUI_PRODUCT} ${MUI_VERSION} ${PATCHTYPE_ENU}" CAPTION /LANG=1028 "${MUI_PRODUCT} ${MUI_VERSION} ${PATCHTYPE_CHT}" CAPTION /LANG=2052 "${MUI_PRODUCT} ${MUI_VERSION} ${PATCHTYPE_CHS}" ;========================== ; 3.2 載入 Modern UI 系統 !include "${NSISDIR}\Contrib\Modern UI\System.nsh" ;========================== ; 3.3 使用者介面 ; ; 如果不要這些對話方塊,不做 define ,就不會出現。 !define MUI_WELCOMEPAGE ;歡迎頁面 !define MUI_LICENSEPAGE ;授權頁面 !define MUI_LICENSEPAGE_RADIOBUTTONS !define MUI_COMPONENTSPAGE ;元件頁面 !define MUI_DIRECTORYPAGE ;目錄選擇 !define MUI_ABORTWARNING ;中止警告 !define MUI_UNINSTALLER ;解除安裝程式 !define MUI_UNCONFIRMPAGE ;不做確認頁面 ; !define MUI_STARTMENUPAGE ;選擇開始功能表 !define MUI_FINISHPAGE ;出現完成頁面,執行程式和讀我。 !define MUI_FINISHPAGE_NOAUTOCLOSE !define MUI_FINISHPAGE_RUN "$INSTDIR\${PROGMAINEXE}" !define MUI_FINISHPAGE_SHOWREADME "$(FILE_README)" ;============================== ; 3.4 各國語言 ; 塞了 ENU/CHT/CHS 三個語言。你要 18 個語言全塞,也不反對。大小大概增加 20 kb 左右。 ; 如果不是多語言中文化安裝,你可以全部 remark 掉。 !insertmacro MUI_LANGUAGE "English" !insertmacro MUI_LANGUAGE "SimpChinese" !insertmacro MUI_LANGUAGE "TradChinese" ;============================== ; 3.5 授權文字 (* 進階) ; ; 這些檔案沒有出現在 NSIS 預設包內。如果你手上沒有 license 檔案, ; 請直接 remark 掉。 ; 這些東西會先被解壓縮出來。保留這幾行在任何 File 指令之前!) ; 只能用於 BZIP2 壓縮 LicenseData /LANG=${LANG_ENGLISH} "${NSISDIR}\Examples\Modern UI\license_enu.rtf" LicenseData /LANG=${LANG_SIMPCHINESE} "${NSISDIR}\Examples\Modern UI\license_chs.rtf" LicenseData /LANG=${LANG_TRADCHINESE} "${NSISDIR}\Examples\Modern UI\license_cht.rtf" !insertmacro MUI_RESERVEFILE_LANGDLL ;======================================================= ; ■4.安裝程式,安裝開始的前置動作 (* 進階) ;======================================================= ; 如果不需要,你可以全部 remark。 Function .onInit ;============================== ; 4.1 顯示版權影像 ; ; advsplash (NSIS 插件)。解壓縮到臨時目錄,顯示 splash ,然後刪除。 SetOutPath $TEMP File /oname=splash1.bmp ${SPLASH1} ; File /oname=splash2.bmp ${SPLASH2} advsplash::show 1200 600 400 -1 $TEMP\splash1 ; advsplash::show 1200 600 400 -1 $TEMP\splash2 Pop $0 ; $0 has '1' if the user closed the splash screen early, ; '0' if everything closed normal, and '-1' if some error occured. Delete $TEMP\spltmp.exe Delete $TEMP\splash1.bmp Delete $TEMP\splash2.bmp ;============================== ; 4.2 字型選擇 (* 進階) ; ; 只影響安裝程式的語言選擇 dialog ,因此不要使用中文字型名稱。 Push Verdana Push 9 ;============================== ; 4.3 語言選擇 (* 進階) ; 上面這一句,不要中文化。除非你想讓老外看到亂碼。 ; 如果這一行完全不用,那就會直接跳該語言的選項。 !insertmacro MUI_LANGDLL_DISPLAY LangDLL::LangDialog "Installer Language" "Please select a language." Pop $LANGUAGE StrCmp $LANGUAGE "cancel" 0 +2 Abort ;============================== ; 4.4 安裝前置動作 (修改註冊表) (* 進階) ; ; 視你需要,可以偷偷做一些動作。 ; ; 解決掉 UltraEdit 有夠笨的滑鼠常駐問題。 DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{b5eedee0-c06e-11cf-8c56-444553540000}\InProcServer32" DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{b5eedee0-c06e-11cf-8c56-444553540000}" ;============================== ; 4.5 尋找舊版已安裝的目錄。 (* 進階) ; ; 如果 AppPath 讀出的尾端有 \ 符號,請不要直接使用於 INSTDIR 指令,以免發生錯誤。 ; ReadRegStr $AppPath HKLM "SOFTWARE\Alt-N Technologies\MDaemon" "AppPath" FunctionEnd ;======================================================= ; ■5.安裝程式,安裝完成後置動作 (* 進階) ;======================================================= ; 如果不需要,你可以全部 remark。 ;============================== ; 5.1 函式定義開始 Function .onInstSuccess ;============================== ; 5.2 安裝完成後,執行 ExecShell ; ; 視個人需要而定,我只用在 Eudora 安裝而已。 ; MessageBox MB_YESNO|MB_ICONQUESTION $(Str_Finish1) IDNO Nomapi ; ExecShell open '$INSTDIR\PIXresizer_ocx.bat' ; Nomapi: ;============================== ; 5.3 安裝後,要求使用者讀取 README 檔案 ; MessageBox MB_YESNO|MB_ICONQUESTION $(Str_Finish2) IDNO NoReadme ; ExecShell open $(FILE_README) ;NoReadme: ;============================== ; 5.4 函式定義結束 FunctionEnd ;======================================================= ; ■6.安裝的所有檔案 ;======================================================= ;============================== ; 6.1 安裝類型 ; 兩種應該很夠了。 InstType "$(desc_InstMin)" InstType "$(desc_InstStd)" InstType "$(desc_InstFul)" ;InstType "$(desc_InstCHT)" ;InstType "$(desc_InstCHS)" ;InstType "$(desc_InstENU)" SetOverwrite on ;============================== ; 6.3 安裝的各個節段 ; Section "${MUI_PRODUCT}" Sec${MUI_PRODUCT} Section "$(S01)" SecS01 SectionIn 1 2 3 ; 6.3.1 中文化的讀我 ; 通常塞在安裝的主目錄。 SetOutPath $INSTDIR File "${README_CHT}" File "${README_CHS}" ; 6.3.2 中文化的程式檔案 ; 通常不使用 *.* 型態,而個別指定,以免包裝錯誤。 ; 常常是 *.DLL *.EXE *.AX 等類型。我都把這類放在 cht 為首的工作目錄。 SetOutPath $INSTDIR SetOverwrite on File ".\cht\PIXresizer.cnt" File ".\cht\PIXresizer.exe" ; Rename /REBOOTOK "$INSTDIR\YPOPS_B5.EXE" "$INSTDIR\${PROGMAINEXE}" ; 6.3.2 非中文化的程式檔案 File /r ".\pack\*.*" ExecShell open '"regsvr32" "/s" "ccrpbds6.dll"' ExecShell open '"regsvr32" "/s" "ccrpfd6.ocx"' ExecShell open '"regsvr32" "/s" "comct232.ocx"' ExecShell open '"regsvr32" "/s" "comctl32.ocx"' ExecShell open '"regsvr32" "/s" "comctl32.dll"' ExecShell open '"regsvr32" "/s" "comdlg32.ocx"' ExecShell open '"regsvr32" "/s" "comdlg32.dll"' ExecShell open '"regsvr32" "/s" "gdiplus.dll"' ExecShell open '"regsvr32" "/s" "imageviewer2.ocx"' ExecShell open '"regsvr32" "/s" "mbprgbar.ocx"' ExecShell open '"regsvr32" "/s" "tabctl32.ocx"' ExecShell open '"regsvr32" "/s" "threed32.ocx"' SectionEnd ;============================== ; 6.4 加入到「開始選單」 ; ;Section "Add shortcut to Start Menu" SecStartMenu Section "$(S11)" SecS11 SectionIn 1 2 3 SetOutPath "$INSTDIR" CreateDirectory "$SMPROGRAMS\${MUI_PRODUCT}" ; 有時候 CreateShortCut 會出問題,不如用這個動作 ; 直接強制 installer 建立目錄。這樣比較賤。 ; CreateShortCut "$SMPROGRAMS\${MUI_PRODUCT}\Start ${MUI_PRODUCT}.lnk" "$INSTDIR\${PROGMAINEXE}" CreateShortCut $(shtcut_SMlink01) $(shtcut_SMfile01) CreateShortCut $(shtcut_SMlink02) $(shtcut_SMfile02) ; CreateShortCut $(shtcut_SMlink03) $(shtcut_SMfile03) ; CreateShortCut $(shtcut_SMlink04) $(shtcut_SMfile04) ; CreateShortCut "$SMPROGRAMS\${MUI_PRODUCT}\Uninstall ${MUI_PRODUCT}.lnk" "$INSTDIR\Uninstall.exe" CreateShortCut $(shtcut_SMlink20) $(shtcut_SMfile20) SectionEnd ;============================== ; 6.5 加入到「桌面」 ; ;Section "Add shortcut to Desktop" SecDesktop Section "$(S12)" SecS12 SectionIn 1 2 3 ; CreateShortCut "$DESKTOP\${MUI_PRODUCT}.lnk" "$INSTDIR\${PROGMAINEXE}" CreateShortCut $(shtcut_DTlink01) $(shtcut_DTfile01) ; CreateShortCut $(shtcut_DTlink02) $(shtcut_DTfile02) SectionEnd ;============================== ; 6.6 加入到「快速啟動」 ; ; 不是每個程式都要加入「快速啟動」列,視需要而定。 ; 而且祇用在完整安裝。 ;Section "Add shortcut to Quicklaunch" SecQuicklaunch Section "$(S13)" SecS13 SectionIn 3 ; CreateShortCut "$QUICKLAUNCH\${MUI_PRODUCT}.lnk" "$INSTDIR\${PROGMAINEXE}" CreateShortCut $(shtcut_QLlink01) $(shtcut_QLfile01) SectionEnd ;======================================================= ; ■7.寫入解除安裝程式 ;======================================================= ; 如果你嫌太難,可以不寫解除安裝程式,全部 remark 掉。 ;============================== ; 7.1 節段開始 ;Section "Create Uninstaller" SecCreateUninst Section "$(S15)" SecS15 SectionIn 1 2 3 ;============================== ; 7.2 寫入到「註冊表」(基礎) ; ; 一般只有寫下面這一段,指定安裝目錄。 WriteRegStr HKLM "SOFTWARE\${MUI_PRODUCT}" "Install_Dir" "$INSTDIR" WriteRegStr HKLM "SOFTWARE\${MUI_PRODUCT}" "Installer Language" $LANGUAGE ;============================== ; 7.3 寫入到「註冊表」 (* 進階) ; ; 下面這段註冊表值,只是在 {控制台 | 新增移除程式] 花俏用的。 ; 如果看不懂,可以全部不使用。 ; 參考 http://leoboard.cpatch.org/cgi-bin/topic.cgi?forum=2&topic=24&show=0 ; WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}" \ "DisplayIcon" "$INSTDIR\${PROGMAINEXE}" ; 一般使用這個型態。只有 MDaemon 例外。 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}" \ "DisplayName" "${MUI_PRODUCT} ${MUI_VERSION} ${PATCHTYPE_ENU}" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}" \ "DisplayVersion" "${VER_1}.${VER_2}" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}" \ "UninstallString" "$INSTDIR\uninstall.exe" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}" \ "URLInfoAbout" "${URLABOUT}" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}" \ "Contact" "kiiali@cpatch.org" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}" \ "HelpLink" "${URLHELP}" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}" \ "URLUpdateInfo" "${URLUPDATE}" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}" \ "Readme" $(Reg_FILE_README) ;============================== ; 7.4 依照各種語言,自動寫入不同的註冊表值 (* 進階) ; 包括 ENU/CHT/CHS WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}" "Comments" "$(Reg_comments)" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}" "Publisher" "Copyright (c) ${Publisher}" ;------------------------------------------ ;============================== ; 7.6 現在寫入「解除安裝程式」 ; 寫入語言名稱到註冊表 (用於解除安裝程式) WriteRegStr HKLM "Software\${MUI_PRODUCT}" "Installer Language" $LANGUAGE WriteUninstaller "$INSTDIR\Uninstall.exe" SectionEnd ;============================== ; 7.8 顯示「完成」標頭 ;如果不想使用「完成」頁面,在這個巨集之後插入。 ;!insertmacro MUI_SECTIONS_FINISHHEADER ;======================================================= ; ■8.描述功能 ;======================================================= ;============================== ; 8.1 描述功能的巨集 (* 進階) ; ; 如果有描述,最好一個一個加入巨集。 ; 這一段要在所有的 section 之後,否則會出現「變數名稱沒有找到」。 ; 如果 MUI_FUNCTIONS_DESCRIPTION_BEGIN 拆成兩段,會變成重覆呼叫,而導致錯誤。 !insertmacro MUI_FUNCTIONS_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SecS01} $(DESC_SecS01) ; !insertmacro MUI_DESCRIPTION_TEXT ${SecS02} $(DESC_SecS02) ; !insertmacro MUI_DESCRIPTION_TEXT ${SecS03} $(DESC_SecS03) ; !insertmacro MUI_DESCRIPTION_TEXT ${SecS04} $(DESC_SecS04) ; !insertmacro MUI_DESCRIPTION_TEXT ${SecS05} $(DESC_SecS05) !insertmacro MUI_DESCRIPTION_TEXT ${SecS11} $(DESC_SecS11) !insertmacro MUI_DESCRIPTION_TEXT ${SecS12} $(DESC_SecS12) !insertmacro MUI_DESCRIPTION_TEXT ${SecS13} $(DESC_SecS13) !insertmacro MUI_DESCRIPTION_TEXT ${SecS14} $(DESC_SecS14) !insertmacro MUI_DESCRIPTION_TEXT ${SecS15} $(DESC_SecS15) !insertmacro MUI_FUNCTIONS_DESCRIPTION_END ; ;============================== ; 8.2 每個節段的描述文字,直接使用各國語言 ; ; 這是讓滑鼠移動到安裝項目上時,自動出現的描述功能。 ; 我使用 ENU/CHT/CHS 三個語言。如果嫌麻煩,可以只使用一個語言,甚至不使用描述。 ; ●產品的相關說明 (解除安裝的註冊表項) LangString Reg_comments ${LANG_ENGLISH} "Chinese (P.R.C.) and Chinese (Taiwan) ${MUI_PRODUCT} localized version by Kii Ali. The reduced files are saved in a different folder, so your original images are not altered at all. PIXresizer offers several different resizing methods to choose from and can automatically recognize image sizes to calculate the best fit. In addition, it can convert between image formats (JPEG, GIF, BMP, PNG and TIFF), rotate images, convert to grayscale and resize multiple images in batch mode. A great companion for webmasters and digital photographers." LangString Reg_comments ${LANG_TRADCHINESE} "中文 (中國大陸) 與 中文 (臺灣) ${MUI_PRODUCT} 本地化版本,由 Kii Ali 製作。PIXresizer 提供不同重新縮放模式,也可以自動計算影像大小。自動轉換、旋轉、灰階,而且都可以在批次模式工作。" LangString Reg_comments ${LANG_SIMPCHINESE} "笢恅 (笢弊湮翻) 迵 笢恅 (怢俜) ${MUI_PRODUCT} 掛華趙唳掛ㄛ蚕 Kii Ali 秶釬﹝PIXresizer 枑鼎祥肮笭陔坫溫耀宒ㄛ珩褫眕赻雄數呾荌砉湮苤﹝赻雄蛌遙﹜唅蛌﹜閡僅ㄛ奧й飲褫眕婓蠶棒耀宒�恄鞢�" ; ●產品相關 readme (解除安裝的註冊表項) LangString Reg_FILE_README ${LANG_ENGLISH} "file:///$INSTDIR\${README_ENU}" LangString Reg_FILE_README ${LANG_TRADCHINESE} "file:///$INSTDIR\${README_CHT}" LangString Reg_FILE_README ${LANG_SIMPCHINESE} "file:///$INSTDIR\${README_CHS}" ; ●產品相關 readme (安裝的最後一個視窗顯示) LangString FILE_README ${LANG_ENGLISH} "$INSTDIR\${README_ENU}" LangString FILE_README ${LANG_TRADCHINESE} "$INSTDIR\${README_CHT}" LangString FILE_README ${LANG_SIMPCHINESE} "$INSTDIR\${README_CHS}" ; ●SM 開始選單/DT 桌面/QL 快速啟動,依照語言建立捷徑名稱 ; 因為想在桌面上,看到「中文」捷徑名稱的人,實在太多了。所以祇好做了。 ; link 後面當然都可以使用中文名稱。file 的部分,都是實體連結的檔案,當然不要使用中文名稱。 LangString shtcut_SMlink01 ${LANG_ENGLISH} "$SMPROGRAMS\${MUI_PRODUCT}\Start ${MUI_PRODUCT}.lnk" ; LangString shtcut_SMlink02 ${LANG_ENGLISH} "$SMPROGRAMS\${MUI_PRODUCT}\Start UltraCompare.lnk" ; LangString shtcut_SMlink03 ${LANG_ENGLISH} "$SMPROGRAMS\${MUI_PRODUCT}\BlahBlahxxxx.lnk" ; LangString shtcut_SMlink04 ${LANG_ENGLISH} "$SMPROGRAMS\${MUI_PRODUCT}\BlahBlahxxxx.lnk" LangString shtcut_SMlink20 ${LANG_ENGLISH} "$SMPROGRAMS\${MUI_PRODUCT}\Uninstall ${MUI_PRODUCT}.lnk" LangString shtcut_DTlink01 ${LANG_ENGLISH} "$DESKTOP\${MUI_PRODUCT}.lnk" ; LangString shtcut_DTlink02 ${LANG_ENGLISH} "$DESKTOP\BlahBlahxxxx.lnk" LangString shtcut_QLlink01 ${LANG_ENGLISH} "$QUICKLAUNCH\${MUI_PRODUCT}.lnk" LangString shtcut_SMfile01 ${LANG_ENGLISH} "$INSTDIR\${PROGMAINEXE}" ; LangString shtcut_SMfile02 ${LANG_ENGLISH} "$INSTDIR\ucl.exe" ; LangString shtcut_SMfile03 ${LANG_ENGLISH} "$INSTDIR\BlahBlahxxxx.exe" ; LangString shtcut_SMfile04 ${LANG_ENGLISH} "$INSTDIR\BlahBlahxxxx.exe" LangString shtcut_SMfile20 ${LANG_ENGLISH} "$INSTDIR\Uninstall.exe" LangString shtcut_DTfile01 ${LANG_ENGLISH} "$INSTDIR\${PROGMAINEXE}" ; LangString shtcut_DTfile02 ${LANG_ENGLISH} "$INSTDIR\BlahBlahxxxx.exe" LangString shtcut_QLfile01 ${LANG_ENGLISH} "$INSTDIR\${PROGMAINEXE}" LangString mainprog_file01 ${LANG_ENGLISH} "$INSTDIR\ypops.exe" LangString shtcut_SMlink01 ${LANG_TRADCHINESE} "$SMPROGRAMS\${MUI_PRODUCT}\開始 ${MUI_PRODUCT}.lnk" ; LangString shtcut_SMlink02 ${LANG_TRADCHINESE} "$SMPROGRAMS\${MUI_PRODUCT}\開始 UltraCompare.lnk" ; LangString shtcut_SMlink03 ${LANG_TRADCHINESE} "$SMPROGRAMS\${MUI_PRODUCT}\BlahBlahxxxx.lnk" ; LangString shtcut_SMlink04 ${LANG_TRADCHINESE} "$SMPROGRAMS\${MUI_PRODUCT}\BlahBlahxxxx.lnk" LangString shtcut_SMlink20 ${LANG_TRADCHINESE} "$SMPROGRAMS\${MUI_PRODUCT}\解除安裝 ${MUI_PRODUCT}.lnk" LangString shtcut_DTlink01 ${LANG_TRADCHINESE} "$DESKTOP\${MUI_PRODUCT}.lnk" ; LangString shtcut_DTlink02 ${LANG_TRADCHINESE} "$DESKTOP\BlahBlahxxxx.lnk" LangString shtcut_QLlink01 ${LANG_TRADCHINESE} "$QUICKLAUNCH\${MUI_PRODUCT}.lnk" LangString shtcut_SMfile01 ${LANG_TRADCHINESE} "$INSTDIR\${PROGMAINEXE}" ; LangString shtcut_SMfile02 ${LANG_TRADCHINESE} "$INSTDIR\ucl.exe" ; LangString shtcut_SMfile03 ${LANG_TRADCHINESE} "$INSTDIR\BlahBlahxxxx.exe" ; LangString shtcut_SMfile04 ${LANG_TRADCHINESE} "$INSTDIR\BlahBlahxxxx.exe" LangString shtcut_SMfile20 ${LANG_TRADCHINESE} "$INSTDIR\Uninstall.exe" LangString shtcut_DTfile01 ${LANG_TRADCHINESE} "$INSTDIR\${PROGMAINEXE}" ; LangString shtcut_DTfile02 ${LANG_TRADCHINESE} "$INSTDIR\BlahBlahxxxx.exe" LangString shtcut_QLfile01 ${LANG_TRADCHINESE} "$INSTDIR\${PROGMAINEXE}" LangString mainprog_file01 ${LANG_TRADCHINESE} "$INSTDIR\ypops_b5.exe" LangString shtcut_SMlink01 ${LANG_SIMPCHINESE} "$SMPROGRAMS\${MUI_PRODUCT}\羲宎 ${MUI_PRODUCT}.lnk" ; LangString shtcut_SMlink02 ${LANG_SIMPCHINESE} "$SMPROGRAMS\${MUI_PRODUCT}\羲宎 UltraCompare.lnk" ; LangString shtcut_SMlink03 ${LANG_SIMPCHINESE} "$SMPROGRAMS\${MUI_PRODUCT}\BlahBlahxxxx.lnk" ; LangString shtcut_SMlink04 ${LANG_SIMPCHINESE} "$SMPROGRAMS\${MUI_PRODUCT}\BlahBlahxxxx.lnk" LangString shtcut_SMlink20 ${LANG_SIMPCHINESE} "$SMPROGRAMS\${MUI_PRODUCT}\賤壺假蚾 ${MUI_PRODUCT}.lnk" LangString shtcut_DTlink01 ${LANG_SIMPCHINESE} "$DESKTOP\${MUI_PRODUCT}.lnk" ; LangString shtcut_DTlink02 ${LANG_SIMPCHINESE} "$DESKTOP\BlahBlahxxxx.lnk" LangString shtcut_QLlink01 ${LANG_SIMPCHINESE} "$QUICKLAUNCH\${MUI_PRODUCT}.lnk" LangString shtcut_SMfile01 ${LANG_SIMPCHINESE} "$INSTDIR\${PROGMAINEXE}" ; LangString shtcut_SMfile02 ${LANG_SIMPCHINESE} "$INSTDIR\ucl.exe" ; LangString shtcut_SMfile03 ${LANG_SIMPCHINESE} "$INSTDIR\BlahBlahxxxx.exe" ; LangString shtcut_SMfile04 ${LANG_SIMPCHINESE} "$INSTDIR\BlahBlahxxxx.exe" LangString shtcut_SMfile20 ${LANG_SIMPCHINESE} "$INSTDIR\Uninstall.exe" LangString shtcut_DTfile01 ${LANG_SIMPCHINESE} "$INSTDIR\${PROGMAINEXE}" ; LangString shtcut_DTfile02 ${LANG_SIMPCHINESE} "$INSTDIR\BlahBlahxxxx.exe" LangString shtcut_QLfile01 ${LANG_SIMPCHINESE} "$INSTDIR\${PROGMAINEXE}" LangString mainprog_file01 ${LANG_TRADCHINESE} "$INSTDIR\ypops_gb.exe" ; ●安裝前後,對話方塊出現的字串。 ; LangString Str_Begin1 ${LANG_ENGLISH} "blah..." ; LangString Str_Begin1 ${LANG_TRADCHINESE} "blah..." ; LangString Str_Begin1 ${LANG_SIMPCHINESE} "blah..." LangString Str_Finish1 ${LANG_ENGLISH} "Installer found file 'wordfile.txt' existing. You may have customized 'wordfile.txt' for syntax color display. $\n$\n Press [Yes] to use new one overwrite old one, press [No] for no overwriting." LangString Str_Finish1 ${LANG_TRADCHINESE} "安裝程式發現檔案 'wordfile.txt' 存在。或許你有自訂的 'wordfile.txt' ,以便用於語法色彩顯示。$\n$\n按下 [Yes] 使用新版覆寫原有檔案,按下 [No] 不要覆寫。" LangString Str_Finish1 ${LANG_SIMPCHINESE} "假蚾最唗楷珋恅璃 'wordfile.txt' 湔婓﹝麼勍斕衄赻隅砱腔 'wordfile.txt' ㄛ眕晞蚚衾逄楊晇伎珆尨﹝$\n$\n偌狟 [Yes] 妏蚚陔唳葡裔埻衄恅璃ㄛ偌狟 [No] 祥猁葡裔﹝" ; LangString Str_Finish2 ${LANG_ENGLISH} "Setup has been completed successfully . Press [Yes] to continue README file." "${README_ENU}" ; LangString Str_Finish2 ${LANG_TRADCHINESE} "安裝已成功地完成。按下 [Yes] 繼續讀取 README 檔案。" "${README_CHT}" ; LangString Str_Finish2 ${LANG_SIMPCHINESE} "假蚾眒傖髡華俇傖﹝偌狟 [Yes] 樟哿黍�� README 恅璃﹝" "${README_CHS}" ; ●安裝時的 Section LangStringUp desc_InstMin ${LANG_ENGLISH} "Minimum Installation" LangStringUp desc_InstStd ${LANG_ENGLISH} "Standard Installation" LangStringUp desc_InstFul ${LANG_ENGLISH} "Full Installation" LangStringUp desc_InstCHT ${LANG_ENGLISH} "TradChinese Optimal Installation" LangStringUp desc_InstCHS ${LANG_ENGLISH} "SimpChinese Optimal Installation" LangStringUp desc_InstENU ${LANG_ENGLISH} "English Optimal Installation" LangString S01 ${LANG_ENGLISH} "${MUI_PRODUCT} Main Prog" LangString S11 ${LANG_ENGLISH} "Add icon to Start Menu" LangString S12 ${LANG_ENGLISH} "Add icon to Desktop" LangString S13 ${LANG_ENGLISH} "Add icon to QuickLaunch" LangString S14 ${LANG_ENGLISH} "Add function of mouse right-click" LangString S15 ${LANG_ENGLISH} "Create Uninstaller" LangString DESC_SecS01 ${LANG_ENGLISH} "Install ${MUI_PRODUCT} Main Prog. If this item not selected, it will be nothing to install." LangString DESC_SecS11 ${LANG_ENGLISH} "Generally and periodically used program: we will use Start Menu to classify generally." LangString DESC_SecS12 ${LANG_ENGLISH} "Frequently used program: we suggest put their link to Desktop. Begin to work instantly,no need to Start Menu." LangString DESC_SecS13 ${LANG_ENGLISH} "Very frequently used program: we suggest put their link to QuickLaunch" LangString DESC_SecS14 ${LANG_ENGLISH} "Build the context menu and file association, more faster to access your files." LangString DESC_SecS15 ${LANG_ENGLISH} "If you would not want to keep use of this program, you need to build a Uninstaller." LangStringUp desc_InstMin ${LANG_TRADCHINESE} "最小安裝" LangStringUp desc_InstStd ${LANG_TRADCHINESE} "標準安裝" LangStringUp desc_InstFul ${LANG_TRADCHINESE} "完整安裝" LangStringUp desc_InstCHT ${LANG_TRADCHINESE} "繁體中文最適安裝" LangStringUp desc_InstCHS ${LANG_TRADCHINESE} "簡體中文最適安裝" LangStringUp desc_InstENU ${LANG_TRADCHINESE} "英文最適安裝" LangString S01 ${LANG_TRADCHINESE} "${MUI_PRODUCT} 主程式" LangString S11 ${LANG_TRADCHINESE} "加入圖示到開始功能表" LangString S12 ${LANG_TRADCHINESE} "加入圖示到桌面" LangString S13 ${LANG_TRADCHINESE} "加入圖示到快速啟動" LangString S14 ${LANG_TRADCHINESE} "加入滑鼠右鍵功能" LangString S15 ${LANG_TRADCHINESE} "建立解除安裝程式" LangString DESC_SecS01 ${LANG_TRADCHINESE} "安裝 ${MUI_PRODUCT} 主程式。若這一項沒有選擇,就沒有程式可以安裝了。" LangString DESC_SecS11 ${LANG_TRADCHINESE} "一般與偶爾使用的程式:通常都會使用開始功能表來進行分類。" LangString DESC_SecS12 ${LANG_TRADCHINESE} "常用的程式:建議將其連結放在桌面,不必再到開始功能表尋找,馬上就可以開始工作。" LangString DESC_SecS13 ${LANG_TRADCHINESE} "極常使用的程式:建議放在快速啟動。" LangString DESC_SecS14 ${LANG_TRADCHINESE} "建立滑鼠右鍵的系絡選單與檔案關聯,更快速的存取你的檔案。" LangString DESC_SecS15 ${LANG_TRADCHINESE} "萬一日後不想繼續使用此程式時,要預先建立解除安裝程式。" LangStringUp desc_InstMin ${LANG_SIMPCHINESE} "郔苤假蚾" LangStringUp desc_InstStd ${LANG_SIMPCHINESE} "梓袧假蚾" LangStringUp desc_InstFul ${LANG_SIMPCHINESE} "俇淕假蚾" LangStringUp desc_InstCHT ${LANG_SIMPCHINESE} "楛极笢恅郔巠假蚾" LangStringUp desc_InstCHS ${LANG_SIMPCHINESE} "潠极笢恅郔巠假蚾" LangStringUp desc_InstENU ${LANG_SIMPCHINESE} "荎恅郔巠假蚾" LangString S01 ${LANG_SIMPCHINESE} "${MUI_PRODUCT} 翋最唗" LangString S11 ${LANG_SIMPCHINESE} "氝樓芞梓善羲宎粕等" LangString S12 ${LANG_SIMPCHINESE} "氝樓芞梓善袤醱" LangString S13 ${LANG_SIMPCHINESE} "氝樓芞梓善辦厒ゐ雄" LangString S14 ${LANG_SIMPCHINESE} "氝樓扷梓衵瑩髡夔" LangString S15 ${LANG_SIMPCHINESE} "斐膘賤壺假蚾最唗" LangString DESC_SecS01 ${LANG_SIMPCHINESE} "假蚾 ${MUI_PRODUCT} 翋最唗﹝�譭瑲銨鎃棋▲見狡芤閨迣昐翾奿埶終偭芊�" LangString DESC_SecS11 ${LANG_SIMPCHINESE} "都寞迵髒嫌妏蚚腔最唗ㄩ籵都飲頗妏蚚羲宎粕等懂輛俴煦濬﹝" LangString DESC_SecS12 ${LANG_SIMPCHINESE} "都蚚腔最唗ㄩ膘祜蔚む蟈諉溫婓袤醱ㄛ祥斛婬善羲宎粕等脤梑ㄛ鎮奻憩褫眕羲宎�恄鞢�" LangString DESC_SecS13 ${LANG_SIMPCHINESE} "憤都妏蚚腔最唗ㄩ膘祜溫婓辦厒ゐ雄﹝" LangString DESC_SecS14 ${LANG_SIMPCHINESE} "斐膘扷梓衵瑩腔炵釐粕等迵恅璃壽薊ㄛ載辦厒腔溼恀斕腔恅璃﹝" LangString DESC_SecS15 ${LANG_SIMPCHINESE} "勀珨�梣馦銨趧昐鑫墓繫佼昐藡悵皆肴反�斐膘賤壺假蚾最唗﹝" ;======================================================= ; ■9.解除安裝程式,真正的動作 ;======================================================= ; 這個部分,和前面的建立 CreateUninst ,意味不一樣喔。 ; 前者: 把 uninstaller 程式做出來。 ; 後者: 指定這個程式,要刪除那些檔案/目錄/註冊表項。 ;============================== ; 9.1 節段開始 Section "Uninstall" ; 解決 Ultraedit 滑鼠右鍵 ; DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{b5eedee0-c06e-11cf-8c56-444553540000}\InProcServer32" ; DeleteRegKey HKLM "SOFTWARE\Classes\CLSID\{b5eedee0-c06e-11cf-8c56-444553540000}" ; 要移除掉解除安裝程式 Delete "$INSTDIR\Uninstall.exe" ; Delete "$INSTDIR\Uninstall.exe" ; 移除檔案 RMDir /r "$INSTDIR\*.*" ; ; 移除開始功能表、桌面、快遞啟動等捷徑。 Delete "$SMPROGRAMS\${MUI_PRODUCT}\*.*" Delete "$DESKTOP\${MUI_PRODUCT}.lnk" Delete "$QUICKLAUNCH\${MUI_PRODUCT}.lnk" RMDir /r "$SMPROGRAMS\${MUI_PRODUCT}" ; 移除使用過的目錄。 RMDir /r "$INSTDIR" ; 刪除 windows 註冊表之中的安裝路徑 DeleteRegKey HKLM SOFTWARE\${MUI_PRODUCT} ; 刪除 windows 註冊表的解除安裝 DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}" ; 刪除 uninstaller 使用的語言名稱 (* 進階) DeleteRegValue HKLM "Software\${MUI_PRODUCT}" "Installer Language" ExecShell open '"regsvr32" "/u" "ccrpbds6.dll"' ExecShell open '"regsvr32" "/u" "ccrpfd6.ocx"' ExecShell open '"regsvr32" "/u" "comct232.ocx"' ExecShell open '"regsvr32" "/u" "comctl32.ocx"' ExecShell open '"regsvr32" "/u" "comctl32.dll"' ExecShell open '"regsvr32" "/u" "comdlg32.ocx"' ExecShell open '"regsvr32" "/u" "comdlg32.dll"' ExecShell open '"regsvr32" "/u" "gdiplus.dll"' ExecShell open '"regsvr32" "/u" "imageviewer2.ocx"' ExecShell open '"regsvr32" "/u" "mbprgbar.ocx"' ExecShell open '"regsvr32" "/u" "tabctl32.ocx"' ExecShell open '"regsvr32" "/u" "threed32.ocx"' ;顯示「完成」標頭 (* 進階) ; !insertmacro MUI_UNFINISHHEADER SectionEnd ;============================== ; 9.2 解除安裝程式,初始化函式動作 (* 進階) Function un.onInit ;從註冊表取得語言名稱 ReadRegStr $LANGUAGE HKLM "Software\${MUI_PRODUCT}" "Installer Language" FunctionEnd ;======================================================= ; ■eof 檔案結尾