枫林在线论坛精华区>>程序设计
[340911] 主题: Eclipse零起步系列讲座(九)
作者: little (渺小·Happy^_^)
标题: Eclipse零起步系列讲座(九)[转载]
来自: 192.168.*.*
发贴时间: 2005年04月25日 11:25:36
长度: 5395字

Eclipse零起步系列讲座 (九)

===========================================

(前言)
昨天我们已经开发了一个简单的hello world插件了, 但是我们发现是英文
界面的. 而用
过WSAD的朋友都应该知道, WSAD

是可以支持很多国家的语言的. 而且IBM也捐献给eclipse一个translatio
n package, 装
了之后就可以有中文界面的

eclipse出来了. 那这个东东,eclipse到底是如何实现的呢? 我们来介绍一
下.

(正文)

[Eclipse 2.1.x Translation Package]

你可以从eclipse.org 或者 交大的ftp 里 下载到 这个翻译包, 我们把它
下载下来,安
装到eclipse中

然后我们在控制面板的区域设置中,设置自己所在的区域,比如中国(中华人
民共和国)

然后,我们启动一下eclipse,你会发现界面都是中文显示了

如果设置为法国, 那就启动后就都是法文显示了

这个包之所以能够如此神奇, 都是靠了, resource bundle来解决的

其实eclipse还未开源前, wsad的国际化问题(internationalization = i
18n), 一开始
作为IBM内部项目NLS, 进行研究

的. 这个项目的进行, 也逐渐是eclipse的i18n问题的解决方案成形了

[eclipse i18n 解决方案]

我们首先要找到所有表现层的地方,主要有这几块:

1. 文本: plugin.xml , 联机帮助文档 , GUI中的消息,标签
2. 数据格式
3. 地区和称谓


那我们一个个来讲:

比如标签,消息:
昨天那个hello world的例子中,当点击sample action就会显示hello ,ec
lipse 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.&q
uot;
     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.&qu
ot;
    class="org.eclipse.jdt.internal.ui.JavaPlugin">


然后我们还有在plugin根目录下的文件plugin.properties

包含了以下信息:
plugin.name: Java Development Tools UI

我们把要翻译的字符串都拉到properties文件中, 对于不同的语言,只要翻
译这些拉出来
的字符串,并存放到plugin_xx.

properties文件中就行了

联机帮助:
eclipse的帮助系统也可以进行翻译

数据格式: 包括数字,日期,时间,货币,不同语言国家的这些数据格式都是
不同的
地区称谓: 每个国家都有自己的尊称,度量等等

[eclipse i18n 实现步骤]

1. 把要翻译的字符串装到 .properties文件中去

点菜单里source-> externalize string, 这个方法是外部化字符串, 
这个功能会搜寻你
文件中所有常量字符串, 然后在

弹出对话框里,可以设定这些字符串的ID, 之后还有生成resource bundle
类和相应的.pr
operties文件名设定的选项, 设

定好之后, 要翻译的字符串就给包进resource bundle中, 数据在xxx.pro
perties文件中
, 那倒是只要相应的生成

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_W
ORLD));
     }
   }


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,eclips
eu4e16u754c!"

转换的工具为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这样的大公司才有本事做好这

个工作,呵呵. 自己开发么...呵呵, 能弄个中英文版已经很不错了


========== * * * * * ==========
返回