某调度平台国际化语言的解决方案

时间:2022-07-21 05:11:19

某调度平台国际化语言的解决方案

【摘要】随着某调度平台系统的优越的性能和超高的市场满意度越来越多的受到海外客户的关注,因此该系统平台对国际化的支持尤为重要!

【关键词】调度平台系统;语言;国际化;方案

一、引言

目前该系统的国际化的背景主要来自两个方面,其一,系统只支持中文,无法接收、处理、发送其他语言字符集;其二,由于面向的不同的国家地区有着不同的使用习惯,例如时间、日期、货币的表达方式,阅读顺序(从左到右或从右到左)等,因此必须要对软件进行改动,使之能够处理不同的语言文字,提供本地语言信息,支持不同的使用习惯等。而这种修改如果变动大量的源代码,这就违背了软件工程中组件以及重用的思想,会造成升级困难,伸缩性差,不易维护,成本升高等一系列问题。

1.软件的国际化

软件的国际化(Internationaliza—tion),是指不对软件系统使用者做任何假设的开发方法。这包括了使用者的语言,文字编码方式,习惯数据表达方式,书写方向,等。经国际化方法开发的软件可以按特定的地域环境要求改变自身的表现行为,而这仅仅需要软件后期施工人员作少许的配置变更,而不是更改大量的程序源代码。由于不需要重新编译,从而降低了对施工人员的技术要求,更利于开发团队作为一个有机整体进行分工运作。采用了国际化开发方法,系统的本地化就变得较为简单。

一个真正国际化的软件应该满足:(1)数据的透明性,能处理各种类型的语言。(2)编码的独立性,系统对所处理字符的编码方式不作任何限制。(3)单一的源程序,并支持地域数据库。系统的源程序只有一个版本,该版本经编译、连接后,在运行时能根据不同的地域数据库处理与地域相关的数据。在同一系统中,存在多个地域数据库,用户可选择任一个地域数据库。(4)遵循相关的国际标准,保证程序的可移植性。

2.现状

该调度平台国际化语言的开发,从语言翻译的内容上看可分为四个部分:人机界面、数据库表、程序输出和配置文件。

1)人机界面语言翻译,是指界面上标题栏、菜单栏、工具栏、状态栏、界面内的文字标签、各种对话框和属性框中的文字翻译(由用户录入的画面文件内容一般不存在语言翻译的问题),这部分的语言翻译有比较成熟的QT国际化方案的支持,目前已经在开发当中;

2)数据库表的语言翻译,主要考虑的是数据字典表,如表名表、域名表、菜单表(由用户录入的表内容一般不存在语言翻译的问题);

3)程序输出的语言翻译,这里的输出即是指打印在后台屏幕或文件中的日志输出,也是指保存到实时库或商用库中的写库输出,同时也是指一个应用程序到另一个应用程序的交互输出;

4)配置文件的语言翻译,程序输出指的是输出的源头来源于程序本身,这里指的是输出的源头来源于配置文件,所以也必须把好配置文件这一关口,才能使得整个系统得到全方位的语言翻译。

二、软件国际化的现行做法

1.QT国际化

QT提供了国际化语言的支持,其语言翻译的过程是:(1)提取源代码中的待翻译文本;(2)翻译人员对提取的文本进行语言翻译并形成翻译文件;(3)程序运行时将加载该翻译文件并动态查找对应的翻译文本进行替换。

QT提供了三种相关的工具:Lupdate是文本提取工具,提取的文本存放在翻译文件.ts中;Linguist是翻译人员使用的翻译工具,对.ts文件的内容进行翻译;Lrelease对翻译文件.ts进行压缩,形成高压缩比的.qm文件。若要使程序源码中的一个字符串能够被Lupdate所提取,必须将这个字符串放在QT提供的一个静态函数tr()中,才能够被Lupdate工具识别并提取出来。如: saveButton—>setText(tr)"保存"))。运行时如果翻译文件中有翻译字符,则tr()将尝试使用翻译字符来替换字符串文字,否则它将使用原文本。

