IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  WebSphere | SOA and Web services  >

使用 WebSphere Translation Server 进行应用程序全球化

将翻译服务作为 Web 服务公开

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 中级

Kulvir Singh Bhogal (kbhogal@us.ibm.com), 高级 IT 专家, IBM
Mark Talbot (talbotm@us.ibm.com), 软件工程师, IBM

2006 年 7 月 23 日

了解如何将 IBM® WebSphere® Translation Server Version 5 的编程翻译服务作为部署到 IBM WebSphere Application Server Version 6 的 Web 服务公开。学习构建 Web 服务,以构建应用程序能够使用的强大的可伸缩机器翻译服务,从而使您的组织能够满足其应用程序面向全球受众的需求。

引言

在本文中,您将了解如何使现有应用程序与使用不同语言的用户进行交互。将通过把 WebSphere Translation Server 的翻译服务作为可部署到 WebSphere Application Server V6 的 Web 服务公开来实现此目标。WebSphere Translation Server Version 5 支持在以下各个语言对间进行转换:

  • 英语到法语,法语到英语
  • 英语到意大利语,意大利语到英语
  • 英语到西班牙语,西班牙语到英语
  • 英语到简体中文,简体中文到英语
  • 英语到繁体中文,繁体中文到英语
  • 英语到日语,日语到英语
  • 英语到朝鲜语,朝鲜语到英语
  • 英语到巴西葡萄牙语,巴西葡萄牙语到英语

Translation Server 既作为独立产品提供,同时也与 IBM 的 WebSphere Portal Server 5 Enable 和 Extend 两个版本捆绑到一起。Translation Server 可在一系列平台上使用,包括 Sun™ Solaris™、Windows™ 2000 及 NT、AIX® 和 Linux®。Translation Server 是一个服务器端程序,充当机器翻译服务的服务提供者。可以使用随该产品提供的 C 和 Java 库以编程方式与 Translation Server 进行交互。在 Translation Server V5 中,翻译服务并不是作为 Web 服务公开的。不过,您会发现公开这些服务并不困难。

为了本文讨论方便,我们将假定 Translation Server 和 WebSphere Application Server V6 在同一台计算机上运行。我们在研究中使用的是随 Rational Application Developer V6 提供的内置 WebSphere Application Server V6。

解决方案概述

您要创建的 Web 服务将部署到 WebSphere Application Server Version 6(以下称为 Application Server,充当 Web 服务主机)。您还将使用 Application Server 作为其 EJB 容器。与 Translation Server 进行交互的代码驻留在一个无状态会话 EJB 中。EJB(如您将创建并部署的 EJB)由 Java 2 Extended Edition (J2EE) 应用服务器在内存中形成 Bean 池,从而减少每次需要时创建 Bean 所带来的开销。将在需要时使用 Bean 实例,并在工作完成时放回池中。

先决条件

本文假定您熟悉 Rational Application Developer Version 6(以下称为 Application Developer)。我们将使用 Rational 集成开发环境(Intefreated Development Environment,IDE)来以编程方式将 WebSphere Translation Server(以下称为 Translation Server)的 Java™ 接口作为 Web 服务公开。您将使用内置 WebSphere Application Server V6 测试环境和 Web Services Explorer of Application Developer 来验证翻译 Web 服务是否正确工作。

通过使用 Translation Server,可以提供多语言文本内容,但不必支付昂贵的人工翻译服务费用。Translation Server 每秒大约能翻译 200 到 500 个单词,可以处理相当复杂的习惯表达。

安装 Translation Server

如果尚未安装,则请启动 Translation Server 安装程序。选择 WebSphere Translation Server Gateway V5.0IBM WebSphere Translation Server InfoCenter V5.0 选项,并选择希望支持的语言。对于本文,我们按照图 1 中所示选择了所有语言组合:


图 1. 选择语言
图 1. 选择语言

选择要包含的翻译引擎以及 Translation Server Gateway 和 InfoCenter。

可以从第二张 Translation Server 安装 CD 选择其他语言。要从第二张安装 CD 安装其他语言支持,请选择所需的翻译引擎(我们选择全部引擎,如图 2 中所示)。不要选择 WebSphere Translation Server Gateway V5.0IBM WebSphere Translation Server InfoCenter V5.0,因为已经从第一张 CD 上安装了。


图 2. 选择其他语言
图 2. 选择其他语言

启动 Translation Server(假定使用 Windows),方法为:依次选择 Start => Programs => IBM WebSphere Translation Server => Translation Server。应该看到一个与图 3 所示的屏幕。


图 3. 启动 Translation Server
图 3. 启动 Translation Server

使用无状态会话 EJB 公开翻译服务

