aboutsummaryrefslogtreecommitdiff
path: root/modules/ECMQmLoader.cpp.in
diff options
context:
space:
mode:
authorAurélien Gâteau <agateau@kde.org>2014-04-22 10:54:03 +0200
committerAurélien Gâteau <agateau@kde.org>2014-04-22 11:00:34 +0200
commite7ca63c7c5a94279a284bbdcdd14e8c6c5597267 (patch)
tree11bc5f7c24b0505c98a7d2e3b2ea24097cf21b6a /modules/ECMQmLoader.cpp.in
parent3c4876ee11c9c8f024ed9ad39f18d88d59773423 (diff)
downloadextra-cmake-modules-e7ca63c7c5a94279a284bbdcdd14e8c6c5597267.tar.gz
extra-cmake-modules-e7ca63c7c5a94279a284bbdcdd14e8c6c5597267.tar.bz2
Improve plural handling for code using Qt translation system
- Always load "en" translation: This way if a plural string is not translated, we fallback to the correct english plural form. - Generate .ts files with correct plural settings REVIEW: 117629
Diffstat (limited to 'modules/ECMQmLoader.cpp.in')
-rw-r--r--modules/ECMQmLoader.cpp.in24
1 files changed, 14 insertions, 10 deletions
diff --git a/modules/ECMQmLoader.cpp.in b/modules/ECMQmLoader.cpp.in
index fd530602..2d8531f3 100644
--- a/modules/ECMQmLoader.cpp.in
+++ b/modules/ECMQmLoader.cpp.in
@@ -10,32 +10,36 @@
#include <QDebug>
-static QTranslator *createTranslator(const QString &localeDirName)
+static bool loadTranslation(const QString &localeDirName)
{
QString subPath = QStringLiteral("locale/") + localeDirName + QStringLiteral("/LC_MESSAGES/@catalog_name@.qm");
QString fullPath = QStandardPaths::locate(QStandardPaths::GenericDataLocation, subPath);
if (fullPath.isEmpty()) {
- return 0;
+ return false;
}
QTranslator *translator = new QTranslator(QCoreApplication::instance());
if (!translator->load(fullPath)) {
delete translator;
- return 0;
+ return false;
}
- return translator;
+ QCoreApplication::instance()->installTranslator(translator);
+ return true;
}
static void load()
{
+ // The way Qt translation system handles plural forms makes it necessary to
+ // have a translation file which contains only plural forms for `en`. That's
+ // why we load the `en` translation unconditionally, then load the
+ // translation for the current locale to overload it.
+ loadTranslation(QStringLiteral("en"));
+
QLocale locale = QLocale::system();
- QTranslator *translator = createTranslator(locale.name());
- if (!translator) {
- translator = createTranslator(locale.bcp47Name());
- if (!translator) {
- return;
+ if (locale.name() != QStringLiteral("en")) {
+ if (!loadTranslation(locale.name())) {
+ loadTranslation(locale.bcp47Name());
}
}
- QCoreApplication::instance()->installTranslator(translator);
}
Q_COREAPP_STARTUP_FUNCTION(load)