Windows平台下,开发多语言用户界面的
发布时间:2015-07-04 09:16
摘要:一种开发多语言用户界面的实现方法,将需要使用的各种语言信息存储起来,根据用户所选定的语言种类,在窗体加载时,实时动态地加载所需翻译的信息,从而实现了软件界面的多语言。
关键词:多语言;用户界面;多语言信息存储;控件遍历。
在上个世纪六七十年代,计算机软件开发已步入规模化,软件工程也开始应用于软件开发。在这些阶段里,软件开发主要集中在软件开发大国的国内市场,如美国。当软件公司需要将这些软件产品推向国际市场时,如亚非拉美地区,则有必要对原有的软件进行一些修改,使得软件支持当地语言,并且将软件的界面翻译,再投放到相应的当地市场。在我国90年代初,就是因为一些国外软件进入国内市场经常需要做类似的工作,所以出现了一个新名词-"汉化"。而很多人就会问为什么这些软件就不能一开始支持这些中文、日文等语种,一定要有这个市场才进行所谓"汉化"这一步。这其中有两个重要原因:
首先,在当时软件开发多语言应用软件技术不成熟,数据与模块之间的耦合度高。
如果在软件开发阶段即开始考虑多语言应用,工作量增大。而且多语言应用覆盖到软件开发的很多模块,基本上只要是与用户交互的模块都有可能涉及。因此软件复杂度增大、出错机率增多,相应的产品维护工作也增加了。
其次是这些软件产品主要针对同一语种,如英语,而其他语言的应用可能不是重点。在权衡增加这部分的投入和能得到的产出后,很多软件产品放弃了多语言,只有一种语言版本。如果真要进入当地市场,只能要求用户去适应该软件,或者投入一定的人力去进行软件使用培训。特别是一些跨国公司为了保证各不同语言地区的交流,干脆只用统一的一种语言版本,如英语版本。
设计思路:
在程序代码开发中,实现多语言的基本思路都是把文字数据放在程序外部,不同的语言放在不同的文件中,当需要使用的时候在调用相应的文件取出文字数据。
对于任何一种软件产品,在用户面前呈现的信息都体现在用户界面中,而这些信息就是我们在进行多语言软件设计时要处理的对象,实现多语言软件的关键就在于如何灵活地把这些信息转换成对应的语言。一旦我们能在方便并有效地实现多语言的转换,那么前面提到的三个问题基本上就可以忽略不计。那到底如何实现呢,我们从大部分软件开发的实际过程看:用户界面由各种控件对象所组成,而控件的用户界面信息又是通过控件的属性值来体现的,它是由软件生产者在制作软件时设定的。分析用户界面的实现机制,我们提出多语言用户界面的设计思路,如下图所示。
多语言用户界面原理图其具体思路是:首先得到呈现在用户面前的窗口上的各个控件的标识和属性,并把它的属性值单独存放在数据文件中。在逻辑上出现了两个相关的信息载体:一是用户界面;二是用户界面信息数据文件,数据文件与用户界面由控件的标识建立联系,这样实现用户界面信息的多语言化其实就变成了如何实现用户界面与用户界面信息数据文件的映射关系。而我们可以通过一个下拉框的控件来获取用户打算使用的语言(这一部分功能一般出现在进入软件的第一个界面),当选择中文时,软件产品从用户界面信息数据文件中调用中文信息,呈现在用户面前的信息全是中文;当选择英文时,软件产品从用户界面信息数据文件中调用英文信息,呈现在用户面前的信息全是英文;选择其它语言时就调用其它的语言信息。这样,这些数据信息与代码模块之间的耦合度就很低了,一旦需要更改也很方便,只需要更改对应的数据文件,不用改变代码,因此也就不需要重新编译链接代码。
实现方法:
1、语言选择及存储:其基本原理是把用户选择的语言存储起来,在每次需要进行界面信息的语言转换时再取出来,根据软件再进行相应的语言翻译工作。存储的方式有两种:文件和数据库中。
存放在文件中可以选择存放在ini配置文件中,vb对它的读取都有通用的函数,实现起来很方便。例如在ini文件中存放一个值"language=english",在代码中我们就可以通过使用"getprivateprofilestring"函数读取出"english"这个字符串,就可以知道目前是英文版本。如果用户选择使用中文版本,将该ini文件的"language"项设置为"chinese"即可。如此类推,如果把这项工作放到数据库中也一样可以实现。
著名的下载软件"网络蚂蚁",该程序界面的文字数据都保存在ini文件中。根据前一个问题的实现方法,得出用户选择的语言后,再到相应的ini文件中读取翻译的信息。
如果把翻译信息存放在数据库中,其思想与放在文件中大致一样。可以设计一个数据表如下。根据用户选择的语言到不同的字段取出翻译的信息。
3、界面翻译的开始:vb是一种面向过程的语言,在每个窗体开始加载前有一个事件"form_load",该事件可在用户还没有看到窗体的实际界面实现窗体的设计。自然,也就可以改变所有控件显示的信息了。代码如下:
for i = 0 to ‘遍历窗体中所有的控件
select case typename(ls(i))
case "label", "frame", "commandbutton", "checkbox", _
"optionbutton", "checkbox", "togglebutton", "menu"
ls(i).caption = loadcaption(ls(i).caption)
‘更改该控件的显示信息
case else
end select
next
其中主要的思想是:在form_load事件中,遍历该窗体所有的控件,如果该控件是用于显示信息的,既调用翻译函数将相应的翻译信息反馈回来。
4、翻译函数的实现:其格式为:"函数名称(需要翻译的内容)",函数执行完毕后返回一个字符串。其中参数"需要翻译的内容"为英文版本的内容,如"file"。翻译程序的流程图如右图,这样调用该程序时放入一个英文内容,既可以得出相应的翻译内容。
这里需要提醒开发者的是,所有需要翻译的控件信息在界面设计时,都应该是英文的。因为本翻译函数是在查找翻译信息时是以英文信息来检索的,而前面第2步中的"翻译信息的储存和读取",所有的翻译信息是以英文信息来检索翻译后的内容。当然,开发者也可根据自身特点,可自行更改以上模式。但需要注意的是,翻译函数必须要和翻译信息的存储对应上。
三、尚需要注意几个地方:
1、必须允许程序代码能够处理好各种语言字符串。例如支持中文、韩文或日文,必须能够处理双字节;
因此出现了unicode标准,它是一种国际字符编码标准,取代了单字节ascii和单字节ansi等很多字符编码标准。unicode包含了对microsoftwindows、nextstep以及其他厂家使用的ascii和iso8859/1拉丁字符集的一对一的编码映射。最重要的是,在软件开发产生代码时,unicode字符标准为应用程序本地化提供了一个全球的解决方案,解决了许多与多字节支持有关的问题。既:应用程序只需要很小的修改或不用修改就可以支持所有的语言。
2、测试环境的建立:在多语言软件开发中,和别的软件开发相比,另外需要注意的是测试环境的建立。因为多语言软件是运行在不同语言的操作系统上的,因此测试环境也至少是各种语言的windows操作系统。笔者在以往的工作实践中使用vmware来建立测试环境,效果显著。vmware是一种可以让程序员在同一时刻运行多种操作系统的虚拟软件。和用户模式linux不同,vmware允许在同一台机器的一个工作环境中运行不同的操作系统,只要它们是能够在intelx86系列上运行的。因此可以只在一台机器上进行不同环境的测试,而且各种环境之间的切换非常方便快捷,为多语言软件在各种操作系统上的测试提供良好的支持。
3、在设计程序界面时,需要让程序界面能够有足够的空间显示各种语言文字。如某一控件上的中文文字为"数据库",英文为"database",则控件本身的长度一定要能够使得两种文字完全显示,否则软件本身就不合格。这是一个在多语言软件开发中最容易出现的错误。
结束语:
通过以上介绍使用vb开发多语言软件的方法,使我们开发适应国际市场的多语言软件更加容易,且开发成功的软件移植性更强。通过以上实现多语言软件的解决方案,使我们更加认识到多语言软件的实现编程本身并不复杂,关键在于如何采用更合理的方法实现多语言界面。这种实现方法,不仅可应用于vb开发,同样可以适用于vc,delphi等可视化编程语言。欢迎各位读者对本文提出批评建议,提出更好的多语言应用程序解决方案。
关键词:多语言;用户界面;多语言信息存储;控件遍历。
在上个世纪六七十年代,计算机软件开发已步入规模化,软件工程也开始应用于软件开发。在这些阶段里,软件开发主要集中在软件开发大国的国内市场,如美国。当软件公司需要将这些软件产品推向国际市场时,如亚非拉美地区,则有必要对原有的软件进行一些修改,使得软件支持当地语言,并且将软件的界面翻译,再投放到相应的当地市场。在我国90年代初,就是因为一些国外软件进入国内市场经常需要做类似的工作,所以出现了一个新名词-"汉化"。而很多人就会问为什么这些软件就不能一开始支持这些中文、日文等语种,一定要有这个市场才进行所谓"汉化"这一步。这其中有两个重要原因:
首先,在当时软件开发多语言应用软件技术不成熟,数据与模块之间的耦合度高。
如果在软件开发阶段即开始考虑多语言应用,工作量增大。而且多语言应用覆盖到软件开发的很多模块,基本上只要是与用户交互的模块都有可能涉及。因此软件复杂度增大、出错机率增多,相应的产品维护工作也增加了。
其次是这些软件产品主要针对同一语种,如英语,而其他语言的应用可能不是重点。在权衡增加这部分的投入和能得到的产出后,很多软件产品放弃了多语言,只有一种语言版本。如果真要进入当地市场,只能要求用户去适应该软件,或者投入一定的人力去进行软件使用培训。特别是一些跨国公司为了保证各不同语言地区的交流,干脆只用统一的一种语言版本,如英语版本。
设计思路:
在程序代码开发中,实现多语言的基本思路都是把文字数据放在程序外部,不同的语言放在不同的文件中,当需要使用的时候在调用相应的文件取出文字数据。
对于任何一种软件产品,在用户面前呈现的信息都体现在用户界面中,而这些信息就是我们在进行多语言软件设计时要处理的对象,实现多语言软件的关键就在于如何灵活地把这些信息转换成对应的语言。一旦我们能在方便并有效地实现多语言的转换,那么前面提到的三个问题基本上就可以忽略不计。那到底如何实现呢,我们从大部分软件开发的实际过程看:用户界面由各种控件对象所组成,而控件的用户界面信息又是通过控件的属性值来体现的,它是由软件生产者在制作软件时设定的。分析用户界面的实现机制,我们提出多语言用户界面的设计思路,如下图所示。
多语言用户界面原理图其具体思路是:首先得到呈现在用户面前的窗口上的各个控件的标识和属性,并把它的属性值单独存放在数据文件中。在逻辑上出现了两个相关的信息载体:一是用户界面;二是用户界面信息数据文件,数据文件与用户界面由控件的标识建立联系,这样实现用户界面信息的多语言化其实就变成了如何实现用户界面与用户界面信息数据文件的映射关系。而我们可以通过一个下拉框的控件来获取用户打算使用的语言(这一部分功能一般出现在进入软件的第一个界面),当选择中文时,软件产品从用户界面信息数据文件中调用中文信息,呈现在用户面前的信息全是中文;当选择英文时,软件产品从用户界面信息数据文件中调用英文信息,呈现在用户面前的信息全是英文;选择其它语言时就调用其它的语言信息。这样,这些数据信息与代码模块之间的耦合度就很低了,一旦需要更改也很方便,只需要更改对应的数据文件,不用改变代码,因此也就不需要重新编译链接代码。
实现方法:
1、语言选择及存储:其基本原理是把用户选择的语言存储起来,在每次需要进行界面信息的语言转换时再取出来,根据软件再进行相应的语言翻译工作。存储的方式有两种:文件和数据库中。
存放在文件中可以选择存放在ini配置文件中,vb对它的读取都有通用的函数,实现起来很方便。例如在ini文件中存放一个值"language=english",在代码中我们就可以通过使用"getprivateprofilestring"函数读取出"english"这个字符串,就可以知道目前是英文版本。如果用户选择使用中文版本,将该ini文件的"language"项设置为"chinese"即可。如此类推,如果把这项工作放到数据库中也一样可以实现。
2、翻译信息的储存和读取:同样也是有文件和数据库两种存储方式。
著名的下载软件"网络蚂蚁",该程序界面的文字数据都保存在ini文件中。根据前一个问题的实现方法,得出用户选择的语言后,再到相应的ini文件中读取翻译的信息。
如果把翻译信息存放在数据库中,其思想与放在文件中大致一样。可以设计一个数据表如下。根据用户选择的语言到不同的字段取出翻译的信息。
3、界面翻译的开始:vb是一种面向过程的语言,在每个窗体开始加载前有一个事件"form_load",该事件可在用户还没有看到窗体的实际界面实现窗体的设计。自然,也就可以改变所有控件显示的信息了。代码如下:
for i = 0 to ‘遍历窗体中所有的控件
select case typename(ls(i))
case "label", "frame", "commandbutton", "checkbox", _
"optionbutton", "checkbox", "togglebutton", "menu"
ls(i).caption = loadcaption(ls(i).caption)
‘更改该控件的显示信息
case else
end select
next
其中主要的思想是:在form_load事件中,遍历该窗体所有的控件,如果该控件是用于显示信息的,既调用翻译函数将相应的翻译信息反馈回来。
4、翻译函数的实现:其格式为:"函数名称(需要翻译的内容)",函数执行完毕后返回一个字符串。其中参数"需要翻译的内容"为英文版本的内容,如"file"。翻译程序的流程图如右图,这样调用该程序时放入一个英文内容,既可以得出相应的翻译内容。
这里需要提醒开发者的是,所有需要翻译的控件信息在界面设计时,都应该是英文的。因为本翻译函数是在查找翻译信息时是以英文信息来检索的,而前面第2步中的"翻译信息的储存和读取",所有的翻译信息是以英文信息来检索翻译后的内容。当然,开发者也可根据自身特点,可自行更改以上模式。但需要注意的是,翻译函数必须要和翻译信息的存储对应上。
三、尚需要注意几个地方:
1、必须允许程序代码能够处理好各种语言字符串。例如支持中文、韩文或日文,必须能够处理双字节;
因此出现了unicode标准,它是一种国际字符编码标准,取代了单字节ascii和单字节ansi等很多字符编码标准。unicode包含了对microsoftwindows、nextstep以及其他厂家使用的ascii和iso8859/1拉丁字符集的一对一的编码映射。最重要的是,在软件开发产生代码时,unicode字符标准为应用程序本地化提供了一个全球的解决方案,解决了许多与多字节支持有关的问题。既:应用程序只需要很小的修改或不用修改就可以支持所有的语言。
2、测试环境的建立:在多语言软件开发中,和别的软件开发相比,另外需要注意的是测试环境的建立。因为多语言软件是运行在不同语言的操作系统上的,因此测试环境也至少是各种语言的windows操作系统。笔者在以往的工作实践中使用vmware来建立测试环境,效果显著。vmware是一种可以让程序员在同一时刻运行多种操作系统的虚拟软件。和用户模式linux不同,vmware允许在同一台机器的一个工作环境中运行不同的操作系统,只要它们是能够在intelx86系列上运行的。因此可以只在一台机器上进行不同环境的测试,而且各种环境之间的切换非常方便快捷,为多语言软件在各种操作系统上的测试提供良好的支持。
3、在设计程序界面时,需要让程序界面能够有足够的空间显示各种语言文字。如某一控件上的中文文字为"数据库",英文为"database",则控件本身的长度一定要能够使得两种文字完全显示,否则软件本身就不合格。这是一个在多语言软件开发中最容易出现的错误。
结束语:
通过以上介绍使用vb开发多语言软件的方法,使我们开发适应国际市场的多语言软件更加容易,且开发成功的软件移植性更强。通过以上实现多语言软件的解决方案,使我们更加认识到多语言软件的实现编程本身并不复杂,关键在于如何采用更合理的方法实现多语言界面。这种实现方法,不仅可应用于vb开发,同样可以适用于vc,delphi等可视化编程语言。欢迎各位读者对本文提出批评建议,提出更好的多语言应用程序解决方案。
上一篇:“单片机技术与应用”课程标准设计
下一篇:交叉学科及其双语教学的实践和探讨