macro Libreoffice + PY traduzione LibreTranslator

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
MoonDragon
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1693
Iscrizione: sabato 17 aprile 2010, 17:46
Desktop: Gnome
Distribuzione: Ubuntu 20.04.6 64-bit gdm3 xorg
Sesso: Maschile
Contatti:

macro Libreoffice + PY traduzione LibreTranslator

Messaggio da MoonDragon »

Salve a tutti,
vorrei sapere se qualcuno se ne intende di macro e script python per libreoffice.
L'idea è quella di usare libretranslate offline in localhost per la traduzione di un testo selezionato.
Premetto che ho libretranslate su Docker in windows, per via che non ho più spazio su Ubuntu, abbiate pazienza!
Siccome sono ignorante in materia mi son fatto aiutare da 3 o 4 AI online, ma sono poco intelligenti e non danno risultati funzionanti :lol:
Ho fatto una miriade di prove e questa "quasi va":
macro

Codice: Seleziona tutto

Sub CallPythonScript()
    Dim oShell As Object
    Dim sPythonScriptPath As String
    Dim sTextToTranslate As String
    Dim sSourceLang As String
    Dim sTargetLang As String
    Dim outputFilePath As String
    
    ' Controlla il sistema operativo
    Dim isWindows As Boolean
    isWindows = (InStr(1, Shell("cmd /c ver", 1), "Windows") > 0)
    
    If isWindows Then
        sPythonScriptPath = "C:\Users\UTENTE\AppData\Roaming\LibreOffice\4\user\Scripts\python\translate.py"
        outputFilePath = "C:\Users\UTENTE\AppData\Roaming\LibreOffice\4\user\Scripts\python\output.txt"
    Else
        sPythonScriptPath = "/home/UTENTE/.config/libreoffice/4/user/Scripts/python/translate.py"
        outputFilePath = "/home/UTENTE/.config/libreoffice/4/user/Scripts/python/output.txt"
    End If

    ' Ottieni il documento attivo
    oDoc = ThisComponent
    
    ' Ottieni la selezione corrente
    oSel = oDoc.getCurrentSelection()
    
    ' Controlla se c'è una selezione
    If oSel.getCount() > 0 Then
        ' Verifica se la selezione è un range di testo
        If oSel.getByIndex(0).supportsService("com.sun.star.text.TextRange") Then
            ' Ottieni il testo della selezione
            sTextToTranslate = oSel.getByIndex(0).getString()
            
            ' Chiedi la lingua di input e output
            sSourceLang = InputBox("Inserisci la lingua di input (es: 'auto'):", "Lingua di input", "auto")
            sTargetLang = InputBox("Inserisci la lingua di output (es: 'it'):", "Lingua di output", "it")
            
            ' Crea un'istanza del gestore di shell
            oShell = createUnoService("com.sun.star.system.SystemShellExecute")
            
            ' Richiama lo script Python con gli argomenti
            Dim command As String
            sTextToTranslate = Replace(sTextToTranslate, """", "\""") ' Escape delle virgolette
            If isWindows Then
                command = "python """ & sPythonScriptPath & """ """ & sTextToTranslate & """ """ & sSourceLang & """ """ & sTargetLang & """"
                oShell.execute("cmd", "/C " & command, 0)
            Else
                command = "python3 """ & sPythonScriptPath & """ """ & sTextToTranslate & """ """ & sSourceLang & """ """ & sTargetLang & """"
                oShell.execute("/bin/bash", "-c """ & command & """", 0)
            End If

            ' Attendere che lo script Python completi l'esecuzione
            WaitPythonScript
            
            ' Leggi il file di output per ottenere il testo tradotto
            Dim translatedText As String
            translatedText = ReadTranslatedText(outputFilePath)
            
            ' Sostituisci il testo selezionato con quello tradotto
            Dim oCursor As Object
            oCursor = oDoc.Text.createTextCursorByRange(oSel.getByIndex(0).getStart())
            oCursor.setString(translatedText) ' Sostituzione corretta
            
        Else
            MsgBox "La selezione non è un range di testo valido!"
        End If
    Else
        MsgBox "Nessun testo selezionato!"
    End If
End Sub'
translate.py

Codice: Seleziona tutto

import os
import sys
import requests
import logging

def setup_logger(script_dir):
    log_file_path = os.path.join(script_dir, "debug.log")
    logging.basicConfig(
        filename=log_file_path,
        level=logging.DEBUG,
        format='%(asctime)s - %(levelname)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    return logging.getLogger()

def translate_text(text, source_lang, target_lang, logger):
    logger.debug(f"Translating text: {text} from {source_lang} to {target_lang}")
    try:
        response = requests.post(
            'http://localhost:5000/translate',
            json={
                'q': text,
                'source': source_lang,
                'target': target_lang
            }
        )
        response.raise_for_status()
        translated_text = response.json().get('translatedText', text)
        logger.debug(f"Translation successful: {translated_text}")
        return translated_text
    except requests.exceptions.RequestException as e:
        logger.error(f"Translation request failed: {e}")
        return text

if __name__ == "__main__":
    try:
        script_dir = os.path.dirname(os.path.abspath(__file__))
        logger = setup_logger(script_dir)
        logger.debug(f"Script directory: {script_dir}")
        
        output_file_path = os.path.join(script_dir, "output.txt")
        logger.debug(f"Output file path: {output_file_path}")
        
        if os.path.exists(output_file_path):
            os.remove(output_file_path)
            logger.debug(f"Existing output file removed: {output_file_path}")
        
        # Modifica la codifica dei parametri ricevuti
        text_to_translate = sys.argv[1].encode('latin-1').decode('utf-8')
        source_lang = sys.argv[2]
        target_lang = sys.argv[3]
        
        logger.debug(f"Received input: text_to_translate={text_to_translate}, source_lang={source_lang}, target_lang={target_lang}")
        
        translated_text = translate_text(text_to_translate, source_lang, target_lang, logger)
        
        with open(output_file_path, "w", encoding="utf-8") as f:
            f.write(translated_text)
            logger.debug(f"Translated text written to: {output_file_path}")
    except Exception as e:
        logger.error(f"An error occurred: {e}")
Con cmd il translate.py fa il suo dovere mentre sembra che non venga chiamato dalla macro, per fare i test di fatti ho dovuto creare il file output.txt manualmente.
Altro problema è che non sostituisce il testo selezionato ma lo aggiunge prima della selezione :muro:

Qualcuno saprebbe farlo funzionare?
"Coltiva 🐧 LINUX tanto WINDOWS si pianta da solo e la MELA è già stata morsa" :p
Avatar utente
Rafbor
Prode Principiante
Messaggi: 149
Iscrizione: domenica 13 febbraio 2022, 18:22
Desktop: Xubuntu
Distribuzione: 22.04.5 LTS
Località: Francia

Re: macro Libreoffice + PY traduzione LibreTranslator

Messaggio da Rafbor »

Salve, volevo fare una prova, ma mancano le seguenti macro:

Codice: Seleziona tutto

WaitPythonScript
ReadTranslatedText
Le hai da qualche parte?
Avatar utente
MoonDragon
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1693
Iscrizione: sabato 17 aprile 2010, 17:46
Desktop: Gnome
Distribuzione: Ubuntu 20.04.6 64-bit gdm3 xorg
Sesso: Maschile
Contatti:

Re: macro Libreoffice + PY traduzione LibreTranslator

Messaggio da MoonDragon »

Salve, grazie di aver risposto, si scusami mi si erano generate con le prove precedenti, ecco basta integrarle:

Codice: Seleziona tutto

Sub WaitPythonScript()
    ' Funzione per aspettare che il processo Python finisca
    Dim oShell As Object
    oShell = createUnoService("com.sun.star.system.SystemShellExecute")
    ' Puoi implementare un'attesa qui se necessario
End Sub

Function ReadTranslatedText(filePath As String) As String
    Dim f As Object
    Dim s As String
    On Error GoTo ErrorHandling

    f = CreateUnoService("com.sun.star.ucb.SimpleFileAccess") 
    If f.exists(filePath) Then
        Dim inputStream As Object
        inputStream = f.openFileRead(filePath)
        Dim textInput As String
        textInput = inputStream.readString(inputStream.available())
        inputStream.close()
        
        ReadTranslatedText = textInput
    Else
        ReadTranslatedText = "File non trovato!"
    End If

    Exit Function
    
ErrorHandling:
    ReadTranslatedText = "Errore nel leggere il file: " & Err.Description
End Function
Oppure forse era questa:

Codice: Seleziona tutto

Sub WaitPythonScript()
    Dim filePath As String
    filePath = "C:\Users\UTENTE\AppData\Roaming\LibreOffice\4\user\Scripts\python\output.txt"
    Dim f As Object
    f = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
    
    ' Aspetta finché il file non esiste
    Dim attempts As Integer
    attempts = 0
    While Not f.exists(filePath) And attempts < 20
        Wait(500)
        attempts = attempts + 1
    Wend
End Sub

Function ReadTranslatedText(filePath As String) As String
    Dim f As Object
    Dim s As String
    On Error GoTo ErrorHandling

    f = CreateUnoService("com.sun.star.ucb.SimpleFileAccess") 
    If f.exists(filePath) Then
        Dim inputStream As Object
        inputStream = f.openFileRead(filePath)
        Dim textInput As String
        textInput = inputStream.readString(inputStream.available())
        inputStream.close()
        
        ReadTranslatedText = textInput
    Else
        ReadTranslatedText = "File non trovato!"
    End If

    Exit Function
    
ErrorHandling:
    ReadTranslatedText = "Errore nel leggere il file: " & Err.Description
End Function
"Coltiva 🐧 LINUX tanto WINDOWS si pianta da solo e la MELA è già stata morsa" :p
Avatar utente
MoonDragon
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1693
Iscrizione: sabato 17 aprile 2010, 17:46
Desktop: Gnome
Distribuzione: Ubuntu 20.04.6 64-bit gdm3 xorg
Sesso: Maschile
Contatti:

Re: macro Libreoffice + PY traduzione LibreTranslator

Messaggio da MoonDragon »

Macro con le due integrate, penso potrebbe essere così

Codice: Seleziona tutto

Sub CallPythonScript()
    Dim oShell As Object
    Dim sPythonScriptPath As String
    Dim sTextToTranslate As String
    Dim sSourceLang As String
    Dim sTargetLang As String
    Dim outputFilePath As String
    
    ' Controlla il sistema operativo
    Dim isWindows As Boolean
    isWindows = (InStr(1, Shell("cmd /c ver", 1), "Windows") > 0)
    
    If isWindows Then
        sPythonScriptPath = "C:\Users\UTENTE\AppData\Roaming\LibreOffice\4\user\Scripts\python\translate.py"
        outputFilePath = "C:\Users\UTENTE\AppData\Roaming\LibreOffice\4\user\Scripts\python\output.txt"
    Else
        sPythonScriptPath = "/home/UTENTE/.config/libreoffice/4/user/Scripts/python/translate.py"
        outputFilePath = "/home/UTENTE/.config/libreoffice/4/user/Scripts/python/output.txt"
    End If

    ' Ottieni il documento attivo
    oDoc = ThisComponent
    
    ' Ottieni la selezione corrente
    oSel = oDoc.getCurrentSelection()
    
    ' Controlla se c'è una selezione
    If oSel.getCount() > 0 Then
        ' Verifica se la selezione è un range di testo
        If oSel.getByIndex(0).supportsService("com.sun.star.text.TextRange") Then
            ' Ottieni il testo della selezione
            sTextToTranslate = oSel.getByIndex(0).getString()
            
            ' Chiedi la lingua di input e output
            sSourceLang = InputBox("Inserisci la lingua di input (es: 'auto'):", "Lingua di input", "auto")
            sTargetLang = InputBox("Inserisci la lingua di output (es: 'it'):", "Lingua di output", "it")
            
            ' Crea un'istanza del gestore di shell
            oShell = createUnoService("com.sun.star.system.SystemShellExecute")
            
            ' Richiama lo script Python con gli argomenti
            Dim command As String
            sTextToTranslate = Replace(sTextToTranslate, """", "\""") ' Escape delle virgolette
            If isWindows Then
                command = "python """ & sPythonScriptPath & """ """ & sTextToTranslate & """ """ & sSourceLang & """ """ & sTargetLang & """"
                oShell.execute("cmd", "/C " & command, 0)
            Else
                command = "python3 """ & sPythonScriptPath & """ """ & sTextToTranslate & """ """ & sSourceLang & """ """ & sTargetLang & """"
                oShell.execute("/bin/bash", "-c """ & command & """", 0)
            End If

            ' Attendere che lo script Python completi l'esecuzione
            WaitPythonScript(outputFilePath)
            
            ' Leggi il file di output per ottenere il testo tradotto
            Dim translatedText As String
            translatedText = ReadTranslatedText(outputFilePath)
            
            ' Sostituisci il testo selezionato con quello tradotto
            Dim oCursor As Object
            oCursor = oDoc.Text.createTextCursorByRange(oSel.getByIndex(0).getStart())
            oCursor.setString(translatedText) ' Sostituzione corretta
            
        Else
            MsgBox "La selezione non è un range di testo valido!"
        End If
    Else
        MsgBox "Nessun testo selezionato!"
    End If
End Sub

Function ReadTranslatedText(filePath As String) As String
    Dim f As Object
    Dim s As String
    On Error GoTo ErrorHandling

    f = CreateUnoService("com.sun.star.ucb.SimpleFileAccess") 
    If f.exists(filePath) Then
        Dim inputStream As Object
        inputStream = f.openFileRead(filePath)
        Dim textInput As String
        textInput = inputStream.readString(inputStream.available())
        inputStream.close()
        
        ReadTranslatedText = textInput
    Else
        ReadTranslatedText = "File non trovato!"
    End If

    Exit Function
    
ErrorHandling:
    ReadTranslatedText = "Errore nel leggere il file: " & Err.Description
End Function

Sub WaitPythonScript(filePath As String)
    Dim f As Object
    f = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
    
    ' Aspetta finché il file non esiste
    Dim attempts As Integer
    attempts = 0
    While Not f.exists(filePath) And attempts < 20
        Wait(500)
        attempts = attempts + 1
    Wend
End Sub
Su ubuntu non prende

Codice: Seleziona tutto

 ' Controlla il sistema operativo
    Dim isWindows As Boolean
    isWindows = (InStr(1, Shell("cmd /c ver", 1), "Windows") > 0)
    
    If isWindows Then
        sPythonScriptPath = "C:\Users\UTENTE\AppData\Roaming\LibreOffice\4\user\Scripts\python\translate.py"
        outputFilePath = "C:\Users\UTENTE\AppData\Roaming\LibreOffice\4\user\Scripts\python\output.txt"
    Else
        sPythonScriptPath = "/home/UTENTE/.config/libreoffice/4/user/Scripts/python/translate.py"
        outputFilePath = "/home/UTENTE/.config/libreoffice/4/user/Scripts/python/output.txt"
    End If
quindi al posto di quanto sopra va messo solo

Codice: Seleziona tutto

sPythonScriptPath = "/home/UTENTE/.config/libreoffice/4/user/Scripts/python/translate.py"
        outputFilePath = "/home/UTENTE/.config/libreoffice/4/user/Scripts/python/output.txt"
"Coltiva 🐧 LINUX tanto WINDOWS si pianta da solo e la MELA è già stata morsa" :p
Avatar utente
Rafbor
Prode Principiante
Messaggi: 149
Iscrizione: domenica 13 febbraio 2022, 18:22
Desktop: Xubuntu
Distribuzione: 22.04.5 LTS
Località: Francia

Re: macro Libreoffice + PY traduzione LibreTranslator

Messaggio da Rafbor »

Così ho giocato un po' e ho apportato alcune modifiche.
Questa è una versione solo per Ubuntu, ho rimosso i test per Windows.
Lo script python viene eseguito generando il file 'debug.log', fai un prova e fammi sapere.

Da parte mia, non ho installato libretranslate localmente e non riesco a far funzionare il servizio di traduzione tramite il web, nel file 'debug.log' mi viene un errore "ERROR - Translation request failed: 400 Client Error: BAD REQUEST for url: https://libretranslate.com/translate" quindi dovrò cercare di nuovo.

Codice: Seleziona tutto

Option VbaSupport 1

Sub CallPythonScript()
    Dim oShell As Object
    Dim sPythonScriptPath As String
    Dim sTextToTranslate As String
    Dim sSourceLang As String
    Dim sTargetLang As String
    Dim outputFilePath As String
    
    sPythonScriptPath = "/home/UTENTE/.config/libreoffice/4/user/Scripts/python/translate.py"
    outputFilePath = "/home/UTENTE/.config/libreoffice/4/user/Scripts/python/output.txt"

    ' Ottieni il documento attivo
    oDoc = ThisComponent
    
    ' Ottieni la selezione corrente
    oSel = oDoc.getCurrentSelection()
    
    ' Controlla se c'è una selezione
    If oSel.getCount() > 0 Then
        ' Verifica se la selezione è un range di testo
        If oSel.getByIndex(0).supportsService("com.sun.star.text.TextRange") Then
            ' Ottieni il testo della selezione
            sTextToTranslate = oSel.getByIndex(0).getString()
            
            ' Chiedi la lingua di input e output
            sSourceLang = InputBox("Inserisci la lingua di input (es: 'auto'):", "Lingua di input", "auto")
            sTargetLang = InputBox("Inserisci la lingua di output (es: 'it'):", "Lingua di output", "it")
            
            ' Richiama lo script Python con gli argomenti
            Dim command As String
            sTextToTranslate = Replace(sTextToTranslate, """", "\""") ' Escape delle virgolette

            command = "python3 """ & sPythonScriptPath & """ """ & sTextToTranslate & """ """ & sSourceLang & """ """ & sTargetLang & """"
            res = Shell(command, 2)

            ' Attendere che lo script Python completi l'esecuzione
            WaitPythonScript(outputFilePath)
            
            ' Leggi il file di output per ottenere il testo tradotto
            Dim translatedText As String
            translatedText = ReadTranslatedText(outputFilePath)
            
            ' Sostituisci il testo selezionato con quello tradotto
           oSel.getByIndex(0).setString(translatedText) ' Sostituzione corretta
            
        Else
            MsgBox "La selezione non è un range di testo valido!"
        End If
    Else
        MsgBox "Nessun testo selezionato!"
    End If
End Sub'

Function ReadTranslatedText(filePath As String) As String
    Dim f,i As Object
    Dim s As String
    On Error GoTo ErrorHandling

    f = CreateUnoService("com.sun.star.ucb.SimpleFileAccess") 
    i = createunoservice("com.sun.star.io.TextInputStream")
    If f.exists(filePath) Then
        Dim inputStream As Object
        Dim textInput As String
        
        i.setinputstream(f.openfileread(filePath))
        textInput = i.readString( Array(), False)
        
        i.closeinput()
        
        ReadTranslatedText = textInput
    Else
        ReadTranslatedText = "File non trovato!"
    End If

    Exit Function
    
ErrorHandling:
    ReadTranslatedText = "Errore nel leggere il file: " & Err.Description
End Function

Sub WaitPythonScript(filePath As String)
    Dim f As Object
    f = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
    
    ' Aspetta finché il file non esiste
    Dim attempts As Integer
    attempts = 0
    While Not f.exists(filePath) And attempts < 20
        Wait(500)
        attempts = attempts + 1
    Wend
End Sub
Avatar utente
MoonDragon
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1693
Iscrizione: sabato 17 aprile 2010, 17:46
Desktop: Gnome
Distribuzione: Ubuntu 20.04.6 64-bit gdm3 xorg
Sesso: Maschile
Contatti:

Re: macro Libreoffice + PY traduzione LibreTranslator

Messaggio da MoonDragon »

Rafbor ha scritto:
giovedì 12 settembre 2024, 21:36
Così ho giocato un po' e ho apportato alcune modifiche.
Questa è una versione solo per Ubuntu, ho rimosso i test per Windows.
Lo script python viene eseguito generando il file 'debug.log', fai un prova e fammi sapere.

Da parte mia, non ho installato libretranslate localmente e non riesco a far funzionare il servizio di traduzione tramite il web, nel file 'debug.log' mi viene un errore "ERROR - Translation request failed: 400 Client Error: BAD REQUEST for url: https://libretranslate.com/translate" quindi dovrò cercare di nuovo.
Ti ringrazio molto per averci dedicato del tempo, ho provato ora su Ubuntu e creando il file "output.txt" (scrivendo dentro qualcosa) la macro funziona grazie :birra:
Per quanto riguarda il server di traduzione ci sarebbe anche it.libretranslate ma la chiave è a pagamento, mentre il server libretr.lukgth.cloud sembra gratuito (non ho provato).
Ora mi rimane da fare un test su Windows :D
Ti farò sapere
"Coltiva 🐧 LINUX tanto WINDOWS si pianta da solo e la MELA è già stata morsa" :p
Avatar utente
MoonDragon
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1693
Iscrizione: sabato 17 aprile 2010, 17:46
Desktop: Gnome
Distribuzione: Ubuntu 20.04.6 64-bit gdm3 xorg
Sesso: Maschile
Contatti:

Re: macro Libreoffice + PY traduzione LibreTranslator

Messaggio da MoonDragon »

Su windows, dopo aver modificato i parametri delle cartelle e anche provato a cambiare

Codice: Seleziona tutto

command = "python3 """ & sPythonScriptPath & """ """ & sTextToTranslate & """ """ & sSourceLang & """ """ & sTargetLang & """"
            res = Shell(command, 2)
con

Codice: Seleziona tutto

command = "python """ & sPythonScriptPath & """ """ & sTextToTranslate & """ """ & sSourceLang & """ """ & sTargetLang & """"
            res = Shell(command, 2)
non funzionava, così ho provato con

Codice: Seleziona tutto

command = "C:\WINDOWS\system32\cmd.exe python """ & sPythonScriptPath & """ """ & sTextToTranslate & """ """ & sSourceLang & """ """ & sTargetLang & """"
    res = Shell(command, 2)
ma ancora nulla, poi con

Codice: Seleziona tutto

command = "python """ & sPythonScriptPath & """ """ & sTextToTranslate & """ """ & sSourceLang & """ """ & sTargetLang & """"
    res = Shell("cmd", "/C " & command, 2)
ma nulla al massivo intravedo la shell per un nano-secondo ma non avvia lo script.
Una precisazione "command, 2" cosa fa di preciso e perchè 2 e non zero?
Inoltre per caso hai qualche idea per farlo andare su windows?
Per precisare ho: libreoffice 24, windows 10 e python 3.6.8
"Coltiva 🐧 LINUX tanto WINDOWS si pianta da solo e la MELA è già stata morsa" :p
Avatar utente
Rafbor
Prode Principiante
Messaggi: 149
Iscrizione: domenica 13 febbraio 2022, 18:22
Desktop: Xubuntu
Distribuzione: 22.04.5 LTS
Località: Francia

Re: macro Libreoffice + PY traduzione LibreTranslator

Messaggio da Rafbor »

Per la funzione Shell, il secondo parametro riguarda lo stile della finestra, vedi la guida

Da quando sono in pensione, non ho più bisogno di Windows, quindi l'ho rimosso da tutti i miei PC, mi spiace non poterlo testare.
Prova a impostare un breakpoint nell'editor di macro, sulla riga 'res = Shell(command, 2)' poi posiziona il cursore del mouse sulla parola 'command', potrai vedere se il comando è corretto, o più semplice se non sei a tuo agio con l'editor, inserisci la riga

Codice: Seleziona tutto

MsgBox command
prima della riga 'res = Shell(command, 2)'

In alternativa, prova a utilizzare la prima versione che hai inserito nel primo post, con la sintassi 'oShell.execute(“cmd”, “/C ‘ & command, 0)’.
Avatar utente
Rafbor
Prode Principiante
Messaggi: 149
Iscrizione: domenica 13 febbraio 2022, 18:22
Desktop: Xubuntu
Distribuzione: 22.04.5 LTS
Località: Francia

Re: macro Libreoffice + PY traduzione LibreTranslator

Messaggio da Rafbor »

Per eseguire il servizio di traduzione in modalità Web, è necessario utilizzare uno dei siti mirror che non richiedono una API Key, elencati nel file readme del progetto.
Nella funzione 'translate_text' del file python, sostituire

Codice: Seleziona tutto

'http://localhost:5000/translate'
con

Codice: Seleziona tutto

'https://trans.zillyhuhn.com/translate'
e funziona!
Avatar utente
MoonDragon
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1693
Iscrizione: sabato 17 aprile 2010, 17:46
Desktop: Gnome
Distribuzione: Ubuntu 20.04.6 64-bit gdm3 xorg
Sesso: Maschile
Contatti:

Re: macro Libreoffice + PY traduzione LibreTranslator

Messaggio da MoonDragon »

Rafbor ha scritto:
sabato 14 settembre 2024, 20:08
Per eseguire il servizio di traduzione in modalità Web, è necessario utilizzare uno dei siti mirror che non richiedono una API Key, elencati nel file readme del progetto.
Grazie ho modificato su Ubuntu e funziona alla perfezione :birra:
"Coltiva 🐧 LINUX tanto WINDOWS si pianta da solo e la MELA è già stata morsa" :p
Avatar utente
MoonDragon
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1693
Iscrizione: sabato 17 aprile 2010, 17:46
Desktop: Gnome
Distribuzione: Ubuntu 20.04.6 64-bit gdm3 xorg
Sesso: Maschile
Contatti:

Re: macro Libreoffice + PY traduzione LibreTranslator

Messaggio da MoonDragon »

Rafbor ha scritto:
sabato 14 settembre 2024, 16:30
Per la funzione Shell, il secondo parametro riguarda lo stile della finestra, vedi la guida

Da quando sono in pensione, non ho più bisogno di Windows, quindi l'ho rimosso da tutti i miei PC, mi spiace non poterlo testare.
Prova a impostare un breakpoint nell'editor di macro, sulla riga 'res = Shell(command, 2)' poi posiziona il cursore del mouse sulla parola 'command', potrai vedere se il comando è corretto, o più semplice se non sei a tuo agio con l'editor, inserisci la riga

Codice: Seleziona tutto

MsgBox command
prima della riga 'res = Shell(command, 2)'

In alternativa, prova a utilizzare la prima versione che hai inserito nel primo post, con la sintassi 'oShell.execute(“cmd”, “/C ‘ & command, 0)’.
Non preoccuparti ti ringrazio per la disponibilità! Io uso costantemente entrambi in base alle varie esigenze.
Ho provato, purtroppo senza successo, ho l'impressione che è dovuto da libreoffice a questo punto. Ho i permessi per tutti i file e cartelle e ho anche messo in lista bianca sull'antivirus ma nulla.
Demoralizzato ho fatto un ulteriore prova:

Codice: Seleziona tutto

Sub CallPythonScript()

    Dim oShell As Object
    Dim sPythonScriptPath As String
    Dim sTextToTranslate As String
    Dim sSourceLang As String
    Dim sTargetLang As String
    Dim outputFilePath As String
    Dim oDoc As Object
    Dim oSel As Object

    ' Percorsi dei file
    sPythonScriptPath = "C:\Users\USER\AppData\Roaming\LibreOffice\4\user\Scripts\python\translate.py"
    outputFilePath = "C:\Users\USER\AppData\Roaming\LibreOffice\4\user\Scripts\python\output.txt"
    
    ' Ottieni il documento attivo
    oDoc = ThisComponent
    ' Ottieni la selezione corrente
    oSel = oDoc.getCurrentSelection()
    
    ' Controlla se c'è una selezione
    If oSel.getCount() > 0 Then
        ' Verifica se la selezione è un range di testo
        If oSel.getByIndex(0).supportsService("com.sun.star.text.TextRange") Then
            ' Ottieni il testo della selezione
            sTextToTranslate = oSel.getByIndex(0).getString()
            
            ' Chiedi la lingua di input e output
            sSourceLang = InputBox("Inserisci la lingua di input (es: 'auto'):", "Lingua di input", "auto")
            sTargetLang = InputBox("Inserisci la lingua di output (es: 'it'):", "Lingua di output", "it")
            
            ' Percorso completo all'eseguibile Python
            Dim pythonExePath As String
            pythonExePath = "C:\python36\python.exe"
            
            ' Verifica se lo script Python esiste
            Dim f As Object
            f = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
            If Not f.exists(sPythonScriptPath) Then
                MsgBox "Il file dello script Python non esiste: " & sPythonScriptPath
                Exit Sub
            End If
            
            ' Escape delle virgolette
            sTextToTranslate = Replace(sTextToTranslate, """", "\""") 
            
            ' Costruisci il comando con il percorso dello script e gli argomenti
            Dim command As String
            command = pythonExePath & " """ & sPythonScriptPath & """ """ & sTextToTranslate & """ """ & sSourceLang & """ """ & sTargetLang & """"
            
            ' Percorso del file di log per eventuali errori
            Dim errorLogPath As String
            errorLogPath = "C:\Users\USER\AppData\Roaming\LibreOffice\4\user\Scripts\python\errorMacro.log"
            
            ' Costruisci il comando finale con il reindirizzamento dell'output e degli errori
            Dim finalCommand As String
            finalCommand = "cmd /c " & command & " > """ & outputFilePath & """ 2> """ & errorLogPath & """"

            ' Esegui il comando usando SystemShellExecute
            Dim oExec As Object
            oExec = CreateUnoService("com.sun.star.system.SystemShellExecute")
            oExec.execute(finalCommand, "", 0)

            ' Attendere che lo script Python completi l'esecuzione
            WaitPythonScript(outputFilePath)
            
            ' Leggi il file di output per ottenere il testo tradotto
            Dim translatedText As String
            translatedText = ReadTranslatedText(outputFilePath)
            
            ' Sostituisci il testo selezionato con quello tradotto
            oSel.getByIndex(0).setString(translatedText) ' Sostituzione corretta
        Else
            MsgBox "La selezione non è un range di testo valido!"
        End If
    Else
        MsgBox "Nessun testo selezionato!"
    End If
End Sub

' Funzione per leggere il testo tradotto dal file di output
Function ReadTranslatedText(filePath As String) As String
    Dim f As Object
    Dim i As Object
    Dim s As String
    On Error GoTo ErrorHandling
    
    f = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
    i = CreateUnoService("com.sun.star.io.TextInputStream")
    
    If f.exists(filePath) Then
        i.setInputStream(f.openFileRead(filePath))
        ReadTranslatedText = i.readString(Array(), False)
        i.closeInput()
    Else
        ReadTranslatedText = "File non trovato!"
    End If
    Exit Function
    
ErrorHandling:
    ReadTranslatedText = "Errore nel leggere il file: " & Err.Description
End Function

' Sub per aspettare che il file di output venga generato
Sub WaitPythonScript(filePath As String)
    Dim f As Object
    f = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
    
    ' Aspetta finché il file non esiste (massimo 10 secondi)
    Dim attempts As Integer
    attempts = 0
    While Not f.exists(filePath) And attempts < 20
        Wait(500)
        attempts = attempts + 1
    Wend
End Sub
qui mi da un errore chiaro cioè che non vede il percorso python benchè messo per esteso ed ovviamente esiste (con cmd funziona).
Farò ancora due prove, magari sposto lo script direttamente dove è installato python e proverò una vecchia versione di libreoffice "portable"
"Coltiva 🐧 LINUX tanto WINDOWS si pianta da solo e la MELA è già stata morsa" :p
Avatar utente
MoonDragon
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1693
Iscrizione: sabato 17 aprile 2010, 17:46
Desktop: Gnome
Distribuzione: Ubuntu 20.04.6 64-bit gdm3 xorg
Sesso: Maschile
Contatti:

Re: macro Libreoffice + PY traduzione LibreTranslator

Messaggio da MoonDragon »

PS: niente da fare, ho provato su windows 3 versioni di Libreoffice (di cui due "portable"), aggiornato e assegnato java jre, ma ancora nulla, ho l'impressione che venga bloccata l'esecuzione di script esterni benchè io abbia messo le impostazioni (su libreoffice) di sicurezza al minimo. Quindi mi arrendo e mi accontento di usare la macro su Ubuntu con server online.
Rafbor ti ringrazio per il supporto :birra:
"Coltiva 🐧 LINUX tanto WINDOWS si pianta da solo e la MELA è già stata morsa" :p
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti