分享
 
 
 

Struts辅助开发工具RBManager

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

Struts console就不多说了一用即感觉到方便

下面是一篇摘自IBM中国的关于RBManager使用的文章

Jared Jackson

研究助理, IBM

2000 年 12 月

如今国际高科技市场形成了对全球应用和 Web 提交的内容的需求。随着越来越多的公司试图满足客户需要和国际化其产品和服务,出现了管理技术和资源的难题。本文中,Jared Jackson 讨论了国际化所有基于 Java 的技术的过程,并介绍了 Resource Bundle Manager,这是一种有助于管理开发和维护国际化技术的复杂性的工具。无论是查找代码以开始国际化项目的开发者,还是查找工具以使其小组能够更有效工作的项目经理,都可以在本文中找到他们想查找的东西。

国际化的重要性和困难

据称在五年之内,过半数的因特网用户将不会阅读英语,尽管当前在万维网上大多数信息和营销还没有其它语言版本。日益递增的国际化内容产生了非常显著的作用,为程序员提供了必需的工具和 API 以吸引全球的用户。由于意识到国际化开发进程实际上意味着创建本地化的集成框架,IBM 和 Sun 公司合作开发了国际化组件,它首先集成到 Java API 1.1 版中。

Java 平台上的国际化

Java 1.1 API 包括了 java.text 包和 java.util 包中包含的 ResourceBundle 类,它们与 Locale 类一起组成了 Java 平台上本地化的主干部分。资源束使用级联机制来提供最佳的译文支持,并使开发者的工作量和计算机的资源降到最低。在此方案中,开发者创建了为译文定义查找表的文件,并将编码添加到这些文件的名称中以指定文件的 locale。例如,如果开发者选择使用特性文件来表示查找表,则它们显示如下:

样本特性文件

# The Base Class File

# File Name:

sample.properties

theater = Theater

opera = Opera

orchestra = Orchestra

# English File

# File Name:

sample_en.properties

# British English File

# File Name:

sample_en_UK.properties

theater = Theatre

每个文件都根据 基类+ '_' + 编码 + '.properties' 的约定来命名。本例中,将 基类命名成 sample 。第一个文件表示缺省译文,因此没有给出任何编码信息。该文件中的译文没有限定成任何 locale。附加到其它所有文件名的 编码由表示语言名称、国家和文件所属的 locale 变量的缩写组成。语言和国家缩写基于 ISO 标准,但只有少数 locale 变量有实际标准。为了更好地理解该过程,假设开发者尝试为一个将在美国和英国使用的程序创建资源文件。开发者必须创建一个基类文件 sample.properties ,和一个表示普通英语译文的文件 sample_en.properties 。假设基类文件包含美式英语的译文,那么开发者必须创建包含英式英语译文的文件 sample_en_UK.properties ,或创建一个包含使用欧元符号的英式英语译文的文件 sample_en_UK_EURO.properties 。

在这些资源文件中,以 # 或 ! 字符开头的行都是注释,将被忽略。其它所有行表示名称/值对,等号 (=) 左边是查找表名称,右边是相应的译文值。可在随后的代码示例中看到,Java 程序员可以指定 locale 并在资源束中检索该 locale 的适当译文。如果在文件中找不到与程序员指定的 locale 对应的查找表值,则资源束将不断向下展开编码链,直至找到译文。为了说明这点,假设开发者编写访问上述样本资源文件的代码,并且该代码在 en_UK locale 的上下文中查询 "orchestra" 的译文。API 的内部工作将检查 en_UK 文件,但不会查找资源。接着将检查并查找 en 文件,同样也将忽略资源。最后,将检查基类文件,并返回结果 "Orchestra"。如果程序要寻找 "theater" 的译文,那么将检查 en_UK 资源文件,并立即返回结果 "Theatre"。

该过程中,资源文件可以是空的,也可以是完全饱和的。基类文件必须包含所有查找表键。其它文件也可以与其祖辈大不相同,以利于完整地包括资源。其它 locale 编码可以与其祖辈稍有不同,并且它们的文件只需要全部资源的一小部分就可以正常运行。

资源文件和资源的指数级增长

管理少量文件,且每个资源文件只包含少量资源,这并不是件难事,而且可以通过任何基本文本编辑器来处理。然而,随着项目的增长,复杂程度也急剧上升。当一两个资源文件迅速增加到几个资源文件,并且每个资源文件都有自己的主管翻译时,这时应该怎么做。为了将资源添加到文件,开发者必须访问每个资源文件,确保还没有使用查找表名称,将键插入每个文件,然后以某种方式通知主管翻译:已做了更改,需要更新文件。这是个易出错且费时的过程。

