aboutsummaryrefslogtreecommitdiff
path: root/modules
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
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')
-rw-r--r--modules/ECMCreateQmFromPoFiles.cmake2
-rw-r--r--modules/ECMQmLoader.cpp.in24
2 files changed, 15 insertions, 11 deletions
diff --git a/modules/ECMCreateQmFromPoFiles.cmake b/modules/ECMCreateQmFromPoFiles.cmake
index 3da31940..f331460d 100644
--- a/modules/ECMCreateQmFromPoFiles.cmake
+++ b/modules/ECMCreateQmFromPoFiles.cmake
@@ -134,7 +134,7 @@ function(_ECM_QM_CREATE_TARGET install_destination catalog_name)
# strings. Finally run lrelease to create the .qm files.
add_custom_command(OUTPUT ${qmfile}
COMMAND ${lconvert_executable}
- ARGS -i ${it} -o ${tsfile}
+ ARGS -i ${it} -o ${tsfile} -target-language ${language}
COMMAND Qt5::lrelease
ARGS -compress -removeidentical -silent ${tsfile} -qm ${qmfile}
DEPENDS ${it}
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)