在此部分,将进行把 Translation Server 翻译服务作为无状态会话 Bean 公开所需的设置步骤。

  1. 首先创建一个无状态会话 EJB,以用于承载与 Translation Server 连接的方法。为此,请选择 File => New => Other
  2. 在 Select a wizard 对话框中选择 EJB => Enterprise Bean

    图 4. 打开 Enterprise Bean 向导
    图 4. 打开 Enterprise Bean 向导

  3. 在 Create Enterprise Bean 对话框中,进行以下操作:
    • 选择 Session Bean
    • EJB project 字段中输入 WTSEJB
    • Bean name 字段中输入 WTS
    • Source folder 字段中输入 ejbModule
    • Default package 字段中输入 com.ibm.wts
    • 单击 Next


    图 5. Create an enterprise bean
    图 5. Create an enterprise bean

  4. 在 New EJB Project 对话框中,进行以下操作:
    • Name 字段中输入 WTSEJB
    • 对于 EJB Version,请输入 2.1
    • 对于 Target server,请选择 WebSphere Application Server V6.0
    • 选中 Add module to an EAR project
    • 对于 EAR project,请选择 WTSEAR
    • 选中 Create an EJB Client JAR Project to hold the client interfaces and classes
    • 单击 Finish


    图 6. 创建 EJB 项目
    图 6. 创建 EJB 项目

  5. 为了将 EJB 作为 Web 服务公开,需要公开调用 Translation Server 的方法。可以将此 EJB 方法公开给使用远程客户机视图或本地客户机视图的使用者。在本例中,使用者是 Web 服务。如果要使用此方法的 Web 服务和 EJB 位于相同的 Java 虚拟机(Java Virtual Machine,JVM),则使用本地客户机视图就足够了。如果 Web 服务和 EJB 驻留于独立的 JVM 中,则将需要使用远程接口。在本文中,EJB 和 Web 服务位于同一个 JVM 上。图 7 演示了远程拓扑和本地拓扑。

    图 7 远程和本地部署拓扑
    图 7 远程和本地部署拓扑

  6. 在 EJB 向导的 Enterprise Bean details 页面中,执行以下操作:
    • 对于 Session type,选择 Stateless
    • 对于 Transaction type,选择 Container
    • 对于 Bean class,指定 com.ibm.wts.WTSBean
    • 选中 Local client view
    • 对于 Local home interface,指定 com.ibm.wts.WTSLocalHome
    • 对于 Local interface,指定 com.ibm.wts.WTSLocal
    • 单击 Finish


    图 8. 为 EJB 创建本地客户机视图
    图 8. 为 EJB 创建本地客户机视图

    为了让 EJB 与 Translation Server 通信,需要将 Translation Server Java 库添加到您的 WTSEAR 企业应用程序。为此,右键单击 WTSEAR,并从菜单中选择 Import => J2EE Utility Jar

    图 9. 导入 J2EE 实用工具 JAR
    图 9. 导入 J2EE 实用工具 JAR

  7. 使用 import J2EE Utility JAR 向导将 Translation Server Java 库导入到 EAR,步骤如下:
    • 对于 EAR Project,指定 WTSEAR
    • 选中 Copy Utility Jars into an existing EAR from an external location
    • 单击 Next


    图 10. 在 Utility Jar Import 向导中指定导入类型
    图 10. 在 Utility Jar Import 向导中指定导入类型

  8. 在下一个对话框中,执行以下操作:
    • External Jar Directory 字段中指定包含 Translation Server Java 库的目录。在缺省 Windows 安装中,此目录应为 C:\Program Files\IBMWTS
    • Utlity JARS and Web libraries 列表中选中 C:\Program Files\IBMWTS\wts.jar
    • 单击 Finish


    图 11. 选择 wts.jar 文件
    图 11. 选择 Translation Server.jar 文件

  9. 为了让 EJB 项目访问新添加的实用工具 JAR,需要在 EJB 模块的清单文件中添加对 JAR 的引用。请使用 JAR Dependency editor 来完成此工作,方法为:右键单击 MANIFEST.MF 文件,并选择 Open With => JAR Dependency Editor,如图 12 中所示。

    图 12. 使用 JAR Dependency Editor 打开清单文件
    图 12. 使用 JAR Dependency Editor 打开清单文件

  10. 如图 13 中所示,选中 wts.jar 文件旁边的复选框,然后按 CTRL+S 将更改把保存到清单文件。

    图 13. 修改清单文件
    图 13. 修改清单文件

    因为已经更新了清单文件,Application Developer 将自动更新您的项目类路径。可以通过检查项目的 Java 构建路径来对项目进行验证。

编写 EJB 定义代码,以使用 Translation Server

