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

news2024/11/16 5:07:41

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

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

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

背景介绍

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

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

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

nsNiuniuSkin多语言实现原理

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

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

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

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

     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文件中定义不同语言下的产品名称

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

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

    [lang_names]
    1033=English
    2052=简体中文
    

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

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

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

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

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

    [lang_msgs]
    msg.title=${PRODUCT_NAME_EN} Setup
    msg.productname=${PRODUCT_NAME_EN} 
    msg.welcome="Welcome to use "
    msg.install=Install
    msg.install_short=Install
    msg.cancel=Cancel
    msg.agree=I have agreed 
    msg.agree1=Accept<c #0091FF>《License Agreement》</c>
    msg.licence=《License Agreement》
    msg.autostart=Auto Start
    msg.createshortcut=Add Shortcut
    msg.customize=Customize
    msg.browse=Browse
    msg.browsetitle=Please select install path
    msg.finish=Finish
    msg.open=Open
    msg.installing=Installing...
    msg.back = Back
    msg.uninstall=Uninstall
    msg.uninstall_ex="Uninstall "
    msg.uninstalling=Uninstalling...
    msg.welcomeback="Thanks to use "
    msg.spaceneed=Space Required: 
    msg.spcaceleft=Space Left: 
    msg.illegalpath=Illegal Path
    msg.illegalpath1=Illegal path, please use the right path!
    msg.alreadyrunwarn=is running, please close and retry!
    msg.spacenotenough=Splace is not enough, please change to other Disk!
    msg.downloading=Downloading...
    msg.downloading1="Downloaded: "
    msg.totalsize="Total Size: "
    msg.installnotfinish=Install is not finished, quit now?
    msg.uninstallnotfinish=Uninstall is not finished, quit now?
    msg.notice=Notice
    msg.readconfigfailed=Read config failed
    msg.downloadfailed=download failed
    msg.wrongdownloadsize=package size invalid
    msg.serverstatuserror="server status error: "
    msg.ok=OK
    

    这里有几点要注意一下:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Function ResetUIByLanguage
   nsNiuniuSkin::GetCurrentLangId
   Pop $0
   nsNiuniuSkin::ResetLicenseFile $hInstallDlg "licence_$0.rtf"
   #通过插件得到当前真实的产品名称,后续写注册表,添加快捷方式等会要用到
   nsNiuniuSkin::TranslateMsg "[msg.productname]"
   Pop $PRODUCT_NAME
   nsNiuniuSkin::TranslateMsg "[msg.uninstall_ex]"
   Pop $UNINSTALL_NAME
   
   nsNiuniuSkin::AutoChangeControlTextByLanguage

   #设置一些在开始界面要修改的功能项 
   nsNiuniuSkin::SetControlAttribute $hInstallDlg "instinfo" "text" "[msg.productname]"
   nsNiuniuSkin::SetControlAttribute $hInstallDlg "welcomeinfo" "text" "[msg.welcome][msg.productname]"
   nsNiuniuSkin::SetControlAttribute $hInstallDlg "title" "text" "[msg.productname]"
   nsNiuniuSkin::SetWindowTitle $hInstallDlg "[msg.title]"
   
   Call ResetUIByLanguageEx
FunctionEnd

nsNiuniuSkin多语言安装包效果

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

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

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

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

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

结语

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/63898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文读懂机智云物联网APP开发

本教程可用于C2 DevKit开发板套件全功能展示&#xff0c;用于对shineblink 的C2 DevKit开发套件全面学习使用&#xff0c;shineblink&及机智云技术交流群&#xff08;234976524&#xff09;。开发板相关的进阶教程及DIY应用将在后续持续更新。教程主要包含以下内容&#xf…

客户案例 | 举重若轻,低代码培育核心业务能力工坊

关键发现 用户痛点&#xff1a;传统套件式项目管理软件在中小企业或业务流程相对简单的企业中适配度低&#xff0c;不够灵活&#xff0c;性价比低&#xff0c;需要一套针对不同业务流程可以灵活配置的、轻量化的项目管理系统。 解决方案&#xff1a;基于西门子低代码开发平台…

六、Git远程仓库操作——创建远程库、推送拉取和克隆远程库等操作

1. 远程仓库介绍 前面的关于git的操作&#xff0c;都是基于本地仓库进行操作的。 但是如果我们想通过 Git 分享自己的代码或者与其他开发人员合作&#xff0c;这时我们就需要将数据放到一台其他开发人员能够连接的服务器上&#xff0c;这台服务器就是代码托管中心&#xff0c…

webpack热更新原理解析

热更新原理 1. webpack-dev-server启动本地服务 这里首先会启动webpack并生成compiler实例&#xff08;compiler实例通过各种事件钩子可以实现监听编译无效、编译结束等功能&#xff09;&#xff1b; 然后会通过express启动一个本地服务&#xff0c;用于服务浏览器对打包资源…

前端中的身份认证

一.Cookie 1.1.HTTP协议的无状态性 HTTP协议的无状态&#xff1a; 客户端的每次HTTP请求都是独立的&#xff0c;之间没有直接关系 服务器不会主动保留每次HTTP请求的状态 1.2.任何突破HTTP无状态的限制 发会员卡 注意&#xff1a; ​ 现实中,会员卡身份认证方式&#xff0c;在…

