--- /dev/null
+from __future__ import annotations
+from PyQt6.QtCore import QObject, QProcess, pyqtSignal
+from pathlib import Path
+
+class TranslationWorker(QObject):
+ log_line = pyqtSignal(str)
+ finished = pyqtSignal(bool, str) # success, output_path
+ error = pyqtSignal(str)
+
+ def __init__(self, transart_script: Path, article_path: Path, direction: str, parent=None):
+ super().__init__(parent)
+ self._script = transart_script
+ self._article_path = article_path
+ self._direction = direction # e.g. "it-en" or "en-it"
+ self._process = QProcess(self)
+ self._process.readyReadStandardOutput.connect(self._on_stdout)
+ self._process.readyReadStandardError.connect(self._on_stderr)
+ self._process.finished.connect(self._on_finished)
+
+ def start(self):
+ self._process.start("python3", [
+ str(self._script),
+ "--direction", self._direction,
+ str(self._article_path),
+ ])
+
+ def _on_stdout(self):
+ data = self._process.readAllStandardOutput().data().decode("utf-8", errors="replace")
+ for line in data.splitlines():
+ self.log_line.emit(line)
+
+ def _on_stderr(self):
+ data = self._process.readAllStandardError().data().decode("utf-8", errors="replace")
+ for line in data.splitlines():
+ self.log_line.emit(f"[stderr] {line}")
+
+ def _on_finished(self, exit_code: int, _):
+ success = exit_code == 0
+ path_str = str(self._article_path)
+ if "/it/" in path_str:
+ out = path_str.replace("/it/", "/en/", 1)
+ elif "/en/" in path_str:
+ out = path_str.replace("/en/", "/it/", 1)
+ else:
+ out = ""
+ if not success:
+ self.error.emit(f"transart.py exited with code {exit_code}")
+ self.finished.emit(success, out)