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).
قائمة #%1
+
+
+
+
+
+
+
+
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).
Круг #%1
+
+
+
+
+
+
+
+
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).
Кръг #%1
+
+
+
+
+
+
+
+
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ě).
Kruh #%1
+
+
+
+
+
+
+
+
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).
+
+
+
+
+
+
+
+
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
+
+
+
+
+
+
+
+
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).
Κύκλος #%1
+
+
+
+
+
+
+
+
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).
Rondo #%1
+
+
+
+
+
+
+
+
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
Círculo #%1
+
+
+
+
+
+
+
+
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).
Suhtlusring #%1
+
+
+
+
+
+
+
+
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).
حلقه #%1
+
+
+
+
+
+
+
+
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
Piiri #%1
+
+
+
+
+
+
+
+
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
Cercle nᵒ%1
+
+
+
+
+
+
+
+
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).
Círculo #%1
+
+
+
+
+
+
+
+
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).
+
+
+
+
+
+
+
+
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).
Kružok #%1
+
+
+
+
+
+
+
+
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).
#%1. kör
+
+
+
+
+
+
+
+
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).
+
+
+
+
+
+
+
+
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).
Circolo #%1
+
+
+
+
+
+
+
+
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).
サークル #%1
+
+
+
+
+
+
+
+
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).
+
+
+
+
+
+
+
+
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).
+
+
+
+
+
+
+
+
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.
Draugų ratas Nr. %1
+
+
+
+
+
+
+
+
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).
Uz sarakstu #%1
+
+
+
+
+
+
+
+
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).
Круг #%1
+
+
+
+
+
+
+
+
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).
Cirkel #%1
+
+
+
+
+
+
+
+
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).
Cirkel #%1
+
+
+
+
+
+
+
+
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).
Sirkel #%1
+
+
+
+
+
+
+
+
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).
Krąg #%1
+
+
+
+
+
+
+
+
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
+
+
+
+
+
+
+
+
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).
Círculo #%1
+
+
+
+
+
+
+
+
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
+
+
+
+
+
+
+
+
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).
Список #%1
+
+
+
+
+
+
+
+
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).
+
+
+
+
+
+
+
+
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
+
+
+
+
+
+
+
+
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).
+
+
+
+
+
+
+
+
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).
+
+
+
+
+
+
+
+
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).
Круг #%1
+
+
+
+
+
+
+
+
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).
Krug #%1
+
+
+
+
+
+
+
+
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
+
+
+
+
+
+
+
+
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).
+
+
+
+
+
+
+
+
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).
+
+
+
+
+
+
+
+
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
+
+
+
+
+
+
+
+
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).
چەمبىرەك #%1
+
+
+
+
+
+
+
+
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
Коло №%1
+
+
+
+
+
+
+
+
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).
+
+
+
+
+
+
+
+
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).
圈子 # %1
+
+
+
+
+
+
+
+
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).
+
+
+
+
+
+
+
+
ToxURIDialog