Skip to content

Commit 5949a29

Browse files
UI translation
1 parent 3758f28 commit 5949a29

File tree

4 files changed

+75
-29
lines changed

4 files changed

+75
-29
lines changed

core/CAIAssistant.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,9 @@ def _translateShallow(self, text, translation, language):
7272
translation = res['Translation']
7373
flags = res['Flags']
7474
totalIssues = sum([int(v) for v in flags.values()])
75-
if totalIssues < 2:
76-
return translation # all ok, no need to run deep translation
77-
78-
return res, translation, res.get('Notification', '')
75+
# if totalIssues < 2:
76+
# return translation # all ok, no need to run deep translation
77+
return res, translation, totalIssues < 2
7978

8079
def _translateDeep(self, text, translation, language, inputLanguage, flags):
8180
# extract first word from input language, can be separated by space, comma, etc.,
@@ -96,17 +95,15 @@ def _translateDeep(self, text, translation, language, inputLanguage, flags):
9695

9796
def translate(self, text, fastTranslation, language):
9897
# run shallow translation
99-
res = self._translateShallow(text=text, translation=fastTranslation, language=language)
100-
if isinstance(res, str):
101-
yield res
102-
return # all ok, no need to run deep translation
103-
104-
raw, translation, notification = res
105-
yield translation, notification # yield shallow translation with notification
98+
raw, translation, done = self._translateShallow(
99+
text=text, translation=fastTranslation, language=language
100+
)
101+
yield translation, not done
102+
if done: return
106103
# run deep translation
107104
yield self._translateDeep(
108105
text=text, translation=translation, language=language,
109106
inputLanguage=raw.get('Input language', 'unknown'),
110107
flags=raw['Flags']
111-
)
108+
), False # no more pending translations
112109
return

core/worker.py

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import threading
22
from googletrans import Translator
33
import time
4+
from functools import lru_cache
45
from .CAIAssistant import CAIAssistant
56

67
class CWorker(threading.Thread):
@@ -22,7 +23,19 @@ def run(self):
2223
self._forceTranslateEvent.clear()
2324

2425
text, language = self._events.userInput()
25-
isForceTranslate = isForceTranslate or (language['code'] != oldLanguage['code'])
26+
isLanguageChanged = language['code'] != oldLanguage['code']
27+
if isLanguageChanged: # reload UI translation if language changed
28+
try:
29+
newLocalization = self._updateLocalization(
30+
languageName=language['name'], languageCode=language['code']
31+
)
32+
self._events.updateLocalization(newLocalization)
33+
oldText = None # reset text
34+
oldLanguage = dict(language)
35+
except Exception as e:
36+
self._events.error(e)
37+
continue
38+
2639
T = time.time()
2740
if not isForceTranslate:
2841
if text == oldText: continue # Not changed
@@ -51,8 +64,10 @@ def _performTranslate(self, text, force, language):
5164
self._events.fastTranslated(fastText)
5265
if not force: return
5366

54-
for fullText in self._fullTranslate(text, fastTranslation=fastText, language=language):
55-
self._events.fullTranslated(fullText)
67+
68+
translationProcess = self._fullTranslate(text, fastTranslation=fastText, language=language)
69+
for fullText, hasMore in translationProcess:
70+
self._events.fullTranslated(fullText, pending=hasMore)
5671
if self._forceTranslateEvent.is_set(): break # stop if force another translate
5772
continue
5873
finally:
@@ -77,4 +92,14 @@ def _fullTranslate(self, text, fastTranslation, language):
7792
for translation in translationProcess:
7893
yield translation
7994
continue
80-
return
95+
return
96+
97+
@lru_cache(maxsize=None)
98+
def _updateLocalization(self, languageName, languageCode):
99+
strings = self._events.localizationStrings()
100+
res = self._translatorFast.translate('\n'.join(strings), dest=languageCode).text.split('\n')
101+
res = [x.strip() for x in res]
102+
res = [x for x in res if len(x) > 0]
103+
assert len(strings) == len(res)
104+
res = {k: v for k, v in zip(strings, res)}
105+
return res

