nsis 多语言的使用

 

一 载入默认的界面文本和语言属性

  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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值