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
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'
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}")
Altro problema è che non sostituisce il testo selezionato ma lo aggiunge prima della selezione
Qualcuno saprebbe farlo funzionare?