此方法的缺点在于只适合应用于qt环境,无法在C++环境中使用。

2.Mac国际化

Mac OS X操作系统是一个国际化的操作系统。Mac的国际化通过束(bundle)来实现的。

束是Mac OS X中重要的文件组织形式,里面分开存放了本地化与非本地化资源。束(bundle)是在文件系统中存放可执行代码及与该代码有关软件资源的一种目录。束目录包含资源,资源包括诸如图像、声音以及某些软件使用的本地化字符串等。束(bundle)可包含多个资源组,每一组按语言、地区以及平台对资源进行分组整合。通过将这些资源组和可执行代码集合成一个单一的包,就能创建一个可在任何被支持的平台上正常运行的应用程序、框架或插件的版本。通过使用此模型,能根据用户的语言预置参数自动地本地化应用程序的人机界面。

Mac OS X中束分为三种类型:1)应用程序(application),应用程序包是一个包含了那些对于启动应用程序所必需的资源(包括应用程序可执行文件)的束。2)框架(framework)框架是一个包含了动态共享库和与该库相关的所有资源(例如:头文件、图像以及文档)的束。3)可加载束(loadable bundle)象应用程序一样,可加载束通常包含可执行代码以及相关的资源。

系统根据需要针对不同语言、国家或文化区域来定制或本地化束。实际上,束在运行时究竟使用哪一组本地化资源是由用户决定的。

国际化

.NET通过CLR来实现国际化。当基于.NET开发的应用程序启动时,CLR(CommonLanguage Runtime)将原程序的执行分成了两个步骤:首先CLR会对托管原代码进行即时编译,转化为IL(Interm ediate Language),然后CLR会根据系统开发人员指定的国家或地区设置,从资源包中获取相应的资源文件,最终显示在系统的表现界面上。下图展现了在.NET中实现国际化与本地化的流程,如图1。

4.Unix国际化

Unix国际化可以分成三个部分,如图2所示。

(1)内核的国际化

该层次是指对操作系统的基本组成部分,如设备管理、文件系统进行改造,使之具有独立于具体语言行为的能力。一种典型的实现方法是在内核中采用基于ISO 10646.1标准的宽字符作为字符表示形式。

(2)开发系统的国际化

开发系统一般是指系统为应用软件开发所提供的系统调用、系统函数及相关的工具,它是应用软件国际化的基础,也是国际化的难点和重点。在UNIX开发系统的国际化中,需要对原有的部分函数进行改造或再开发,如字符分类和转换函数,字符串处理函数,正则表达式处理函数,输入输出函数,与时间、数字表示相关的函数及宽字符与多字节字符的转换函数等。一般方法是在保留单字节处理函数的同时,提供宽字节字符的处理函数。

(3)实用程序的国际化

实用程序国际化的基本任务是:在程序中废除各种基于语言的假定,如字符表示(通常假定为ASCII),日期和时间的表示,排序方法,货币单位,数字表示方法等,使相关的处理能独立于语言,并根据运行环境而动态变化。提取提示信息,形成消息类文件。把软件中的提示信息抽取后形成消息类文件,能使提示信息的翻译和改变独立于源程序。

三、某调度系统国际化的解决方案

1.数据库表语言翻译

应用程序中除了界面程序需要国际化外,通常还有较多获取数据库中表中文名、域中文名、菜单名和菜单显示值的代码,获取的中文名要么输出到前台界面上显示,要么输出到后台上打印。因此需要从数据源头上进行控制,本部分主要考虑的是数据字典表的语言翻译,如表名表、域名表、菜单表,由用户录入的表内容一般不存在语言翻译的问题。

对于数据字典表,一个显而易见的方案是增加对应的域用于描述本地化语言,如表信息表中,有表英文名、表中文名,也应该建立对应的表法文名、表葡萄牙名、表阿拉伯名等字段,域信息表和菜单表同样也应该有此类似的字段。但系统源码库中获取table_name_chn的代码多达300多处,获取column_name_chn的代码多达400多处,获取菜单名的地方也非常多,如果采用这种扩展域的方式,意味着这些源码都必须进行改动,工作量比较大,并且每增加一种语言,数据库表结构都将进行改动,不利于程序的稳定和后期的维护。

