File 0001-Add-support-for-plurals-with-floating-values.patch of Package mingw64-libqt5-qtbase
From 9dc6c88925c86519160c75263a856f503719144f Mon Sep 17 00:00:00 2001
From: Ralf Habacker <ralf.habacker@freenet.de>
Date: Thu, 23 Aug 2018 18:30:50 +0200
Subject: [PATCH] Add support for plurals with floating values
Change-Id: I1f54c8401d060f97396fe647f25bd9a052b096bd
---
src/corelib/kernel/qcoreapplication.cpp | 50 +++++++++++++++
src/corelib/kernel/qcoreapplication.h | 6 ++
src/corelib/kernel/qobject.h | 4 ++
src/corelib/kernel/qtranslator.cpp | 72 ++++++++++++++++------
src/corelib/kernel/qtranslator.h | 2 +
.../corelib/kernel/qtranslator/tst_qtranslator.cpp | 8 +++
6 files changed, 124 insertions(+), 18 deletions(-)
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index c8b130bbb9..d9c5a9d1e0 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -2005,6 +2005,30 @@ static void replacePercentN(QString *result, int n)
}
}
+static void replacePercentN(QString *result, qreal n)
+{
+ if (!qIsNaN(n)) {
+ int percentPos = 0;
+ int len = 0;
+ while ((percentPos = result->indexOf(QLatin1Char('%'), percentPos + len)) != -1) {
+ len = 1;
+ QString fmt;
+ if (result->at(percentPos + len) == QLatin1Char('L')) {
+ ++len;
+ fmt = QLatin1String("%L1");
+ } else {
+ fmt = QLatin1String("%1");
+ }
+ if (result->at(percentPos + len) == QLatin1Char('n')) {
+ fmt = fmt.arg(n);
+ ++len;
+ result->replace(percentPos, len, fmt);
+ len = fmt.length();
+ }
+ }
+ }
+}
+
/*!
\reentrant
@@ -2069,6 +2093,32 @@ QString QCoreApplication::translate(const char *context, const char *sourceText,
return result;
}
+QString QCoreApplication::translate(const char *context, const char *sourceText,
+ const char *disambiguation, qreal n)
+{
+ QString result;
+
+ if (!sourceText)
+ return result;
+
+ if (self && !self->d_func()->translators.isEmpty()) {
+ QList<QTranslator*>::ConstIterator it;
+ QTranslator *translationFile;
+ for (it = self->d_func()->translators.constBegin(); it != self->d_func()->translators.constEnd(); ++it) {
+ translationFile = *it;
+ result = translationFile->translate(context, sourceText, disambiguation, n);
+ if (!result.isNull())
+ break;
+ }
+ }
+
+ if (result.isNull())
+ result = QString::fromUtf8(sourceText);
+
+ replacePercentN(&result, n);
+ return result;
+}
+
/*! \fn static QString QCoreApplication::translate(const char *context, const char *key, const char *disambiguation, Encoding encoding, int n = -1)
\obsolete
diff --git a/src/corelib/kernel/qcoreapplication.h b/src/corelib/kernel/qcoreapplication.h
index 0fee7b3de8..02d7ea7d68 100644
--- a/src/corelib/kernel/qcoreapplication.h
+++ b/src/corelib/kernel/qcoreapplication.h
@@ -157,6 +157,10 @@ public:
const char * key,
const char * disambiguation = Q_NULLPTR,
int n = -1);
+ static QString translate(const char * context,
+ const char * key,
+ const char * disambiguation,
+ qreal n);
#if QT_DEPRECATED_SINCE(5, 0)
enum Encoding { UnicodeUTF8, Latin1, DefaultCodec = UnicodeUTF8, CodecForTr = UnicodeUTF8 };
QT_DEPRECATED static inline QString translate(const char * context, const char * key,
@@ -248,6 +252,8 @@ inline bool QCoreApplication::sendSpontaneousEvent(QObject *receiver, QEvent *ev
public: \
static inline QString tr(const char *sourceText, const char *disambiguation = Q_NULLPTR, int n = -1) \
{ return QCoreApplication::translate(#context, sourceText, disambiguation, n); } \
+ static inline QString tr(const char *sourceText, const char *disambiguation, qreal n) \
+ { return QCoreApplication::translate(#context, sourceText, disambiguation, n); } \
QT_DECLARE_DEPRECATED_TR_FUNCTIONS(context) \
private:
diff --git a/src/corelib/kernel/qobject.h b/src/corelib/kernel/qobject.h
index dea17ed530..a10d9d8193 100644
--- a/src/corelib/kernel/qobject.h
+++ b/src/corelib/kernel/qobject.h
@@ -130,12 +130,16 @@ public:
#ifdef Q_QDOC
static QString tr(const char *sourceText, const char *comment = Q_NULLPTR, int n = -1);
static QString trUtf8(const char *sourceText, const char *comment = Q_NULLPTR, int n = -1);
+ static QString tr(const char *sourceText, const char *comment, qreal n);
+ static QString trUtf8(const char *sourceText, const char *comment, qreal n);
virtual const QMetaObject *metaObject() const;
static const QMetaObject staticMetaObject;
#endif
#ifdef QT_NO_TRANSLATION
static QString tr(const char *sourceText, const char * = Q_NULLPTR, int = -1)
{ return QString::fromUtf8(sourceText); }
+ static QString tr(const char *sourceText, const char *, qreal)
+ { return QString::fromUtf8(sourceText); }
#if QT_DEPRECATED_SINCE(5, 0)
QT_DEPRECATED static QString trUtf8(const char *sourceText, const char * = Q_NULLPTR, int = -1)
{ return QString::fromUtf8(sourceText); }
diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp
index 2232e24a25..41d0318d7c 100644
--- a/src/corelib/kernel/qtranslator.cpp
+++ b/src/corelib/kernel/qtranslator.cpp
@@ -324,6 +324,8 @@ public:
bool do_load(const uchar *data, int len, const QString &directory);
QString do_translate(const char *context, const char *sourceText, const char *comment,
int n) const;
+ QString do_translate(const char *context, const char *sourceText, const char *comment,
+ qreal n) const;
void clear();
};
@@ -963,22 +965,12 @@ end:
return str;
}
-QString QTranslatorPrivate::do_translate(const char *context, const char *sourceText,
- const char *comment, int n) const
+QString QTranslatorPrivate::do_translate2(const char *context, const char *sourceText,
+ const char *comment) const
{
- if (context == 0)
- context = "";
- if (sourceText == 0)
- sourceText = "";
- if (comment == 0)
- comment = "";
-
- uint numerus = 0;
+ uint numerus = offsetLength / (2 * sizeof(quint32));
size_t numItems = 0;
- if (!offsetLength)
- goto searchDependencies;
-
/*
Check if the context belongs to this QTranslator. If many
translators are installed, this step is necessary.
@@ -1004,10 +996,6 @@ QString QTranslatorPrivate::do_translate(const char *context, const char *source
}
}
- numItems = offsetLength / (2 * sizeof(quint32));
- if (!numItems)
- goto searchDependencies;
-
if (n >= 0)
numerus = numerusHelper(n, numerusRulesArray, numerusRulesLength);
@@ -1054,8 +1042,49 @@ QString QTranslatorPrivate::do_translate(const char *context, const char *source
break;
comment = "";
}
+ return QString();
+}
+
+QString QTranslatorPrivate::do_translate(const char *context, const char *sourceText,
+ const char *comment, int n) const
+{
+ if (context == 0)
+ context = "";
+ if (sourceText == 0)
+ sourceText = "";
+ if (comment == 0)
+ comment = "";
+
+ if (offsetLength) {
+ QString result = do_translate2(context, sourceText, comment);
+ if (!result.isEmpty())
+ return result;
+ }
+
+ for (QTranslator *translator : subTranslators) {
+ QString tn = translator->translate(context, sourceText, comment, n);
+ if (!tn.isNull())
+ return tn;
+ }
+ return QString();
+}
+
+QString QTranslatorPrivate::do_translate(const char *context, const char *sourceText,
+ const char *comment, qreal n) const
+{
+ if (context == 0)
+ context = "";
+ if (sourceText == 0)
+ sourceText = "";
+ if (comment == 0)
+ comment = "";
+
+ if (offsetLength) {
+ QString result = do_translate2(context, sourceText, comment);
+ if (!result.isEmpty())
+ return result;
+ }
-searchDependencies:
for (QTranslator *translator : subTranslators) {
QString tn = translator->translate(context, sourceText, comment, n);
if (!tn.isNull())
@@ -1130,6 +1159,13 @@ QString QTranslator::translate(const char *context, const char *sourceText, cons
return d->do_translate(context, sourceText, disambiguation, n);
}
+QString QTranslator::translate(const char *context, const char *sourceText, const char *disambiguation,
+ qreal n) const
+{
+ Q_D(const QTranslator);
+ return d->do_translate(context, sourceText, disambiguation, n);
+}
+
/*!
Returns \c true if this translator is empty, otherwise returns \c false.
This function works with stripped and unstripped translation files.
diff --git a/src/corelib/kernel/qtranslator.h b/src/corelib/kernel/qtranslator.h
index 97be16bc90..a8209c89c4 100644
--- a/src/corelib/kernel/qtranslator.h
+++ b/src/corelib/kernel/qtranslator.h
@@ -60,6 +60,8 @@ public:
virtual QString translate(const char *context, const char *sourceText,
const char *disambiguation = Q_NULLPTR, int n = -1) const;
+ virtual QString translate(const char *context, const char *sourceText,
+ const char *disambiguation, qreal n) const;
virtual bool isEmpty() const;
diff --git a/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp b/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp
index e3eee6dbdd..7f716bb6ad 100644
--- a/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp
+++ b/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp
@@ -219,6 +219,10 @@ void tst_QTranslator::plural()
QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 0), QLatin1String("Hallo 0 Welten!"));
QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 1), QLatin1String("Hallo 1 Welt!"));
QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 2), QLatin1String("Hallo 2 Welten!"));
+
+ QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 0.0), QLatin1String("Hallo 0.0 Welten!"));
+ QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 1.0), QLatin1String("Hallo 1.0 Welt!"));
+ QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 2.0), QLatin1String("Hallo 2.0 Welten!"));
}
void tst_QTranslator::translate_qm_file_generated_with_msgfmt()
@@ -272,6 +276,10 @@ void tst_QTranslator::dependencies()
QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 1), QLatin1String("Hallo 1 Welt!"));
QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 2), QLatin1String("Hallo 2 Welten!"));
+ QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 0.0), QLatin1String("Hallo 0.0 Welten!"));
+ QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 1.0), QLatin1String("Hallo 1.0 Welt!"));
+ QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 2.0), QLatin1String("Hallo 2.0 Welten!"));
+
// pick up translation from the file with dependencies
QCOMPARE(tor.translate("QPushButton", "It's a small world"), QLatin1String("Es ist eine kleine Welt"));
}
--
2.13.7