首页> 中国专利> 在无需修改源代码的情况下本地化JAVA GUI应用的系统和方法

在无需修改源代码的情况下本地化JAVA GUI应用的系统和方法

摘要

本发明提供一种将软件应用的源语言用户界面本地化成目标语言用户界面的方法和系统。该方法包括:在软件应用使用源语言用户界面运行时,从该软件应用的字节码中提取出源语言GUI组件文字,将提取出的源语言GUI组件文字形成一个本地化包文件,将所述本地化包文件中的源语言GUI组件文字翻译成目标语言,再次运行该软件应用时,从翻译的本地化包文件中加载翻译后的GUI组件文字;以及将翻译成目标语言的GUI组件显示在显示屏幕上。通过使用本发明,能够在不知道源代码的情况下本地化JAVA GUI应用,从而为用户使用不是用自己的母语编写的JAVA GUI应用带来了方便。

著录项

  • 公开/公告号CN1885265A

    专利类型发明专利

  • 公开/公告日2006-12-27

    原文格式PDF

  • 申请/专利权人 国际商业机器公司;

    申请/专利号CN200510080938.X

  • 发明设计人 张岭;朱珩;

    申请日2005-06-24

  • 分类号G06F9/45(20060101);

  • 代理机构中国国际贸易促进委员会专利商标事务所;

  • 代理人李颖

  • 地址 美国纽约

  • 入库时间 2023-12-17 18:04:04

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2008-12-31

    授权

    授权

  • 2007-02-14

    实质审查的生效

    实质审查的生效

  • 2006-12-27

    公开

    公开

说明书

技术领域

本发明涉及与图形用户界面有关的技术,更具体地说,本发明涉及在不需要知道源代码和进行重构的情况下对JAVA GUI应用进行本地化的系统和方法。

背景技术

JAVA GUI应用使用图形组件作为图形用户界面(GUI),以便于与用户进行交互。JAVA GUI组件包括按钮、菜单、文本字段、复选框、下拉列表以及其他常见的图形控件。AWT(Abstract WindowToolkit)和Swing是目前普遍使用的两种JAVA GUI框架,它们都包括了所有上述组件,并且能使开发者通过把GUI组件放置在窗口面板中来编写应用。

很多JAVA GUI应用只支持英语作为用户界面语言,因而为非英语国家或地区的人们使用这些应用带来了困难。针对这个问题的一个可能的解决办法是重新编写应用,将与语言相关的字符串提取到一个单独的本地化包中,对该本地化包进行翻译,随后通过重新构建、重新编译等过程使得能够在用户界面窗口中显示翻译后的文本,这也就是传统的本地化过程。这种方法虽然可行,但是成本过高,因为它需要修改很多JAVA源代码并且重新编译整个应用。另外,对于某些传统的JAVA GUI应用而言,其在开发时根本没有考虑到本地化的问题,而且很难获得其源代码,从而也就不可能进行本地化过程。

因此,需要一种能够在不修改源代码的情况下对JAVA GUI应用进行本地化的解决方案。

发明内容

考虑到上述问题,本发明提出了一种能够在不需要知道源代码的情况下本地化JAVA GUI应用的系统和方法,它通过JAVA字节码侦断工具(Bytecode Instrument Tool)和UI表现功能捕获-增强来透明地本地化JAVA GUI应用。经过本地化的JAVA GUI应用能以任何语言显示UI,并且输出文本可以随时被修改成任何其他语言。

根据本发明的一个方面,提供一种将软件应用的源语言用户界面本地化成目标语言用户界面的方法,包括:在软件应用使用源语言用户界面运行时,从该软件应用的字节码中提取出源语言GUI组件文字,将提取出的源语言GUI组件文字形成一个本地化包文件,将所述本地化包文件中的源语言GUI组件文字翻译成目标语言,再次运行该软件应用时,从翻译的本地化包文件中加载翻译后的GUI组件文字,以及将翻译成目标语言的GUI组件显示在显示屏幕上。

