Eclipse零起步系列讲座 (九)
===========================================
(前言)
昨天我们已经开发了一个简单的hello world插件了, 但是我们发现是英文界面的. 而用
过WSAD的朋友都应该知道, WSAD
是可以支持很多国家的语言的. 而且IBM也捐献给eclipse一个translation package, 装
了之后就可以有中文界面的
eclipse出来了. 那这个东东,eclipse到底是如何实现的呢? 我们来介绍一下.
(正文)
你可以从eclipse.org 或者 交大的ftp 里 下载到 这个翻译包, 我们把它下载下来,安
装到eclipse中
然后我们在控制面板的区域设置中,设置自己所在的区域,比如中国(中华人民共和国)
然后,我们启动一下eclipse,你会发现界面都是中文显示了
如果设置为法国, 那就启动后就都是法文显示了
这个包之所以能够如此神奇, 都是靠了, resource bundle来解决的
其实eclipse还未开源前, wsad的国际化问题(internationalization = i18n), 一开始
作为IBM内部项目NLS, 进行研究
的. 这个项目的进行, 也逐渐是eclipse的i18n问题的解决方案成形了
我们首先要找到所有表现层的地方,主要有这几块:
1. 文本: plugin.xml , 联机帮助文档 , GUI中的消息,标签
2. 数据格式
3. 地区和称谓
那我们一个个来讲:
比如标签,消息:
昨天那个hello world的例子中,当点击sample action就会显示hello ,eclipse world!
但是这只是在英文的界面显示, 那别的语言表示怎么办呢?
有办法, 用resource bundle, 怎么个用法, 我们后面会介绍.
然后就是plugin.xml了:
<plugin
name="Java Development Tools UI"
id="org.eclipse.jdt.ui"
version="2.1.2"
provider-name="Object Technology International, Inc."
class="org.eclipse.jdt.internal.ui.JavaPlugin">
比如这是jdt的plugin.xml的一个描述, 这是没有i18n的plugin.xml
加入i18n解决方案的plugin.xml是这样的
<plugin
name="%plugin.name"
id="org.eclipse.jdt.ui"
version="2.0.0"
provider-name="Object Technology International, Inc."
class="org.eclipse.jdt.internal.ui.JavaPlugin">
然后我们还有在plugin根目录下的文件plugin.properties
包含了以下信息:
plugin.name: Java Development Tools UI
我们把要翻译的字符串都拉到properties文件中, 对于不同的语言,只要翻译这些拉出来
的字符串,并存放到plugin_xx.
properties文件中就行了
联机帮助:
eclipse的帮助系统也可以进行翻译
数据格式: 包括数字,日期,时间,货币,不同语言国家的这些数据格式都是不同的
地区称谓: 每个国家都有自己的尊称,度量等等
1. 把要翻译的字符串装到 .properties文件中去
点菜单里source-> externalize string, 这个方法是外部化字符串, 这个功能会搜寻你
文件中所有常量字符串, 然后在
弹出对话框里,可以设定这些字符串的ID, 之后还有生成resource bundle类和相应的.pr
operties文件名设定的选项, 设
定好之后, 要翻译的字符串就给包进resource bundle中, 数据在xxx.properties文件中
, 那倒是只要相应的生成
xxx_de.properties, xxx_zh.properties等文件, 这样程序会根据不同的语言去读取不
同的properties, 这样显示的消
息也就是多国语言版了.
当然,如果你觉得那个字符串不需要国际化, 那就在这行的后面加一个注释 /*
NON-I18N */
举个例子:
public class HelloWorld {
static public void main(String args) {
String a = "yes";
System.out.println("Hello, eclipse world!");
}
}
我们外部化后,如果用HelloWorldMessages类封装resource bundle , 数据文件为
HelloWorld.properties
那就会变成这样:
public class HelloWorld {
static public void main(String args) {
String a = "yes"; //$NON-NLS-1$ <-- 这个说明字符串不需要翻译
System.out.println(HelloWorldMessages.getString(HELLO_WORLD));
}
}
HelloWorld.properties:
HELLO_WORLD : Hello, eclipse world!
这样我们把要翻译的字符串装properties里面,就可以进行翻译了.
如何用resource bundle做i18n, 有很多文章有介绍, 大家如果不清楚, 可以上网查阅相
关文章.
2. 翻译字符串
这个靠的就不是技术了, 而是要靠翻译了. 对于不同的翻译来说, 它会根据properties
来翻译出你想要的本地语言
比如,一个中文翻译
它拿到properties文件后,会翻译成这样
HELLO_WORLD: 你好, eclipse世界!
并且写在helloworld_zh.properties文件中(zh - "中文"的英文所写)
这还没好, 由于eclipse运行机制问题,我们还要对这个文件转一下
就是把unicode字符转成acsii字符,
比如"你好,eclipse世界!" 应转成 "u4f60u597d,eclipseu4e16u754c!"
转换的工具为native2ascii.exe, 在jdk里面
这样, 一个语言的properties文件才算编辑完成
3. 创建片段
这里要介绍一个新的概念,就是片段, 它不是完整的插件, 而是某个插件的一部分. 而我
们一般的解决方案是把这些
translation放在片段中, 而主插件负责功能的实现即可.
所以你装了translation 包后,你会发觉你有很多这样的插件,名字叫:xxx.xxx.xxx_1.0.
0
而且肯定还附带一个xxx.xxx.xxx.nl1_1.0.0, 这个就是对应插件的片段,用来存放翻译
信息.
注意: 创建片段的话,可不是用plugin.xml,而是用fragment.xml
我们看一下org.eclipse.ui这个插件的翻译包片段
<fragment name="Eclipse UI NL Support"
id="org.eclipse.ui.nl1"
version="2.1.2"
plugin-id="org.eclipse.ui"
plugin-version="2.1.1">
<runtime>
<library name="nl1.jar" />
</runtime>
</fragment>
这里定义了这个片段的name和id,已经它所属的plugin-id,还有翻译的信息运行库nl1.ja
r
4. 测试
创建好了片段,就要开始进行测试, 这个测试主要还是语言方面的检测,语义核对之类的
当然, 说句老实话, 我们今天也只是了解一下这个技术, 做插件的国际化的技术一点都
不难, 难就难在你要翻译这么多
东西, 而且还要翻译的对,翻译的好,让各国的人都用的爽,这个就难了, 估计也只有像IB
M这样的大公司才有本事做好这
个工作,呵呵. 自己开发么...呵呵, 能弄个中英文版已经很不错了
|