IBM 的 Almaden 研究中心开发了 Resource Bundle Manager,又称作 RBManager,以解决这些问题,并节省开发的时间和费用。该应用程序管理创建和维护资源束的过程,并简化了本地化过程。RBManager 提供了一个直观的 GUI 应用程序,该应用程序可以跨平台工作,以消除国际化开发过程中经常发生的重复任务和错误。

本文的其余部分介绍开发国际化项目的过程,并特别演示了如何使用 RBManager 来增加可靠性和提高国际化开发的效率。首先,描述和显示了一般情况下必需使用资源束的代码。接着,描述了一些与开发者和翻译相关的 RBManager 特性。想要进一步了解 RBManager 功能的开发者可以免费从 IBM 的 alphaWorks 网站下载它。下载中包括了一份详细说明如何使用该工具的文档。

利用 Java 语言的 locale 友好的 API

Java 开发者将高兴地发现对基于 Java 的项目进行本地化是件很容易的事。方法是正确使用 Java 语言中内置的功能。也许本地化 Java 代码最简单的方法是创建一个公共静态类,该类使用 java.util 中的 ResourceBundle 和 Locale 类。请参阅 Translator 类样本代码,它是执行此操作的代码样本。

Translator 类样本代码显示了可以跨多个 locale 工作的 Translator 类必需的最简单的代码。我们不打算实例化这个类;因此对它的所有调用都是静态的。为检索译文,开发者可以对任何键调用 Translator.getTranslation() 方法。可以通过 set 方法更改当前 locale,而且可以扩展代码以提供 get 方法类确定当前定义了哪种 locale。缺省情况下,程序将在所使用的 Java 虚拟机的本机 locale 中运行。以下的示例显示了如何从应用程序中使用代码。

使用 Translator 类

/**

* This function illustrates how a resource bundle is utilized in a Java application.

* The following method is a trivial and illustrative only. It returns three

* entertainment options according to a passed in locale.

*/

public static String[] getEntertainmentOptions(Locale myLocale) {

Translator.setLocale(myLocale);

String options[] = { Translator.getTranslation("theater"),

Translator.getTranslation("opera"),

Translator.getTranslation("orchestra")};

return options;

}

处理上下文翻译

在精心制作译文文件时,所有文件的大小并不总是相同。迄今为止,示例还只是处于单词级。假设程序需要与用户交互以首先确定他们的姓名,然后确定年龄。最简便的方法是定义两个资源对。前者可以由 name_question=What is your name? 表示。后者可以由 age_question=How old are you? 表示。然后这两个短语可以相应翻译到各个资源文件中。但是,假设开发者决定使用第一个问题中获取的信息来使第二个问题更个人化。如果将用户的姓名插入第二个问题,应该放在哪里呢?如果是英语,我们知道应该插在哪里,但其它语言也许将姓名放在不同的位置。

这里就要使用 java.text 包了。这个包(自 JDK 版本 1.1 之后就是它的标准部件)提供一种将上下文插入文本消息的方法。现在,第二个英语资源可以更改成 age_question=How old are you, {0}? 。花括号括起的数字表示有一些未知信息将替换括号和数字。如果需要多个输入项,那么编号是很重要的。

Translation 类的代码需要扩展成处理上下文信息。应该添加以下方法:

上下文翻译代码

// Returns contextually specific translations

public static String getTranslation(String key, String[] lookups) {

if (key == null ) return "";

if (resource_bundle == null) initBundle();

try {

String retStr = resource_bundle.getString(key);

return MessageFormat.format(retStr, lookups);

} catch (Exception e) {

return key;

}

}

介绍 RBManager

项目经理和小组负责人自然倾向于开发者友好的平台。虽然 Java 平台为开发者提供了简洁的国际代码,但隐藏的问题将会在所有环境中影响本地化效果。

从事项目的开发者很少会说应用程序将翻译成的每种语言。要应用程序包含所有必需的资源束,但又要使其大小和复杂程度达到最小,这就形成了前面提到的问题。RBManager 是 IBM 开发的一个基于 Java 的 GUI 应用程序,目前仍是 alpha 版,它给出了一般情况下资源束状态的瞬时视图,并提供了快速且详尽的方法来创建和维护资源束。

在任何时间查看所有文件

