全球化 Eclipse RCP 应用程序

级别: 初级

Wei Wang (wangweiu@cn.ibm.com ), 软件工程师, IBM, Software Group
Yuan Yao Deng (dengyy@cn.ibm.com ), 软件工程师, IBM

2009 年 7 月 27 日

Eclipse Rich Client Platform (RCP) 逐渐在软件开发方面获得了广泛的认可。对于跨国公司来说,为世界范围内的客户交付支持多语言的软件变得越来越重要。通过本文,您可以学习到如何在 RCP 应用程序中全球化用户界面(UI)元素,包括窗口、菜单、工具栏、对话框、欢迎页面、闪屏和标准 Eclipse UI 元素。样例应用程序 Hello World 将向您演示整个流程。

简介

Eclipse Rich Client Platform(RCP)有着许多优势,如开发迅速、自然的感观、可扩展性和多平台支持。许多公司都采用 RCP 来开发他们的软件。对于跨国公司来说,要把软件出售给世界各地的用户,交付支持多语言的软件正变得越来越重要。全球化是 RCP 软件开发的关键部分。通过使用 Hello World 样例,学习如何全球化一个 RCP 应用程序的 UI。

 




回页首


样例应用程序

本文的样例将使用一些简单的功能实现 Hello World 应用程序全球化。图 1 显示的是 Hello World 应用程序的主 UI。


图 1. Hello World RCP 应用程序
Hello World RCP 应用程序

当您单击 File 菜单中的 Say Hello 时,将会弹出一个对话框 “Hello! This is a sample!”。打开应用程序或者单击帮助菜单里的 Welcome ,欢迎页面将出现在主 UI 上,提供一些介绍性信息。单击帮助菜单里的 About Hello World 将会显示应用程序和版本信息。这就是它的功能 — 非常简单。

Hello World 应用程序是由 Eclipse V3.4.1 创建,它以 “RCP application with an intro” 模板为基础,并遵循插件项目向导的步骤。完成向导后,需要一些附加代码。请参考本样例的源代码,您可以 下载 获得。本文的焦点在于全球化,因此,本文不会讨论实现其他功能的代码。

完成 Hello World 代码的编写后,默认情况下只支持英语。需要为此应用程序添加多语言支持。需要进行全球化的 UI 元素包括菜单、工具栏、对话框、闪屏、欢迎页面、插件和产品信息,以及标准的 Eclipse UI 元素。

 




回页首


常见资源包

同其他的 Java™ 应用程序一样,需要为 RCP 应用程序创建一个资源包。在本样例中,资源包放在 helloworld.resource 包中,并且命名为 “custom”。资源包文件名必须符合 Java 资源包的命名惯例:<resource_name>_<Language Code>_<Country Code>.properties 。例如,custom_fr.properties 是用于法语的资源包,而 custom_zh_CN.properties 是简体中文的资源包。更多有关语言和国家代码的信息,请参见 参考资料 。图 2 显示的是 Hello World 的资源包。


图 2. 资源包结构
资源包结构

资源包文件包含了键/值对。这些键能够惟一地识别资源包中特定于位置的对象。需要对每个想要全球化的 UI 元素创建一个键/值。清单 1 显示了用于英语的属性文件。


清单 1. 资源包文件 custom_en.properties 的内容

				
MAIN_WINDOW_TITLE=Hello World
MENU_FILE=&File
MENU_FILE_SAY_HELLO=Say Hello
MENU_HELP=&Help
DIALOG_TITLE=Hello
DIALOG_MESSAGE=Hello! This is a sample!

 

现在,您需要一个实用程序来读取资源包。如清单 2 所示,CustomString 类提供了两个功能:

  • setBundle 根据位置初始化一个资源包对象。
  • getString 用指定的语言返回一个给定键的值。


清单 2. 用于读取资源包(CustomString.java)的实用程序

				
public class CustomString {
private static final String BUNDLE_NAME = "helloworld.resource.custom";
private static ResourceBundle rb = null;

public static void setBundle(Locale locale) {
try {
rb = ResourceBundle.getBundle(BUNDLE_NAME, locale);
} catch (Exception e) {
rb = ResourceBundle.getBundle(BUNDLE_NAME, Locale.ENGLISH);
}
}

public static String getString(String key) {
try {
String keyValue = new String(rb.getString(key).getBytes(
"ISO-8859-1"), "UTF-8");
return keyValue;
} catch (Exception e) {
return key;
}
}

}

 

