まえがき
私はかつて夕方静かに座って、英語のサイトを読みました。 いくつかのフレーズを翻訳する必要があるとき、いつものように、新しいタブを開いて、 translate.google.ruと入力し、コピーし、テキストを貼り付け、翻訳をクリックし、読みました。 そして、結局のところ、テキスト、いくつかのフレーズ、または段落全体を翻訳する必要があるたびに、このような長いアクションシーケンスを実行する必要があります。 はい、任意のクライアントを使用して翻訳できますが、プログラムウィンドウを開いたり、他のウィンドウの下から削除したりする必要があります。 はい、シーケンスは短くなりますが、それでも長くなります。 コピーするアクションのシーケンスを短くして、ボタンをクリックしてください。 そこで、アプレットのアイデアが浮上しました。 彼の論理はこれです:
- パネルにGTranslateボタンが表示されます
- テキストを翻訳する必要がある場合は、コピーしてボタンをクリックしてください
- 言語を自動検出
そして、 Habrを含む、アプレットの作成に関するさまざまな記事を読み始めました。 全体で、gtk.Label()が使用されましたが、これは正しいです。これらのアプレットは情報の表示に使用されました。 アプレットはパネルに情報を表示しません。これは、翻訳とダイアログボックスの間の仲介にすぎません。 したがって、gtk.Button()を使用します。 それでは始めましょう!
ダイアログボックス
最初は、easygui.codebox要素を使用してテキストを表示していましたが、標準パッケージにはeasyguiがなく、強制的にインストールする必要はありませんでした。 単純なコントロールを作成することにしました。 最初の言語のテキスト、翻訳された言語のテキスト(翻訳をコピーするためのテキストボックスである必要があります)、そしてもちろん、「OK」という碑文のボタンの3つのコントロールが必要です。 これら 2つのチュートリアルのおかげで、ダイアログボックスが表示されました。
一般に、コードは理解可能で、少しコメントされています。
import pygtk
pygtk.require( "2.0" )
import gtk
"" " ! =)" "" <br/>
#http: //www.pygtk.org/docs/pygtk/class-gdkwindow.html <br/>
#http: //www.moeraki.com/pygtktutorial/pygtk2tutorial/
"" " " "" <br/>
class ShowTextDialog():
def __init__(self):
self.default_window_name= "GTranslate [Neon Mercury]"
self.window=gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_title(self.default_window_name)
self.window.connect( "delete_event" , self.delete_event)
self.window.set_border_width(10)
self.box=gtk.VBox()
self.window.add(self.box)
"" " Label " "" <br/>
self.info=gtk.Label()
self.box.pack_start(self.info, True, False, 0)
"" " , " "" <br/>
self.textview=gtk.TextView()
self.box.pack_start(self.textview, True, True, 0)
self.button=gtk.Button( "OK" )
self.button.connect( "clicked" , self.button_clicked)
self.box.pack_start(self.button, False, False, 0)
self.info.show()
self.textview.show()
self.button.show()
self.box.show()
self.window.move(100, 100)
self.window.resize(640, 480)
"" "info - label, textbox_info - textview" "" <br/>
"" " " "" <br/>
def show(self, info, textbox_info, main_window_title= "GTranslate [Neon Mercury]" ):
info=self.process_text(info)
textbox_info=self.process_text(textbox_info)
self.info.set_text(info)
self.textview.get_buffer().set_text(textbox_info)
self.window.set_title(main_window_title)
self.window.show()
def hide(self):
self.window.hide()
def button_clicked(self, widget, data=None):
self.hide()
"" " , " "" <br/>
def delete_event(self, widget, event , data=None):
self.hide()
"" " . Google , 65536 :)" "" <br/>
"" " , !" "" <br/>
"" " max_len . " "" <br/>
"" "max_len , ." "" <br/>
def process_text(self, text, max_len=160):
result= "" <br/>
i=0
for char in text:
i+=1
if i>max_len and char == " " :
result+= "\n" <br/>
i=0
else :
if char == "\n" :<br/>
i=0
result+= char <br/>
return result
* This source code was highlighted with Source Code Highlighter .
翻訳用ライブラリ
テキストを翻訳するために別のライブラリも作成されました。 また、非常にシンプルで、3つの機能があります。 1つ目は、最も一般的に使用されるHTMLニーモニックを同等のものに置き換えます。 それらはたくさんあるので、Wikipediaを解析する簡単なスクリプトを作成し、実際に機能全体を作成しました。 ハブには投稿しません。非常に長く、すべてがソースにあります。 テキストのソース言語を定義する2番目の関数も簡単です。 テキストのすべての文字を使用します。 英語のアルファベットからのものである場合、ロシア語からの場合は1つのカウンターを増やし、次に別のカウンターを増やします。 つまり、テキストの主要言語を決定し、それをソースと見なします。 3番目の機能はトランスレーターです。 ソース言語を決定し、Googleにリクエストを送信し、翻訳されたテキストを受信します。
"" " . - ." "" <br/>
"" " . , . ." "" <br/>
"" " - !" "" <br/>
def determine_languages(text):
en_chars_count=0
ru_chars_count=0
for char in text:
if ( char >= "a" and char <= "z" ) or ( char >= "A" and char <= "Z" ):
en_chars_count+=1
elif ( char >= "" and char <= "" ) or ( char >= "" and char <= "" ):
ru_chars_count+=1
source_lang= "en" <br/>
dest_lang= "ru" <br/>
if ru_chars_count>en_chars_count:
source_lang, dest_lang= "ru" , "en" <br/>
return source_lang, dest_lang
"" " ." "" <br/>
def translate(text):
source_lang, dest_lang=determine_languages(text)
params ={ "ie" : "UTF-8" , "text" :text,
"sl" :source_lang, "tl" :dest_lang}
params =urllib.urlencode( params )
headers={ "Content-Length" : "%d" % len( params )}
connection=httplib.HTTPConnection( "translate.google.ru" )
connection.request( "POST" , "/translate_t" , params , headers)
response=connection.getresponse()
answer=response.read()
index=answer.find( "id=result_box" )
if index!=-1:
index+=24
"" " " "" <br/>
translated_text=answer[index:answer.find( "</div" , index)]
translated_text=replace_html_mnemonics(translated_text)
translated_text=translated_text.decode( "koi8-r" )
return translated_text
else :
return ""
* This source code was highlighted with Source Code Highlighter .
アプレット
さて、ここにアプレット自体の実際のコードがあります。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import gtk
import gnomeapplet
import NeonDialogs
from GTranslateLib import translate
"" " ! =)" "" <br/>
#http: //www.citforum.ru/programming/python/gnome_applets/
"" " " "" <br/>
class GTranslate(gnomeapplet.Applet):
def __init__(self, applet, iid):
self.applet=applet
self.applet.set_name( "GTranslate" )
self.box=gtk.HBox()
self.applet.add(self.box)
self.button=gtk.Button( "GTranslate" )
self.box.add(self.button)
self.applet.show_all()
self.button.connect( "clicked" , self.on_button)
self.dialog=NeonDialogs.ShowTextDialog()
"" " , " "" <br/>
"" " , ." "" <br/>
def on_button(self, widget, data=None):
text=self.get_text_from_clipboard()
translated_text=translate(text)
self.dialog.show(text, translated_text)
"" " ... ." "" <br/>
def on_ppm_about(self, event , data=None):
gnome.ui.About( "GTranslate" , "1.0" , "GPL General Public License" ,
" !" ,
[ "Neon Mercury <wishmaster2009@gmail.com>" ,]).show()
"" " . clipboard , " "" <br/>
"" " - . ." ""
def get_text_from_clipboard(self):
clipboard=gtk.Clipboard(display=gtk.gdk.display_get_default(), selection= "CLIPBOARD" )
text=clipboard.wait_for_text()
clipboard.store()
return text
def applet_factory(applet, iid):
GTranslate(applet, iid)
return True
"" " . ( )." "" <br/>
def run_in_window():
main_window=gtk.Window(gtk.WINDOW_TOPLEVEL)
main_window.set_title( "GTranslate [debug mode]" )
main_window.connect( "destroy" , gtk.main_quit)
app=gnomeapplet.Applet()
applet_factory(app, None)
app.reparent(main_window)
main_window.show_all()
gtk.main()
"" " " ""
def run_in_panel():
gnomeapplet.bonobo_factory( "OAFIID:GTranslate_Factory" ,
GTranslate.__gtype__,
"GTranslate" , "1.0" , applet_factory)
"" " , run_in_panel() run_in_window()" "" <br/>
run_in_panel()
* This source code was highlighted with Source Code Highlighter .
.serverファイル
自分でアプレットを記述/コピーした場合、このアプレットの.serverファイルは次のとおりです。
< oaf_info >
< oaf_server iid ="OAFIID:GTranslate_Factory"
type ="exe" location =" /home/neon/applets/GTranslate/GTranslate.py " > <br/>
< oaf_attribute name ="repo_ids" type ="stringv" > <br/>
< item value ="IDL:Bonobo/GenericFactory:1.0" /> <br/>
< item value ="IDL:Bonobo/Unknown:1.0" />
</ oaf_attribute > <br/>
< oaf_attribute name ="name" type ="string" value ="GTranslate factory" /> <br/>
< oaf_attribute name ="name-ru" type ="string" value =" GTranslate" /> <br/>
< oaf_attribute name ="description" type ="string" value ="Factory of GTranslate" /> <br/>
< oaf_attribute name ="description-ru" type ="string" value =" GTranslate" /> <br/>
</ oaf_server > <br/>
< oaf_server iid ="OAFIID:GTranslate"
type ="factory" location ="OAFIID:GTranslate_Factory" > <br/>
< oaf_attribute name ="repo_ids" type ="stringv" > <br/>
< item value ="IDL:GNOME/Vertigo/PanelAppletShell:1.0" /> <br/>
< item value ="IDL:Bonobo/Control:1.0" /> <br/>
< item value ="IDL:Bonobo/Unknown:1.0" /> <br/>
</ oaf_attribute > <br/>
< oaf_attribute name ="name" type ="string" value ="GTranslate" /> <br/>
< oaf_attribute name ="name-ru" type ="string" value ="GTranslate" /> <br/>
< oaf_attribute name ="description" type ="string" value ="GTranslate service of text translation." /> <br/>
< oaf_attribute name ="description-ru" type ="string" value =" GTranslate." /> <br/>
< oaf_attribute name ="panel:category" type ="string" value ="Accessories" /> <br/>
< oaf_attribute name ="panel:icon" type ="string" value =" /home/neon/applets/GTranslate/GTranslate.png " /> <br/>
</ oaf_server > <br/>
</ oaf_info > <br/>
* This source code was highlighted with Source Code Highlighter .
注:選択した行を自分のものに置き換えます。 1つは、メインアプレットファイル(GTranslate.py)へのパスです。 2番目はアプレットの写真です(オプションですが、美しい)。 GTranslate.pyファイルを実行可能にすることを忘れないでください。
おわりに
これは 、アプレットソースとインストールスクリプトを含む(tar.gz) ( rar )アーカイブです。 アプレットをシステムにインストールするには、root権限でinstall.pyファイルを実行する必要があります(ファイルを/ usr / lib / bonobo / servers /にコピーするため)。
次に、翻訳のために、テキストを選択して、パネルのGTranslateボタンを押します。 頑張って
UPD: PyGTKブログに移動しました