根据本发明的另一个方面,提供一种将软件应用的源语言用户界面本地化成目标语言用户界面的系统,包括:提取装置,用于在软件应用使用源语言用户界面运行时,从该软件应用的字节码中提取出源语言GUI组件文字;本地化包文件,用于存储提取出的源语言GUI组件文字,并供将源语言GUI组件文字翻译成目标语言GUI组件之用;加载装置,用于在再次运行该软件应用时,从翻译的本地化包文件中加载翻译后的GUI组件文字,以将翻译成目标语言的GUI组件显示在显示屏幕上。

本发明的原理是在软件应用运行时,捕获相应的函数调用(如,setXXX(string)或构造器),提取其中的文本并将其保存到本地化包文件中。随后,在将本地化包文件从源语言翻译到目标语言之后,在软件应用下次运行时,将从该本地化包文件中加载翻译后的文本,并显示在窗口中。这种方法将所有与UI相关的字符串提取到一个单独的文件中,并读取翻译后的NLS(National Language Support)字符串,以便以自动和透明的方法进行显示。

根据本发明的优选实施方式,还可以对动态字符串以及动态加载的字符串进行翻译。

本发明为用户使用不是用自己的母语编写的JAVA GUI应用带来了方便。如果这样的应用在发售之前没有被本地化、甚至不可能被本地化,那么通过使用本发明,用户能够自己将其中的GUI组件提取出来进行翻译,随后便可以使用具有翻译后的用户界面组件的应用。

通过使用本发明,可以基本上取代传统的高成本的本地化过程。

附图说明

以下通过结合附图的说明,对本发明的上述以及其他优点和特征将变得更加明了。在附图中:

图1描述了根据本发明实施方式的方法的总体流程图。

图2示出了根据本发明实施方式的系统的总体框图。

图3是一个示意图,示意地表示出了在经过根据本发明的系统后,可能会对软件应用的字节码进行哪些改变。

图4表示图1中提取步骤的具体执行步骤的一个例子。

图5表示图1中加载步骤的具体执行步骤的一个例子。

图6描述了对动态字符串进行处理的示意性流程图。

图7描述了对动态加载的GUI组件进行处理的示意性流程图。

图8示出了如图2所示的提取装置的进一步构成。

图9示出了如图2所示的加载装置的进一步构成。

图10示出了在对动态字符串进行处理时,根据本发明系统的进一步结构。

图11示出了在对动态字符串或动态加载字符串进行处理时,根据本发明系统的进一步结构。

具体实施方式

以下将参照附图对本发明的优选实施方式进行详细说明。

应当指出,在本说明书中,将主要使用以英语为源语言、简体中文为目标语言的JAVA GUI应用作为例子进行描述,但是能够理解,本发明只是为用户在不知道源代码的情况下对用户界面组件进行本地化提供了可能,与应用在本地化之前或之后使用怎样的语言不相关。

下面参照图1,其描述了根据本发明的方法的总体流程图。在图1中,假定一个软件应用用户界面的源语言是英语,而以中文作为自己母语的用户更希望将该英语用户界面翻译成中文,以便于使用。

根据本发明的方法在步骤100中开始,随后进入步骤110。在步骤110中,运行使用英语用户界面的软件应用,并在运行时从该软件应用的字节码中逐一提取出GUI组件的文字。在提取了所有可本地化的GUI组件文字后,在步骤120中,将这些GUI组件形成一个本地化包文件,该本地化包文件可以存储在用户的计算机中或者其他适当的位置。接着,在步骤130中,用户可以将所述本地化包文件中的各用户界面组件的文字翻译成中文。随后,在步骤140中,在下一次运行该软件应用时,用户将从翻译的本地化包文件中加载翻译后的GUI组件文字。从而在步骤150中,会将翻译成中文的用户界面组件显示在显示屏幕上。随后,本发明的方法在步骤160中结束。

以下将对图1中的方法所涉及的技术进行详细说明。

