Not sure if this is the issue, but worth trying... I see you're using the non-Locale overload of QTranslator::load(), which specifically says:
Usually, it is better to use the QTranslator::load(const QLocale &, const QString &, const QString &, const QString &, const QString &) function instead, because it uses QLocale::uiLanguages() and not simply the locale name, which refers to the formatting of dates and numbers and not necessarily the UI language.
So try using the locale-overload: https://doc.qt.io/qt-6/qtranslator.html#load-1
For example, here's how I do it in one of my projects:
const QLocale locale;
QTranslator appTranslator;
if (appTranslator.load(locale, u"cli"_s, u"/"_s, u":/i18n"_s)) {
QCoreApplication::installTranslator(&appTranslator);
}
...
qCDebug(lc).noquote() << "Locale:" << locale << locale.uiLanguages();
#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) // QTranslator::filePath() added in Qt 5.15.
qCDebug(lc).noquote() << "App translations:" <<
(appTranslator.filePath().isEmpty() ? u"<none>"_s : appTranslator.filePath());
#else
qCDebug(lc).noquote() << "App translations:" << (!appTranslator.isEmpty());
#endif
So try something like:
const QLocale locale;
qDebug().noquote() << "Locale:" << locale << locale.uiLanguages();
QTranslator translator;
if (translator.load(locale, ":/qt/....")) {
....
}
You might also try to calling QmlEngine::retranslate() after the QmlEngine construction?