Yandex.Translator für Linux unter Python + GTK3

Grüße habrazhitel!


Vor langer Zeit bestand Bedarf an einem mehrsprachigen Online-Übersetzer mit geschlossenem Browser.


Nein, ich verachte es nicht, das Wörterbuch in "besonders schwierigen" Fällen zu verwenden, aber manchmal muss ich einen ziemlich großen Text lesen und nicht alle Wörter, die ich kenne, wie der Kontext verloren geht.


Bild


Am Anfang gab es eine Übersetzungs-Shell ...


Die Translate-Shell- Sache ist sehr praktisch, besonders wenn Sie beispielsweise in Vi / vim schreiben. Wechseln Sie zur nächsten Konsole und übersetzen Sie.


Die Tasten sind einfach und leicht zu merken.


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

Aber das war wie immer nicht genug. Ich wollte Grafiken.


Das Arbeiten in SublimeText und Zeal ist etwas bequemer als eine nackte Konsole.


Bild


Hmm ... Dachte, dachte und beschloss, den Übersetzer an einem Hotkey zu befestigen.
Die Wahl fiel auf gxmessage . Zenity passte nicht zu mir, ich weiß nicht mehr warum.
Der Code wurde geschrieben:


 #!/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 

Und Strg + 1 zugewiesen. In IceWm ist dies einfach. Bearbeiten Sie $ HOME / .icewm / keys


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

Es passte mir für eine Weile. Um "Kontrolle + 1" von Englisch, "Kontrolle + 2" auf Englisch. Okay ...


Bild


Aber dann begann die Übersetzungs-Shell zu versagen.


Bild


Ich weiß nicht, was mit den Entwicklern passiert ist, aber es hat mich wirklich verärgert.
Ich habe beschlossen, Zeit, ich habe lange nicht mehr in Python geschrieben.


Eine kurze Google-Suche führte mich zu Yandex.API , Python und GTK + 3 als Gi- Modul.


Warum gi , weil ich normalerweise in PyQt5 geschrieben habe ? Bei meinem Auto funktioniert es viel schneller. Die Maschine ist nicht neu, auch der Speicher (nach modernen Maßstäben) ist nicht so heiß.


Bild


Das Python GTK + 3 Modul war neu für mich. Ich habe einen ganzen Abend damit verbracht , die Syntax einmal , zweimal und dreimal auf Websites zu sortieren.


So wurde der Code geboren:
 #!/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() 

Infolgedessen habe ich einen automatischen Übersetzer auf einem Hotkey.


Vielen Dank für Ihre Aufmerksamkeit.


Das Projekt ist komplett auf Github .


PS: Ich werde den Code gerne kritisieren.

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


All Articles