Skip to content

Commit fa58c4d

Browse files
Language selection
1 parent 4cdf0df commit fa58c4d

File tree

2 files changed

+55
-16
lines changed

2 files changed

+55
-16
lines changed

core/worker.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,26 @@ def __init__(self, events):
1414

1515
def run(self):
1616
oldText = None
17+
oldLanguage = {'code': ''}
1718
lastTextUpdateTime = 0
1819
minTextUpdateTime = 3.0 # seconds
1920
while True:
2021
isForceTranslate = self._forceTranslateEvent.wait(5)
2122
self._forceTranslateEvent.clear()
2223

23-
text = self._events.text()
24+
text, language = self._events.userInput()
25+
isForceTranslate = isForceTranslate or (language['code'] != oldLanguage['code'])
2426
T = time.time()
2527
if not isForceTranslate:
2628
if text == oldText: continue # Not changed
2729
if T < lastTextUpdateTime + minTextUpdateTime: continue # Too fast
2830
pass
2931
lastTextUpdateTime = T
3032
oldText = text
33+
oldLanguage = dict(language)
3134

3235
try:
33-
self._performTranslate(text, force=isForceTranslate)
36+
self._performTranslate(text, force=isForceTranslate, language=language)
3437
except Exception as e:
3538
self._events.error(e)
3639
continue
@@ -40,36 +43,36 @@ def forceTranslate(self):
4043
self._forceTranslateEvent.set()
4144
return
4245

43-
def _performTranslate(self, text, force=False):
46+
def _performTranslate(self, text, force, language):
4447
text = text.strip()
4548
try:
4649
self._events.startTranslate(force)
47-
fastText = self._fastTranslate(text)
50+
fastText = self._fastTranslate(text, language=language)
4851
self._events.fastTranslated(fastText)
4952
if not force: return
5053

51-
for fullText in self._fullTranslate(text, fastTranslation=fastText):
54+
for fullText in self._fullTranslate(text, fastTranslation=fastText, language=language):
5255
self._events.fullTranslated(fullText)
5356
if self._forceTranslateEvent.is_set(): break # stop if force another translate
5457
continue
5558
finally:
5659
self._events.endTranslate()
5760
return
5861

59-
def _fastTranslate(self, text):
62+
def _fastTranslate(self, text, language):
6063
if 0 == len(text): return ""
61-
translated = self._translatorFast.translate(text, dest=self._events.language()['code'])
64+
translated = self._translatorFast.translate(text, dest=language['code'])
6265
return translated.text
6366

64-
def _fullTranslate(self, text, fastTranslation=None):
67+
def _fullTranslate(self, text, fastTranslation, language):
6568
if 0 == len(text):
6669
yield ""
6770
return
6871

6972
translationProcess = self._assistant.translate(
7073
text,
7174
fastTranslation=fastTranslation,
72-
language=self._events.language()['name']
75+
language=language['name']
7376
)
7477
for translatedText in translationProcess:
7578
yield translatedText

main.py

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#!/usr/bin/env python3
22
# -*- coding: utf-8 -*-
33
import tkinter as tk
4+
from tkinter import ttk
45
import tkinter.scrolledtext as tkst
56
from core.worker import CWorker
67
# set up logging
@@ -16,9 +17,11 @@
1617
dotenv.load_dotenv('.env.local', override=True)
1718
# main app
1819
class App(tk.Frame):
19-
def __init__(self, master=None):
20+
def __init__(self, master, languages, currentLanguage=None):
2021
super().__init__(master)
2122
self._master = master
23+
self._languages = languages
24+
self._currentLanguage = currentLanguage or self._languages.keys()[0]
2225
# set global font
2326
self._master.option_add("*Font", ("Arial", 16))
2427
self._master.title("AI Enhanced Translator")
@@ -46,12 +49,27 @@ def clear(event): self._inputText.delete("1.0", tk.END)
4649
def UITextFor(self, text):
4750
return text
4851

52+
def _UI_languageSelection(self, owner):
53+
# target language selection via combobox, stick to top right corner
54+
self._language = ttk.Combobox(
55+
owner, state="readonly", width=20,
56+
values=list(self._languages.values())
57+
)
58+
self._language.pack(side="top", anchor="ne", padx=5, pady=5)
59+
self._language.bind("<<ComboboxSelected>>", self.onSelectLanguage)
60+
try:
61+
self._language.set('Slovak')
62+
except tk.TclError:
63+
pass
64+
return
65+
4966
def _UI_outputArea(self, owner):
67+
self._UI_languageSelection(owner)
5068
# fast translation
5169
label = tk.Label(owner, text=self.UITextFor("Fast Translation:"), justify="left", anchor="w")
5270
label.pack(side="top", fill=tk.X)
5371

54-
self._fastOutputText = tkst.ScrolledText(owner, height=5)
72+
self._fastOutputText = tkst.ScrolledText(owner, height=15)
5573
self._fastOutputText.pack(side="top", fill=tk.BOTH, expand=tk.YES)
5674

5775
# full translation
@@ -79,7 +97,11 @@ def onForceTranslate(self, event):
7997
return 'break' # prevent default action
8098

8199
# events for worker
82-
def text(self): return self._inputText.get("1.0", tk.END)
100+
def userInput(self):
101+
currentLanguageCode = self._currentLanguage
102+
currentLanguage = self._languages[currentLanguageCode]
103+
language = {'code': currentLanguageCode, 'name': currentLanguage}
104+
return self._inputText.get("1.0", tk.END), language
83105

84106
def startTranslate(self, force=False):
85107
# set output text to "Processing..."
@@ -106,10 +128,24 @@ def error(self, e):
106128
def endTranslate(self):
107129
return
108130

109-
# TODO: language selection
110-
def language(self): return {'code': 'sk', 'name': 'Slovak'}
131+
def onSelectLanguage(self, event):
132+
language = self._language.get()
133+
code = next((code for code, name in self._languages.items() if name == language), None)
134+
if code is None: return
135+
136+
self._currentLanguage = code
137+
# TODO: translate UI?
138+
return
111139

112140
if '__main__' == __name__:
113-
root = tk.Tk()
114-
app = App(master=root)
141+
app = App(
142+
master=tk.Tk(),
143+
# TODO: load languages from config
144+
languages={
145+
'sk': 'Slovak',
146+
'en': 'English',
147+
'de': 'German',
148+
},
149+
currentLanguage='sk'
150+
)
115151
app.mainloop()

0 commit comments

Comments
 (0)