目前已经完成了环境准备工作,以便与 Translation Server 交互。现在应该向将与 Translation Server 交互的 EJB 的 Bean 定义添加代码了。

  1. 从 EJB 的 Bean 定义中创建一个名为 getTranslation 的新公共方法,如下所示:
    public String getTranslation(String language, String preTranslation) {
    		String postTranslation = "";
    		LTinterface service;
    		try {
    			 service = serviceLocator(language);
    			if (service!=null)
    				postTranslation = translate(service, preTranslation);
    		} catch (RemoteException e) {
    			//Remote Exception, then connection is bad.  Get a new connection
    			try {
    				 service = retryService(language);
    				if (service != null)
    					postTranslation = translate(service, preTranslation);
    			} catch (RemoteException e1) {
    				//retry failed, print the exception.
    				e1.printStackTrace();
    			} 
    		}
    
    		return postTranslation;
    	}
    			

    让我们对此代码进行一下深入的分析。首先,我们要查找负责将特定源语言翻译为目标语言的 com.ibm.lt.LTinterface 实现。为此,我们将委托给一个名为 serviceLocator 的私有方法。源语言和目标语言对使用变量 language 指定。此变量必须能包含 Translation Server 能够理解的 String 类型的缩写值。Translation Server 使用此缩写指定语言翻译方法。例如,西班牙语到英语的翻译使用 enes 指定。有关语言缩写的完整列表,请参阅随 Translation Server 提供的 WebSphere Translation Server 信息中心。

  2. 正如前面提到的,上面的代码使用了一个名为 serviceLocator 的 EJB 私有方法,负责调用 Translation Server 和获取能执行所请求的翻译工作的 com.ibm.lt.LTinterface 实现,如下所示:
    private static LTinterface serviceLocator(String language)  {
    		LTinterface service = null;
    		try {
    			service = (LTinterface) serviceHash.get(language);
    			if (service == null){
    				service = (LTinterface) LTengine.GetService(hostname, language);
    				serviceHash.put(language, service);
    			}
    		} catch (Throwable e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return service;			
    			

    由于性能原因,请将服务缓存到名为 serviceHash 的本地散列表中,从而减少为每个 EJB 调用获取翻译服务的需求。当然,LTinterface 对象也可能会过期(例如,如果 Translation Server 恰巧关闭)。由于这个原因,在下面所示的 retryService 方法中,可以执行以下简单的重试逻辑,以从本地散列表取回 LTinterface 并再次调用 serviceLocator 方法。

    	private static LTinterface retryService(String language) {
    		LTinterface service;
    		serviceHash.remove(language);
    		service  = serviceLocator(language);
    		return service;
    	}
    
    	}
    			

  3. 要进行实际的翻译,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;
    	}
    			

    上面的方法直接使用所给的 LTinterface 句柄返回所提供的文本(即 preTranslation 字符串)的翻译。翻译工作是使用 Translation Server API 方法 jltTranslate 完成的,该方法接受 preTranslation 字符串和 java.lang.Object(表示翻译工作的选项)作为参数。我们使用了表示纯文本的选项,但还存在其他选项,如让 Translation Server 返回 HTML 的选项。您可能已经猜到,选项值 text 返回文本。有关有效选项的更多信息,请参考随产品一起提供的 Translation Server 信息中心。

    请注意, EJB 使用静态字符串将主机名和选项硬编码到了源代码中:

    private static String hostname = "wts.halcyon.ibm.com";
    private static String options = "*format=text";
    			

    我们使用此方法仅为了进行演示。在生产环境中,一个 Java 最佳实践是从源包中检索此类配置信息。

  4. 最后,确保将 Bean 的 getTranslation 方法向 EJB 的本地接口公开。可以通过使用 J2EE Hierarchry 窗格的 Outline 视图中的 Promote to Local Interface 工具来完成此任务,如图 14 中所示:

    图 14. 将 getTranslation 方法提升到本地接口
    图 14. 将 getTranslation 方法提升到本地接口

现在要对本地 EJB 方法进行测试,以确定其是否正确工作。可以通过使用 Application Developer Universal Test Client (UTC) 完成此工作。如果不熟悉 UTC,请参阅参考资料部分,以了解如何使用该工具测试 EJB。





回页首


将本地 EJB 方法作为 Web 服务公开

现在可以将所创建的无状态会话 Bean 作为 Web 服务公开了。具体来说,需要将会话 Bean 的 getTranslation 方法公开(目前仅对本地接口公开)。将使用 Web Services 向导创建 Web 服务接口,具体步骤如下:

  1. 在 Project Explorer 视图中,右键单击早些时候创建的 EJB 无状态会话 Bean,然后选择 New => Other
  2. 展开 Web Service 目录,选择 Web Service 向导,然后单击 Next

    图 15. 选择 Web Service 向导
    图 15. 选择 Web Service 向导

    如果 Web Service 向导未显示,请验证是否选中了 Show all wizards

  3. 在 New Web Service 向导中,进行以下操作:
    • 确保 Web service typeEJB Web Service
    • 选中 Start Web Service in Web project
    • 单击 Next


    图 16. 指定 Web 服务类型
    图 16. 指定 Web 服务类型

  4. 继续单击 Next,直到看到 Web Service Java Bean Identity 对话框为止。在该对话框中,执行以下操作:
    • 选中 getTranslation 方法,以指示从本地接口公开哪些方法。在此例中,仅要公开 getTranslation 方法。
    • 单击 Finish


    图 17. 选择 getTranslation 方法
    图 17. 选择 getTranslation 方法

    向导将创建通过 Web 服务公开 EJB 本地方法所需的所有文件,包括服务端点接口。

