SettingsEditor updated. Added rescent translator settings.

This commit is contained in:
Gres 2015-10-09 23:34:24 +03:00
parent 90cce0a370
commit 468a6fd039
3 changed files with 325 additions and 226 deletions

View File

@ -1,15 +1,17 @@
#include "SettingsEditor.h" #include "SettingsEditor.h"
#include "ui_SettingsEditor.h" #include "ui_SettingsEditor.h"
#include "LanguageHelper.h" #include "LanguageHelper.h"
#include "TranslatorHelper.h"
#include <QSettings> #include <QSettings>
#include <QFileDialog> #include <QFileDialog>
#include <QDir>
#include "Settings.h" #include "Settings.h"
SettingsEditor::SettingsEditor (const LanguageHelper &dictionary, QWidget *parent) : SettingsEditor::SettingsEditor (const LanguageHelper &dictionary, QWidget *parent) :
QDialog (parent), QDialog (parent),
ui (new Ui::SettingsEditor), dictionary_ (dictionary), ui (new Ui::SettingsEditor), translatorHelper_ (new TranslatorHelper), dictionary_ (dictionary),
buttonGroup_ (new QButtonGroup (this)) { buttonGroup_ (new QButtonGroup (this)) {
ui->setupUi (this); ui->setupUi (this);
@ -27,6 +29,7 @@ SettingsEditor::SettingsEditor (const LanguageHelper &dictionary, QWidget *paren
SettingsEditor::~SettingsEditor () { SettingsEditor::~SettingsEditor () {
saveState (); saveState ();
delete translatorHelper_;
delete ui; delete ui;
} }
@ -52,19 +55,32 @@ void SettingsEditor::saveSettings () const {
settings.beginGroup (recogntionGroup); settings.beginGroup (recogntionGroup);
settings.setValue (tessDataPlace, ui->tessdataEdit->text ()); settings.setValue (tessDataPlace, ui->tessdataEdit->text ());
QString ocrLanguage = dictionary_.ocrUiToCode (ui->ocrLangCombo->currentText ()); QString ocrLanguageVal = dictionary_.ocrUiToCode (ui->ocrLangCombo->currentText ());
settings.setValue (ocrLanguage, ocrLanguage); settings.setValue (ocrLanguage, ocrLanguageVal);
settings.setValue (imageScale, ui->imageScaleSpin->value ()); settings.setValue (imageScale, ui->imageScaleSpin->value ());
settings.endGroup (); settings.endGroup ();
settings.beginGroup (translationGroup); settings.beginGroup (translationGroup);
settings.setValue (doTranslation, ui->doTranslationCombo->isChecked ()); settings.setValue (doTranslation, ui->doTranslationCheck->isChecked ());
settings.setValue (translationDebugMode, ui->translatorDebugCheck->isChecked ());
QString trLanguage = dictionary_.translateUiToCode (ui->translateLangCombo->currentText ()); QString trLanguage = dictionary_.translateUiToCode (ui->translateLangCombo->currentText ());
settings.setValue (translationLanguage, trLanguage); settings.setValue (translationLanguage, trLanguage);
QString sourceLanguage = dictionary_.translateForOcrCode (ocrLanguage); QString sourceLanguageVal = dictionary_.translateForOcrCode (ocrLanguage);
settings.setValue (sourceLanguage, sourceLanguage); settings.setValue (sourceLanguage, sourceLanguageVal);
settings.setValue (translationTimeout, ui->translateTimeoutSpin->value ()); settings.setValue (translationTimeout, ui->translateTimeoutSpin->value ());
{//Translators
QStringList enabled;
for (int i = 0, end = ui->translatorList->count (); i < end; ++i) {
QListWidgetItem *item = ui->translatorList->item (i);
if (item->checkState () == Qt::Checked) {
enabled << item->text ();
}
}
translatorHelper_->setEnabledTranslators (enabled);
}
settings.endGroup (); settings.endGroup ();
} }
@ -102,10 +118,22 @@ void SettingsEditor::loadSettings () {
settings.endGroup (); settings.endGroup ();
settings.beginGroup (settings_names::translationGroup); settings.beginGroup (settings_names::translationGroup);
ui->doTranslationCombo->setChecked (GET (doTranslation).toBool ()); ui->doTranslationCheck->setChecked (GET (doTranslation).toBool ());
ui->translatorDebugCheck->setChecked (GET (translationDebugMode).toBool ());
QString trLanguage = dictionary_.translateCodeToUi (GET (translationLanguage).toString ()); QString trLanguage = dictionary_.translateCodeToUi (GET (translationLanguage).toString ());
ui->translateLangCombo->setCurrentText (trLanguage); ui->translateLangCombo->setCurrentText (trLanguage);
ui->translateTimeoutSpin->setValue (GET (translationTimeout).toInt ()); ui->translateTimeoutSpin->setValue (GET (translationTimeout).toInt ());
{// Translators
QStringList enabled;
ui->translatorList->addItems (translatorHelper_->possibleTranslators (enabled));
for (int i = 0, end = ui->translatorList->count (); i < end; ++i) {
QListWidgetItem *item = ui->translatorList->item (i);
Qt::CheckState state = enabled.contains (item->text ()) ? Qt::Checked : Qt::Unchecked;
item->setCheckState (state);
}
}
settings.endGroup (); settings.endGroup ();
#undef GET #undef GET
} }

View File

@ -9,6 +9,7 @@ namespace Ui {
class SettingsEditor; class SettingsEditor;
} }
class LanguageHelper; class LanguageHelper;
class TranslatorHelper;
class SettingsEditor : public QDialog { class SettingsEditor : public QDialog {
Q_OBJECT Q_OBJECT
@ -35,6 +36,7 @@ class SettingsEditor : public QDialog {
private: private:
Ui::SettingsEditor *ui; Ui::SettingsEditor *ui;
TranslatorHelper *translatorHelper_;
const LanguageHelper &dictionary_; const LanguageHelper &dictionary_;
QButtonGroup *buttonGroup_; QButtonGroup *buttonGroup_;
}; };

View File

@ -6,92 +6,15 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>603</width> <width>509</width>
<height>296</height> <height>338</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Настройки</string> <string>Настройки</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_5"> <layout class="QGridLayout" name="gridLayout_6">
<item row="4" column="0"> <item row="1" column="0" colspan="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>1</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Распознавание</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Необходимо для распознавания.&lt;/p&gt;&lt;p&gt;Скачивается отсюда: &lt;a href=&quot;https://github.com/tesseract-ocr/tessdata&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#7593bc;&quot;&gt;https://github.com/tesseract-ocr/tessdata&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;quot;./&amp;quot; означает, что папка &amp;quot;tessdata&amp;quot; находится в одной директории с исполняемым файлом программы.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Путь к tessdata</string>
</property>
<property name="buddy">
<cstring>tessdataEdit</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="tessdataEdit"/>
</item>
<item row="0" column="2">
<widget class="QToolButton" name="tessdataButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Заполняется на основании содержания tessdata&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Язык распознавания</string>
</property>
<property name="buddy">
<cstring>ocrLangCombo</cstring>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_5">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Масштабирование изображения для улучшения распознания. Больше - лучше (до определенных пределов), но медленнее и потребляет больше памяти.&lt;/p&gt;&lt;p&gt;Рекомендуемые значения от 5 до 10.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Увеличение масштаба</string>
</property>
<property name="buddy">
<cstring>imageScaleSpin</cstring>
</property>
</widget>
</item>
<item row="1" column="1" colspan="2">
<widget class="QComboBox" name="ocrLangCombo"/>
</item>
<item row="2" column="1" colspan="2">
<widget class="QSpinBox" name="imageScaleSpin"/>
</item>
</layout>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QDialogButtonBox" name="buttonBox"> <widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
@ -101,154 +24,300 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="0" column="0" colspan="2">
<widget class="QGroupBox" name="resultGroup"> <widget class="QTabWidget" name="tabWidget">
<property name="title"> <property name="currentIndex">
<string>Вывод результата</string> <number>0</number>
</property> </property>
<layout class="QGridLayout" name="gridLayout_4"> <widget class="QWidget" name="commonTab">
<item row="0" column="0"> <attribute name="title">
<widget class="QRadioButton" name="trayRadio"> <string>Общее</string>
<property name="text"> </attribute>
<string>Трей</string> <layout class="QGridLayout" name="gridLayout_5">
</property> <item row="0" column="0" colspan="2">
</widget> <widget class="QGroupBox" name="groupBox">
</item> <property name="title">
<item row="0" column="1"> <string>Горячие клавиши</string>
<widget class="QRadioButton" name="dialogRadio"> </property>
<property name="text"> <layout class="QGridLayout" name="gridLayout">
<string>Окно</string> <item row="0" column="0">
</property> <widget class="QLabel" name="label">
<property name="checked"> <property name="toolTip">
<bool>true</bool> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Сочетание клавиш для перехода в режим захвата.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
</widget> <property name="text">
</item> <string>Захватить</string>
</layout> </property>
</widget> </widget>
</item> </item>
<item row="0" column="0" rowspan="2"> <item row="0" column="1">
<widget class="QGroupBox" name="groupBox"> <widget class="QKeySequenceEdit" name="captureEdit"/>
<property name="title"> </item>
<string>Горячие клавиши</string> <item row="1" column="0">
</property> <widget class="QLabel" name="label_8">
<layout class="QGridLayout" name="gridLayout"> <property name="toolTip">
<item row="0" column="0"> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Сочетание клавиш для перехода в режим захвата, но с использованием последнего использованного, а не текущего, изображения.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<widget class="QLabel" name="label"> </property>
<property name="toolTip"> <property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Сочетание клавиш для перехода в режим захвата.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>Захватить повторно</string>
</property> </property>
<property name="text"> </widget>
<string>Захватить</string> </item>
</property> <item row="1" column="1">
</widget> <widget class="QKeySequenceEdit" name="repeatCaptureEdit"/>
</item> </item>
<item row="0" column="1"> <item row="2" column="0">
<widget class="QKeySequenceEdit" name="captureEdit"/> <widget class="QLabel" name="label_3">
</item> <property name="toolTip">
<item row="1" column="0"> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Сочетание клавиш для повторного отображения последнего результата.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<widget class="QLabel" name="label_8"> </property>
<property name="toolTip"> <property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Сочетание клавиш для перехода в режим захвата, но с использованием последнего использованного, а не текущего, изображения.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>Показать</string>
</property> </property>
<property name="text"> </widget>
<string>Захватить повторно</string> </item>
</property> <item row="2" column="1">
</widget> <widget class="QKeySequenceEdit" name="repeatEdit"/>
</item> </item>
<item row="1" column="1"> <item row="3" column="0">
<widget class="QKeySequenceEdit" name="repeatCaptureEdit"/> <widget class="QLabel" name="label_7">
</item> <property name="toolTip">
<item row="2" column="0"> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Сочетание клавиш для копирования последнего результата в буфер обмена.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<widget class="QLabel" name="label_3"> </property>
<property name="toolTip"> <property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Сочетание клавиш для повторного отображения последнего результата.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>Скопировать</string>
</property> </property>
<property name="text"> </widget>
<string>Показать</string> </item>
</property> <item row="3" column="1">
</widget> <widget class="QKeySequenceEdit" name="clipboardEdit"/>
</item> </item>
<item row="2" column="1"> </layout>
<widget class="QKeySequenceEdit" name="repeatEdit"/> </widget>
</item> </item>
<item row="3" column="0"> <item row="2" column="1">
<widget class="QLabel" name="label_7"> <spacer name="verticalSpacer">
<property name="toolTip"> <property name="orientation">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Сочетание клавиш для копирования последнего результата в буфер обмена.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <enum>Qt::Vertical</enum>
</property> </property>
<property name="text"> <property name="sizeHint" stdset="0">
<string>Скопировать</string> <size>
</property> <width>20</width>
</widget> <height>270</height>
</item> </size>
<item row="3" column="1"> </property>
<widget class="QKeySequenceEdit" name="clipboardEdit"/> </spacer>
</item> </item>
</layout> <item row="1" column="0" colspan="2">
</widget> <widget class="QGroupBox" name="resultGroup">
</item> <property name="title">
<item row="1" column="1" rowspan="2"> <string>Вывод результата</string>
<widget class="QGroupBox" name="groupBox_3"> </property>
<property name="title"> <layout class="QGridLayout" name="gridLayout_4">
<string>Перевод</string> <item row="0" column="0">
</property> <widget class="QRadioButton" name="trayRadio">
<layout class="QGridLayout" name="gridLayout_2"> <property name="text">
<item row="0" column="0" colspan="3"> <string>Трей</string>
<widget class="QCheckBox" name="doTranslationCombo"> </property>
<property name="toolTip"> </widget>
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Необходимо ли переводить (вкл) распознанный текст.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> </item>
</property> <item row="0" column="1">
<property name="text"> <widget class="QRadioButton" name="dialogRadio">
<string>Переводить текст</string> <property name="text">
</property> <string>Окно</string>
</widget> </property>
</item> <property name="checked">
<item row="1" column="0" colspan="2"> <bool>true</bool>
<widget class="QLabel" name="label_9"> </property>
<property name="whatsThis"> </widget>
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Максимальное время, которое может быть затрачено на перевод, чтобы он не считался &amp;quot;зависшим&amp;quot;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> </item>
</property> </layout>
<property name="text"> </widget>
<string>Максимальное время перевода:</string> </item>
</property> </layout>
</widget> </widget>
</item> <widget class="QWidget" name="recognizeTab">
<item row="1" column="2"> <attribute name="title">
<widget class="QSpinBox" name="translateTimeoutSpin"> <string>Распознавание</string>
<property name="suffix"> </attribute>
<string> сек.</string> <layout class="QGridLayout" name="gridLayout_3">
</property> <item row="0" column="0">
</widget> <widget class="QLabel" name="label_2">
</item> <property name="toolTip">
<item row="2" column="0"> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Необходимо для распознавания.&lt;/p&gt;&lt;p&gt;Скачивается отсюда: &lt;a href=&quot;https://github.com/tesseract-ocr/tessdata&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#7593bc;&quot;&gt;https://github.com/tesseract-ocr/tessdata&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;quot;./&amp;quot; означает, что папка &amp;quot;tessdata&amp;quot; находится в одной директории с исполняемым файлом программы.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<widget class="QLabel" name="label_6"> </property>
<property name="toolTip"> <property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Язык, на который осуществляется перевод.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>Путь к tessdata</string>
</property> </property>
<property name="text"> <property name="buddy">
<string>Язык результата:</string> <cstring>tessdataEdit</cstring>
</property> </property>
<property name="buddy"> </widget>
<cstring>translateLangCombo</cstring> </item>
</property> <item row="0" column="1">
</widget> <widget class="QLineEdit" name="tessdataEdit"/>
</item> </item>
<item row="2" column="1" colspan="2"> <item row="0" column="2">
<widget class="QComboBox" name="translateLangCombo"/> <widget class="QToolButton" name="tessdataButton">
</item> <property name="text">
</layout> <string>...</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Заполняется на основании содержания tessdata&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Язык распознавания</string>
</property>
<property name="buddy">
<cstring>ocrLangCombo</cstring>
</property>
</widget>
</item>
<item row="1" column="1" colspan="2">
<widget class="QComboBox" name="ocrLangCombo"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_5">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Масштабирование изображения для улучшения распознания. Больше - лучше (до определенных пределов), но медленнее и потребляет больше памяти.&lt;/p&gt;&lt;p&gt;Рекомендуемые значения от 5 до 10.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Увеличение масштаба</string>
</property>
<property name="buddy">
<cstring>imageScaleSpin</cstring>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="QSpinBox" name="imageScaleSpin"/>
</item>
<item row="3" column="0">
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>132</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="translateTab">
<attribute name="title">
<string>Перевод</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_7">
<item row="0" column="0">
<widget class="QCheckBox" name="doTranslationCheck">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Необходимо ли переводить (вкл) распознанный текст.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Переводить текст</string>
</property>
</widget>
</item>
<item row="0" column="1" colspan="2">
<widget class="QCheckBox" name="translatorDebugCheck">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Отображает окно переводчика. Следует использовать только для разработки переводчиков.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Режим отладки</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_9">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Максимальное время, которое может быть затрачено на перевод, чтобы он не считался &amp;quot;зависшим&amp;quot;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Максимальное время перевода:</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_6">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Язык, на который осуществляется перевод.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Язык результата:</string>
</property>
<property name="buddy">
<cstring>translateLangCombo</cstring>
</property>
</widget>
</item>
<item row="3" column="0" colspan="3">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Переводчики:</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="QComboBox" name="translateLangCombo"/>
</item>
<item row="1" column="1" colspan="2">
<widget class="QSpinBox" name="translateTimeoutSpin">
<property name="suffix">
<string> сек.</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="3">
<widget class="QListWidget" name="translatorList">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Отображены в порядке убывания приоритета.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::InternalMove</enum>
</property>
<property name="defaultDropAction">
<enum>Qt::MoveAction</enum>
</property>
</widget>
</item>
</layout>
</widget>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
<tabstops> <tabstops>
<tabstop>translateLangCombo</tabstop> <tabstop>tabWidget</tabstop>
<tabstop>captureEdit</tabstop>
<tabstop>repeatCaptureEdit</tabstop>
<tabstop>repeatEdit</tabstop>
<tabstop>clipboardEdit</tabstop>
<tabstop>trayRadio</tabstop>
<tabstop>dialogRadio</tabstop>
<tabstop>tessdataEdit</tabstop> <tabstop>tessdataEdit</tabstop>
<tabstop>tessdataButton</tabstop> <tabstop>tessdataButton</tabstop>
<tabstop>ocrLangCombo</tabstop> <tabstop>ocrLangCombo</tabstop>
<tabstop>imageScaleSpin</tabstop> <tabstop>imageScaleSpin</tabstop>
<tabstop>buttonBox</tabstop> <tabstop>doTranslationCheck</tabstop>
<tabstop>translatorDebugCheck</tabstop>
<tabstop>translateTimeoutSpin</tabstop>
<tabstop>translateLangCombo</tabstop>
<tabstop>translatorList</tabstop>
</tabstops> </tabstops>
<resources/> <resources/>
<connections> <connections>