资源包和实用程序准备就绪后,要通知应用程序在启动时应该使用哪种语言。Application.java 是 RCP 应用程序的入口。建议使用 start() 方法初始化资源包。Locale.getDefault() 返回默认系统位置,如下所示,然后返回的位置会被传递给 CustomString.setLocale() 中。应用程序将使用系统位置初始化资源包。


清单 3. 在 Application.java 中设定位置

				
public Object start(IApplicationContext context) {
CustomString.setLocale(Locale.getDefault());
...
}

 

常用资源包现在可以用于整个应用程序。下面的小节将讲解如何在 UI 里调用资源包。

 




回页首


工具栏、菜单和对话框

在一个 RCP 应用程序里,菜单和工具栏条目是以动作的形式表示。菜单和工具栏可以使用代码或者扩展进行添加。我们的样例使用代码注册菜单动作。在动作定义类里,使用 setText() 方法在构造函数里对动作标签进行定义。文本将以菜单标签的形式显示。如您所见,现在文本只针对英语进行硬编码。修改过的代码在 setText() 方法中使用资源包替代 “Say Hello”


清单 4. 在 HelloAction.java 中为菜单和工具栏设置动作文本

				
public HelloAction(IWorkbenchWindow iworkbenchwindow) {
this.window = iworkbenchwindow;
this.setText("Say Hello");
this.setImageDescriptor(WorkbenchImages.
getImageDescriptor(IWorkbenchGraphicConstants.IMG_VIEW_DEFAULTVIEW_MISC));
// Must setId,otherwise can not leverage Register method
setId("helloworld.actions.HelloAction");
window.getSelectionService().addSelectionListener(this);
}

/**
Modified Code
**/
public HelloAction(IWorkbenchWindow iworkbenchwindow) {
....
this.setText(CustomString.getString("MENU_FILE_SAY_HELLO"));
....
}

 

对话框可以用不同代码在 UI 上显示文本,但是,全球化方法是相同的。您可以使用同样的方法把由 Java 代码生成的其他 UI 进行全球化 — 这并不局限于菜单、工具栏和对话框。


清单 5. 设置对话框标题和消息

				
MessageDialog.openInformation(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
"Hello",
"Hello! This is a sample!"
);

/**
Modified Code
**/
MessageDialog.openInformation(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
CustomString.getString("DIALOG_TITLE"),
CustomString.getString("DIALOG_MESSAGE")
);


目前为止,UI 的全球化和典型的 Java 应用程序基本相似。下一小节将介绍 RCP 应用程序的特征。




回页首


闪屏

闪 屏是应用程序加载时出现的一个图片。它通知用户应用程序正在加载,并且提供产品名和版权等应用程序信息。通常,在 RCP 应用程序中,闪屏被命名为 splash.bmp,并放在插件项目的根文件夹下。然而,放在根文件夹下的 splash.bmp 仅适用于英语。要想在一个多语言的应用程序中根据不同的语言提供不同的闪屏,需要遵循闪屏的路径规则。图 3 给出了一个示例。

把插件项目的根文件夹命名为 <plugin-root> 。必须把 splash.bmp 放在 <plugin-root> /nl/<Language Code>/<CountryCode> 下。例如,需要把用于简体中文的闪屏文件放在 <plugin-root> /nl/zh/CN。


图 3. 闪屏路径规则
闪屏目录结构




回页首


欢迎页面

欢 迎页面的特性是由 org.eclipse.ui.intro 插件提供的。可以通过定义专门的页面,把产品介绍给新用户。欢迎页面在产品首次启动时显示,它也是一个向用户介绍产品功能的途径。RCP 欢迎页面由一个介绍性的内容文件和页面文件(HTML、图片、CSS 等等)组成。

对于每种语言都可能准备了一组页面文件,因 此,需要根据位置使用不同的 introContent.xml 指向不同的欢迎页面。plugin.xml 引用了介绍性内容文件。把 plugin.xml 中的介绍性内容文件的名称提取为外部字符串。外部字符串存放在一个属性文件中,该文件的命名惯例为 plugin_<Language_Code>_<Country_Code>.properties。图 4 显示了这些文件之间的关系。


图 4. 完成全球化的欢迎页面之间的关系
完成全球化的欢迎页面之间的关系

清单 6 中的代码片段来自于 plugin.xml。变量 %welcome.page 用于内容属性,而不是用于硬编码的文件名 introContent.xml。文件的真实名称放在了一个属性文件里,以便 plugin.xml 根据位置找到相关的内容文件。