开发者在维护资源束时遇到的第一个困难就是过程中涉及的文件数量。一个小组通常采用两种方法中的一种。在第一种方法中,开发者访问所有资源文件,并使用开发者最熟悉的语言将资源插入每个资源文件。然后,资源文件的管理员定期复查它们的文件是否有更改。在第二种方法中,开发者只将资源更新插入基类文件,让管理员自己查找差异。当然,这是个费时的过程,并且容易出错。

RBManager 可以通过一个图形界面将多个文件的多个输入项调整为一个输入项。 图 1 中显示了 RBManager 的图形,它说明了如何用树型视图表示组成资源束的所有资源文件。图中管理的资源束是 RBManager 直接使用的资源束。树型表示反映了翻译查找表的回退顺序。顶层是基类,往下依次是语言、国家层和派生层。

资源文件维护有两个级别:更改会影响资源束包含的每个文件,或者它们只影响一个语言文件。影响每个文件的实例是将新的资源插入资源束。需要在每个资源文件中反映出这个插入,于是这些文件的管理员可以翻译这些资源,或者如果不需要更改,则将它们标记为已翻译。RBManager 能处理这两种情况。如果选择了资源束树的根,则所有更改会在所有文件中反映。如果选择了树中的单一资源文件,则只对该文件进行更改。

在资源进入各个资源文件后,除了基类文件,它将在文件中被标记为未翻译。各个语言文件的管理员可以立即使用 RBManager 查看所有标记为未翻译的资源,不论它们在文件中处于什么位置。

使每个文件立即可用的另一个优点是可以检查错误,如有重复的查找表名称,或者遗漏翻译。使每个语言文件可用确保了在开发周期内没有遗漏任何文件。

图 1. RBManager 的资源束

将元数据添加到资源描述

在传统开发过程中,只有资源文件中包含的数据才是资源,并且有一些常规注释插入到文件中。RBManager 扩展了为每个资源存储的信息,以更准确地反映开发者的意图。这对翻译人员进行正确翻译有很大的帮助,因为他们需要上下文信息,而资源文件通常没有提供这些信息。

RBManager 允许开发者在创建资源时,传达所创建的资源的含义和上下文。要为资源存储以下信息,如文本放在什么位置、具体含义是什么、每对花括号定义什么,以及该资源是否已经翻译。除了这些信息,每个资源被分配给一个组。所添加的资源组的层次结构使资源束的结构更易于理解和浏览。翻译使用 图 2 中显示的窗口来编辑个别资源文件(包含许多资源)中的资源。

图 2. 资源名称、值和元数据

添加这个元数据比翻译人员更有帮助。项目经理和开发者可以查看关于翻译过程状态的最新统计信息。额外的数据也易于以翻译界更常用的格式(如 TMX,一种基于 XML 的翻译文件模式)来导入和导出译文数据。

由于 .properties 文件并不常用元数据,因此需要在文件中有一个新的约定来表示这种数据。以下的代码片段显示了特性文件中为 图 2 显示的资源所增加的代码。虽然该数据增加了文件大小,但由于通常会高速缓存资源值,并没有改变应用程序的性能。

标准特性文件中的资源

version = Version {0}

RBManager 特性文件中的资源

# @translated true

# @created 2000-11-10

# @modified 2000-10-26

# @creator Jared

# @modifier Jared

# @{0} The version number

# @comment The version of this application

version = Version {0}

自给自足

为演示管理和使用资源束的简便,RBManager 有其自己的资源束。 图 1 显示了该资源束的视图,工具用户可以随意编辑资源,只要他们认为合适。他们可以通过选择 选项菜单中的 首选项来修改对应于应用程序的 locale。RBManager 当前有英语、芬兰语、德语和瑞典语版本。 图 3中显示了芬兰语版。

图 3. 芬兰语版的 RBManager 的资源束

RBManager 的未来

欢迎开发者从 IBM 的 alphaWorks 网站上免费下载 RBManager。因为这是第一个 alpha 发行版,所以当前应用程序的所有功能并非都可用。以后将定期在 alphaWorks 网站上张贴应用程序更新,并会包括以下部分或全部附加特性:

将个别特性文件与资源束合并的功能

本机 Java 类文件的导入和导出支持(即 ListResourceBundle)

TMX 格式 XML 翻译文件的导入和导出支持

以文本、HTML 和 XML 格式定期报告资源束统计信息的单独应用程序

在未知特殊译文属于哪个小组的情况下,搜索其资源束和语言文件的功能

使用导入的字典查找推荐译文的功能

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有