首先,如本领域技术人员所知,为了在显示窗口中显示不可编辑的文本,开发人员需要使用诸如AWT Lable或者Swing JLable之类的GUI组件,调用setXXX(string)(例如,setText(string))或者其构造器(新的JLable(string)),方可进行显示。对于编写用户界面时用到的各个GUI组件的JAVA类(例如,TextField、JTextField、Button、JButton、Menu、JMenu、MenuItem、JMenuItem等)而言,都需要使用构造器或者setXXX(string)来在用户界面上显示消息。

上面提到的setXXX(string)表示的是要在用户界面上显示的文字,其在大部分情况下为setText(string),例如“setText(“OK”)”可以是常见的“OK”按钮。构造器(constructor)表示的是在类被初始化时所调用的一段程序,它可以用于定义例如GUI组件的大小、位置等。setXXX(string)和构造器都可以被称为“方法”或被看作一个函数调用。

因此,在图1的步骤110中,通过在JAVA字节码中搜索构造器或者setXXX(string)来实现GUI组件的提取。

其次,所谓“字节码”,是在处理初始源代码时,由编译程序产生的一种计算机程序编码。通过使用JAVA字节码侦断工具可以在字节码中插入一些指令,以便能够在软件程序运行时从中提取出信息。

JAVA字节码侦断是基于JAVA面向方面的编程的基础。JAVA字节码侦断工具使得用户能够在字节码中的任何位置插入指令,以便能够在软件程序运行时从中提取出信息。JAVA字节码侦断工具以静态方式加载JAVA字节码(作为对象加载),或者以动态方法加载JAVA字节码(作为自定义的类加载器加载),并且可以基于JVM(JavaVirtual Machine)规范来侦断字节码。Javaassist和Apache BCEL是目前通用的两种开放源码JAVA字节码侦断工具,但本发明并不局限于此,而是同样适用于其他JAVA字节码侦断工具。

再次,在图1的步骤110中提取需要本地化的GUI组件的过程中,还会用到一个类-方法映射表。

该表存储了类及其文本显示方法之间的映射。例如,对于JLable类而言,其文本显示方法是setText(string)或者新的JLable(string)。为了显示MenuItem,使用setLabel(string)。该映射表可以具有如下所示的形式:

JLable=setText

JLable=JLable

JButton=setText

JButton=JButton

……

在上表第二行的“JLable=JLable”中,等号右侧的JLable表示构造器,其与类具有相同的名称。

类-方法映射表显示了需要进行本地化的类和方法的列表,供侦断字节码时进行判断。在该表中,只有列出的类及其方法才被进行本地化处理。

此外,某些JAVA类可以扩展基本的AWT/Swing窗口组件,因此,它们的类名将是未知的,因而不会包括在类-方法映射表中。这时,可以通过查找该类的超类来找到其需要本地化的方法调用,并最终将超类与AWT/Swing窗口组件的基本类关联起来。由于如何将超类与基本类关联起来并非本发明关心的问题,在此不做详细描述。

综上所述,根据本发明的方法通过使用字节码侦断工具,可以在某个特定类的setXXX(string)方法之前或之后插入特定的指令,以便拦截所述setXXX(string)方法并将其提取出来。所述插入的指令首先捕获将由setXXX(string)方法显示的文本字符串并将其保存到本地化文件中。在捕获并提取了所有可本地化的方法后,将原始软件应用中的所有可翻译字符串以<key=value>的形式转储到一个本地化文件中。其中,“key”是该方法的标识,可以使用该方法所在类名、字符串显示位置、方法名以及方法位置等方式唯一地识别,“value”则是提取的源语言(例如,英文)文本。此后,用户可以将所生成的本地化文件翻译成任何目标语言。

于是,当再次运行该软件应用时,插入的指令将检查所捕获的文本是否在本地化文件中,如果是,则所述插入的指令将用本地化后的GUI组件替换被捕获的文本。从而能够在屏幕上显示翻译后的GUI组件的语言包。

本地化后的JAVA GUI应用可以包含以下三个部分:增强的JAR(JAVA Archive)包、本地化包管理器以及本地化包。

