科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道构建用于语言翻译的 Lotus Sametime bot

构建用于语言翻译的 Lotus Sametime bot

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文通过构建与 IBM WebSphere Translation Server 一起工作的 IBM Lotus Sametime bot 来实现文本字符串的动态翻译。

作者:www.ibm.com 来源:www.ibm.com 2007年9月15日

关键字: 应用 技巧 IBM lotus Office

  • 评论
  • 分享微博
  • 分享邮件

IBM Lotus Sametime Java Toolkit 概述

Lotus Sametime Java Toolkit 允许您通过 Java 编程语言访问核心 Sametime 服务,例如提醒、即时消息传递和屏幕共享。在本文中,您将通过编程的方式利用 Lotus Sametime Java Toolkit 的功能,与 Lotus Sametime 的即时消息服务交互。本文并非 Lotus Sametime Java Toolkit 的教程。如果您对该软件包不熟悉,请参考 ST70JavaToolkit\docs 子目录下的文档。





回页首


Sametime bot 预览

Sametime bot 是运行在 Lotus Sametime 环境中的聊天机器人。与真正的人类用户一样,bot 也使用用户名和口令登录到 Lotus Sametime,并在您的联系人列表中显示为一个联机用户。用户可以向 bot 发送文本消息,bot 可执行一个函数并以文本消息的形式向发送者作出响应。可以使用 Lotus Sametime 工具包来编写 Sametime bot。

正如前面提到的那样,本文为您演示如何构建一个执行翻译功能的 Sametime bot。您向 Sametime bot 查询一个给定的输入字符串翻译成什么并与 Sametime bot 进行交互。如图 1 所示,通过即时消息要求 Sametime bot 把一个字符串 (“My cat likes milk”)从英语翻译成西班牙语(通过字符串 enes 指定)。作为响应,Sametime bot 通过服务器的 Java API 程序调用联系 WebSphere Translation Server。WebSphere Translation Server 以请求的目标语言向 bot 返回翻译字符串。然后 bot 把已翻译好的字符串传回发出请求的客户机。


图 1. Sametime bot 预览
Sametime bot 预览

尽管涉及到一些 Sametime bot API 的内容,但我们不会过深地探讨复杂的 bot 编程。要想学习有关 Sametime bot 编程的更多知识,请查阅参考资料一节。





回页首


IBM WebSphere Translation Server 概述

IBM WebSphere Translation Server 是一种机器翻译软件,应对了快速、经济地为企业提供语言翻译服务的语言挑战。特别地,WebSphere Translation Server 可以每秒 200 到 500 字的速度进行翻译。另外,它可扩展,其 User Dictionary Manager 工具允许您向它的翻译引擎中添加俚语或特定领域的习语和术语,并且还可以处理复杂的惯用语。

WebSphere Translation Server 版本 5 可以在很多平台上做为单机产品,包括 Sun Solaris、Microsoft Windows 2000 及 NT、IBM AIX 和 Linux。在这篇关于 WebSphere Translation Server 和 Sametime bot 的文章中,假定您使用 Windows 环境。

WebSphere Translation Server 5.0 支持以下语言之间的互译:

  • 英语到法语,法语到英语
  • 英语到意大利语,意大利语到英语
  • 英语到西班牙语,西班牙语到英语
  • 英语到汉语(简体和繁体),汉语(简体和繁体)到英语
  • 英语到日语,日语到英语
  • 英语到韩语,韩语到英语
  • 英语到巴西葡萄牙语,巴西葡萄牙语到英语

这里特别有趣的是您能够通过编程与 WebSphere Translation Server 交互并通过包含在产品中的 C 和 Java 库利用它的翻译服务。特别地,您将利用 Java 库接合到 WebSphere Translation Server。此 Java 库放在单个的 JAR 文件 wts.jar 中,当安装 WebSphere Translation Server 时会安装该文件。





回页首


收集必要成分

在我们的文章中,假定您已经安装了 Lotus Sametime Java Toolkit 版本 7.0,您可以免费从 developerWorks Lotus Toolkits 页面下载。工具包的安装非常简单;安装程序直接将其内容解压到一个指定的目录。您仅需使用解压目录下的一个 JAR 文件 STComm.jar。要通过 Sametime Java Toolkit 创建 Sametime bot 来提供基于即时消息的翻译服务,仅需用到此 JAR 文件。

