操作系统  办公  实用知识  设计  开发  WEB开发  移动开发  数据库  软件工程  网管  安全  管理  信息化  答疑  渠道 

Instant Messaging SPI 进行翻译

2006-9-30 网友评论 0 条 点击进入论坛

破除语言的壁垒!本文将介绍如何使用 Lotus Workplace Instant Messaging SPI 创建聊天会话的实时翻译,使两个不懂对方语言的人可以互相沟通。
今天,即时消息传递已经基本上无处不在了。对于有些人来说,它和电子邮件一样都是基本的通信工具,尤其是在需要及时响应的场合。随着在线感知技术在越来越多的应用程序(如 IBM Workplace 产品)中普遍采用,即时消息传递会变得越来越普及。

当然,人类的所有通信手段,甚至包括面对面的谈话,都必须面对一个基本的事实:我们并非都说同一种语言。在当今这个由多个国家组成的世界里,我们之中很多人仍然需要考虑到语言的障碍。这常常成为沟通的挑战,特别是在必须清楚、快速地交换信息的时候。如果在与他人用即时消息传递功能进行聊天的时候,每条消息能够“立刻”自动进行翻译,以接收方的母语形式呈现,这难道不是一个很棒的想法吗?就在几年前,这种功能看起来似乎还像是科幻小说,但现在,这种功能实现起来却十分的容易,本文将介绍如何来实现这种功能。

本文讨论 IBM Workplace Instant Messaging Service Provider Interface (SPI) 的用法。Instant Messaging SPI 是 IBM Workplace Products API Toolkit 的一部分,开发人员可以利用它构建即时消息处理程序,在消息抵达接收方之前截获它。这种 SPI 最常见的功能是消息日志。但是也可实现其他功能,如消息翻译。(在附件中可以看到完整的示例代码。)

本文假设您是一位有经验的 Java 开发人员,并且对 IBM Workplace Products API Toolkit 有一定的了解。关于这种 Toolkit 的介绍,请参阅 developerWorks: Lotus 文章“向 IBM Workplace portlet 添加到场提醒”。也可以访问 IBM Workplace 资源中心。

Workplace Instant Messaging SPI servlets
可以将利用 Workplace Instant Messaging SPI 的应用程序作为 servlet 部署在 WebSphere Portal 应用程序服务器实例上。该 servlet 应该配置成在启动应用程序服务器实例时自动加载。在 init() 方法中,servlet 将自身作为监听程序添加到 Instant Messaging Service 中。类似地,当 servlet 销毁时,还要从 Messaging Service 监听程序中删除该 servlet。因为这是一个事件监听程序,所以 servlet 必须实现 onMessage 方法,该方法在消息传递到接收方之前调用。消息的所有翻译和记录工作都要在该方法中处理。

本文的其余部分将说明如何创建一个简单的消息处理程序,它扩展了以前添加到 Purchase Order portlet(在这篇文章中介绍)中的聊天功能。该处理程序将利用 WebSphere Translation Server 在消息送达接收方之前对其进行翻译。我们的目标是说明开发一个即时消息处理程序并将它结合到 IBM Workplace Collaborative Services 解决方案中是多么简单。这个例子还可以扩展,在执行翻译之前考虑使用配置信息,当然这不在本文的讨论范围之列。(比如,处理程序可以将消息翻译成接受方保存在 LDAP 服务器中的首选语言。)

注意:下面这些步骤假设您对使用 IDE 开发 J2EE 应用程序有一定了解,比如 WebSphere Studio Application Developer V5.1 或 IBM Rational Application Developer V6.0。还应该安装带有英语和西班牙语翻译引擎的 IBM WebSphere Translation Server。(在下面的例子中假设使用的是 Rational Application Developer。)

创建即时消息处理程序
打开开发环境如 IBM Rational Application Developer (RAD) V6.0,创建一个新的 Dynamic Web Project,将其命名为 IMTranslatorProj(如图 1 所示)。如果使用的是 IBM RAD V6.0,那么一定要将 Web 项目的部署目标设为 WebSphere Application Server V5.0。

