fix(console): localize the lite console + drop full-node-only wording

The lite console tab lagged the full-node one on i18n: its toolbar status,
status lines, help, and error/warning strings were hard-coded English or
worded for a full node (a "daemon" the lite wallet doesn't have).

- toolbarStatus()/statusLines(): route through TR() (reusing the existing
  lite_net_* keys where they already map)
- printHelp(): enumerate the 25 pass-through backend verbs for discoverability,
  since the C++ tab intercepts `help` before the backend's own HelpCommand runs
- gate the destructive 'stop' confirmation to the full node (hasRpcReference);
  lite has no node, so it lets 'stop' fall through to the backend instead of
  showing a phantom "shut down the node" warning behind a dead gate
- word the not-connected error per variant (daemon vs "no wallet open")
- TR() the "(no output)" command-result fallback

Adds 7 i18n keys across all 8 languages (additive); rebuilds the CJK subset
for the one new glyph (U+C5D4 for the Korean "backend"). Build + ctest +
source-hygiene green; changes adversarially verified (no logic/i18n defects).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-18 20:10:17 -05:00
parent 0dcc09fc5f
commit 567732206e
12 changed files with 88 additions and 14 deletions

Binary file not shown.

View File

@@ -271,6 +271,7 @@
"console_app": "App",
"console_auto_scroll": "Automatisch scrollen",
"console_available_commands": "Verfügbare Befehle:",
"console_backend_unavailable": "Kein Backend",
"console_capturing_output": "Erfasse Daemon-Ausgabe...",
"console_cat_blockchain": "Blockchain",
"console_cat_control": "Steuerung",
@@ -310,11 +311,14 @@
"console_help_help": " help - Diese Hilfe anzeigen",
"console_help_setgenerate": " setgenerate - Mining steuern",
"console_help_stop": " stop - Daemon stoppen",
"console_last_error": "Letzter Fehler:",
"console_line_count": "%zu Zeilen",
"console_matches": "Treffer",
"console_new_lines": "%d neue Zeilen",
"console_no_daemon": "Kein Daemon",
"console_no_output": "(keine Ausgabe)",
"console_not_connected": "Fehler: Nicht mit Daemon verbunden",
"console_not_connected_lite": "Fehler: Keine Wallet geöffnet",
"console_quit_note": "'quit'/'exit' werden hier nicht benötigt — schließen Sie einfach das Fenster.",
"console_ref_builds": "Ergibt",
"console_ref_cancel": "Abbrechen",
@@ -348,6 +352,7 @@
"console_status_stopped": "Gestoppt",
"console_status_stopping": "Stoppt",
"console_status_unknown": "Unbekannt",
"console_stop_confirm_node": "'stop' fährt den Node herunter und trennt die Wallet. Geben Sie zur Bestätigung erneut 'stop' ein.",
"console_tab_completion": "Tab zur Vervollständigung",
"console_text_colors": "Textfarben",
"console_toggle_accents": "Farbakzente der Zeilen umschalten",
@@ -626,6 +631,7 @@
"lite_birthday_backup": "Geburtstag: %llu (auch diesen sichern)",
"lite_birthday_hint": "Blockhöhe, ab der gescannt werden soll. Bei 0 belassen, falls unbekannt (langsamerer vollständiger Scan).",
"lite_birthday_label": "Geburtsblock",
"lite_console_backend_commands": "Backend-Befehle:",
"lite_console_help_passthrough": "Jede andere Eingabe wird als Lite-Wallet-Konsolenbefehl ausgeführt.",
"lite_copy": "Kopieren",
"lite_could_not_write": "Konnte nicht schreiben ",
@@ -643,6 +649,7 @@
"lite_net_add_url_hint": "https://ihr-lite-server",
"lite_net_checking": "wird geprüft…",
"lite_net_connected": "Verbunden",
"lite_net_connecting": "Verbinde…",
"lite_net_custom": "Benutzerdefiniert",
"lite_net_disconnected": "Nicht verbunden",
"lite_net_hidden_section": "Ausgeblendete Server",

View File

@@ -271,6 +271,7 @@
"console_app": "App",
"console_auto_scroll": "Auto-desplazamiento",
"console_available_commands": "Comandos disponibles:",
"console_backend_unavailable": "Sin backend",
"console_capturing_output": "Capturando salida del daemon...",
"console_cat_blockchain": "Blockchain",
"console_cat_control": "Control",
@@ -310,11 +311,14 @@
"console_help_help": " help - Mostrar este mensaje de ayuda",
"console_help_setgenerate": " setgenerate - Controlar minería",
"console_help_stop": " stop - Detener el daemon",
"console_last_error": "Último error:",
"console_line_count": "%zu líneas",
"console_matches": "coincidencias",
"console_new_lines": "%d nuevas líneas",
"console_no_daemon": "Sin daemon",
"console_no_output": "(sin salida)",
"console_not_connected": "Error: No conectado al daemon",
"console_not_connected_lite": "Error: No hay ninguna cartera abierta",
"console_quit_note": "'quit'/'exit' no son necesarios aquí — simplemente cierra la ventana.",
"console_ref_builds": "Genera",
"console_ref_cancel": "Cancelar",
@@ -348,6 +352,7 @@
"console_status_stopped": "Detenido",
"console_status_stopping": "Deteniendo",
"console_status_unknown": "Desconocido",
"console_stop_confirm_node": "'stop' apagará el nodo y desconectará la cartera. Escribe 'stop' de nuevo para confirmar.",
"console_tab_completion": "Tab para completar",
"console_text_colors": "Colores de texto",
"console_toggle_accents": "Alternar acentos de color de línea",
@@ -626,6 +631,7 @@
"lite_birthday_backup": "Cumpleaños: %llu (respalda esto también)",
"lite_birthday_hint": "Altura de bloque desde la que empezar a escanear. Deja 0 si se desconoce (escaneo completo más lento).",
"lite_birthday_label": "Fecha de creación",
"lite_console_backend_commands": "Comandos del backend:",
"lite_console_help_passthrough": "Cualquier otra entrada se ejecuta como un comando de consola de la cartera lite.",
"lite_copy": "Copiar",
"lite_could_not_write": "No se pudo escribir ",
@@ -643,6 +649,7 @@
"lite_net_add_url_hint": "https://tu-servidor-lite",
"lite_net_checking": "comprobando…",
"lite_net_connected": "Conectado",
"lite_net_connecting": "Conectando…",
"lite_net_custom": "Personalizado",
"lite_net_disconnected": "No conectado",
"lite_net_hidden_section": "Servidores ocultos",

View File

@@ -271,6 +271,7 @@
"console_app": "App",
"console_auto_scroll": "Défilement auto",
"console_available_commands": "Commandes disponibles :",
"console_backend_unavailable": "Aucun backend",
"console_capturing_output": "Capture de la sortie du daemon...",
"console_cat_blockchain": "Blockchain",
"console_cat_control": "Contrôle",
@@ -310,11 +311,14 @@
"console_help_help": " help - Afficher ce message d'aide",
"console_help_setgenerate": " setgenerate - Contrôler le minage",
"console_help_stop": " stop - Arrêter le daemon",
"console_last_error": "Dernière erreur :",
"console_line_count": "%zu lignes",
"console_matches": "correspondances",
"console_new_lines": "%d nouvelles lignes",
"console_no_daemon": "Pas de daemon",
"console_no_output": "(aucune sortie)",
"console_not_connected": "Erreur : Non connecté au daemon",
"console_not_connected_lite": "Erreur : Aucun portefeuille ouvert",
"console_quit_note": "'quit'/'exit' ne sont pas nécessaires ici — fermez simplement la fenêtre.",
"console_ref_builds": "Génère",
"console_ref_cancel": "Annuler",
@@ -348,6 +352,7 @@
"console_status_stopped": "Arrêté",
"console_status_stopping": "Arrêt",
"console_status_unknown": "Inconnu",
"console_stop_confirm_node": "'stop' arrêtera le nœud et déconnectera le portefeuille. Tapez à nouveau 'stop' pour confirmer.",
"console_tab_completion": "Tab pour compléter",
"console_text_colors": "Couleurs du texte",
"console_toggle_accents": "Basculer les accents de couleur des lignes",
@@ -626,6 +631,7 @@
"lite_birthday_backup": "Date de création : %llu (à sauvegarder également)",
"lite_birthday_hint": "Hauteur de bloc à partir de laquelle commencer l'analyse. Laissez 0 si inconnue (analyse complète plus lente).",
"lite_birthday_label": "Bloc de création",
"lite_console_backend_commands": "Commandes du backend :",
"lite_console_help_passthrough": "Toute autre entrée est exécutée comme une commande de la console du portefeuille lite.",
"lite_copy": "Copier",
"lite_could_not_write": "Impossible d'écrire ",
@@ -643,6 +649,7 @@
"lite_net_add_url_hint": "https://votre-serveur-lite",
"lite_net_checking": "vérification…",
"lite_net_connected": "Connecté",
"lite_net_connecting": "Connexion…",
"lite_net_custom": "Personnalisé",
"lite_net_disconnected": "Non connecté",
"lite_net_hidden_section": "Serveurs masqués",

View File

@@ -271,6 +271,7 @@
"console_app": "アプリ",
"console_auto_scroll": "自動スクロール",
"console_available_commands": "利用可能なコマンド:",
"console_backend_unavailable": "バックエンドなし",
"console_capturing_output": "デーモン出力をキャプチャ中...",
"console_cat_blockchain": "ブロックチェーン",
"console_cat_control": "制御",
@@ -310,11 +311,14 @@
"console_help_help": " help - このヘルプを表示",
"console_help_setgenerate": " setgenerate - マイニングを制御",
"console_help_stop": " stop - デーモンを停止",
"console_last_error": "最後のエラー:",
"console_line_count": "%zu 行",
"console_matches": "件一致",
"console_new_lines": "%d 新しい行",
"console_no_daemon": "デーモンなし",
"console_no_output": "(出力なし)",
"console_not_connected": "エラー:デーモンに接続されていません",
"console_not_connected_lite": "エラー:ウォレットが開かれていません",
"console_quit_note": "ここでは 'quit''exit' は不要です — ウィンドウを閉じるだけで構いません。",
"console_ref_builds": "生成",
"console_ref_cancel": "キャンセル",
@@ -348,6 +352,7 @@
"console_status_stopped": "停止済み",
"console_status_stopping": "停止中",
"console_status_unknown": "不明",
"console_stop_confirm_node": "'stop' はノードを停止し、ウォレットを切断します。確認するにはもう一度 'stop' と入力してください。",
"console_tab_completion": "Tabで補完",
"console_text_colors": "テキスト色",
"console_toggle_accents": "行のカラーアクセントを切り替え",
@@ -626,6 +631,7 @@
"lite_birthday_backup": "誕生日:%llu (これもバックアップしてください)",
"lite_birthday_hint": "スキャンを開始するブロック高。不明な場合は0のままにしてください完全スキャンが遅くなります。",
"lite_birthday_label": "バースデー",
"lite_console_backend_commands": "バックエンドコマンド:",
"lite_console_help_passthrough": "その他の入力はライトウォレットのコンソールコマンドとして実行されます。",
"lite_copy": "コピー",
"lite_could_not_write": "書き込めませんでした ",
@@ -643,6 +649,7 @@
"lite_net_add_url_hint": "https://your-lite-server",
"lite_net_checking": "確認中…",
"lite_net_connected": "接続済み",
"lite_net_connecting": "接続中…",
"lite_net_custom": "カスタム",
"lite_net_disconnected": "未接続",
"lite_net_hidden_section": "非表示のサーバー",

View File

@@ -271,6 +271,7 @@
"console_app": "앱",
"console_auto_scroll": "자동 스크롤",
"console_available_commands": "사용 가능한 명령어:",
"console_backend_unavailable": "백엔드 없음",
"console_capturing_output": "데몬 출력 캡처 중...",
"console_cat_blockchain": "블록체인",
"console_cat_control": "제어",
@@ -310,11 +311,14 @@
"console_help_help": " help - 도움말 표시",
"console_help_setgenerate": " setgenerate - 채굴 제어",
"console_help_stop": " stop - 데몬 중지",
"console_last_error": "마지막 오류:",
"console_line_count": "%zu줄",
"console_matches": "일치",
"console_new_lines": "%d 새 줄",
"console_no_daemon": "데몬 없음",
"console_no_output": "(출력 없음)",
"console_not_connected": "오류: 데몬에 연결되지 않았습니다",
"console_not_connected_lite": "오류: 열린 지갑 없음",
"console_quit_note": "여기서는 'quit'/'exit'가 필요 없습니다 — 그냥 창을 닫으세요.",
"console_ref_builds": "생성",
"console_ref_cancel": "취소",
@@ -348,6 +352,7 @@
"console_status_stopped": "중지됨",
"console_status_stopping": "중지 중",
"console_status_unknown": "알 수 없음",
"console_stop_confirm_node": "'stop'은 노드를 종료하고 지갑 연결을 끊습니다. 확인하려면 'stop'을 다시 입력하세요.",
"console_tab_completion": "Tab으로 자동 완성",
"console_text_colors": "텍스트 색상",
"console_toggle_accents": "줄 색상 강조 전환",
@@ -626,6 +631,7 @@
"lite_birthday_backup": "생성 블록: %llu (이 값도 백업하세요)",
"lite_birthday_hint": "스캔을 시작할 블록 높이입니다. 모르면 0으로 두세요(전체 스캔이 느려짐).",
"lite_birthday_label": "생일 블록",
"lite_console_backend_commands": "백엔드 명령:",
"lite_console_help_passthrough": "그 외 입력은 라이트 지갑 콘솔 명령으로 실행됩니다.",
"lite_copy": "복사",
"lite_could_not_write": "쓸 수 없습니다: ",
@@ -643,6 +649,7 @@
"lite_net_add_url_hint": "https://your-lite-server",
"lite_net_checking": "확인 중…",
"lite_net_connected": "연결됨",
"lite_net_connecting": "연결 중…",
"lite_net_custom": "사용자 지정",
"lite_net_disconnected": "연결되지 않음",
"lite_net_hidden_section": "숨겨진 서버",

View File

@@ -271,6 +271,7 @@
"console_app": "App",
"console_auto_scroll": "Rolagem automática",
"console_available_commands": "Comandos disponíveis:",
"console_backend_unavailable": "Sem backend",
"console_capturing_output": "Capturando saída do daemon...",
"console_cat_blockchain": "Blockchain",
"console_cat_control": "Controle",
@@ -310,11 +311,14 @@
"console_help_help": " help - Mostrar esta mensagem de ajuda",
"console_help_setgenerate": " setgenerate - Controlar mineração",
"console_help_stop": " stop - Parar o daemon",
"console_last_error": "Último erro:",
"console_line_count": "%zu linhas",
"console_matches": "correspondências",
"console_new_lines": "%d novas linhas",
"console_no_daemon": "Sem daemon",
"console_no_output": "(sem saída)",
"console_not_connected": "Erro: Não conectado ao daemon",
"console_not_connected_lite": "Erro: Nenhuma carteira aberta",
"console_quit_note": "'quit'/'exit' não são necessários aqui — basta fechar a janela.",
"console_ref_builds": "Gera",
"console_ref_cancel": "Cancelar",
@@ -348,6 +352,7 @@
"console_status_stopped": "Parado",
"console_status_stopping": "Parando",
"console_status_unknown": "Desconhecido",
"console_stop_confirm_node": "'stop' irá desligar o nó e desconectar a carteira. Digite 'stop' novamente para confirmar.",
"console_tab_completion": "Tab para completar",
"console_text_colors": "Cores do texto",
"console_toggle_accents": "Alternar destaques de cor das linhas",
@@ -626,6 +631,7 @@
"lite_birthday_backup": "Aniversário: %llu (faça o backup disto também)",
"lite_birthday_hint": "Altura do bloco a partir da qual começar a escanear. Deixe 0 se desconhecida (escaneamento completo mais lento).",
"lite_birthday_label": "Data de nascimento",
"lite_console_backend_commands": "Comandos do backend:",
"lite_console_help_passthrough": "Qualquer outra entrada é executada como um comando de console da carteira leve.",
"lite_copy": "Copiar",
"lite_could_not_write": "Não foi possível gravar ",
@@ -643,6 +649,7 @@
"lite_net_add_url_hint": "https://seu-servidor-lite",
"lite_net_checking": "verificando…",
"lite_net_connected": "Conectado",
"lite_net_connecting": "Conectando…",
"lite_net_custom": "Personalizado",
"lite_net_disconnected": "Não conectado",
"lite_net_hidden_section": "Servidores ocultos",

View File

@@ -271,6 +271,7 @@
"console_app": "Прил.",
"console_auto_scroll": "Авто-прокрутка",
"console_available_commands": "Доступные команды:",
"console_backend_unavailable": "Нет бэкенда",
"console_capturing_output": "Захват вывода daemon...",
"console_cat_blockchain": "Блокчейн",
"console_cat_control": "Управление",
@@ -310,11 +311,14 @@
"console_help_help": " help - Показать эту справку",
"console_help_setgenerate": " setgenerate - Управление майнингом",
"console_help_stop": " stop - Остановить daemon",
"console_last_error": "Последняя ошибка:",
"console_line_count": "%zu строк",
"console_matches": "совпадений",
"console_new_lines": "%d новых строк",
"console_no_daemon": "Нет daemon",
"console_no_output": "(нет вывода)",
"console_not_connected": "Ошибка: Не подключено к daemon",
"console_not_connected_lite": "Ошибка: Нет открытого кошелька",
"console_quit_note": "Здесь не нужны 'quit'/'exit' — просто закройте окно.",
"console_ref_builds": "Формирует",
"console_ref_cancel": "Отмена",
@@ -348,6 +352,7 @@
"console_status_stopped": "Остановлен",
"console_status_stopping": "Остановка",
"console_status_unknown": "Неизвестно",
"console_stop_confirm_node": "'stop' остановит узел и отключит кошелёк. Введите 'stop' ещё раз для подтверждения.",
"console_tab_completion": "Tab для дополнения",
"console_text_colors": "Цвета текста",
"console_toggle_accents": "Переключить цветовые акценты строк",
@@ -626,6 +631,7 @@
"lite_birthday_backup": "Дата рождения: %llu (сохраните её тоже)",
"lite_birthday_hint": "Высота блока, с которой начинать сканирование. Оставьте 0, если неизвестно (медленное полное сканирование).",
"lite_birthday_label": "Дата рождения",
"lite_console_backend_commands": "Команды бэкенда:",
"lite_console_help_passthrough": "Любой другой ввод выполняется как команда консоли лайт-кошелька.",
"lite_copy": "Копировать",
"lite_could_not_write": "Не удалось записать ",
@@ -643,6 +649,7 @@
"lite_net_add_url_hint": "https://your-lite-server",
"lite_net_checking": "проверка…",
"lite_net_connected": "Подключено",
"lite_net_connecting": "Подключение…",
"lite_net_custom": "Свой",
"lite_net_disconnected": "Не подключено",
"lite_net_hidden_section": "Скрытые серверы",

View File

@@ -271,6 +271,7 @@
"console_app": "应用",
"console_auto_scroll": "自动滚动",
"console_available_commands": "可用命令:",
"console_backend_unavailable": "无后端",
"console_capturing_output": "正在捕获守护进程输出...",
"console_cat_blockchain": "区块链",
"console_cat_control": "控制",
@@ -310,11 +311,14 @@
"console_help_help": " help - 显示此帮助信息",
"console_help_setgenerate": " setgenerate - 控制挖矿",
"console_help_stop": " stop - 停止守护进程",
"console_last_error": "上次错误:",
"console_line_count": "%zu 行",
"console_matches": "个匹配",
"console_new_lines": "%d 新行",
"console_no_daemon": "无守护进程",
"console_no_output": "(无输出)",
"console_not_connected": "错误:未连接到守护进程",
"console_not_connected_lite": "错误:没有打开的钱包",
"console_quit_note": "这里不需要 'quit'/'exit'——直接关闭窗口即可。",
"console_ref_builds": "生成",
"console_ref_cancel": "取消",
@@ -348,6 +352,7 @@
"console_status_stopped": "已停止",
"console_status_stopping": "停止中",
"console_status_unknown": "未知",
"console_stop_confirm_node": "'stop' 将关闭节点并断开钱包连接。再次输入 'stop' 以确认。",
"console_tab_completion": "Tab 补全",
"console_text_colors": "文本颜色",
"console_toggle_accents": "切换行颜色强调",
@@ -626,6 +631,7 @@
"lite_birthday_backup": "生日区块:%llu (也请一并备份)",
"lite_birthday_hint": "开始扫描的区块高度。如未知请保留 0完整扫描更慢。",
"lite_birthday_label": "诞生区块",
"lite_console_backend_commands": "后端命令:",
"lite_console_help_passthrough": "其他任何输入都将作为轻钱包控制台命令运行。",
"lite_copy": "复制",
"lite_could_not_write": "无法写入 ",
@@ -643,6 +649,7 @@
"lite_net_add_url_hint": "https://your-lite-server",
"lite_net_checking": "检查中…",
"lite_net_connected": "已连接",
"lite_net_connecting": "连接中…",
"lite_net_custom": "自定义",
"lite_net_disconnected": "未连接",
"lite_net_hidden_section": "隐藏的服务器",

View File

@@ -258,7 +258,7 @@ bool LiteConsoleExecutor::pollResult(std::string& result, bool& isError)
if (!lw) return false;
wallet::LiteConsoleResult res;
if (!lw->takeConsoleResult(res)) return false;
result = res.response.empty() ? std::string("(no output)") : res.response;
result = res.response.empty() ? std::string(TR("console_no_output")) : res.response;
isError = !res.ok;
return true;
}
@@ -286,6 +286,13 @@ void LiteConsoleExecutor::printHelp(const ConsoleAddLineFn& add)
add(TR("console_help_clear"), ConsoleChannel::None);
add(TR("console_help_help"), ConsoleChannel::None);
add(TR("lite_console_help_passthrough"), ConsoleChannel::Info);
// The lite backend's own command verbs (literal command tokens, not RPC methods — mirrors the
// backend's get_commands() registry). Listed for discoverability: the C++ tab intercepts `help`
// before it can reach the backend's own HelpCommand, so its "type help" advice would dead-end.
add(TR("lite_console_backend_commands"), ConsoleChannel::Info);
add(" sync syncstatus balance addresses height info list notes encryptionstatus", ConsoleChannel::None);
add(" send shield new seed import timport export", ConsoleChannel::None);
add(" encrypt decrypt lock unlock rescan save sietch saplingtree coinsupply", ConsoleChannel::None);
}
std::vector<ConsoleStatusLine> LiteConsoleExecutor::statusLines() const
@@ -294,20 +301,20 @@ std::vector<ConsoleStatusLine> LiteConsoleExecutor::statusLines() const
wallet::LiteWalletController* lw = app_->liteWallet();
if (lw && lw->walletOpen()) {
const SyncInfo& sync = app_->state().sync;
char buf[96];
char buf[128];
if (sync.syncing && !sync.isSynced()) {
double vp = sync.verification_progress;
if (vp < 0.0) vp = 0.0; else if (vp > 1.0) vp = 1.0;
std::snprintf(buf, sizeof(buf), "Syncing %.1f%% (block %d / %d)",
vp * 100.0, sync.blocks, sync.headers);
std::snprintf(buf, sizeof(buf), "%s %.1f%% (block %d / %d)",
TR("lite_net_syncing"), vp * 100.0, sync.blocks, sync.headers);
} else {
std::snprintf(buf, sizeof(buf), "Synced (block %d)", sync.blocks);
std::snprintf(buf, sizeof(buf), "%s (block %d)", TR("lite_net_synced"), sync.blocks);
}
out.push_back({std::string(buf), OnSurfaceMedium(), false});
}
const std::string& err = app_->liteOpenError();
if (!err.empty() && (!lw || !lw->walletOpen()))
out.push_back({std::string("Last error: ") + err, Error(), false});
out.push_back({std::string(TR("console_last_error")) + " " + err, Error(), false});
return out;
}
@@ -315,10 +322,10 @@ ConsoleStatusLine LiteConsoleExecutor::toolbarStatus() const
{
ConsoleStatusLine s;
wallet::LiteWalletController* lw = app_->liteWallet();
if (!lw) { s.text = "No backend"; s.color = Error(); return s; }
if (lw->walletOpen()) { s.text = "Connected"; s.color = Success(); }
else if (lw->openInProgress()) { s.text = "Connecting"; s.color = Warning(); s.pulse = true; }
else { s.text = "Disconnected"; s.color = Error(); }
if (!lw) { s.text = TR("console_backend_unavailable"); s.color = Error(); return s; }
if (lw->walletOpen()) { s.text = TR("lite_net_connected"); s.color = Success(); }
else if (lw->openInProgress()) { s.text = TR("lite_net_connecting"); s.color = Warning(); s.pulse = true; }
else { s.text = TR("lite_net_disconnected"); s.color = Error(); }
return s;
}

