• 安装包UI美化之路-nsNiuniuSkin多语言配置


    今天给大家带来的多语言配置功能,算是nsNiuniuSkin的一次质的提升,希望对大家有所帮助。

    nsNiuniuSkin通过自研多语言配置引擎,让安装包的多语言配置不再复杂,直接设置语言翻译配置文件,即可实现安装包整体的多语言切换支持!

    先来看一下英文版本的界面吧:

    背景介绍

    一直以来都说要提供安装包美化控件的多语言支持功能,但一直没有太多时间,即便如此,还是有很多朋友自己通过脚本的配置实现了多语言功能。

    前几天认真看了一下网友们实现的语言功能,也亲自实验了一下,发现纯粹基于脚本的方案有几个缺点:

    • 需要在美化的界面显示前,增加一个语言选择窗口
    • 不同的语言选择后,需要大量的脚本来设置UI上的文本
    • 结合不同的语言,一些变量无法自然的嵌入到翻译文本中

    nsNiuniuSkin多语言实现原理

    基于对这些缺点的考虑,我们认为这不是一个好的多语言方案。所以我立即着手对nsNiuniuSkin的多语言实现方案进行调研与实现,我们的目标是:在非特殊需求下,用户不需要手功的根据语言不同而调整脚本,而是将不同语言的配置全部放到配置文件中。

    经过各种尝试,我们实现了这个目标,能够最大限度的节省安装包开发者在面对多语言时的开发工作量;为了减少在处理多语言时的人工介入,减少脚本的编写,我们参考了NSIS的多语言文件配置,结合nsNiuniuSkin新实现了一个多语言引擎,核心思路如下:

    • 在nsh脚本中通过标记语言[msgid]来指定使用哪个字符串,再由引擎自动切换适配不同的语言

      msgid统一由msg.xxx的格式来表示,比如:

      1. nsNiuniuSkin::SetWindowTitle $hInstallDlg "[msg.productname] [msg.uninstall]"
    • ini文件中,配置[msgid]对应的不同语言下应该使用的语言文字,同时支持内嵌NSIS常量以及其他的[msgid]自动展开

      1) 支持常量,能够无缝的使用NSIS中定义的常量宏,避免在一条消息中需要拼接不同的文字;

      2) 支持[msgid]的嵌套,则可以更灵活的组织不同的消息,避免重复定义与翻译

    • 在xml配置文件中,所有有Text属性显示的控件都增加一个msgid属性,对应ini文件中的消息ID,当切换不同语言时,由nsNiuniuSkin引擎自动将控件的文字设置成[msgid]对应的文字,避免由nsis脚本中逐一设置

      比如:

      <CheckBox name="chkAutoRun" width="95" font="0" msgid="msg.autostart" text="开机自动启动" />
      

      当切换语言时,nsNiuniuSkin会结合当前语言,自动的将[msg.autostart]对应的翻译字符串设置到上述CheckBox上。

      这是我们的实现方案的一个核心特性,能够极大的降低多语言切换时的处理难度

    • 由打包引擎自动根据ini文件生成所有的语言脚本,自动设置到引擎中,避免人工编码

      这是我们的实现方案的另一个核心特性,真正做到只需要配置语言设置文件,打包后就自动匹配到界面上。

    • 根据语言配置文件,智能识别当前语言以及语言种类数量,按最佳方案显示当前语言界面

    • 支持不同语言的许可协议文档,根据当前选择的不同语言,自动显示相应的许可协议

    在实际使用中,只需要配置要翻译的语言文件,将相应语言下的[msgid]进行翻译,一键打包即可。

    nsNiuniuSkin多语言配置方法

    说了这么多,我们来看下实际配置流程,以下以我们的nsNiuniuSkin界面在线设计引擎的安装包为例来说明,只需要简单几步,即可完成:

    1. 在nsi文件中定义不同语言下的产品名称

      这个产品名称,是相对严谨的,后续翻译文本也将引用不同语言下的产品名称,需要谨慎的定义

      1. # ====================== 自定义宏 产品信息==============================
      2. !define PRODUCT_NAME "利洽科技截图控件"
      3. !define PRODUCT_NAME_EN "Leeqia ScreenCapture"
    2. 在lang_name.ini中配置当前有哪几种语言

      1. [lang_names]
      2. 1033=English
      3. 2052=简体中文

      我们基于语言的LanguageID来作为多语言中的标识KEY(比如简体中文是2052,英文是1033),与系统获取到的当前LanguageID匹配,此处我们只提供中文和英文的展示,如果有更多的语言类型,则添加相应的语言ID和对应的语言名称即可(不同语言的LanguageID在网上有很多资料,请自行查阅!)。

    3. 配置不同语言的消息翻译

      中文翻译文件(lang_msg_2052.ini)如下:

      1. [lang_msgs]
      2. msg.title=${PRODUCT_NAME}安装程序
      3. msg.productname=${PRODUCT_NAME}
      4. msg.welcome=欢迎使用
      5. msg.install=快速安装
      6. msg.install_short=安装
      7. msg.cancel=取消
      8. msg.agree=我已阅读并同意
      9. msg.agree1=接受<c #0091FF>《用户许可协议》</c>
      10. msg.licence=《用户许可协议》
      11. msg.autostart=开机自动启动
      12. msg.createshortcut=添加桌面快捷方式
      13. msg.customize=自定义选项
      14. msg.browse=浏览
      15. msg.browsetitle=请选择安装路径
      16. msg.finish=完成
      17. msg.open=打开
      18. msg.installing=正在安装...
      19. msg.back = 返回
      20. msg.uninstall=卸载
      21. msg.uninstall_ex="卸载"
      22. msg.uninstalling=正在卸载...
      23. msg.welcomeback=感谢使用
      24. msg.spaceneed=所需空间:
      25. msg.spcaceleft=剩余空间:
      26. msg.illegalpath=路径非法
      27. msg.illegalpath1=路径非法,请使用正确的路径安装!
      28. msg.alreadyrunwarn=正在运行,请退出后重试!
      29. msg.spacenotenough=目标磁盘空间不足,请使用其他的磁盘安装!
      30. msg.downloading=正在下载安装包...
      31. msg.downloading1=正在下载安装包:
      32. msg.totalsize=总大小:
      33. msg.installnotfinish=安装尚未完成,您确定退出安装么?
      34. msg.uninstallnotfinish=卸载尚未完成,您确定退出卸载么?
      35. msg.notice=提示
      36. msg.readconfigfailed=读取配置文件失败
      37. msg.downloadfailed=下载失败
      38. msg.wrongdownloadsize=初始设定的安装包大小不正确
      39. msg.serverstatuserror=服务器状态错误:
      40. msg.ok=确定

      英文翻译文件(lang_msg_1033.ini)如下:

      1. [lang_msgs]
      2. msg.title=${PRODUCT_NAME_EN} Setup
      3. msg.productname=${PRODUCT_NAME_EN}
      4. msg.welcome="Welcome to use "
      5. msg.install=Install
      6. msg.install_short=Install
      7. msg.cancel=Cancel
      8. msg.agree=I have agreed
      9. msg.agree1=Accept<c #0091FF>《License Agreement》</c>
      10. msg.licence=《License Agreement》
      11. msg.autostart=Auto Start
      12. msg.createshortcut=Add Shortcut
      13. msg.customize=Customize
      14. msg.browse=Browse
      15. msg.browsetitle=Please select install path
      16. msg.finish=Finish
      17. msg.open=Open
      18. msg.installing=Installing...
      19. msg.back = Back
      20. msg.uninstall=Uninstall
      21. msg.uninstall_ex="Uninstall "
      22. msg.uninstalling=Uninstalling...
      23. msg.welcomeback="Thanks to use "
      24. msg.spaceneed=Space Required:
      25. msg.spcaceleft=Space Left:
      26. msg.illegalpath=Illegal Path
      27. msg.illegalpath1=Illegal path, please use the right path!
      28. msg.alreadyrunwarn=is running, please close and retry!
      29. msg.spacenotenough=Splace is not enough, please change to other Disk!
      30. msg.downloading=Downloading...
      31. msg.downloading1="Downloaded: "
      32. msg.totalsize="Total Size: "
      33. msg.installnotfinish=Install is not finished, quit now?
      34. msg.uninstallnotfinish=Uninstall is not finished, quit now?
      35. msg.notice=Notice
      36. msg.readconfigfailed=Read config failed
      37. msg.downloadfailed=download failed
      38. msg.wrongdownloadsize=package size invalid
      39. msg.serverstatuserror="server status error: "
      40. msg.ok=OK

      这里有几点要注意一下:

      • 在引用产品名称常量的地方,不同的语言需要引用不同的常量。

      • 如果有更多的语言类型,则添加相应的语言翻译文件,将消息ID对应的文字进行翻译出来即可。

      • 对于翻译的文字前后带空格的情况,需要用双引号包含起来

      • 在已经应用模板的前提下,有了前面三步已经足够,后面的步骤已经在模板中完成。

    4. 在脚本中将文本替换成使用消息ID

      在我们的模板脚本中,已经替换所有与显示文字相关的脚本,以下仅做示例:

      nsNiuniuSkin::SetControlAttribute $hInstallDlg "instinfo" "text" "[msg.productname]"
      
    5. 在界面配置文件的XML文件中,将文字固定的控件增加msgid属性,由引擎自动进行更新

      在我们的模板脚本中,已经替换所有与显示文字相关的脚本,以下仅做示例:

      1. <CheckBox name="chkAutoRun" width="95" font="0" msgid="msg.autostart" text="开机自动启动" />
      2. <CheckBox name="chkShotcut" padding="20,0,0,0" width="118" font="0" msgid="msg.createshortcut" text="添加桌面快捷方式" />

      按此设置后,相应控件上的文字将自动根据语言配置文件中对应的msgid的文字来进行显示,不需要人为设置。

    6. 使用新的打包引擎,直接进行打包,即可生成带多语言功能的安装包

      在生成过程中,我们会一些与语言设置的相关工作,比如:

      • 生成相应的展开常量宏后的不同语言下的文字,注入安装包引擎
      • 根据根据配置的语言数量,决定是否显示语言选择下拉框
      • 引擎自动识别选择的语言,设置相应控件文字属性

    这里使用者不用再担心配置一种语言和两种以上语言时的UI处理差异,均由我们的多语言引擎自动处理,只有当配置了两种或两种语言以上时,我们才会显示语言选择下拉框。

    整体操作过程是不是很简单呢? 卸载过程中,会自动识别安装时使用的语言,进而使用相应的语言包来显示卸载界面噢!

    在不同语言切换时,实际上我们的nsis脚本需要处理的代码是很少的,主要是用于设置窗口的标题,重新设置许可协议等:要增加新的语言,也不再需要调整脚本,只需要添加新的语言,进行文字翻译即可了。

    1. Function ResetUIByLanguage
    2. nsNiuniuSkin::GetCurrentLangId
    3. Pop $0
    4. nsNiuniuSkin::ResetLicenseFile $hInstallDlg "licence_$0.rtf"
    5. #通过插件得到当前真实的产品名称,后续写注册表,添加快捷方式等会要用到
    6. nsNiuniuSkin::TranslateMsg "[msg.productname]"
    7. Pop $PRODUCT_NAME
    8. nsNiuniuSkin::TranslateMsg "[msg.uninstall_ex]"
    9. Pop $UNINSTALL_NAME
    10. nsNiuniuSkin::AutoChangeControlTextByLanguage
    11. #设置一些在开始界面要修改的功能项
    12. nsNiuniuSkin::SetControlAttribute $hInstallDlg "instinfo" "text" "[msg.productname]"
    13. nsNiuniuSkin::SetControlAttribute $hInstallDlg "welcomeinfo" "text" "[msg.welcome][msg.productname]"
    14. nsNiuniuSkin::SetControlAttribute $hInstallDlg "title" "text" "[msg.productname]"
    15. nsNiuniuSkin::SetWindowTitle $hInstallDlg "[msg.title]"
    16. Call ResetUIByLanguageEx
    17. FunctionEnd

    nsNiuniuSkin多语言安装包效果

    根据上述配置,打出来的安装包效果如下:

    安装界面,自动识别当前语言,同时支持切换不同的语言(轮播图未替换):

    卸载界面,自动识别安装时使用的语言并加以应用:

    您也可以直接安装nsNiuniuSkin界面在线设计引擎来实际看看效果:

    http://www.leeqia.com/download/NSNiuniuSKin_DuiDesigner_Setup.exe

    结语

    在安装包安装过程中,精美的UI往往能让客户对所安装产品的印象更加深刻,更能体现出软件服务商在用户体验上的专注与用心! 希望我们的努力,能够让安装包制作再容易一点,再快乐一点!

    愿天下没有难做的安装包!

  • 相关阅读:
    golang 内存那些事--如何快速分配内存,减少系统 GC (三)
    【算能】se5盒子更改root权限
    202211103-STM8S103F3P6无法下载程序报30200、30004、30006等错误的排查方案
    软件测试基础-测试环境项目部署
    第十三届蓝桥杯模拟赛第三期
    LeetCode 394. 字符串解码(C++)*
    [附源码]java毕业设计新闻发布和评论管理系统
    Java学习第一课
    Git相关知识(1)
    android 多张图片合成一张
  • 原文地址:https://blog.csdn.net/TragicGuy/article/details/128181382