From 8ec4a861065b8a037ea6af58b2916800007ed61f Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Sun, 25 Jan 2009 02:42:20 +0100 Subject: [PATCH] Allow external translation files Quassel will now check its data dirs (usually $prefix/share/apps/quassel) for a directory named "translations". If this is found, translation files will be looked for in this directory *only*. This means, that Quassel won't look in :/i18n then. Keeping .qm files in $prefix/share/apps/quassel/translations allows for providing language packs easily. Also, we move loadTranslation() from util.cpp to Quassel::loadTranslation(). --- i18n/CMakeLists.txt | 2 +- src/common/quassel.cpp | 44 ++++++++++++++++++- src/common/quassel.h | 4 ++ src/common/util.cpp | 28 ------------ src/common/util.h | 3 -- src/core/core.cpp | 4 +- src/qtui/qtui.cpp | 2 +- .../settingspages/appearancesettingspage.cpp | 2 +- 8 files changed, 50 insertions(+), 39 deletions(-) diff --git a/i18n/CMakeLists.txt b/i18n/CMakeLists.txt index b174bed7..8f08cbff 100644 --- a/i18n/CMakeLists.txt +++ b/i18n/CMakeLists.txt @@ -43,7 +43,7 @@ set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${qm_files} i18 if(EMBED_DATA) set(COMMON_RCS ${COMMON_RCS} ${resfile} PARENT_SCOPE) else(EMBED_DATA) - install(FILES ${qm_files} DESTINATION ${DATA_INSTALL_DIR}/quassel/i18n) + install(FILES ${qm_files} DESTINATION ${DATA_INSTALL_DIR}/quassel/translations) endif(EMBED_DATA) add_custom_target(i18n DEPENDS ${qm_files}) diff --git a/src/common/quassel.cpp b/src/common/quassel.cpp index 5444979e..35c674b0 100644 --- a/src/common/quassel.cpp +++ b/src/common/quassel.cpp @@ -25,9 +25,9 @@ #include #include #include -#include -#include +#include #include +#include #include "message.h" #include "identity.h" @@ -40,6 +40,7 @@ Quassel::BuildInfo Quassel::_buildInfo; AbstractCliParser *Quassel::_cliParser = 0; Quassel::RunMode Quassel::_runMode; QString Quassel::_configDirPath; +QString Quassel::_translationDirPath; QStringList Quassel::_dataDirPaths; bool Quassel::_initialized = false; bool Quassel::DEBUG = false; @@ -334,3 +335,42 @@ QString Quassel::findDataFilePath(const QString &fileName) { } return QString(); } + +void Quassel::loadTranslation(const QLocale &locale) { + if(_translationDirPath.isEmpty()) { + // We support only one translation dir; fallback mechanisms wouldn't work else. + // This means that if we have a $data/i18n dir, the internal :/i18n resource won't be considered. + foreach(const QString &dir, dataDirPaths()) { + if(QFile::exists(dir + "translations/")) { + _translationDirPath = dir + "translations/"; + break; + } + } + if(_translationDirPath.isEmpty()) + _translationDirPath = ":/i18n/"; + } + + QTranslator *qtTranslator = QCoreApplication::instance()->findChild("QtTr"); + QTranslator *quasselTranslator = QCoreApplication::instance()->findChild("QuasselTr"); + + if(!qtTranslator) { + qtTranslator = new QTranslator(qApp); + qtTranslator->setObjectName("QtTr"); + qApp->installTranslator(qtTranslator); + } + if(!quasselTranslator) { + quasselTranslator = new QTranslator(qApp); + quasselTranslator->setObjectName("QuasselTr"); + qApp->installTranslator(quasselTranslator); + } + + QLocale::setDefault(locale); + + if(locale.language() == QLocale::C) + return; + + bool success = qtTranslator->load(QString("qt_%1").arg(locale.name()), _translationDirPath); + if(!success) + qtTranslator->load(QString("qt_%1").arg(locale.name()), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); + quasselTranslator->load(QString("quassel_%1").arg(locale.name()), _translationDirPath); +} diff --git a/src/common/quassel.h b/src/common/quassel.h index 9492ec6b..20949951 100644 --- a/src/common/quassel.h +++ b/src/common/quassel.h @@ -22,6 +22,7 @@ #define QUASSEL_H_ #include +#include #include #include "abstractcliparser.h" @@ -81,6 +82,8 @@ public: */ static QString findDataFilePath(const QString &filename); + static void loadTranslation(const QLocale &locale); + static inline void setCliParser(AbstractCliParser *cliParser); static inline AbstractCliParser *cliParser(); static inline QString optionValue(const QString &option); @@ -114,6 +117,7 @@ private: static QString _coreDumpFileName; static QString _configDirPath; static QStringList _dataDirPaths; + static QString _translationDirPath; }; const Quassel::BuildInfo & Quassel::buildInfo() { return _buildInfo; } diff --git a/src/common/util.cpp b/src/common/util.cpp index 4698b30d..9bc24bc1 100644 --- a/src/common/util.cpp +++ b/src/common/util.cpp @@ -23,9 +23,7 @@ #include #include #include -#include #include -#include #include "quassel.h" @@ -126,32 +124,6 @@ uint editingDistance(const QString &s1, const QString &s2) { return matrix[n-1][m-1]; } -void loadTranslation(const QLocale &locale) { - QTranslator *qtTranslator = QCoreApplication::instance()->findChild("QtTr"); - QTranslator *quasselTranslator = QCoreApplication::instance()->findChild("QuasselTr"); - - if(!qtTranslator) { - qtTranslator = new QTranslator(qApp); - qtTranslator->setObjectName("QtTr"); - qApp->installTranslator(qtTranslator); - } - if(!quasselTranslator) { - quasselTranslator = new QTranslator(qApp); - quasselTranslator->setObjectName("QuasselTr"); - qApp->installTranslator(quasselTranslator); - } - - QLocale::setDefault(locale); - - if(locale.language() == QLocale::C) - return; - - bool success = qtTranslator->load(QString(":i18n/qt_%1").arg(locale.name())); - if(!success) - qtTranslator->load(QString("%2/qt_%1").arg(locale.name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath))); - quasselTranslator->load(QString(":i18n/quassel_%1").arg(locale.name())); -} - QString secondsToString(int timeInSeconds) { QList< QPair > timeUnit; timeUnit.append(qMakePair(365*24*60*60, QCoreApplication::translate("Quassel::secondsToString()", "year"))); diff --git a/src/common/util.h b/src/common/util.h index 66a36e2b..99032e99 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -22,7 +22,6 @@ #define UTIL_H #include -#include #include #include #include @@ -50,8 +49,6 @@ QString decodeString(const QByteArray &input, QTextCodec *codec = 0); uint editingDistance(const QString &s1, const QString &s2); -void loadTranslation(const QLocale &locale); - template QVariantList toVariantList(const QList &list) { QVariantList variants; diff --git a/src/core/core.cpp b/src/core/core.cpp index aa4f692f..92e0908d 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -18,8 +18,6 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include -#include #include #include "core.h" @@ -53,7 +51,7 @@ void Core::destroy() { Core::Core() : storage(0) { _startTime = QDateTime::currentDateTime().toUTC(); // for uptime :) - loadTranslation(QLocale::system()); + Quassel::loadTranslation(QLocale::system()); // FIXME: MIGRATION 0.3 -> 0.4: Move database and core config to new location // Move settings, note this does not delete the old files diff --git a/src/qtui/qtui.cpp b/src/qtui/qtui.cpp index ba8d18d9..979ebe4c 100644 --- a/src/qtui/qtui.cpp +++ b/src/qtui/qtui.cpp @@ -48,7 +48,7 @@ QtUi::QtUi() : AbstractUi() { _actionProvider = new NetworkModelActionProvider(this); QtUiSettings uiSettings; - loadTranslation(uiSettings.value("Locale", QLocale::system()).value()); + Quassel::loadTranslation(uiSettings.value("Locale", QLocale::system()).value()); _mainWin = new MainWin(); _style = new QtUiStyle; diff --git a/src/qtui/settingspages/appearancesettingspage.cpp b/src/qtui/settingspages/appearancesettingspage.cpp index 7c4551dc..23fdb8a3 100644 --- a/src/qtui/settingspages/appearancesettingspage.cpp +++ b/src/qtui/settingspages/appearancesettingspage.cpp @@ -90,7 +90,7 @@ void AppearanceSettingsPage::load() { ui.languageComboBox->setCurrentIndex(1); else ui.languageComboBox->setCurrentIndex(ui.languageComboBox->findText(QLocale::languageToString(locale.language()), Qt::MatchExactly)); - loadTranslation(selectedLocale()); + Quassel::loadTranslation(selectedLocale()); ChatViewSettings chatViewSettings; SettingsPage::load(ui.showWebPreview, chatViewSettings.showWebPreview()); -- 2.20.1