经过多方咨询,一个比较实际的方案是将数据字典表中的中文字段的内容直接写成本地化语言,如表中文名字段中存储的内容就直接是表法文名、或者是表葡萄牙名、或者是表阿拉伯名,域信息表和菜单表也同样如此。为了便于我们工程上对照维护,再增加一个中文对照域,如表信息表中增加一个域“表中文对照名”,该域仅仅用于工程人员对照识别,同样域信息表中增加一个域“域中文对照名”、菜单表中增加“菜单中文对照名”、“显示值中文对照名”。这样一来,源码中用到table_name_chn、column_name_chn的地方可以无需更改。但采用这种方案对“一套系统同时显示多种语言”的功能实现有较大难度。

2.程序输出语言翻译

除人机界面上的语言翻译外,程序后台输出中的语言翻译也是系统中一个非常重要的部分。这里的输出即是指打印在后台屏幕或文件中的日志输出,也是指保存到实时库或商用库中的写库输出,同时也是指一个应用程序到另一个应用程序的交互输出。这部分的内容在源码中大量出现。

目前采用的一个方案是直接在各自应用程序中判断当前语言环境变量后采用if{}else{}的方式来实现国际化的后台输出,这种方式改动的地方较多,工作量比较大。

事实上,按照QT的翻译原理,完全可以自行设计开发一个公用的动态库进行翻译。详细设计方案如下:

1)源码中统一用DYN_LANG函数来标示所有的待翻译文本;

2)开发一个文本提取程序find_dyn_lang,用于提取源码中所有用DYN_LANG标示的文本,并形成.lang文件;

3)翻译人员对.lang文件进行语言翻译,.lang文件格式如表1。

也可以按照语种的不同存在不同的文件中。

4)DYN_LANG函数实现如下,简单的伪代码:

char * DYN_LANG(const char * src_lang)

{从环境变量中读取当前设置的语言变量;打开.lang文件;查找对应的替换字符串;//这里需要考虑查找效率return dst_lang;}

3.配置文件语言翻译

配置文件作为程序输入的一个源头,也必须对其进行翻译才能使得系统得到全方位的语言翻译,如下登陆对话框中,来自于配置文件中的登陆时长的中文字符,无论是QT的解决方案还是自行设计的DYN_LANG解决方案都无法提取其内容。

由于这部分的内容不是很多,可采用多个配置文件的方式,如user_login_en.ini、user_login_zh.ini、user_login_fr.ini。

程序实现上判断当前设置的语言变量,打开对应的配置文件即可。

4.需要进一步解决的问题

1)程序中有字符串拼接是按照中文规则拼接的,如告警的内容,如果换成英文语法,可能需要调整;

2)程序中对一些中文字符串查找或比较的代码需要小心处理。如“故障告警行为”,中文搜索“故障”两个汉字可以匹配,如果换成英文,一个是英文的形容词,一个是英文名词,将无法匹配,影响程序后续运行逻辑;

3)程序中的字符串长度需要仔细核对,如char str[5]=”刷新”,翻译后的”refresh”将会使长度越界。同样,在界面上设计好的按钮长度翻译成英文后,按钮长度可能不够用。

参考文献

[1]崔启亮.软件本地化成为市场新金矿[J].IT 时代周刊,2004(20):18—19.

[2]马应章.“国际化”“本地化”相辅相成[J].中国计算机用户,1999(7):25—26.

[3]Hirtle S C,Jonides J.Evidence of Hierarchies in Cognitive Maps.Memory &Cognition,1985,13(3):208—217.

[4]王华伟,崔启亮.软件本地化——本地化行业透视与实务指南[M].北京:保捷环球北京公司电子出版社,2005:10—12.

[5]孟岩.苹果Mac OS X,技术重构的成功典范[J].程序员,2005(6):44—45.

上一篇:基于AT89C52单片机的出入管理控制系统的设计 下一篇:基于Lab颜色空间的车牌定位方法