当然,还需要 WebSphere Translation Server for Multiplatforms 5.0,安装非常简单:启动安装程序,安装程序询问您安装哪些选项时,选择 Gateway 和 InfoCenter(InfoCenter 提供关于 WebSphere Translation Server 的有用文档)选项及您想支持的所有语言。就此文章,选择所有可用的语言组合。

可以使用 WebSphere Translation Server 的第二张安装光盘来安装附加翻译引擎(像使用第一张光盘时一样,选择所有内容)。使用第二张安装光盘时,不必选择 IBM WebSphere Translation Server Gateway V5.0 和 IBM WebSphere Translation Server InfoCenter V5.0 选项(已经通过第一张光盘安装过了)。

为启动 WebSphere Translation Server(假定您使用 Windows),在 “开始” 菜单中选择 “程序” —— IBM WebSphere Translation Server —— Translation Server。您将看到已启动的服务器日志消息,如图 2 所示。


图 2. 启动 WebSphere Translation Server
启动 WebSphere Translation Server




回页首


本文沙箱……IBM 公共 Lotus Sametime 服务器

本文使用 IBM Community Tools(ICT)作为 Sametime 客户机,您可以在 Downloads Web 站点 上免费下载。在此站点上,您可以创建一个 IBM 用户名和口令,这样即可登录到公共 IBM Lotus Sametime 服务器。此服务器允许任何具有 IBM 用户名的人通过 Lotus Sametime 通信。为测试,必须为 bot 创建 IBM 用户名,并为测试客户机创建另外一个 IBM 用户名。我们的 Sametime bot 使用公共 Sametime 服务器(messaging.ngi.ibm.com)。

WebSphere Translation Server Sametime bot

如本文开头所述,我们的目标是创建执行动态语言翻译的 Sametime bot。为此目的,我们将用到 Sametime Java 软件包以及 WebSphere Translation Server Java API。

虽然可以不使用集成开发环境(IDE)进行 Java 开发(就像使用剪刀也可以修剪草坪一样),但不建议您这样做。为了开发 Sametime bot,并不限定您使用特定的 IDE;但是,我们选择的工具是 IBM Rational Application Developer for WebSphere Software v6.0。如果您以前没有使用过该工具,IBM 在 developerWorks 提供 一个 Windows 和 Linux 上的 Rational Application Developer 免费试用版





回页首


准备 Rational Application Developer 环境

首先,需要设置开发环境。(假定您对 Rational Application Developer 比较熟悉。)为此,需要创建一个 Java 项目并为 Sametime bot 设置所需的构建路径。

  1. 为了创建新的 Java 项目,选择 File - New - Project。这将打开 New Project Wizard。
  2. 从向导的列表中选择 Java Project 并单击 Next。
  3. 在随后的 Java Project 向导中,把 Java 项目命名为 sametimebot 并单击 Finish。
  4. 默认情况下,Rational Application Developer 在 J2EE 透视图中启动。如果出现提示,询问您是否想转换到 Java 透视图,单击 Yes。创建 Java 项目以后,如果您还不在 Java 透视图中,可进入 Windows 菜单,然后选择 Open Perspective - Other。这时会出现一个对话框,在其中选择 Java 透视图即可(参见图 3)。


    图 3. 手动选择 Java 透视图的对话框
    手动选择 Java 透视图的对话框


    进入 Java 透视图后,应可在 Package Explorer 视图中看到之前创建的 Java 项目 sametimebot。现在需要创建用来包含源代码的源文件夹。尽管 Java 开发并不强制要求使用源文件夹,但对于大型项目,源文件夹是一种组织源代码的好方法。

  5. 要创建源文件夹,右键单击 sametimebot 项目,在随后出现的上下文菜单中选择 New - Source Folder。这将打开一个对话框,提示您命名源代码文件夹,将其命名为 src。

    创建好源文件夹后,即可添加 Java 类。首先,创建一个与 WebSphere Translation Server 交互的类。

  6. 右键单击新创建的源代码文件夹,然后选择 New - Class 即可打开 New Java Class 向导(参见图 4)。
  7. 把类命名为 WTSUtilities 并放在包 <com.devworks.example.wts.utilities>中。WTSUtilities 是负责与 WebSphere Translation Server 通信的类。


    图 4. New Java Class 向导 “WTSUtilities”
    New Java Class 向导 “WTSUtilities”


  8. 另外,需要创建第二个类与 Sametime Java 库交互。为此,重复上述步骤,把此类命名为 WTSBot,把包命名为 com.devworks.example.wts.lotus。这样就创建了两个 Java 类,下面将设置类路径。

