翻译和有道翻译API的封装与利用


2023年12月15日发(作者:pots是什么意思)

电脑编程技巧与维护 百度翻译和有道翻译API的封装与利用 黄皓 (中山市广播电视大学,广东中山528400) 摘要:国内提供在线翻译服务的公司主要有百度和有道,两者均提供了互联网应用编程接口。讨论将这两个接口 再封装为一个DLL文件,支持动态链接导出函数和COM两种方式,使得各种编程语言能以更简单、灵活便捷的方 式使用这两个API。 关键词:在线翻译;百度;有道;API编程接口;动态链接库;COM编程接口 Package and Use Baidu Translati0n API&Youdao Translation API HUANG Hao (Zhongshan Radio&Televisoin University,Guangdong Zhongshan 528400,China) Abstract:Domestic to provide online translation services companies mainly Baidu and Youdao,both of which provide In— ternet application programming interfaces.This article discusses these two interfaces and then repackaged as a DLL file, which support DLL exposed functions and COM methods,SO that a variety of programming languages can be more simple, lfexible and convenient way to use these two API. Key words:online translation;Baidu;Youdao;AP1 programming interface;DLL;COM API programming interface 在线翻译是机器翻译发展的重要方向。特别是在科技文 章的翻译方面发挥着越来越重要的作用。国内著名的在线翻 译提供商有百度翻译和有道翻译等。百度翻译是百度公司提 供互联网服务之一,提供多国语言之间的语句翻译。百度公 司从2010年1月开始研究机器翻译,翻译服务自2011年6 月上线,并得到国家863计划的支持。有道翻译是网易公司 属下有道搜索提供的互联网服务.通过翻译和查词的数据接 El,用户可以获得一段文本的翻译结果或者查词结果。两者 译API再封装,提供一种简洁、易用的编程接口就显得十分 必要了。在Windows中,DLL(动态链接库)是最基本的一种 编程接口,应用程序通过运行时链接DLL文件中的导出函数, 从而实现二进制代码的共享与复用。绝大部分桌面编程语言, 如C、c++、Delphi、VB等都可以直接调用DLL中的API函 数。然而,脚本编程语言如ASP、PHP、JavaScript、VBSeript 等缺乏直接使用DLL的能力,必须通过更高级的编程接 口——C0M。 所采用的自动翻译技术均是利用搜索引擎从互联网中萃取海 量双语资源.自动学习语言翻译模式并从中智能地选择最优 译文。除了在线提交文本和网页地址进行翻译以外。两者还 提供了应用程序编程接口(API)。 COM是组件对象模型的简称.是由微软公司提出的一种 二进制代码共享机制。与DLL相比,COM具有跨语言、跨平 台、可重用、可扩展等特性,特别是客户端可以在不知道 COM组件服务接口的情况下,动态查询、动态调用COM组件 服务的接口方法。而DLL存在诸如语言限制、动态库的版本 混杂、接口的一致性难以保证等问题。 1在线翻译API 百度翻译API和有道翻译API都是互联网服务应用编程 接口,简单地说就是通过Internet提供翻译服务。其本质上属 于Web Service,但足并没有采用DCOM、CORBA及SOAP等 将百度翻译和有道翻译API重新封装,既提供动态链接库 的导出函数.又提供COM对象,满足不同类型编程语言的需求。 机制,而是直接通过H1TrP协议与客户程序进行通信。应用程 序按要求准备好相关参数,使用Hr丌P协议调用接口,接口对 源文数据进行机器翻译,并返回处理的结果。应用程序无需 3百度翻译与有道翻译API概述 百度翻译API与有道翻译API的使用方式是相似的。 3.1申请key 关心接口处理的细节。接口提供了不同语言、系统甚至平台 之间功能的利用。API使得第三方可以利用百度或有道翻译提 不管是百度翻译还是有道翻译API的用户,首先都必须 从相应网站获得一个Key,作为请求服务的许可。注册为百度 开发者.然后参照http://developer.baidu.com/wiki/index.php?ti— 供特服务(如嵌入到浏览器、网站或应用程序中),或使得 翻译更具有灵活性以满足用户个性化的需要。 de=帮助文档首页/网站接入从门指南,在开发者服务管理控 2重新封装在线翻译API 虽然百度、有道在线翻译API简化了编程接口,但是并 非所有的编程语言都可以直接支持互联网功能和H1TI1P协议的 作者简介:黄皓(1969一),男,讲师,硕士,研究方向:计 算机及应用。 收稿日期:2014—05—03 使用,特别是脚本语言。因此,如何在本地对百度、有道翻 \ 20丽14. 16与 

