Skip to content

Commit eeee6cf

Browse files
MarcoFalkeryanofsky
andcommitted
refactor: Delay translation of _() literals
This is required for a future commit that requires _() to be consteval for format literals. Co-Authored-By: Ryan Ofsky <[email protected]>
1 parent 35bf426 commit eeee6cf

File tree

8 files changed

+43
-34
lines changed

8 files changed

+43
-34
lines changed

src/banman.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ void BanMan::LoadBanlist()
3030
{
3131
LOCK(m_banned_mutex);
3232

33-
if (m_client_interface) m_client_interface->InitMessage(_("Loading banlist…").translated);
33+
if (m_client_interface) m_client_interface->InitMessage(_("Loading banlist…"));
3434

3535
const auto start{SteadyClock::now()};
3636
if (m_ban_db.Read(m_banned)) {

src/clientversion.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ std::string LicenseInfo()
9595
strprintf(_("The source code is available from %s."), URL_SOURCE_CODE).translated +
9696
"\n" +
9797
"\n" +
98-
_("This is experimental software.").translated + "\n" +
98+
_("This is experimental software.") + "\n" +
9999
strprintf(_("Distributed under the MIT software license, see the accompanying file %s or %s"), "COPYING", "<https://opensource.org/licenses/MIT>").translated +
100100
"\n";
101101
}

src/init.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1244,8 +1244,8 @@ static ChainstateLoadResult InitAndLoadChainstate(
12441244
_("Error reading from database, shutting down."),
12451245
"", CClientUIInterface::MSG_ERROR);
12461246
};
1247-
uiInterface.InitMessage(_("Loading block index…").translated);
1248-
auto catch_exceptions = [](auto&& f) {
1247+
uiInterface.InitMessage(_("Loading block index…"));
1248+
auto catch_exceptions = [](auto&& f) -> ChainstateLoadResult {
12491249
try {
12501250
return f();
12511251
} catch (const std::exception& e) {
@@ -1255,7 +1255,7 @@ static ChainstateLoadResult InitAndLoadChainstate(
12551255
};
12561256
auto [status, error] = catch_exceptions([&] { return LoadChainstate(chainman, cache_sizes, options); });
12571257
if (status == node::ChainstateLoadStatus::SUCCESS) {
1258-
uiInterface.InitMessage(_("Verifying blocks…").translated);
1258+
uiInterface.InitMessage(_("Verifying blocks…"));
12591259
if (chainman.m_blockman.m_have_pruned && options.check_blocks > MIN_BLOCKS_TO_KEEP) {
12601260
LogWarning("pruned datadir may not have more than %d blocks; only checking available blocks\n",
12611261
MIN_BLOCKS_TO_KEEP);
@@ -1418,7 +1418,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
14181418

14191419
// Initialize addrman
14201420
assert(!node.addrman);
1421-
uiInterface.InitMessage(_("Loading P2P addresses…").translated);
1421+
uiInterface.InitMessage(_("Loading P2P addresses…"));
14221422
auto addrman{LoadAddrman(*node.netgroupman, args)};
14231423
if (!addrman) return InitError(util::ErrorString(addrman));
14241424
node.addrman = std::move(*addrman);
@@ -1703,7 +1703,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
17031703
if (chainman.m_blockman.m_blockfiles_indexed) {
17041704
LOCK(cs_main);
17051705
for (Chainstate* chainstate : chainman.GetAll()) {
1706-
uiInterface.InitMessage(_("Pruning blockstore…").translated);
1706+
uiInterface.InitMessage(_("Pruning blockstore…"));
17071707
chainstate->PruneAndFlush();
17081708
}
17091709
}
@@ -1999,7 +1999,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
19991999
// ChainstateManager's active tip.
20002000
SetRPCWarmupFinished();
20012001

2002-
uiInterface.InitMessage(_("Done loading").translated);
2002+
uiInterface.InitMessage(_("Done loading"));
20032003

20042004
for (const auto& client : node.chain_clients) {
20052005
client->start(scheduler);

src/net.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3296,7 +3296,7 @@ bool CConnman::Start(CScheduler& scheduler, const Options& connOptions)
32963296
}
32973297

32983298
if (m_client_interface) {
3299-
m_client_interface->InitMessage(_("Starting network threads…").translated);
3299+
m_client_interface->InitMessage(_("Starting network threads…"));
33003300
}
33013301

33023302
fAddressesInitialized = true;

src/util/translation.h

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@
66
#define BITCOIN_UTIL_TRANSLATION_H
77

88
#include <tinyformat.h>
9+
#include <util/string.h>
910

11+
#include <cassert>
1012
#include <functional>
1113
#include <string>
1214

1315
/** Translate a message to the native language of the user. */
14-
const extern std::function<std::string(const char*)> G_TRANSLATION_FUN;
16+
using TranslateFn = std::function<std::string(const char*)>;
17+
const extern TranslateFn G_TRANSLATION_FUN;
1518

1619
/**
1720
* Bilingual messages:
@@ -47,6 +50,27 @@ inline bilingual_str operator+(bilingual_str lhs, const bilingual_str& rhs)
4750
return lhs;
4851
}
4952

53+
namespace util {
54+
//! Compile-time literal string that can be translated with an optional translation function.
55+
struct TranslatedLiteral {
56+
const char* const original;
57+
const TranslateFn* translate_fn;
58+
59+
consteval TranslatedLiteral(const char* str, const TranslateFn* fn = &G_TRANSLATION_FUN) : original{str}, translate_fn{fn} { assert(original); }
60+
operator std::string() const { return translate_fn && *translate_fn ? (*translate_fn)(original) : original; }
61+
operator bilingual_str() const { return {original, std::string{*this}}; }
62+
};
63+
64+
// TranslatedLiteral operators for formatting and adding to strings.
65+
inline std::ostream& operator<<(std::ostream& os, const TranslatedLiteral& lit) { return os << std::string{lit}; }
66+
template<typename T>
67+
T operator+(const T& lhs, const TranslatedLiteral& rhs) { return lhs + static_cast<T>(rhs); }
68+
template<typename T>
69+
T operator+(const TranslatedLiteral& lhs, const T& rhs) { return static_cast<T>(lhs) + rhs; }
70+
} // namespace util
71+
72+
consteval auto _(util::TranslatedLiteral str) { return str; }
73+
5074
/** Mark a bilingual_str as untranslated */
5175
inline bilingual_str Untranslated(std::string original) { return {original, original}; }
5276

@@ -67,19 +91,4 @@ bilingual_str format(const bilingual_str& fmt, const Args&... args)
6791
}
6892
} // namespace tinyformat
6993

70-
struct ConstevalStringLiteral {
71-
const char* const lit;
72-
consteval ConstevalStringLiteral(const char* str) : lit{str} {}
73-
consteval ConstevalStringLiteral(std::nullptr_t) = delete;
74-
};
75-
76-
/**
77-
* Translation function.
78-
* If no translation function is set, simply return the input.
79-
*/
80-
inline bilingual_str _(ConstevalStringLiteral str)
81-
{
82-
return bilingual_str{str.lit, G_TRANSLATION_FUN ? (G_TRANSLATION_FUN)(str.lit) : str.lit};
83-
}
84-
8594
#endif // BITCOIN_UTIL_TRANSLATION_H

src/wallet/load.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ bool VerifyWallets(WalletContext& context)
5252

5353
LogPrintf("Using wallet directory %s\n", fs::PathToString(GetWalletDir()));
5454

55-
chain.initMessage(_("Verifying wallet(s)…").translated);
55+
chain.initMessage(_("Verifying wallet(s)…"));
5656

5757
// For backwards compatibility if an unnamed top level wallet exists in the
5858
// wallets directory, include it in the default list of wallets to load.
@@ -135,7 +135,7 @@ bool LoadWallets(WalletContext& context)
135135
if (!database && status == DatabaseStatus::FAILED_NOT_FOUND) {
136136
continue;
137137
}
138-
chain.initMessage(_("Loading wallet…").translated);
138+
chain.initMessage(_("Loading wallet…"));
139139
std::shared_ptr<CWallet> pwallet = database ? CWallet::Create(context, name, std::move(database), options.create_flags, error, warnings) : nullptr;
140140
if (!warnings.empty()) chain.initWarning(Join(warnings, Untranslated("\n")));
141141
if (!pwallet) {

src/wallet/rpc/backup.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,7 @@ RPCHelpMan importwallet()
534534

535535
// Use uiInterface.ShowProgress instead of pwallet.ShowProgress because pwallet.ShowProgress has a cancel button tied to AbortRescan which
536536
// we don't want for this progress bar showing the import progress. uiInterface.ShowProgress does not have a cancel button.
537-
pwallet->chain().showProgress(strprintf("%s %s", pwallet->GetDisplayName(), _("Importing…").translated), 0, false); // show progress dialog in GUI
537+
pwallet->chain().showProgress(strprintf("%s %s", pwallet->GetDisplayName(), _("Importing…")), 0, false); // show progress dialog in GUI
538538
std::vector<std::tuple<CKey, int64_t, bool, std::string>> keys;
539539
std::vector<std::pair<CScript, int64_t>> scripts;
540540
while (file.good()) {

src/wallet/wallet.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ std::shared_ptr<CWallet> LoadWalletInternal(WalletContext& context, const std::s
280280
return nullptr;
281281
}
282282

283-
context.chain->initMessage(_("Loading wallet…").translated);
283+
context.chain->initMessage(_("Loading wallet…"));
284284
std::shared_ptr<CWallet> wallet = CWallet::Create(context, name, std::move(database), options.create_flags, error, warnings);
285285
if (!wallet) {
286286
error = Untranslated("Wallet loading failed.") + Untranslated(" ") + error;
@@ -430,7 +430,7 @@ std::shared_ptr<CWallet> CreateWallet(WalletContext& context, const std::string&
430430
}
431431

432432
// Make the wallet
433-
context.chain->initMessage(_("Loading wallet…").translated);
433+
context.chain->initMessage(_("Loading wallet…"));
434434
std::shared_ptr<CWallet> wallet = CWallet::Create(context, name, std::move(database), wallet_creation_flags, error, warnings);
435435
if (!wallet) {
436436
error = Untranslated("Wallet creation failed.") + Untranslated(" ") + error;
@@ -1903,7 +1903,7 @@ CWallet::ScanResult CWallet::ScanForWalletTransactions(const uint256& start_bloc
19031903
fast_rescan_filter ? "fast variant using block filters" : "slow variant inspecting all blocks");
19041904

19051905
fAbortRescan = false;
1906-
ShowProgress(strprintf("%s %s", GetDisplayName(), _("Rescanning…").translated), 0); // show rescan progress in GUI as dialog or on splashscreen, if rescan required on startup (e.g. due to corruption)
1906+
ShowProgress(strprintf("%s %s", GetDisplayName(), _("Rescanning…")), 0); // show rescan progress in GUI as dialog or on splashscreen, if rescan required on startup (e.g. due to corruption)
19071907
uint256 tip_hash = WITH_LOCK(cs_wallet, return GetLastBlockHash());
19081908
uint256 end_hash = tip_hash;
19091909
if (max_height) chain().findAncestorByHeight(tip_hash, *max_height, FoundBlock().hash(end_hash));
@@ -1918,7 +1918,7 @@ CWallet::ScanResult CWallet::ScanForWalletTransactions(const uint256& start_bloc
19181918
m_scanning_progress = 0;
19191919
}
19201920
if (block_height % 100 == 0 && progress_end - progress_begin > 0.0) {
1921-
ShowProgress(strprintf("%s %s", GetDisplayName(), _("Rescanning…").translated), std::max(1, std::min(99, (int)(m_scanning_progress * 100))));
1921+
ShowProgress(strprintf("%s %s", GetDisplayName(), _("Rescanning…")), std::max(1, std::min(99, (int)(m_scanning_progress * 100))));
19221922
}
19231923

19241924
bool next_interval = reserver.now() >= current_time + INTERVAL_TIME;
@@ -2015,7 +2015,7 @@ CWallet::ScanResult CWallet::ScanForWalletTransactions(const uint256& start_bloc
20152015
WalletLogPrintf("Scanning current mempool transactions.\n");
20162016
WITH_LOCK(cs_wallet, chain().requestMempoolTransactions(*this));
20172017
}
2018-
ShowProgress(strprintf("%s %s", GetDisplayName(), _("Rescanning…").translated), 100); // hide progress dialog in GUI
2018+
ShowProgress(strprintf("%s %s", GetDisplayName(), _("Rescanning…")), 100); // hide progress dialog in GUI
20192019
if (block_height && fAbortRescan) {
20202020
WalletLogPrintf("Rescan aborted at block %d. Progress=%f\n", block_height, progress_current);
20212021
result.status = ScanResult::USER_ABORT;
@@ -3353,7 +3353,7 @@ bool CWallet::AttachChain(const std::shared_ptr<CWallet>& walletInstance, interf
33533353
}
33543354
}
33553355

3356-
chain.initMessage(_("Rescanning…").translated);
3356+
chain.initMessage(_("Rescanning…"));
33573357
walletInstance->WalletLogPrintf("Rescanning last %i blocks (from block %i)...\n", *tip_height - rescan_height, rescan_height);
33583358

33593359
{

0 commit comments

Comments
 (0)