Kaynağa Gözat

Add: Tooltip help.

Satoshi Yoneda 4 hafta önce
ebeveyn
işleme
e3ca89d3ec

+ 1 - 1
CMakeLists.txt

@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 3.21)
-project(DupFind VERSION 0.3.3 LANGUAGES CXX)
+project(DupFind VERSION 0.3.4 LANGUAGES CXX)
 
 set(CMAKE_CXX_STANDARD 20)
 set(CMAKE_CXX_STANDARD_REQUIRED ON)

+ 224 - 6
RESOURCE

@@ -1,6 +1,224 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Run the update_translations CMake target to populate the source strings in this file.
--->
-<!DOCTYPE TS>
-<TS version="2.1"/>
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+    <name>MainWindow</name>
+    <message>
+        <location filename="src/MainWindow.cpp" line="112"/>
+        <source>Add Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="113"/>
+        <source>スキャン対象のディレクトリを追加します</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="114"/>
+        <source>Remove Selected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="115"/>
+        <source>選択したディレクトリをリストから除外します</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="116"/>
+        <source>Start Scan</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="117"/>
+        <source>登録したディレクトリをスキャンし、類似/重複画像グループを検出します</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="118"/>
+        <source>Delete Selected Duplicates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="126"/>
+        <source>Threshold:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="131"/>
+        <source>類似度のしきい値を設定します。値が小さいほど厳密になります</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="136"/>
+        <source>Strict</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="138"/>
+        <source>Strictモード: pHashとdHashの両方で一致判定します</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="143"/>
+        <source>Clear Results</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="144"/>
+        <source>検索結果の表示をクリアします</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="147"/>
+        <source>Deselect All</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="148"/>
+        <source>すべてのサムネイルのチェックを外します</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="171"/>
+        <source>Filter results by path or filename... (Press Esc to close)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="303"/>
+        <source>Downloading image...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="367"/>
+        <source>Select Directory to Scan</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="391"/>
+        <source>No Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="392"/>
+        <source>Please add at least one directory to scan.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="538"/>
+        <source>Searching duplicates... %p%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="628"/>
+        <source>Copy Full Path(&amp;C)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="629"/>
+        <source>Copy Image(&amp;I)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="631"/>
+        <source>Open URL(&amp;O)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="631"/>
+        <source>Open File Location(&amp;O)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="633"/>
+        <source>Remove from List(&amp;R)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="724"/>
+        <source>Warning: All images selected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="725"/>
+        <source>一部の類似画像グループで、すべての画像が削除対象としてチェックされています。
+このまま削除すると、それらの画像ファイルはすべて失われます。
+
+本当に削除を実行しますか?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="737"/>
+        <source>Confirm Deletion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="738"/>
+        <source>Are you sure you want to move %1 images to Trash?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="755"/>
+        <source>The following files could not be moved to trash and were NOT deleted:
+
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="760"/>
+        <source>Deletion Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="781"/>
+        <source>Download Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="782"/>
+        <source>Failed to download image: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="794"/>
+        <source>Invalid Image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="795"/>
+        <source>The dropped URL does not contain a valid image.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ResultItemDelegate</name>
+    <message>
+        <location filename="src/ResultItemDelegate.cpp" line="75"/>
+        <source>Loading...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/ResultItemDelegate.cpp" line="91"/>
+        <source>Delete candidate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/ResultItemDelegate.cpp" line="218"/>
+        <source>チェックで削除対象に。[Ctrl]+Fで絞り込みが可能</source>
+        <oldsource>チェックで削除対象に。グループ内でも任意に選択可能</oldsource>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ResultListModel</name>
+    <message>
+        <location filename="src/ResultListModel.cpp" line="43"/>
+        <source>No similar images found.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/ResultListModel.cpp" line="67"/>
+        <source>Duplicate Group - %1 images</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>

+ 4 - 3
debian/changelog

@@ -1,5 +1,6 @@
-dupfind (0.3.3-1) unstable; urgency=low
+dupfind (0.3.4-1) unstable; urgency=low
 
-  * Add filter bar to search.
+  * Add Copy Image.
+  * Add Tooltip help.
 
- -- Satoyon <yoneda@gadget.mda.or.jp>  Mon, 18 May 2026 10:00:00 +0900
+ -- Satoyon <yoneda@gadget.mda.or.jp>  Fri, 22 May 2026 16:00:00 +0900

+ 224 - 6
i18n

@@ -1,6 +1,224 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Run the update_translations CMake target to populate the source strings in this file.
--->
-<!DOCTYPE TS>
-<TS version="2.1"/>
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+    <name>MainWindow</name>
+    <message>
+        <location filename="src/MainWindow.cpp" line="112"/>
+        <source>Add Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="113"/>
+        <source>スキャン対象のディレクトリを追加します</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="114"/>
+        <source>Remove Selected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="115"/>
+        <source>選択したディレクトリをリストから除外します</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="116"/>
+        <source>Start Scan</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="117"/>
+        <source>登録したディレクトリをスキャンし、類似/重複画像グループを検出します</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="118"/>
+        <source>Delete Selected Duplicates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="126"/>
+        <source>Threshold:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="131"/>
+        <source>類似度のしきい値を設定します。値が小さいほど厳密になります</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="136"/>
+        <source>Strict</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="138"/>
+        <source>Strictモード: pHashとdHashの両方で一致判定します</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="143"/>
+        <source>Clear Results</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="144"/>
+        <source>検索結果の表示をクリアします</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="147"/>
+        <source>Deselect All</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="148"/>
+        <source>すべてのサムネイルのチェックを外します</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="171"/>
+        <source>Filter results by path or filename... (Press Esc to close)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="303"/>
+        <source>Downloading image...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="367"/>
+        <source>Select Directory to Scan</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="391"/>
+        <source>No Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="392"/>
+        <source>Please add at least one directory to scan.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="538"/>
+        <source>Searching duplicates... %p%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="628"/>
+        <source>Copy Full Path(&amp;C)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="629"/>
+        <source>Copy Image(&amp;I)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="631"/>
+        <source>Open URL(&amp;O)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="631"/>
+        <source>Open File Location(&amp;O)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="633"/>
+        <source>Remove from List(&amp;R)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="724"/>
+        <source>Warning: All images selected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="725"/>
+        <source>一部の類似画像グループで、すべての画像が削除対象としてチェックされています。
+このまま削除すると、それらの画像ファイルはすべて失われます。
+
+本当に削除を実行しますか?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="737"/>
+        <source>Confirm Deletion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="738"/>
+        <source>Are you sure you want to move %1 images to Trash?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="755"/>
+        <source>The following files could not be moved to trash and were NOT deleted:
+
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="760"/>
+        <source>Deletion Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="781"/>
+        <source>Download Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="782"/>
+        <source>Failed to download image: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="794"/>
+        <source>Invalid Image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/MainWindow.cpp" line="795"/>
+        <source>The dropped URL does not contain a valid image.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ResultItemDelegate</name>
+    <message>
+        <location filename="src/ResultItemDelegate.cpp" line="75"/>
+        <source>Loading...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/ResultItemDelegate.cpp" line="91"/>
+        <source>Delete candidate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/ResultItemDelegate.cpp" line="218"/>
+        <source>チェックで削除対象に。[Ctrl]+Fで絞り込みが可能</source>
+        <oldsource>チェックで削除対象に。グループ内でも任意に選択可能</oldsource>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ResultListModel</name>
+    <message>
+        <location filename="src/ResultListModel.cpp" line="43"/>
+        <source>No similar images found.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="src/ResultListModel.cpp" line="67"/>
+        <source>Duplicate Group - %1 images</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>

+ 18 - 16
include/MainWindow.hpp

@@ -52,22 +52,24 @@ private slots:
   void onUrlDownloadFinished(QNetworkReply *reply);
 
 private:
-  // 内部処理・初期化メソッド
-  void setupUi();      // UIのレイアウトと初期化
-  void loadSettings(); // INIファイルからの設定値復元
-  void saveSettings(); // INIファイルへの設定値保存
-  void updateResultGrid(
-      const std::vector<DuplicateGroup> &groups,
-      bool preserveState = false); // 結果グリッドへサムネイルを並べる
-  std::vector<ImageData>
-  getFilteredImages(); // 現在リストにあるディレクトリの画像のみ抽出
-  bool
-  eventFilter(QObject *obj,
-              QEvent *event) override; // 右クリックメニュー等のイベントフィルタ
-  void
-  closeEvent(QCloseEvent *event) override; // ウィンドウ終了時の保存処理など
-  void dropEvent(QDropEvent *e) override;  // ドロップを受け付ける
-  void dragEnterEvent(QDragEnterEvent *event) override; // ドロップを受け付ける
+   // 内部処理・初期化メソッド
+   void setupUi();      // UIのレイアウトと初期化
+   void loadSettings(); // INIファイルからの設定値復元
+   void saveSettings(); // INIファイルへの設定値保存
+   void updateResultGrid(
+       const std::vector<DuplicateGroup> &groups,
+       bool preserveState = false); // 結果グリッドへサムネイルを並べる
+   std::vector<ImageData>
+   getFilteredImages(); // 現在リストにあるディレクトリの画像のみ抽出
+   bool
+   eventFilter(QObject *obj,
+               QEvent *event) override; // 右クリックメニュー等のイベントフィルタ
+   void
+   closeEvent(QCloseEvent *event) override; // ウィンドウ終了時の保存処理など
+   void dropEvent(QDropEvent *e) override;  // ドロップを受け付ける
+   void dragEnterEvent(QDragEnterEvent *event) override; // ドロップを受け付ける
+
+
 
   // データベースマネージャーのインスタンス
   std::unique_ptr<DatabaseManager> m_dbManager;

