Files

81 lines
3.0 KiB
Python
Raw Permalink Normal View History

2026-07-02 14:09:57 +08:00
"""
Диалог перевода выделенного текста:
показывает оригинал и редактируемый перевод; «Применить» / «Отменить».
"""
from PyQt6.QtWidgets import (
QDialog, QVBoxLayout, QHBoxLayout, QLabel, QTextEdit, QPushButton
)
from comfy_studio.core.i18n import tr
from comfy_studio.services.translator import TranslateWorker, LANG_NAMES
class TranslateDialog(QDialog):
"""
Запускает фоновый перевод текста и позволяет отредактировать результат.
После exec() == Accepted переведённый текст доступен через translated_text().
"""
def __init__(self, source_text: str, target_lang: str, parent=None):
super().__init__(parent)
self.source_text = source_text
self.target_lang = target_lang
self.worker = None
lang_name = LANG_NAMES.get(target_lang, target_lang)
self.setWindowTitle(f"{tr('translation_title')}{lang_name}")
self.resize(560, 440)
self.init_ui()
self._start_translation()
def init_ui(self):
layout = QVBoxLayout(self)
layout.addWidget(QLabel(tr("original_text")))
self.original_edit = QTextEdit()
self.original_edit.setPlainText(self.source_text)
self.original_edit.setReadOnly(True)
self.original_edit.setMaximumHeight(140)
layout.addWidget(self.original_edit)
layout.addWidget(QLabel(tr("translated_text")))
self.translated_edit = QTextEdit()
self.translated_edit.setPlainText(tr("translating"))
self.translated_edit.setEnabled(False)
layout.addWidget(self.translated_edit)
btn_layout = QHBoxLayout()
btn_layout.addStretch()
self.apply_btn = QPushButton(tr("apply"))
self.apply_btn.setEnabled(False)
self.apply_btn.clicked.connect(self.accept)
self.cancel_btn = QPushButton(tr("cancel"))
self.cancel_btn.clicked.connect(self.reject)
btn_layout.addWidget(self.apply_btn)
btn_layout.addWidget(self.cancel_btn)
layout.addLayout(btn_layout)
def _start_translation(self):
self.worker = TranslateWorker(self.source_text, self.target_lang, self)
self.worker.finished.connect(self._on_translation_finished)
self.worker.start()
def _on_translation_finished(self, success: bool, result: str):
if success:
self.translated_edit.setPlainText(result)
self.translated_edit.setEnabled(True)
self.apply_btn.setEnabled(True)
self.translated_edit.setFocus()
else:
self.translated_edit.setPlainText(f"{tr('translation_failed')}:\n{result}")
def translated_text(self) -> str:
return self.translated_edit.toPlainText()
def closeEvent(self, event):
if self.worker and self.worker.isRunning():
self.worker.finished.disconnect()
self.worker.quit()
super().closeEvent(event)