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