summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKai Köhne <[email protected]>2024-09-30 12:30:27 +0000
committerVolker Hilsheimer <[email protected]>2024-10-01 06:22:27 +0000
commitf3fc7b210f79e5eb427b0ff49c45c5d6d390fb34 (patch)
tree796213b51542cc7238c9f9f3fc48b0d2399802a2
parent6f48162478ec2dd62c9c51fec4148bf7e25fbc86 (diff)
Revert "QTranslator: fix loading order when loading from locale"
This reverts commit 9a11273b745a30cebb5cd648c89eb224e9704492. Reason for revert: The fix tried to find a sensible order if the same language is listed multiple times in QLocale::uiLanguages(). Anyhow, it breaks for lists where entirely different languages are listed. This needs more thought. Fixes: QTBUG-129434 Reopens: QTBUG-124898 Pick-to: 6.5 6.7 6.8 dev Change-Id: I8c074cbf1ddc2ddf223ec09aef38dfc1ef7fc85f Reviewed-by: Volker Hilsheimer <[email protected]>
-rw-r--r--src/corelib/kernel/qtranslator.cpp46
-rw-r--r--tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp52
2 files changed, 43 insertions, 55 deletions
diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp
index 5c4ebfedf14..ec92404a154 100644
--- a/src/corelib/kernel/qtranslator.cpp
+++ b/src/corelib/kernel/qtranslator.cpp
@@ -638,41 +638,25 @@ static QString find_translation(const QLocale & locale,
languages.insert(i + 1, lowerLang);
}
- QStringList candidates;
- // assume 3 segments for each entry
- candidates.reserve(languages.size() * 3);
- for (QStringView language : std::as_const(languages)) {
- // for each language, add versions without territory and script
+ for (QString localeName : std::as_const(languages)) {
+ // try the complete locale name first and progressively truncate from
+ // the end until a matching language tag is found (with or without suffix)
for (;;) {
- candidates += language.toString();
- int rightmost = language.lastIndexOf(u'_');
- if (rightmost <= 0)
- break;
- language.truncate(rightmost);
- }
- }
+ realname += localeName + suffixOrDotQM;
+ if (is_readable_file(realname))
+ return realname;
- // now sort the list of candidates
- std::sort(candidates.begin(), candidates.end(), [](const auto &lhs, const auto &rhs){
- const auto rhsSegments = rhs.count(u'_');
- const auto lhsSegments = lhs.count(u'_');
- // candidates with more segments come first
- if (rhsSegments != lhsSegments)
- return rhsSegments < lhsSegments;
- // candidates with same number of segments are sorted alphanumerically
- return lhs < rhs;
- });
-
- for (const QString &localeName : std::as_const(candidates)) {
- 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 + localeName.size());
- if (is_readable_file(realname))
- return realname;
+ realname.truncate(realNameBaseSize);
- realname.truncate(realNameBaseSize);
+ int rightmost = localeName.lastIndexOf(u'_');
+ if (rightmost <= 0)
+ break; // no truncations anymore, break
+ localeName.truncate(rightmost);
+ }
}
const int realNameBaseSizeFallbacks = path.size() + filename.size();
diff --git a/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp b/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp
index f214572cfa2..c76500ea119 100644
--- a/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp
+++ b/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp
@@ -27,7 +27,6 @@ private slots:
void load_data();
void load();
- void loadLocale_data();
void loadLocale();
void threadLoad();
void testLanguageChange();
@@ -117,23 +116,12 @@ void tst_QTranslator::load()
}
}
-void tst_QTranslator::loadLocale_data()
-{
- QTest::addColumn<QString>("localeName");
- QTest::addColumn<QStringList>("fileNames");
-
- QTest::addRow("US English")
- << "en_US"
- << QStringList{"en_US.qm", "en_US", "en.qm", "en"};
- QTest::addRow("Australia")
- << "en_AU"
- << QStringList{"en_Latn_AU.qm", "en_AU.qm", "en.qm"};
-}
-
void tst_QTranslator::loadLocale()
{
- QFETCH(const QString, localeName);
- QFETCH(const QStringList, fileNames);
+ QLocale locale;
+ auto localeName = locale.uiLanguages(QLocale::TagSeparator::Underscore).value(0);
+ if (localeName.isEmpty())
+ QSKIP("This test requires at least one available UI language.");
QByteArray ba;
{
@@ -146,16 +134,36 @@ void tst_QTranslator::loadLocale()
QTemporaryDir dir;
QVERIFY(dir.isValid());
- const auto path = dir.path();
+ auto path = dir.path();
QFile file(path + "/dummy");
QVERIFY2(file.open(QFile::WriteOnly), qPrintable(file.errorString()));
QCOMPARE(file.write(ba), ba.size());
file.close();
+ /*
+ Test the following order:
+
+ /tmp/tmpDir/foo-en_US.qm
+ /tmp/tmpDir/foo-en_US
+ /tmp/tmpDir/foo-en.qm
+ /tmp/tmpDir/foo-en
+ /tmp/tmpDir/foo.qm
+ /tmp/tmpDir/foo-
+ /tmp/tmpDir/foo
+ */
+
QStringList files;
- for (const auto &fileName : fileNames) {
- files.append(path + "/foo-" + fileName);
+ while (true) {
+ files.append(path + "/foo-" + localeName + ".qm");
+ QVERIFY2(file.copy(files.last()), qPrintable(file.errorString()));
+
+ files.append(path + "/foo-" + localeName);
QVERIFY2(file.copy(files.last()), qPrintable(file.errorString()));
+
+ int rightmost = localeName.lastIndexOf(QLatin1Char('_'));
+ if (rightmost <= 0)
+ break;
+ localeName.truncate(rightmost);
}
files.append(path + "/foo.qm");
@@ -167,14 +175,10 @@ void tst_QTranslator::loadLocale()
files.append(path + "/foo");
QVERIFY2(file.rename(files.last()), qPrintable(file.errorString()));
- QLocale locale(localeName);
QTranslator tor;
for (const auto &filePath : files) {
QVERIFY(tor.load(locale, "foo", "-", path, ".qm"));
- // As the file system might be case insensitive, we can't guarantee that
- // the casing of the file name is preserved. The order of loading
- // en_AU vs en_au if both exist is undefined anyway.
- QCOMPARE(tor.filePath().toLower(), filePath.toLower());
+ QCOMPARE(tor.filePath(), filePath);
QVERIFY2(file.remove(filePath), qPrintable(file.errorString()));
}
}