Check-in [314a6459fe]
Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | move linebreak/quick into options, condense pluginconf.gui.window() invocation |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
314a6459fe936b0c76504c6c2d24fcec |
| User & Date: | mario 2022-10-24 20:39:48 |
Context
|
2022-10-25
| ||
| 09:35 | introduce .xml() translation mode (just DeepL really, and only used in tk_translate file mode) check-in: 39daeee3a0 user: mario tags: trunk | |
|
2022-10-24
| ||
| 20:39 | move linebreak/quick into options, condense pluginconf.gui.window() invocation check-in: 314a6459fe user: mario tags: trunk | |
| 07:58 | add settings dialog after all, move xml translation to BackendUtils check-in: 93f12505a9 user: mario tags: trunk | |
Changes
Changes to test/assign.py.
| ︙ | ︙ | |||
31 32 33 34 35 36 37 |
for name in "DT: Google", "Pons Dict", "DT: Libre":
assert isinstance(_ab(name), tb.DeepTranslator)
assert isinstance(_ab("DTA: Any"), tb.DeepTransApi)
def classes():
assert len(tb.BackendUtils.subclasses()) >= 10
| | | 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
for name in "DT: Google", "Pons Dict", "DT: Libre":
assert isinstance(_ab(name), tb.DeepTranslator)
assert isinstance(_ab("DTA: Any"), tb.DeepTransApi)
def classes():
assert len(tb.BackendUtils.subclasses()) >= 10
def dec_silence():
func = tb.BackendUtils.silence(lambda x: undef)
func(2)
def dec_from_words():
ls = []
func = tb.BackendUtils.from_words(lambda text: ls.append(text))
func("one two three")
assert len(ls) == 3
|
Added test/pt_country.py.
> > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import sys
sys.path.append(".")
import pagetranslate as pt
class StubPt(pt.PageTranslate):
def __init__(self, *x):
pass
def country():
p = StubPt()
assert p.country("it") == "IT"
assert p.country("en") == "US"
assert p.country("ilo") == "PH"
|
Changes to tk_translate/__init__.py.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# category: transform
# version: 0.5
# state: beta
# license: MITL
# config:
# { name: source, value: auto, description: assumed source language }
# { name: target, value: en, description: default target language }
# priority: optional
# depends: python >= 3.8, python:PySimpleGUI >= 4.37, python:requests
# pack: pythonpath/*.py=gui/
# architecture: all
# classifiers: translation
# keywords: translation
# url: https://fossil.include-once.org/pagetranslate/
| > > | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# category: transform
# version: 0.5
# state: beta
# license: MITL
# config:
# { name: source, value: auto, description: assumed source language }
# { name: target, value: en, description: default target language }
# { name: linebreakwise, type: bool, value: 0, description: linebreakwise paragraph translation }
# { name: quick, type: bool, value: 0, description: quick placeholder linebreaks in requests }
# priority: optional
# depends: python >= 3.8, python:PySimpleGUI >= 4.37, python:requests
# pack: pythonpath/*.py=gui/
# architecture: all
# classifiers: translation
# keywords: translation
# url: https://fossil.include-once.org/pagetranslate/
|
| ︙ | ︙ | |||
91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
#sys.excepthook = lambda *exc: log.critical(format_exc())
#-- init
conf = dict(
mode = "page", # unused
quick = 0, # split/iterate over text sections
api_key = "", # API key
email = "", # MyMemory email
cmd = "translate-cli -o -f auto -t {lang} {text}", # if cli tool
backend = "GoogleWeb",
available = [
"Google Translate",
"Google Ajax",
| > | 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
#sys.excepthook = lambda *exc: log.critical(format_exc())
#-- init
conf = dict(
mode = "page", # unused
quick = 0, # split/iterate over text sections
linebreakwise = 0, # individual API requests for paragraphs (not sure we still need it)
api_key = "", # API key
email = "", # MyMemory email
cmd = "translate-cli -o -f auto -t {lang} {text}", # if cli tool
backend = "GoogleWeb",
available = [
"Google Translate",
"Google Ajax",
|
| ︙ | ︙ | |||
137 138 139 140 141 142 143 |
"hu", "is", "ga", "la", "lv", "lt", "lb", "mk", "mt", "ro", "sr", "sk",
"sl", "uk", "wl", "cy", "yi", "ms", "ha", "ho", "mi", "mh", "tl", "tp",
"pi", "po", "sm", "lo", "pa", "en", "se", "en", "fl", "en",
],
office = f"TkInter/{tk.TkVersion}",
)
# load config
| > | < < | | | 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
"hu", "is", "ga", "la", "lv", "lt", "lb", "mk", "mt", "ro", "sr", "sk",
"sl", "uk", "wl", "cy", "yi", "ms", "ha", "ho", "mi", "mh", "tl", "tp",
"pi", "po", "sm", "lo", "pa", "en", "se", "en", "fl", "en",
],
office = f"TkInter/{tk.TkVersion}",
)
# load config
sg.user_settings_filename(filename="tk_translate.json")
conf.update(sg.user_settings())
# argument
if len(sys.argv) == 2:
conf["backend"] = sys.argv[1]
#-- widget structure
layout = [[
sg.Column([
# top frame
[
sg.Combo(values=conf["available"], default_value=conf["backend"], size=(20,25), key="backend", tooltip="Service to use", background_color="#67a"),
sg.Sizer(h_pixels = 140),
sg.Combo(values=["auto"]+conf["languages"], default_value=conf["source"], size=(4,1), key="from", tooltip="Source language", background_color="#67a"),
sg.Sizer(h_pixels = 30),
sg.Button("➜ Translate ➜", tooltip="Translate to target language"),
sg.Sizer(h_pixels = 30),
sg.Combo(values=conf["languages"], default_value=conf["target"], size=(4,30), key="lang", tooltip="Target language", background_color="#67a"),
sg.Sizer(h_pixels = 225),
#sg.Checkbox("␍⮒", key="linebreakwise", default=False, tooltip="Use .linebreakwise() translation (in case all text gets contracted)"),
sg.Button("⛭", key="settings", tooltip="Config"),
sg.Button("File", key="file", tooltip="Translate an OpenOffice or text file"),
],
# tabs
[
sg.Multiline(size=(55,20), key="orig", background_color="#cce"),
sg.Multiline(size=(55,20), key="outp", background_color="#cce"),
|
| ︙ | ︙ | |||
281 282 283 284 285 286 287 |
data.update(conf)
if re.search(r"\{(|text|lang|from)\}|\s(-w\b|--\w\w+)", data["backend"]):
data.update({
"cmd": data["backend"],
"backend": "CLI",
})
t = translationbackends.assign_service(data)
| | | | 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 |
data.update(conf)
if re.search(r"\{(|text|lang|from)\}|\s(-w\b|--\w\w+)", data["backend"]):
data.update({
"cmd": data["backend"],
"backend": "CLI",
})
t = translationbackends.assign_service(data)
translate = t.linebreakwise if conf.get("linebreakwise") else t.translate
self.w["outp"].update(translate(data["orig"]))
# File translation (odt, fodt)
def file(self, data):
fn = sg.tk.filedialog.askopenfilename(
filetypes=[("Office", "*.odt *.fodt *.odg *.fodg *.odp *.fodp"), ("Text", "*.txt *.md"), ("Any", "*")]
)
if not fn:
return
target_fn = re.sub(r"(\.\w+)$", rf".{data['lang']}\1", fn)
if os.path.exists(target_fn):
if sg.popup_yes_no(f"Overwrite {target_fn}?") != "Yes":
return
self.t = translationbackends.assign_service(conf)
if re.search("\.(txt|md|text)$", fn):
self.file_text(fn, target_fn)
if re.search("\.(fodt|fodg|fodp)$", fn):
self.file_xml(fn, target_fn)
if re.search("\.(odt|odg|odp)$", fn):
self.file_zip(fn, target_fn)
|
| ︙ | ︙ | |||
325 326 327 328 329 330 331 |
self.t.xml(
read.read()
)
)
# modify content.xml within zip
def file_zip(self, fn, target_fn):
| | < | | > | | | | < < | < < < < | < < > | < < < | 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 |
self.t.xml(
read.read()
)
)
# modify content.xml within zip
def file_zip(self, fn, target_fn):
from zipfile import ZipFile, ZIP_DEFLATED
with ZipFile(fn, 'r') as read, ZipFile(target_fn, 'w', compression=ZIP_DEFLATED) as write:
for entry in read.infolist():
data = read.read(entry.filename)
if entry.filename == "content.xml":
data = self.t.xml(data.decode("utf-8"))
write.writestr(entry.filename, data)
# File: Settings - remapped to pluginconf window
def settings(self, data, files=[__file__, translationbackends.__file__]):
import pluginconf.gui
if pluginconf.gui.window(conf, {}, files=files, theme="Default1"):
for key in "backend", "api_key", "email", "cmd", "source", "target", "quick", "linebreakwise":
sg.user_settings_set_entry(key, conf[key]) # don't fixate other presets
# File: Exit
def exit(self, data):
self.w.close()
# set mouse pointer ("watch" for planned hangups)
def _cursor(self, s="arrow"):
|
| ︙ | ︙ |