Allow external translation files
authorManuel Nickschas <sputnick@quassel-irc.org>
Sun, 25 Jan 2009 01:42:20 +0000 (02:42 +0100)
committerManuel Nickschas <sputnick@quassel-irc.org>
Sun, 25 Jan 2009 01:45:25 +0000 (02:45 +0100)
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
src/common/quassel.cpp
src/common/quassel.h
src/common/util.cpp
src/common/util.h
src/core/core.cpp
src/qtui/qtui.cpp
src/qtui/settingspages/appearancesettingspage.cpp

index b174bed..8f08cbf 100644 (file)
@@ -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)
 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})
 endif(EMBED_DATA)
 
 add_custom_target(i18n DEPENDS ${qm_files})
index 5444979..35c674b 100644 (file)
@@ -25,9 +25,9 @@
 #include <QCoreApplication>
 #include <QDateTime>
 #include <QFileInfo>
 #include <QCoreApplication>
 #include <QDateTime>
 #include <QFileInfo>
-#include <QMetaType>
-#include <QObject>
+#include <QLibraryInfo>
 #include <QSettings>
 #include <QSettings>
+#include <QTranslator>
 
 #include "message.h"
 #include "identity.h"
 
 #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;
 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;
 QStringList Quassel::_dataDirPaths;
 bool Quassel::_initialized = false;
 bool Quassel::DEBUG = false;
@@ -334,3 +335,42 @@ QString Quassel::findDataFilePath(const QString &fileName) {
   }
   return QString();
 }
   }
   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<QTranslator *>("QtTr");
+  QTranslator *quasselTranslator = QCoreApplication::instance()->findChild<QTranslator *>("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);
+}
index 9492ec6..2094995 100644 (file)
@@ -22,6 +22,7 @@
 #define QUASSEL_H_
 
 #include <QCoreApplication>
 #define QUASSEL_H_
 
 #include <QCoreApplication>
+#include <QLocale>
 #include <QString>
 
 #include "abstractcliparser.h"
 #include <QString>
 
 #include "abstractcliparser.h"
@@ -81,6 +82,8 @@ public:
   */
   static QString findDataFilePath(const QString &filename);
 
   */
   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);
   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 _coreDumpFileName;
   static QString _configDirPath;
   static QStringList _dataDirPaths;
+  static QString _translationDirPath;
 };
 
 const Quassel::BuildInfo & Quassel::buildInfo() { return _buildInfo; }
 };
 
 const Quassel::BuildInfo & Quassel::buildInfo() { return _buildInfo; }
index 4698b30..9bc24bc 100644 (file)
@@ -23,9 +23,7 @@
 #include <QCoreApplication>
 #include <QDebug>
 #include <QFile>
 #include <QCoreApplication>
 #include <QDebug>
 #include <QFile>
-#include <QLibraryInfo>
 #include <QTextCodec>
 #include <QTextCodec>
-#include <QTranslator>
 
 #include "quassel.h"
 
 
 #include "quassel.h"
 
@@ -126,32 +124,6 @@ uint editingDistance(const QString &s1, const QString &s2) {
   return matrix[n-1][m-1];
 }
 
   return matrix[n-1][m-1];
 }
 
-void loadTranslation(const QLocale &locale) {
-  QTranslator *qtTranslator = QCoreApplication::instance()->findChild<QTranslator *>("QtTr");
-  QTranslator *quasselTranslator = QCoreApplication::instance()->findChild<QTranslator *>("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<int, QString> > timeUnit;
     timeUnit.append(qMakePair(365*24*60*60, QCoreApplication::translate("Quassel::secondsToString()", "year")));
 QString secondsToString(int timeInSeconds) {
     QList< QPair<int, QString> > timeUnit;
     timeUnit.append(qMakePair(365*24*60*60, QCoreApplication::translate("Quassel::secondsToString()", "year")));
index 66a36e2..99032e9 100644 (file)
@@ -22,7 +22,6 @@
 #define UTIL_H
 
 #include <QDir>
 #define UTIL_H
 
 #include <QDir>
-#include <QLocale>
 #include <QVariant>
 #include <QString>
 #include <QMetaMethod>
 #include <QVariant>
 #include <QString>
 #include <QMetaMethod>
@@ -50,8 +49,6 @@ QString decodeString(const QByteArray &input, QTextCodec *codec = 0);
 
 uint editingDistance(const QString &s1, const QString &s2);
 
 
 uint editingDistance(const QString &s1, const QString &s2);
 
-void loadTranslation(const QLocale &locale);
-
 template<typename T>
 QVariantList toVariantList(const QList<T> &list) {
   QVariantList variants;
 template<typename T>
 QVariantList toVariantList(const QList<T> &list) {
   QVariantList variants;
index aa4f692..92e0908 100644 (file)
@@ -18,8 +18,6 @@
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
 
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
 
-#include <QMetaObject>
-#include <QMetaMethod>
 #include <QCoreApplication>
 
 #include "core.h"
 #include <QCoreApplication>
 
 #include "core.h"
@@ -53,7 +51,7 @@ void Core::destroy() {
 Core::Core() : storage(0) {
   _startTime = QDateTime::currentDateTime().toUTC();  // for uptime :)
 
 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
 
   // FIXME: MIGRATION 0.3 -> 0.4: Move database and core config to new location
   // Move settings, note this does not delete the old files
index ba8d18d..979ebe4 100644 (file)
@@ -48,7 +48,7 @@ QtUi::QtUi() : AbstractUi() {
   _actionProvider = new NetworkModelActionProvider(this);
 
   QtUiSettings uiSettings;
   _actionProvider = new NetworkModelActionProvider(this);
 
   QtUiSettings uiSettings;
-  loadTranslation(uiSettings.value("Locale", QLocale::system()).value<QLocale>());
+  Quassel::loadTranslation(uiSettings.value("Locale", QLocale::system()).value<QLocale>());
 
   _mainWin = new MainWin();
   _style = new QtUiStyle;
 
   _mainWin = new MainWin();
   _style = new QtUiStyle;
index 7c4551d..23fdb8a 100644 (file)
@@ -90,7 +90,7 @@ void AppearanceSettingsPage::load() {
     ui.languageComboBox->setCurrentIndex(1);
   else
     ui.languageComboBox->setCurrentIndex(ui.languageComboBox->findText(QLocale::languageToString(locale.language()), Qt::MatchExactly));
     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());
 
   ChatViewSettings chatViewSettings;
   SettingsPage::load(ui.showWebPreview, chatViewSettings.showWebPreview());