03 - 调试环境的搭建(Bochs)

---- 整理自狄泰软件唐佐林老师课程 1. Bochs&#xff08;另一款优秀的虚拟机软件&#xff09; 专业模拟x86架构的虚拟机 开源且高度可移植&#xff0c;由C编写完成 支持操作系统开发过程中的断点调试 通过简单配置就能运行绝大多数主流的操作系统 2. Bochs的安装与配置 下载…

[附源码]计算机毕业设计社区人员信息管理系统设计与实现Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

HRB系列直流隔离可调电源模块:用20K电位器和200K电位器区别

今天俞霖科技小编简谈如何合理地选用DC-DC模块电源&#xff0c;本文将从DC-DC模块电源开发设计的角度来简谈以上问题&#xff0c;以供广大技术设计人员参考。 DC-DC模块电源的众多优点是大家众所周知的&#xff0c;DC-DC模块电源以其体积小巧、性能卓异、使用方便的显著特点&a…

ArcGIS API For JavaScript(8)之使用动态图层dynamicLayers实现多图层合并截图

场景还原&#xff1a; 定位某个矢量图斑范围面&#xff0c;过滤展示该图斑&#xff0c;以图斑为中心&#xff0c;截图图斑周边并附带影像底图的截图。 在前端要实现地图截图&#xff0c;首先想到的是使用arcgis rest api中的export接口&#xff0c;这是没问题的&#xff0c;exp…

工业物联网关-modbus数据采集程序(1-程序设计)

写代码之前 最近代码写慢了&#xff0c;磨了好久都没开始动手写代码。考虑的东西越多越多&#xff0c;甚至自己都认为过虑了。就像这个程序&#xff0c;写代码之前估计花了大半天或者一天在思考怎么写&#xff0c;不知道是好事还是年纪大了。所以专门写篇文章&#xff0c;把自…

为什么要选择 Redis?

文章目录前言一、选型二、协议三、客户端1、常见 java 客户端2、常见可视化工具&#xff1a;四、Redis 生态1、模块2、代理3、其他前言 Redis&#xff08;Remote Dictionary Server&#xff09;&#xff0c;即「远程字典服务」是一个使用 ANSI C 编写的、开源的、支持网络的、…

【电力系统】基于YALMIP 的微网(光伏+风电+蓄电池+微电网+柴油机)优化调度模型附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Unity—UGUI

每日一句&#xff1a;读数、学习 去更远的地方&#xff0c;才能摆脱那些你不屑一顾的圈子 目录 InputFiled输入框 例&#xff1a;用户名和密码 Toggle组件 案例&#xff1a;冷却效果 InputFiled输入框 Text Component 输入文本组件 Text输入内容 Character Limit 输入字符…

宝塔后渗透-添加用户_反弹shell

更新时间&#xff1a;2022年11月21日 1. 背景介绍 对于想拿到bt后台来说&#xff0c;非常的艰难&#xff1a;无非是通过bypass之后提权&#xff0c;直接拿到服务器的root权限&#xff0c;然后再去宝塔后台。 当然&#xff0c;还有一种运气十分爆棚的方法&#xff1a;发现了b…

Qt的Q_UNUSED()函数的功能

目录Qt Assistant&#xff08;Qt 助手&#xff09;构建场景其他一些平替方法参考Qt Assistant&#xff08;Qt 助手&#xff09; 函数名直译过来是【不用的&#xff1b;从未用过的】。 碰到陌生的函数不要慌&#xff0c;直接Qt Assistant查一哈。 Q_UNUSED(name) Indicates to …

负载均衡器 OpenELB ARP 欺骗技术解析

作者&#xff1a;大飞哥&#xff0c;视源电子运维工程师&#xff0c;KubeSphere 用户委员会广州站站长&#xff0c;KubeSphere Ambassador。 K8S 对集群外暴露服务有三种方式&#xff1a;NodePort&#xff0c;Ingress 和 Loadbalancer。NodePort 用于暴露 TCP 服务(4 层)&#…

基于5G智能网关的水泵远程监控系统方案

方案背景 水泵作为一种常见的水务设备&#xff0c;在日常的生产、生活中发挥重要的作用。为了保证生产、生活用水&#xff0c;也为了预防异常天气带来的过度降水&#xff0c;水泵具备的供水、排水作用都是不可忽视的。然而&#xff0c;很多地区的水泵管理模式依然停留在专人看…

毕业设计-基于机器视觉的手写字识别系统

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

变焦镜头内参数如何获得?

很多时候,我们是使用相应的棋盘格标定进行相机内参数的获取,但是对于相机而言,如果要是焦距范围是测量比较远的物体,那么我们要进行注意相应的内参数就是不能够使用棋盘格标定法进行获取,因为不准. 由于项目的需要,这里我就是需要进行探究一下,如何通过自己调试直接设定内参数…

CSS 实现卡片边框渐变动画

前言 &#x1f44f;CSS实现卡片边框渐变动画&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现步骤 父容器添加背景渐变色 <div class"card"></div>.card {background: linear-gradient(0deg, …