View File

@@ -1434,18 +1434,22 @@ bool ConsoleTab::submitConsoleCommand(ConsoleCommandExecutor& exec, const std::s
exec.printHelp(add);
} else if (first == "quit" || first == "exit") {
addLine(TR("console_quit_note"), ConsoleChannel::Info);
} else if (first == "stop") {
} else if (first == "stop" && exec.hasRpcReference()) {
// Full-node 'stop' shuts down the daemon (destructive) — gate behind a confirming second
// 'stop'. Lite has no node: `stop` isn't a backend verb, so it falls through below and the
// backend reports it as unknown — no misleading "shut down the node" warning or dead gate.
if (!stop_confirm_pending_) {
stop_confirm_pending_ = true;
addLine("'stop' will shut down the node and disconnect the wallet. Type 'stop' again to confirm.",
ConsoleChannel::Warning);
addLine(TR("console_stop_confirm_node"), ConsoleChannel::Warning);
} else {
stop_confirm_pending_ = false;
if (!exec.isReady()) addLine(TR("console_not_connected"), ConsoleChannel::Error);
else exec.submit(cmd);
}
} else if (!exec.isReady()) {
addLine(TR("console_not_connected"), ConsoleChannel::Error);
// Full node connects to a daemon; the lite backend opens a wallet — word the error per variant.
addLine(exec.hasRpcReference() ? TR("console_not_connected") : TR("console_not_connected_lite"),
ConsoleChannel::Error);
} else {
exec.submit(cmd);
}

