Gnome用のアプレットトランスレータの作成[python]

まえがき





私はかつて夕方静かに座って、英語のサイトを読みました。 いくつかのフレーズを翻訳する必要があるとき、いつものように、新しいタブを開いて、 translate.google.ruと入力し、コピーし、テキストを貼り付け、翻訳をクリックし、読みました。 そして、結局のところ、テキスト、いくつかのフレーズ、または段落全体を翻訳する必要があるたびに、このような長いアクションシーケンスを実行する必要があります。 はい、任意のクライアントを使用して翻訳できますが、プログラムウィンドウを開いたり、他のウィンドウの下から削除したりする必要があります。 はい、シーケンスは短くなりますが、それでも長くなります。 コピーするアクションのシーケンスを短くして、ボタンをクリックしてください。 そこで、アプレットのアイデアが浮上しました。 彼の論理はこれです:





そして、 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ブログに移動しました






All Articles