Posted on 2007-09-04 15:55
dennis 阅读(692)
评论(0) 编辑 收藏 所属分类:
动态语言 、
my open-source
过去写的那个调用google翻译的翻译脚本,一直在用。那个版本只能处理单个单词,如果要翻译一行或者一段语句,尽管稍微修改下就可以,但失去了我想要的便利性。今天看了看TK,顺手写了个GUI版本的,采用一次请求一个线程,倒是便捷不少。在windows上,你需要到
这里下载安装ActiveTcl才可以运行。
代码如下:
require 'net/http'
require 'tk'
require 'logger'
#设置代理
$proxy_addr='x.x.x.x'
$proxy_port='80'
class GoogleTranslate
def initialize(url)
@log = Logger.new("translate.log")
@log.level = Logger::WARN
@url=url
ph={'padx'=>50,'pady'=>10}
root=TkRoot.new{ title 'google 翻译程序'}
top=TkFrame.new(root) {background "white"}
#checkbutton,用于选择翻译类别
checked=TkVariable.new
TkCheckButton.new(top) do
text 'cn-en'
variable checked
pack({'padx'=>8,'pady'=>10})
end
TkLabel.new(top){ text 'Enter text:';pack(ph)}
@text=TkVariable.new
@result=TkVariable.new
TkEntry.new(top,'textvariable'=>@text,'width'=>40).pack(ph)
pig_b=TkButton.new(top){text '翻译';pack ph}
#翻译按钮事件
pig_b.command{ translate(checked.value) }
TkLabel.new(top){ text 'Translate Result:';pack(ph)}
TkEntry.new(top,'textvariable'=>@result,'width'=>40).pack(ph)
pig_a=TkButton.new(top) do
text 'Exit'
pack ph
command {exit}
end
top.pack('fill'=>'both','side'=>'top')
end
def translate(checked)
langpair='en|zh-CN'
langpair='zh-CN|en' if checked=='1'
#开一个新线程处理
Thread.new do
begin
response=Net::HTTP.Proxy($proxy_addr,$proxy_port).post_form(URI.parse(@url),
{'text'=>@text.value,'langpair'=>langpair})
response.body =~ /<div id=result_box dir=ltr>(.*?)<\/div>/
@result.value=$1
rescue Exception=>e
@log.error(e)
end
end
end
end
GoogleTranslate.new("http://translate.google.com/translate_t")
Tk.mainloop