其中,增强的JAR包存储着本地化后的JAVA GUI应用的JAVA代码,含有一系列相关的类和接口。本地化包管理器用于将提取的文本写入位于用户计算机系统中的本地化包文件中,并从该文件中搜索翻译的文本以进行显示。本地化包则存储着本地化后的JAVA GUI应用用户界面组件。

所述本地化包管理器可以通过JAVA字节码侦断工具实现。在JAVA字节码中发现要本地化的GUI组件时,可以使用JAVA字节码侦断工具在该GUI组件的函数调用之前插入指令,以便捕获该函数调用的文本串并保存到本地化包文件中。在进行本地化之后,需要将本地化包管理器添加到原始JAVA GUI应用的类路径中的类,以便原始JAVA GUI应用能够知道在何处需要调用本地化包文件,以使用翻译后的GUI组件。可以将本地化包管理器看作所有侦断指令的集合。本地化包管理器也是唯一一个需要添加到原始JAVA GUI应用的类路径中的类。

图2示出了根据本发明的系统的总体框图。根据本发明的系统200包括一个提取装置210,用于在使用英语用户界面的软件应用运行时,从该软件应用的字节码中提取出GUI组件的文字。所述系统200还包括一个可以位于用户计算机的本地或者任何其他适当位置的本地化包,用于存储由提取装置提取出的各GUI组件的文字,并供用户将其中的各用户界面组件文字翻译成中文之用。根据本发明的系统200还包括一个加载装置230,用于在用户下一次运行该软件应用时,从翻译的本地化包文件中加载翻译后的GUI组件文字,从而可以将翻译后的GUI组件显示在显示屏幕上。

图3示意地表示出了在经过根据本发明的系统后,可能对软件应用的字节码进行了哪些改变。标号310表示本发明的系统框,左侧框320表示未经本发明的系统的本地化过程的字节码,右侧框330表示经过本发明的系统的本地化过程的字节码。

以下将参照图4对图1方法中的提取步骤110做详细描述。进行提取的过程从步骤400开始,随后进入步骤410。在步骤410中,将加载原始JAVA GUI应用的JAR包。接着,在步骤420中,从JAR包中加载JAVA字节码和类-方法映射表,并且在步骤430中,对每个类查找与之匹配的方法调用。如果在步骤440中找到可本地化的方法(“是”分支),则该提取过程进入步骤450,对字节码添加侦断指令,以便能够拦截所述可本地化的方法。接下来,在步骤460中判断是否已对所有类进行了所述查找,如果是,则该提取过程结束,如果否,则该提取过程返回步骤430,继续对其他类查找匹配的方法调用。

另一方面,如果在步骤440中没有找到与某个类对应的可本地化方法(“否”分支),则根据本发明的提取过程直接进入步骤460,以判断是否还需要对剩余的类重复前述操作。

在对所有类执行了上述操作后,该提取过程在步骤470中结束。

以下将参照图5对图1方法中加载步骤130做详细描述。进行加载的过程从步骤500开始,随后进入步骤510。在步骤510中,在执行软件应用的过程中,遇到插入的侦断指令,这意味着有需要显示的GUI组件。于是,在步骤520中,所述侦断指令触发读取例如存储在用户计算机中的本地化包文件。在步骤530中判断,所述需要本地化的GUI组件是否在该本地化包中。如果在步骤530中的判断为“是”,即该本地化包中存在该GUI组件的翻译,则过程进入步骤540,从而加载翻译后的该GUI组件,并在步骤550中在屏幕上显示翻译后的GUI组件。随后,在步骤560中继续执行该软件应用的其他部分。并且该过程在步骤570中结束。

然而,如果在步骤530中的判断为“否”,即该本地化包中不存在该GUI组件的翻译,则该过程进入步骤580,一方面,在显示屏幕上显示使用源语言(例如,英文)的该GUI组件,另一方面,将该GUI组件以<key=value>的形式存储到本地化包文件中,以供随后翻译之用。

如果某个GUI组件只在极少的情况下才出现,那么便可能发生步骤530的“否”分支的情况。当这种情况出现时,可通过步骤580将其提取出来,并将其翻译补充在本地化包文件中。