运行了该向导后,将会看到在 ejbModule/META-INF 目录中您的 EJB 项目内,在 wsdl 目录下创建了一个名为 wts.wsdl 的文件。此 WSDL 文件是传递给 Web 服务使用者的文件,以便它们使用您的翻译 Web 服务。连接到您的 Web 服务的客户机应用程序将使用此 WSDL 文件进行连接。

如果打开 WSDL 文件,会看到该 Bean 方法通过 portType 定义公开。wsdl:portType 定义提供了要执行的操作的抽象定义。您将在此处看到 getTranslation 操作。请注意,getTranslation 操作和名为 getTranslation() 的本地 EJB 无状态会话 Bean 方法具有相似性:

   <wsdl:portType name="WTSBean">

      <wsdl:operation name="getTranslation">

         <wsdl:input message="impl:getTranslationRequest" 
                        name="getTranslationRequest"/>

         <wsdl:output message="impl:getTranslationResponse" 
                         name="getTranslationResponse"/>

      </wsdl:operation>

   </wsdl:portType>
			

WSDL 文档中剩下的工作是将该操作映射到我们的本地无状态会话 Bean 接口。绑定定义将 SOAP 协议定义为网络协议。最后,服务定义将定义服务的地址,以便提供前面定义的操作。将通过此服务接口来使用 Application Developer Web Services Explorer 测试您的操作。

使用 Web Services Explorer 测试 Web 服务

正如前面提到的,在现实世界中,将由有关方获取您的 WSDL 文件,然后使用其创建自己的 Web 服务使用应用程序。

为了模拟 Web 服务使用者的角色,Application Developer 提供了 Web Services Explorer 来测试您的 Web 服务项目。要启动 Web Services Explorer,请执行以下操作:

  1. 在 Package Explorer 内,从 Web Services 文件夹导航到下面的 Services 文件夹。在此文件下,展开 WTSBeanService
  2. 展开该服务,并右键单击 WSDL:/Translation ServerEJB/ejbModule/META-INF/wsdl/WTSBean.wsdl,然后从菜单中选择 Test with Web Services Explorer

    图 18. 使用 Web Services Explorer 选择 WSDL 文件
    图 18. 使用 Web Services Explorer 选择 WSDL 文件

    将随即显示 Web Services Explorer。您可以在 Explorer 中测试 WSDL 文件中定义的各个操作。
  3. Actions 窗体中,执行以下操作:
    • 单击 getTranslation 操作的链接。现在可以调用 getTranslation WSDL 操作了。
    • 指定 enes 作为 Language string(指定英语到西班牙语翻译)。
    • 输入 My cat likes milk. 作为 preTranslation string
    • 单击 Go

      翻译后的字符串应显示在 Status 窗体中,如图 9 中所示。



    图 19. 测试翻译 Web 服务
    图 19. 测试翻译 Web 服务

成功测试了 Web 服务后,可以参阅相关文档,以了解如何将其部署到 WebSphere Application Server V6 中。

结束语

WebSphere Translation Server 提供一种经济高效的方法来使用最终用户的语言满足全球受众的需求。在本文中,您了解了如何将 WebSphere Translation Server 的翻译功能作为可部署到 J2EE 应用服务器(如 WebSphere Application Server Version 6)的 Web 服务公开。通过使用此方法,可以利用使用各种编程语言编写的现有应用程序,通过对其进行修改,以充当所创建的翻译 Web 服务的使用者,从而使其支持多种语言。



参考资料

学习

获得产品和技术
  • 使用 IBM 试用软件开发您的下一个项目,可直接从 developerWorks 下载这些试用软件。


讨论


作者简介

Kulvir Singh Bhogal 是一名 IBM Software Services for WebSphere 顾问,负责在全美国各地的客户站点上开发和实现 Java 解决方案。您可以通过 kbhogal@us.ibm.com 与 Kulvir 联系。


Mark Talbot 的照片

Mark Talbot 在 IBM 的 Industry Solutions 工作,负责开发金融行业方面的应用程序。您可以通过 talbotm@us.ibm.com 与 Mark 联系。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?




回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款