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