由此可见,根据本发明的方法和系统在对用户界面进行本地化时,并不要求一次性地完成用户界面组件的翻译,而是可以随着出现新的GUI组件,不断补充和完善翻译文件。

另外,在我们操作计算机的过程中会发现,在用户界面中有一些GUI组件是动态的,其会随软件应用的运行环境、系统状况等的不同而发生改变,我们将这种动态的GUI组件称为动态字符串。通常,动态字符串都是由几个子字符串连接在一起构成的一个字符串,其中一些子字符串是静态的,另一些则是动态的。

例如,在Windows XP操作系统中进行磁盘清理时,可能看到如下动态字符串:

“disk collating”can be used to release 2,374,781KB of diskspace on(C:)

在上述字符串中,““disk collating”can be used to release”以及“KB of disk space on”是静态的,而“2,374,781”和“(C:)”是动态的,会随系统运行的位置和状况不同而发生变化。

能够理解,如果准备按照如前所述的方式将这样的动态字符串原封不动地提取出来并进行翻译,那么当下一次运行系统时,系统状况或运行位置发生了变化,由于本地化包文件中的翻译仍然是对应于上述特定的字符串的翻译,因而不能反映出计算机当前的实际情况。

针对这种情况,本发明提出了如图6所示的方法。

根据本发明的方法在步骤600中开始,随后进入步骤610。在步骤610中,执行对提取出的各GUI组件进行翻译的过程。在步骤620,翻译者发现其中某个要翻译的GUI组件包括动态字符串。接下来,在步骤640中,由翻译者对该动态字符串定义一定的分割策略,以将该字符串中的动态部分和静态部分区别开来。在步骤650中,对该字符串的静态部分进行翻译。然后,在步骤660中,当再次运行系统并遇到该动态字符串的某种变形时,系统可以根据翻译者先前定义的分割规则确定其翻译(例如通过将遇到的字符串与先前提取的字符串进行比照),并显示给用户。根据本发明的方法在步骤660中结束。

应当理解,对于动态字符串而言,组成它的各部分之间的组合关系不会发生变化,变化的只是各部分中的具体内容。

另外,随着计算机系统功能的不断演进,其在操作时与外部程序或系统之间的交互也越来越多,因而某些应用会从外部类(例如,包含基于GUI的编辑器的Eclipse插件)动态加载GUI。由于根据本发明的前述系统和方法在JAVA应用执行前对其进行本地化,因此从网络或其他文件系统下载的未知JAVA类将不能被本地化。

为了解决这一类问题,本发明为用户提供了直接在用户界面中翻译动态字符串的途径。这可以通过图7所示的方法来实现。

对于动态加载的GUI的情况,根据本发明的系统可以添加特定的事件处理器,以便从用户接收关于某个界面显示内容为动态加载GUI的通知。这种事件处理器可以实现为显示屏幕上一个按钮,当用户按下按钮时,则触发该事件处理器,以允许用户直接翻译该GUI。

该方法从步骤700开始,并进入步骤710。在步骤710中,用户界面上显示了未翻译的动态加载GUI。于是,在步骤720中,用户会将此情况通知系统(例如,如上所述,通过按下屏幕上的特定按钮)。在步骤730中,响应于用户的通知,系统将为用户提供翻译该字符串的手段,例如可以弹出一个文本框,供用户在其中输入该动态字符串的翻译。随后,在步骤740中,用户将翻译内容提交给系统。于是,在步骤750中,系统将存储该翻译并显示翻译后的GUI动态刷新。根据本发明的方法在步骤760中结束。

根据本发明的系统可以象对普通的静态字符串那样存储动态加载GUI组件的翻译,以便在下次遇到该动态加载的GUI组件时,系统可以不向用户提供让用户在其中进行翻译的文本框,而是直接将翻译后的该动态加载GUI组件显示给用户。

此外,如图7所示的手动翻译也适用于对前述动态字符串的翻译。

以下将描述与根据本发明的方法过程对应的系统结构。

图8示出了如图2所示的提取装置210的进一步构成。所述提取装置210还包括用于从JAR包中加载JAVA字节码和类-方法映射表的装置810,用于在类-方法映射表中为每个类查找与之匹配的方法调用的装置820,用于在找到匹配的方法调用的情况下,对该方法调用的字节码添加侦断指令的装置830,以及用于判断是否已对每个类查找了与之匹配的方法调用的装置840。

另外,当JAVA类扩展了基本GUI组件而使其类名未知时,所述提取装置210还可包括:用于通过查找该基本GUI组件的超类来找到其需要本地化的方法调用的装置850,以及用于将超类与该GUI窗口组件的基本类关联起来的装置860。

图9示出了如图2所示的加载装置230的进一步构成。所述加载装置230还包括:用于在执行软件应用的过程中,当遇到插入的侦断指令时,读取存储在用户计算机中的本地化包文件的装置910,用于判断所述要显示的GUI组件是否在该本地化包中的装置920,用于在判断所述要显示的GUI组件在该本地化包中时,加载翻译后的该GUI组件的装置930,以及用于在屏幕上显示翻译后的GUI组件的装置940。

另外,在所述用于判断的装置判断所述要显示的GUI组件不在该本地化包中时,所述加载装置230还可包括:用于在屏幕上显示源语言的该GUI组件的装置950;以及用于将该GUI组件提取到本地化包文件中,以进行翻译的装置960。

图10示出了在对动态字符串进行处理时,根据本发明系统的进一步结构。如果发现提取装置210提取出的某个要翻译的GUI组件包括动态字符串,根据本发明的系统还包括一个用于根据预先定义的分割策略,将该动态字符串中的动态部分和静态部分分离的装置1010,用于在对该动态字符串的静态部分进行翻译后,存储所述翻译的装置1020。当再次运行系统并遇到该动态字符串的某种变形时,所述加载装置230包括根据预先定义的分割规则确定该字符串的翻译并显示给用户的装置1030。

图11示出了在对动态字符串或动态加载字符串进行处理时,根据本发明系统的进一步结构。这时,根据本发明的系统包括用于为所述动态字符串或动态加载字符串定义事件处理器,以便从用户接收关于所述动态字符串或动态加载字符串的通知的装置1110,用于响应于从用户接收到通知,为用户提供文本输入途径,以允许用户对所述动态字符串或动态加载字符串进行手动翻译的装置1120,用于存储用户进行的翻译的装置1130,用于在屏幕上显示翻译后的GUI动态刷新的装置1140。

另外,图11所示的根据本发明的系统还可包括一个用于在系统已经存储有关于某个动态字符串或动态加载字符串的翻译时,直接在用户界面上显示该翻译并禁用所述允许用户在其中进行手动翻译的装置1150。

根据本发明的前述各装置可以采用软件代码编程、硬件分立元件或这二者的结合来实现。

以上主要以Windows操作系统中的用户界面组件为例来描述本发明,但是本发明并不局限于此,本发明可以同等地适用于来自其他资源(例如,其他操作系统、应用程序、数据库、网络)的用户界面组件,只要所述资源是使用JAVA的GUI图形组件应用设计的即可。

以上主要以AWT、Swing这两种JAVA GUI框架为例对本发明进行了说明,但是本发明并不局限于此,本发明适用于任何JAVA RichApplication,常见的例子还包括Eclipse SWT。

此外,由于本发明能够在任何基于JAVA类的界面显示技术中工作,因此本发明不仅能处理单独使用某种JAVA GUI框架的应用,而且能处理同时使用各种JAVA GUI框架的混合GUI环境(例如同时使用了AWT、Swing和SWT技术的用户界面)。

以上结合本发明的优选实施方式对本发明的原理进行了说明。上述说明只是示例性的,不应理解为对本发明的任何限制。本领域技术人员可以在上述说明的基础上,对本发明做出各种修改和变形,但这些修改和改进都包括在随附权利要求书中所限定的本发明的范围和精神内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号