fix: sidebar nav text overflow for long translations

- Add text scaling for section labels (TOOLS, ADVANCED) in sidebar
- Separate explorer_section key from explorer nav label to fix ALL CAPS
- Shorten long sidebar translations: es/pt settings, pt overview, ru tools/advanced
- Fix explorer translations from ALL CAPS to proper case in all languages
This commit is contained in:
2026-04-12 18:45:48 -05:00
parent 40cec14ebf
commit aa26ab5fbd
24 changed files with 22297 additions and 20583 deletions
+24 -24
View File
@@ -1450,27 +1450,27 @@ void App::renderStatusBar()
ImGui::SameLine(0, sbIconTextGap);
// Show truncated warmup status (e.g. "Activating best chain... (Block 12345)")
const char* warmupText = state_.warmup_status.empty()
? "Warming up..." : state_.warmup_status.c_str();
? TR("sb_warming_up") : state_.warmup_status.c_str();
ImGui::TextColored(ImVec4(1.0f, 0.8f, 0.0f, 1.0f), "%s", warmupText);
} else if (state_.connected) {
ImGui::PushFont(ui::material::Type().iconSmall());
ImGui::TextColored(ImVec4(0.2f, 0.8f, 0.2f, dotOpacity), ICON_MD_CIRCLE);
ImGui::PopFont();
ImGui::SameLine(0, sbIconTextGap);
ImGui::Text("Connected");
ImGui::Text("%s", TR("connected"));
} else {
ImGui::PushFont(ui::material::Type().iconSmall());
ImGui::TextColored(ImVec4(0.8f, 0.2f, 0.2f, dotOpacity), ICON_MD_CIRCLE);
ImGui::PopFont();
ImGui::SameLine(0, sbIconTextGap);
ImGui::Text("Disconnected");
ImGui::Text("%s", TR("disconnected"));
}
// Block height
ImGui::SameLine(0, sbSectionGap);
ImGui::TextDisabled("|");
ImGui::SameLine(0, sbSeparatorGap);
ImGui::Text("Block: %d", state_.sync.blocks);
ImGui::Text(TR("sb_block"), state_.sync.blocks);
// Sync status or peer count
ImGui::SameLine(0, sbSectionGap);
@@ -1480,13 +1480,13 @@ void App::renderStatusBar()
// Show rescan progress (takes priority over sync)
// Use animated dots if progress is unknown (0%)
if (state_.sync.rescan_progress > 0.01f) {
ImGui::TextColored(ImVec4(0.6f, 0.8f, 1.0f, 1.0f), "Rescanning %.0f%%",
ImGui::TextColored(ImVec4(0.6f, 0.8f, 1.0f, 1.0f), TR("sb_rescanning_pct"),
state_.sync.rescan_progress * 100.0f);
} else {
// Animated "Rescanning..." with pulsing dots
int dots = (int)(ImGui::GetTime() * 2.0f) % 4;
const char* dotStr = (dots == 0) ? "." : (dots == 1) ? ".." : (dots == 2) ? "..." : "";
ImGui::TextColored(ImVec4(0.6f, 0.8f, 1.0f, 1.0f), "Rescanning%s", dotStr);
ImGui::TextColored(ImVec4(0.6f, 0.8f, 1.0f, 1.0f), "%s%s", TR("sb_rescanning"), dotStr);
}
} else if (state_.sync.syncing) {
int chainTip = state_.longestchain > 0 ? state_.longestchain : state_.sync.headers;
@@ -1528,14 +1528,14 @@ void App::renderStatusBar()
snprintf(eta, sizeof(eta), "%dm %ds", eta_sec / 60, eta_sec % 60);
else
snprintf(eta, sizeof(eta), "%ds", eta_sec);
ImGui::TextColored(ImVec4(1.0f, 0.8f, 0.0f, 1.0f), "Syncing %.1f%% (%d left, %.0f blk/s, ~%s)",
ImGui::TextColored(ImVec4(1.0f, 0.8f, 0.0f, 1.0f), TR("sb_syncing_eta"),
state_.sync.verification_progress * 100.0, blocksLeft, s_blocks_per_sec, eta);
} else {
ImGui::TextColored(ImVec4(1.0f, 0.8f, 0.0f, 1.0f), "Syncing %.1f%% (%d left)",
ImGui::TextColored(ImVec4(1.0f, 0.8f, 0.0f, 1.0f), TR("sb_syncing_basic"),
state_.sync.verification_progress * 100.0, blocksLeft);
}
} else if (state_.connected) {
ImGui::Text("Peers: %zu", state_.peers.size());
ImGui::Text(TR("sb_peers"), state_.peers.size());
}
// Network hashrate (if connected and have data)
@@ -1544,13 +1544,13 @@ void App::renderStatusBar()
ImGui::TextDisabled("|");
ImGui::SameLine(0, sbSeparatorGap);
if (state_.mining.networkHashrate >= 1e9) {
ImGui::Text("Net: %.2f GH/s", state_.mining.networkHashrate / 1e9);
ImGui::Text(TR("sb_net_ghs"), state_.mining.networkHashrate / 1e9);
} else if (state_.mining.networkHashrate >= 1e6) {
ImGui::Text("Net: %.2f MH/s", state_.mining.networkHashrate / 1e6);
ImGui::Text(TR("sb_net_mhs"), state_.mining.networkHashrate / 1e6);
} else if (state_.mining.networkHashrate >= 1e3) {
ImGui::Text("Net: %.2f KH/s", state_.mining.networkHashrate / 1e3);
ImGui::Text(TR("sb_net_khs"), state_.mining.networkHashrate / 1e3);
} else {
ImGui::Text("Net: %.1f H/s", state_.mining.networkHashrate);
ImGui::Text(TR("sb_net_hs"), state_.mining.networkHashrate);
}
}
@@ -1567,7 +1567,7 @@ void App::renderStatusBar()
double displayHashrate = state_.pool_mining.xmrig_running
? state_.pool_mining.hashrate_10s
: state_.mining.localHashrate;
ImGui::TextColored(ImVec4(0.3f, 0.8f, 0.3f, 1.0f), "%.1f H/s",
ImGui::TextColored(ImVec4(0.3f, 0.8f, 0.3f, 1.0f), TR("sb_mining_hs"),
displayHashrate);
}
@@ -1583,7 +1583,7 @@ void App::renderStatusBar()
ImGui::SameLine(0, sbIconTextGap);
int dots = (int)(ImGui::GetTime() * 2.0f) % 4;
const char* dotStr = (dots == 0) ? "." : (dots == 1) ? ".." : (dots == 2) ? "..." : "";
ImGui::TextColored(ImVec4(0.6f, 0.8f, 1.0f, 1.0f), "Importing keys%s", dotStr);
ImGui::TextColored(ImVec4(0.6f, 0.8f, 1.0f, 1.0f), "%s%s", TR("sb_importing_keys"), dotStr);
}
// Right side: version always at far right, connection status to its left.
@@ -1605,7 +1605,7 @@ void App::renderStatusBar()
ImGui::SameLine(statusX);
ImGui::TextDisabled("%s", connection_status_.c_str());
} else if (!daemon_status_.empty() && daemon_status_.find("Error") != std::string::npos) {
const char* errText = "Daemon not found";
const char* errText = TR("sb_daemon_not_found");
float statusW = ImGui::CalcTextSize(errText).x;
float statusX = versionX - statusW - gap;
ImGui::SameLine(statusX);
@@ -2062,12 +2062,12 @@ bool App::startEmbeddedDaemon()
// Try to extract embedded resources if available
if (resources::hasEmbeddedResources()) {
DEBUG_LOGF("Extracting embedded Sapling params...\n");
daemon_status_ = "Extracting Sapling parameters...";
daemon_status_ = TR("sb_extracting_sapling");
resources::extractEmbeddedResources();
// Check again after extraction
if (!rpc::Connection::verifySaplingParams()) {
daemon_status_ = "Failed to extract Sapling parameters.";
daemon_status_ = TR("sb_sapling_failed");
DEBUG_LOGF("Sapling params still not found after extraction!\n");
DEBUG_LOGF("Expected location: %s\n", rpc::Connection::getSaplingParamsDir().c_str());
return false;
@@ -2113,7 +2113,7 @@ bool App::startEmbeddedDaemon()
if (copied && rpc::Connection::verifySaplingParams()) {
DEBUG_LOGF("Sapling params copied from exe directory successfully\n");
} else {
daemon_status_ = "Sapling parameters not found. They should be in: " + rpc::Connection::getSaplingParamsDir();
daemon_status_ = TR("sb_sapling_not_found");
DEBUG_LOGF("Sapling params not found and no embedded resources available!\n");
DEBUG_LOGF("Expected location: %s\n", rpc::Connection::getSaplingParamsDir().c_str());
return false;
@@ -2163,16 +2163,16 @@ bool App::startEmbeddedDaemon()
embedded_daemon_->setStateCallback([this](daemon::EmbeddedDaemon::State state, const std::string& msg) {
switch (state) {
case daemon::EmbeddedDaemon::State::Starting:
daemon_status_ = "Starting dragonxd...";
daemon_status_ = TR("sb_starting_daemon");
break;
case daemon::EmbeddedDaemon::State::Running:
daemon_status_ = "dragonxd running";
daemon_status_ = TR("sb_dragonxd_running");
break;
case daemon::EmbeddedDaemon::State::Stopping:
daemon_status_ = "Stopping dragonxd...";
daemon_status_ = TR("sb_dragonxd_stopping");
break;
case daemon::EmbeddedDaemon::State::Stopped:
daemon_status_ = "dragonxd stopped";
daemon_status_ = TR("sb_dragonxd_stopped");
break;
case daemon::EmbeddedDaemon::State::Error:
daemon_status_ = "Error: " + msg;
@@ -3105,7 +3105,7 @@ void App::restartDaemon()
}
DEBUG_LOGF("[App] Restarting embedded daemon...\n");
connection_status_ = "Restarting daemon...";
connection_status_ = TR("sb_restarting_daemon");
// Disconnect RPC so the loading overlay appears
if (rpc_ && rpc_->isConnected()) {
+21 -17
View File
@@ -40,6 +40,7 @@
#include "default_banlist_embedded.h"
#include "util/platform.h"
#include "util/perf_log.h"
#include "util/i18n.h"
#include <nlohmann/json.hpp>
#include <curl/curl.h>
@@ -95,7 +96,7 @@ void App::tryConnect()
++connect_attempt;
connection_in_progress_ = true;
connection_status_ = "Loading configuration...";
connection_status_ = TR("sb_loading_config");
// Auto-detect configuration (file I/O — fast, safe on main thread)
auto config = rpc::Connection::autoDetectConfig();
@@ -109,23 +110,23 @@ void App::tryConnect()
// If we already know an external daemon is on the port, just wait
// for the config file to appear (the daemon creates it on first run).
if (embedded_daemon_ && embedded_daemon_->externalDaemonDetected()) {
connection_status_ = "Waiting for daemon config...";
connection_status_ = TR("sb_waiting_config");
VERBOSE_LOGF("[connect #%d] External daemon detected on port, waiting for config file to appear\n", connect_attempt);
core_timer_ = CORE_INTERVAL_DEFAULT - 1.0f;
return;
}
connection_status_ = "No DRAGONX.conf found";
connection_status_ = TR("sb_no_conf");
// Try to start embedded daemon if enabled
if (use_embedded_daemon_ && !isEmbeddedDaemonRunning()) {
connection_status_ = "Starting dragonxd...";
connection_status_ = TR("sb_starting_daemon");
if (startEmbeddedDaemon()) {
// Will retry connection after daemon starts
VERBOSE_LOGF("[connect #%d] Embedded daemon starting, will retry connection...\n", connect_attempt);
core_timer_ = CORE_INTERVAL_DEFAULT - 1.0f;
} else if (embedded_daemon_ && embedded_daemon_->externalDaemonDetected()) {
connection_status_ = "Waiting for daemon config...";
connection_status_ = TR("sb_waiting_config");
VERBOSE_LOGF("[connect #%d] External daemon detected but no config yet, will retry...\n", connect_attempt);
core_timer_ = CORE_INTERVAL_DEFAULT - 1.0f;
} else {
@@ -141,7 +142,7 @@ void App::tryConnect()
return;
}
connection_status_ = "Connecting to dragonxd...";
connection_status_ = TR("sb_connecting_daemon");
VERBOSE_LOGF("[connect #%d] Connecting to %s:%s (user=%s)\n",
connect_attempt, config.host.c_str(), config.port.c_str(), config.rpcuser.c_str());
@@ -235,7 +236,7 @@ void App::tryConnect()
onConnected();
} else {
state_.connected = false;
connection_status_ = "Auth failed — check rpcuser/rpcpassword";
connection_status_ = TR("sb_auth_failed");
VERBOSE_LOGF("[connect #%d] .cookie auth also failed\n", attempt);
ui::Notifications::instance().error(
"RPC authentication failed (HTTP 401). "
@@ -248,7 +249,7 @@ void App::tryConnect()
}
state_.connected = false;
std::string confPath = rpc::Connection::getDefaultConfPath();
connection_status_ = "Auth failed — check rpcuser/rpcpassword";
connection_status_ = TR("sb_auth_failed");
VERBOSE_LOGF("[connect #%d] HTTP 401 — rpcuser/rpcpassword in %s don't match the daemon. "
"Edit the file or restart the daemon to regenerate credentials.\n",
attempt, confPath.c_str());
@@ -261,9 +262,10 @@ void App::tryConnect()
// Show the actual RPC error alongside the waiting message so
// auth mismatches and timeouts aren't silently hidden.
if (!connectErr.empty()) {
connection_status_ = "Waiting for dragonxd — " + connectErr;
char buf[256]; snprintf(buf, sizeof(buf), TR("sb_waiting_daemon_err"), connectErr.c_str());
connection_status_ = buf;
} else {
connection_status_ = "Waiting for dragonxd to start...";
connection_status_ = TR("sb_waiting_daemon");
}
VERBOSE_LOGF("[connect #%d] RPC connection failed (%s) — daemon still starting, will retry...\n",
attempt, connectErr.c_str());
@@ -271,9 +273,10 @@ void App::tryConnect()
} else if (externalDetected) {
state_.connected = false;
if (!connectErr.empty()) {
connection_status_ = "Connecting to daemon — " + connectErr;
char buf[256]; snprintf(buf, sizeof(buf), TR("sb_connecting_err"), connectErr.c_str());
connection_status_ = buf;
} else {
connection_status_ = "Connecting to external daemon...";
connection_status_ = TR("sb_connecting_external");
}
VERBOSE_LOGF("[connect #%d] External daemon detected but RPC failed (%s), will retry...\n",
attempt, connectErr.c_str());
@@ -285,15 +288,16 @@ void App::tryConnect()
if (use_embedded_daemon_ && !isEmbeddedDaemonRunning()) {
// Prevent infinite crash-restart loop
if (embedded_daemon_ && embedded_daemon_->getCrashCount() >= 3) {
connection_status_ = "Daemon crashed " + std::to_string(embedded_daemon_->getCrashCount()) + " times";
{ char buf[128]; snprintf(buf, sizeof(buf), TR("sb_daemon_crashed"), embedded_daemon_->getCrashCount());
connection_status_ = buf; }
VERBOSE_LOGF("[connect #%d] Daemon crashed %d times — not restarting (use Settings > Restart Daemon to retry)\n",
attempt, embedded_daemon_->getCrashCount());
} else {
connection_status_ = "Starting dragonxd...";
connection_status_ = TR("sb_starting_daemon");
if (startEmbeddedDaemon()) {
VERBOSE_LOGF("[connect #%d] Embedded daemon starting, will retry connection...\n", attempt);
} else if (embedded_daemon_ && embedded_daemon_->externalDaemonDetected()) {
connection_status_ = "Connecting to daemon...";
connection_status_ = TR("sb_connecting_generic");
VERBOSE_LOGF("[connect #%d] External daemon detected, will connect via RPC...\n", attempt);
} else {
VERBOSE_LOGF("[connect #%d] Failed to start embedded daemon — lastError: %s\n",
@@ -317,7 +321,7 @@ void App::tryConnect()
void App::onConnected()
{
state_.connected = true;
connection_status_ = "Connected";
connection_status_ = TR("connected");
// Reset crash counter on successful connection
if (embedded_daemon_) {
@@ -597,7 +601,7 @@ void App::refreshCoreData()
state_.warming_up = false;
state_.warmup_status.clear();
state_.warmup_description.clear();
connection_status_ = "Connected";
connection_status_ = TR("connected");
VERBOSE_LOGF("[warmup] Daemon ready, warmup complete\n");
// Parse initial info
try {
+149 -2
View File
@@ -1005,7 +1005,7 @@ unsigned char res_lang_de_json[] = {
0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x69, 0x74, 0x22, 0x3a, 0x20, 0x22,
0x42, 0x65, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x22,
0x3a, 0x20, 0x22, 0x45, 0x58, 0x50, 0x4c, 0x4f, 0x52, 0x45, 0x52, 0x22,
0x3a, 0x20, 0x22, 0x45, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x22,
0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x6c, 0x6f,
0x72, 0x65, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x64, 0x65,
0x74, 0x61, 0x69, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x42, 0x6c, 0x6f, 0x63,
@@ -1057,6 +1057,9 @@ unsigned char res_lang_de_json[] = {
0x22, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x5f, 0x73, 0x65,
0x61, 0x72, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x68,
0x65, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78,
0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x74, 0x69,
0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x58, 0x50, 0x4c, 0x4f, 0x52,
0x45, 0x52, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78,
0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x6f, 0x75,
0x74, 0x70, 0x75, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x75, 0x73,
0x67, 0x61, 0x62, 0x65, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20,
@@ -2473,6 +2476,150 @@ unsigned char res_lang_de_json[] = {
0x22, 0x5a, 0x2d, 0x54, 0x78, 0x20, 0x69, 0x6e, 0x20, 0x54, 0x78, 0x2d,
0x4c, 0x69, 0x73, 0x74, 0x65, 0x20, 0x73, 0x70, 0x65, 0x69, 0x63, 0x68,
0x65, 0x72, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73,
0x62, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65,
0x64, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74,
0x69, 0x66, 0x69, 0x7a, 0x69, 0x65, 0x72, 0x75, 0x6e, 0x67, 0x20, 0x66,
0x65, 0x68, 0x6c, 0x67, 0x65, 0x73, 0x63, 0x68, 0x6c, 0x61, 0x67, 0x65,
0x6e, 0x20, 0xe2, 0x80, 0x94, 0x20, 0x72, 0x70, 0x63, 0x75, 0x73, 0x65,
0x72, 0x2f, 0x72, 0x70, 0x63, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,
0x64, 0x20, 0x70, 0x72, 0xc3, 0xbc, 0x66, 0x65, 0x6e, 0x22, 0x2c, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x62, 0x6c, 0x6f, 0x63,
0x6b, 0x22, 0x3a, 0x20, 0x22, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x20,
0x25, 0x64, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62,
0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x5f,
0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x56, 0x65,
0x72, 0x62, 0x69, 0x6e, 0x64, 0x75, 0x6e, 0x67, 0x20, 0x7a, 0x75, 0x20,
0x64, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x78, 0x64, 0x2e, 0x2e, 0x2e, 0x22,
0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x63, 0x6f,
0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x72, 0x72,
0x22, 0x3a, 0x20, 0x22, 0x56, 0x65, 0x72, 0x62, 0x69, 0x6e, 0x64, 0x75,
0x6e, 0x67, 0x20, 0x7a, 0x75, 0x6d, 0x20, 0x44, 0x61, 0x65, 0x6d, 0x6f,
0x6e, 0x20, 0xe2, 0x80, 0x94, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
0x63, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e,
0x61, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x56, 0x65, 0x72, 0x62, 0x69, 0x6e,
0x64, 0x75, 0x6e, 0x67, 0x20, 0x7a, 0x75, 0x20, 0x65, 0x78, 0x74, 0x65,
0x72, 0x6e, 0x65, 0x6d, 0x20, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e,
0x2e, 0x2e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62,
0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x5f,
0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x22, 0x3a, 0x20, 0x22, 0x56,
0x65, 0x72, 0x62, 0x69, 0x6e, 0x64, 0x75, 0x6e, 0x67, 0x20, 0x7a, 0x75,
0x6d, 0x20, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x2e, 0x2e, 0x22,
0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x64, 0x61,
0x65, 0x6d, 0x6f, 0x6e, 0x5f, 0x63, 0x72, 0x61, 0x73, 0x68, 0x65, 0x64,
0x22, 0x3a, 0x20, 0x22, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x20, 0x69,
0x73, 0x74, 0x20, 0x25, 0x64, 0x20, 0x6d, 0x61, 0x6c, 0x20, 0x61, 0x62,
0x67, 0x65, 0x73, 0x74, 0xc3, 0xbc, 0x72, 0x7a, 0x74, 0x22, 0x2c, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x64, 0x61, 0x65, 0x6d,
0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x66, 0x6f, 0x75, 0x6e, 0x64,
0x22, 0x3a, 0x20, 0x22, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x20, 0x6e,
0x69, 0x63, 0x68, 0x74, 0x20, 0x67, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x65,
0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f,
0x64, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x78, 0x64, 0x5f, 0x72, 0x75, 0x6e,
0x6e, 0x69, 0x6e, 0x67, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x72, 0x61, 0x67,
0x6f, 0x6e, 0x78, 0x64, 0x20, 0x6c, 0xc3, 0xa4, 0x75, 0x66, 0x74, 0x22,
0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x64, 0x72,
0x61, 0x67, 0x6f, 0x6e, 0x78, 0x64, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x70,
0x65, 0x64, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x72, 0x61, 0x67, 0x6f, 0x6e,
0x78, 0x64, 0x20, 0x67, 0x65, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x74, 0x22,
0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x64, 0x72,
0x61, 0x67, 0x6f, 0x6e, 0x78, 0x64, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x70,
0x69, 0x6e, 0x67, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x72, 0x61, 0x67, 0x6f,
0x6e, 0x78, 0x64, 0x20, 0x77, 0x69, 0x72, 0x64, 0x20, 0x67, 0x65, 0x73,
0x74, 0x6f, 0x70, 0x70, 0x74, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61,
0x63, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x61, 0x70, 0x6c, 0x69, 0x6e,
0x67, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x61, 0x70, 0x6c, 0x69, 0x6e, 0x67,
0x2d, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x77,
0x65, 0x72, 0x64, 0x65, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x68,
0x69, 0x65, 0x72, 0x74, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74,
0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x22, 0x3a, 0x20, 0x22,
0x53, 0x63, 0x68, 0x6c, 0xc3, 0xbc, 0x73, 0x73, 0x65, 0x6c, 0x20, 0x69,
0x6d, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x65, 0x72, 0x65, 0x6e, 0x22, 0x2c,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x6c, 0x6f, 0x61,
0x64, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22,
0x3a, 0x20, 0x22, 0x4b, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x61, 0x64, 0x65, 0x6e, 0x2e, 0x2e,
0x2e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f,
0x6d, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x73, 0x22, 0x3a, 0x20,
0x22, 0x25, 0x2e, 0x31, 0x66, 0x20, 0x48, 0x2f, 0x73, 0x22, 0x2c, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x6e, 0x65, 0x74, 0x5f,
0x67, 0x68, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x65, 0x74, 0x7a, 0x3a,
0x20, 0x25, 0x2e, 0x32, 0x66, 0x20, 0x47, 0x48, 0x2f, 0x73, 0x22, 0x2c,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x6e, 0x65, 0x74,
0x5f, 0x68, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x65, 0x74, 0x7a, 0x3a,
0x20, 0x25, 0x2e, 0x31, 0x66, 0x20, 0x48, 0x2f, 0x73, 0x22, 0x2c, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x6e, 0x65, 0x74, 0x5f,
0x6b, 0x68, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x65, 0x74, 0x7a, 0x3a,
0x20, 0x25, 0x2e, 0x32, 0x66, 0x20, 0x4b, 0x48, 0x2f, 0x73, 0x22, 0x2c,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x6e, 0x65, 0x74,
0x5f, 0x6d, 0x68, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x65, 0x74, 0x7a,
0x3a, 0x20, 0x25, 0x2e, 0x32, 0x66, 0x20, 0x4d, 0x48, 0x2f, 0x73, 0x22,
0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x6e, 0x6f,
0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x52, 0x41,
0x47, 0x4f, 0x4e, 0x58, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x20, 0x6e, 0x69,
0x63, 0x68, 0x74, 0x20, 0x67, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x65, 0x6e,
0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x70,
0x65, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x50, 0x65, 0x65, 0x72,
0x73, 0x3a, 0x20, 0x25, 0x7a, 0x75, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x22, 0x73, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x63, 0x61, 0x6e, 0x6e,
0x69, 0x6e, 0x67, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x65, 0x75, 0x73, 0x63,
0x61, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62,
0x5f, 0x72, 0x65, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f,
0x70, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x65, 0x75, 0x73, 0x63,
0x61, 0x6e, 0x20, 0x25, 0x2e, 0x30, 0x66, 0x25, 0x25, 0x22, 0x2c, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x74,
0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x61, 0x65, 0x6d, 0x6f,
0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x20,
0x77, 0x69, 0x72, 0x64, 0x20, 0x6e, 0x65, 0x75, 0x20, 0x67, 0x65, 0x73,
0x74, 0x61, 0x72, 0x74, 0x65, 0x74, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x73, 0x61, 0x70, 0x6c,
0x69, 0x6e, 0x67, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x3a,
0x20, 0x22, 0x53, 0x61, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x2d, 0x50, 0x61,
0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2d, 0x45, 0x78, 0x74, 0x72,
0x61, 0x6b, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x68, 0x6c, 0x67,
0x65, 0x73, 0x63, 0x68, 0x6c, 0x61, 0x67, 0x65, 0x6e, 0x2e, 0x22, 0x2c,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x73, 0x61, 0x70,
0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x66, 0x6f, 0x75,
0x6e, 0x64, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x61, 0x70, 0x6c, 0x69, 0x6e,
0x67, 0x2d, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20,
0x6e, 0x69, 0x63, 0x68, 0x74, 0x20, 0x67, 0x65, 0x66, 0x75, 0x6e, 0x64,
0x65, 0x6e, 0x2e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73,
0x62, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x64,
0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x72, 0x61,
0x67, 0x6f, 0x6e, 0x78, 0x64, 0x20, 0x77, 0x69, 0x72, 0x64, 0x20, 0x67,
0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x74, 0x2e, 0x2e, 0x2e, 0x22,
0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x73, 0x79,
0x6e, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x22,
0x3a, 0x20, 0x22, 0x53, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x69,
0x73, 0x69, 0x65, 0x72, 0x75, 0x6e, 0x67, 0x20, 0x25, 0x2e, 0x31, 0x66,
0x25, 0x25, 0x20, 0x28, 0x25, 0x64, 0x20, 0xc3, 0xbc, 0x62, 0x72, 0x69,
0x67, 0x29, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62,
0x5f, 0x73, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x74, 0x61,
0x22, 0x3a, 0x20, 0x22, 0x53, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e,
0x69, 0x73, 0x69, 0x65, 0x72, 0x75, 0x6e, 0x67, 0x20, 0x25, 0x2e, 0x31,
0x66, 0x25, 0x25, 0x20, 0x28, 0x25, 0x64, 0x20, 0xc3, 0xbc, 0x62, 0x72,
0x69, 0x67, 0x2c, 0x20, 0x25, 0x2e, 0x30, 0x66, 0x20, 0x42, 0x6c, 0x6b,
0x2f, 0x73, 0x2c, 0x20, 0x7e, 0x25, 0x73, 0x29, 0x22, 0x2c, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x69,
0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3a, 0x20,
0x22, 0x57, 0x61, 0x72, 0x74, 0x65, 0x6e, 0x20, 0x61, 0x75, 0x66, 0x20,
0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2d, 0x4b, 0x6f, 0x6e, 0x66, 0x69,
0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x2e, 0x2e, 0x22,
0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f, 0x77, 0x61,
0x69, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e,
0x22, 0x3a, 0x20, 0x22, 0x57, 0x61, 0x72, 0x74, 0x65, 0x6e, 0x20, 0x61,
0x75, 0x66, 0x20, 0x64, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x78, 0x64, 0x2e,
0x2e, 0x2e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62,
0x5f, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x61, 0x65,
0x6d, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x57,
0x61, 0x72, 0x74, 0x65, 0x6e, 0x20, 0x61, 0x75, 0x66, 0x20, 0x64, 0x72,
0x61, 0x67, 0x6f, 0x6e, 0x78, 0x64, 0x20, 0xe2, 0x80, 0x94, 0x20, 0x25,
0x73, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x62, 0x5f,
0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x75, 0x70, 0x22, 0x3a,
0x20, 0x22, 0x41, 0x75, 0x66, 0x77, 0xc3, 0xa4, 0x72, 0x6d, 0x65, 0x6e,
0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73,
0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68,
0x6f, 0x6c, 0x64, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63,
0x68, 0x65, 0x6e, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20,
@@ -3992,4 +4139,4 @@ unsigned char res_lang_de_json[] = {
0x2d, 0x41, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x22, 0x0a, 0x7d,
0x0a
};
unsigned int res_lang_de_json_len = 47893;
unsigned int res_lang_de_json_len = 49657;
+3028 -2883
View File
File diff suppressed because it is too large Load Diff
+3120 -2972
View File
File diff suppressed because it is too large Load Diff
+3392 -3232
View File
File diff suppressed because it is too large Load Diff
+2970 -2824
View File
File diff suppressed because it is too large Load Diff
+3010 -2866
View File
File diff suppressed because it is too large Load Diff
+3368 -3193
View File
File diff suppressed because it is too large Load Diff
+2697 -2555
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1675,7 +1675,7 @@ void RenderSettingsPage(App* app) {
// EXPLORER & OPTIONS — full-width card
// ====================================================================
{
Type().textColored(TypeStyle::Overline, OnSurfaceMedium(), TR("explorer"));
Type().textColored(TypeStyle::Overline, OnSurfaceMedium(), TR("explorer_section"));
ImGui::Dummy(ImVec2(0, Layout::spacingXs()));
ImVec2 cardMin = ImGui::GetCursorScreenPos();
+8 -2
View File
@@ -557,15 +557,21 @@ inline bool RenderSidebar(NavPage& current, float sidebarWidth, float contentHei
if (showLabels) {
ImFont* olFont = Type().overline();
float olFontSz = ScaledFontSize(olFont);
float maxSectionW = panelRight - wp.x - sbSectionLabelPadLeft;
int si = 0;
for (int i = 0; i < (int)NavPage::Count_; ++i) {
if (kNavItems[i].section_label && si < nSectionLabels) {
float ly = panelTopY + sectionLabelY[si++];
const char* sLabel = NavSectionLabel(kNavItems[i]);
float drawFsz = olFontSz;
ImVec2 sLabelSz = olFont->CalcTextSizeA(drawFsz, 1000.0f, 0.0f, sLabel);
if (sLabelSz.x > maxSectionW && maxSectionW > 0)
drawFsz *= maxSectionW / sLabelSz.x;
ImVec4 olCol = ImGui::ColorConvertU32ToFloat4(OnSurfaceMedium());
olCol.w *= expandFrac;
dl->AddText(olFont, olFontSz,
dl->AddText(olFont, drawFsz,
ImVec2(wp.x + sbSectionLabelPadLeft, ly),
ImGui::ColorConvertFloat4ToU32(olCol), NavSectionLabel(kNavItems[i]));
ImGui::ColorConvertFloat4ToU32(olCol), sLabel);
}
}
} else {
+1 -1
View File
@@ -195,7 +195,7 @@ static void RenderSyncBanner(const WalletState& state) {
? (float)state.sync.blocks / state.sync.headers * 100.0f : 0.0f;
char syncBuf[128];
snprintf(syncBuf, sizeof(syncBuf),
"Blockchain syncing (%.1f%%)... Balances may be inaccurate.", syncPct);
TR("blockchain_syncing"), syncPct);
ImGui::PushStyleColor(ImGuiCol_ChildBg, ImGui::ColorConvertU32ToFloat4(schema::UI().resolveColor(schema::UI().drawElement("tabs.send", "sync-banner-bg-color").color)));
float syncH = std::max(schema::UI().drawElement("tabs.send", "sync-banner-min-height").size, schema::UI().drawElement("tabs.send", "sync-banner-height").size * Layout::vScale());
ImGui::BeginChild("##SyncBanner", ImVec2(ImGui::GetContentRegionAvail().x, syncH),
+36 -1
View File
@@ -181,7 +181,7 @@ void I18n::loadBuiltinEnglish()
strings_["node_security"] = "NODE & SECURITY";
strings_["node"] = "NODE";
strings_["security"] = "SECURITY";
strings_["explorer"] = "EXPLORER";
strings_["explorer_section"] = "EXPLORER";
strings_["about"] = "About";
strings_["backup_data"] = "BACKUP & DATA";
strings_["balance_layout"] = "Balance Layout";
@@ -671,6 +671,41 @@ void I18n::loadBuiltinEnglish()
strings_["syncing"] = "Syncing...";
strings_["block"] = "Block";
strings_["no_addresses_available"] = "No addresses available";
// Status bar
strings_["sb_warming_up"] = "Warming up...";
strings_["sb_block"] = "Block: %d";
strings_["sb_peers"] = "Peers: %zu";
strings_["sb_net_ghs"] = "Net: %.2f GH/s";
strings_["sb_net_mhs"] = "Net: %.2f MH/s";
strings_["sb_net_khs"] = "Net: %.2f KH/s";
strings_["sb_net_hs"] = "Net: %.1f H/s";
strings_["sb_mining_hs"] = "%.1f H/s";
strings_["sb_syncing_eta"] = "Syncing %.1f%% (%d left, %.0f blk/s, ~%s)";
strings_["sb_syncing_basic"] = "Syncing %.1f%% (%d left)";
strings_["sb_rescanning_pct"] = "Rescanning %.0f%%";
strings_["sb_rescanning"] = "Rescanning";
strings_["sb_importing_keys"] = "Importing keys";
strings_["sb_daemon_not_found"] = "Daemon not found";
strings_["sb_loading_config"] = "Loading configuration...";
strings_["sb_waiting_config"] = "Waiting for daemon config...";
strings_["sb_no_conf"] = "No DRAGONX.conf found";
strings_["sb_starting_daemon"] = "Starting dragonxd...";
strings_["sb_connecting_daemon"] = "Connecting to dragonxd...";
strings_["sb_auth_failed"] = "Auth failed — check rpcuser/rpcpassword";
strings_["sb_waiting_daemon"] = "Waiting for dragonxd to start...";
strings_["sb_waiting_daemon_err"] = "Waiting for dragonxd — %s";
strings_["sb_connecting_external"] = "Connecting to external daemon...";
strings_["sb_connecting_generic"] = "Connecting to daemon...";
strings_["sb_connecting_err"] = "Connecting to daemon — %s";
strings_["sb_daemon_crashed"] = "Daemon crashed %d times";
strings_["sb_extracting_sapling"] = "Extracting Sapling parameters...";
strings_["sb_sapling_failed"] = "Failed to extract Sapling parameters.";
strings_["sb_sapling_not_found"] = "Sapling parameters not found.";
strings_["sb_dragonxd_running"] = "dragonxd running";
strings_["sb_dragonxd_stopping"] = "Stopping dragonxd...";
strings_["sb_dragonxd_stopped"] = "dragonxd stopped";
strings_["sb_restarting_daemon"] = "Restarting daemon...";
// Errors & Messages
strings_["error"] = "Error";