LabVIEW的控件的标签在程序运行时是不可以修改的。但是标题却是可以在运行时实时修改的。因此我们可以在设计VI的时候,隐藏掉标签Label,显示标题Caption。以标题的内容作为界面元素,这样我们可以通过代码修改各个控件的标题实现多国语言的切换。这种方法当界面上的控件比较多时相对比较复杂,因为每个控件都需要修改标题。这里介绍一个VIPM中的工具——JKI Simple Localization,为我们提供基于修改标题的原理、实现不同语言切换的方法。
首先,打开VI Pacakge Manager ( VIPM ) , 搜索JKI Simple Localization,选中JKI Simple Localization,确认安装到的LabVIEW版本,然后点击Install安装。安装的时候VIPM会自动提示安装相关的其它工具包,许可协议都点确认。
JKI Simple Localization
JKI Simple Localization必要的依赖工具包
依赖工具包,全选,不要取消。可以看到其中有Unicode语言相关的工具包。点击Continue继续:
下载添加资源
安装过程中的许可协议
全部点击Yes同意接受。
安装完成
安装完成后,点击Finish完成。
JKI Simple Localization
JKI Simple Localization已经安装到选择的LabVIEW2020的32位版本中。关闭VIPM。打开LabVIEW2020的32位中文版:
JKI Tools选板
LabVIEW程序框图中出现了JKI Tools函数选板,里面可以看到还有一个JKI Simple Localization的子选板:
JKI Simple Localization的子选板
工具包中,有一个Localization Demo的演示程序,可以先来看一下这个演示程序,可以打开后直接运行:
运行默认显示英语
荷兰语?
中文
程序框图初始化
程序框图事超时
前面板关闭
日期和时间
增量控件
切换语言
显示对话框
退出
在初始化过程中,加载了语言文件Dictionary.json,这是一个词典文件。JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式,可以自行搜索更多详细信息。可以打开查看上面的演示程序的目录,在其目录下打到自带的JSON文件:
Localization DemoJKI_Simple_Localization.vi的位置
Dictionary.json词典文件位置
Dictionary.json文件中的具体内容
从Dictionary.json文件中的具体内容,以及切换语言显示的效果来看,中文明显翻译不正确,出工具包的人中文应该还不如我们的英文水平,可以完全是机翻的。Exit翻译成出口好像也没有问题,虽然我们知道这里应该是退出。
接下来,直接创建一个带事件响应的vi(包含语言值改变事件以及停止事件)“LabVIEW利用标题实现多国语言界面示例.vi”,包含了词典中的描述的几个控件(实际操作时,先创建VI,再根据VI的控件修改词典):
Stop值改变事件
Language值改变事件
所有控件的标签隐藏掉并显示标题
在需要设置多国语言的VI中,点击工具》JKI Simple Localization》Localize This VI…选项,将会生成相应的词典文件:
对当前VI中的控件生成本地化语言词典
保存词典文件
输入语言对话框
保存语言词典时,要求输入语言。例如当前语言是简单中文,增加语言是English。点击OK确定生成词典。
多国语言1.JSON
多国语言2.JSON
JSON词典文件其实很简单,如果按照ini文件来说,那就是两个段。第一段是Languages用于指定当前文件具体包含哪些语言类型。这里的值,也就是语言控件中具体可用的值。然后第二段是Phrase Dictionary短语词典,每个控件对应一个键,键值使用数组来表示,数组值用于描述每个控件在具体语言中的值。生成的词典是根据当前的控件设置的值来设置数组的,所以看到具体的标题数组项,都是一样的。所以,这里得使用文本编辑工具手动修改具体的项。
另外,在确定语言的对话框时,只有两个选项,只添加了两种语言。测试了一下,使用,;这些常见的分隔符尝试添加更多的语言,不成功,只会当成一个语言。所以,如果有更多的语言,需要手动添加。
第三,很多控件内部还有其他选项的,就如语言中的下拉列表、枚举中的下拉列表、布尔量的真、假多行字符显示等。有些控件可以生成语言词典选项,形式是控件标签.属性.项#,如language.Item0这样子的,或者是stop.True这样子的。下拉列表可以生成词典,但是枚举控件却不能生成词典,即使按照同样的方法设置,也不能切换语言。
第四,对于簇控件,是将其中的项逐个处理的,就跟独立控件一样:
错误簇控件中的词典
当VI界面修改了控件名称,可直接修改词典文件中的标签。当VI界面删除了控件,可直接删除词典文件中的标签相关的对象。当VI界面增加了控件,可重新生成新的词典文件,然后将新增的控件相关的对象复制到已经修改好的词典中。
按照Localization Demo的演示程序中的方法,修改上面的VI为下面的框图:
修改后的程序框图
修改后的程序框图2
运行-简体中文
运行-English
运行-日语
从上面的运行效果来看,枚举没有实现多国语言,界面直接输入的文本字符注释,也不能实现多国语言。这里主要是枚举控件并不能在运行时修改相关的选项,可参考LabVIEW的帮助文档“只有在编辑状态才能编辑枚举型控件。可在运行时通过属性节点编辑下拉列表控件”。所以,如果有需要用到枚举的地方,可切换使用下拉列表。下面再来研究一下工具包,这里可能会有些控件类型没有做相应的处理:
打开Set LanguageJKI_ Simple_ Localization.vi>LocalizationFGVJKI simple_ Localization.vi> ApplyLanguageToAlUKI simple Loailzatinvi> LocalizeVUKI_ simple_ Localization.vi> GetControlSpecificLocalizedPhraseJKI simple_ Localization.vi
GetControlSpecificLocalizedPhraseJKI simple_ Localization.vi程序框图
可以看到GetControlSpecificLocalizedPhraseJKI simple_ Localization.vi程序框图中,仅处理了几类控件。
这里可以复制下拉条件结构修改为枚举试试:
修改为枚举
修改为枚举后,后面的Ctrl.Ring.StyleFontJKI_Simple_Localization.vi也是需要改成枚举相关的函数。可以打开函数后另存副本然后改为枚举:
Ctrl.Enum.StyleFontJKI_Simple_Localization.vi
替换Ctrl.Enum.StyleFontJKI_Simple_Localization.vi后的GetControlSpecificLocalizedPhraseJKI simple_ Localization.vi的枚举
这样修改其实都是没有什么问题的,但是在运行时就会出错:
Enum Strings[]的属性并不能写
1073错误表明属性或方法只有编辑模式时可写
和枚举控件类似的,还有选项卡控件,其属性也只是运行时可读的,不能写。这也就意味着所有运行时只读的控件,均不能使用标题或值的方式来处理多国语言显示的问题。
而对于注释字符串,因为其都不属性控件,没有标签、标题等参数。因此也是无法在这里实现这种多国语言切换的。如果必须要有注释,可以考虑使用前面框图中支持的数据类型来曲线救过。例如使用布尔量的真值、假值来注释。或使用列表模式来注释。也可以参考JKI示例中的对话框来处理注释。
另外我们看到控件类型中的字符串,也是不能对值进行多国语言的,因为本身就是显示多国语言的,所以如果是字符串,请直接赋值相关的值即可。组合框输出的值实际上也是字符串,因此组合框的下拉菜单也是不能处理的。
至于其他的控件类型,时间类型、波形图等是可以多国语言的,参考JKI提供的DEMO。总结来看,就是使用工具>JKI Simple Localization>Localize This VI…选项生成词典时,能生成相应键的,那就是可以多国语言化的,即使本身并没有显示内容,也是会生成一个空键;而不能生成键的,那就不可以多国语言,JKI的工具包应该已经处理的比较完整了。
下面我们再来看一下操作系统中未安装的语言包是不是也可以完整支持。为了验证这个多国语言,作者在操作系统中额外安装了中文繁体、日语、朝鲜语等语言包。
系统中安装的语言包
下面来看一个越南语的界面:
越南语=Tiếng Việt
可以看到“越南语”翻译出来就是“Tiếng Việt”,如果我们直接复制这个内容到LabVIEW中作用来显示,是不能正常显示的,只是???乱码的形式:
直接在在LabVIEW中输入越南语并不能正常显示
因为JKI的工具包中还使用到了unicode,那么是不是可以正常显示越南语呢?因为在浏览器翻译时、word中都是可以正常显示的,那么操作系统本身就是可以正常显示的越南语的,即使没有相应的语言包。
修改一下前面的多国语言.JSON文件,添加一个越南语的选项,来看看是不是可以显示:
词典文件添加越南语
LabVIEW前面板切换为越南语时,并不能正常显示
从上面的效果来看,并不能正常的显示越南语。那么安装越南语言包后,能不能正常显示呢?从windows中并没有发现越南语言安装包,只能修改系统中区域和语言相关的内容为越南相关的后再来试一下(参考论坛主题: 如何在LabVIEW上显示多国语言,如藏语、蒙古文、越南文之类的,Unicode显示多国语言,http://visionbbs.cn/thread-28893-1-1.html):
改成越南语后仍然不能正常显示
仅能显示英文
中文显示异常
日语显示异常
这里难道真的是因为不能安装语言包引起的?那么我们来试一下可以安装语言包的,例如泰语:
系统更新中可安装泰国语语言包
未安装泰国语语言包时不能正常显示
这个是什么情况?安装了泰国语言包后,仍然不能正常显示泰国语言。
安装泰语后仍然无法正常显示
将区域和语言设置为泰国泰语,像下拉列表、布尔文本等内容显示正常的泰语,但是标题则仍然显示的不正确。这里连LabVIEW的界面都已经显示正常了,就是不知道为什么标题反而显示不正常。
泰语部分显示正确
这里实在搞不懂是什么原因。为什么日语可以正常显示,越南语、泰国语却不能正常显示。难道是因为LabVIEW本身有支持日文版的?看一下韩语是不是能正常显示,因为LabVIEW也有韩语版的:
韩语不能正常显示
这个就奇怪了,日语可以正常显示,韩语等其他语言就不能显示。
LabVIEW利用标题实现多国语言界面视频号解说