内容


全球化 Eclipse RCP 应用程序

使 UI 轻松地支持多种语言

简介

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

样例应用程序

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

图 1. Hello World RCP 应用程序
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 了。


下载资源


相关主题

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Open source, Java technology
ArticleID=416583
ArticleTitle=全球化 Eclipse RCP 应用程序
publish-date=07272009