清单 6. plugin.xml 的欢迎页面部分

				
<extension
point="org.eclipse.ui.intro.config">
<config
introId="helloworld.intro"
content="%welcome.page"
id="HelloWorld.configId">
<presentation
home-page-id="root">
<implementation
kind="html"
os="win32,linux,macosx">
</implementation>
</presentation>
</config>
</extension>

 

以汉语为例。用户在汉语环境下启动 Hello World 应用程序时,plugin.xml 将会找到汉语的外部字符串文件 plugin_zh_CN.properties,并且会根据属性文件里的键名 welcome.page 获得文件名。如下所示,汉语的内容文件 introContent_zh_CN.xml 将被使用。


清单 7. plugin_zh_CN.properties 中的介绍性内容文件名

				
#Properties file for HelloWorld
Bundle-Name = HelloWorld Plug-in
perspective.name = RCP Perspective
product.name = Hello World
welcome.page=welcome/introContent_zh_CN.xml

 

可 以看到 introContent_zh_CN.xml 是如何用 HTML 格式指向汉语欢迎页面的。welcome_zh_CN.html 是一个 HTML 文件,包含有使用汉语表述的产品介绍信息。在汉语 OS 中使用这个应用程序的人将看到用汉语显示的欢迎页面。


清单 8. 在 introContent_zh_CN.xml 中的欢迎页面

				
<?xml version="1.0" encoding="utf-8" ?>
<introContent>
<page id="root" content="welcome_zh_CN.html" />
</introContent>





回页首


插件和产品

插件和产品的信息(如产品名、主窗口标题和 About 文本)也能够被全球化。这些信息存放在 plugin.xml 中。您可以使用与欢迎页面相同的全球化方法。只需要使用 plugin.xml 和 plugin.properties 来进行此项操作。plugin.xml 中的所有信息都可以被外部化到 plugin.properties 中。


清单 9. plugin.xml 的产品信息部分

				
<extension
id="product"
point="org.eclipse.core.runtime.products">
<product
application="HelloWorld.application"
name="%product.name">
<property
name="windowImages"
value="icons/alt_window_16.gif,icons/alt_window_32.gif">
</property>
<property
name="appName"
value="%product.name">
</property>
<property
name="aboutText"
value="%about.text">
</property>
</product>
</extension>

 

使用前面的 plugin.properties 文件,还要再添加两项属性:product.nameabout.textproduct.name 的值显示在窗口标题和 about 菜单中。当您打开 About 对话框时,将会显示 about.text 的值。


清单 10. plugin.properties

				
#Properties file for HelloWorld
Bundle-Name = HelloWorld Plug-in
perspective.name = RCP Perspective
welcome.page=welcome/introContent.xml
product.name = Hello World
#About text has multiple line.
about.text=This is HelloWorld/n/
/n/
Version 1.0

 

如果属性文件包含了非 ASCII 字符(产品名或者 about 文本),需要使用转义 Unicode 把文件从原生编码转换成 ASCII。<JDK_HOME>/bin/native2ascii 可以用来完成这种转换。对于汉语资源包 plugin_zh_CN.properties,就需要执行这种转换。转换后,plugin_zh_CN.properties 看上去就像清单 11。


清单 11. plugin_zh_CN.properties

				
#Properties file for HelloWorld
Bundle-Name = HelloWorld Plug-in
perspective.name = RCP Perspective
product.name = /u4f60/u597d
welcome.page=welcome/introContent_zh_CN.xml
about.text=/u8fd9/u662f/u4e00/u4e2a/u4f8b/u5b50/n/
/n/
/u7248/u672c 1.0





回页首


标准的 Eclipse UI 元素

Eclipse 有一些 UI 元素并不是您的应用程序的一部分,如最大化和最小化窗口按钮的 tool-tip。对于您的应用程序的 UI 来说,也要把这些 UI 元素全球化。幸运的是,Eclipse 帮助您解决了这个问题。下载 Eclipse 的语言包,然后把它们放在 RCP 应用程序的插件目录下。当启动应用程序时,UI 元素将自动被全球化。

 




回页首


结束语

在一个 RCP 应用程序中,包含有许多种 UI 元素。需要使用各种不同的方法把不同的 UI 元素全球化。本文介绍了工具栏、菜单、对话框、闪屏、欢迎页面、产品信息和标准的 Eclipse UI 元素的全球化(G11N)实现。

