X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fquassel.cpp;h=08652abe1ebb17db50097635ef76f1913ae23847;hp=bf0cbee32b3406e5cb800ab923779cfa1b2be152;hb=ace46ddca3818d63d8de9ff481038bda8f5cf982;hpb=894e9b60a395efdbacf8a2f8b0dc138464366191 diff --git a/src/common/quassel.cpp b/src/common/quassel.cpp index bf0cbee3..08652abe 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; @@ -59,7 +60,6 @@ Quassel::Quassel() { signal(SIGBUS, handleSignal); # endif #endif - } Quassel::~Quassel() { @@ -218,7 +218,8 @@ void Quassel::logFatalMessage(const char *msg) { const QString &Quassel::coreDumpFileName() { if(_coreDumpFileName.isEmpty()) { - _coreDumpFileName = QString("Quassel-Crash-%1.log").arg(QDateTime::currentDateTime().toString("yyyyMMdd-hhmm")); + QDir configDir(configDirPath()); + _coreDumpFileName = configDir.absoluteFilePath(QString("Quassel-Crash-%1.log").arg(QDateTime::currentDateTime().toString("yyyyMMdd-hhmm"))); QFile dumpFile(_coreDumpFileName); dumpFile.open(QIODevice::Append); QTextStream dumpStream(&dumpFile); @@ -241,19 +242,24 @@ QString Quassel::configDirPath() { _configDirPath = Quassel::optionValue("configdir"); } else { - // We abuse QSettings to find us a sensible path on all platforms -#ifdef Q_WS_WIN +#ifdef Q_WS_MAC + // On Mac, the path is always the same + _configDirPath = QDir::homePath() + "/Library/Application Support/Quassel/"; +#else + // We abuse QSettings to find us a sensible path on the other platforms +# ifdef Q_WS_WIN // don't use the registry QSettings::Format format = QSettings::IniFormat; -#else +# else QSettings::Format format = QSettings::NativeFormat; -#endif +# endif QSettings s(format, QSettings::UserScope, QCoreApplication::organizationDomain(), buildInfo().applicationName); QFileInfo fileInfo(s.fileName()); _configDirPath = fileInfo.dir().absolutePath(); +#endif /* Q_WS_MAC */ } - if(!_configDirPath.endsWith(QDir::separator())) + if(!_configDirPath.endsWith(QDir::separator()) && !_configDirPath.endsWith('/')) _configDirPath += QDir::separator(); QDir qDir(_configDirPath); @@ -279,30 +285,44 @@ QStringList Quassel::findDataDirPaths() const { dataDirNames[i].append("/apps/quassel/"); } else { // Provide a fallback - // FIXME fix this for win and mac! #ifdef Q_OS_WIN32 - dataDirNames << qgetenv("APPDATA") + "/quassel/" + dataDirNames << qgetenv("APPDATA") + QCoreApplication::organizationDomain() + "/share/apps/quassel/" + << qgetenv("APPDATA") + QCoreApplication::organizationDomain() << QCoreApplication::applicationDirPath(); + } #elif defined Q_WS_MAC dataDirNames << QDir::homePath() + "/Library/Application Support/Quassel/" << QCoreApplication::applicationDirPath(); + } #else - if(dataDirNames.isEmpty()) - dataDirNames.append("/usr/share/apps/quassel/"); - // on UNIX, we always check our install prefix - QString appDir = QCoreApplication::applicationDirPath(); - int binpos = appDir.lastIndexOf("/bin"); - if(binpos >= 0) { - appDir.replace(binpos, 4, "/share"); - appDir.append("/apps/quassel/"); - if(!dataDirNames.contains(appDir)) - dataDirNames.append(appDir); - } + dataDirNames.append("/usr/share/apps/quassel/"); + } + // on UNIX, we always check our install prefix + QString appDir = QCoreApplication::applicationDirPath(); + int binpos = appDir.lastIndexOf("/bin"); + if(binpos >= 0) { + appDir.replace(binpos, 4, "/share"); + appDir.append("/apps/quassel/"); + if(!dataDirNames.contains(appDir)) + dataDirNames.append(appDir); + } #endif + + // add resource path and workdir just in case + dataDirNames << QCoreApplication::applicationDirPath() + "/data/" + << ":/data/"; + + // append trailing '/' and check for existence + QStringList::Iterator iter = dataDirNames.begin(); + while(iter != dataDirNames.end()) { + if(!iter->endsWith(QDir::separator()) && !iter->endsWith('/')) + iter->append(QDir::separator()); + if(!QFile::exists(*iter)) + iter = dataDirNames.erase(iter); + else + ++iter; } - // add resource path just in case - dataDirNames << ":/data/"; return dataDirNames; } @@ -315,3 +335,52 @@ QString Quassel::findDataFilePath(const QString &fileName) { } return QString(); } + +QStringList Quassel::scriptDirPaths() { + QStringList res(configDirPath() + "scripts/"); + foreach(QString path, dataDirPaths()) + res << path + "scripts/"; + return res; +} + +QString Quassel::translationDirPath() { + if(_translationDirPath.isEmpty()) { + // We support only one translation dir; fallback mechanisms wouldn't work else. + // This means that if we have a $data/translations 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/"; + } + return _translationDirPath; +} + +void Quassel::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("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()); +}