NSIS多語言


NSIS官方手冊多語言介紹

作為 2 版本的 NSIS 已經完全支持了多語言。一個安裝程序的界面可以支持多語言。
對所有的語言使用 LoadLanguageFile 來載入默認的界面文本和語言屬性。
默認的界面文本可以很容易的使用指令比如 ComponentText 等來更改。
你也可以在你自己的字串里使用標准語言字串的內容 (例如,$(^Name) 包含了 Name 指令設置的安裝程序名稱)。所有標准語言字串的名稱作為注釋列表於語言文件字串的上方。 語言文件在 Contrib\Language Files。
要建立你自己的語言字串,請使用 LangString。
使用多語言的一個安裝程序例子,請看 languages.nsi。4.10.1 語言的選擇
當安裝程序啟動時按如下步驟選擇界面語言:
  1. 獲取用戶的默認 Windows 語言
  2. 查找一個最佳匹配的語言
  3. 如果沒有最佳匹配的,則查找第一個匹配的語言
  4. 如果沒有匹配的,使用腳本里定義的第一個語言 (確認你的第一個語言是一個通用的語言,比如英語)
  5. 如果語言變量 $LANGUAGE 在 .onInit 被更改,NSIS 將重新進行步驟 2 到 4。

多語言的使用

一 載入默認的界面文本和語言屬性

  NSIS有兩種引入多語言的方法,其中:

  • 使用缺省模式,引入代碼如下
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Czech.nlf"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Dutch.nlf"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\French.nlf"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\German.nlf"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Korean.nlf"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Spanish.nlf"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Swedish.nlf"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\TradChinese.nlf"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\SimpChinese.nlf"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Slovak.nlf"
 
  • 使用現代化界面,引入代碼如下:
!include "MUI2.nsh"

!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Czech"
!insertmacro MUI_LANGUAGE "Dutch"
!insertmacro MUI_LANGUAGE "French"
!insertmacro MUI_LANGUAGE "Korean"
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "SimpChinese"
!insertmacro MUI_LANGUAGE "Slovak"

二、 提供語言選擇對話框

  多語言引入后,NSIS安裝包是默認根據window系統本地語言環境選擇最匹配語言,如果找不到,展示聲明的第一種語言。
但是有時候需要提供一個多語言對話框(個人感覺多余),多語言對話框可以在安裝程序加載時展示,代碼如下:
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "SimpChinese"

;初始化函數
Function .onInit
  Push ""
  Push ${LANG_ENGLISH} ;添加英文代碼 語言代碼是系統變量,多語言引入后,自動加載,拼接方式是“LANG_語言”,可以查看NSIS手冊,LANG_ENGLISH的編號為1033,LANG_SIMPCHINESE為2052;
  Push "English"
  Push ${LANG_SIMPCHINESE}   ;添加簡體中文選項
  Push "簡體中文"
  Push A ; A means auto count languages for the auto count to work the first empty push (Push "") must remain
  LangDLL::LangDialog "Installer Language" "Please select the language of the installer" ;顯示語言選擇對話框
  Pop $LANGUAGE ;獲得用戶對於語言的選擇結果 ‘$LANGUAGE’是多語言變量,在安裝程序結束后,語言代碼會存儲在這個變量中,手動修改‘$LANGUAGE’的值后,安裝包會重新選擇最匹配的語言,參考最上面NSIS手冊中選擇界面語言步驟
  StrCmp $LANGUAGE "cancel" 0 +2
  Abort
  StrCmp $LANGUAGE 2052 ZH_INI EN_INI
  EN_INI:
    ;想干啥干啥
    Goto END
  ZH_INI:
        ;想干啥干啥
  END:
FunctionEnd

 

三、 在其他函數中使用多語言

    在'.onInit'和“un.onInit”函數中,由於程序處於初始化階段,是沒有多語言環境的,需要手動處理,“手動處理”的方法會在卸載程序多語言設置小節中介紹;程序初始化完成后,在其他函數和界面中,像證書展示界面、一些提示對話框中,可以使用多語言特性,讓程序在不同語言環境下載,展示對應語言的信息。
  下面依據一個自定義函數中的多語言界面說明文字,介紹如何操作;
 (1)聲明自定義字符串
  可以使用LangString關鍵詞聲明多語言字符串
LangString INFO1 ${LANG_ENGLISH} " Prompt message 1"
LangString INFO1 ${LANG_SIMPCHINESE} "提示信息1。

LangString INFO2 ${LANG_ENGLISH} " Prompt message 2"
LangString INFO2 ${LANG_SIMPCHINESE} "提示信息2"

 (2)自定義函數中引入多語言提示詞

Function CustomPageInitFunc
  InstallOptions::initDialog /NOUNLOAD "$PLUGINSDIR\dialog.ini" ;載入界面UI文件
  !insertmacro MUI_HEADER_TEXT $(INFO1) $(INFO2) ;自定義界面說明文字,此處引用的 ‘$(INFO1)‘,‘$(INFO2)’是定義的多語言字符串
  Pop $hwnd
  InstallOptions::show  ;顯示界面  
  Pop $0
  Goto end
FunctionEnd
上面引入的$(INFO1),不同於變量引用,需要使用'$()',而不是'${}'
這是引用多語言字符串,NSIS支持多語言文件(LoadLanguageFile)、多語言字符串(LangString)、許可證書多語言等方式(LicenseLangString),可以參考官方手冊。

四、卸載程序多語言

    卸載程序如果不手動修改'$LANGUAGE '的值,默認根據windows系統語言展示提示信息,但是有很多希望手動控制,可以采用的策略是,在安裝時,將用戶選擇的語言標識存儲注冊表中,待卸載時,讀取注冊表中語言標識,賦值給‘$LANGUAGE’,這樣就可以在‘Section Uninstall’、“Function un.onUninstSuccess”中引用多語言字符串,但是在“un.onInit”中只能手動判斷,不能使用NSIS自帶的多語言機制,因為程序還沒初始化成功。
(1)程序安裝時保存語言標志到注冊表
;初始化函數
Function .onInit
;內容見第二小節(二、 提供語言選擇對話框)
FunctionEnd

Section -Post
  WriteRegStr HKCU ${LANGUAG_FLAG} "language" $LANGUAGE ;保存軟件安裝時選擇的語言 ${LANGUAG_FLAG}是自定義的一個標識字段,可以為任意值
SectionEnd

 

 (2)卸載程序初始化時,獲取語言標志,並手動處理多語言

Function un.onInit
  ReadRegDWORD $LANGUAGE HKCU ${LANGUAG_FLAG} "language" ; 讀取注冊表獲取程序安裝時設置的語言
  StrCmp $LANGUAGE ${LANG_SIMPCHINESE} ZH EN  ; 在un.onInit函數中,多語言只能手動處理
  EN:
    MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to completely remove $(^Name)?" IDYES +2
    Abort
    Goto End
  ZH:
    MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你確實要完全移除 $(^Name)?" IDYES +2
    Abort
    Goto End
  End:
FunctionEnd

(3)卸載過程中使用多語言字符串

Section Uninstall
  ; 檢測程序是否在運行
  FindProcDLL::FindProc "${PRODUCT_NAME}.exe" ;檢測主程序
  IntCmp $R0 1 0 +3
  MessageBox MB_ICONSTOP "$(^Name) $(EXE_RUNNING_WARN)" ;此處的$(EXE_RUNNING_WARN)是聲明的多語言字符串,聲明方法見(第三節 在其他函數中使用多語言-> 聲明自定義字符串)
  Quit
  ; 做些卸載程序的工作
SectionEnd

 

附件:NSIS官方中文手冊 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM