
开始
一直在Linux下,遇到网页上的不会的英语单词都是直接使用Chrome的插件解决,但是本地却要打开谷歌翻译,于是想自己写个翻译的软件。代码也就几百行,使用的是py-googletrans 这个包。我觉得在Linux桌面环境下,不管用QT, Gtk+还是Electron等等,先共同创造更多实用的软件,而不是讨论太多技术之间的优差。
使用googletrans
from googletrans import Translator
translator = Translator(service_urls=['translate.google.cn'])
p = translator.translate('只是', dest='en')
print(p)
相信上面的代码直接可以看懂。
使用PyGTK 3 +
- https://python-gtk-3-tutorial.readthedocs.io/en/latest/
- https://lazka.github.io/pgi-docs/
-
https://pygobject.readthedocs.io/en/latest/getting_started.html
第一个链接是PyGtk教程,第二个是api查询, 第三个链接是安装依赖wiki。
当你看完链接2前面几章,相信也知道的差不多了。
code
import gi
import functools
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from googletrans import Translator
translator = Translator(service_urls=['translate.google.cn'])
cn_translate = functools.partial(translator.translate, dest='zh-cn')
en_translate = functools.partial(translator.translate, dest='en')
class MainWindow(Gtk.Window):
def __init__(self):
super(MainWindow, self).__init__(Gtk.WindowType.TOPLEVEL)
self.set_default_size(360, 300)
self._init_view()
self.set_border_width(10)
self.header_bar = self._create_header_bar()
self.set_titlebar(self.header_bar)
def _create_header_bar(self):
hb = Gtk.HeaderBar()
hb.set_decoration_layout("menu:close")
hb.set_show_close_button(True)
hb.props.title = "Translate"
# refresh button
refresh_btn = Gtk.Button.new_from_icon_name("view-refresh-symbolic", Gtk.IconSize.BUTTON)
# refresh_btn.connect("clicked", lambda _: app_state.async_update(self))
hb.pack_start(refresh_btn)
# settings button
settings_btn = Gtk.Button.new_from_icon_name("emblem-system-symbolic", Gtk.IconSize.BUTTON)
# settings_btn.connect('clicked', self.settings_btn_clicked)
hb.pack_start(settings_btn)
return hb
def _init_view(self):
vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
scrolledwindow1 = Gtk.ScrolledWindow()
scrolledwindow1.set_hexpand(True)
scrolledwindow1.set_vexpand(True)
text_view1 = Gtk.TextView()
self.textbuffer1 = text_view1.get_buffer()
text_view1.set_left_margin(10)
text_view1.set_top_margin(10)
text_view1.set_wrap_mode(Gtk.WrapMode.WORD)
scrolledwindow1.add(text_view1)
vbox.pack_start(scrolledwindow1, True, True, 0)
hbox = Gtk.Box(spacing=5)
self.combo = Gtk.ComboBoxText()
self.combo.insert(0, "0", "中文")
self.combo.insert(1, "1", "English")
self.combo.set_active_id('0')
hbox.pack_start(self.combo, False, False, 0)
bt_translate = Gtk.Button(label='translate')
bt_translate.connect('clicked', self.translate)
hbox.pack_end(bt_translate, False, False, 0)
vbox.pack_start(hbox, False, False, 0)
scrolledwindow2 = Gtk.ScrolledWindow()
scrolledwindow2.set_hexpand(True)
scrolledwindow2.set_vexpand(True)
text_view2 = Gtk.TextView()
self.textbuffer2 = text_view2.get_buffer()
text_view2.set_left_margin(10)
text_view2.set_top_margin(10)
scrolledwindow2.add(text_view2)
text_view2.set_wrap_mode(Gtk.WrapMode.WORD)
vbox.pack_start(scrolledwindow2, True, True, 0)
self.add(vbox)
def translate(self, widget):
start = self.textbuffer1.get_start_iter()
end = self.textbuffer1.get_end_iter()
text = self.textbuffer1.get_text(start, end, False)
if self.combo.get_active_id() == '0':
print('===0')
else:
print('==', self.combo.get_active_id())
_translate = cn_translate if self.combo.get_active_id() == '0' else en_translate
trans = _translate(text)
self.textbuffer2.set_text('')
# str_buf = """<span size="x-large">{}\n{}</span>""".format(trans.text, trans.extra_data['all-translations'])
str_buf = """<span size="x-large">{}\n\n</span>""".format(trans.text)
self.textbuffer2.insert_markup(self.textbuffer2.get_end_iter(), str_buf, -1)
try:
str_buf = """<span size="small">{}\n{}</span>""".format(trans.extra_data['all-translations'][0][0], str(trans.extra_data['all-translations'][0][1]))
self.textbuffer2.insert_markup(self.textbuffer2.get_end_iter(), str_buf, -1)
except Exception as e:
pass
print(trans)
print(trans.extra_data['all-translations'])
if __name__ == '__main__':
win = MainWindow()
win.connect('destroy', Gtk.main_quit)
win.show_all()
Gtk.main()
现在只实现了中文和英文的翻译,发音这方面还有问题等等。
有时间的话会继续完善, 欢迎指出问题,或者好的建议
github: https://github.com/Baloneo/py-gtk-translate
网友评论