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

⌈⌋ ⎇ branch:  PageTranslate


Artifact [b2b0efc441]

Artifact b2b0efc4418d6c7dc031d46b680d9b3dc7f6026a:

  • File TradutorLibreText.py — part of check-in [99a69d8f82] at 2020-05-02 16:03:04 on branch trunk — Fork from TradutorLibreText 1.3.1 (user: mario size: 5233)
  • File pagetranslate.py — part of check-in [6e4fac5cff] at 2020-05-02 16:08:58 on branch trunk — Rename some meta references from Tradutor to pagetranslate (user: mario size: 5233)

# (c) 2016 Claudemir de Almeida Rosa
import re
import uno, unohelper
from com.sun.star.task import XJobExecutor
from com.sun.star.awt.MessageBoxButtons import BUTTONS_OK, BUTTONS_OK_CANCEL, BUTTONS_YES_NO, BUTTONS_YES_NO_CANCEL, BUTTONS_RETRY_CANCEL, BUTTONS_ABORT_IGNORE_RETRY
from com.sun.star.awt.MessageBoxButtons import DEFAULT_BUTTON_OK, DEFAULT_BUTTON_CANCEL, DEFAULT_BUTTON_RETRY, DEFAULT_BUTTON_YES, DEFAULT_BUTTON_NO, DEFAULT_BUTTON_IGNORE

from com.sun.star.awt.MessageBoxType import MESSAGEBOX, INFOBOX, WARNINGBOX, ERRORBOX, QUERYBOX
import string
from com.sun.star.beans import PropertyValue
import json
import sys
import logging
import urllib
from urllib.request import urlopen, Request
from urllib.parse import urlencode, quote, quote_plus
if sys.platform != 'win32':
    import ssl
    myssl = ssl.create_default_context();
    myssl.check_hostname=False
    myssl.verify_mode=ssl.CERT_NONE



logging.basicConfig(filename='/tmp/TradutorLibreText.log', level=logging.INFO)




class Langerror(Exception):

    def __init__(self, language,langcode):

        Exception.__init__(self)
        if langcode=='pt-BR':
            self.language =  'O texto contem caractere ou idioma sem suporte'  +  language
        else :
            self.language =  'The text contains invalid character or language  '  +  language


class selectsize(Exception):

    def __init__(self, size,langcode):

        Exception.__init__(self)

        if langcode=='pt-BR':

            self.size ='selecione de 2 h\xE1 1900 caracteres ( Total selecionado ( '  + size + ' ))'
        else :
            self.size =    'You have selected 0 or more than 1900 characters (Total selected ( '+ size +'))'


class Tradutor(unohelper.Base, XJobExecutor):


    def __init__(self, ctx):
        self.ctx = ctx
        desktop = self.ctx.ServiceManager.createInstanceWithContext( "com.sun.star.frame.Desktop", self.ctx )
        self.dispatcher=self.ctx.ServiceManager.createInstanceWithContext( "com.sun.star.frame.DispatchHelper", self.ctx )
        self.language=self.ctx.ServiceManager.createInstanceWithContext( "com.sun.star.i18n.LocaleData", self.ctx )
        self.document = desktop.getCurrentComponent()
        self.lang=self.ctx.ServiceManager.createInstanceWithContext( "com.sun.star.configuration.ConfigurationProvider", self.ctx )


    def translate(self,text, dst_lang, src_lang='auto'):

        url = "http://translate.google.com/m?hl=%s&sl=%s&q=%s" % (dst_lang, src_lang, urllib.parse.quote_plus(text))

        req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
        if sys.platform != 'win32':
            page = urlopen(req,context=myssl).read().decode('utf-8')
        else:
            page = urlopen(req).read().decode('utf-8')
        before_trans = 'class="t0">'
        result = page[page.find(before_trans)+len(before_trans):]
        result = result.split("<")[0]
        return result


    def trigger(self, args):

        # Obtem  um texto selecionado
        controller = self.document.getCurrentController()
        selection = controller.getSelection()
        xTextRange = selection.getByIndex(0)
        string = xTextRange.getString()

        # Obtem  o idioma
        properties = []
        arg = PropertyValue()
        arg.Name = "nodepath"
        arg.Value = "/org.openoffice.Setup/L10N"
        properties.append(arg)
        properties = tuple(properties)
        aSettings= self.lang.createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess", properties)
        code= aSettings.getByName("ooLocale")
        Langinfo=self.language.getLanguageCountryInfo(xTextRange.CharLocale)


        text= string



        try:
            if len(text) > 1900 : raise selectsize(str(len(text)),code)
            elif len(text) == 0 : raise selectsize(str(len(text)),code)



            try:
                lang2=xTextRange.CharLocale.Language

                if  Langinfo.CountryDefaultName != "United States":
                    msglang = Langinfo.LanguageDefaultName + " " + Langinfo.CountryDefaultName
                else:
                    msglang = " "



                trans=self.translate(text,lang2)



                xTextRange.setString(trans.replace('\\n',"\n").replace('\\r',"\n"))

            except Exception as e:
                try:
                    self.MessageBox(e)
                except Exception as e:
                    logging.info(e)


        except Exception as e:
            try:
                self.MessageBox(str(e.size))
            except Exception as e:
                logging.info(e)


    def MessageBox(self,MsgText, MsgTitle="", MsgType=MESSAGEBOX, MsgButtons=BUTTONS_OK):
        ParentWin = self.document.getCurrentController().Frame.ContainerWindow
        ctx = uno.getComponentContext()
        sm = ctx.ServiceManager
        sv = sm.createInstanceWithContext("com.sun.star.awt.Toolkit", ctx)
        myBox = sv.createMessageBox(ParentWin, MsgType, MsgButtons, MsgTitle, MsgText)

        return myBox.execute()





g_ImplementationHelper = unohelper.ImplementationHelper()

g_ImplementationHelper.addImplementation(Tradutor,
        "org.openoffice.comp.pyuno.TradutorLibreText",
        ("com.sun.star.task.Job",),)