summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKai Koehne <kai.koehne@qt.io>2020-01-30 11:08:50 +0100
committerKai Koehne <kai.koehne@qt.io>2020-02-10 15:14:55 +0000
commite541a3f099798e2258116d3c031b35274d789783 (patch)
treea4f51d14629083f331151001d629629af4050284
parentdce61f04503d6730b954b153395cc3f9ce5d7c24 (diff)
QTranslator: Expose language of translation file
This allows for instance to show the current UI language in the UI, or to load additional translations that match the .qm file by other means. This is especially useful in the case of QTranslator::load(QLocale(), ...), in which case different language and country combinations might be tried. Another option is to inspect the file name via QTranslator::filePath(); however, this is more error-prone, and might also miss information (if the .qm file name doesn't have a country suffix, or no suffix at all). Change-Id: I6f565d53d8f50e21241ccae6c4de264747ac8f81 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r--src/corelib/kernel/qtranslator.cpp19
-rw-r--r--src/corelib/kernel/qtranslator.h1
-rw-r--r--tests/auto/corelib/kernel/qtranslator/hellotr_la.qmbin230 -> 237 bytes
-rw-r--r--tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp9
4 files changed, 25 insertions, 4 deletions
diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp
index 822f96c499..2205366696 100644
--- a/src/corelib/kernel/qtranslator.cpp
+++ b/src/corelib/kernel/qtranslator.cpp
@@ -283,7 +283,7 @@ class QTranslatorPrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QTranslator)
public:
- enum { Contexts = 0x2f, Hashes = 0x42, Messages = 0x69, NumerusRules = 0x88, Dependencies = 0x96 };
+ enum { Contexts = 0x2f, Hashes = 0x42, Messages = 0x69, NumerusRules = 0x88, Dependencies = 0x96, Language = 0xa7 };
QTranslatorPrivate() :
#if defined(QT_USE_MMAP)
@@ -316,6 +316,7 @@ public:
uint contextLength;
uint numerusRulesLength;
+ QString language;
QString filePath;
bool do_load(const QString &filename, const QString &directory);
@@ -833,7 +834,9 @@ bool QTranslatorPrivate::do_load(const uchar *data, qsizetype len, const QString
break;
}
- if (tag == QTranslatorPrivate::Contexts) {
+ if (tag == QTranslatorPrivate::Language) {
+ language = QString::fromUtf8((const char*)data, blockLen);
+ } else if (tag == QTranslatorPrivate::Contexts) {
contextArray = data;
contextLength = blockLen;
} else if (tag == QTranslatorPrivate::Hashes) {
@@ -1095,6 +1098,7 @@ void QTranslatorPrivate::clear()
qDeleteAll(subTranslators);
subTranslators.clear();
+ language.clear();
filePath.clear();
if (QCoreApplicationPrivate::isTranslatorInstalled(q))
@@ -1141,6 +1145,17 @@ bool QTranslator::isEmpty() const
/*!
\since 5.15
+ Returns the target language as stored in the translation file.
+ */
+QString QTranslator::language() const
+{
+ Q_D(const QTranslator);
+ return d->language;
+}
+
+/*!
+ \since 5.15
+
Returns the path of the loaded translation file.
The file path is empty if no translation was loaded yet,
diff --git a/src/corelib/kernel/qtranslator.h b/src/corelib/kernel/qtranslator.h
index 0c6efbbc7f..61a39c4089 100644
--- a/src/corelib/kernel/qtranslator.h
+++ b/src/corelib/kernel/qtranslator.h
@@ -63,6 +63,7 @@ public:
virtual bool isEmpty() const;
+ QString language() const;
QString filePath() const;
bool load(const QString & filename,
diff --git a/tests/auto/corelib/kernel/qtranslator/hellotr_la.qm b/tests/auto/corelib/kernel/qtranslator/hellotr_la.qm
index cc42afe05c..25c0aad583 100644
--- a/tests/auto/corelib/kernel/qtranslator/hellotr_la.qm
+++ b/tests/auto/corelib/kernel/qtranslator/hellotr_la.qm
Binary files differ
diff --git a/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp b/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp
index cc0f97139f..9fde7da816 100644
--- a/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp
+++ b/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp
@@ -110,9 +110,10 @@ void tst_QTranslator::load_data()
QTest::addColumn<QString>("filepath");
QTest::addColumn<bool>("isEmpty");
QTest::addColumn<QString>("translation");
+ QTest::addColumn<QString>("language");
- QTest::newRow("hellotr_la") << "hellotr_la.qm" << false << "Hallo Welt!";
- QTest::newRow("hellotr_empty") << "hellotr_empty.qm" << true << "";
+ QTest::newRow("hellotr_la") << "hellotr_la.qm" << false << "Hallo Welt!" << "de";
+ QTest::newRow("hellotr_empty") << "hellotr_empty.qm" << true << "" << "";
}
void tst_QTranslator::load()
@@ -120,6 +121,7 @@ void tst_QTranslator::load()
QFETCH(QString, filepath);
QFETCH(bool, isEmpty);
QFETCH(QString, translation);
+ QFETCH(QString, language);
{
QTranslator tor;
@@ -127,6 +129,7 @@ void tst_QTranslator::load()
QCOMPARE(tor.isEmpty(), isEmpty);
QCOMPARE(tor.translate("QPushButton", "Hello world!"), translation);
QCOMPARE(tor.filePath(), filepath);
+ QCOMPARE(tor.language(), language);
}
{
@@ -138,6 +141,7 @@ void tst_QTranslator::load()
QCOMPARE(tor.isEmpty(), isEmpty);
QCOMPARE(tor.translate("QPushButton", "Hello world!"), translation);
QCOMPARE(tor.filePath(), "");
+ QCOMPARE(tor.language(), language);
}
{
@@ -147,6 +151,7 @@ void tst_QTranslator::load()
QCOMPARE(tor.isEmpty(), isEmpty);
QCOMPARE(tor.translate("QPushButton", "Hello world!"), translation);
QCOMPARE(tor.filePath(), path);
+ QCOMPARE(tor.language(), language);
}
}