Yandex.Translator untuk Linux pada Python + GTK3

Salam habrazhitel!


Sudah lama sekali ada kebutuhan akan penerjemah online multibahasa dengan browser yang tertutup.


Tidak, jadi saya tidak jijik menggunakan kamus dalam kasus "sangat sulit", tetapi kadang-kadang saya harus membaca teks yang agak besar, dan tidak semua kata yang saya tahu bagaimana konteksnya hilang.


gambar


Pada awalnya ada shell-terjemahan ...


Masalah Terjemahan-shell cukup nyaman, terutama jika Anda menulis, katakanlah, di Vi / vim . Beralih ke konsol berikutnya dan terjemahkan.


Tombol-tombolnya sederhana dan mudah diingat.


$ trans -b -e yandex -t en " ." Simple keys.  $ echo -e "\n .\n"|trans -b -e yandex -t en With redirection. 

Tetapi ini, seperti biasa, tidak cukup. Saya ingin grafis.


Bekerja di SublimeText dan Zeal agak lebih nyaman daripada konsol kosong.


gambar


Hmm ... Pikirkan, pikirkan, dan putuskan untuk mempercepat penerjemah ke kunci panas.
Pilihannya jatuh pada gxmessage . Zenity tidak cocok untuk saya, saya tidak ingat mengapa.
Kode itu ditulis:


 #!/bin/bash # Name script trans.sh TEXT=$(xclip -selection primary -o) TRANS=$(trans -e yandex -hl en -tl ru -b "$TEXT") if [ "$TRANS" ]; then gxmessage -geometry 1000x800 -bg "#aaaaaa" -title "Translate" -wrap -center -font "Menlo Regular 24" "$TRANS" else gxmessage -geometry 1000x800 -bg "#aaaaaa" -title "Translate" -wrap -center -font "Menlo Regular 24" "   " fi 

Dan ditugaskan ke Ctrl + 1. Di IceWm, ini mudah. Edit $ HOME / .icewm / keys


 key "Ctrl+1" $HOME/progs/trans.sh 

Saya cocok untuk sementara waktu. Untuk "mengontrol +1" dari bahasa Inggris, "mengontrol +2" ke bahasa Inggris. Oke ...


gambar


Tapi kemudian shell terjemahan mulai gagal.


gambar


Saya tidak tahu apa yang terjadi pada pengembang, tetapi itu benar-benar membuat saya sedih.
Saya memutuskan sudah waktunya, saya belum menulis dalam python untuk waktu yang lama.


Pencarian Google singkat membawa saya ke Yandex.API , Python, dan GTK + 3 sebagai modul gi .


Kenapa gi , karena saya biasanya menulis di PyQt5 ? Ini bekerja lebih cepat pada mobil saya. Mesin ini tidak baru, memori juga (menurut standar modern) tidak begitu panas.


gambar


Modul python GTK + 3 adalah hal baru bagi saya. Saya menghabiskan sepanjang malam memilah sintaks di situs sekali , dua kali, dan tiga .


Jadi kodenya lahir:
 #!/usr/bin/env python3.6 # -*- coding: utf-8 -*- import sys import requests import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk from gi.repository import Gdk from gi.repository import Pango import warnings warnings.filterwarnings("ignore") import os CURRDIR = os.path.dirname(os.path.abspath(__file__)) ICON = os.path.join(CURRDIR, 'yandex-48.xpm') headers = { 'User-Agent': ('Mozilla/5.0 (Windows NT 6.0; rv:14.0) Gecko/20100101 ' 'Firefox/14.0.1'), 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'DNT': '1' } URLDETECT = "https://translate.yandex.net/api/v1.5/tr.json/detect" URLTRANS = "https://translate.yandex.net/api/v1.5/tr.json/translate" KEY = "you-API-key" def clip(): clipboard = Gtk.Clipboard.get(Gdk.SELECTION_PRIMARY) clip = clipboard.wait_for_text() return clip def detect(): params = {"key": KEY, "text": clip(), "lang": 'ru'} respdetect = requests.get(URLDETECT, params=params, headers=headers).json() if 'lang' in respdetect.keys(): respdetect = respdetect else: respdetect = {'code': 200, 'lang': 'en'} langtetect = respdetect["lang"] if langtetect != 'ru': langout = langtetect + '-ru' else: langout = 'ru-en' return langout def translate(): params = {"key": KEY, "text": clip(), "lang": detect()} response = requests.get(URLTRANS, params=params, headers=headers).json() if 'text' in response.keys(): response = response else: response = {'code': 200, 'lang': 'en-ru', 'text': ['the buffer is empty'] } output = ''.join(response["text"]) return output class TextViewWindow(Gtk.Window): def __init__(self): Gtk.Window.__init__(self, title=f"Yandex Translator {detect()}") self.set_default_size(1000, 350) self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) self.grid = Gtk.Grid() self.add(self.grid) self.create_textview() self.create_toolbar() self.key_Esc = Gdk.keyval_from_name("Escape") self.connect("key-press-event", self._key) def create_toolbar(self): toolbar = Gtk.Toolbar() self.grid.attach(toolbar, 1, 1, 1, 1) new_button = Gtk.ToolButton.new_from_stock(Gtk.STOCK_CLOSE) new_button.set_is_important(True) toolbar.insert(new_button, 0) new_button.connect("clicked", self.on_button_clicked, self.tag_bold) new_button.show() def on_button_clicked(self, widget, tag): Gtk.main_quit() def create_textview(self): scrolledwindow = Gtk.ScrolledWindow() scrolledwindow.set_hexpand(True) scrolledwindow.set_vexpand(True) self.grid.attach(scrolledwindow, 0, 0, 2, 1) self.textview = Gtk.TextView() self.textbuffer = self.textview.get_buffer() self.textbuffer.set_text(f"{translate()}") scrolledwindow.add(self.textview) self.textview.set_wrap_mode(Gtk.WrapMode.WORD) self.tag_bold = self.textbuffer.create_tag("bold", weight=Pango.Weight.BOLD) self.textview.modify_font(Pango.FontDescription('Menlo Regular 24')) def _key(self, widg, event): if event.keyval == self.key_Esc: Gtk.main_quit() win = TextViewWindow() win.connect("destroy", Gtk.main_quit) win.set_icon_from_file(ICON) win.show_all() Gtk.main() 

Akibatnya, saya memiliki penerjemah otomatis pada hot key.


Terima kasih atas perhatiannya.


Proyek ini sepenuhnya di github .


PS: Saya akan senang mengkritik kode itu.

Source: https://habr.com/ru/post/id472516/


All Articles