diff --git a/CMakeLists.txt b/CMakeLists.txt index 8405086ee..5efa515a9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -363,6 +363,10 @@ set(${PROJECT_NAME}_SOURCES src/persistence/settings.h src/persistence/settingsserializer.cpp src/persistence/settingsserializer.h + src/persistence/globalsettingsupgrader.cpp + src/persistence/globalsettingsupgrader.h + src/persistence/personalsettingsupgrader.cpp + src/persistence/personalsettingsupgrader.h src/persistence/smileypack.cpp src/persistence/smileypack.h src/persistence/toxsave.cpp diff --git a/src/persistence/globalsettingsupgrader.cpp b/src/persistence/globalsettingsupgrader.cpp new file mode 100644 index 000000000..9a816d596 --- /dev/null +++ b/src/persistence/globalsettingsupgrader.cpp @@ -0,0 +1,57 @@ +/* + Copyright © 2022 by The qTox Project Contributors + + This file is part of qTox, a Qt-based graphical interface for Tox. + + qTox is libre software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + qTox is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with qTox. If not, see . +*/ + +#include "globalsettingsupgrader.h" + +#include + +#include + +bool GlobalSettingsUpgrader::doUpgrade(Settings& settings, int fromVer, int toVer) +{ + if (fromVer == toVer) { + return true; + } + + if (fromVer > toVer) { + qWarning().nospace() << "Settings version (" << fromVer + << ") is newer than we currently support (" << toVer + << "). Please upgrade qTox"; + return false; + } + + using SettingsUpgradeFn = bool (*)(Settings&); + std::vector upgradeFns = {}; + + assert(fromVer < static_cast(upgradeFns.size())); + assert(toVer == static_cast(upgradeFns.size())); + + for (int i = fromVer; i < static_cast(upgradeFns.size()); ++i) { + auto const newSettingsVersion = i + 1; + if (!upgradeFns[i](settings)) { + qCritical() << "Failed to upgrade settings to version " << newSettingsVersion << " aborting"; + return false; + } + qDebug() << "Settings upgraded incrementally to schema version " << newSettingsVersion; + } + + qInfo() << "Settings upgrade finished (settingsVersion" << fromVer << "->" + << toVer << ")"; + return true; +} diff --git a/src/persistence/globalsettingsupgrader.h b/src/persistence/globalsettingsupgrader.h new file mode 100644 index 000000000..836992992 --- /dev/null +++ b/src/persistence/globalsettingsupgrader.h @@ -0,0 +1,27 @@ +/* + Copyright © 2022 by The qTox Project Contributors + + This file is part of qTox, a Qt-based graphical interface for Tox. + + qTox is libre software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + qTox is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with qTox. If not, see . +*/ + +#pragma once + +class Settings; + +namespace GlobalSettingsUpgrader +{ + bool doUpgrade(Settings& settings, int fromVer, int toVer); +}; diff --git a/src/persistence/personalsettingsupgrader.cpp b/src/persistence/personalsettingsupgrader.cpp new file mode 100644 index 000000000..32cba5bd1 --- /dev/null +++ b/src/persistence/personalsettingsupgrader.cpp @@ -0,0 +1,57 @@ +/* + Copyright © 2022 by The qTox Project Contributors + + This file is part of qTox, a Qt-based graphical interface for Tox. + + qTox is libre software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + qTox is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with qTox. If not, see . +*/ + +#include "personalsettingsupgrader.h" + +#include + +#include + +bool PersonalSettingsUpgrader::doUpgrade(SettingsSerializer& settingsSerializer, int fromVer, int toVer) +{ + if (fromVer == toVer) { + return true; + } + + if (fromVer > toVer) { + qWarning().nospace() << "Settings version (" << fromVer + << ") is newer than we currently support (" << toVer + << "). Please upgrade qTox"; + return false; + } + + using SettingsUpgradeFn = bool (*)(SettingsSerializer&); + std::vector upgradeFns = {}; + + assert(fromVer < static_cast(upgradeFns.size())); + assert(toVer == static_cast(upgradeFns.size())); + + for (int i = fromVer; i < static_cast(upgradeFns.size()); ++i) { + auto const newSettingsVersion = i + 1; + if (!upgradeFns[i](settingsSerializer)) { + qCritical() << "Failed to upgrade settings to version " << newSettingsVersion << " aborting"; + return false; + } + qDebug() << "Settings upgraded incrementally to schema version " << newSettingsVersion; + } + + qInfo() << "Settings upgrade finished (settingsVersion" << fromVer << "->" + << toVer << ")"; + return true; +} diff --git a/src/persistence/personalsettingsupgrader.h b/src/persistence/personalsettingsupgrader.h new file mode 100644 index 000000000..7264c194f --- /dev/null +++ b/src/persistence/personalsettingsupgrader.h @@ -0,0 +1,27 @@ +/* + Copyright © 2022 by The qTox Project Contributors + + This file is part of qTox, a Qt-based graphical interface for Tox. + + qTox is libre software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + qTox is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with qTox. If not, see . +*/ + +#pragma once + +class SettingsSerializer; + +namespace PersonalSettingsUpgrader +{ + bool doUpgrade(SettingsSerializer& settingsSerializer, int fromVer, int toVer); +}; diff --git a/src/persistence/profile.cpp b/src/persistence/profile.cpp index 4b6a9e0c2..627591b9b 100644 --- a/src/persistence/profile.cpp +++ b/src/persistence/profile.cpp @@ -336,9 +336,10 @@ Profile* Profile::loadProfile(const QString& name, const QString& password, Sett Profile* p = new Profile(name, std::move(tmpKey), paths, settings); // Core settings are saved per profile, need to load them before starting Core - settings.updateProfileData(p, parser); + constexpr bool isNewProfile = false; + settings.updateProfileData(p, parser, isNewProfile); - p->initCore(toxsave, settings, /*isNewProfile*/ false); + p->initCore(toxsave, settings, isNewProfile); p->loadDatabase(password); return p; @@ -366,9 +367,11 @@ Profile* Profile::createProfile(const QString& name, const QString& password, Se settings.createPersonal(name); Profile* p = new Profile(name, std::move(tmpKey), paths, settings); - settings.updateProfileData(p, parser); - p->initCore(QByteArray(), settings, /*isNewProfile*/ true); + constexpr bool isNewProfile = true; + settings.updateProfileData(p, parser, isNewProfile); + + p->initCore(QByteArray(), settings, isNewProfile); p->loadDatabase(password); return p; } diff --git a/src/persistence/settings.cpp b/src/persistence/settings.cpp index accbb8dc0..96723477e 100644 --- a/src/persistence/settings.cpp +++ b/src/persistence/settings.cpp @@ -25,6 +25,8 @@ #include "src/persistence/profile.h" #include "src/persistence/profilelocker.h" #include "src/persistence/settingsserializer.h" +#include "src/persistence/globalsettingsupgrader.h" +#include "src/persistence/personalsettingsupgrader.h" #include "src/persistence/smileypack.h" #include "src/widget/gui.h" #include "src/widget/style.h" @@ -39,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -61,6 +64,8 @@ const QString Settings::globalSettingsFile = "qtox.ini"; Settings* Settings::settings{nullptr}; CompatibleRecursiveMutex Settings::bigLock; QThread* Settings::settingsThread{nullptr}; +static constexpr int GLOBAL_SETTINGS_VERSION = 0; +static constexpr int PERSONAL_SETTINGS_VERSION = 0; Settings::Settings() : loaded(false) @@ -112,9 +117,11 @@ void Settings::loadGlobal() QString filePath = dir.filePath(globalSettingsFile); // If no settings file exist -- use the default one + bool defaultSettings = false; if (!QFile(filePath).exists()) { qDebug() << "No settings file found, using defaults"; filePath = ":/conf/" + globalSettingsFile; + defaultSettings = true; } qDebug() << "Loading settings from " + filePath; @@ -122,6 +129,22 @@ void Settings::loadGlobal() QSettings s(filePath, QSettings::IniFormat); s.setIniCodec("UTF-8"); + s.beginGroup("Version"); + { + const auto defaultVersion = defaultSettings ? GLOBAL_SETTINGS_VERSION : 0; + globalSettingsVersion = s.value("settingsVersion", defaultVersion).toInt(); + } + s.endGroup(); + + auto upgradeSuccess = GlobalSettingsUpgrader::doUpgrade(*this, globalSettingsVersion, GLOBAL_SETTINGS_VERSION); + if (!upgradeSuccess) { + // Would be nice to show a GUI warning, but GUI isn't initialized yet. + // Trying to run without even default settings isn't sane. + std::terminate(); + return; + } + globalSettingsVersion = GLOBAL_SETTINGS_VERSION; + s.beginGroup("Login"); { autoLogin = s.value("autoLogin", false).toBool(); @@ -259,7 +282,7 @@ void Settings::loadGlobal() loaded = true; } -void Settings::updateProfileData(Profile* profile, const QCommandLineParser* parser) +void Settings::updateProfileData(Profile* profile, const QCommandLineParser* parser, bool newProfile) { QMutexLocker locker{&bigLock}; @@ -269,7 +292,7 @@ void Settings::updateProfileData(Profile* profile, const QCommandLineParser* par } setCurrentProfile(profile->getName()); saveGlobal(); - loadPersonal(profile->getName(), profile->getPasskey()); + loadPersonal(profile->getName(), profile->getPasskey(), newProfile); if (parser) { applyCommandLineOptions(*parser); } @@ -458,7 +481,7 @@ bool Settings::applyCommandLineOptions(const QCommandLineParser& parser) return true; } -void Settings::loadPersonal(QString profileName, const ToxEncrypt* passKey) +void Settings::loadPersonal(QString profileName, const ToxEncrypt* passKey, bool newProfile) { QMutexLocker locker{&bigLock}; @@ -467,8 +490,9 @@ void Settings::loadPersonal(QString profileName, const ToxEncrypt* passKey) // load from a profile specific friend data list if possible QString tmp = dir.filePath(profileName + ".ini"); - if (QFile(tmp).exists()) // otherwise, filePath remains the global file + if (QFile(tmp).exists()) { // otherwise, filePath remains the global file filePath = tmp; + } qDebug() << "Loading personal settings from" << filePath; @@ -476,6 +500,24 @@ void Settings::loadPersonal(QString profileName, const ToxEncrypt* passKey) ps.load(); friendLst.clear(); + ps.beginGroup("Version"); + { + const auto defaultVersion = newProfile ? PERSONAL_SETTINGS_VERSION : 0; + personalSettingsVersion = ps.value("settingsVersion", defaultVersion).toInt(); + } + ps.endGroup(); + + auto upgradeSuccess = PersonalSettingsUpgrader::doUpgrade(ps, personalSettingsVersion, PERSONAL_SETTINGS_VERSION); + if (!upgradeSuccess) { + GUI::showError(tr("Failed to load personal settings"), + tr("Unable to upgrade settings from version %1 to version %2. Cannot start qTox.") + .arg(personalSettingsVersion) + .arg(PERSONAL_SETTINGS_VERSION)); + std::terminate(); + return; + } + personalSettingsVersion = PERSONAL_SETTINGS_VERSION; + ps.beginGroup("Privacy"); { typingNotification = ps.value("typingNotification", true).toBool(); @@ -709,6 +751,12 @@ void Settings::saveGlobal() s.setValue("screenGrabbed", screenGrabbed); } s.endGroup(); + + s.beginGroup("Version"); + { + s.setValue("settingsVersion", globalSettingsVersion); + } + s.endGroup(); } /** @@ -821,6 +869,12 @@ void Settings::savePersonal(QString profileName, const ToxEncrypt* passkey) ps.setValue("blackList", blackList.join('\n')); } ps.endGroup(); + + ps.beginGroup("Version"); + { + ps.setValue("settingsVersion", personalSettingsVersion); + } + ps.endGroup(); ps.save(); } diff --git a/src/persistence/settings.h b/src/persistence/settings.h index d165a6e61..1c69b3b4a 100644 --- a/src/persistence/settings.h +++ b/src/persistence/settings.h @@ -155,7 +155,7 @@ public: void savePersonal(); void loadGlobal(); - void loadPersonal(QString profileName, const ToxEncrypt* passKey); + void loadPersonal(QString profileName, const ToxEncrypt* passKey, bool newProfile); void resetToDefault(); @@ -170,7 +170,7 @@ public slots: void saveGlobal(); void sync(); void setAutoLogin(bool state); - void updateProfileData(Profile* profile, const QCommandLineParser* parser); + void updateProfileData(Profile* profile, const QCommandLineParser* parser, bool newProfile); signals: // General @@ -717,4 +717,6 @@ private: static const QString globalSettingsFile; static QThread* settingsThread; Paths paths; + int globalSettingsVersion = 0; + int personalSettingsVersion = 0; }; diff --git a/translations/ar.ts b/translations/ar.ts index 1d619bd47..11c1f6eeb 100644 --- a/translations/ar.ts +++ b/translations/ar.ts @@ -2639,6 +2639,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 قائمة #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/be.ts b/translations/be.ts index 28d05ef7a..1619d5032 100644 --- a/translations/be.ts +++ b/translations/be.ts @@ -2635,6 +2635,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 Круг #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/bg.ts b/translations/bg.ts index 5f0d07618..a6470c0f5 100644 --- a/translations/bg.ts +++ b/translations/bg.ts @@ -2636,6 +2636,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 Кръг #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/cs.ts b/translations/cs.ts index 0eba07a3c..53b402ada 100644 --- a/translations/cs.ts +++ b/translations/cs.ts @@ -2639,6 +2639,14 @@ ID zahrnuje kód NoSpam (modře) a kontrolní součet (šedě). Circle #%1 Kruh #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/da.ts b/translations/da.ts index 93c988d99..ccded6ee4 100644 --- a/translations/da.ts +++ b/translations/da.ts @@ -2619,6 +2619,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/de.ts b/translations/de.ts index 8909f3f0c..1817300fc 100644 --- a/translations/de.ts +++ b/translations/de.ts @@ -2644,6 +2644,14 @@ Diese ID enthält den NoSpam-Code (in blau) und die Prüfsumme (in grau).Circle #%1 Kreis #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/el.ts b/translations/el.ts index 96faf3e84..d788cc734 100644 --- a/translations/el.ts +++ b/translations/el.ts @@ -2623,6 +2623,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 Κύκλος #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/eo.ts b/translations/eo.ts index 4137e252e..8a2e126bb 100644 --- a/translations/eo.ts +++ b/translations/eo.ts @@ -2611,6 +2611,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 Rondo #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/es.ts b/translations/es.ts index dc89cb107..5390199a2 100644 --- a/translations/es.ts +++ b/translations/es.ts @@ -2636,6 +2636,14 @@ Este ID incluye el código NoSpam (en azul), y la suma de comprobación (en gris Circle #%1 Círculo #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/et.ts b/translations/et.ts index a96ed22ac..3c24f09c8 100644 --- a/translations/et.ts +++ b/translations/et.ts @@ -2638,6 +2638,14 @@ See ID sisaldab NoSpam koodi (sinine) ja kontrollsumma (hall). Circle #%1 Suhtlusring #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/fa.ts b/translations/fa.ts index 06ad8e490..19937523f 100644 --- a/translations/fa.ts +++ b/translations/fa.ts @@ -2627,6 +2627,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 حلقه #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/fi.ts b/translations/fi.ts index 398cb5b3c..1992a0126 100644 --- a/translations/fi.ts +++ b/translations/fi.ts @@ -2635,6 +2635,14 @@ Tämä ID sisältää spammin estävän koodin(joka on sinisellä), ja tarkistus Circle #%1 Piiri #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/fr.ts b/translations/fr.ts index 307972e6d..5ae03c404 100644 --- a/translations/fr.ts +++ b/translations/fr.ts @@ -2635,6 +2635,14 @@ Cet identifiant comprend le code NoSpam (en bleu) et la somme de contrôle (en g Circle #%1 Cercle nᵒ%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/gl.ts b/translations/gl.ts index c986a4a79..99c085adc 100644 --- a/translations/gl.ts +++ b/translations/gl.ts @@ -2631,6 +2631,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 Círculo #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/he.ts b/translations/he.ts index f8856da7b..1d01336d9 100644 --- a/translations/he.ts +++ b/translations/he.ts @@ -2619,6 +2619,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/hr.ts b/translations/hr.ts index 0d7024074..cba0f070c 100644 --- a/translations/hr.ts +++ b/translations/hr.ts @@ -2627,6 +2627,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 Kružok #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/hu.ts b/translations/hu.ts index 8840b37bf..074acc75f 100644 --- a/translations/hu.ts +++ b/translations/hu.ts @@ -2619,6 +2619,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 #%1. kör + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/is.ts b/translations/is.ts index d45399cf2..659aac580 100644 --- a/translations/is.ts +++ b/translations/is.ts @@ -2619,6 +2619,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/it.ts b/translations/it.ts index 31890c00d..e175da6e4 100644 --- a/translations/it.ts +++ b/translations/it.ts @@ -2632,6 +2632,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 Circolo #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/ja.ts b/translations/ja.ts index b6ba63bf1..b1b5b61a6 100644 --- a/translations/ja.ts +++ b/translations/ja.ts @@ -2618,6 +2618,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 サークル #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/kn.ts b/translations/kn.ts index 115a83247..09da763e0 100644 --- a/translations/kn.ts +++ b/translations/kn.ts @@ -2619,6 +2619,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/ko.ts b/translations/ko.ts index a9128750f..f57f02645 100644 --- a/translations/ko.ts +++ b/translations/ko.ts @@ -2617,6 +2617,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/lt.ts b/translations/lt.ts index 188c4dc73..1961d7eb3 100644 --- a/translations/lt.ts +++ b/translations/lt.ts @@ -2641,6 +2641,14 @@ Pasidalinkite ja su draugais, kad pradėtumėte kalbėtis. Circle #%1 Draugų ratas Nr. %1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/lv.ts b/translations/lv.ts index ba915e019..f0bb89340 100644 --- a/translations/lv.ts +++ b/translations/lv.ts @@ -2642,6 +2642,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 Uz sarakstu #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/mk.ts b/translations/mk.ts index f3b30f035..062327214 100644 --- a/translations/mk.ts +++ b/translations/mk.ts @@ -2635,6 +2635,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 Круг #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/nl.ts b/translations/nl.ts index 10542db2d..4085b36a6 100644 --- a/translations/nl.ts +++ b/translations/nl.ts @@ -2623,6 +2623,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 Cirkel #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/nl_BE.ts b/translations/nl_BE.ts index 50e97645c..76ffa670b 100644 --- a/translations/nl_BE.ts +++ b/translations/nl_BE.ts @@ -2631,6 +2631,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 Cirkel #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/no_nb.ts b/translations/no_nb.ts index 3e2c1a1d5..110ba9c76 100644 --- a/translations/no_nb.ts +++ b/translations/no_nb.ts @@ -2625,6 +2625,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 Sirkel #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/pl.ts b/translations/pl.ts index 06044c1aa..dac9c7ea4 100644 --- a/translations/pl.ts +++ b/translations/pl.ts @@ -2661,6 +2661,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 Krąg #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/pt.ts b/translations/pt.ts index ea34898d4..f433a9719 100644 --- a/translations/pt.ts +++ b/translations/pt.ts @@ -2635,6 +2635,14 @@ Este ID inclui o código NoSpam (em azul) e o checkum (em cinzento).Circle #%1 Círculo #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/pt_BR.ts b/translations/pt_BR.ts index eeb185c4d..1f16fdda9 100644 --- a/translations/pt_BR.ts +++ b/translations/pt_BR.ts @@ -2643,6 +2643,14 @@ Este ID inclui o código NoSpam (em azul) e o checkum (em cinza). Circle #%1 Círculo #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/ro.ts b/translations/ro.ts index 8d2043d9a..a1c3f7cba 100644 --- a/translations/ro.ts +++ b/translations/ro.ts @@ -2647,6 +2647,14 @@ Acest ID include codul NoSpam (în albastru) și suma de control (în gri).Circle #%1 Cerc #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/ru.ts b/translations/ru.ts index 5d49c9036..83c2e143f 100644 --- a/translations/ru.ts +++ b/translations/ru.ts @@ -2645,6 +2645,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 Список #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/si.ts b/translations/si.ts index 5d38fb8d1..3ae8a2529 100644 --- a/translations/si.ts +++ b/translations/si.ts @@ -2619,6 +2619,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/sk.ts b/translations/sk.ts index e165a4eff..f3009439c 100644 --- a/translations/sk.ts +++ b/translations/sk.ts @@ -2647,6 +2647,14 @@ Toto ID obsahuje kód NoSpam (modrou) a kontrolný súčet (šedou).Circle #%1 Kruh #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/sl.ts b/translations/sl.ts index 9af943033..0c6961a01 100644 --- a/translations/sl.ts +++ b/translations/sl.ts @@ -2629,6 +2629,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/sq.ts b/translations/sq.ts index 181aa8853..34b86f1ce 100644 --- a/translations/sq.ts +++ b/translations/sq.ts @@ -2619,6 +2619,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/sr.ts b/translations/sr.ts index 06d9c471e..0dd9a1cd9 100644 --- a/translations/sr.ts +++ b/translations/sr.ts @@ -2635,6 +2635,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 Круг #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/sr_Latn.ts b/translations/sr_Latn.ts index 6256d82b2..366acec66 100644 --- a/translations/sr_Latn.ts +++ b/translations/sr_Latn.ts @@ -2636,6 +2636,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 Krug #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/sv.ts b/translations/sv.ts index 05789c1f8..20adbfbbc 100644 --- a/translations/sv.ts +++ b/translations/sv.ts @@ -2635,6 +2635,14 @@ ID:t innehåller NoSpam-koden (i blått) och kontrollsumman (i grått).Circle #%1 Cirkel #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/sw.ts b/translations/sw.ts index f8588fc1b..ad0133f61 100644 --- a/translations/sw.ts +++ b/translations/sw.ts @@ -2619,6 +2619,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/ta.ts b/translations/ta.ts index c48081aa3..5f30ef5d0 100644 --- a/translations/ta.ts +++ b/translations/ta.ts @@ -2625,6 +2625,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/tr.ts b/translations/tr.ts index f21e25167..65c3cc4c3 100644 --- a/translations/tr.ts +++ b/translations/tr.ts @@ -2635,6 +2635,14 @@ Bu kimlik NoSpam kodunu (mavi) ve sağlama toplamını (gri) içerir.Circle #%1 Çevre #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/ug.ts b/translations/ug.ts index cdea64dba..0878e5faa 100644 --- a/translations/ug.ts +++ b/translations/ug.ts @@ -2631,6 +2631,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 چەمبىرەك #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/uk.ts b/translations/uk.ts index 054423382..d521fe6dc 100644 --- a/translations/uk.ts +++ b/translations/uk.ts @@ -2635,6 +2635,14 @@ It's difficult to translate "Tox me maybe" because in Ukrainian n Circle #%1 Коло №%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/ur.ts b/translations/ur.ts index c44584f4e..88e9ff384 100644 --- a/translations/ur.ts +++ b/translations/ur.ts @@ -2627,6 +2627,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/zh_CN.ts b/translations/zh_CN.ts index 168084719..8502e7695 100644 --- a/translations/zh_CN.ts +++ b/translations/zh_CN.ts @@ -2631,6 +2631,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 圈子 # %1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog diff --git a/translations/zh_TW.ts b/translations/zh_TW.ts index a7879f6a5..26f6b50e8 100644 --- a/translations/zh_TW.ts +++ b/translations/zh_TW.ts @@ -2619,6 +2619,14 @@ This ID includes the NoSpam code (in blue), and the checksum (in gray). Circle #%1 + + Failed to load personal settings + + + + Unable to upgrade settings from version %1 to version %2. Cannot start qTox. + + ToxURIDialog