图 1. 创建动态 Web 项目


要使用 Instant Messaging SPI 和 WebSphere Translation Server API,则必须能够访问 lwpapi25_imspi.jar 和 wts.jar 文件。将这两个 JAR 文件导入 Web 项目的 WebContent WEB-INF lib 文件夹(参见图 2)。(下载并解压工具箱后,可以在目录 lwpapi25\imspi\lib 中找到 lwpapi25_imspi.jar 文件。wts.jar 文件位于安装 WebSphere Translation Server 的目录中。)

图 2. lwpapi25_imspi.jar 和 wts.jar 文件


在项目中创建一个新的 servlet,将其命名为 IMTranslator。该 servlet 也应该包含 init() 和 destroy() 方法(这些可能需要手工输入)。将下列代码添加到 servlet 代码的开始位置,以便引入正确的包:

import com.ibm.workplace.services.messaging.*; import com.ibm.lt.*; 接收消息事件的 servlet 必须实现 MessagingListener 接口。将 servlet 类的定义修改为:

public class IMTranslator extends HttpServlet implements Servlet, MessagingListener { 现在,新的 servlet 的代码应该如下所示(忽略该错误,因为您将在下一步中纠正它):

import java.io.IOException;
            import javax.servlet.*;
            import javax.servlet.http.*;
            import com.ibm.workplace.services.messaging.*;
            import com.ibm.lt.*;
            public class IMTranslator extends HttpServlet implements Servlet,MessagingListener  {
            public IMTranslator() {
            super();
            }
            protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws
            ServletException, IOException {
            }
            protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1) throws
            ServletException, IOException {
            }
            public void init(ServletConfig arg0) throws ServletException {
            }
            public void destroy() {
            }
            }
           
要实现 MessageListener 接口,servlet 必须提供 onMessage() 方法的实现。该方法在消息传递给接收方之前调用。在 servlet 中添加 onMessage() 方法,代码如下(应根据具体环境更改翻译服务器主机名的值):

 public byte[] onMessage(
            String fromPresentityId,
            String fromContactId,
            java.util.Collection toPresentities,
            java.util.Collection toContacts,
            String sessionId,
            String contentType,
            byte[] data)
            {
            String msg = new String(data);
            String convertedMsg = msg;
            try
            {
            // Translation server hostname
            String hostname = "portal14.dfw.ibm.com";
            // Convert from english to spanish
            String fromto = "enes";
            // Connect to server and submit translation request
            LTinterface service =
            (LTinterface) LTengine.GetService(hostname, fromto);
            Object handle = service.jltBeginTranslation("*format=text");
            convertedMsg = service.jltTranslate(handle, msg);
            service.jltEndTranslation(handle);
            }
            catch (Throwable t)
            {
            System.out.println(t.getMessage());
            t.printStackTrace();
            }
            return convertedMsg.getBytes();
            }
            
 消息事件通知的 servlet 必须将自身注册为 Messaging Service 的监听程序。可以在 servlet 的 init() 方法中完成这一操作,该方法在第一次加载 servlet 时调用。向 init() 方法添加适当的代码,如下所示:

public void init(ServletConfig arg0) throws ServletException {
            MessagingService messagingService = MessagingServiceFactory.getMessagingService();
            if (messagingService == null) {
            System.err.println("IMTranslator: Messaging Service is NULL");
            return;
            }
            messagingService.addMessagingListener(this);
            }
            
 在卸载 servlet 时,应该从 Messaging Service 监听程序中删除这个 servlet。可以在 servlet 的 destroy() 方法中完成这一操作,该方法在 servlet 卸载之前调用。向 destroy() 方法添加适当的代码,如下所示:

