From 567732206e010c926b128615f22f8840d6172dea Mon Sep 17 00:00:00 2001 From: DanS Date: Sat, 18 Jul 2026 20:10:17 -0500 Subject: [PATCH] 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) --- res/fonts/NotoSansCJK-Subset.ttf | Bin 653920 -> 654080 bytes res/lang/de.json | 7 +++++ res/lang/es.json | 7 +++++ res/lang/fr.json | 7 +++++ res/lang/ja.json | 7 +++++ res/lang/ko.json | 7 +++++ res/lang/pt.json | 7 +++++ res/lang/ru.json | 7 +++++ res/lang/zh.json | 7 +++++ src/ui/windows/console_command_executor.cpp | 27 ++++++++++++-------- src/ui/windows/console_tab.cpp | 12 ++++++--- src/util/i18n.cpp | 7 +++++ 12 files changed, 88 insertions(+), 14 deletions(-) diff --git a/res/fonts/NotoSansCJK-Subset.ttf b/res/fonts/NotoSansCJK-Subset.ttf index 27b81cf324c24328856580f46ec17d2f5b20961c..183fd8f0b2eb5c5fe11fe85fcc9340b83b9e7d37 100644 GIT binary patch delta 9676 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
    8jk- zdtAjehM#pMxIT8xcFl1mxfXCW*J`frTE{iGCI@jXuFZ8^2e>ZR<6y3@y135rbFM$Q z0XKBraNXfX+?bn)wxr(R=S3+IAj*noMSX56o);k^TttW{5iMGY)~bhSFS?2D93uLO zablwLrmdyj;aFNcR1T~$!$>td?NBdgbpAoP>{V}CbMwU1kj>`8J5Jo|%`yA2#BZ4? z`_)L{u*cgcvC9lR0G6fM`ha@fC}XA^P$P`0W~qbf&C>W?aNhC<%ZNLu?iki|>bIab z{d0-`Qzw&7Ti&N0QZ?ay`61QMaF~w6ShaPW)to`jU@l|E9acTy_|Re1rHtj+v8>p2 p<81YnQSMFa_3F)%kvA{>tm+t@GfEv%t%A%sH&v;O-nZ2X`G4|Ju7>~s diff --git a/res/lang/de.json b/res/lang/de.json index f733fde..d333216 100644 --- a/res/lang/de.json +++ b/res/lang/de.json @@ -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", diff --git a/res/lang/es.json b/res/lang/es.json index 46ab427..f36f7b1 100644 --- a/res/lang/es.json +++ b/res/lang/es.json @@ -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", diff --git a/res/lang/fr.json b/res/lang/fr.json index 404acc1..189c59d 100644 --- a/res/lang/fr.json +++ b/res/lang/fr.json @@ -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", diff --git a/res/lang/ja.json b/res/lang/ja.json index 9e21727..3e5a005 100644 --- a/res/lang/ja.json +++ b/res/lang/ja.json @@ -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": "非表示のサーバー", diff --git a/res/lang/ko.json b/res/lang/ko.json index ed28413..748dca1 100644 --- a/res/lang/ko.json +++ b/res/lang/ko.json @@ -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": "숨겨진 서버", diff --git a/res/lang/pt.json b/res/lang/pt.json index 944b7d1..7d714d9 100644 --- a/res/lang/pt.json +++ b/res/lang/pt.json @@ -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", diff --git a/res/lang/ru.json b/res/lang/ru.json index 7bf0a7d..5ebb3c1 100644 --- a/res/lang/ru.json +++ b/res/lang/ru.json @@ -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": "Скрытые серверы", diff --git a/res/lang/zh.json b/res/lang/zh.json index 3f5d0f2..dccfdb7 100644 --- a/res/lang/zh.json +++ b/res/lang/zh.json @@ -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": "隐藏的服务器", diff --git a/src/ui/windows/console_command_executor.cpp b/src/ui/windows/console_command_executor.cpp index ca651c1..4ff4f0e 100644 --- a/src/ui/windows/console_command_executor.cpp +++ b/src/ui/windows/console_command_executor.cpp @@ -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 LiteConsoleExecutor::statusLines() const @@ -294,20 +301,20 @@ std::vector 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; } diff --git a/src/ui/windows/console_tab.cpp b/src/ui/windows/console_tab.cpp index f19d70b..b5aa60b 100644 --- a/src/ui/windows/console_tab.cpp +++ b/src/ui/windows/console_tab.cpp @@ -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); } diff --git a/src/util/i18n.cpp b/src/util/i18n.cpp index 9881b3e..e580e45 100644 --- a/src/util/i18n.cpp +++ b/src/util/i18n.cpp @@ -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";