Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F13115610
D7701.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
42 KB
Subscribers
None
D7701.diff
View Options
diff --git a/src/dummywallet.cpp b/src/dummywallet.cpp
--- a/src/dummywallet.cpp
+++ b/src/dummywallet.cpp
@@ -10,6 +10,7 @@
class CChainParams;
class CWallet;
enum class WalletCreationStatus;
+struct bilingual_str;
namespace interfaces {
class Chain;
@@ -55,8 +56,9 @@
std::shared_ptr<CWallet> LoadWallet(const CChainParams &chainParams,
interfaces::Chain &chain,
- const std::string &name, std::string &error,
- std::vector<std::string> &warnings) {
+ const std::string &name,
+ bilingual_str &error,
+ std::vector<bilingual_str> &warnings) {
throw std::logic_error("Wallet function called in non-wallet build.");
}
@@ -64,8 +66,8 @@
interfaces::Chain &chain,
const SecureString &passphrase,
uint64_t wallet_creation_flags,
- const std::string &name, std::string &error,
- std::vector<std::string> &warnings,
+ const std::string &name, bilingual_str &error,
+ std::vector<bilingual_str> &warnings,
std::shared_ptr<CWallet> &result) {
throw std::logic_error("Wallet function called in non-wallet build.");
}
diff --git a/src/interfaces/node.h b/src/interfaces/node.h
--- a/src/interfaces/node.h
+++ b/src/interfaces/node.h
@@ -34,6 +34,7 @@
class RPCTimerInterface;
class UniValue;
enum class WalletCreationStatus;
+struct bilingual_str;
namespace interfaces {
class Handler;
@@ -207,14 +208,14 @@
//! with handleLoadWallet.
virtual std::unique_ptr<Wallet>
loadWallet(const CChainParams ¶ms, const std::string &name,
- std::string &error,
- std::vector<std::string> &warnings) const = 0;
+ bilingual_str &error,
+ std::vector<bilingual_str> &warnings) const = 0;
//! Create a wallet from file
virtual WalletCreationStatus
createWallet(const CChainParams ¶ms, const SecureString &passphrase,
uint64_t wallet_creation_flags, const std::string &name,
- std::string &error, std::vector<std::string> &warnings,
+ bilingual_str &error, std::vector<bilingual_str> &warnings,
std::unique_ptr<Wallet> &result) = 0;
//! Register handler for init messages.
diff --git a/src/interfaces/node.cpp b/src/interfaces/node.cpp
--- a/src/interfaces/node.cpp
+++ b/src/interfaces/node.cpp
@@ -44,14 +44,15 @@
std::vector<std::shared_ptr<CWallet>> GetWallets();
std::shared_ptr<CWallet> LoadWallet(const CChainParams &chainParams,
interfaces::Chain &chain,
- const std::string &name, std::string &error,
- std::vector<std::string> &warnings);
+ const std::string &name,
+ bilingual_str &error,
+ std::vector<bilingual_str> &warnings);
WalletCreationStatus CreateWallet(const CChainParams ¶ms,
interfaces::Chain &chain,
const SecureString &passphrase,
uint64_t wallet_creation_flags,
- const std::string &name, std::string &error,
- std::vector<std::string> &warnings,
+ const std::string &name, bilingual_str &error,
+ std::vector<bilingual_str> &warnings,
std::shared_ptr<CWallet> &result);
std::unique_ptr<interfaces::Handler>
HandleLoadWallet(interfaces::Node::LoadWalletFn load_wallet);
@@ -281,15 +282,15 @@
}
std::unique_ptr<Wallet>
loadWallet(const CChainParams ¶ms, const std::string &name,
- std::string &error,
- std::vector<std::string> &warnings) const override {
+ bilingual_str &error,
+ std::vector<bilingual_str> &warnings) const override {
return MakeWallet(
LoadWallet(params, *m_context.chain, name, error, warnings));
}
WalletCreationStatus
createWallet(const CChainParams ¶ms, const SecureString &passphrase,
uint64_t wallet_creation_flags, const std::string &name,
- std::string &error, std::vector<std::string> &warnings,
+ bilingual_str &error, std::vector<bilingual_str> &warnings,
std::unique_ptr<Wallet> &result) override {
std::shared_ptr<CWallet> wallet;
WalletCreationStatus status = CreateWallet(
diff --git a/src/qt/walletcontroller.h b/src/qt/walletcontroller.h
--- a/src/qt/walletcontroller.h
+++ b/src/qt/walletcontroller.h
@@ -10,6 +10,7 @@
#include <qt/walletmodel.h>
#include <support/allocators/secure.h>
#include <sync.h>
+#include <util/translation.h>
#include <QMutex>
@@ -107,8 +108,8 @@
QWidget *const m_parent_widget;
QProgressDialog *m_progress_dialog{nullptr};
WalletModel *m_wallet_model{nullptr};
- std::string m_error_message;
- std::vector<std::string> m_warning_message;
+ bilingual_str m_error_message;
+ std::vector<bilingual_str> m_warning_message;
const CChainParams &m_chainparams;
};
diff --git a/src/qt/walletcontroller.cpp b/src/qt/walletcontroller.cpp
--- a/src/qt/walletcontroller.cpp
+++ b/src/qt/walletcontroller.cpp
@@ -12,6 +12,7 @@
#include <interfaces/handler.h>
#include <interfaces/node.h>
#include <util/string.h>
+#include <util/translation.h>
#include <wallet/wallet.h>
#include <QApplication>
@@ -238,13 +239,14 @@
void CreateWalletActivity::finish() {
m_progress_dialog->hide();
- if (!m_error_message.empty()) {
- QMessageBox::critical(m_parent_widget, tr("Create wallet failed"),
- QString::fromStdString(m_error_message));
+ if (!m_error_message.original.empty()) {
+ QMessageBox::critical(
+ m_parent_widget, tr("Create wallet failed"),
+ QString::fromStdString(m_error_message.translated));
} else if (!m_warning_message.empty()) {
- QMessageBox::warning(
- m_parent_widget, tr("Create wallet warning"),
- QString::fromStdString(Join(m_warning_message, "\n")));
+ QMessageBox::warning(m_parent_widget, tr("Create wallet warning"),
+ QString::fromStdString(
+ Join(m_warning_message, "\n", OpTranslated)));
}
if (m_wallet_model) {
@@ -280,13 +282,14 @@
void OpenWalletActivity::finish() {
m_progress_dialog->hide();
- if (!m_error_message.empty()) {
- QMessageBox::critical(m_parent_widget, tr("Open wallet failed"),
- QString::fromStdString(m_error_message));
+ if (!m_error_message.original.empty()) {
+ QMessageBox::critical(
+ m_parent_widget, tr("Open wallet failed"),
+ QString::fromStdString(m_error_message.translated));
} else if (!m_warning_message.empty()) {
- QMessageBox::warning(
- m_parent_widget, tr("Open wallet warning"),
- QString::fromStdString(Join(m_warning_message, "\n")));
+ QMessageBox::warning(m_parent_widget, tr("Open wallet warning"),
+ QString::fromStdString(
+ Join(m_warning_message, "\n", OpTranslated)));
}
if (m_wallet_model) {
diff --git a/src/util/translation.h b/src/util/translation.h
--- a/src/util/translation.h
+++ b/src/util/translation.h
@@ -19,6 +19,25 @@
std::string translated;
};
+inline bilingual_str operator+(const bilingual_str &lhs,
+ const bilingual_str &rhs) {
+ return bilingual_str{lhs.original + rhs.original,
+ lhs.translated + rhs.translated};
+}
+
+/** Mark a bilingual_str as untranslated */
+inline static bilingual_str Untranslated(std::string original) {
+ return {original, original};
+}
+/** Unary operator to return the original */
+inline static std::string OpOriginal(const bilingual_str &b) {
+ return b.original;
+}
+/** Unary operator to return the translation */
+inline static std::string OpTranslated(const bilingual_str &b) {
+ return b.translated;
+}
+
namespace tinyformat {
template <typename... Args>
bilingual_str format(const bilingual_str &fmt, const Args &... args) {
diff --git a/src/wallet/db.h b/src/wallet/db.h
--- a/src/wallet/db.h
+++ b/src/wallet/db.h
@@ -21,6 +21,8 @@
#include <unordered_map>
#include <vector>
+struct bilingual_str;
+
static const unsigned int DEFAULT_WALLET_DBLOGSIZE = 100;
static const bool DEFAULT_WALLET_PRIVDB = true;
@@ -271,12 +273,12 @@
static bool PeriodicFlush(BerkeleyDatabase &database);
/* verifies the database environment */
static bool VerifyEnvironment(const fs::path &file_path,
- std::string &errorStr);
+ bilingual_str &errorStr);
/* verifies the database file */
static bool
VerifyDatabaseFile(const fs::path &file_path,
- std::vector<std::string> &warnings,
- std::string &errorStr,
+ std::vector<bilingual_str> &warnings,
+ bilingual_str &errorStr,
BerkeleyEnvironment::recoverFunc_type recoverFunc);
template <typename K, typename T> bool Read(const K &key, T &value) {
diff --git a/src/wallet/db.cpp b/src/wallet/db.cpp
--- a/src/wallet/db.cpp
+++ b/src/wallet/db.cpp
@@ -425,7 +425,7 @@
}
bool BerkeleyBatch::VerifyEnvironment(const fs::path &file_path,
- std::string &errorStr) {
+ bilingual_str &errorStr) {
std::string walletFile;
std::shared_ptr<BerkeleyEnvironment> env =
GetWalletEnv(file_path, walletFile);
@@ -437,8 +437,7 @@
if (!env->Open(true /* retry */)) {
errorStr = strprintf(
- _("Error initializing wallet database environment %s!").translated,
- walletDir);
+ _("Error initializing wallet database environment %s!"), walletDir);
return false;
}
@@ -446,8 +445,9 @@
}
bool BerkeleyBatch::VerifyDatabaseFile(
- const fs::path &file_path, std::vector<std::string> &warnings,
- std::string &errorStr, BerkeleyEnvironment::recoverFunc_type recoverFunc) {
+ const fs::path &file_path, std::vector<bilingual_str> &warnings,
+ bilingual_str &errorStr,
+ BerkeleyEnvironment::recoverFunc_type recoverFunc) {
std::string walletFile;
std::shared_ptr<BerkeleyEnvironment> env =
GetWalletEnv(file_path, walletFile);
@@ -458,16 +458,15 @@
BerkeleyEnvironment::VerifyResult r =
env->Verify(walletFile, recoverFunc, backup_filename);
if (r == BerkeleyEnvironment::VerifyResult::RECOVER_OK) {
- warnings.push_back(strprintf(
- _("Warning: Wallet file corrupt, data salvaged! Original %s "
- "saved as %s in %s; if your balance or transactions are "
- "incorrect you should restore from a backup.")
- .translated,
- walletFile, backup_filename, walletDir));
+ warnings.push_back(
+ strprintf(_("Warning: Wallet file corrupt, data salvaged!"
+ " Original %s saved as %s in %s; if your balance "
+ "or transactions are incorrect you should restore "
+ "from a backup."),
+ walletFile, backup_filename, walletDir));
}
if (r == BerkeleyEnvironment::VerifyResult::RECOVER_FAIL) {
- errorStr = strprintf(_("%s corrupt, salvage failed").translated,
- walletFile);
+ errorStr = strprintf(_("%s corrupt, salvage failed"), walletFile);
return false;
}
}
diff --git a/src/wallet/load.cpp b/src/wallet/load.cpp
--- a/src/wallet/load.cpp
+++ b/src/wallet/load.cpp
@@ -65,18 +65,16 @@
return false;
}
- std::string error_string;
- std::vector<std::string> warnings;
+ bilingual_str error_string;
+ std::vector<bilingual_str> warnings;
bool verify_success =
CWallet::Verify(chainParams, chain, location, salvage_wallet,
error_string, warnings);
- if (!error_string.empty()) {
- chain.initError(error_string);
- }
if (!warnings.empty()) {
- chain.initWarning(Join(warnings, "\n"));
+ chain.initWarning(Join(warnings, "\n", OpTranslated));
}
if (!verify_success) {
+ chain.initError(error_string.translated);
return false;
}
}
@@ -87,15 +85,15 @@
bool LoadWallets(const CChainParams &chainParams, interfaces::Chain &chain,
const std::vector<std::string> &wallet_files) {
for (const std::string &walletFile : wallet_files) {
- std::string error;
- std::vector<std::string> warnings;
+ bilingual_str error;
+ std::vector<bilingual_str> warnings;
std::shared_ptr<CWallet> pwallet = CWallet::CreateWalletFromFile(
chainParams, chain, WalletLocation(walletFile), error, warnings);
if (!warnings.empty()) {
- chain.initWarning(Join(warnings, "\n"));
+ chain.initWarning(Join(warnings, "\n", OpTranslated));
}
if (!pwallet) {
- chain.initError(error);
+ chain.initError(error.translated);
return false;
}
AddWallet(pwallet);
diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp
--- a/src/wallet/rpcwallet.cpp
+++ b/src/wallet/rpcwallet.cpp
@@ -23,6 +23,7 @@
#include <util/moneystr.h>
#include <util/string.h>
#include <util/system.h>
+#include <util/translation.h>
#include <util/url.h>
#include <util/validation.h>
#include <validation.h>
@@ -3090,17 +3091,17 @@
}
}
- std::string error;
- std::vector<std::string> warning;
+ bilingual_str error;
+ std::vector<bilingual_str> warnings;
std::shared_ptr<CWallet> const wallet =
- LoadWallet(chainParams, *g_rpc_chain, location, error, warning);
+ LoadWallet(chainParams, *g_rpc_chain, location, error, warnings);
if (!wallet) {
- throw JSONRPCError(RPC_WALLET_ERROR, error);
+ throw JSONRPCError(RPC_WALLET_ERROR, error.original);
}
UniValue obj(UniValue::VOBJ);
obj.pushKV("name", wallet->GetName());
- obj.pushKV("warning", Join(warning, "\n"));
+ obj.pushKV("warning", Join(warnings, "\n", OpOriginal));
return obj;
}
@@ -3226,13 +3227,14 @@
SecureString passphrase;
passphrase.reserve(100);
- std::vector<std::string> warnings;
+ std::vector<bilingual_str> warnings;
if (!request.params[3].isNull()) {
passphrase = request.params[3].get_str().c_str();
if (passphrase.empty()) {
// Empty string means unencrypted
- warnings.emplace_back("Empty string given as passphrase, wallet "
- "will not be encrypted.");
+ warnings.emplace_back(
+ Untranslated("Empty string given as passphrase, wallet will "
+ "not be encrypted."));
}
}
@@ -3240,16 +3242,16 @@
flags |= WALLET_FLAG_AVOID_REUSE;
}
- std::string error;
+ bilingual_str error;
std::shared_ptr<CWallet> wallet;
WalletCreationStatus status =
CreateWallet(config.GetChainParams(), *g_rpc_chain, passphrase, flags,
request.params[0].get_str(), error, warnings, wallet);
switch (status) {
case WalletCreationStatus::CREATION_FAILED:
- throw JSONRPCError(RPC_WALLET_ERROR, error);
+ throw JSONRPCError(RPC_WALLET_ERROR, error.original);
case WalletCreationStatus::ENCRYPTION_FAILED:
- throw JSONRPCError(RPC_WALLET_ENCRYPTION_FAILED, error);
+ throw JSONRPCError(RPC_WALLET_ENCRYPTION_FAILED, error.original);
case WalletCreationStatus::SUCCESS:
break;
// no default case, so the compiler can warn about missing cases
@@ -3257,7 +3259,7 @@
UniValue obj(UniValue::VOBJ);
obj.pushKV("name", wallet->GetName());
- obj.pushKV("warning", Join(warnings, "\n"));
+ obj.pushKV("warning", Join(warnings, "\n", OpOriginal));
return obj;
}
diff --git a/src/wallet/scriptpubkeyman.h b/src/wallet/scriptpubkeyman.h
--- a/src/wallet/scriptpubkeyman.h
+++ b/src/wallet/scriptpubkeyman.h
@@ -15,6 +15,7 @@
#include <boost/signals2/signal.hpp>
enum class OutputType;
+struct bilingual_str;
// Wallet storage things that ScriptPubKeyMans need in order to be able to store
// things to the wallet database. It provides access to things that are part of
@@ -192,7 +193,9 @@
virtual bool CanGetAddresses(bool internal = false) { return false; }
/** Upgrades the wallet to the specified version */
- virtual bool Upgrade(int prev_version, std::string &error) { return false; }
+ virtual bool Upgrade(int prev_version, bilingual_str &error) {
+ return false;
+ }
virtual bool HavePrivateKeys() const { return false; }
@@ -329,7 +332,7 @@
bool SetupGeneration(bool force = false) override;
- bool Upgrade(int prev_version, std::string &error) override;
+ bool Upgrade(int prev_version, bilingual_str &error) override;
bool HavePrivateKeys() const override;
diff --git a/src/wallet/scriptpubkeyman.cpp b/src/wallet/scriptpubkeyman.cpp
--- a/src/wallet/scriptpubkeyman.cpp
+++ b/src/wallet/scriptpubkeyman.cpp
@@ -324,9 +324,8 @@
return keypool_has_keys;
}
-bool LegacyScriptPubKeyMan::Upgrade(int prev_version, std::string &error) {
+bool LegacyScriptPubKeyMan::Upgrade(int prev_version, bilingual_str &error) {
AssertLockHeld(cs_wallet);
- error = "";
bool hd_upgrade = false;
bool split_upgrade = false;
if (m_storage.CanSupportFeature(FEATURE_HD) && !IsHDEnabled()) {
@@ -351,7 +350,7 @@
// Regenerate the keypool if upgraded to HD
if (hd_upgrade) {
if (!TopUp()) {
- error = _("Unable to generate keys").translated;
+ error = _("Unable to generate keys");
return false;
}
}
diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h
--- a/src/wallet/wallet.h
+++ b/src/wallet/wallet.h
@@ -40,6 +40,8 @@
using LoadWalletFn =
std::function<void(std::unique_ptr<interfaces::Wallet> wallet)>;
+struct bilingual_str;
+
//! Explicitly unload and delete the wallet.
//! Blocks the current thread after signaling the unload intent so that all
//! wallet clients release the wallet.
@@ -55,8 +57,8 @@
std::shared_ptr<CWallet> LoadWallet(const CChainParams &chainParams,
interfaces::Chain &chain,
const WalletLocation &location,
- std::string &error,
- std::vector<std::string> &warnings);
+ bilingual_str &error,
+ std::vector<bilingual_str> &warnings);
std::unique_ptr<interfaces::Handler> HandleLoadWallet(LoadWalletFn load_wallet);
enum class WalletCreationStatus { SUCCESS, CREATION_FAILED, ENCRYPTION_FAILED };
@@ -65,8 +67,8 @@
interfaces::Chain &chain,
const SecureString &passphrase,
uint64_t wallet_creation_flags,
- const std::string &name, std::string &error,
- std::vector<std::string> &warnings,
+ const std::string &name, bilingual_str &error,
+ std::vector<bilingual_str> &warnings,
std::shared_ptr<CWallet> &result);
//! -paytxfee default
constexpr Amount DEFAULT_PAY_TX_FEE = Amount::zero();
@@ -1270,17 +1272,19 @@
//! Verify wallet naming and perform salvage on the wallet if required
static bool Verify(const CChainParams &chainParams,
interfaces::Chain &chain, const WalletLocation &location,
- bool salvage_wallet, std::string &error_string,
- std::vector<std::string> &warnings);
+ bool salvage_wallet, bilingual_str &error_string,
+ std::vector<bilingual_str> &warnings);
/**
* Initializes the wallet, returns a new CWallet instance or a null pointer
* in case of an error.
*/
- static std::shared_ptr<CWallet> CreateWalletFromFile(
- const CChainParams &chainParams, interfaces::Chain &chain,
- const WalletLocation &location, std::string &error,
- std::vector<std::string> &warnings, uint64_t wallet_creation_flags = 0);
+ static std::shared_ptr<CWallet>
+ CreateWalletFromFile(const CChainParams &chainParams,
+ interfaces::Chain &chain,
+ const WalletLocation &location, bilingual_str &error,
+ std::vector<bilingual_str> &warnings,
+ uint64_t wallet_creation_flags = 0);
/**
* Wallet post-init setup
diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp
--- a/src/wallet/wallet.cpp
+++ b/src/wallet/wallet.cpp
@@ -27,6 +27,7 @@
#include <util/bip32.h>
#include <util/error.h>
#include <util/moneystr.h>
+#include <util/string.h>
#include <util/translation.h>
#include <util/validation.h>
#include <wallet/coincontrol.h>
@@ -153,18 +154,18 @@
std::shared_ptr<CWallet> LoadWallet(const CChainParams &chainParams,
interfaces::Chain &chain,
const WalletLocation &location,
- std::string &error,
- std::vector<std::string> &warnings) {
+ bilingual_str &error,
+ std::vector<bilingual_str> &warnings) {
if (!CWallet::Verify(chainParams, chain, location, false, error,
warnings)) {
- error = "Wallet file verification failed: " + error;
+ error = Untranslated("Wallet file verification failed: ") + error;
return nullptr;
}
std::shared_ptr<CWallet> wallet = CWallet::CreateWalletFromFile(
chainParams, chain, location, error, warnings);
if (!wallet) {
- error = "Wallet loading failed: " + error;
+ error = Untranslated("Wallet loading failed: ") + error;
return nullptr;
}
AddWallet(wallet);
@@ -174,8 +175,9 @@
std::shared_ptr<CWallet> LoadWallet(const CChainParams &chainParams,
interfaces::Chain &chain,
- const std::string &name, std::string &error,
- std::vector<std::string> &warnings) {
+ const std::string &name,
+ bilingual_str &error,
+ std::vector<bilingual_str> &warnings) {
return LoadWallet(chainParams, chain, WalletLocation(name), error,
warnings);
}
@@ -184,8 +186,8 @@
interfaces::Chain &chain,
const SecureString &passphrase,
uint64_t wallet_creation_flags,
- const std::string &name, std::string &error,
- std::vector<std::string> &warnings,
+ const std::string &name, bilingual_str &error,
+ std::vector<bilingual_str> &warnings,
std::shared_ptr<CWallet> &result) {
// Indicate that the wallet is actually supposed to be blank and not just
// blank to make it encrypted
@@ -199,23 +201,26 @@
// Check the wallet file location
WalletLocation location(name);
if (location.Exists()) {
- error = "Wallet " + location.GetName() + " already exists.";
+ error = strprintf(Untranslated("Wallet %s already exists."),
+ location.GetName());
return WalletCreationStatus::CREATION_FAILED;
}
// Wallet::Verify will check if we're trying to create a wallet with a
// duplicate name.
if (!CWallet::Verify(params, chain, location, false, error, warnings)) {
- error = "Wallet file verification failed: " + error;
+ error = Untranslated("Wallet file verification failed.") +
+ Untranslated(" ") + error;
return WalletCreationStatus::CREATION_FAILED;
}
// Do not allow a passphrase when private keys are disabled
if (!passphrase.empty() &&
(wallet_creation_flags & WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
- error = "Passphrase provided but private keys are disabled. A "
- "passphrase is only used to encrypt private keys, so cannot be "
- "used for wallets with private keys disabled.";
+ error = Untranslated(
+ "Passphrase provided but private keys are disabled. A passphrase "
+ "is only used to encrypt private keys, so cannot be used for "
+ "wallets with private keys disabled.");
return WalletCreationStatus::CREATION_FAILED;
}
@@ -223,7 +228,8 @@
std::shared_ptr<CWallet> wallet = CWallet::CreateWalletFromFile(
params, chain, location, error, warnings, wallet_creation_flags);
if (!wallet) {
- error = "Wallet creation failed: " + error;
+ error =
+ Untranslated("Wallet creation failed.") + Untranslated(" ") + error;
return WalletCreationStatus::CREATION_FAILED;
}
@@ -231,13 +237,15 @@
if (!passphrase.empty() &&
!(wallet_creation_flags & WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
if (!wallet->EncryptWallet(passphrase)) {
- error = "Error: Wallet created but failed to encrypt.";
+ error =
+ Untranslated("Error: Wallet created but failed to encrypt.");
return WalletCreationStatus::ENCRYPTION_FAILED;
}
if (!create_blank) {
// Unlock the wallet
if (!wallet->Unlock(passphrase)) {
- error = "Error: Wallet was encrypted but could not be unlocked";
+ error = Untranslated(
+ "Error: Wallet was encrypted but could not be unlocked");
return WalletCreationStatus::ENCRYPTION_FAILED;
}
@@ -245,7 +253,7 @@
{
if (auto spk_man = wallet->m_spk_man.get()) {
if (!spk_man->SetupGeneration()) {
- error = "Unable to generate initial keys";
+ error = Untranslated("Unable to generate initial keys");
return WalletCreationStatus::CREATION_FAILED;
}
}
@@ -3942,8 +3950,8 @@
bool CWallet::Verify(const CChainParams &chainParams, interfaces::Chain &chain,
const WalletLocation &location, bool salvage_wallet,
- std::string &error_string,
- std::vector<std::string> &warnings) {
+ bilingual_str &error_string,
+ std::vector<bilingual_str> &warnings) {
// Do some checking on wallet path. It should be either a:
//
// 1. Path where a directory can be created.
@@ -3957,22 +3965,22 @@
(path_type == fs::symlink_file && fs::is_directory(wallet_path)) ||
(path_type == fs::regular_file &&
fs::path(location.GetName()).filename() == location.GetName()))) {
- error_string =
+ error_string = Untranslated(
strprintf("Invalid -wallet path '%s'. -wallet path should point to "
"a directory where wallet.dat and "
"database/log.?????????? files can be stored, a location "
"where such a directory could be created, "
"or (for backwards compatibility) the name of an "
"existing data file in -walletdir (%s)",
- location.GetName(), GetWalletDir());
+ location.GetName(), GetWalletDir()));
return false;
}
// Make sure that the wallet path doesn't clash with an existing wallet path
if (IsWalletLoaded(wallet_path)) {
- error_string = strprintf(
+ error_string = Untranslated(strprintf(
"Error loading wallet %s. Duplicate -wallet filename specified.",
- location.GetName());
+ location.GetName()));
return false;
}
@@ -3986,9 +3994,9 @@
return false;
}
} catch (const fs::filesystem_error &e) {
- error_string =
+ error_string = Untranslated(
strprintf("Error loading wallet %s. %s", location.GetName(),
- fsbridge::get_filesystem_error_message(e));
+ fsbridge::get_filesystem_error_message(e)));
return false;
}
@@ -4014,8 +4022,8 @@
std::shared_ptr<CWallet> CWallet::CreateWalletFromFile(
const CChainParams &chainParams, interfaces::Chain &chain,
- const WalletLocation &location, std::string &error,
- std::vector<std::string> &warnings, uint64_t wallet_creation_flags) {
+ const WalletLocation &location, bilingual_str &error,
+ std::vector<bilingual_str> &warnings, uint64_t wallet_creation_flags) {
const std::string walletFile =
WalletDataFilePath(location.GetPath()).string();
@@ -4031,8 +4039,8 @@
WalletDatabase::Create(location.GetPath()));
DBErrors nZapWalletRet = tempWallet->ZapWalletTx(vWtx);
if (nZapWalletRet != DBErrors::LOAD_OK) {
- error = strprintf(
- _("Error loading %s: Wallet corrupted").translated, walletFile);
+ error =
+ strprintf(_("Error loading %s: Wallet corrupted"), walletFile);
return nullptr;
}
}
@@ -4050,31 +4058,29 @@
DBErrors nLoadWalletRet = walletInstance->LoadWallet(fFirstRun);
if (nLoadWalletRet != DBErrors::LOAD_OK) {
if (nLoadWalletRet == DBErrors::CORRUPT) {
- error = strprintf(
- _("Error loading %s: Wallet corrupted").translated, walletFile);
+ error =
+ strprintf(_("Error loading %s: Wallet corrupted"), walletFile);
return nullptr;
}
if (nLoadWalletRet == DBErrors::NONCRITICAL_ERROR) {
- warnings.push_back(strprintf(
- _("Error reading %s! All keys read correctly, but transaction "
- "data or address book entries might be missing or incorrect.")
- .translated,
- walletFile));
+ warnings.push_back(
+ strprintf(_("Error reading %s! All keys read correctly, but "
+ "transaction data or address book entries might be "
+ "missing or incorrect."),
+ walletFile));
} else if (nLoadWalletRet == DBErrors::TOO_NEW) {
error = strprintf(
- _("Error loading %s: Wallet requires newer version of %s")
- .translated,
+ _("Error loading %s: Wallet requires newer version of %s"),
walletFile, PACKAGE_NAME);
return nullptr;
} else if (nLoadWalletRet == DBErrors::NEED_REWRITE) {
error = strprintf(
- _("Wallet needed to be rewritten: restart %s to complete")
- .translated,
+ _("Wallet needed to be rewritten: restart %s to complete"),
PACKAGE_NAME);
return nullptr;
} else {
- error = strprintf(_("Error loading %s").translated, walletFile);
+ error = strprintf(_("Error loading %s"), walletFile);
return nullptr;
}
}
@@ -4095,7 +4101,7 @@
}
if (nMaxVersion < walletInstance->GetVersion()) {
- error = _("Cannot downgrade wallet").translated;
+ error = _("Cannot downgrade wallet");
return nullptr;
}
@@ -4115,8 +4121,7 @@
error =
_("Cannot upgrade a non HD split wallet without upgrading to "
"support pre split keypool. Please use -upgradewallet=200300 "
- "or -upgradewallet with no version specified.")
- .translated;
+ "or -upgradewallet with no version specified.");
return nullptr;
}
@@ -4137,7 +4142,7 @@
(WALLET_FLAG_DISABLE_PRIVATE_KEYS | WALLET_FLAG_BLANK_WALLET))) {
if (auto spk_man = walletInstance->m_spk_man.get()) {
if (!spk_man->SetupGeneration()) {
- error = _("Unable to generate initial keys").translated;
+ error = _("Unable to generate initial keys");
return nullptr;
}
}
@@ -4148,8 +4153,7 @@
} else if (wallet_creation_flags & WALLET_FLAG_DISABLE_PRIVATE_KEYS) {
// Make it impossible to disable private keys after creation
error = strprintf(_("Error loading %s: Private keys can only be "
- "disabled during creation")
- .translated,
+ "disabled during creation"),
walletFile);
return nullptr;
} else if (walletInstance->IsWalletFlagSet(
@@ -4158,8 +4162,7 @@
if (walletInstance->m_spk_man->HavePrivateKeys()) {
warnings.push_back(
strprintf(_("Warning: Private keys detected in wallet {%s} "
- "with disabled private keys")
- .translated,
+ "with disabled private keys"),
walletFile));
}
}
@@ -4169,15 +4172,13 @@
Amount n = Amount::zero();
if (!ParseMoney(gArgs.GetArg("-mintxfee", ""), n) ||
n == Amount::zero()) {
- error = AmountErrMsg("mintxfee", gArgs.GetArg("-mintxfee", ""))
- .translated;
+ error = AmountErrMsg("mintxfee", gArgs.GetArg("-mintxfee", ""));
return nullptr;
}
if (n > HIGH_TX_FEE_PER_KB) {
- warnings.push_back(AmountHighWarn("-mintxfee").translated + " " +
+ warnings.push_back(AmountHighWarn("-mintxfee") + Untranslated(" ") +
_("This is the minimum transaction fee you pay "
- "on every transaction.")
- .translated);
+ "on every transaction."));
}
walletInstance->m_min_fee = CFeeRate(n);
}
@@ -4185,16 +4186,16 @@
if (gArgs.IsArgSet("-fallbackfee")) {
Amount nFeePerK = Amount::zero();
if (!ParseMoney(gArgs.GetArg("-fallbackfee", ""), nFeePerK)) {
- error = strprintf(
- _("Invalid amount for -fallbackfee=<amount>: '%s'").translated,
- gArgs.GetArg("-fallbackfee", ""));
+ error =
+ strprintf(_("Invalid amount for -fallbackfee=<amount>: '%s'"),
+ gArgs.GetArg("-fallbackfee", ""));
return nullptr;
}
if (nFeePerK > HIGH_TX_FEE_PER_KB) {
- warnings.push_back(AmountHighWarn("-fallbackfee").translated + " " +
+ warnings.push_back(AmountHighWarn("-fallbackfee") +
+ Untranslated(" ") +
_("This is the transaction fee you may pay when "
- "fee estimates are not available.")
- .translated);
+ "fee estimates are not available."));
}
walletInstance->m_fallback_fee = CFeeRate(nFeePerK);
}
@@ -4205,21 +4206,18 @@
if (gArgs.IsArgSet("-paytxfee")) {
Amount nFeePerK = Amount::zero();
if (!ParseMoney(gArgs.GetArg("-paytxfee", ""), nFeePerK)) {
- error = AmountErrMsg("paytxfee", gArgs.GetArg("-paytxfee", ""))
- .translated;
+ error = AmountErrMsg("paytxfee", gArgs.GetArg("-paytxfee", ""));
return nullptr;
}
if (nFeePerK > HIGH_TX_FEE_PER_KB) {
- warnings.push_back(AmountHighWarn("-paytxfee").translated + " " +
+ warnings.push_back(AmountHighWarn("-paytxfee") + Untranslated(" ") +
_("This is the transaction fee you will pay if "
- "you send a transaction.")
- .translated);
+ "you send a transaction."));
}
walletInstance->m_pay_tx_fee = CFeeRate(nFeePerK, 1000);
if (walletInstance->m_pay_tx_fee < chain.relayMinFee()) {
error = strprintf(_("Invalid amount for -paytxfee=<amount>: '%s' "
- "(must be at least %s)")
- .translated,
+ "(must be at least %s)"),
gArgs.GetArg("-paytxfee", ""),
chain.relayMinFee().ToString());
return nullptr;
@@ -4229,20 +4227,18 @@
if (gArgs.IsArgSet("-maxtxfee")) {
Amount nMaxFee = Amount::zero();
if (!ParseMoney(gArgs.GetArg("-maxtxfee", ""), nMaxFee)) {
- error = AmountErrMsg("maxtxfee", gArgs.GetArg("-maxtxfee", ""))
- .translated;
+ error = AmountErrMsg("maxtxfee", gArgs.GetArg("-maxtxfee", ""));
return nullptr;
}
if (nMaxFee > HIGH_MAX_TX_FEE) {
warnings.push_back(_("-maxtxfee is set very high! Fees this large "
- "could be paid on a single transaction.")
- .translated);
+ "could be paid on a single transaction."));
}
if (CFeeRate(nMaxFee, 1000) < chain.relayMinFee()) {
error = strprintf(
_("Invalid amount for -maxtxfee=<amount>: '%s' (must be at "
- "least the minrelay fee of %s to prevent stuck transactions)")
- .translated,
+ "least the minrelay fee of %s to prevent stuck "
+ "transactions)"),
gArgs.GetArg("-maxtxfee", ""), chain.relayMinFee().ToString());
return nullptr;
}
@@ -4251,9 +4247,8 @@
if (chain.relayMinFee().GetFeePerK() > HIGH_TX_FEE_PER_KB) {
warnings.push_back(
- AmountHighWarn("-minrelaytxfee").translated + " " +
- _("The wallet will avoid paying less than the minimum relay fee.")
- .translated);
+ AmountHighWarn("-minrelaytxfee") + Untranslated(" ") +
+ _("The wallet will avoid paying less than the minimum relay fee."));
}
walletInstance->m_spend_zero_conf_change =
@@ -4312,8 +4307,7 @@
if (rescan_height != block_height) {
error = _("Prune: last wallet synchronisation goes beyond "
"pruned data. You need to -reindex (download the "
- "whole blockchain again in case of pruned node)")
- .translated;
+ "whole blockchain again in case of pruned node)");
return nullptr;
}
}
@@ -4350,8 +4344,7 @@
locked_chain->getBlockHash(rescan_height), BlockHash(),
reserver, true /* update */)
.status)) {
- error = _("Failed to rescan the wallet during initialization")
- .translated;
+ error = _("Failed to rescan the wallet during initialization");
return nullptr;
}
}
diff --git a/src/wallet/walletdb.h b/src/wallet/walletdb.h
--- a/src/wallet/walletdb.h
+++ b/src/wallet/walletdb.h
@@ -246,11 +246,11 @@
static bool IsKeyType(const std::string &strType);
/* verifies the database environment */
static bool VerifyEnvironment(const fs::path &wallet_path,
- std::string &errorStr);
+ bilingual_str &errorStr);
/* verifies the database file */
static bool VerifyDatabaseFile(const fs::path &wallet_path,
- std::vector<std::string> &warnings,
- std::string &errorStr);
+ std::vector<bilingual_str> &warnings,
+ bilingual_str &errorStr);
//! write the hdchain model (external chain child index counter)
bool WriteHDChain(const CHDChain &chain);
diff --git a/src/wallet/walletdb.cpp b/src/wallet/walletdb.cpp
--- a/src/wallet/walletdb.cpp
+++ b/src/wallet/walletdb.cpp
@@ -781,13 +781,13 @@
}
bool WalletBatch::VerifyEnvironment(const fs::path &wallet_path,
- std::string &errorStr) {
+ bilingual_str &errorStr) {
return BerkeleyBatch::VerifyEnvironment(wallet_path, errorStr);
}
bool WalletBatch::VerifyDatabaseFile(const fs::path &wallet_path,
- std::vector<std::string> &warnings,
- std::string &errorStr) {
+ std::vector<bilingual_str> &warnings,
+ bilingual_str &errorStr) {
return BerkeleyBatch::VerifyDatabaseFile(wallet_path, warnings, errorStr,
WalletBatch::Recover);
}
diff --git a/src/wallet/wallettool.cpp b/src/wallet/wallettool.cpp
--- a/src/wallet/wallettool.cpp
+++ b/src/wallet/wallettool.cpp
@@ -5,6 +5,7 @@
#include <chainparams.h>
#include <fs.h>
#include <util/system.h>
+#include <util/translation.h>
#include <wallet/wallet.h>
#include <wallet/walletutil.h>
@@ -136,7 +137,7 @@
tfm::format(std::cerr, "Error: no wallet file at %s\n", name);
return false;
}
- std::string error;
+ bilingual_str error;
if (!WalletBatch::VerifyEnvironment(path, error)) {
tfm::format(
std::cerr,
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Mar 1, 11:33 (8 h, 3 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5187627
Default Alt Text
D7701.diff (42 KB)
Attached To
D7701: wallet: Avoid translating RPC errors when loading wallets
Event Timeline
Log In to Comment