及时通讯的学习

来源:互联网 发布:quiver mac 破解版 编辑:程序博客网 时间:2024/04/28 07:56
spark是一个即时通讯客户端,参见:http://www.igniterealtime.org/projects/spark/ 
搭配openfire,可以做一个很好的企业内部通讯平台。

另外spark支持自己开发插件,拥有不错的扩展性,唯一的缺点是个头比较大。

spark有一个翻译插件,可惜老是乱码,正好我需要这样一个插件,就拿来改了一下。

下载spark的源码从svn。最新的版本是2.5.8,就从tag里取。
Java代码 复制代码
  1. svn co http://svn.igniterealtime.org/svn/repos/spark/tags/spark_2_5_8 spark  


当然要从trunk里取也行。
源码的地址都在这里:http://www.igniterealtime.org/downloads/source.jsp

它是缺省用idea来编译的,你可以创建一个eclipse项目,从源码里,很方便,把不需要的plugin都从源码里除掉,因为有一些apple和linux的东西编译会通不过的。

就剩下一个插件:translator。

主要是两个类,TranslatorPlugin 和 TranslatorUtil,先把TranslatorUtil调试好,可以中英互翻,输出都是utf8。

这个应该很容易的,然后就修改TranslatorPlugin中关于message listener的地方。

原来是这样的
Java代码 复制代码
  1. String currentBody = message.getBody();   
  2. TranslatorUtil.TranslationType type =   
  3. (TranslatorUtil.TranslationType)translatorBox.getSelectedItem();   
  4. if (type != null && type != TranslatorUtil.TranslationType.None) {   
  5.   currentBody = TranslatorUtil.translate(currentBody, type);   
  6.   message.setBody(currentBody);   
  7. }  


现在改为:
Java代码 复制代码
  1. String currentBody = message.getBody();   
  2. TransUtil.TranslationType type =   
  3.         (TransUtil.TranslationType)translatorBox.getSelectedItem();   
  4. if (currentBody!=null && type != null && type != TransUtil.TranslationType.None) {   
  5.     String transBody = TransUtil.translate(currentBody, type);   
  6.     if(transBody!=null) {   
  7.         String body = currentBody+" ("+transBody+")";   
  8.         message.removeBody((String)null);   
  9.         message.addBody("zh",body);   
  10.     }   
  11. }  


TransUtil是我新建的类,因为我不是使用google翻译引擎,是用自己的翻译引擎,所以就新建了一个类。

然后在输出的时候将原文和译文同时输出:
Java代码 复制代码
  1. String body = currentBody+" ("+transBody+")";  


要先删除body
Java代码 复制代码
  1. message.removeBody((String)null);  


然后再加入,并且强制定为zh
Java代码 复制代码
  1. message.addBody("zh",body);  


当然也可以判断翻译类型后再确定语言,但是不要让它自己去判断,会有很多不确定因素的。我这儿省事强制定为zh,也适用于中翻英。

看了smack(spark使用的通讯库)的源码后,才发现每个body是根据语言来放的,而且一个message允许有多个body和多种语言。但是最后输出却并不是全部输出,所以要先清干净,然后再加入body。

如果不指定语言,则会根据内容来进行判断,但并不准确,所以还是要指定语言,这个是来自java的Locale的。

我在ubuntu和xp上试验成功,都是缺省中文环境,中英互翻都可以。 
 
原创粉丝点击