LibreOffice plugin to pipe whole Writer documents through Google Translate, that ought to keep most of the page formatting.

⌈⌋ branch:  PageTranslate


Check-in [c62b11cb0e]

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Change exception names, and use `LangSelection` for dialog (makes error more understandable).
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | trunk
Files: files | file ages | folders
SHA1: c62b11cb0e01175c0ffc24715bd4f478e136ece1
User & Date: mario 2021-06-10 14:53:13
Context
2021-06-10
14:53
Change exception names, and use `LangSelection` for dialog (makes error more understandable). Leaf check-in: c62b11cb0e user: mario tags: trunk
14:52
Notes about ArgosTranslate, CLI alternative check-in: b1b7271886 user: mario tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to pythonpath/pt_dialogs.py.

208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
...
343
344
345
346
347
348
349
350
351
352
353
        pass

    app = ExcApp(ctx=ctx, err=err, exc=exc)
    app.showDialog()



class LangApp(unohelper.Base, XActionListener, XJobExecutor):
    """
    Class documentation...
    """
    def __init__(self, ctx=uno.getComponentContext()):
        self.LocalContext = ctx
        self.ServiceManager = self.LocalContext.ServiceManager
        self.Toolkit = self.ServiceManager.createInstanceWithContext("com.sun.star.awt.ExtToolkit", self.LocalContext)
................................................................................
def langselect(*args):

    try:
        ctx = remote_ctx                    # IDE
    except:
        ctx = uno.getComponentContext()     # UI

    app = LangApp(ctx=ctx)
    app.showDialog()
    return app.fr, app.to








|







 







|



208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
...
343
344
345
346
347
348
349
350
351
352
353
        pass

    app = ExcApp(ctx=ctx, err=err, exc=exc)
    app.showDialog()



class LangSelection(unohelper.Base, XActionListener, XJobExecutor):
    """
    Class documentation...
    """
    def __init__(self, ctx=uno.getComponentContext()):
        self.LocalContext = ctx
        self.ServiceManager = self.LocalContext.ServiceManager
        self.Toolkit = self.ServiceManager.createInstanceWithContext("com.sun.star.awt.ExtToolkit", self.LocalContext)
................................................................................
def langselect(*args):

    try:
        ctx = remote_ctx                    # IDE
    except:
        ctx = uno.getComponentContext()     # UI

    app = LangSelection(ctx=ctx)
    app.showDialog()
    return app.fr, app.to

Changes to pythonpath/translationbackends.py.

358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
...
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
...
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
...
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
        #self.error = pagetranslate.MessageBox

        Translator = None
        try:
            from translate import Translator
        except:
            log.error(format_exc())
            raise Exception("Run `pip install translate` to use this module.")
            
        # interestingly this backend function might just work as is.
        if re.search("mymemory", params.get("backend", ""), re.I):
            self.translate = Translator(
                provider="mymemory", to_lang=params["lang"], email=params.get("email", "")
            ).translate
        else:
................................................................................
        j = http.get(url).content.decode("utf-8")
        log.debug(j)
        j = json.loads(j)
        if j["responseStatus"] in ("200", 200):
            text = j["responseData"]["translatedText"]
            # or match[0]…
        else:
            raise Exception(j)
        return text


# Because, why not?
# Invokes a commandline tool for translating texts.
# The "cmd" can be:
#
................................................................................
                "impressionId": self.session,
                "sourceLanguage": src_lang,
                "targetLanguage": dst_lang,
                "text": text
            }
        ).json()
        if r.get("serviceMessage"):
            raise Exception(r)
        elif r.get("text"):
            #log.debug(f"'{text}' ==> {repr(r)} // {src_lang}→{dst_lang}")
            return r["text"]
        else:
            return text
    
    # detect language, and avoid non-text snippets
................................................................................

    def chpath(self):
        pass # PYTHONPATH has no effect on numpy import errors, seems to work only with distro-bound python installs

    def translate(self, text):
        source, target = self.lang(text), self.params["lang"]
        if source == target:
            raise Exception("Can't have same source and target language")
        pair = self.get_langpair(source, target)
        #self.translate = pair.translate
        return pair.translate(text)

    def get_langpair(self, source, target):
        import argostranslate.translate
        model = { m.code: m for m in argostranslate.translate.get_installed_languages() }
        try:
            return model[source].get_translation(model[target])
        except Exception as e:
            raise Exception("Requested language model/pair ({}→{}) not found, use `argos-translate-gui` to download/install the combination".format(source, target))


# maps a pagetranslate.t.* object (in main module),
# according to configured backend (now a string)
def assign_service(params):
    w = params.get("backend", "Google")
    map = {







|







 







|







 







|







 







|










|







358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
...
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
...
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
...
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
        #self.error = pagetranslate.MessageBox

        Translator = None
        try:
            from translate import Translator
        except:
            log.error(format_exc())
            raise ImportException("Run `pip install translate` to use this module.")
            
        # interestingly this backend function might just work as is.
        if re.search("mymemory", params.get("backend", ""), re.I):
            self.translate = Translator(
                provider="mymemory", to_lang=params["lang"], email=params.get("email", "")
            ).translate
        else:
................................................................................
        j = http.get(url).content.decode("utf-8")
        log.debug(j)
        j = json.loads(j)
        if j["responseStatus"] in ("200", 200):
            text = j["responseData"]["translatedText"]
            # or match[0]…
        else:
            raise RuntimeError(j)
        return text


# Because, why not?
# Invokes a commandline tool for translating texts.
# The "cmd" can be:
#
................................................................................
                "impressionId": self.session,
                "sourceLanguage": src_lang,
                "targetLanguage": dst_lang,
                "text": text
            }
        ).json()
        if r.get("serviceMessage"):
            raise RuntimeError(r)
        elif r.get("text"):
            #log.debug(f"'{text}' ==> {repr(r)} // {src_lang}→{dst_lang}")
            return r["text"]
        else:
            return text
    
    # detect language, and avoid non-text snippets
................................................................................

    def chpath(self):
        pass # PYTHONPATH has no effect on numpy import errors, seems to work only with distro-bound python installs

    def translate(self, text):
        source, target = self.lang(text), self.params["lang"]
        if source == target:
            raise ValueError("Can't have same source and target language")
        pair = self.get_langpair(source, target)
        #self.translate = pair.translate
        return pair.translate(text)

    def get_langpair(self, source, target):
        import argostranslate.translate
        model = { m.code: m for m in argostranslate.translate.get_installed_languages() }
        try:
            return model[source].get_translation(model[target])
        except Exception as e:
            raise ValueError("Requested language model/pair ({}→{}) not found, use `argos-translate-gui` to download/install the combination".format(source, target))


# maps a pagetranslate.t.* object (in main module),
# according to configured backend (now a string)
def assign_service(params):
    w = params.get("backend", "Google")
    map = {