main.py

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@
2222
class App(tk.Frame):
2323
def __init__(self, master, languages, currentLanguage=None):
2424
super().__init__(master)
25+
self._localizationMap = {}
26+
# predefine messages
27+
self._localization('Processing...')
28+
self._localization('Translation is not accurate and will be updated soon.')
29+
# set up UI
2530
self._master = master
2631
self._languages = languages
2732
self._currentLanguage = currentLanguage or self._languages.keys()[0]
@@ -34,9 +39,18 @@ def __init__(self, master, languages, currentLanguage=None):
3439
self._worker = CWorker(self)
3540
self._worker.start()
3641
return
42+
43+
def _localization(self, text):
44+
res = self._localizationMap.get(text)
45+
if res is None:
46+
self._localizationMap[text] = res = tk.StringVar(value=text)
47+
return res
3748

3849
def _UI_inputArea(self, owner):
39-
label = tk.Label(owner, text="Input Text:", justify="left", anchor="w")
50+
label = tk.Label(
51+
owner, justify="left", anchor="w",
52+
textvariable=self._localization("Input Text:")
53+
)
4054
label.pack(side="top", fill=tk.X)
4155

4256
self._inputText = tkst.ScrolledText(owner)
@@ -61,22 +75,28 @@ def _UI_languageSelection(self, owner):
6175
self._language.pack(side="top", anchor="ne", padx=5, pady=5)
6276
self._language.bind("<<ComboboxSelected>>", self.onSelectLanguage)
6377
try:
64-
self._language.set('Slovak')
78+
self._language.set(self._languages[self._currentLanguage])
6579
except tk.TclError:
6680
pass
6781
return
6882

6983
def _UI_outputArea(self, owner):
7084
self._UI_languageSelection(owner)
7185
# fast translation
72-
label = tk.Label(owner, text=self.UITextFor("Fast Translation:"), justify="left", anchor="w")
86+
label = tk.Label(
87+
owner, justify="left", anchor="w",
88+
textvariable=self._localization("Fast and inaccurate translation:")
89+
)
7390
label.pack(side="top", fill=tk.X)
7491

7592
self._fastOutputText = tkst.ScrolledText(owner, height=15)
7693
self._fastOutputText.pack(side="top", fill=tk.BOTH, expand=tk.YES)
7794

7895
# full translation
79-
label = tk.Label(owner, text=self.UITextFor("Full Translation:"), justify="left", anchor="w")
96+
label = tk.Label(
97+
owner, justify="left", anchor="w",
98+
textvariable=self._localization("Slow and improved translation:")
99+
)
80100
label.pack(side="top", fill=tk.X)
81101

82102
self._fullOutputText = tkst.ScrolledText(owner)
@@ -110,23 +130,22 @@ def startTranslate(self, force=False):
110130
# set output text to "Processing..."
111131
if force:
112132
self._fullOutputText.delete("1.0", tk.END)
113-
self._fullOutputText.insert(tk.END, self.UITextFor("Processing..."))
133+
self._fullOutputText.insert(tk.END, self._localization("Processing...").get())
114134
return
115135

116136
def fastTranslated(self, text):
117137
self._fastOutputText.delete("1.0", tk.END)
118138
self._fastOutputText.insert(tk.END, text)
119139
return
120140

121-
def fullTranslated(self, text):
122-
notification = None
123-
if isinstance(text, tuple):
124-
text, notification = text
125-
141+
def fullTranslated(self, text, pending):
126142
self._fullOutputText.delete("1.0", tk.END)
127143
self._fullOutputText.insert(tk.END, text)
128144

129-
if notification is not None:
145+
if pending:
146+
notification = self._localization(
147+
"Translation is not accurate and will be updated soon."
148+
).get()
130149
self._fullOutputText.insert(tk.END, "\n----------------\n" + notification)
131150
return
132151

@@ -144,9 +163,15 @@ def onSelectLanguage(self, event):
144163
if code is None: return
145164

146165
self._currentLanguage = code
147-
# TODO: translate UI?
148166
return
149167

168+
def updateLocalization(self, localization):
169+
for k, v in localization.items():
170+
self._localizationMap[k].set(v)
171+
return
172+
173+
def localizationStrings(self): return list(self._localizationMap.keys())
174+
150175
if '__main__' == __name__:
151176
app = App(
152177
master=tk.Tk(),

prompts/translate_shallow.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,4 @@ reply in exactly next format:
1212
@Contains sarcasm: {{Yes/No}}
1313
@Complex sentence: {{Yes/No}}
1414
@Complex topic: {{Yes/No}}
15-
@Notification: {{"Translation is not accurate and will be updated soon." in {Language}, no comments}}
1615
```

0 commit comments

Comments
 (0)