diff --git a/src/linguist/linguist/mainwindow.cpp b/src/linguist/linguist/mainwindow.cpp
index 0bf9cad80..06983ce31 100644
--- a/src/linguist/linguist/mainwindow.cpp
+++ b/src/linguist/linguist/mainwindow.cpp
@@ -1067,6 +1067,11 @@ void MainWindow::updateTranslateHit(bool &hit)
     hit = (m = m_dataModel->messageItem(m_currentIndex))
           && !m->isObsolete()
           && m->compare(m_translateDialog->findText(), false, m_translateDialog->caseSensitivity());
+
+    const auto idx = m_messageView->currentIndex();
+    const auto index = m_sortedMessagesModel->index(idx.row(), m_currentIndex.model()+1, idx.parent());
+    if (index.isValid())
+        hit &= m_messageView->selectionModel()->isSelected(index);
 }
 
 void MainWindow::translate(int mode)
@@ -1076,9 +1081,15 @@ void MainWindow::translate(int mode)
     bool markFinished = m_translateDialog->markFinished();
     Qt::CaseSensitivity caseSensitivity = m_translateDialog->caseSensitivity();
 
-    int translatedCount = 0;
+    if (!msgCount(findText, caseSensitivity)) {
+        qApp->beep();
+        QMessageBox::warning(m_translateDialog, tr("Translate - Qt Linguist"),
+                tr("Cannot find the string '%1'.").arg(findText));
+        return;
+    }
 
     if (mode == TranslateDialog::TranslateAll) {
+        int translatedCount = 0;
         for (MultiDataModelIterator it(m_dataModel, m_currentIndex.model()); it.isValid(); ++it) {
             MessageItem *m = it.current();
             if (m && !m->isObsolete() && m->compare(findText, false, caseSensitivity)) {
@@ -1098,49 +1109,38 @@ void MainWindow::translate(int mode)
         if (mode == TranslateDialog::Translate) {
             m_dataModel->setTranslation(m_currentIndex, replaceText);
             m_dataModel->setFinished(m_currentIndex, markFinished);
+            return;
         }
 
         if (findText != m_latestFindText || caseSensitivity != m_latestCaseSensitivity) {
             m_latestFindText = findText;
             m_latestCaseSensitivity = caseSensitivity;
             m_remainingCount = m_dataModel->messageCount();
-            m_hitCount = 0;
         }
 
         QModelIndex index = m_messageView->currentIndex();
-        int prevRemained = m_remainingCount;
         forever {
-            if (--m_remainingCount <= 0) {
-                if (!m_hitCount)
-                    break;
-                m_remainingCount = m_dataModel->messageCount() - 1;
-                if (QMessageBox::question(m_translateDialog, tr("Translate - Qt Linguist"),
-                        tr("No more occurrences of '%1'. Start over?").arg(findText),
-                        QMessageBox::Yes|QMessageBox::No) != QMessageBox::Yes)
-                    return;
-                m_remainingCount -= prevRemained;
+            if (m_remainingCount <= 0 &&
+                 QMessageBox::question(m_translateDialog, tr("Translate - Qt Linguist"),
+                     tr("No more occurrences of '%1'. Start over?").arg(findText),
+                     QMessageBox::Yes|QMessageBox::No) != QMessageBox::Yes) {
+                ++m_remainingCount;
+                return;
             }
 
             index = nextMessage(index);
+            m_remainingCount = m_dataModel->messageCount()-index.row()-1;
 
             QModelIndex realIndex = m_sortedMessagesModel->mapToSource(index);
             MultiDataIndex dataIndex = m_messageModel->dataIndex(realIndex, m_currentIndex.model());
             if (MessageItem *m = m_dataModel->messageItem(dataIndex)) {
                 if (!m->isObsolete() && m->compare(findText, false, caseSensitivity)) {
                     setCurrentMessage(realIndex, m_currentIndex.model());
-                    ++translatedCount;
-                    ++m_hitCount;
                     break;
                 }
             }
         }
     }
-
-    if (!translatedCount) {
-        qApp->beep();
-        QMessageBox::warning(m_translateDialog, tr("Translate - Qt Linguist"),
-                tr("Cannot find the string '%1'.").arg(findText));
-    }
 }
 
 void MainWindow::newPhraseBook()
@@ -2830,4 +2830,17 @@ bool MainWindow::eventFilter(QObject *object, QEvent *event)
     return QMainWindow::eventFilter(object, event);
 }
 
+uint64_t MainWindow::msgCount(const QString &text, Qt::CaseSensitivity cs) const
+{
+    uint64_t counter = 0;
+    for (MultiDataModelIterator it(m_dataModel, m_currentIndex.model()); it.isValid(); ++it) {
+        MessageItem *m = it.current();
+        if (m && !m->isObsolete() && m->compare(text, false, cs)) {
+            ++counter;
+        }
+    }
+
+    return counter;
+}
+
 QT_END_NAMESPACE
diff --git a/src/linguist/linguist/mainwindow.h b/src/linguist/linguist/mainwindow.h
index 6058510a7..fc56a5ff8 100644
--- a/src/linguist/linguist/mainwindow.h
+++ b/src/linguist/linguist/mainwindow.h
@@ -174,6 +174,7 @@ private:
     void updatePhraseDictInternal(int model);
     void releaseInternal(int model);
     void saveInternal(int model);
+    uint64_t msgCount(const QString &text, Qt::CaseSensitivity cs) const;
 
 #if QT_CONFIG(printsupport)
     QPrinter *printer();
@@ -219,7 +220,6 @@ private:
     QString m_latestFindText;
     int m_latestCaseSensitivity;
     int m_remainingCount;
-    int m_hitCount;
 
     BatchTranslationDialog *m_batchTranslateDialog;
     TranslationSettingsDialog *m_translationSettingsDialog;
diff --git a/src/linguist/linguist/translatedialog.cpp b/src/linguist/linguist/translatedialog.cpp
index 36be31d79..f21047390 100644
--- a/src/linguist/linguist/translatedialog.cpp
+++ b/src/linguist/linguist/translatedialog.cpp
@@ -19,6 +19,8 @@ TranslateDialog::TranslateDialog(QWidget *parent)
             this, &TranslateDialog::verifyText);
     connect(m_ui.ckMatchCase, &QAbstractButton::toggled,
             this, &TranslateDialog::verifyText);
+    connect(m_ui.findNxt, &QAbstractButton::clicked,
+            this, &TranslateDialog::verifyText);
 }
 
 void TranslateDialog::showEvent(QShowEvent *)