View File

@@ -1395,6 +1395,12 @@ void I18n::loadBuiltinEnglish()
strings_["console_available_commands"] = "Available commands:";
strings_["console_quit_note"] = "'quit'/'exit' aren't needed here — just close the window.";
strings_["lite_console_help_passthrough"] = "Any other input runs as a lite-wallet console command.";
strings_["lite_console_backend_commands"] = "Backend commands:";
strings_["console_no_output"] = "(no output)";
strings_["console_backend_unavailable"] = "No backend";
strings_["console_last_error"] = "Last error:";
strings_["console_not_connected_lite"] = "Error: no wallet open";
strings_["console_stop_confirm_node"] = "'stop' will shut down the node and disconnect the wallet. Type 'stop' again to confirm.";
strings_["console_capturing_output"] = "Capturing daemon output...";
strings_["console_clear"] = "Clear";
strings_["console_clear_console"] = "Clear Console";
@@ -1854,6 +1860,7 @@ void I18n::loadBuiltinEnglish()
strings_["lite_net_show_hidden"] = "Show hidden servers";
strings_["lite_net_hidden_section"] = "Hidden servers";
strings_["lite_net_connected"] = "Connected";
strings_["lite_net_connecting"] = "Connecting";
strings_["lite_net_disconnected"] = "Not connected";
strings_["lite_net_syncing"] = "Syncing";
strings_["lite_net_synced"] = "Synced";