Sametime bot 依赖于 Sametime 的 Java 工具包库和 WebSphere Translation Server Java API 库。这些 Java 库位于两个 JAR 文件中,需要按照下面这些步骤把它们添加到项目的构建路径中:

  1. 右键单击 sametimebot 项目,从菜单中选择 Properties。
  2. 在 sametimebot 的 Properties 屏幕的左窗格中选择 Java Build Path(参见图 5)。
  3. 选择右格中的 Libraries 选项卡以显示 sametimebot 项目所依赖的库的列表。
  4. 然后,单击 Add External JARs 按钮。


    图 5. sametimebot 项目属性中的 Add External JARs 按钮
    Asametimebot 项目属性中的 Add External JARs 按钮


  5. 此时将显示一个窗口,要求您提供外部 JAR 文件的位置。指向 WebSphere Translation Server 库的位置(wts.jar),然后单击 OK。默认情况下,wts.jar 位于 C:\Program Files\IBMWTS 目录下。
  6. 同样,为作为外部 JAR 文件的 Sametime Java 库(STComm.jar)添加外部 JAR 文件。STComm.jar 位于 Sametime 工具包安装目录的 ST70JavaToolkit\bin 子目录下。
  7. 单击 OK 接受对项目的构建路径所做的更改。

现在已经设置好 Application Developer 环境,下面将深入介绍代码。





回页首


开发 Sametime bot

在此 Sametime bot 中,保持 Sametime 和 WebSphere Translation Server 的函数分离。前面已创建了两个类,WTSBot 类和 WTSUtilities 类。现在将用这些类需要的函数填充类。前面已经说过,本文不会深入探讨复杂的 Sametime bot 开发,假定您较熟悉 Sametime API(参见参考资料)。在下载部分与本文相关的项目 zip 文件中,可找到最终完成的类。

Sametime bot 类 WTSBot 实现四个接口:Runnable、LoginListener、ImServiceListener 和 ImListener。首先介绍 LoginListener 能够实现的功能。

LoginListener

LoginListener 通知 WTSBot 类登录和登出事件。当 Sametime bot 登录进 Sametime 服务器时,bot 执行的是异步登录。因此,在通过 LoginListener 收到 LoginEvent 前,您并不知道登录是否成功。在构造函数内设置 LoginListener,如下所示:

public WTSBot(String serverName, String userId, String password) {
	try {
		wtsUtilities = new WTSUtilities();
		stsession = new STSession("WTSSession");
	} catch (DuplicateObjectException e) {
		e.printStackTrace();
		return;
	}
		
	stsession.loadSemanticComponents();
	stsession.start();
			
	commService = (CommunityService) stsession
		.getCompApi(CommunityService.COMP_NAME);
	commService.addLoginListener(this);
	commService.loginByPassword(serverName, userId, password);
}

正如您在前面的代码中看到的,您使用 CommunityService 对象的 loginByPassword 方法登录 Sametime 服务器。把服务器名称、Sametime bot 的用户 ID 和 Sametime bot 的用户口令传递到方法中。应该修改 bot.properties 文件以反映 bot 的用户名和口令。因为登录进程是异步的,因而在收到 LoginEvent 之前,bot 不会登录,LoginEvent 由下面的 loggedIn 实现方法处理:

public void loggedIn(LoginEvent e) {
	imService = (InstantMessagingService) stsession
		.getCompApi(InstantMessagingService.COMP_NAME);
	imService.registerImType(ImTypes.IM_TYPE_CHAT);
	imService.addImServiceListener(this);
	confService = (ConfService) stsession.getCompApi(ConfService.COMP_NAME);
	System.out.println("The WTS sametime bot has logged on to sametime.");
}