+ 16 - 1
src/MainWindow.cpp

@@ -7,9 +7,12 @@
 #include <QFileDialog>
 #include <QFileInfo>
 #include <QHBoxLayout>
+#include <QHoverEvent>
 #include <QMessageBox>
 #include <QNetworkRequest>
+#include <QPainter>
 #include <QPixmap>
+#include <QToolTip>
 #include <QUrl>
 #include <QVBoxLayout>
 #include <chrono>
@@ -24,11 +27,13 @@
 #include <QDebug>
 #include <QDesktopServices>
 #include <QImageReader>
+#include <QLabel>
 #include <QMenu>
 #include <QMimeData>
 #include <QPointer>
 #include <QSettings>
 #include <QStandardPaths>
+#include <QToolButton>
 #include <QUrl>
 #include <QtConcurrent>
 
@@ -105,8 +110,11 @@ void MainWindow::setupUi() {
   // Toolbar-like top section
   auto *toolLayout = new QHBoxLayout();
   m_addDirBtn = new QPushButton(tr("Add Directory"));
+  m_addDirBtn->setToolTip(tr("スキャン対象のディレクトリを追加します"));
   m_removeDirBtn = new QPushButton(tr("Remove Selected"));
+  m_removeDirBtn->setToolTip(tr("選択したディレクトリをリストから除外します"));
   m_startScanBtn = new QPushButton(tr("Start Scan"));
+  m_startScanBtn->setToolTip(tr("登録したディレクトリをスキャンし、類似/重複画像グループを検出します"));
   m_deleteBtn = new QPushButton(tr("Delete Selected Duplicates"));
   m_deleteBtn->setObjectName("deleteBtn"); // QSS で赤くするため
 
@@ -115,24 +123,29 @@ void MainWindow::setupUi() {
   toolLayout->addStretch();
 
   // Slider section
-  toolLayout->addWidget(new QLabel(tr("Similarity Threshold:")));
+  toolLayout->addWidget(new QLabel(tr("Threshold:")));
   m_thresholdSlider = new QSlider(Qt::Horizontal);
   m_thresholdSlider->setRange(0, 32);
   m_thresholdSlider->setValue(m_currentThreshold);
   m_thresholdSlider->setFixedWidth(150);
+  m_thresholdSlider->setToolTip(tr("類似度のしきい値を設定します。値が小さいほど厳密になります"));
   m_thresholdLabel = new QLabel(QString::number(m_currentThreshold));
   toolLayout->addWidget(m_thresholdSlider);
   toolLayout->addWidget(m_thresholdLabel);
 
   m_strictCheckBox = new QCheckBox(tr("Strict"));
   m_strictCheckBox->setChecked(m_strictMode);
+  m_strictCheckBox->setToolTip(tr("Strictモード: pHashとdHashの両方で一致判定します"));
   toolLayout->addWidget(m_strictCheckBox);
 
   toolLayout->addWidget(m_startScanBtn);
+
   m_clearBtn = new QPushButton(tr("Clear Results"));
+  m_clearBtn->setToolTip(tr("検索結果の表示をクリアします"));
   toolLayout->addWidget(m_clearBtn);
 
   m_deselectBtn = new QPushButton(tr("Deselect All"));
+  m_deselectBtn->setToolTip(tr("すべてのサムネイルのチェックを外します"));
   toolLayout->addWidget(m_deselectBtn);
 
   toolLayout->addWidget(m_deleteBtn);
@@ -818,3 +831,5 @@ void MainWindow::onUrlDownloadFinished(QNetworkReply *reply) {
 
   updateResultGrid(results);
 }
+
+

+ 19 - 9
src/ResultItemDelegate.cpp

@@ -80,7 +80,7 @@ void ResultItemDelegate::paint(QPainter *painter,
         painter->drawPixmap(topLeft, pix);
       }
 
-      // Checkbox
+     // Checkbox
       QRect cbRect(cardRect.x() + 5, thumbRect.bottom() + 5, cardWidth - 10,
                    20);
       bool isLocal = !QString::fromStdString(imgData.path).startsWith("http");
@@ -97,6 +97,8 @@ void ResultItemDelegate::paint(QPainter *painter,
           cbOpt.state |= QStyle::State_Off;
         }
         QApplication::style()->drawControl(QStyle::CE_CheckBox, &cbOpt, painter);
+
+
       }
 
       // Info text
@@ -211,15 +213,23 @@ bool ResultItemDelegate::helpEvent(QHelpEvent *event, QAbstractItemView *view,
       return false;
 
     const auto &item = listModel->getItem(sourceIndex.row());
-    if (item.type != ResultListItem::ImageRow)
-      return false;
+    if (item.type == ResultListItem::Header) {
+      QToolTip::showText(event->globalPos(),
+                         tr("チェックで削除対象に。[Ctrl]+Fで絞り込みが可能"), view);
+      return true;
+    }
 
-    int cardWidth = option.rect.width() / 4;
-    for (int i = 0; i < static_cast<int>(item.images.size()); ++i) {
-      const auto &imgData = item.images[i];
-      QRect cardRect(option.rect.x() + i * cardWidth, option.rect.y(),
-                     cardWidth, option.rect.height());
-      if (cardRect.contains(event->pos())) {
+    if (item.type == ResultListItem::ImageRow) {
+      int cardWidth = option.rect.width() / 4;
+      for (int i = 0; i < static_cast<int>(item.images.size()); ++i) {
+        const auto &imgData = item.images[i];
+        QRect cardRect(option.rect.x() + i * cardWidth, option.rect.y(),
+                       cardWidth, option.rect.height());
+
+        if (!cardRect.contains(event->pos()))
+          continue;
+
+        // Filename tooltip
         QFileInfo fileInfo(QString::fromStdString(imgData.path));
         QString toolTip = fileInfo.fileName();
         QToolTip::showText(event->globalPos(), toolTip, view, cardRect);

+ 86 - 1
translations/dupfind_de.ts

@@ -4,78 +4,141 @@
 <context>
     <name>MainWindow</name>
     <message>
+        <location filename="../src/MainWindow.cpp" line="112"/>
         <source>Add Directory</source>
         <translation>Verzeichnis hinzufügen</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="114"/>
         <source>Remove Selected</source>
         <translation>Ausgewählte entfernen</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="116"/>
         <source>Start Scan</source>
         <translation>Scan starten</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="118"/>
         <source>Delete Selected Duplicates</source>
         <translation>Ausgewählte Duplikate löschen</translation>
     </message>
     <message>
         <source>Similarity Threshold:</source>
-        <translation>Ähnlichkeitsschwellenwert:</translation>
+        <translation type="vanished">Ähnlichkeitsschwellenwert:</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="136"/>
         <source>Strict</source>
         <translation>Strenger Modus</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="143"/>
         <source>Clear Results</source>
         <translation>Ergebnisse löschen</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="147"/>
         <source>Deselect All</source>
         <translation>Alle abwählen</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="171"/>
         <source>Filter results by path or filename... (Press Esc to close)</source>
         <translation>Ergebnisse nach Pfad oder Dateiname filtern... (Esc zum Schließen)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="367"/>
         <source>Select Directory to Scan</source>
         <translation>Verzeichnis zum Scannen auswählen</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="391"/>
         <source>No Directory</source>
         <translation>Kein Verzeichnis</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="392"/>
         <source>Please add at least one directory to scan.</source>
         <translation>Bitte fügen Sie mindestens ein Verzeichnis zum Scannen hinzu.</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="538"/>
         <source>Searching duplicates... %p%</source>
         <translation>Suche nach Duplikaten... %p%</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="628"/>
         <source>Copy Full Path(&amp;C)</source>
         <translation>Vollständigen Pfad kopieren(&amp;C)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="629"/>
         <source>Copy Image(&amp;I)</source>
         <translation>Bild kopieren(&amp;I)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="633"/>
         <source>Remove from List(&amp;R)</source>
         <translation>Aus Liste entfernen(&amp;R)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
         <source>Open File Location(&amp;O)</source>
         <translation>Dateipfad öffnen(&amp;O)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="113"/>
+        <source>スキャン対象のディレクトリを追加します</source>
+        <translation>Add a directory to the scan list.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="115"/>
+        <source>選択したディレクトリをリストから除外します</source>
+        <translation>Remove the selected directory from the list.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="117"/>
+        <source>登録したディレクトリをスキャンし、類似/重複画像グループを検出します</source>
+        <translation>Scan registered directories to find similar or duplicate images.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="126"/>
+        <source>Threshold:</source>
+        <translation>Threshold:</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="131"/>
+        <source>類似度のしきい値を設定します。値が小さいほど厳密になります</source>
+        <translation>Set the similarity threshold. Lower values are stricter.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="138"/>
+        <source>Strictモード: pHashとdHashの両方で一致判定します</source>
+        <translation>Strict mode: matches using both pHash and dHash.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="144"/>
+        <source>検索結果の表示をクリアします</source>
+        <translation>Clear the displayed search results.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="148"/>
+        <source>すべてのサムネイルのチェックを外します</source>
+        <translation>Deselect all thumbnails.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
+        <source>Open URL(&amp;O)</source>
+        <translation>Open URL(&amp;O)</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="724"/>
         <source>Warning: All images selected</source>
         <translation>Warnung: Alle Bilder ausgewählt</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="725"/>
         <source>一部の類似画像グループで、すべての画像が削除対象としてチェックされています。
 このまま削除すると、それらの画像ファイルはすべて失われます。
 
@@ -86,14 +149,17 @@ Wenn Sie fortfahren, gehen all diese Bilddateien verloren.
 Sind Sie sicher, dass Sie den Löschvorgang ausführen möchten?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="737"/>
         <source>Confirm Deletion</source>
         <translation>Löschen bestätigen</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="738"/>
         <source>Are you sure you want to move %1 images to Trash?</source>
         <translation>Sind Sie sicher, dass Sie %1 Bilder in den Papierkorb verschieben möchten?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="755"/>
         <source>The following files could not be moved to trash and were NOT deleted:
 
 </source>
@@ -102,26 +168,32 @@ Sind Sie sicher, dass Sie den Löschvorgang ausführen möchten?</translation>
 </translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="760"/>
         <source>Deletion Error</source>
         <translation>Fehler beim Löschen</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="303"/>
         <source>Downloading image...</source>
         <translation>Bild wird heruntergeladen...</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="781"/>
         <source>Download Error</source>
         <translation>Download-Fehler</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="782"/>
         <source>Failed to download image: %1</source>
         <translation>Bild konnte nicht heruntergeladen werden: %1</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="794"/>
         <source>Invalid Image</source>
         <translation>Ungültiges Bild</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="795"/>
         <source>The dropped URL does not contain a valid image.</source>
         <translation>Die ablegte URL enthält kein gültiges Bild.</translation>
     </message>
@@ -129,21 +201,34 @@ Sind Sie sicher, dass Sie den Löschvorgang ausführen möchten?</translation>
 <context>
     <name>ResultItemDelegate</name>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="75"/>
         <source>Loading...</source>
         <translation>Laden...</translation>
     </message>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="91"/>
         <source>Delete candidate</source>
         <translation>Löschkandidat</translation>
     </message>
+    <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="218"/>
+        <source>チェックで削除対象に。[Ctrl]+Fで絞り込みが可能</source>
+        <translation>Check to select for deletion. Press [Ctrl]+F to filter results.</translation>
+    </message>
+    <message>
+        <source>チェックで削除対象に。グループ内でも任意に選択可能</source>
+        <translation type="vanished">Check to select for deletion. Multiple selections are allowed within a group.</translation>
+    </message>
 </context>
 <context>
     <name>ResultListModel</name>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="67"/>
         <source>Duplicate Group - %1 images</source>
         <translation>Duplikatgruppe - %1 Bilder</translation>
     </message>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="43"/>
         <source>No similar images found.</source>
         <translation>Keine ähnlichen Bilder gefunden.</translation>
     </message>

+ 86 - 1
translations/dupfind_en.ts

@@ -4,78 +4,141 @@
 <context>
     <name>MainWindow</name>
     <message>
+        <location filename="../src/MainWindow.cpp" line="112"/>
         <source>Add Directory</source>
         <translation>Add Directory</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="114"/>
         <source>Remove Selected</source>
         <translation>Remove Selected</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="116"/>
         <source>Start Scan</source>
         <translation>Start Scan</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="118"/>
         <source>Delete Selected Duplicates</source>
         <translation>Delete Selected Duplicates</translation>
     </message>
     <message>
         <source>Similarity Threshold:</source>
-        <translation>Similarity Threshold:</translation>
+        <translation type="vanished">Similarity Threshold:</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="136"/>
         <source>Strict</source>
         <translation>Strict</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="143"/>
         <source>Clear Results</source>
         <translation>Clear Results</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="147"/>
         <source>Deselect All</source>
         <translation>Deselect All</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="171"/>
         <source>Filter results by path or filename... (Press Esc to close)</source>
         <translation>Filter results by path or filename... (Press Esc to close)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="367"/>
         <source>Select Directory to Scan</source>
         <translation>Select Directory to Scan</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="391"/>
         <source>No Directory</source>
         <translation>No Directory</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="392"/>
         <source>Please add at least one directory to scan.</source>
         <translation>Please add at least one directory to scan.</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="538"/>
         <source>Searching duplicates... %p%</source>
         <translation>Searching duplicates... %p%</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="628"/>
         <source>Copy Full Path(&amp;C)</source>
         <translation>Copy Full Path(&amp;C)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="629"/>
         <source>Copy Image(&amp;I)</source>
         <translation>Copy Image(&amp;I)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="633"/>
         <source>Remove from List(&amp;R)</source>
         <translation>Remove from List(&amp;R)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
         <source>Open File Location(&amp;O)</source>
         <translation>Open File Location(&amp;O)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="113"/>
+        <source>スキャン対象のディレクトリを追加します</source>
+        <translation>Add a directory to the scan list.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="115"/>
+        <source>選択したディレクトリをリストから除外します</source>
+        <translation>Remove the selected directory from the list.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="117"/>
+        <source>登録したディレクトリをスキャンし、類似/重複画像グループを検出します</source>
+        <translation>Scan registered directories to find similar or duplicate images.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="126"/>
+        <source>Threshold:</source>
+        <translation>Threshold:</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="131"/>
+        <source>類似度のしきい値を設定します。値が小さいほど厳密になります</source>
+        <translation>Set the similarity threshold. Lower values are stricter.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="138"/>
+        <source>Strictモード: pHashとdHashの両方で一致判定します</source>
+        <translation>Strict mode: matches using both pHash and dHash.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="144"/>
+        <source>検索結果の表示をクリアします</source>
+        <translation>Clear the displayed search results.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="148"/>
+        <source>すべてのサムネイルのチェックを外します</source>
+        <translation>Deselect all thumbnails.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
+        <source>Open URL(&amp;O)</source>
+        <translation>Open URL(&amp;O)</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="724"/>
         <source>Warning: All images selected</source>
         <translation>Warning: All images selected</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="725"/>
         <source>一部の類似画像グループで、すべての画像が削除対象としてチェックされています。
 このまま削除すると、それらの画像ファイルはすべて失われます。
 
@@ -86,14 +149,17 @@ If you proceed, all those image files will be lost.
 Are you sure you want to execute the deletion?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="737"/>
         <source>Confirm Deletion</source>
         <translation>Confirm Deletion</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="738"/>
         <source>Are you sure you want to move %1 images to Trash?</source>
         <translation>Are you sure you want to move %1 images to Trash?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="755"/>
         <source>The following files could not be moved to trash and were NOT deleted:
 
 </source>
@@ -102,26 +168,32 @@ Are you sure you want to execute the deletion?</translation>
 </translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="760"/>
         <source>Deletion Error</source>
         <translation>Deletion Error</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="303"/>
         <source>Downloading image...</source>
         <translation>Downloading image...</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="781"/>
         <source>Download Error</source>
         <translation>Download Error</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="782"/>
         <source>Failed to download image: %1</source>
         <translation>Failed to download image: %1</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="794"/>
         <source>Invalid Image</source>
         <translation>Invalid Image</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="795"/>
         <source>The dropped URL does not contain a valid image.</source>
         <translation>The dropped URL does not contain a valid image.</translation>
     </message>
@@ -129,21 +201,34 @@ Are you sure you want to execute the deletion?</translation>
 <context>
     <name>ResultItemDelegate</name>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="75"/>
         <source>Loading...</source>
         <translation>Loading...</translation>
     </message>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="91"/>
         <source>Delete candidate</source>
         <translation>Delete candidate</translation>
     </message>
+    <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="218"/>
+        <source>チェックで削除対象に。[Ctrl]+Fで絞り込みが可能</source>
+        <translation>Check to select for deletion. Press [Ctrl]+F to filter results.</translation>
+    </message>
+    <message>
+        <source>チェックで削除対象に。グループ内でも任意に選択可能</source>
+        <translation type="vanished">Check to select for deletion. Multiple selections are allowed within a group.</translation>
+    </message>
 </context>
 <context>
     <name>ResultListModel</name>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="67"/>
         <source>Duplicate Group - %1 images</source>
         <translation>Duplicate Group - %1 images</translation>
     </message>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="43"/>
         <source>No similar images found.</source>
         <translation>No similar images found.</translation>
     </message>

+ 86 - 1
translations/dupfind_es.ts

@@ -4,78 +4,141 @@
 <context>
     <name>MainWindow</name>
     <message>
+        <location filename="../src/MainWindow.cpp" line="112"/>
         <source>Add Directory</source>
         <translation>Añadir directorio</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="114"/>
         <source>Remove Selected</source>
         <translation>Eliminar seleccionados</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="116"/>
         <source>Start Scan</source>
         <translation>Iniciar escaneo</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="118"/>
         <source>Delete Selected Duplicates</source>
         <translation>Eliminar duplicados seleccionados</translation>
     </message>
     <message>
         <source>Similarity Threshold:</source>
-        <translation>Umbral de similitud:</translation>
+        <translation type="vanished">Umbral de similitud:</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="136"/>
         <source>Strict</source>
         <translation>Modo estricto</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="143"/>
         <source>Clear Results</source>
         <translation>Limpiar resultados</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="147"/>
         <source>Deselect All</source>
         <translation>Desmarcar todo</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="171"/>
         <source>Filter results by path or filename... (Press Esc to close)</source>
         <translation>Filtrar resultados por ruta o nombre... (Esc para cerrar)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="367"/>
         <source>Select Directory to Scan</source>
         <translation>Seleccionar directorio para escanear</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="391"/>
         <source>No Directory</source>
         <translation>Sin directorio</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="392"/>
         <source>Please add at least one directory to scan.</source>
         <translation>Por favor, añada al menos un directorio para escanear.</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="538"/>
         <source>Searching duplicates... %p%</source>
         <translation>Buscando duplicados... %p%</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="628"/>
         <source>Copy Full Path(&amp;C)</source>
         <translation>Copiar ruta completa(&amp;C)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="629"/>
         <source>Copy Image(&amp;I)</source>
         <translation>Copiar imagen(&amp;I)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="633"/>
         <source>Remove from List(&amp;R)</source>
         <translation>Eliminar de la lista(&amp;R)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
         <source>Open File Location(&amp;O)</source>
         <translation>Abrir ubicación del archivo(&amp;O)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="113"/>
+        <source>スキャン対象のディレクトリを追加します</source>
+        <translation>Add a directory to the scan list.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="115"/>
+        <source>選択したディレクトリをリストから除外します</source>
+        <translation>Remove the selected directory from the list.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="117"/>
+        <source>登録したディレクトリをスキャンし、類似/重複画像グループを検出します</source>
+        <translation>Scan registered directories to find similar or duplicate images.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="126"/>
+        <source>Threshold:</source>
+        <translation>Threshold:</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="131"/>
+        <source>類似度のしきい値を設定します。値が小さいほど厳密になります</source>
+        <translation>Set the similarity threshold. Lower values are stricter.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="138"/>
+        <source>Strictモード: pHashとdHashの両方で一致判定します</source>
+        <translation>Strict mode: matches using both pHash and dHash.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="144"/>
+        <source>検索結果の表示をクリアします</source>
+        <translation>Clear the displayed search results.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="148"/>
+        <source>すべてのサムネイルのチェックを外します</source>
+        <translation>Deselect all thumbnails.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
+        <source>Open URL(&amp;O)</source>
+        <translation>Open URL(&amp;O)</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="724"/>
         <source>Warning: All images selected</source>
         <translation>Advertencia: Todas las imágenes seleccionadas</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="725"/>
         <source>一部の類似画像グループで、すべての画像が削除対象としてチェックされています。
 このまま削除すると、それらの画像ファイルはすべて失われます。
 
@@ -86,14 +149,17 @@ Si continúa, todos esos archivos de imagen se perderán.
 ¿Está seguro de que desea ejecutar la eliminación?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="737"/>
         <source>Confirm Deletion</source>
         <translation>Confirmar eliminación</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="738"/>
         <source>Are you sure you want to move %1 images to Trash?</source>
         <translation>¿Está seguro de que desea mover %1 imágenes a la papelera?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="755"/>
         <source>The following files could not be moved to trash and were NOT deleted:
 
 </source>
@@ -102,26 +168,32 @@ Si continúa, todos esos archivos de imagen se perderán.
 </translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="760"/>
         <source>Deletion Error</source>
         <translation>Error de eliminación</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="303"/>
         <source>Downloading image...</source>
         <translation>Descargando imagen...</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="781"/>
         <source>Download Error</source>
         <translation>Error de descarga</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="782"/>
         <source>Failed to download image: %1</source>
         <translation>Error al descargar la imagen: %1</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="794"/>
         <source>Invalid Image</source>
         <translation>Imagen no válida</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="795"/>
         <source>The dropped URL does not contain a valid image.</source>
         <translation>La URL soltada no contiene una imagen válida.</translation>
     </message>
@@ -129,21 +201,34 @@ Si continúa, todos esos archivos de imagen se perderán.
 <context>
     <name>ResultItemDelegate</name>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="75"/>
         <source>Loading...</source>
         <translation>Cargando...</translation>
     </message>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="91"/>
         <source>Delete candidate</source>
         <translation>Candidato para eliminar</translation>
     </message>
+    <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="218"/>
+        <source>チェックで削除対象に。[Ctrl]+Fで絞り込みが可能</source>
+        <translation>Check to select for deletion. Press [Ctrl]+F to filter results.</translation>
+    </message>
+    <message>
+        <source>チェックで削除対象に。グループ内でも任意に選択可能</source>
+        <translation type="vanished">Check to select for deletion. Multiple selections are allowed within a group.</translation>
+    </message>
 </context>
 <context>
     <name>ResultListModel</name>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="67"/>
         <source>Duplicate Group - %1 images</source>
         <translation>Grupo de duplicados - %1 imágenes</translation>
     </message>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="43"/>
         <source>No similar images found.</source>
         <translation>No se encontraron imágenes similares.</translation>
     </message>

+ 86 - 1
translations/dupfind_ja.ts

@@ -4,78 +4,141 @@
 <context>
     <name>MainWindow</name>
     <message>
+        <location filename="../src/MainWindow.cpp" line="112"/>
         <source>Add Directory</source>
         <translation>ディレクトリを追加</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="114"/>
         <source>Remove Selected</source>
         <translation>選択を除外</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="116"/>
         <source>Start Scan</source>
         <translation>スキャン開始</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="118"/>
         <source>Delete Selected Duplicates</source>
         <translation>選択した重複ファイルを削除</translation>
     </message>
     <message>
         <source>Similarity Threshold:</source>
-        <translation>類似度しきい値:</translation>
+        <translation type="vanished">類似度しきい値:</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="136"/>
         <source>Strict</source>
         <translation>厳格モード</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="143"/>
         <source>Clear Results</source>
         <translation>結果をクリア</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="147"/>
         <source>Deselect All</source>
         <translation>すべての選択を解除</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="171"/>
         <source>Filter results by path or filename... (Press Esc to close)</source>
         <translation>パスまたはファイル名で結果をフィルタリング... (Escで閉じる)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="367"/>
         <source>Select Directory to Scan</source>
         <translation>スキャンするディレクトリを選択</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="391"/>
         <source>No Directory</source>
         <translation>ディレクトリ未設定</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="392"/>
         <source>Please add at least one directory to scan.</source>
         <translation>スキャンするディレクトリを少なくとも1つ追加してください。</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="538"/>
         <source>Searching duplicates... %p%</source>
         <translation>重複ファイルを検索中... %p%</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="628"/>
         <source>Copy Full Path(&amp;C)</source>
         <translation>フルパスをコピー(&amp;C)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="629"/>
         <source>Copy Image(&amp;I)</source>
         <translation>画像をコピー(&amp;I)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="633"/>
         <source>Remove from List(&amp;R)</source>
         <translation>リストから除外(&amp;R)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
         <source>Open File Location(&amp;O)</source>
         <translation>ファイルの場所を開く(&amp;O)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="113"/>
+        <source>スキャン対象のディレクトリを追加します</source>
+        <translation>スキャン対象のディレクトリを追加します</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="115"/>
+        <source>選択したディレクトリをリストから除外します</source>
+        <translation>選択したディレクトリをリストから除外します</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="117"/>
+        <source>登録したディレクトリをスキャンし、類似/重複画像グループを検出します</source>
+        <translation>登録したディレクトリをスキャンし、類似/重複画像グループを検出します</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="126"/>
+        <source>Threshold:</source>
+        <translation>しきい値:</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="131"/>
+        <source>類似度のしきい値を設定します。値が小さいほど厳密になります</source>
+        <translation>類似度のしきい値を設定します。値が小さいほど厳密になります</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="138"/>
+        <source>Strictモード: pHashとdHashの両方で一致判定します</source>
+        <translation>Strictモード: pHashとdHashの両方で一致判定します</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="144"/>
+        <source>検索結果の表示をクリアします</source>
+        <translation>検索結果の表示をクリアします</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="148"/>
+        <source>すべてのサムネイルのチェックを外します</source>
+        <translation>すべてのサムネイルのチェックを外します</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
+        <source>Open URL(&amp;O)</source>
+        <translation>URLを開く(&amp;O)</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="724"/>
         <source>Warning: All images selected</source>
         <translation>警告: すべての画像が選択されています</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="725"/>
         <source>一部の類似画像グループで、すべての画像が削除対象としてチェックされています。
 このまま削除すると、それらの画像ファイルはすべて失われます。
 
@@ -86,14 +149,17 @@
 本当に削除を実行しますか?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="737"/>
         <source>Confirm Deletion</source>
         <translation>削除の確認</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="738"/>
         <source>Are you sure you want to move %1 images to Trash?</source>
         <translation>本当に %1 個の画像をゴミ箱に移動しますか?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="755"/>
         <source>The following files could not be moved to trash and were NOT deleted:
 
 </source>
@@ -102,26 +168,32 @@
 </translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="760"/>
         <source>Deletion Error</source>
         <translation>削除エラー</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="303"/>
         <source>Downloading image...</source>
         <translation>画像をダウンロード中...</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="781"/>
         <source>Download Error</source>
         <translation>ダウンロードエラー</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="782"/>
         <source>Failed to download image: %1</source>
         <translation>画像のダウンロードに失敗しました: %1</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="794"/>
         <source>Invalid Image</source>
         <translation>無効な画像</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="795"/>
         <source>The dropped URL does not contain a valid image.</source>
         <translation>ドロップされたURLに有効な画像が含まれていません。</translation>
     </message>
@@ -129,21 +201,34 @@
 <context>
     <name>ResultItemDelegate</name>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="75"/>
         <source>Loading...</source>
         <translation>読み込み中...</translation>
     </message>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="91"/>
         <source>Delete candidate</source>
         <translation>削除候補</translation>
     </message>
+    <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="218"/>
+        <source>チェックで削除対象に。[Ctrl]+Fで絞り込みが可能</source>
+        <translation>チェックで削除対象に。[Ctrl]+Fで絞り込みが可能</translation>
+    </message>
+    <message>
+        <source>チェックで削除対象に。グループ内でも任意に選択可能</source>
+        <translation type="vanished">チェックで削除対象に。グループ内でも任意に選択可能</translation>
+    </message>
 </context>
 <context>
     <name>ResultListModel</name>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="67"/>
         <source>Duplicate Group - %1 images</source>
         <translation>重複グループ - %1 枚の画像</translation>
     </message>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="43"/>
         <source>No similar images found.</source>
         <translation>類似画像が見つかりませんでした。</translation>
     </message>

+ 87 - 2
translations/dupfind_ko.ts

@@ -4,78 +4,141 @@
 <context>
     <name>MainWindow</name>
     <message>
+        <location filename="../src/MainWindow.cpp" line="112"/>
         <source>Add Directory</source>
         <translation>디렉토리 추가</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="114"/>
         <source>Remove Selected</source>
         <translation>선택 항목 삭제</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="116"/>
         <source>Start Scan</source>
         <translation>스캔 시작</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="118"/>
         <source>Delete Selected Duplicates</source>
         <translation>선택한 중복 파일 삭제</translation>
     </message>
     <message>
         <source>Similarity Threshold:</source>
-        <translation>유사성 임계값:</translation>
+        <translation type="vanished">유사성 임계값:</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="136"/>
         <source>Strict</source>
         <translation>엄격 모드</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="143"/>
         <source>Clear Results</source>
         <translation>결과 지우기</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="147"/>
         <source>Deselect All</source>
         <translation>모두 선택 해제</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="171"/>
         <source>Filter results by path or filename... (Press Esc to close)</source>
         <translation>경로 또는 파일 이름으로 결과 필터링... (Esc로 닫기)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="367"/>
         <source>Select Directory to Scan</source>
         <translation>스캔할 디렉토리 선택</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="391"/>
         <source>No Directory</source>
         <translation>디렉토리 없음</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="392"/>
         <source>Please add at least one directory to scan.</source>
         <translation>스캔할 디렉토리를 하나 이상 추가하세요.</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="538"/>
         <source>Searching duplicates... %p%</source>
         <translation>중복 파일 검색 중... %p%</translation>
     </message>
     <message>
-      <source>Copy Full Path(&amp;C)</source>
+        <location filename="../src/MainWindow.cpp" line="628"/>
+        <source>Copy Full Path(&amp;C)</source>
         <translation>전체 경로 복사(&amp;C)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="629"/>
         <source>Copy Image(&amp;I)</source>
         <translation>이미지 복사(&amp;I)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="633"/>
         <source>Remove from List(&amp;R)</source>
         <translation>목록에서 삭제(&amp;R)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
         <source>Open File Location(&amp;O)</source>
         <translation>파일 위치 열기(&amp;O)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="113"/>
+        <source>スキャン対象のディレクトリを追加します</source>
+        <translation>스캔할 디렉토리 추가</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="115"/>
+        <source>選択したディレクトリをリストから除外します</source>
+        <translation>선택한 디렉토리를 목록에서 제외</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="117"/>
+        <source>登録したディレクトリをスキャンし、類似/重複画像グループを検出します</source>
+        <translation>등록된 디렉토리를 스캔하여 유사/중복 이미지 그룹 감지</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="126"/>
+        <source>Threshold:</source>
+        <translation>임계값:</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="131"/>
+        <source>類似度のしきい値を設定します。値が小さいほど厳密になります</source>
+        <translation>유사도 임계값을 설정합니다. 값이 작을수록 엄격합니다.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="138"/>
+        <source>Strictモード: pHashとdHashの両方で一致判定します</source>
+        <translation>Strict 모드: pHash와 dHash 모두 사용하여 일치 여부 판정</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="144"/>
+        <source>検索結果の表示をクリアします</source>
+        <translation>검색 결과 지우기</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="148"/>
+        <source>すべてのサムネイルのチェックを外します</source>
+        <translation>모든 썸네일 선택 해제</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
+        <source>Open URL(&amp;O)</source>
+        <translation>URL 열기(&amp;O)</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="724"/>
         <source>Warning: All images selected</source>
         <translation>경로: 모든 이미지가 선택되었습니다</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="725"/>
         <source>一部の類似画像グループで、すべての画像が削除対象としてチェックされています。
 このまま削除すると、それらの画像ファイルはすべて失われます。
 
@@ -86,14 +149,17 @@
 정말 삭제하시겠습니까?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="737"/>
         <source>Confirm Deletion</source>
         <translation>삭제 확인</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="738"/>
         <source>Are you sure you want to move %1 images to Trash?</source>
         <translation>정말 %1 개의 이미지를 휴지통으로 이동하시겠습니까?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="755"/>
         <source>The following files could not be moved to trash and were NOT deleted:
 
 </source>
@@ -102,26 +168,32 @@
 </translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="760"/>
         <source>Deletion Error</source>
         <translation>삭제 오류</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="303"/>
         <source>Downloading image...</source>
         <translation>이미지 다운로드 중...</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="781"/>
         <source>Download Error</source>
         <translation>다운로드 오류</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="782"/>
         <source>Failed to download image: %1</source>
         <translation>이미지 다운로드 실패: %1</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="794"/>
         <source>Invalid Image</source>
         <translation>유효하지 않은 이미지</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="795"/>
         <source>The dropped URL does not contain a valid image.</source>
         <translation>드롭된 URL에 유효한 이미지가 포함되어 있지 않습니다.</translation>
     </message>
@@ -129,21 +201,34 @@
 <context>
     <name>ResultItemDelegate</name>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="75"/>
         <source>Loading...</source>
         <translation>불러오는 중...</translation>
     </message>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="91"/>
         <source>Delete candidate</source>
         <translation>삭제 후보</translation>
     </message>
+    <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="218"/>
+        <source>チェックで削除対象に。[Ctrl]+Fで絞り込みが可能</source>
+        <translation>체크 시 삭제 대상 지정. [Ctrl]+F로 결과 필터링 가능.</translation>
+    </message>
+    <message>
+        <source>チェックで削除対象に。グループ内でも任意に選択可能</source>
+        <translation type="vanished">체크 시 삭제 대상 지정. 그룹 내에서도 자유롭게 선택 가능</translation>
+    </message>
 </context>
 <context>
     <name>ResultListModel</name>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="67"/>
         <source>Duplicate Group - %1 images</source>
         <translation>중복 그룹 - %1 개의 이미지</translation>
     </message>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="43"/>
         <source>No similar images found.</source>
         <translation>유사한 이미지를 찾을 수 없습니다.</translation>
     </message>

+ 86 - 1
translations/dupfind_pl.ts

@@ -4,78 +4,141 @@
 <context>
     <name>MainWindow</name>
     <message>
+        <location filename="../src/MainWindow.cpp" line="112"/>
         <source>Add Directory</source>
         <translation>Dodaj folder</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="114"/>
         <source>Remove Selected</source>
         <translation>Usuń zaznaczone</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="116"/>
         <source>Start Scan</source>
         <translation>Rozpocznij skanowanie</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="118"/>
         <source>Delete Selected Duplicates</source>
         <translation>Usuń zaznaczone duplikaty</translation>
     </message>
     <message>
         <source>Similarity Threshold:</source>
-        <translation>Próg podobieństwa:</translation>
+        <translation type="vanished">Próg podobieństwa:</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="136"/>
         <source>Strict</source>
         <translation>Tryb ścisły</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="143"/>
         <source>Clear Results</source>
         <translation>Wyczyść wyniki</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="147"/>
         <source>Deselect All</source>
         <translation>Odznacz wszystko</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="171"/>
         <source>Filter results by path or filename... (Press Esc to close)</source>
         <translation>Filtruj wyniki wg ścieżki lub nazwy pliku... (Esc aby zamknąć)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="367"/>
         <source>Select Directory to Scan</source>
         <translation>Wybierz folder do skanowania</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="391"/>
         <source>No Directory</source>
         <translation>Brak folderu</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="392"/>
         <source>Please add at least one directory to scan.</source>
         <translation>Proszę dodać co najmniej jeden folder do skanowania.</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="538"/>
         <source>Searching duplicates... %p%</source>
         <translation>Szukanie duplikatów... %p%</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="628"/>
         <source>Copy Full Path(&amp;C)</source>
         <translation>Kopiuj pełną ścieżkę(&amp;C)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="629"/>
         <source>Copy Image(&amp;I)</source>
         <translation>Kopiuj obraz(&amp;I)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="633"/>
         <source>Remove from List(&amp;R)</source>
         <translation>Usuń z listy(&amp;R)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
         <source>Open File Location(&amp;O)</source>
         <translation>Otwórz lokalizację pliku(&amp;O)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="113"/>
+        <source>スキャン対象のディレクトリを追加します</source>
+        <translation>Add a directory to the scan list.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="115"/>
+        <source>選択したディレクトリをリストから除外します</source>
+        <translation>Remove the selected directory from the list.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="117"/>
+        <source>登録したディレクトリをスキャンし、類似/重複画像グループを検出します</source>
+        <translation>Scan registered directories to find similar or duplicate images.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="126"/>
+        <source>Threshold:</source>
+        <translation>Threshold:</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="131"/>
+        <source>類似度のしきい値を設定します。値が小さいほど厳密になります</source>
+        <translation>Set the similarity threshold. Lower values are stricter.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="138"/>
+        <source>Strictモード: pHashとdHashの両方で一致判定します</source>
+        <translation>Strict mode: matches using both pHash and dHash.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="144"/>
+        <source>検索結果の表示をクリアします</source>
+        <translation>Clear the displayed search results.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="148"/>
+        <source>すべてのサムネイルのチェックを外します</source>
+        <translation>Deselect all thumbnails.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
+        <source>Open URL(&amp;O)</source>
+        <translation>Open URL(&amp;O)</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="724"/>
         <source>Warning: All images selected</source>
         <translation>Uwaga: Zaznaczono wszystkie obrazy</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="725"/>
         <source>一部の類似画像グループで、すべての画像が削除対象としてチェックされています。
 このまま削除すると、それらの画像ファイルはすべて失われます。
 
@@ -86,14 +149,17 @@ Jeśli będziesz kontynuować, wszystkie te pliki zostaną utracone.
 Czy na pewno chcesz wykonać usuwanie?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="737"/>
         <source>Confirm Deletion</source>
         <translation>Potwierdź usuwanie</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="738"/>
         <source>Are you sure you want to move %1 images to Trash?</source>
         <translation>Czy na pewno chcesz przenieść %1 obrazów do kosza?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="755"/>
         <source>The following files could not be moved to trash and were NOT deleted:
 
 </source>
@@ -102,26 +168,32 @@ Czy na pewno chcesz wykonać usuwanie?</translation>
 </translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="760"/>
         <source>Deletion Error</source>
         <translation>Błąd usuwania</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="303"/>
         <source>Downloading image...</source>
         <translation>Pobieranie obrazu...</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="781"/>
         <source>Download Error</source>
         <translation>Błąd pobierania</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="782"/>
         <source>Failed to download image: %1</source>
         <translation>Nie udało się pobrać obrazu: %1</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="794"/>
         <source>Invalid Image</source>
         <translation>Nieprawidłowy obraz</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="795"/>
         <source>The dropped URL does not contain a valid image.</source>
         <translation>Upuszczony adres URL nie zawiera prawidłowego obrazu.</translation>
     </message>
@@ -129,21 +201,34 @@ Czy na pewno chcesz wykonać usuwanie?</translation>
 <context>
     <name>ResultItemDelegate</name>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="75"/>
         <source>Loading...</source>
         <translation>Ładowanie...</translation>
     </message>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="91"/>
         <source>Delete candidate</source>
         <translation>Kandydat do usunięcia</translation>
     </message>
+    <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="218"/>
+        <source>チェックで削除対象に。[Ctrl]+Fで絞り込みが可能</source>
+        <translation>Check to select for deletion. Press [Ctrl]+F to filter results.</translation>
+    </message>
+    <message>
+        <source>チェックで削除対象に。グループ内でも任意に選択可能</source>
+        <translation type="vanished">Check to select for deletion. Multiple selections are allowed within a group.</translation>
+    </message>
 </context>
 <context>
     <name>ResultListModel</name>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="67"/>
         <source>Duplicate Group - %1 images</source>
         <translation>Grupa duplikatów - %1 obrazów</translation>
     </message>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="43"/>
         <source>No similar images found.</source>
         <translation>Nie znaleziono podobnych obrazów.</translation>
     </message>

+ 86 - 1
translations/dupfind_pt.ts

@@ -4,78 +4,141 @@
 <context>
     <name>MainWindow</name>
     <message>
+        <location filename="../src/MainWindow.cpp" line="112"/>
         <source>Add Directory</source>
         <translation>Adicionar diretório</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="114"/>
         <source>Remove Selected</source>
         <translation>Remover selecionado</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="116"/>
         <source>Start Scan</source>
         <translation>Iniciar verificação</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="118"/>
         <source>Delete Selected Duplicates</source>
         <translation>Excluir duplicatas selecionadas</translation>
     </message>
     <message>
         <source>Similarity Threshold:</source>
-        <translation>Limite de similaridade:</translation>
+        <translation type="vanished">Limite de similaridade:</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="136"/>
         <source>Strict</source>
         <translation>Modo estrito</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="143"/>
         <source>Clear Results</source>
         <translation>Limpar resultados</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="147"/>
         <source>Deselect All</source>
         <translation>Desmarcar tudo</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="171"/>
         <source>Filter results by path or filename... (Press Esc to close)</source>
         <translation>Filtrar resultados por caminho ou nome... (Esc para fechar)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="367"/>
         <source>Select Directory to Scan</source>
         <translation>Selecionar diretório para verificar</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="391"/>
         <source>No Directory</source>
         <translation>Sem diretório</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="392"/>
         <source>Please add at least one directory to scan.</source>
         <translation>Por favor, adicione pelo menos um diretório para verificar.</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="538"/>
         <source>Searching duplicates... %p%</source>
         <translation>Buscando duplicatas... %p%</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="628"/>
         <source>Copy Full Path(&amp;C)</source>
         <translation>Copiar caminho completo(&amp;C)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="629"/>
         <source>Copy Image(&amp;I)</source>
         <translation>Copiar imagem(&amp;I)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="633"/>
         <source>Remove from List(&amp;R)</source>
         <translation>Remover da lista(&amp;R)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
         <source>Open File Location(&amp;O)</source>
         <translation>Abrir local do arquivo(&amp;O)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="113"/>
+        <source>スキャン対象のディレクトリを追加します</source>
+        <translation>Add a directory to the scan list.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="115"/>
+        <source>選択したディレクトリをリストから除外します</source>
+        <translation>Remove the selected directory from the list.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="117"/>
+        <source>登録したディレクトリをスキャンし、類似/重複画像グループを検出します</source>
+        <translation>Scan registered directories to find similar or duplicate images.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="126"/>
+        <source>Threshold:</source>
+        <translation>Threshold:</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="131"/>
+        <source>類似度のしきい値を設定します。値が小さいほど厳密になります</source>
+        <translation>Set the similarity threshold. Lower values are stricter.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="138"/>
+        <source>Strictモード: pHashとdHashの両方で一致判定します</source>
+        <translation>Strict mode: matches using both pHash and dHash.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="144"/>
+        <source>検索結果の表示をクリアします</source>
+        <translation>Clear the displayed search results.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="148"/>
+        <source>すべてのサムネイルのチェックを外します</source>
+        <translation>Deselect all thumbnails.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
+        <source>Open URL(&amp;O)</source>
+        <translation>Open URL(&amp;O)</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="724"/>
         <source>Warning: All images selected</source>
         <translation>Aviso: Todas as imagens selecionadas</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="725"/>
         <source>一部の類似画像グループで、すべての画像が削除対象としてチェックされています。
 このまま削除すると、それらの画像ファイルはすべて失われます。
 
@@ -86,14 +149,17 @@ Se continuar, todos esses ficheiros de imagem serão perdidos.
 Tem a certeza de que deseja executar a exclusão?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="737"/>
         <source>Confirm Deletion</source>
         <translation>Confirmar exclusão</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="738"/>
         <source>Are you sure you want to move %1 images to Trash?</source>
         <translation>Tem a certeza de que deseja mover %1 imagens para a lixeira?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="755"/>
         <source>The following files could not be moved to trash and were NOT deleted:
 
 </source>
@@ -102,26 +168,32 @@ Tem a certeza de que deseja executar a exclusão?</translation>
 </translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="760"/>
         <source>Deletion Error</source>
         <translation>Erro de exclusão</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="303"/>
         <source>Downloading image...</source>
         <translation>Baixando imagem...</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="781"/>
         <source>Download Error</source>
         <translation>Erro de download</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="782"/>
         <source>Failed to download image: %1</source>
         <translation>Falha ao baixar imagem: %1</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="794"/>
         <source>Invalid Image</source>
         <translation>Imagem inválida</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="795"/>
         <source>The dropped URL does not contain a valid image.</source>
         <translation>O URL solto não contém uma imagem válida.</translation>
     </message>
@@ -129,21 +201,34 @@ Tem a certeza de que deseja executar a exclusão?</translation>
 <context>
     <name>ResultItemDelegate</name>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="75"/>
         <source>Loading...</source>
         <translation>Carregando...</translation>
     </message>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="91"/>
         <source>Delete candidate</source>
         <translation>Candidato para exclusão</translation>
     </message>
+    <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="218"/>
+        <source>チェックで削除対象に。[Ctrl]+Fで絞り込みが可能</source>
+        <translation>Check to select for deletion. Press [Ctrl]+F to filter results.</translation>
+    </message>
+    <message>
+        <source>チェックで削除対象に。グループ内でも任意に選択可能</source>
+        <translation type="vanished">Check to select for deletion. Multiple selections are allowed within a group.</translation>
+    </message>
 </context>
 <context>
     <name>ResultListModel</name>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="67"/>
         <source>Duplicate Group - %1 images</source>
         <translation>Grupo de duplicadas - %1 imagens</translation>
     </message>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="43"/>
         <source>No similar images found.</source>
         <translation>Nenhuma imagem semelhante encontrada.</translation>
     </message>

+ 86 - 1
translations/dupfind_ru.ts

@@ -4,78 +4,141 @@
 <context>
     <name>MainWindow</name>
     <message>
+        <location filename="../src/MainWindow.cpp" line="112"/>
         <source>Add Directory</source>
         <translation>Добавить директорию</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="114"/>
         <source>Remove Selected</source>
         <translation>Удалить выбранное</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="116"/>
         <source>Start Scan</source>
         <translation>Начать сканирование</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="118"/>
         <source>Delete Selected Duplicates</source>
         <translation>Удалить выбранные дубликаты</translation>
     </message>
     <message>
         <source>Similarity Threshold:</source>
-        <translation>Пороговое значение:</translation>
+        <translation type="vanished">Пороговое значение:</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="136"/>
         <source>Strict</source>
         <translation>Строгий режим</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="143"/>
         <source>Clear Results</source>
         <translation>Очистить результаты</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="147"/>
         <source>Deselect All</source>
         <translation>Снять выделение</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="171"/>
         <source>Filter results by path or filename... (Press Esc to close)</source>
         <translation>Фильтр по пути или имени файла... (Esc для закрытия)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="367"/>
         <source>Select Directory to Scan</source>
         <translation>Выберите директорию для сканирования</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="391"/>
         <source>No Directory</source>
         <translation>Нет директории</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="392"/>
         <source>Please add at least one directory to scan.</source>
         <translation>Пожалуйста, добавьте хотя бы одну директорию для сканирования.</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="538"/>
         <source>Searching duplicates... %p%</source>
         <translation>Поиск дубликатов... %p%</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="628"/>
         <source>Copy Full Path(&amp;C)</source>
         <translation>Копировать полный путь(&amp;C)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="629"/>
         <source>Copy Image(&amp;I)</source>
         <translation>Копировать изображение(&amp;I)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="633"/>
         <source>Remove from List(&amp;R)</source>
         <translation>Удалить из списка(&amp;R)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
         <source>Open File Location(&amp;O)</source>
         <translation>Открыть папку с файлом(&amp;O)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="113"/>
+        <source>スキャン対象のディレクトリを追加します</source>
+        <translation>Add a directory to the scan list.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="115"/>
+        <source>選択したディレクトリをリストから除外します</source>
+        <translation>Remove the selected directory from the list.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="117"/>
+        <source>登録したディレクトリをスキャンし、類似/重複画像グループを検出します</source>
+        <translation>Scan registered directories to find similar or duplicate images.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="126"/>
+        <source>Threshold:</source>
+        <translation>Threshold:</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="131"/>
+        <source>類似度のしきい値を設定します。値が小さいほど厳密になります</source>
+        <translation>Set the similarity threshold. Lower values are stricter.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="138"/>
+        <source>Strictモード: pHashとdHashの両方で一致判定します</source>
+        <translation>Strict mode: matches using both pHash and dHash.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="144"/>
+        <source>検索結果の表示をクリアします</source>
+        <translation>Clear the displayed search results.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="148"/>
+        <source>すべてのサムネイルのチェックを外します</source>
+        <translation>Deselect all thumbnails.</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
+        <source>Open URL(&amp;O)</source>
+        <translation>Open URL(&amp;O)</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="724"/>
         <source>Warning: All images selected</source>
         <translation>Предупреждение: Выбраны все изображения</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="725"/>
         <source>一部の類似画像グループで、すべての画像が削除対象としてチェックされています。
 このまま削除すると、それらの画像ファイルはすべて失われます。
 
@@ -86,14 +149,17 @@
 Вы действительно хотите выполнить удаление?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="737"/>
         <source>Confirm Deletion</source>
         <translation>Подтверждение удаления</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="738"/>
         <source>Are you sure you want to move %1 images to Trash?</source>
         <translation>Вы уверены, что хотите переместить %1 изображений в корзину?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="755"/>
         <source>The following files could not be moved to trash and were NOT deleted:
 
 </source>
@@ -102,26 +168,32 @@
 </translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="760"/>
         <source>Deletion Error</source>
         <translation>Ошибка удаления</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="303"/>
         <source>Downloading image...</source>
         <translation>Загрузка изображения...</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="781"/>
         <source>Download Error</source>
         <translation>Ошибка загрузки</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="782"/>
         <source>Failed to download image: %1</source>
         <translation>Не удалось загрузить изображение: %1</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="794"/>
         <source>Invalid Image</source>
         <translation>Недопустимое изображение</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="795"/>
         <source>The dropped URL does not contain a valid image.</source>
         <translation>Перетащенный URL не содержит допустимого изображения.</translation>
     </message>
@@ -129,21 +201,34 @@
 <context>
     <name>ResultItemDelegate</name>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="75"/>
         <source>Loading...</source>
         <translation>Загрузка...</translation>
     </message>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="91"/>
         <source>Delete candidate</source>
         <translation>Кандидат на удаление</translation>
     </message>
+    <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="218"/>
+        <source>チェックで削除対象に。[Ctrl]+Fで絞り込みが可能</source>
+        <translation>Check to select for deletion. Press [Ctrl]+F to filter results.</translation>
+    </message>
+    <message>
+        <source>チェックで削除対象に。グループ内でも任意に選択可能</source>
+        <translation type="vanished">Check to select for deletion. Multiple selections are allowed within a group.</translation>
+    </message>
 </context>
 <context>
     <name>ResultListModel</name>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="67"/>
         <source>Duplicate Group - %1 images</source>
         <translation>Группа дубликатов - %1 изображений</translation>
     </message>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="43"/>
         <source>No similar images found.</source>
         <translation>Похожие изображения не найдены.</translation>
     </message>

+ 86 - 1
translations/dupfind_zh_CN.ts

@@ -4,78 +4,141 @@
 <context>
     <name>MainWindow</name>
     <message>
+        <location filename="../src/MainWindow.cpp" line="112"/>
         <source>Add Directory</source>
         <translation>添加目录</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="114"/>
         <source>Remove Selected</source>
         <translation>移除所选</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="116"/>
         <source>Start Scan</source>
         <translation>开始扫描</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="118"/>
         <source>Delete Selected Duplicates</source>
         <translation>删除所选重复文件</translation>
     </message>
     <message>
         <source>Similarity Threshold:</source>
-        <translation>相似度阈值:</translation>
+        <translation type="vanished">相似度阈值:</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="136"/>
         <source>Strict</source>
         <translation>严格模式</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="143"/>
         <source>Clear Results</source>
         <translation>清除结果</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="147"/>
         <source>Deselect All</source>
         <translation>取消全选</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="171"/>
         <source>Filter results by path or filename... (Press Esc to close)</source>
         <translation>按路径或文件名过滤结果... (按 Esc 键关闭)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="367"/>
         <source>Select Directory to Scan</source>
         <translation>选择要扫描的目录</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="391"/>
         <source>No Directory</source>
         <translation>无目录</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="392"/>
         <source>Please add at least one directory to scan.</source>
         <translation>请添加至少一个要扫描的目录。</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="538"/>
         <source>Searching duplicates... %p%</source>
         <translation>正在搜索重复文件... %p%</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="628"/>
         <source>Copy Full Path(&amp;C)</source>
         <translation>复制完整路径(&amp;C)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="629"/>
         <source>Copy Image(&amp;I)</source>
         <translation>复制图像(&amp;I)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="633"/>
         <source>Remove from List(&amp;R)</source>
         <translation>从列表中移除(&amp;R)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
         <source>Open File Location(&amp;O)</source>
         <translation>打开文件位置(&amp;O)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="113"/>
+        <source>スキャン対象のディレクトリを追加します</source>
+        <translation>添加扫描目录</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="115"/>
+        <source>選択したディレクトリをリストから除外します</source>
+        <translation>从列表中移除所选目录</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="117"/>
+        <source>登録したディレクトリをスキャンし、類似/重複画像グループを検出します</source>
+        <translation>扫描已注册的目录以检测相似/重复的图像组</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="126"/>
+        <source>Threshold:</source>
+        <translation>阈值:</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="131"/>
+        <source>類似度のしきい値を設定します。値が小さいほど厳密になります</source>
+        <translation>设置相似度阈值。值越小越严格。</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="138"/>
+        <source>Strictモード: pHashとdHashの両方で一致判定します</source>
+        <translation>严格模式:同时使用pHash and dHash进行匹配判定</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="144"/>
+        <source>検索結果の表示をクリアします</source>
+        <translation>清除显示的结果</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="148"/>
+        <source>すべてのサムネイルのチェックを外します</source>
+        <translation>取消选择所有缩略图</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
+        <source>Open URL(&amp;O)</source>
+        <translation>打开URL(&amp;O)</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="724"/>
         <source>Warning: All images selected</source>
         <translation>警告:已选择所有图像</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="725"/>
         <source>一部の類似画像グループで、すべての画像が削除対象としてチェックされています。
 このまま削除すると、それらの画像ファイルはすべて失われます。
 
@@ -86,14 +149,17 @@
 确定要执行删除吗?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="737"/>
         <source>Confirm Deletion</source>
         <translation>确认删除</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="738"/>
         <source>Are you sure you want to move %1 images to Trash?</source>
         <translation>确定要将 %1 个图像移至回收站吗?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="755"/>
         <source>The following files could not be moved to trash and were NOT deleted:
 
 </source>
@@ -102,26 +168,32 @@
 </translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="760"/>
         <source>Deletion Error</source>
         <translation>删除错误</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="303"/>
         <source>Downloading image...</source>
         <translation>正在下载图像...</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="781"/>
         <source>Download Error</source>
         <translation>下载错误</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="782"/>
         <source>Failed to download image: %1</source>
         <translation>下载图像失败: %1</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="794"/>
         <source>Invalid Image</source>
         <translation>无效图像</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="795"/>
         <source>The dropped URL does not contain a valid image.</source>
         <translation>拖放的 URL 不包含有效的图像。</translation>
     </message>
@@ -129,21 +201,34 @@
 <context>
     <name>ResultItemDelegate</name>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="75"/>
         <source>Loading...</source>
         <translation>正在加载...</translation>
     </message>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="91"/>
         <source>Delete candidate</source>
         <translation>待删除</translation>
     </message>
+    <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="218"/>
+        <source>チェックで削除対象に。[Ctrl]+Fで絞り込みが可能</source>
+        <translation>选中以进行删除。按 [Ctrl]+F 过滤结果。</translation>
+    </message>
+    <message>
+        <source>チェックで削除対象に。グループ内でも任意に選択可能</source>
+        <translation type="vanished">选中以进行删除。在一个组中可以选择多个。</translation>
+    </message>
 </context>
 <context>
     <name>ResultListModel</name>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="67"/>
         <source>Duplicate Group - %1 images</source>
         <translation>重复组 - %1 个图像</translation>
     </message>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="43"/>
         <source>No similar images found.</source>
         <translation>未找到相似图像。</translation>
     </message>

+ 86 - 1
translations/dupfind_zh_TW.ts

@@ -4,78 +4,141 @@
 <context>
     <name>MainWindow</name>
     <message>
+        <location filename="../src/MainWindow.cpp" line="112"/>
         <source>Add Directory</source>
         <translation>新增資料夾</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="114"/>
         <source>Remove Selected</source>
         <translation>移除所選</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="116"/>
         <source>Start Scan</source>
         <translation>開始掃描</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="118"/>
         <source>Delete Selected Duplicates</source>
         <translation>刪除所選重複檔案</translation>
     </message>
     <message>
         <source>Similarity Threshold:</source>
-        <translation>相似度閾值:</translation>
+        <translation type="vanished">相似度閾值:</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="136"/>
         <source>Strict</source>
         <translation>嚴格模式</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="143"/>
         <source>Clear Results</source>
         <translation>清除結果</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="147"/>
         <source>Deselect All</source>
         <translation>取消全選</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="171"/>
         <source>Filter results by path or filename... (Press Esc to close)</source>
         <translation>按路徑或檔案名稱過濾結果... (按 Esc 鍵關閉)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="367"/>
         <source>Select Directory to Scan</source>
         <translation>選擇要掃描的資料夾</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="391"/>
         <source>No Directory</source>
         <translation>無資料夾</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="392"/>
         <source>Please add at least one directory to scan.</source>
         <translation>請新增至少一個要掃描的資料夾。</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="538"/>
         <source>Searching duplicates... %p%</source>
         <translation>正在搜尋重複檔案... %p%</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="628"/>
         <source>Copy Full Path(&amp;C)</source>
         <translation>複製完整路徑(&amp;C)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="629"/>
         <source>Copy Image(&amp;I)</source>
         <translation>複製影像(&amp;I)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="633"/>
         <source>Remove from List(&amp;R)</source>
         <translation>從清單中移除(&amp;R)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
         <source>Open File Location(&amp;O)</source>
         <translation>打開檔案位置(&amp;O)</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="113"/>
+        <source>スキャン対象のディレクトリを追加します</source>
+        <translation>新增掃描目錄</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="115"/>
+        <source>選択したディレクトリをリストから除外します</source>
+        <translation>從列表中移除所選目錄</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="117"/>
+        <source>登録したディレクトリをスキャンし、類似/重複画像グループを検出します</source>
+        <translation>掃描已註冊的目錄以檢測相似/重複的圖像組</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="126"/>
+        <source>Threshold:</source>
+        <translation>閾値:</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="131"/>
+        <source>類似度のしきい値を設定します。値が小さいほど厳密になります</source>
+        <translation>設置相似度閾值。值越小越嚴格。</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="138"/>
+        <source>Strictモード: pHashとdHashの両方で一致判定します</source>
+        <translation>嚴格模式:同時使用pHash和dHash進行匹配判定</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="144"/>
+        <source>検索結果の表示をクリアします</source>
+        <translation>清除顯示的結果</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="148"/>
+        <source>すべてのサムネイルのチェックを外します</source>
+        <translation>取消選擇所有縮略圖</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="631"/>
+        <source>Open URL(&amp;O)</source>
+        <translation>開啟URL(&amp;O)</translation>
+    </message>
+    <message>
+        <location filename="../src/MainWindow.cpp" line="724"/>
         <source>Warning: All images selected</source>
         <translation>警告:已選擇所有圖片</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="725"/>
         <source>一部の類似画像グループで、すべての画像が削除対象としてチェックされています。
 このまま削除すると、それらの画像ファイルはすべて失われます。
 
@@ -86,14 +149,17 @@
 確定要執行刪除嗎?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="737"/>
         <source>Confirm Deletion</source>
         <translation>確認刪除</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="738"/>
         <source>Are you sure you want to move %1 images to Trash?</source>
         <translation>確定要將 %1 張圖片移至回收站嗎?</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="755"/>
         <source>The following files could not be moved to trash and were NOT deleted:
 
 </source>
@@ -102,26 +168,32 @@
 </translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="760"/>
         <source>Deletion Error</source>
         <translation>刪除錯誤</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="303"/>
         <source>Downloading image...</source>
         <translation>正在下載圖片...</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="781"/>
         <source>Download Error</source>
         <translation>下載錯誤</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="782"/>
         <source>Failed to download image: %1</source>
         <translation>下載圖片失敗: %1</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="794"/>
         <source>Invalid Image</source>
         <translation>無效圖片</translation>
     </message>
     <message>
+        <location filename="../src/MainWindow.cpp" line="795"/>
         <source>The dropped URL does not contain a valid image.</source>
         <translation>拖放的 URL 不包含有效的圖片。</translation>
     </message>
@@ -129,21 +201,34 @@
 <context>
     <name>ResultItemDelegate</name>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="75"/>
         <source>Loading...</source>
         <translation>正在載入...</translation>
     </message>
     <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="91"/>
         <source>Delete candidate</source>
         <translation>待刪除</translation>
     </message>
+    <message>
+        <location filename="../src/ResultItemDelegate.cpp" line="218"/>
+        <source>チェックで削除対象に。[Ctrl]+Fで絞り込みが可能</source>
+        <translation>選中以進行刪除。按 [Ctrl]+F 過濾結果。</translation>
+    </message>
+    <message>
+        <source>チェックで削除対象に。グループ内でも任意に選択可能</source>
+        <translation type="vanished">選中以進行刪除。在一個組中可以選擇多個。</translation>
+    </message>
 </context>
 <context>
     <name>ResultListModel</name>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="67"/>
         <source>Duplicate Group - %1 images</source>
         <translation>重複組 - %1 張圖片</translation>
     </message>
     <message>
+        <location filename="../src/ResultListModel.cpp" line="43"/>
         <source>No similar images found.</source>
         <translation>未找到相似圖像。</translation>
     </message>