From 2edb56977309daff0e2bb92bb5f64f8e0ac47da9 Mon Sep 17 00:00:00 2001 From: Magdalena Stojek Date: Mon, 9 Dec 2024 17:57:46 +0100 Subject: [PATCH] Add translation lookup for mimetype descriptions Extend QMimeType::comment() to support translations from .qm files as a fallback when system-provided translations (e.g., shared-mime-info) are unavailable. Pick-to: 6.9 Task-number: QTBUG-127004 Change-Id: I23060ab7a690c774691b2d96174e77a252c047ad Reviewed-by: Volker Hilsheimer --- src/corelib/mimetypes/qmimetype.cpp | 43 ++++++++++++++--------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/src/corelib/mimetypes/qmimetype.cpp b/src/corelib/mimetypes/qmimetype.cpp index 2c23f3175db..b69937bd556 100644 --- a/src/corelib/mimetypes/qmimetype.cpp +++ b/src/corelib/mimetypes/qmimetype.cpp @@ -7,6 +7,7 @@ #include "qmimetype_p.h" #include "qmimedatabase_p.h" +#include #include #include #include @@ -180,40 +181,36 @@ QString QMimeType::name() const \property QMimeType::comment \brief the description of the MIME type to be displayed on user interfaces - The default language (QLocale().name()) is used to select the appropriate translation. + Returns a description for a MIME type, localized to the user's + current language settings. While this property was introduced in 5.10, the corresponding accessor method has always been there. */ QString QMimeType::comment() const { + const auto isEnUs = [](QStringView lang) { + // All synonyms of en_US, according to CLDR likely subtag rules: + static constexpr QLatin1StringView usaIsh[] = + { "en_Latn_US"_L1, "en_US"_L1, "en_Latn"_L1, "en"_L1 }; + return std::find(std::begin(usaIsh), std::end(usaIsh), lang) != std::end(usaIsh); + }; const auto localeComments = QMimeDatabasePrivate::instance()->localeComments(d->name); - - QStringList languageList = QLocale().uiLanguages(QLocale::TagSeparator::Underscore); - qsizetype defaultIndex = languageList.indexOf(u"en_US"_s); - - // Include the default locale as fall-back. - if (defaultIndex >= 0) { - // en_US is generally the default, and may be omitted from the - // overtly-named locales in the MIME type's data (QTBUG-105007). - ++defaultIndex; // Skip over en_US. - // That's typically followed by en_Latn_US and en (in that order): - if (defaultIndex < languageList.size() && languageList.at(defaultIndex) == u"en_Latn_US") - ++defaultIndex; - if (defaultIndex < languageList.size() && languageList.at(defaultIndex) == u"en") - ++defaultIndex; - } else { - // Absent en-US, just append it: - defaultIndex = languageList.size(); - } - languageList.insert(defaultIndex, u"default"_s); + const QStringList languageList = QLocale().uiLanguages(QLocale::TagSeparator::Underscore); + QString comment = localeComments.value(u"default"_s); for (const QString &language : std::as_const(languageList)) { const QString lang = language == "C"_L1 ? u"en_US"_s : language; - QString comm = localeComments.value(lang); - if (!comm.isEmpty()) - return comm; + QString translated = localeComments.value(lang); + if (!translated.isEmpty()) + return translated; + if (!comment.isEmpty() && isEnUs(lang)) + return comment; // The default entry is assumed to be in en-US } + QString translated = + QCoreApplication::translate("QMimeType", comment.toUtf8().constData()); + if (!translated.isEmpty()) + return translated; // Use the mimetype name as fallback return d->name;