IMServiceListener

在前面的代码中,成功登录后,向 STSession 对象关联的 InstantMessagingService 对象注册 IMServiceListener 实现(WTSBot 类也起同样的作用)。随后,当另一个用户打开窗口与您的 Sametime bot 通信时,通知 WTSBot。由于我们已实现了 IMServiceListener 接口,因此通过 imReceived(IMEvent e) 方法接收此类通知,在 WTSBot 类中实现 contractual 方法:

public void imReceived(ImEvent e) {
e.getIm().addImListener(this); }

IMListener

在前面的 imReceived(ImEvent e) 方法中,把 IMListener 实现关联到 ImEvent 的 com.lotus.sametime.im.Im 对象。WTSBot 也起到作为 IMListener 实现的作用。随后,如果 WTSBot 收到数据和文本,则通知它。因为您只关心文本,所以只实现接收传入的 ImEvent 对象的 textReceived 接口:

public void textReceived(ImEvent e) {
	boolean isError = false;
	Im im = e.getIm();
	String messageText = e.getText();
	String translatedText = "";
	if (messageText.equalsIgnoreCase(HELP_COMMNAD)) {
		translatedText = HELP_STRING;
	} else {
		try {
			translatedText = processTranslation(messageText);
		} catch (RemoteException e1) {
			translatedText = "The sametime bot is unable to 
			reach the WTS Server.";
			isError = true;
		} catch (Throwable e2) {
			translatedText = "The sametime bot is unable to 
			reach the WTS Server.";
			isError = true;
		}
	}
	im.sendText(false, translatedText);
	if (isError) {
		System.err.println("Message received from "
			+ e.getIm().getPartner().getName() + " message:" 
			+ messageText); System.err.println("Translated Text is " 
			+ translatedText);
	} else {
		System.out.println("Message received from "
			+ e.getIm().getPartner().getName() + " message:" 
			+ messageText); System.out.println("Translated Text is " 
			+ translatedText);
	}
}

只要从一名 Sametime 合作伙伴处收到文本,我们即可使用传入的 ImEvent 对象的 getText() 方法重新检索文本。然后调用 processTranslation 方法,该方法负责与 WebSphere Translation Server 通信。下面给出 processTranslation 方法,供您分析:

private String processTranslation(String messageText)
throws RemoteException, Throwable {
	String translatedText = "";
	if (messageText != null) {
		int index = messageText.indexOf('>');
		if (index != -1) {
			String language = messageText.substring(0, index).trim();
			index++;
			String toTranslate = messageText.substring(index, 
			messageText.length());
				translatedText = wtsUtilities.getTranslation(language,
					toTranslate);
		} else {
			translatedText = "Invalid translation string. 
			The format should be language > text.  
			Type \"help\" for help";
		}
	}
	return translatedText;
}

processTranslation(String) 方法使用实用工具类 WTSUtilities(该实用工具类将在下一节详细讨论)获取请求的源字符串翻译后所得的字符串。processTranslation(String) 方法在将来自用户的字符串发送给翻译实用工具之前验证它。





回页首


开发 WebSphere Translation Server 实用工具

调用 WebSphere Translation Server,通过编程的方式将源字符串翻译为另外一种语言,这似乎是一项令人生畏的任务。但事实并非如此,您可在如下 getTranslation 方法中利用 WebSphere Translation Server 的简单的 Java API:

public String getTranslation(String language, String preTranslation) 
throws RemoteException, Throwable 
{
	String postTranslation = "";
	LTinterface service;
	service = serviceLocator(language);
	if (service!=null)
	postTranslation = translate(service, preTranslation);
	return postTranslation;
}

在前面的代码中,首先查找负责把特定源语言翻译到所需目标语言的 com.ibm.lt.LTinterface 实现。把实现的查找结果传递给称为 serviceLocator 的私有方法。源语言与目标语言通过使用传入 getTranslation 方法的字符串变量 language 指定。此变量必须接收一个 WebSphere Translation Server 能够理解的字符串缩写词。

