diff options
author | kh1 <karsten.heimrich@digia.com> | 2013-06-17 12:40:23 +0200 |
---|---|---|
committer | Kai Koehne <kai.koehne@digia.com> | 2013-06-26 11:55:19 +0200 |
commit | 5e5c0a10ff9b4cd4f2b1cfdec4f976861b1de160 (patch) | |
tree | 756d4870a32bf4dfb75d93ee9b9802e4486b5ba8 | |
parent | 61ffbff8ab9fcdf8bbc73ee00fb9db7f40e0182b (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.qdoc | 6 | ||||
-rw-r--r-- | src/libs/installer/component.cpp | 19 | ||||
-rw-r--r-- | src/libs/installer/settings.cpp | 40 | ||||
-rw-r--r-- | src/libs/installer/settings.h | 4 | ||||
-rw-r--r-- | src/sdk/installerbase.cpp | 59 | ||||
-rw-r--r-- | tests/auto/installer/settings/data/full_config.xml | 5 | ||||
-rw-r--r-- | tests/auto/installer/settings/tst_settings.cpp | 2 |
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() |