diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp index 837b6712f8f..2e853dde5f9 100644 --- a/src/corelib/kernel/qtranslator.cpp +++ b/src/corelib/kernel/qtranslator.cpp @@ -648,7 +648,6 @@ static QString find_translation(const QLocale & locale, QString realname; realname += path + filename + prefix; // using += in the hope for some reserve capacity const int realNameBaseSize = realname.size(); - QStringList fuzzyLocales; // see http://www.unicode.org/reports/tr35/#LanguageMatching for inspiration @@ -662,32 +661,12 @@ static QString find_translation(const QLocale & locale, } #endif - // try explicit locales names first for (QString localeName : qAsConst(languages)) { localeName.replace(QLatin1Char('-'), QLatin1Char('_')); - realname += localeName + suffixOrDotQM; - if (is_readable_file(realname)) - return realname; - - realname.truncate(realNameBaseSize + localeName.size()); - if (is_readable_file(realname)) - return realname; - - realname.truncate(realNameBaseSize); - fuzzyLocales.append(localeName); - } - - // start guessing - for (const QString &fuzzyLocale : qAsConst(fuzzyLocales)) { - QStringView localeName(fuzzyLocale); + // try the complete locale name first and progressively truncate from + // the end until a matching language tag is found (with or without suffix) for (;;) { - int rightmost = localeName.lastIndexOf(QLatin1Char('_')); - // no truncations? fail - if (rightmost <= 0) - break; - localeName.truncate(rightmost); - realname += localeName + suffixOrDotQM; if (is_readable_file(realname)) return realname; @@ -697,6 +676,11 @@ static QString find_translation(const QLocale & locale, return realname; realname.truncate(realNameBaseSize); + + int rightmost = localeName.lastIndexOf(QLatin1Char('_')); + if (rightmost <= 0) + break; // no truncations anymore, break + localeName.truncate(rightmost); } } @@ -755,10 +739,10 @@ static QString find_translation(const QLocale & locale, \li \c /opt/foolib/foo.es \li \c /opt/foolib/foo.fr_CA.qm \li \c /opt/foolib/foo.fr_CA - \li \c /opt/foolib/foo.de.qm - \li \c /opt/foolib/foo.de \li \c /opt/foolib/foo.fr.qm \li \c /opt/foolib/foo.fr + \li \c /opt/foolib/foo.de.qm + \li \c /opt/foolib/foo.de \li \c /opt/foolib/foo.qm \li \c /opt/foolib/foo. \li \c /opt/foolib/foo