NETW0RK AND C0MMUNICATION 制台中.创建新的应用,获取相应的API Key。在有道翻译的 页面http://fanyi.youdao.com/openapi?path=data-mode输入自己 的网站描述(名称、地址、说明)和联系邮箱,提交申请后, 很快就可以得到一个邮件回复,上面有你的key。 3.2数据接口 百度翻译可以使用H1_I1P的get或post方式发出请求,有道 翻译使用HTYP的get方式。为方便起见,统一使用get方式。 (1)百度翻译的请求方式 http://openapi.baidu.com,pub1ic/2.O/bmt/translate?ctient_id= YourApiKev&from=auto&to=auto&q=要翻译的文本 参数说明: from源语言语种:语言代码或auto,英文为en。 to目标语言语种:语言代码或auto,中文为zh。 client—id开发者在百度开发者中心注册得到的授权key q待翻译内容。该字段必须为uTF一8编码,需要进行 udencode编码。 (2)有道翻译的请求方式 http://fanyi.youdao.com/openapi.do?keyfrom=<keyfrom>&key= <key>&type=data&doctype:<d0ctype>&versi0n:1.1&q:要翻译的 文本 参数说明: keyfrom注册的名称 key授权key type返回结果的类型,固定为data doctype返回结果的数据格式,xml或jSOIl或jsonp version版本.当前最新版本为1.1 q要翻译的文本,必须是UTF一8编码,字符长度不能超 过200个字符,需要进行udencode编码 0nly可选参数。dict表示只获取词典数据,trans]ate表 示只获取翻译数据,默认为都获取 值得注意的是,词典结果只支持中英互译,翻译结果支 持英日韩法俄西到中文的翻译以及中文到英语的翻译。 3.3返回结果 ①百度翻译返回的数据为json包,翻译正常会返回如下 例中的内容: {’.from”:”en”,”to”:”zh”,”Vans_result”:【{.t src”:”today”,”dst”:”\u4eca\u5929”}】} trans_resuh为一个数组,其中每一个{}就是一个段落。 译文中的英文、数字符号保持不变,而汉字等字符以 “\uxxxx”的形式返回其UNICODE 如出错,则在返回的json中,包含err code字段。 ②有道翻译返回的数据可以为xml、json或jsonp格式, 本文以ison为例: {t’translation”:【_t<译文>”】,”query”:”<原文>”,” errorCodeII.<错误代码>l 结果为UTF一8编码。如出错则错误代码不为0。 3.4限制 在百度翻译API中,待翻译文本的长度不能超过2K个字 网络与通信 符,对普通开发者提供1000次//J、时限制,如需扩容,可在百 度开发者中心的管理控制平台中申请更高频次。 有道翻译API的待翻译文本长度不能超过200个字符, 请求频率限制为每小时1000次,超过限制会被封禁。如需要 更多的请求次数,必须向有道翻译管理员发邮件申请。 4使用PowerBASIC封装百度、有道翻译API PowerBASIC可以生成非常紧凑的机器代码.速度甚至可 以超过c编写的程序,它提供了非常丰富的语句和函数.特 别是具有可以直接调用Win32API、嵌入汇编指令等特性,非 常适宜编写系统级的应用。 4.1输出DLL 在源程序中加入下面的编译器指令和导出函数定义,即 可编译生成供外部程序调用的动态链接库文件fanyi.dll。 #COMPILE DLL“fanyi” 指示编译器生成DLL FUNCT10N baiduTranslate AL/AS” baiduTranslate” (BYVAL S AS String)EXPORT AS String …具体代码… END FUNCTION 4.2提供COM支持 脚本语言如ASP、VBScript、Javascript、PHP等大多不能 直接调用DLL,微软的COM组件提供了更高层次的编程接口。 PowerBASIC可以通过以下代码方便地生成COM服务程序。 #COM NAME”Fanyi”,1.0 #COMTLIB 0N #RESOURCE TYPELIB,l,”fanyi.ifb” CLASS Fanyi AS COM 定义COM类 INTERFACE iFanyi 定义接口 INHERIT IDISPATCH 继承自凋度接口 METHOD baidu ALIAS”Baidu” (S AS STRING) AS STRING 定义Baidu方法 METHOD=UCODE¥(baiduTranslate(AC0DE¥(s))) END M.ETHOD END INTERFACE END CLASS 4.3源程序 手}COMPILE DLL”fanyi” DIMALL #COM NAME”Fanyi”.1.0 #COMTLIB ON #RESOURCE TYPELIB,l’”fanyi.ifb” #INCLUDE”Win32API.inc” 使用Windows系统AH, 如字符编码转换 #INCLUDE”Winlnet.Inc” 使用API访问互联网 定义COM类,GUID和CLSID由编译器给定 CLASS Fanyi AS COM NITERFACE iFanyi Ⅱ HERIT IDISPATCH METHOD baidu ALIAS”Baidu” (S AS STRING) AS STRING METHOD=UCODE¥(baiduTranslate(ACODE ¥(s))) END METHOD METH0D youdao AUAS”Youdao” (S AS STRING) 

