diff --git a/WindowsInstaller/Qortal.aip b/WindowsInstaller/Qortal.aip
index d9b958e1..b8376538 100755
--- a/WindowsInstaller/Qortal.aip
+++ b/WindowsInstaller/Qortal.aip
@@ -17,10 +17,10 @@
-
+
-
+
@@ -212,7 +212,7 @@
-
+
diff --git a/pom.xml b/pom.xml
index 80892009..e6b6cea5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
org.qortal
qortal
- 2.1.2
+ 2.1.3
jar
true
diff --git a/src/main/java/org/qortal/controller/Controller.java b/src/main/java/org/qortal/controller/Controller.java
index 2e78a42b..2748b82d 100644
--- a/src/main/java/org/qortal/controller/Controller.java
+++ b/src/main/java/org/qortal/controller/Controller.java
@@ -422,10 +422,12 @@ public class Controller extends Thread {
return; // Not System.exit() so that GUI can display error
}
- // Rebuild Names table and check database integrity
+ // Rebuild Names table and check database integrity (if enabled)
NamesDatabaseIntegrityCheck namesDatabaseIntegrityCheck = new NamesDatabaseIntegrityCheck();
namesDatabaseIntegrityCheck.rebuildAllNames();
- namesDatabaseIntegrityCheck.runIntegrityCheck();
+ if (Settings.getInstance().isNamesIntegrityCheckEnabled()) {
+ namesDatabaseIntegrityCheck.runIntegrityCheck();
+ }
LOGGER.info("Validating blockchain");
try {
diff --git a/src/main/java/org/qortal/controller/repository/NamesDatabaseIntegrityCheck.java b/src/main/java/org/qortal/controller/repository/NamesDatabaseIntegrityCheck.java
index 12d6c3bc..0b941c0c 100644
--- a/src/main/java/org/qortal/controller/repository/NamesDatabaseIntegrityCheck.java
+++ b/src/main/java/org/qortal/controller/repository/NamesDatabaseIntegrityCheck.java
@@ -187,7 +187,12 @@ public class NamesDatabaseIntegrityCheck {
// The old name will then be unregistered, or re-registered.
// FUTURE: check database integrity for names that have been updated and then the original name re-registered
else if (Objects.equals(updateNameTransactionData.getName(), registeredName)) {
- NameData newNameData = repository.getNameRepository().fromName(updateNameTransactionData.getNewName());
+ String newName = updateNameTransactionData.getNewName();
+ if (newName == null || newName.length() == 0) {
+ // If new name is blank (or maybe null, just to be safe), it means that it stayed the same
+ newName = registeredName;
+ }
+ NameData newNameData = repository.getNameRepository().fromName(newName);
if (!Objects.equals(creator.getAddress(), newNameData.getOwner())) {
LOGGER.info("Error: registered name {} is owned by {}, but it should be {}",
updateNameTransactionData.getNewName(), newNameData.getOwner(), creator.getAddress());
diff --git a/src/main/java/org/qortal/settings/Settings.java b/src/main/java/org/qortal/settings/Settings.java
index b01c7bdd..b329f22b 100644
--- a/src/main/java/org/qortal/settings/Settings.java
+++ b/src/main/java/org/qortal/settings/Settings.java
@@ -173,6 +173,10 @@ public class Settings {
private boolean bootstrap = true;
+ /** Registered names integrity check */
+ private boolean namesIntegrityCheckEnabled = false;
+
+
// Peer-to-peer related
private boolean isTestNet = false;
/** Port number for inbound peer-to-peer connections. */
@@ -805,6 +809,10 @@ public class Settings {
return this.blockPruneBatchSize;
}
+ public boolean isNamesIntegrityCheckEnabled() {
+ return this.namesIntegrityCheckEnabled;
+ }
+
public boolean isArchiveEnabled() {
if (this.topOnly) {
diff --git a/src/main/resources/i18n/ApiError_fr.properties b/src/main/resources/i18n/ApiError_fr.properties
new file mode 100644
index 00000000..122b6d03
--- /dev/null
+++ b/src/main/resources/i18n/ApiError_fr.properties
@@ -0,0 +1,55 @@
+### Commun ###
+JSON = échec de l'analyse du message JSON
+INSUFFICIENT_BALANCE = balance insuffisante
+UNAUTHORIZED = appel de l’API non autorisé
+REPOSITORY_ISSUE = erreur de dépôt
+NON_PRODUCTION = cet appel API n'est pas autorisé pour les systèmes en production
+BLOCKCHAIN_NEEDS_SYNC = la blockchain doit d'abord être synchronisée
+NO_TIME_SYNC = heure pas encore synchronisée
+
+### Validation ###
+INVALID_SIGNATURE = signature invalide
+INVALID_ADDRESS = adresse invalide
+INVALID_PUBLIC_KEY = clé publique invalide
+INVALID_DATA = données invalides
+INVALID_NETWORK_ADDRESS = adresse réseau invalide
+ADDRESS_UNKNOWN = adresse de compte inconnue
+INVALID_CRITERIA = critère de recherche invalide
+INVALID_REFERENCE = référence invalide
+TRANSFORMATION_ERROR = ne peut pas transformer JSON en transaction
+INVALID_PRIVATE_KEY = clé privée invalide
+INVALID_HEIGHT = hauteur de bloc invalide
+CANNOT_MINT = le compte ne peut pas mint
+
+### Blocks ###
+BLOCK_UNKNOWN = bloc inconnu
+
+### Transactions ###
+TRANSACTION_UNKNOWN = opération inconnue
+PUBLIC_KEY_NOT_FOUND = clé publique introuvable
+
+# celui-ci est spécial dans le sens où l'appelant doit passer deux chaînes supplémentaires, d'où les deux %s
+TRANSACTION_INVALID = transaction invalide: %s (%s)
+
+### Nommage ###
+NAME_UNKNOWN = nom inconnu
+
+### Asset ###
+INVALID_ASSET_ID = identifiant d'actif invalide
+INVALID_ORDER_ID = identifiant de commande d'actif non valide
+ORDER_UNKNOWN = identifiant d'ordre d'actif inconnu
+
+### Groupes ###
+GROUP_UNKNOWN = groupe inconnu
+
+### Blockchain étrangère ###
+FOREIGN_BLOCKCHAIN_NETWORK_ISSUE = Problème blokchain étrangère ou de réseau ElectrumX
+FOREIGN_BLOCKCHAIN_BALANCE_ISSUE = solde insuffisant sur la blockchain étrangère
+FOREIGN_BLOCKCHAIN_TOO_SOON = trop tôt pour diffuser la transaction sur la blockchain étrangère (temps de verrouillage/temps de bloc médian)
+
+### Portail de trading ###
+ORDER_SIZE_TOO_SMALL = montant de commande trop bas
+
+### Données ###
+FILE_NOT_FOUND = fichier introuvable
+NO_REPLY = le pair n'a pas renvoyé de données
\ No newline at end of file
diff --git a/src/main/resources/i18n/SysTray_fr.properties b/src/main/resources/i18n/SysTray_fr.properties
new file mode 100644
index 00000000..b8aac433
--- /dev/null
+++ b/src/main/resources/i18n/SysTray_fr.properties
@@ -0,0 +1,41 @@
+AUTO_UPDATE = Mise à jour automatique
+
+APPLYING_UPDATE_AND_RESTARTING = Application de la mise à jour automatique et redémarrage...
+
+BLOCK_HEIGHT = hauteur
+
+BUILD_VERSION = Numéro de version
+
+CHECK_TIME_ACCURACY = Vérifier l'heure
+
+CONNECTING = Connexion en cours
+
+CONNECTION = connexion
+
+CONNECTIONS = connexions
+
+CREATING_BACKUP_OF_DB_FILES = Création d'une sauvegarde des fichiers de la base de données...
+
+DB_BACKUP = Sauvegarde de la base de données
+
+DB_MAINTENANCE = Maintenance de la base de données
+
+DB_CHECKPOINT = Point de contrôle de la base de données
+
+EXIT = Quitter
+
+MINTING_DISABLED = NE mint PAS
+
+MINTING_ENABLED = \u2714 Minting
+
+OPEN_UI = Ouvrir l'interface
+
+PERFORMING_DB_CHECKPOINT = Enregistrement des modifications de base de données non validées...
+
+PERFORMING_DB_MAINTENANCE = Entrain d'effectuer la maintenance programmée...
+
+SYNCHRONIZE_CLOCK = Mettre l'heure à jour
+
+SYNCHRONIZING_BLOCKCHAIN = Synchronisation
+
+SYNCHRONIZING_CLOCK = Synchronisation de l'heure
diff --git a/src/main/resources/i18n/TransactionValidity_fr.properties b/src/main/resources/i18n/TransactionValidity_fr.properties
new file mode 100644
index 00000000..6b43d457
--- /dev/null
+++ b/src/main/resources/i18n/TransactionValidity_fr.properties
@@ -0,0 +1,151 @@
+OK = OK
+
+INVALID_ADDRESS = adresse invalide
+
+NEGATIVE_AMOUNT = montant invalide/négatif
+
+NEGATIVE_FEE = frais invalides/négatifs
+
+NO_BALANCE = solde insuffisant
+
+INVALID_REFERENCE = référence invalide
+
+INVALID_NAME_LENGTH = longueur de nom invalide
+
+INVALID_VALUE_LENGTH = longueur de 'valeur' invalide
+
+NAME_ALREADY_REGISTERED = le nom est déjà enregistré
+
+NAME_DOES_NOT_EXIST = le nom n'existe pas
+
+INVALID_NAME_OWNER = le nom du propriétaire est invalide
+
+NAME_ALREADY_FOR_SALE = le nom est déjà en vente
+
+NAME_NOT_FOR_SALE = le nom n'est pas à vendre
+
+BUYER_ALREADY_OWNER = l'acheteur est déjà le propriétaire
+
+INVALID_AMOUNT = montant invalide
+
+INVALID_SELLER = vendeur invalide
+
+NAME_NOT_NORMALIZED = le nom n'est pas sous la forme 'normalisée' Unicode
+
+INVALID_DESCRIPTION_LENGTH = longueur de description invalide
+
+INVALID_OPTIONS_COUNT = nombre d'options invalides
+
+INVALID_OPTION_LENGTH = longueur des options invalide
+
+DUPLICATE_OPTION = option dupliquée
+
+POLL_ALREADY_EXISTS = le scrutin existe déjà
+
+POLL_DOES_NOT_EXIST = le scrutin n'existe pas
+
+POLL_OPTION_DOES_NOT_EXIST = Ce choix de scrutin n'existe pas
+
+ALREADY_VOTED_FOR_THAT_OPTION = Vous avez déjà voté pour ce choix
+
+INVALID_DATA_LENGTH = longueur de données invalide
+
+INVALID_QUANTITY = quantité invalide
+
+ASSET_DOES_NOT_EXIST = l'actif n'existe pas
+
+INVALID_RETURN = retour invalide
+
+HAVE_EQUALS_WANT = l'actif désiré est le même que l'actif possédé
+
+ORDER_DOES_NOT_EXIST = l'ordre d'échange d'actifs n'existe pas
+
+INVALID_ORDER_CREATOR = créateur d'ordre invalide
+
+INVALID_PAYMENTS_COUNT = nombre de paiements invalides
+
+NEGATIVE_PRICE = prix invalide/négatif
+
+INVALID_CREATION_BYTES = octets de création invalides
+
+INVALID_TAGS_LENGTH = longueur de 'tags' invalide
+
+INVALID_AT_TYPE_LENGTH = longueur 'type' AT invalide
+
+INVALID_AT_TRANSACTION = transaction AT invalide
+
+INSUFFICIENT_FEE = frais insuffisant
+
+ASSET_DOES_NOT_MATCH_AT = l'actif ne correspond pas à l'actif d'AT
+ASSET_ALREADY_EXISTS = l'actif existe déjà
+MISSING_CREATOR = créateur manquant
+TIMESTAMP_TOO_OLD = horodatage trop ancien
+TIMESTAMP_TOO_NEW = horodatage trop récent
+TOO_MANY_UNCONFIRMED = le compte a trop de transactions non confirmées en attente
+GROUP_ALREADY_EXISTS = le groupe existe déjà
+GROUP_DOES_NOT_EXIST = le groupe n'existe pas
+INVALID_GROUP_OWNER = propriétaire de groupe invalide
+ALREADY_GROUP_MEMBER = vous êtes déjà un(e) membre du groupe
+GROUP_OWNER_CANNOT_LEAVE = le propriétaire du groupe ne peut pas quitter le groupe
+NOT_GROUP_MEMBER = le compte n'est pas membre du groupe
+ALREADY_GROUP_ADMIN = vous êtes déjà l'administrateur(trice) du groupe
+NOT_GROUP_ADMIN = le compte n'est pas un administrateur du groupe
+INVALID_LIFETIME = durée de vie invalide
+INVITE_UNKNOWN = invitation de groupe inconnue
+BAN_EXISTS = déjà banni
+BAN_UNKNOWN = bannissement inconnu
+BANNED_FROM_GROUP = banned from group
+JOIN_REQUEST_EXISTS = la demande d'adhésion au groupe existe déjà
+INVALID_GROUP_APPROVAL_THRESHOLD = seuil d'approbation de groupe non valide
+GROUP_ID_MISMATCH = identifiant de groupe non-concorde
+INVALID_GROUP_ID = identifiant de groupe invalide
+TRANSACTION_UNKNOWN = transaction inconnue
+TRANSACTION_ALREADY_CONFIRMED = la transaction a déjà été confirmée
+INVALID_TX_GROUP_ID = identifiant du groupe de transactions invalide
+TX_GROUP_ID_MISMATCH = l'identifiant du groupe de transaction ne correspond pas
+
+MULTIPLE_NAMES_FORBIDDEN = l'enregistrement de plusieurs noms par compte est interdit
+
+INVALID_ASSET_OWNER = propriétaire de l'actif invalide
+
+AT_IS_FINISHED = l'AT est fini
+
+NO_FLAG_PERMISSION = le compte n'a pas cette autorisation
+
+NOT_MINTING_ACCOUNT = le compte ne peut pas mint
+
+REWARD_SHARE_UNKNOWN = partage de récompense inconnu
+
+INVALID_REWARD_SHARE_PERCENT = pourcentage du partage de récompense invalide
+
+PUBLIC_KEY_UNKNOWN = clé publique inconnue
+
+INVALID_PUBLIC_KEY = clé publique invalide
+
+AT_UNKNOWN = AT inconnu
+
+AT_ALREADY_EXISTS = AT déjà existante
+
+GROUP_APPROVAL_NOT_REQUIRED = approbation de groupe non requise
+
+GROUP_APPROVAL_DECIDED = approbation de groupe déjà décidée
+
+MAXIMUM_REWARD_SHARES = déjà au nombre maximum de récompense pour ce compte
+
+TRANSACTION_ALREADY_EXISTS = la transaction existe déjà
+
+NO_BLOCKCHAIN_LOCK = nœud de la blockchain actuellement occupé
+ORDER_ALREADY_CLOSED = l'ordre d'échange d'actifs est déjà fermé
+CLOCK_NOT_SYNCED = horloge non synchronisée
+ASSET_NOT_SPENDABLE = l'actif n'est pas dépensable
+ACCOUNT_CANNOT_REWARD_SHARE = le compte ne peut pas récompenser
+SELF_SHARE_EXISTS = l'auto-partage (récompense) existe déjà
+ACCOUNT_ALREADY_EXISTS = Le compte existe déjà
+INVALID_GROUP_BLOCK_DELAY = délai de blocage d'approbation de groupe invalide
+INCORRECT_NONCE = PoW nonce incorrect
+INVALID_TIMESTAMP_SIGNATURE = signature d'horodatage invalide
+ADDRESS_IN_BLACKLIST = cette adresse est dans votre liste noire
+ADDRESS_ABOVE_RATE_LIMIT = l'adresse a atteint la limite de débit spécifiée
+DUPLICATE_MESSAGE = l'adresse a envoyé un message en double
+INVALID_BUT_OK = invalide mais OK
+NOT_YET_RELEASED = fonctionnalité pas encore publiée