尽管样例程序 Hello World 的功能非常有限,但它涵盖了大部分的 UI 元素。现在您可以为 RCP 应用程序创建一个完全支持全球化的 UI 了。





回页首


下载

描述名字大小下载方法
Hello Worldos-eclipse-globalrcp-HelloWorld.zip161KBHTTP
关于下载方法的信息


参考资料

学习

  • 获取更多关于 Eclipse RCP 的细节,这是用于创建富客户机应用程序的最小插件组。
  • 学习 Eclipse RCP 教程 ,内容包括:创建首个 RCP 应用程序;使用命令、视图、编辑器、对话框、首选项用法和首选项页面;外部 JAR 的使用;创建一个产品和品牌;以及为 RCP 应用程序添加帮助。
  • 了解更多关于 Codes for the Representation of Names of Languages (ISO 639.2)和 国家名和代码元素 (ISO 3166-1 和相应的 ISO 3166-1-alpha-2 代码元素)的内容。
  • Globalize your On Demand Business 讨论 IBM 如何注重国际市场竞争。
  • 查阅 推荐 Eclipse 阅读清单
  • 在 developerWorks 上浏览所有的 Eclipse 内容
  • 不熟悉 Eclipse? 请阅读 developerWorks 文章 “Eclipse 平台入门 ”,学习它的起源和架构,以及如何用插件扩展 Eclipse。
  • 通过查阅 IBM developerWorks Eclipse 项目资源 扩展您的 Eclipse 技术。
  • 要收听针对软件开发人员的有趣访谈和讨论,请查阅 developerWorks podcasts
  • 随时关注 developerWorks 技术活动网络广播
  • 查阅免费的 developerWorks 演示中心 ,观看并了解 IBM 及开源技术和产品功能。
  • 查阅最近将在全球举办的面向 IBM 开放源码开发人员的研讨会、交易展览、网络广播和其他 活动
  • 访问 developerWorks Open source 专区 ,获得丰富的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并与 IBM 产品结合使用。


获得产品和技术


讨论

  • Eclipse Platform 新闻组 应当是讨论关于 Eclipse 的问题的第一站(选择此链接将启动默认的 Usenet 新闻阅读器应用程序并打开 eclipse.platform)。
  • Eclipse 新闻组 中有很多参考资料适用于对使用和扩展 Eclipse 感兴趣的人员。
  • 参与 developerWorks 博客 并加入 developerWorks 社区。


作者简介

Wei Wang 是 IBM China Software Development Lab 的一名软件工程师。他主要从事普及计算客户机技术。

 


Yuan Yao Deng 是 ECM Widgets 开发人员。他有 5 年多的 Eclipse 开发经验。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Eclipse RCP(Rich Client Platform)是一个开放源代码的框架,用于构建基于Java的客户端应用程序。在开始打包Eclipse RCP客户端之前,我们首先需要了解一些基本概念和步骤。 首先,为了打包一个Eclipse RCP客户端,我们需要使用Eclipse IDE作为开发环境。我们可以使用Eclipse内置的插件和工具来构建、调试和打包RCP应用程序。 在开始打包之前,我们需要确保我们的RCP应用程序已经调试和测试通过。这意味着我们需要确保应用程序运行正常,不会出现任何错误或异常。 接下来,我们可以使用Eclipse IDE的导出功能来打包RCP应用程序。在Eclipse菜单中选择“文件(File)”>“导出(Export)”。然后选择“插件开发(Plug-in Development)”>“Eclipse产品导出器(Eclipse Product Exporter)”。 在导出对话框中,我们需要选择我们要导出的RCP应用程序。在“产品定义(Product Definition)”字段中,选择我们的RCP产品定义文件。然后,选择一个目标文件夹来存储导出的应用程序。 在导出过程中,我们可以选择一些配置选项来配置我们的导出。例如,我们可以选择是否要包含所需的插件、库文件和配置文件,以及是否要创建一个自定义的启动器。 完成导出后,我们将得到一个包含我们的RCP应用程序的文件夹或归档文件。我们可以将这个文件夹或归档文件分发给其他用户,并让他们通过简单地运行启动脚本来启动我们的RCP应用程序。 总之,打包Eclipse RCP客户端需要使用Eclipse IDE的导出功能,并配置一些选项来定制我们的导出。通过这个过程,我们可以生成一个包含我们的RCP应用程序的文件夹或归档文件,并将其分发给其他用户。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值