WebSphere Translation Server 使用缩写词指定语言翻译方法。例如,通过字符串缩写词 enep 表示由英语翻译到葡萄牙语。关于合法语言缩写词的列表,请参考 Web 上的 WebSphere Translation Server InfoCenter 或随产品安装的版本。对于要支持的某个特定语言对,首次设置 WebSphere Translation Server 时,必须安装相应的翻译服务器引擎。

如前所述,getTranslation 方法调用名为 serviceLocator 的 WTSUtilities 类的私有静态方法。此 serviceLocator 方法负责与 WebSphere Translation Server 交互。该方法获得 com.ibm.lt.LTinterface 的一个实现,通过 LTinterface 实现调用 WebSphere Translation Server:

private static LTinterface serviceLocator(String language) 
throws Throwable  {
	LTinterface service = null;
	
	service = (LTinterface) serviceHash.get(language);
	if (service == null){
		service = (LTinterface) LTengine.GetService(hostname, language);
		serviceHash.put(language, service);
	}

	return service;
}

字符串从一种语言翻译为另一种语言的工作负载从 WTSUtilities 类的 getTranslation 方法传递给类的静态 translate 方法:

private static String translate(LTinterface service, String preTranslation) 
throws RemoteException {

	Object transObj = service.jltBeginTranslation(options);
	
	String postTranslation = "";
	if (preTranslation != null)
		postTranslation = service.jltTranslate(transObj, preTranslation);
	return postTranslation;
}

上面的 translate 方法使用了 LTinterface 对象处理程序,通过此处理程序翻译传入的 preTranslation字符串。翻译任务通过 jltTranslate 的 WebSphere Translation Server API 的方法调用执行。此方法接收 preTranslation 字符串以及表示所需翻译选项的 java.lang.Object。就本文目的,从属性文件中取出翻译选项(*format=text)。 WebSphere Translation Server 考虑其他选项规范(如返回 HTML)。您使用的文本选项值返回文本(如您所料)。有关合法选项的更多信息,请参考 WebSphere Translation Server InfoCenter





回页首


合而为一

现已经创建好了 WTSBot 类和 WTSUtilities 类,下面即可测试 bot。右键单击 Package Explorer 视图中的 WTSBot.java,然后从上下文菜单中选择 Run - Java Application 来运行 WTSBot 类。

如果登录成功,在 Console 视图中能看到 “The WTS sametime bot has logged on to sametime”(参见图 6)。


图 6. WTSBot 显示已成功登录 Sametime 服务器
WTSBot 显示已成功登录 Sametime 服务器

Sametime bot 登录以后,即可随时接收 Sametime 合作伙伴的翻译请求。

为测试 bot,登录到 bot 所登录的 Sametime 服务器(messaging.ngi.ibm.com),向您的 bot 使用的 Sametime 地址发送一条消息。消息格式为:language > TEXT,这里 language 表示 WebSphere Translation Server 理解的一个缩写词。例如,enes 表示把英语翻译为西班牙语。为将 “My cat likes milk.” 从英语翻译到西班牙语,向 bot 发送以下文本:

enes > My cat likes milk.

实现用户友好的 WTSBot

为了使 Sametime bot 具备用户友好的特点,可创建一些能返回 WTSBot 使用方法的在线帮助,如图 7 所示。


图 7. WTSBot 支持 Help 命令
WTSBot 支持 Help 命令

翻译得有差错吗?

应该注意,WebSphere Translation Server 提供的翻译服务不一定是准确的,这一点非常重要。本文提供的代码只用于演示。如果您不小心让您的销售商送来一打蓝色的鸡,IBM 不为此承担责任。在使用 WebSphere Translation Server 提供的翻译之前,验证翻译是否确实与源字符串匹配或许是个很好的业务实践。





回页首


结束语

在本文中,您学习了如何创建执行动态语言翻译服务的 Sametime bot。您创建了 bot,借助了 Sametime Java Toolkit 的强大功能,并利用 WebSphere Translation Server Java API 使您的 bot 可通过编程与 WebSphere Translation Server 交互。Sametime bot 有助于跨越您与联系人之间的语言鸿沟。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章