随笔 - 2047  文章 - 71 评论 - 10629 trackbacks - 253

提示1: 点击 标题 可进入首页;   提示2: 从搜索引擎中搜索 万一 可迅速找到这里.
昵称:万一
园龄:4年3个月
荣誉:推荐博客
粉丝:349
关注:34

随笔分类(2499)

随笔档案(2051)

积分与排名

  • 积分 - 4148339
  • 排名 - 4

最新评论


刚刚从博客园看到有朋友用 C# 做了这么个东西, 我用 Delphi 尝试了一下.

需要先去申请一个 AppID: http://www.bing.com/toolbox/bingdeveloper/
使用帮助在: http://msdn.microsoft.com/en-us/library/dd576287.aspx

uses MsXML;

{函数}
function Translate(AAppID: string; AText: string; InLanguage: string='en'; OutLanguage: string='zh-CHS'): string;
const
  BaseUrl = 'http://api.microsofttranslator.com/V2/http.svc/Translate?appId=%s&text=%s&from=%s&to=%s';
var
  Url: string;
  req: IXMLHTTPRequest;
begin
  Url := Format(BaseUrl, [AAppID, AText, InLanguage, OutLanguage]);
  req := CoXMLHTTP.Create;
  req.open('Get', Url, False, EmptyParam, EmptyParam);
  req.send(EmptyParam);
  Result := req.responseText;
  Result := Copy(Result, 68+1, Length(Result)-68-9); //去掉前后的标签
end;

{调用测试}
procedure TForm1.Button1Click(Sender: TObject);
const
  myAppId = '65FCA293BDB85C98D16A567C3FECE22272B6****'; //这是我申请的 AppID, 隐藏了后四位
begin
  Memo2.Text := Translate(myAppId, Memo1.Text);
end;


效果图:



使用 Indy:

uses IdHTTP;

function Translate2(AAppID: string; AText: string; InLanguage: string='en'; OutLanguage: string='zh-CHS'): string;
const
  BaseUrl = 'http://api.microsofttranslator.com/V2/http.svc/Translate?appId=%s&text=%s&from=%s&to=%s';
var
  Url: string;
  stream: TStringStream;
  idHttpObj: TIdHTTP;
begin
  stream := TStringStream.Create;
  idHttpObj := TIdHTTP.Create(nil);
  Url := Format(BaseUrl, [AAppID, Trim(AText), InLanguage, OutLanguage]);
  idHttpObj.Get(Url, stream);
  Result := stream.DataString;
  Result := Copy(Result, 68+1, Length(Result)-68-9); //去掉前后的标签
  idHttpObj.Free;
  stream.Free;
end;

posted on 2011-11-14 17:59 万一 阅读(1380) 评论(15) 编辑 收藏

FeedBack:
#1楼 2011-11-15 09:36 skymesh      
呵呵,正需要
 回复 引用 查看   
#2楼 2011-11-15 15:18 浓 茶      
CoXMLHTTP应该是win系统自带的组件,如果要跨平台使用,是否需要用indy组件来进行下载?如果使用该组件的话,会不会对返回的数据有影响?
 回复 引用 查看   
#3楼[楼主2011-11-15 15:54 万一      
@浓 茶
附在后面了.

 回复 引用 查看   
#4楼 2011-11-15 16:46 upc100      
这个功能很强大,能用的到得,谢谢啦。
 回复 引用 查看   
#5楼 2011-11-16 09:41 浓 茶      
@万一
谢谢

 回复 引用 查看   
#6楼 2011-11-19 09:46 Bach      
1、跟google的翻译api差不多,不知道速度是不是快一点。
2、不知道对超长文章如何处理,我已在万一老师另一篇关于用xmlhttp调用google翻译api作过评论,其中有超长文本处理方法。

--------------------------------------------------------
第一次知道博客园是从万一老师这里开始的,所以我每次进博客园,都是先进老师的博客。

 回复 引用 查看   
#7楼 2011-11-21 02:09 findumars      
万一兄最近在忙啥?怎么不见更新了?
 回复 引用 查看   
#8楼[楼主2011-11-21 08:43 万一      
@Bach
如果我要用到, 应该会首选 Google.
@findumars
出发了几天, 谢谢关注.

 回复 引用 查看   
#9楼[楼主2011-11-22 14:22 万一      
@云朵儿呀
中文需先编码为 UTF-8

 回复 引用 查看   
#10楼 2011-11-22 15:20 云朵儿呀      
@万一
使用UTF8Encode()和UTF8EncodeToShortString()都不行
这个问题都困扰好久了

 回复 引用 查看   
#11楼[楼主2011-11-22 15:36 万一      
我参照万一老师的例子做了一个多国语言互相翻译的例子,输入的语言可以自动判断,还有不完善处,例如,输出语言标示符可以从API得到,但是怎么转化为汉字描述等等。还有,新开发的exe被360误认为木马,怎么解决?
源代码比较长,就不贴在这里了,贴在我的博客里面
http://www.cnblogs.com/shanmx/archive/2011/11/25/2262639.html

 回复 引用 查看   
#13楼 2011-12-10 16:37 delphing      
发现问题 翻译出来的文章无排版和段落格式了..
 回复 引用 查看   
#14楼 2011-12-13 14:03 淡茶N+1      
万老师你好
  我想问一下,关于delphi申请内存的上限问题。
  我用Getmem,或者其他的方式获得内存,比如申请一个非常大的内存空间。感觉不够用,再次申请的时候发现outofmemory了。
  应该是内存申请有总量限制的吧??有办法弄到更多的内存吗??纯粹个人特殊爱好。

  具体申请,我原来是这么考虑的,比如我一个Record需要N字节的内存,我申请内存按 Getmem(N*1000000);一次申请一百万条记录的内存地址备用。如果不够的,我会继续申请,当然申请的内存地址都保存在数组里,当程序关闭的时候,自动释放用的。但是程序运行需要多次申请内存,结果outofmemory了!!

 回复 引用 查看   
#15楼 2012-02-04 11:28 好小爱新      
@淡茶N+1
改成64位吧,32位的单进程上限是2GB。

 回复 引用 查看