庄周梦蝶

生活、程序、未来
   :: 首页 ::  ::  :: 聚合  :: 管理

ruby TK版本的google翻译机

Posted on 2007-09-04 15:55 dennis 阅读(685) 评论(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



只有注册用户登录后才能发表评论。


网站导航: