From da51f79708fd503f0f0b5112e5e6ebdd593c779d Mon Sep 17 00:00:00 2001 From: Gres Date: Mon, 9 Mar 2020 11:29:32 +0300 Subject: [PATCH] Allow special characters in substitutions --- share/translations/screentranslator_ru.ts | 141 +++++++++++----------- src/settingseditor.ui | 3 + src/substitutionstable.cpp | 48 +++++++- 3 files changed, 123 insertions(+), 69 deletions(-) diff --git a/share/translations/screentranslator_ru.ts b/share/translations/screentranslator_ru.ts index 200e201..c4ddc9f 100644 --- a/share/translations/screentranslator_ru.ts +++ b/share/translations/screentranslator_ru.ts @@ -827,32 +827,32 @@ in %1 Пользовательская коррекция - + Use auto corrections (hunspell) Использовать автокоррекцию (hunspell) - + Use user substitutions Использовать пользовательскую коррекцию - + Hunspell dictionaries path: Путь к словарям Hunspell: - + Language: Язык: - + secs сек - + Ignore SSL errors Игнорировать ошибки SSL @@ -892,92 +892,97 @@ in %1 Путь к языкам (tessdata): - + + \\ for \ symbol, \n for newline + \\ для символа \ , \n для символа новой строки + + + Translators path: Путь к переводчикам: - + Translators Переводчики - + Result window Окно результата - + Font: Шрифт: - + Font size: Размер шрифта: - + Font color: Цвет шрифта: - + Background: Фон: - + Show image Показывать изображение - + Show recognized Показывать распознанное - + Update check interval (days): Интервал проверки обновления (дней): - + 0 - disabled - отключено - + Apply updates Применить изменения - + Translate text Переводить текст - + Single translator timeout: Переходить к следующему переводчику после: - + Result type Тип результата - + Tray Трей - + Window Окно - + Check now Проверить сейчас @@ -1050,17 +1055,17 @@ in %1 SubstitutionsTable - + Language Язык - + Source Исходный текст - + Changed Замена @@ -1168,73 +1173,73 @@ in %1 Updates - + Tb Тб - + Gb Гб - + Mb Мб - + Kb Кб - + bytes байт - + Not installed Не установлено - + Update available Доступно обновление - + Up to date Последняя версия - + Remove Удалить - + Install/Update Установить/Обновить - - + + Directory is not writable %1 Папка недоступна для записи %1 - + Downloaded file not exists %1 Скачанный файл не существует %1 - - + + Failed to remove file %1 Error %2 @@ -1243,14 +1248,14 @@ Error %2 Текст %2 - + Failed to create path %1 Ошибка создания папки %1 - + Failed to move file %1 to %2 @@ -1261,7 +1266,7 @@ Error %3 Текст %3 - + Failed to set modification time of file %1 to %2. Error %3 @@ -1281,66 +1286,66 @@ to %2. Error %3 update::Loader - + Empty updates info from %1 Пустой файл обновлений из %1 - + Empty updates info unpacked from %1 Пустой файл обновлений распакован из %1 - + Failed to parse updates from %1 (%2) Ошибка разбора файла обновлений %1 (%2) - + Failed to download file %1. Error %2 Ошибка скачивания файла %1. Текст %2 - + Already updating Обновление в процессе - + No actions selected Нет выделенных действий - + Failed to create temp path %1 Ошибка создания временной папки %1 - + Empty data downloaded from %1 Пустой файл из %1 - + Empty data unpacked from %1 Пустой файл распакован из %1 - + Failed to save downloaded file %1 to %2 @@ -1351,7 +1356,7 @@ Error %3 Текст %3 - + Update failed: %1 Ошибка обновления: %1 @@ -1359,62 +1364,62 @@ Error %3 update::Model - + Select all updates Выбрать все обновления - + Reset actions Сбросить действия - + Failed to parse: %1 at %2 Ошибка разбора: %1 в %2 - + Wrong updates version: %1 Неверная версия файла обновлений: %1 - + No data parsed Нет разобранных данных - + Name Название - + State Состояние - + Action Действие - + Size Размер - + Version Версия - + Progress Прогресс - + Files Файла diff --git a/src/settingseditor.ui b/src/settingseditor.ui index f1f1679..8a61bc2 100644 --- a/src/settingseditor.ui +++ b/src/settingseditor.ui @@ -298,6 +298,9 @@ + + \\ for \ symbol, \n for newline + QAbstractItemView::SelectRows diff --git a/src/substitutionstable.cpp b/src/substitutionstable.cpp index 89fbf31..d854132 100644 --- a/src/substitutionstable.cpp +++ b/src/substitutionstable.cpp @@ -3,6 +3,7 @@ #include "languagecodes.h" #include +#include #include #include #include @@ -22,7 +23,52 @@ public: { painter->drawText(option.rect, Qt::AlignCenter, index.data().toString()); } -}; + + QWidget *createEditor(QWidget *parent, + const QStyleOptionViewItem & /*option*/, + const QModelIndex & /*index*/) const override + { + return new QLineEdit(parent); + } + + void setEditorData(QWidget *editor, const QModelIndex &index) const override + { + auto casted = qobject_cast(editor); + SOFT_ASSERT(casted, return ); + auto text = index.data(Qt::EditRole).toString(); + + text.replace('\\', "\\\\"); + text.replace('\n', "\\n"); + + casted->setText(text); + } + + void setModelData(QWidget *editor, QAbstractItemModel *model, + const QModelIndex &index) const override + { + auto casted = qobject_cast(editor); + SOFT_ASSERT(casted, return ); + auto text = casted->text(); + + if (!text.isEmpty()) { + const QMap replacements{ + {"\\\\", "\\"}, + {"\\n", "\n"}, + }; + for (auto i = 0, end = text.size() - 1; i < end; ++i) { + const auto pair = text.mid(i, 2); + const auto replaced = replacements.value(pair); + if (replaced.isEmpty()) + continue; + + text.replace(i, 2, replaced); + --end; + } + } + + model->setData(index, text); + } +}; // namespace } // namespace