public void destroy()  {
            MessagingService messagingService = MessagingServiceFactory.getMessagingService();
            if (messagingService == null) {
            System.err.println("IMTranslator: Messaging Service is NULL");
            return;
            }
            messagingService.removeMessagingListener(this);
            }
            
 默认情况下,servlet 在第一次请求时启动。该 servlet 将悄悄地处理消息,因此应该配置成应用程序启动时自动加载。为此,要通过打开部署描述文件(web.xml)来打开 Servlet 选项卡,然后选中 Load On Startup 选择框并保存所做的更改(参见图 3)。

图 3. Load on Startup 选项


保存修改后,将 Web 项目导出为 WAR 文件。在 IBM Rational Application Developer 中,可以通过右击项目并选择 Export 来完成这一操作。然后选择 WAR 文件,单击 Next。在输入文件名后,单击 Finish 完成导出操作。

Web 应用程序 WAR 文件应该部署在 IBM Workplace 服务的 WebSphere Portal 应用程序服务器实例中。通过 http://<workplace_server>:9091/admin 访问 WebSphere Application Server Administrative Console。登录后导航到 Applications Install New Application。选择上一步中导出的 WAR 文件,输入 /IMTranslator 作为上下文根。单击 Next 继续后面的操作。按照向导的提示安装 Web 应用程序。在向导的第 1 和第 2 步中,接受默认设置。第 3 步(映射模块到应用程序服务器)中将 Web 应用程序映射到 WebSphere Portal 应用程序服务器(如图 4 所示):

图 4. 映射模块到应用程序服务器


完成向导之后,可以看到一条消息,告知应用程序已经成功安装。选择“Save to master configuration”链接并单击 Save 按钮保存所做的修改。

运行即时消息处理程序
要启动 IMTranslator 即时消息处理程序,首先要导航到 Applications Enterprise Applications。选择 IMTranslatorProj 应用程序并单击 Start 按钮。状态符号(status symbol)的变化表示该应用程序已经启动了。与该处理程序有关的消息记录在 WebSphere Portal 标准输出和标准错误日志文件中,该文件位于 C:/WebSphere/PortalServer/log 目录下。

启动消息处理程序后,就可以与另一个用户打开聊天会话。英语消息在传递给接收方之前将被翻译成西班牙语,反之亦然。比如图 5 中显示的消息:

图 5. 西班牙语消息


显示给接受方的内容如图 6 所示:

图 6. 翻译成英语的消息


前已述及,该应用程序还可以进一步扩展,根据消息接收方的首选语言(通常保存在 LDAP 服务器中)进行翻译。

结束语
Workplace Products API Toolkit 中的 Instant Messaging SPI 允许开发人员在消息发送到接收方之前截获和处理该消息,从而可以完成消息记录、监控和翻译这样一些功能。本文中描述了使用 Rational Application Developer V6.0 这类开发环境创建实现 MessagingListener 接口的 servlet,将即时消息从英语翻译成西班牙语需要的步骤。在 servlet 的 init () 方法中添加了将 servlet 注册为 Messaging Service 监听程序的代码。destroy() 方法包含删除 servlet 监听程序的代码。要实现 MessageListener 接口,servlet 必须实现在消息送达前调用的 onMessage() 方法。利用 IBM WebSphere Translation Server 翻译消息所需要的业务逻辑就是在该方法中处理的。最后,我们将这个 servlet 安装到 WebSphere Portal 应用程序服务器实例中。

总之,这是一个实现起来相当容易的应用程序。但这种不太复杂的 servlet 在多语言环境中可能很有用,可以作为 Instant Messaging SPI 强大功能的一个例证。

我们希望本文能给您帮助。为了清楚起见,本文的例子尽量保持简单,但是您完全可以在自己的即时消息传递应用程序中发挥创造力,实现更多的功能。

已有 0 位对此文章感兴趣的网友发布了看法    
我来评两句 用户名: 密码:
  匿名发表
今日推荐
技术文库(共有 45972 篇文章)
操作系统
办公软件
实用知识
网络管理
软件开发
WEB开发
软件工程
数据库
设计在线
信息安全
行业信息化
管理信息化
移动开发
重点推荐
电子杂志订阅
点击电子杂志名称查看样刊
输入E-mail地址即可订阅
E-mail