summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkh1 <karsten.heimrich@digia.com>2013-06-17 12:40:23 +0200
committerKai Koehne <kai.koehne@digia.com>2013-06-26 11:55:19 +0200
commit5e5c0a10ff9b4cd4f2b1cfdec4f976861b1de160 (patch)
tree756d4870a32bf4dfb75d93ee9b9802e4486b5ba8
parent61ffbff8ab9fcdf8bbc73ee00fb9db7f40e0182b (diff)
Implement dedicated translation settings support.
Change-Id: I41dd23f01e9b511c217fee7f736d9187b8a8623a Reviewed-by: Niels Weber <niels.weber@digia.com> Reviewed-by: Tim Jenssen <tim.jenssen@digia.com> Reviewed-by: Kai Koehne <kai.koehne@digia.com>
-rw-r--r--doc/installerfw.qdoc6
-rw-r--r--src/libs/installer/component.cpp19
-rw-r--r--src/libs/installer/settings.cpp40
-rw-r--r--src/libs/installer/settings.h4
-rw-r--r--src/sdk/installerbase.cpp59
-rw-r--r--tests/auto/installer/settings/data/full_config.xml5
-rw-r--r--tests/auto/installer/settings/tst_settings.cpp2
7 files changed, 103 insertions, 32 deletions
diff --git a/doc/installerfw.qdoc b/doc/installerfw.qdoc
index 355021862..5b527d03c 100644
--- a/doc/installerfw.qdoc
+++ b/doc/installerfw.qdoc
@@ -260,6 +260,12 @@
\row
\o TargetConfigurationFile
\o Filename for the configuration file on the target. Default is components.xml.
+ \row
+ \o Translations
+ \o List of language codes to be used for translating the user interface. To add several language
+ variants, specify several Translation sections that each specify the name of a language
+ variant. Optional. For more information, see \l{Translating Pages}.
+
\endtable
*/
diff --git a/src/libs/installer/component.cpp b/src/libs/installer/component.cpp
index 705fb6d3c..c2cadafc6 100644
--- a/src/libs/installer/component.cpp
+++ b/src/libs/installer/component.cpp
@@ -46,8 +46,9 @@
#include "fsengineclient.h"
#include "globals.h"
#include "lib7z_facade.h"
-#include "packagemanagercore.h"
#include "messageboxhandler.h"
+#include "packagemanagercore.h"
+#include "settings.h"
#include <kdupdaterupdatesourcesinfo.h>
#include <kdupdaterupdateoperationfactory.h>
@@ -516,10 +517,22 @@ void Component::languageChanged()
void Component::loadTranslations(const QDir &directory, const QStringList &qms)
{
QDirIterator it(directory.path(), qms, QDir::Files);
+ const QStringList translations = d->m_core->settings().translations();
+ const QString uiLanguage = QLocale().uiLanguages().value(0, QLatin1String("en_us"))
+ .replace(QLatin1Char('-'), QLatin1Char('_'));
while (it.hasNext()) {
const QString filename = it.next();
- if (QFileInfo(filename).baseName().toLower() != QLocale().name().toLower())
- continue;
+ const QString basename = QFileInfo(filename).baseName();
+ if (!uiLanguage.startsWith(QFileInfo(filename).baseName(), Qt::CaseInsensitive))
+ continue; // do not load the file if it does not match the UI language
+
+ if (!translations.isEmpty()) {
+ bool found = false;
+ foreach (const QString &translation, translations)
+ found |= translation.startsWith(basename, Qt::CaseInsensitive);
+ if (!found) // don't load the file if it does match the UI language but is not allowed to be used
+ continue;
+ }
QScopedPointer<QTranslator> translator(new QTranslator(this));
if (!translator->load(filename))
diff --git a/src/libs/installer/settings.cpp b/src/libs/installer/settings.cpp
index 8ef248db8..d8f409f46 100644
--- a/src/libs/installer/settings.cpp
+++ b/src/libs/installer/settings.cpp
@@ -67,6 +67,7 @@ static const QLatin1String scTmpRepositories("TemporaryRepositories");
static const QLatin1String scUninstallerIniFile("UninstallerIniFile");
static const QLatin1String scRemoteRepositories("RemoteRepositories");
static const QLatin1String scDependsOnLocalInstallerBinary("DependsOnLocalInstallerBinary");
+static const QLatin1String scTranslations("Translations");
static const QLatin1String scFtpProxy("FtpProxy");
static const QLatin1String scHttpProxy("HttpProxy");
@@ -97,6 +98,25 @@ static void raiseError(QXmlStreamReader &reader, const QString &error, Settings:
}
}
+static QStringList readTranslations(QXmlStreamReader &reader, Settings::ParseMode parseMode)
+{
+ QStringList translations;
+ while (reader.readNextStartElement()) {
+ if (reader.name() == QLatin1String("Translation")) {
+ translations.append(reader.readElementText().toLower());
+ } else {
+ raiseError(reader, QString::fromLatin1("Unexpected element '%1'.").arg(reader.name().toString()),
+ parseMode);
+ }
+
+ if (!reader.attributes().isEmpty()) {
+ raiseError(reader, QString::fromLatin1("Unexpected attribute for element '%1'.").arg(reader
+ .name().toString()), parseMode);
+ }
+ }
+ return translations;
+}
+
static QSet<Repository> readRepositories(QXmlStreamReader &reader, bool isDefault, Settings::ParseMode parseMode)
{
QSet<Repository> set;
@@ -212,7 +232,7 @@ Settings Settings::fromFileAndPrefix(const QString &path, const QString &prefix,
<< scDependsOnLocalInstallerBinary
<< scAllowSpaceInPath << scAllowNonAsciiCharacters
<< scRepositorySettingsPageVisible << scTargetConfigurationFile
- << scRemoteRepositories;
+ << scRemoteRepositories << scTranslations;
Settings s;
s.d->m_data.insert(scPrefix, prefix);
@@ -232,7 +252,9 @@ Settings Settings::fromFileAndPrefix(const QString &path, const QString &prefix,
if (s.d->m_data.contains(name))
reader.raiseError(QString::fromLatin1("Element '%1' has been defined before.").arg(name));
- if (name == scRemoteRepositories) {
+ if (name == scTranslations) {
+ s.setTranslations(readTranslations(reader, parseMode));
+ } else if (name == scRemoteRepositories) {
s.addDefaultRepositories(readRepositories(reader, true, parseMode));
} else {
s.d->m_data.insert(name, reader.readElementText(QXmlStreamReader::SkipChildElements));
@@ -576,3 +598,17 @@ void Settings::setHttpProxy(const QNetworkProxy &proxy)
{
d->m_data.insert(scHttpProxy, QVariant::fromValue(proxy));
}
+
+QStringList Settings::translations() const
+{
+ const QVariant variant = d->m_data.values(scTranslations);
+ if (variant.canConvert<QStringList>())
+ return variant.value<QStringList>();
+ return QStringList();
+}
+
+void Settings::setTranslations(const QStringList &translations)
+{
+ d->m_data.remove(scTranslations);
+ d->m_data.insert(scTranslations, translations);
+}
diff --git a/src/libs/installer/settings.h b/src/libs/installer/settings.h
index 277264f79..85a2ea68e 100644
--- a/src/libs/installer/settings.h
+++ b/src/libs/installer/settings.h
@@ -47,6 +47,7 @@
#include <QtCore/QCoreApplication>
#include <QtCore/QSharedDataPointer>
+#include <QtCore/QStringList>
#include <QtCore/QVariant>
#include <QtNetwork/QNetworkProxy>
@@ -151,6 +152,9 @@ public:
QNetworkProxy httpProxy() const;
void setHttpProxy(const QNetworkProxy &proxy);
+ QStringList translations() const;
+ void setTranslations(const QStringList &translations);
+
private:
class Private;
QSharedDataPointer<Private> d;
diff --git a/src/sdk/installerbase.cpp b/src/sdk/installerbase.cpp
index 7aeb7fa82..71f45301e 100644
--- a/src/sdk/installerbase.cpp
+++ b/src/sdk/installerbase.cpp
@@ -248,37 +248,11 @@ int main(int argc, char *argv[])
QInstaller::setVerbose(true);
}
- // install the default translator
- const QString localeFile =
- QString::fromLatin1(":/translations/qt_%1").arg(QLocale::system().name());
- {
- QTranslator* const translator = new QTranslator(&app);
- translator->load(localeFile);
- app.installTranslator(translator);
- }
-
- // install English translation as fallback so that correct license button text is used
- const QString enLocaleFile = QString::fromLatin1(":/translations/en_us.qm");
- if (QFile::exists(enLocaleFile)) {
- QTranslator* const translator = new QTranslator(&app);
- translator->load(enLocaleFile);
- app.installTranslator(translator);
- }
-
- // install "our" default translator
- const QString ourLocaleFile =
- QString::fromLatin1(":/translations/%1.qm").arg(QLocale().name().toLower());
- if (QFile::exists(ourLocaleFile)) {
- QTranslator* const translator = new QTranslator(&app);
- translator->load(ourLocaleFile);
- app.installTranslator(translator);
- }
-
if (QInstaller::isVerbose()) {
qDebug() << VERSION;
qDebug() << "Arguments:" << args;
- qDebug() << "Language: " << QLocale().name().toLower();
qDebug() << "Resource tree before loading the in-binary resource:";
+ qDebug() << "Language: " << QLocale().uiLanguages().value(0, QLatin1String("No UI language set"));
QDir dir(QLatin1String(":/"));
foreach (const QString &i, dir.entryList()) {
@@ -332,6 +306,37 @@ int main(int argc, char *argv[])
dir = QDir(QLatin1String(":/metadata/"));
foreach (const QString &i, dir.entryList())
qDebug() << QString::fromLatin1(" :/metadata/%1").arg(i);
+
+ dir = QDir(QLatin1String(":/translations/"));
+ foreach (const QString &i, dir.entryList())
+ qDebug() << QString::fromLatin1(" :/translations/%1").arg(i);
+ }
+
+ const QString directory = QLatin1String(":/translations");
+ const QStringList translations = core.settings().translations();
+
+ // install the default Qt translator
+ QScopedPointer<QTranslator> translator(new QTranslator(&app));
+ if (translator->load(QLocale(), QLatin1String("qt"), QString::fromLatin1("_"), directory))
+ app.installTranslator(translator.take());
+
+ translator.reset(new QTranslator(&app));
+ // install English translation as fallback so that correct license button text is used
+ if (translator->load(QLatin1String("en_us"), directory))
+ app.installTranslator(translator.take());
+
+ if (translations.isEmpty()) {
+ translator.reset(new QTranslator(&app));
+ const QString name = QLocale().uiLanguages().value(0).replace(QLatin1Char('-'), QLatin1Char('_'))
+ .toLower(); // install "our" default translator
+ if (translator->load(name, directory))
+ app.installTranslator(translator.take());
+ } else {
+ foreach (const QString &translation, translations) {
+ translator.reset(new QTranslator(&app));
+ if (translator->load(translation, QLatin1String(":/translations")))
+ app.installTranslator(translator.take());
+ }
}
QString controlScript;
diff --git a/tests/auto/installer/settings/data/full_config.xml b/tests/auto/installer/settings/data/full_config.xml
index 4e1b82c8a..0386f98c1 100644
--- a/tests/auto/installer/settings/data/full_config.xml
+++ b/tests/auto/installer/settings/data/full_config.xml
@@ -46,4 +46,9 @@ File should contain all elements we allow in a config.xml
<Password>password</Password>
</Repository>
</RemoteRepositories>
+
+ <Translations>
+ <Translation>de_de</Translation>
+ <Translation>qt_de</Translation>
+ </Translations>
</Installer>
diff --git a/tests/auto/installer/settings/tst_settings.cpp b/tests/auto/installer/settings/tst_settings.cpp
index e5973ad6a..e6ebc6e6e 100644
--- a/tests/auto/installer/settings/tst_settings.cpp
+++ b/tests/auto/installer/settings/tst_settings.cpp
@@ -76,6 +76,8 @@ void tst_Settings::loadTutorialConfig()
QCOMPARE(settings.proxyType(), Settings::NoProxy);
QCOMPARE(settings.ftpProxy(), QNetworkProxy());
QCOMPARE(settings.httpProxy(), QNetworkProxy());
+
+ QCOMPARE(settings.translations(), QStringList());
}
void tst_Settings::loadFullConfig()