From d9c163431cde1a23364270eb8d9b04fb88a49330 Mon Sep 17 00:00:00 2001 From: 283375 Date: Tue, 18 Jun 2024 17:22:50 +0800 Subject: [PATCH] feat: OCR score date source (#9) * New settings entries * Choose `birthTime`/`lastModified` for OCR score date source if the image EXIF fails --- ui/designer/components/ocrQueue.ui | 40 +---- .../components/ocrQueueOptionsDialog.ui | 140 ++++++++++++++++++ .../components/ocrQueueOptionsDialog_ui.py | 107 +++++++++++++ ui/designer/components/ocrQueue_ui.py | 38 +---- ui/extends/components/ocrQueue.py | 9 +- ui/extends/shared/settings.py | 11 ++ ui/extends/tabs/tabOcr/tabOcr_Device.py | 9 +- ui/implements/components/ocrQueue.py | 22 +-- .../components/ocrQueueOptionsDialog.py | 48 ++++++ ui/resources/lang/en_US.ts | 99 ++++++++----- ui/resources/lang/zh_CN.ts | 99 ++++++++----- 11 files changed, 480 insertions(+), 142 deletions(-) create mode 100644 ui/designer/components/ocrQueueOptionsDialog.ui create mode 100644 ui/designer/components/ocrQueueOptionsDialog_ui.py create mode 100644 ui/implements/components/ocrQueueOptionsDialog.py diff --git a/ui/designer/components/ocrQueue.ui b/ui/designer/components/ocrQueue.ui index 2c1e9de..7164a48 100644 --- a/ui/designer/components/ocrQueue.ui +++ b/ui/designer/components/ocrQueue.ui @@ -22,39 +22,6 @@ queue.title - - - - iccOptionsGroupBox - - - - - - icc.useQt - - - - - - - icc.usePIL - - - true - - - - - - - icc.tryFix - - - - - - @@ -95,6 +62,13 @@ + + + + queue.optionsButton + + + diff --git a/ui/designer/components/ocrQueueOptionsDialog.ui b/ui/designer/components/ocrQueueOptionsDialog.ui new file mode 100644 index 0000000..1c1d847 --- /dev/null +++ b/ui/designer/components/ocrQueueOptionsDialog.ui @@ -0,0 +1,140 @@ + + + OcrQueueOptionsDialog + + + + 0 + 0 + 331 + 157 + + + + OCR Options + + + + + + + + iccOptionsGroupBox + + + + + + icc.useQt + + + + + + + icc.usePIL + + + true + + + + + + + icc.tryFix + + + + + + + + + + dateOptionsGroupBox + + + + + + false + + + date.readFromExif + + + true + + + + + + + date.useCreationDate + + + true + + + + + + + date.useModifyDate + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + OcrQueueOptionsDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + OcrQueueOptionsDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/ui/designer/components/ocrQueueOptionsDialog_ui.py b/ui/designer/components/ocrQueueOptionsDialog_ui.py new file mode 100644 index 0000000..2c58972 --- /dev/null +++ b/ui/designer/components/ocrQueueOptionsDialog_ui.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'ocrQueueOptionsDialog.ui' +## +## Created by: Qt User Interface Compiler version 6.5.2 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QAbstractButton, QApplication, QCheckBox, QDialog, + QDialogButtonBox, QGroupBox, QHBoxLayout, QRadioButton, + QSizePolicy, QVBoxLayout, QWidget) + +class Ui_OcrQueueOptionsDialog(object): + def setupUi(self, OcrQueueOptionsDialog): + if not OcrQueueOptionsDialog.objectName(): + OcrQueueOptionsDialog.setObjectName(u"OcrQueueOptionsDialog") + OcrQueueOptionsDialog.resize(331, 157) + self.verticalLayout = QVBoxLayout(OcrQueueOptionsDialog) + self.verticalLayout.setObjectName(u"verticalLayout") + self.horizontalLayout = QHBoxLayout() + self.horizontalLayout.setObjectName(u"horizontalLayout") + self.groupBox = QGroupBox(OcrQueueOptionsDialog) + self.groupBox.setObjectName(u"groupBox") + self.verticalLayout_2 = QVBoxLayout(self.groupBox) + self.verticalLayout_2.setObjectName(u"verticalLayout_2") + self.iccUseQtRadioButton = QRadioButton(self.groupBox) + self.iccUseQtRadioButton.setObjectName(u"iccUseQtRadioButton") + + self.verticalLayout_2.addWidget(self.iccUseQtRadioButton) + + self.iccUsePILRadioButton = QRadioButton(self.groupBox) + self.iccUsePILRadioButton.setObjectName(u"iccUsePILRadioButton") + self.iccUsePILRadioButton.setChecked(True) + + self.verticalLayout_2.addWidget(self.iccUsePILRadioButton) + + self.iccTryFixRadioButton = QRadioButton(self.groupBox) + self.iccTryFixRadioButton.setObjectName(u"iccTryFixRadioButton") + + self.verticalLayout_2.addWidget(self.iccTryFixRadioButton) + + + self.horizontalLayout.addWidget(self.groupBox) + + self.groupBox_2 = QGroupBox(OcrQueueOptionsDialog) + self.groupBox_2.setObjectName(u"groupBox_2") + self.verticalLayout_3 = QVBoxLayout(self.groupBox_2) + self.verticalLayout_3.setObjectName(u"verticalLayout_3") + self.dateReadFromExifCheckbox = QCheckBox(self.groupBox_2) + self.dateReadFromExifCheckbox.setObjectName(u"dateReadFromExifCheckbox") + self.dateReadFromExifCheckbox.setEnabled(False) + self.dateReadFromExifCheckbox.setChecked(True) + + self.verticalLayout_3.addWidget(self.dateReadFromExifCheckbox) + + self.dateUseCreationDateRadioButton = QRadioButton(self.groupBox_2) + self.dateUseCreationDateRadioButton.setObjectName(u"dateUseCreationDateRadioButton") + self.dateUseCreationDateRadioButton.setChecked(True) + + self.verticalLayout_3.addWidget(self.dateUseCreationDateRadioButton) + + self.dateUseModifyDateRadioButton = QRadioButton(self.groupBox_2) + self.dateUseModifyDateRadioButton.setObjectName(u"dateUseModifyDateRadioButton") + + self.verticalLayout_3.addWidget(self.dateUseModifyDateRadioButton) + + + self.horizontalLayout.addWidget(self.groupBox_2) + + + self.verticalLayout.addLayout(self.horizontalLayout) + + self.buttonBox = QDialogButtonBox(OcrQueueOptionsDialog) + self.buttonBox.setObjectName(u"buttonBox") + self.buttonBox.setOrientation(Qt.Horizontal) + self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel|QDialogButtonBox.Ok) + + self.verticalLayout.addWidget(self.buttonBox) + + + self.retranslateUi(OcrQueueOptionsDialog) + self.buttonBox.accepted.connect(OcrQueueOptionsDialog.accept) + self.buttonBox.rejected.connect(OcrQueueOptionsDialog.reject) + + QMetaObject.connectSlotsByName(OcrQueueOptionsDialog) + # setupUi + + def retranslateUi(self, OcrQueueOptionsDialog): + OcrQueueOptionsDialog.setWindowTitle(QCoreApplication.translate("OcrQueueOptionsDialog", u"OCR Options", None)) + self.groupBox.setTitle(QCoreApplication.translate("OcrQueueOptionsDialog", u"iccOptionsGroupBox", None)) + self.iccUseQtRadioButton.setText(QCoreApplication.translate("OcrQueueOptionsDialog", u"icc.useQt", None)) + self.iccUsePILRadioButton.setText(QCoreApplication.translate("OcrQueueOptionsDialog", u"icc.usePIL", None)) + self.iccTryFixRadioButton.setText(QCoreApplication.translate("OcrQueueOptionsDialog", u"icc.tryFix", None)) + self.groupBox_2.setTitle(QCoreApplication.translate("OcrQueueOptionsDialog", u"dateOptionsGroupBox", None)) + self.dateReadFromExifCheckbox.setText(QCoreApplication.translate("OcrQueueOptionsDialog", u"date.readFromExif", None)) + self.dateUseCreationDateRadioButton.setText(QCoreApplication.translate("OcrQueueOptionsDialog", u"date.useCreationDate", None)) + self.dateUseModifyDateRadioButton.setText(QCoreApplication.translate("OcrQueueOptionsDialog", u"date.useModifyDate", None)) + # retranslateUi diff --git a/ui/designer/components/ocrQueue_ui.py b/ui/designer/components/ocrQueue_ui.py index 238e98d..2de0728 100644 --- a/ui/designer/components/ocrQueue_ui.py +++ b/ui/designer/components/ocrQueue_ui.py @@ -17,8 +17,8 @@ from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QPalette, QPixmap, QRadialGradient, QTransform) from PySide6.QtWidgets import (QAbstractItemView, QApplication, QCheckBox, QGroupBox, QHBoxLayout, QHeaderView, QLabel, QProgressBar, - QPushButton, QRadioButton, QSizePolicy, QSpacerItem, - QTableView, QVBoxLayout, QWidget) + QPushButton, QSizePolicy, QSpacerItem, QTableView, + QVBoxLayout, QWidget) class Ui_OcrQueue(object): def setupUi(self, OcrQueue): @@ -34,29 +34,6 @@ class Ui_OcrQueue(object): self.groupBox_3.setObjectName(u"groupBox_3") self.verticalLayout_2 = QVBoxLayout(self.groupBox_3) self.verticalLayout_2.setObjectName(u"verticalLayout_2") - self.groupBox = QGroupBox(self.groupBox_3) - self.groupBox.setObjectName(u"groupBox") - self.verticalLayout = QVBoxLayout(self.groupBox) - self.verticalLayout.setObjectName(u"verticalLayout") - self.iccUseQtRadioButton = QRadioButton(self.groupBox) - self.iccUseQtRadioButton.setObjectName(u"iccUseQtRadioButton") - - self.verticalLayout.addWidget(self.iccUseQtRadioButton) - - self.iccUsePILRadioButton = QRadioButton(self.groupBox) - self.iccUsePILRadioButton.setObjectName(u"iccUsePILRadioButton") - self.iccUsePILRadioButton.setChecked(True) - - self.verticalLayout.addWidget(self.iccUsePILRadioButton) - - self.iccTryFixRadioButton = QRadioButton(self.groupBox) - self.iccTryFixRadioButton.setObjectName(u"iccTryFixRadioButton") - - self.verticalLayout.addWidget(self.iccTryFixRadioButton) - - - self.verticalLayout_2.addWidget(self.groupBox) - self.ocr_addImageButton = QPushButton(self.groupBox_3) self.ocr_addImageButton.setObjectName(u"ocr_addImageButton") @@ -78,6 +55,11 @@ class Ui_OcrQueue(object): self.verticalLayout_2.addItem(self.verticalSpacer) + self.optionsDialogButton = QPushButton(self.groupBox_3) + self.optionsDialogButton.setObjectName(u"optionsDialogButton") + + self.verticalLayout_2.addWidget(self.optionsDialogButton) + self.ocr_startButton = QPushButton(self.groupBox_3) self.ocr_startButton.setObjectName(u"ocr_startButton") @@ -154,13 +136,10 @@ class Ui_OcrQueue(object): def retranslateUi(self, OcrQueue): self.groupBox_3.setTitle(QCoreApplication.translate("OcrQueue", u"queue.title", None)) - self.groupBox.setTitle(QCoreApplication.translate("OcrQueue", u"iccOptionsGroupBox", None)) - self.iccUseQtRadioButton.setText(QCoreApplication.translate("OcrQueue", u"icc.useQt", None)) - self.iccUsePILRadioButton.setText(QCoreApplication.translate("OcrQueue", u"icc.usePIL", None)) - self.iccTryFixRadioButton.setText(QCoreApplication.translate("OcrQueue", u"icc.tryFix", None)) self.ocr_addImageButton.setText(QCoreApplication.translate("OcrQueue", u"queue.addImageButton", None)) self.ocr_removeSelectedButton.setText(QCoreApplication.translate("OcrQueue", u"queue.removeSelected", None)) self.ocr_removeAllButton.setText(QCoreApplication.translate("OcrQueue", u"queue.removeAll", None)) + self.optionsDialogButton.setText(QCoreApplication.translate("OcrQueue", u"queue.optionsButton", None)) self.ocr_startButton.setText(QCoreApplication.translate("OcrQueue", u"queue.startOcrButton", None)) self.groupBox_5.setTitle(QCoreApplication.translate("OcrQueue", u"results", None)) self.ocr_acceptSelectedButton.setText(QCoreApplication.translate("OcrQueue", u"results.acceptSelectedButton", None)) @@ -169,4 +148,3 @@ class Ui_OcrQueue(object): self.statusLabel.setText("") pass # retranslateUi - diff --git a/ui/extends/components/ocrQueue.py b/ui/extends/components/ocrQueue.py index efcc404..61c6e6c 100644 --- a/ui/extends/components/ocrQueue.py +++ b/ui/extends/components/ocrQueue.py @@ -150,6 +150,7 @@ class OcrQueueModel(QAbstractListModel): @iccOption.setter def iccOption(self, opt: IccOption): + logger.debug(f"ICC option changed to {opt}") self.__iccOption = opt @overload @@ -344,8 +345,12 @@ class OcrQueueTableProxyModel(QAbstractTableModel): def retranslateHeaders(self): self.__horizontalHeaders = [ # fmt: off - QCoreApplication.translate("OcrTableModel", "horizontalHeader.title.select"), - QCoreApplication.translate("OcrTableModel", "horizontalHeader.title.imagePreview"), + QCoreApplication.translate( + "OcrTableModel", "horizontalHeader.title.select" + ), + QCoreApplication.translate( + "OcrTableModel", "horizontalHeader.title.imagePreview" + ), QCoreApplication.translate("OcrTableModel", "horizontalHeader.title.chart"), QCoreApplication.translate("OcrTableModel", "horizontalHeader.title.score"), # fmt: on diff --git a/ui/extends/shared/settings.py b/ui/extends/shared/settings.py index 9316fdb..8c645de 100644 --- a/ui/extends/shared/settings.py +++ b/ui/extends/shared/settings.py @@ -10,6 +10,7 @@ __all__ = [ "KNN_MODEL_FILE", "B30_KNN_MODEL_FILE", "PHASH_DATABASE_FILE", + "SCORE_DATE_SOURCE", "ANDREAL_FOLDER", "ANDREAL_EXECUTABLE", "Settings", @@ -23,6 +24,7 @@ DATABASE_URL = "DatabaseUrl" KNN_MODEL_FILE = "Ocr/KnnModelFile" B30_KNN_MODEL_FILE = "Ocr/B30KnnModelFile" PHASH_DATABASE_FILE = "Ocr/PHashDatabaseFile" +SCORE_DATE_SOURCE = "Ocr/DateSource" ANDREAL_FOLDER = "Andreal/AndrealFolder" ANDREAL_EXECUTABLE = "Andreal/AndrealExecutable" @@ -92,6 +94,15 @@ class Settings(QSettings, metaclass=QObjectSingleton): def resetPHashDatabaseFile(self): self._resetStrItem(PHASH_DATABASE_FILE) + def scoreDateSource(self): + return self._strItem(SCORE_DATE_SOURCE) + + def setScoreDateSource(self, value: str): + self._setStrItem(SCORE_DATE_SOURCE, value) + + def resetScoreDateSource(self): + self._resetStrItem(SCORE_DATE_SOURCE) + def andrealFolder(self): return self._strItem(ANDREAL_FOLDER) diff --git a/ui/extends/tabs/tabOcr/tabOcr_Device.py b/ui/extends/tabs/tabOcr/tabOcr_Device.py index a1ec4dc..1287fab 100644 --- a/ui/extends/tabs/tabOcr/tabOcr_Device.py +++ b/ui/extends/tabs/tabOcr/tabOcr_Device.py @@ -21,6 +21,7 @@ from PySide6.QtCore import QDateTime, QFileInfo from ui.extends.components.ocrQueue import OcrRunnable from ui.extends.shared.data import Data +from ui.extends.shared.settings import Settings logger = logging.getLogger(__name__) @@ -67,8 +68,14 @@ def getImageDate(imagePath: str) -> QDateTime: if exifImage.has_exif and exifImage.get("datetime_original"): datetimeStr = exifImage.get("datetime_original") datetime = QDateTime.fromString(datetimeStr, "yyyy:MM:dd hh:mm:ss") + if not isinstance(datetime, QDateTime): - datetime = QFileInfo(imagePath).birthTime() + dateSource = Settings().scoreDateSource() + if dateSource == "lastModified": + datetime = QFileInfo(imagePath).lastModified() + else: + datetime = QFileInfo(imagePath).birthTime() + return datetime diff --git a/ui/implements/components/ocrQueue.py b/ui/implements/components/ocrQueue.py index d917afd..e14ed44 100644 --- a/ui/implements/components/ocrQueue.py +++ b/ui/implements/components/ocrQueue.py @@ -2,7 +2,7 @@ from typing import Optional from PySide6.QtCore import Qt, QTimer, Slot from PySide6.QtGui import QColor, QPalette -from PySide6.QtWidgets import QButtonGroup, QWidget +from PySide6.QtWidgets import QWidget from ui.designer.components.ocrQueue_ui import Ui_OcrQueue from ui.extends.components.ocrQueue import ( @@ -13,6 +13,7 @@ from ui.extends.components.ocrQueue import ( OcrScoreDelegate, ) from ui.extends.shared.language import LanguageChangeEventFilter +from ui.implements.components.ocrQueueOptionsDialog import OcrQueueOptionsDialog class OcrQueue(Ui_OcrQueue, QWidget): @@ -26,6 +27,9 @@ class OcrQueue(Ui_OcrQueue, QWidget): self.__model: Optional[OcrQueueModel] = None self.__tableProxyModel: Optional[OcrQueueTableProxyModel] = None + self.optionsDialog = OcrQueueOptionsDialog(self) + self.optionsDialog.iccOptionsChanged.connect(self.setIccOption) + self.__firstResizeDone = False self.resizeTimer = QTimer(self) self.resizeTimer.timeout.connect(self.tableView.resizeRowsToContents) @@ -41,13 +45,6 @@ class OcrQueue(Ui_OcrQueue, QWidget): tableViewPalette.setColor(QPalette.ColorRole.Highlight, highlightColor) self.tableView.setPalette(tableViewPalette) - self.iccOptionButtonGroup = QButtonGroup(self) - self.iccOptionButtonGroup.buttonToggled.connect(self.updateIccOption) - self.iccOptionButtonGroup.addButton(self.iccUseQtRadioButton, 0) - self.iccOptionButtonGroup.addButton(self.iccUsePILRadioButton, 1) - self.iccOptionButtonGroup.addButton(self.iccTryFixRadioButton, 2) - self.updateIccOption() - self.statusLabelClearTimer = QTimer(self) self.statusLabelClearTimer.setSingleShot(True) self.statusLabelClearTimer.timeout.connect(self.clearStatusMessage) @@ -93,9 +90,10 @@ class OcrQueue(Ui_OcrQueue, QWidget): self.ocr_acceptAllButton.setEnabled(__bool) self.ocr_ignoreValidateCheckBox.setEnabled(__bool) - def updateIccOption(self): + @Slot(int) + def setIccOption(self, option): if self.model(): - self.model().iccOption = self.iccOptionButtonGroup.checkedId() + self.model().iccOption = option def showStatusMessage(self, message: str): self.statusLabel.setText(message) @@ -131,6 +129,10 @@ class OcrQueue(Ui_OcrQueue, QWidget): def modelReseted(self): self.progressBar.setMaximum(0) + @Slot() + def on_optionsDialogButton_clicked(self): + self.optionsDialog.exec() + @Slot() def on_ocr_removeSelectedButton_clicked(self): if self.model(): diff --git a/ui/implements/components/ocrQueueOptionsDialog.py b/ui/implements/components/ocrQueueOptionsDialog.py new file mode 100644 index 0000000..dcb1b6a --- /dev/null +++ b/ui/implements/components/ocrQueueOptionsDialog.py @@ -0,0 +1,48 @@ +from PySide6.QtCore import Signal +from PySide6.QtWidgets import QButtonGroup, QDialog + +from ui.designer.components.ocrQueueOptionsDialog_ui import Ui_OcrQueueOptionsDialog +from ui.extends.shared.settings import Settings + + +class OcrQueueOptionsDialog(QDialog, Ui_OcrQueueOptionsDialog): + iccOptionsChanged = Signal(int) + + def __init__(self, parent=None): + super(OcrQueueOptionsDialog, self).__init__(parent) + self.setupUi(self) + + self.iccOptionButtonGroup = QButtonGroup(self) + self.iccOptionButtonGroup.buttonToggled.connect( + lambda: self.iccOptionsChanged.emit(self.iccOptionButtonGroup.checkedId()) + ) + self.iccOptionButtonGroup.addButton(self.iccUseQtRadioButton, 0) + self.iccOptionButtonGroup.addButton(self.iccUsePILRadioButton, 1) + self.iccOptionButtonGroup.addButton(self.iccTryFixRadioButton, 2) + + self.scoreDateSourceButtonGroup = QButtonGroup(self) + self.scoreDateSourceButtonGroup.addButton( + self.dateUseCreationDateRadioButton, 0 + ) + self.scoreDateSourceButtonGroup.addButton(self.dateUseModifyDateRadioButton, 1) + self.scoreDateSourceButtonGroup.buttonClicked.connect( + self.on_scoreDateSourceButtonGroup_buttonClicked + ) + + self.settings = Settings() + self.settings.updated.connect(self.syncCheckboxesFromSettings) + self.syncCheckboxesFromSettings() + + def syncCheckboxesFromSettings(self): + scoreDateSource = self.settings.scoreDateSource() + if scoreDateSource == "lastModified": + self.dateUseModifyDateRadioButton.setChecked(True) + else: + self.dateUseCreationDateRadioButton.setChecked(True) + + def on_scoreDateSourceButtonGroup_buttonClicked(self, button): + buttonId = self.scoreDateSourceButtonGroup.id(button) + if buttonId == 1: + self.settings.setScoreDateSource("lastModified") + else: + self.settings.setScoreDateSource("birthTime") diff --git a/ui/resources/lang/en_US.ts b/ui/resources/lang/en_US.ts index 0840599..d44cdd9 100644 --- a/ui/resources/lang/en_US.ts +++ b/ui/resources/lang/en_US.ts @@ -70,12 +70,12 @@ Continue - + dialog.tryInitExistingDatabase The existing database doesn't seem to be initialized properly, try initialize again? - + dialog.confirmNewDatabase Database file does not exist. Create now? @@ -224,85 +224,118 @@ - iccOptionsGroupBox - ICC Profile Options - - - - icc.useQt - Use Qt - - - - icc.usePIL - Use PIL - - - - icc.tryFix - Try fix - - - queue.addImageButton Add Image - + queue.removeSelected Remove Selected - + queue.removeAll Remove All - + + queue.optionsButton + Options + + + queue.startOcrButton Start OCR - + results Results - + results.acceptSelectedButton Accept Selected - + results.acceptAllButton Accept All - + results.ignoreValidate Ignore validation + + OcrQueueOptionsDialog + + + OCR Options + OCR Options + + + + iccOptionsGroupBox + ICC Profile Options + + + + icc.useQt + Use Qt + + + + icc.usePIL + Use PIL + + + + icc.tryFix + Try fix + + + + dateOptionsGroupBox + Date Source + + + + date.readFromExif + Read from image EXIF + + + + date.useCreationDate + File creation time + + + + date.useModifyDate + File last modification time + + OcrTableModel - + horizontalHeader.title.select Select - + horizontalHeader.title.imagePreview Image Preview - + horizontalHeader.title.chart Chart - + horizontalHeader.title.score Score diff --git a/ui/resources/lang/zh_CN.ts b/ui/resources/lang/zh_CN.ts index cfc4ad9..ef9df92 100644 --- a/ui/resources/lang/zh_CN.ts +++ b/ui/resources/lang/zh_CN.ts @@ -70,12 +70,12 @@ 继续 - + dialog.tryInitExistingDatabase 现有的数据库似乎没有正确初始化,是否尝试再次初始化? - + dialog.confirmNewDatabase 数据库文件不存在,是否创建? @@ -224,84 +224,117 @@ - iccOptionsGroupBox - ICC 文件选项 - - - - icc.useQt - 使用 Qt - - - - icc.usePIL - 使用 PIL - - - - icc.tryFix - 尝试修复 - - - queue.addImageButton 添加图像文件 - + queue.removeSelected 移除选中 - + queue.removeAll 移除所有 - + + queue.optionsButton + 选项 + + + queue.startOcrButton 开始 OCR - + results 结果 - + results.acceptSelectedButton 提交选中 - + results.acceptAllButton 提交所有 - + results.ignoreValidate 忽略验证 + + OcrQueueOptionsDialog + + + OCR Options + OCR 选项 + + + + iccOptionsGroupBox + ICC 文件选项 + + + + icc.useQt + 使用 Qt + + + + icc.usePIL + 使用 PIL + + + + icc.tryFix + 尝试修复 + + + + dateOptionsGroupBox + 日期来源 + + + + date.readFromExif + 从 EXIF 读取 + + + + date.useCreationDate + 文件创建时间 + + + + date.useModifyDate + 文件最后修改时间 + + OcrTableModel - + horizontalHeader.title.select 选择 - + horizontalHeader.title.imagePreview 图像预览 - + horizontalHeader.title.chart 谱面 - + horizontalHeader.title.score 分数