• NSIS多语言


    NSIS官方手册多语言介绍

    作为 2 版本的 NSIS 已经完全支持了多语言。一个安装程序的界面可以支持多语言。
    对所有的语言使用 LoadLanguageFile 来载入默认的界面文本和语言属性。
    默认的界面文本可以很容易的使用指令比如 ComponentText 等来更改。
    你也可以在你自己的字串里使用标准语言字串的内容 (例如,$(^Name) 包含了 Name 指令设置的安装程序名称)。所有标准语言字串的名称作为注释列表于语言文件字串的上方。 语言文件在 ContribLanguage Files。
    要建立你自己的语言字串,请使用 LangString。
    使用多语言的一个安装程序例子,请看 languages.nsi。4.10.1 语言的选择
    当安装程序启动时按如下步骤选择界面语言:
    1. 获取用户的默认 Windows 语言
    2. 查找一个最佳匹配的语言
    3. 如果没有最佳匹配的,则查找第一个匹配的语言
    4. 如果没有匹配的,使用脚本里定义的第一个语言 (确认你的第一个语言是一个通用的语言,比如英语)
    5. 如果语言变量 $LANGUAGE 在 .onInit 被更改,NSIS 将重新进行步骤 2 到 4。

    多语言的使用

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

      NSIS有两种引入多语言的方法,其中:

    • 使用缺省模式,引入代码如下
    LoadLanguageFile "${NSISDIR}ContribLanguage filesCzech.nlf"
    LoadLanguageFile "${NSISDIR}ContribLanguage filesDutch.nlf"
    LoadLanguageFile "${NSISDIR}ContribLanguage filesFrench.nlf"
    LoadLanguageFile "${NSISDIR}ContribLanguage filesGerman.nlf"
    LoadLanguageFile "${NSISDIR}ContribLanguage filesKorean.nlf"
    LoadLanguageFile "${NSISDIR}ContribLanguage filesRussian.nlf"
    LoadLanguageFile "${NSISDIR}ContribLanguage filesSpanish.nlf"
    LoadLanguageFile "${NSISDIR}ContribLanguage filesSwedish.nlf"
    LoadLanguageFile "${NSISDIR}ContribLanguage filesTradChinese.nlf"
    LoadLanguageFile "${NSISDIR}ContribLanguage filesSimpChinese.nlf"
    LoadLanguageFile "${NSISDIR}ContribLanguage filesSlovak.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 "$PLUGINSDIRdialog.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官方中文手册 

  • 相关阅读:
    【网易官方】极客战记(codecombat)攻略-游戏开发1-漫游者危险
    【网易官方】极客战记(codecombat)攻略-游戏开发1-军事训练
    【网易官方】极客战记(codecombat)攻略-游戏开发1-取舍
    【网易官方】极客战记(codecombat)攻略-游戏开发1-碾碎它
    【网易官方】极客战记(codecombat)攻略-游戏开发1-斩首老鼠
    课程报名 | 5G时代的视频云服务关键技术与实践
    干货 | 京东云账号安全管理最佳实践
    这大概是今年介绍云原生最清晰明了的文章!
    “大促”背后的技术 | 当我们说促销的时候,我们在谈什么?
    技术沙龙 | 从高并发架构到企业级区块链探索零售创新
  • 原文地址:https://www.cnblogs.com/donfaquir/p/12676470.html
Copyright © 2020-2023  润新知