电脑编程技巧与维护 AS STRD G METHOD=UCODE S(youdaoTranslate(ACODE S(s))) END METH0D END INTERFACE END CLASS 自定义类型用于互联网访问 TYPE tagDownloadlnfo hWndParent AS DWORD wMsg AS DW0RD uRLPatI1 AS ASCI1Z{2048 足够的uRL长度 Result AS LONG BytesRead AS DWORD lpBuf AS STRING R END TYPE GLoBAL hDl2 AS DW0RD 函数:访问URL并返回结果 入口:uRL字符串 出口:字符串 FUNCT10N qurryURL(S AS STRING) AS STR【NG L0CAL DownloadInfo AS tagDownloadlnfo.sBuffer AS ASCⅡZ 25ooO.x AS LoNG L0CAL hlnternetSession AS DWORD.hFile AS LONG. BytesRead AS DWORD Downloadlnfo.URLPath=S Downloadlnfo.hWndParent=0 Downloadlnfo.WMsg=%WM USER+1001 Downloadlnfo.1pBuf=VAI rrR fsBuffer) Downloadlnfo.BytesRead=0 Downloadlnfo.Result=0 Downloadlnfo.@lpBuf:SPACE¥(4096) 缓冲区大小 hInternetSession=IntemetOpen(”TranslateSession”. %INTERNETOPEN_TYPEPRECONFIG,BYVAL 0,BYVAL _0.0) hFile=InternetOpenUrl(hlnternetSession.DownloadIn— f0.URLPath. BYVAL 0.BYVAL 0.%INTERNE,r FLAG PRAG— MA NoCACHE 0R %INTERNET FLAG NO CACHE WRITE 0R% INTERNEr FLAG REL0AD.O1 InternetReadFile (hFile.BYVAL STR R(Down— loadlnfo.@lpBuf),4096,BYREF BytesRead) 翻译结果长度 均有限制,假定结果不超过4096字节 qurryURL=LEFT¥(DownLoadlnfo.@lpBuf,BytesRead) InternetCloseHandle hFile:IntemetCloseHandle hlnternet- Session END FUNCTION 百度翻译的导出函数 FUNCTIoN baiduTranslate ALIAS ” baiduTranslate” (BYVAL src AS STRING)EXPORT AS STRING LOCAL sS,aS(),p&,buf?0 s=UCODES(src) s=UI Encode(UnicodeToUtf8(STR R(s))) S=”http://openapi.baidu.com/public/2.0Bgmt/translate? client._id=在百度申请得到的Key&from=auto&to=auto&q=”& S 百度翻译APl的URL,必须使用你申请得到授权Key 2014.16 电■簟疆技巧与 I_E s=qurryURL(s) 访问百度翻译API,返回结果 p=INSTR(1,S,”””trans_result”…’) IF p>0 THEN 如存在译文结果,则对json中的字符 串进行处理 s¥=M口D¥(s,p) p=INSTR(1,S,”…’dst””:---) s=EX RACTS(MID¥(s,p+7),……l】l”) p=PARSECOUNT(s,”\u”) REDIM a(1 TO p) PARSE s,a(),”\u” s=a(1) FOR p=2 TO UBOUND(a) REDIM buf(1) DO WHILE LEN(a(p))<4 a(P)=”0”+a(P) L00P buf(O)=VAL C&h”+MID¥(a(p),3,2)) buf(1)=VAL(”&h”+LEF1’¥(a(p),2)) s+=ACODES(PEEKS(VAl TR(buf(O)),2)) IFLEN(a(p))>4 THEN s+=MID¥(a(P),5): REPLACE”\、” WITH”\”D s:REPLACE”V” WITH”/ ”IN S NEXT FUNCTION=s ENDIF END FUNCTION 有道翻译的导出函数 FUNCTION youdaoTranslate ALIAS”youdaoTranslate“ (BYVAL src AS STRING1 EXPORT AS STIUNG L0CAL s¥,t¥,i&,a¥() s=UCODES(src) s=URLEncode(UnicodeToUtf8(STRPTR(s))) s=”http://fanyi.youdao.com/openapi.do?keyfrom=在有道 翻译申请的应用名称&key=从有道获得的授权Key&type=da— ta&doctype_json&version=1.1&q=”&S 有道翻译的URL, 必须使用你从有道翻译申请得到的授权信息 s=qurryURL(s) 访问有道翻译API,返回结果 IF VAL(REMAINS(s,”””errorCode””:”))=0 THEN 如果没有错误则处理iSOIl中的译文 s=REMA ¥(s,”””translation…’:”) s=EXTRACT¥(2,S,”】,”) s=ACODES(UtfSToUnicode(STR R(s))) i_PARSEC0UNT(s,”””,”… ) REDIM a(1 To i) IF LEFT¥(s,1):……”THEN s=MID¥(s,2) IF砌GHTS(s,1)=…””’THEN s=LEFF¥(s,LEN(s) 一l、 PARSE s,a(),……,…”’ S=”” FORi=l TOUBOUND f s+=¥CRLF+a(i) NEXT FUNCTION=MID¥(s,3) END END FUNCT10N 函数:对URL进行编码 

NE IW0RK AND C0MMUNICATION FUNCTI ON URLEncode(strlnput AS STRING) AS STRING Local strOutput¥,intAscii%,i%,strTemp¥ FOR i=l TO LEN(strlnput) intAscii=ASC(MID¥(strlnput,i,1)) IF((intAscii<58)AND(intAscii>47))OR一 ((intAscii<91)AND(intAscii>64))OR一 ((intAscii<123)AND(intAscii>96))一 THEN strOutput=strOutput&CHR¥(intAscii) ELSE strTemp=TRIMS(HEX¥(intAscii)) strOutput=strOutput&”%”&LEFr¥(strTemp,2) END IF NEXT FUNCTION=strOutput END FUNCT10N 函数:将UTF8编码的字符串转换为UNICODE FUNCTION UtfSToUnicode(BYVAL ptrStr AS DWORD)AS STRING L0CAL length AS L0NG,Buffer AS DWORD,buf()AS BYTE length=MultiByteToWideChar(%CP—UTF8,%NULL, BYVAL ptrStr,一1,BYVAL%NULL,O&) 分配足够大小的内存 REDIM buf(1 TO length 2一1) MultiByteToWideChar(%CP__UTF8,0,BYVAL ptrStr,一 l,BYVAL VARPTR(buf(1)),length) FUNCTION=PEEK¥(VARPTR(buf(1)),length 2—1) END FUNCT10N 函数:将UNICODE编码的字符串转换为UTF-8 UFNCTION UnicodeToUtf8(BYVAL ptrStr AS DWORD)AS STRING LOCAL length AS LONG L0CALBufferAS DWORD length=WideCharToMultiByte(%CP_UTF8,%NULL, BYVAL ptrS ̄,一l,BYVAL%NULL,0,BYVAL%NULL,BY— VAL%NULL1 Buffer=HeapAlloc(GetProcessHeap 0,0,length) IFBufferTHEN WideCharToMultiByte(%CP_UTF8,0,BYVAL ptrStr ,一1,BYVAL Buffer,length,BYVAL%NULL,BYVAL%NULL) UFNCTION=PEEK¥(Buffer,length-1) HeapFree(GetProcessHeap 0,0,Buffer) END IF END FUNCT10N 限于篇幅,在本程序没有使用json包的解析,而是直接 对包内文本进行提取;程序也没有对输入字符串长度进行检 测。当翻译服务出现错误时返回空串。 5再封装接口的使用 编译生成fanyi.d1】文件后.用户可以在VB、C、Delphi等 桌面编程语言中,动态或静态地调用DLL中的导出函数进行 翻译,也可以注册为COM服务,用户程序通过创建对象,使 用Baidu和Youdao方法进行翻译。下面以Word中的VBA为 例介绍如何编程使用封装后的接口。 网络与通信 5.1调用DLL进行翻译 首先将fanyi.dll文件复制到系统文件夹(如:c:\win. dows\system32),然后打开Word,按ALT+F1 1进入VBA环 境,在“工程”窗口双击thisDocument,输入代码: Private Declare Function yOudaOTrans1ate Lib”fanyi.dll” (ByVal S As String)As String Sub main 0 S=”Long long ago,there was a war between the birds and the beasts.No one knows what they fought about.” s=baiduTranslate(s) Debug.Print S 直接调用DLL中的导出函数 Debug.Print youdaoTranslate(S) 用有道API将中文再 翻译为英文 End Sub 5.2使用C0M进行翻译 下面使用COM中的Fanyi对象,调用封装后的方法对一 个Word文档的每一段进行翻译。 首先注册C0M服务。在Windows中运行:regsvr32 fanyi. dll 然后如上所述在Word的VBA中输入代码: Sub main 0 Dim oT,oP As Paragraph,S As String Set oT=CreateObject C Fanyi”) 创建对象 For Each oP In Me.Paragraphs 对文档中的每一段落 S=oP.Range.Text 取段落文本 Debug.Print S 输出原文 Debug.Print oT.Baidu(S) 调用Baidu翻译,输出译文 Debug.Print oT.Youdao(S) 调用Youdao翻译并输出 Next End Sub 6结语 在线机器翻译可以大大提高翻译工作的效率.而在Win. dows平台上对百度翻译API和有道翻译API再封装,可以为 不同的程序设计语言提供更快捷、易用的编程接口.方便用 户通过编程使用百度、有道的云翻译服务,使翻译工作更具 有灵活性.可针对不同类型的文档内容.生成更具个性化输 出格式的翻译结果。 参考文献 [1】潘爱民.COM原理与应用[M】.北京:清华大学出版社, 1999. [2】COM Programming Introduce. 【3]百度开放云平台. f41有道翻译API. 漂 


本文发布于:2024-09-21 18:56:14,感谢您对本站的认可!

本文链接:https://www.17tex.com/fanyi/2989.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:翻译   接口   百度   提供   结果   编程   进行   服务
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议