81 lines
3.0 KiB
Python
81 lines
3.0 KiB
Python
|
|
"""
|
||
|
|
Диалог перевода выделенного текста:
|
||
|
|
показывает оригинал и редактируемый перевод; «Применить» / «Отменить».
|
||
|
|
"""
|
||
|
|
|
||
|
|
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)
|