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:
dan_s
2026-04-12 18:45:48 -05:00
parent 077f9a7403
commit 7937aad4fb
24 changed files with 22297 additions and 20583 deletions

Binary file not shown.

View File

@@ -226,7 +226,7 @@
"error_format": "Fehler: %s", "error_format": "Fehler: %s",
"est_time_to_block": "Gesch. Zeit bis Block", "est_time_to_block": "Gesch. Zeit bis Block",
"exit": "Beenden", "exit": "Beenden",
"explorer": "EXPLORER", "explorer": "Explorer",
"explorer_block_detail": "Block", "explorer_block_detail": "Block",
"explorer_block_hash": "Hash", "explorer_block_hash": "Hash",
"explorer_block_height": "Höhe", "explorer_block_height": "Höhe",
@@ -241,6 +241,7 @@
"explorer_mempool_txs": "Transaktionen", "explorer_mempool_txs": "Transaktionen",
"explorer_recent_blocks": "Letzte Blöcke", "explorer_recent_blocks": "Letzte Blöcke",
"explorer_search": "Suchen", "explorer_search": "Suchen",
"explorer_section": "EXPLORER",
"explorer_tx_outputs": "Ausgaben", "explorer_tx_outputs": "Ausgaben",
"explorer_tx_size": "Größe", "explorer_tx_size": "Größe",
"export": "Exportieren", "export": "Exportieren",
@@ -582,6 +583,39 @@
"save": "Speichern", "save": "Speichern",
"save_settings": "Einstellungen speichern", "save_settings": "Einstellungen speichern",
"save_z_transactions": "Z-Tx in Tx-Liste speichern", "save_z_transactions": "Z-Tx in Tx-Liste speichern",
"sb_auth_failed": "Authentifizierung fehlgeschlagen — rpcuser/rpcpassword prüfen",
"sb_block": "Block: %d",
"sb_connecting_daemon": "Verbindung zu dragonxd...",
"sb_connecting_err": "Verbindung zum Daemon — %s",
"sb_connecting_external": "Verbindung zu externem Daemon...",
"sb_connecting_generic": "Verbindung zum Daemon...",
"sb_daemon_crashed": "Daemon ist %d mal abgestürzt",
"sb_daemon_not_found": "Daemon nicht gefunden",
"sb_dragonxd_running": "dragonxd läuft",
"sb_dragonxd_stopped": "dragonxd gestoppt",
"sb_dragonxd_stopping": "dragonxd wird gestoppt...",
"sb_extracting_sapling": "Sapling-Parameter werden extrahiert...",
"sb_importing_keys": "Schlüssel importieren",
"sb_loading_config": "Konfiguration laden...",
"sb_mining_hs": "%.1f H/s",
"sb_net_ghs": "Netz: %.2f GH/s",
"sb_net_hs": "Netz: %.1f H/s",
"sb_net_khs": "Netz: %.2f KH/s",
"sb_net_mhs": "Netz: %.2f MH/s",
"sb_no_conf": "DRAGONX.conf nicht gefunden",
"sb_peers": "Peers: %zu",
"sb_rescanning": "Neuscan",
"sb_rescanning_pct": "Neuscan %.0f%%",
"sb_restarting_daemon": "Daemon wird neu gestartet...",
"sb_sapling_failed": "Sapling-Parameter-Extraktion fehlgeschlagen.",
"sb_sapling_not_found": "Sapling-Parameter nicht gefunden.",
"sb_starting_daemon": "dragonxd wird gestartet...",
"sb_syncing_basic": "Synchronisierung %.1f%% (%d übrig)",
"sb_syncing_eta": "Synchronisierung %.1f%% (%d übrig, %.0f Blk/s, ~%s)",
"sb_waiting_config": "Warten auf Daemon-Konfiguration...",
"sb_waiting_daemon": "Warten auf dragonxd...",
"sb_waiting_daemon_err": "Warten auf dragonxd — %s",
"sb_warming_up": "Aufwärmen...",
"search_placeholder": "Suchen...", "search_placeholder": "Suchen...",
"security": "SICHERHEIT", "security": "SICHERHEIT",
"select_address": "Adresse auswählen...", "select_address": "Adresse auswählen...",

View File

@@ -226,7 +226,7 @@
"error_format": "Error: %s", "error_format": "Error: %s",
"est_time_to_block": "Tiempo Est. al Bloque", "est_time_to_block": "Tiempo Est. al Bloque",
"exit": "Salir", "exit": "Salir",
"explorer": "EXPLORADOR", "explorer": "Explorador",
"explorer_block_detail": "Bloque", "explorer_block_detail": "Bloque",
"explorer_block_hash": "Hash", "explorer_block_hash": "Hash",
"explorer_block_height": "Altura", "explorer_block_height": "Altura",
@@ -241,6 +241,7 @@
"explorer_mempool_txs": "Transacciones", "explorer_mempool_txs": "Transacciones",
"explorer_recent_blocks": "Bloques Recientes", "explorer_recent_blocks": "Bloques Recientes",
"explorer_search": "Buscar", "explorer_search": "Buscar",
"explorer_section": "EXPLORADOR",
"explorer_tx_outputs": "Salidas", "explorer_tx_outputs": "Salidas",
"explorer_tx_size": "Tamaño", "explorer_tx_size": "Tamaño",
"export": "Exportar", "export": "Exportar",
@@ -582,6 +583,39 @@
"save": "Guardar", "save": "Guardar",
"save_settings": "Guardar Configuración", "save_settings": "Guardar Configuración",
"save_z_transactions": "Guardar Z-tx en lista", "save_z_transactions": "Guardar Z-tx en lista",
"sb_auth_failed": "Autenticación fallida — verifique rpcuser/rpcpassword",
"sb_block": "Bloque: %d",
"sb_connecting_daemon": "Conectando a dragonxd...",
"sb_connecting_err": "Conectando al daemon — %s",
"sb_connecting_external": "Conectando a daemon externo...",
"sb_connecting_generic": "Conectando al daemon...",
"sb_daemon_crashed": "El daemon se bloqueó %d veces",
"sb_daemon_not_found": "Daemon no encontrado",
"sb_dragonxd_running": "dragonxd ejecutándose",
"sb_dragonxd_stopped": "dragonxd detenido",
"sb_dragonxd_stopping": "Deteniendo dragonxd...",
"sb_extracting_sapling": "Extrayendo parámetros Sapling...",
"sb_importing_keys": "Importando claves",
"sb_loading_config": "Cargando configuración...",
"sb_mining_hs": "%.1f H/s",
"sb_net_ghs": "Red: %.2f GH/s",
"sb_net_hs": "Red: %.1f H/s",
"sb_net_khs": "Red: %.2f KH/s",
"sb_net_mhs": "Red: %.2f MH/s",
"sb_no_conf": "DRAGONX.conf no encontrado",
"sb_peers": "Pares: %zu",
"sb_rescanning": "Reescaneando",
"sb_rescanning_pct": "Reescaneando %.0f%%",
"sb_restarting_daemon": "Reiniciando daemon...",
"sb_sapling_failed": "Error al extraer parámetros Sapling.",
"sb_sapling_not_found": "Parámetros Sapling no encontrados.",
"sb_starting_daemon": "Iniciando dragonxd...",
"sb_syncing_basic": "Sincronizando %.1f%% (%d restantes)",
"sb_syncing_eta": "Sincronizando %.1f%% (%d restantes, %.0f blk/s, ~%s)",
"sb_waiting_config": "Esperando configuración del daemon...",
"sb_waiting_daemon": "Esperando a dragonxd...",
"sb_waiting_daemon_err": "Esperando a dragonxd — %s",
"sb_warming_up": "Calentando...",
"search_placeholder": "Buscar...", "search_placeholder": "Buscar...",
"security": "SEGURIDAD", "security": "SEGURIDAD",
"select_address": "Seleccionar dirección...", "select_address": "Seleccionar dirección...",
@@ -642,7 +676,7 @@
"sent_type": "Enviado", "sent_type": "Enviado",
"sent_upper": "ENVIADO", "sent_upper": "ENVIADO",
"set_label": "Establecer Etiqueta...", "set_label": "Establecer Etiqueta...",
"settings": "Configuración", "settings": "Ajustes",
"settings_about_text": "Una billetera de criptomonedas blindada para DragonX (DRGX), creada con Dear ImGui para una experiencia ligera y portátil.", "settings_about_text": "Una billetera de criptomonedas blindada para DragonX (DRGX), creada con Dear ImGui para una experiencia ligera y portátil.",
"settings_acrylic_level": "Nivel de acrílico:", "settings_acrylic_level": "Nivel de acrílico:",
"settings_address_book": "Libreta de direcciones...", "settings_address_book": "Libreta de direcciones...",

View File

@@ -226,7 +226,7 @@
"error_format": "Erreur : %s", "error_format": "Erreur : %s",
"est_time_to_block": "Temps est. par bloc", "est_time_to_block": "Temps est. par bloc",
"exit": "Quitter", "exit": "Quitter",
"explorer": "EXPLORATEUR", "explorer": "Explorateur",
"explorer_block_detail": "Bloc", "explorer_block_detail": "Bloc",
"explorer_block_hash": "Hash", "explorer_block_hash": "Hash",
"explorer_block_height": "Hauteur", "explorer_block_height": "Hauteur",
@@ -241,6 +241,7 @@
"explorer_mempool_txs": "Transactions", "explorer_mempool_txs": "Transactions",
"explorer_recent_blocks": "Blocs récents", "explorer_recent_blocks": "Blocs récents",
"explorer_search": "Rechercher", "explorer_search": "Rechercher",
"explorer_section": "EXPLORATEUR",
"explorer_tx_outputs": "Sorties", "explorer_tx_outputs": "Sorties",
"explorer_tx_size": "Taille", "explorer_tx_size": "Taille",
"export": "Exporter", "export": "Exporter",
@@ -582,6 +583,39 @@
"save": "Enregistrer", "save": "Enregistrer",
"save_settings": "Enregistrer les paramètres", "save_settings": "Enregistrer les paramètres",
"save_z_transactions": "Enregistrer les Z-tx dans la liste", "save_z_transactions": "Enregistrer les Z-tx dans la liste",
"sb_auth_failed": "Authentification échouée — vérifiez rpcuser/rpcpassword",
"sb_block": "Bloc : %d",
"sb_connecting_daemon": "Connexion à dragonxd...",
"sb_connecting_err": "Connexion au daemon — %s",
"sb_connecting_external": "Connexion au daemon externe...",
"sb_connecting_generic": "Connexion au daemon...",
"sb_daemon_crashed": "Le daemon a planté %d fois",
"sb_daemon_not_found": "Daemon introuvable",
"sb_dragonxd_running": "dragonxd en cours",
"sb_dragonxd_stopped": "dragonxd arrêté",
"sb_dragonxd_stopping": "Arrêt de dragonxd...",
"sb_extracting_sapling": "Extraction des paramètres Sapling...",
"sb_importing_keys": "Importation des clés",
"sb_loading_config": "Chargement de la configuration...",
"sb_mining_hs": "%.1f H/s",
"sb_net_ghs": "Rés: %.2f GH/s",
"sb_net_hs": "Rés: %.1f H/s",
"sb_net_khs": "Rés: %.2f KH/s",
"sb_net_mhs": "Rés: %.2f MH/s",
"sb_no_conf": "DRAGONX.conf introuvable",
"sb_peers": "Pairs : %zu",
"sb_rescanning": "Rescan",
"sb_rescanning_pct": "Rescan %.0f%%",
"sb_restarting_daemon": "Redémarrage du daemon...",
"sb_sapling_failed": "Échec de l'extraction des paramètres Sapling.",
"sb_sapling_not_found": "Paramètres Sapling introuvables.",
"sb_starting_daemon": "Démarrage de dragonxd...",
"sb_syncing_basic": "Synchronisation %.1f%% (%d restants)",
"sb_syncing_eta": "Synchronisation %.1f%% (%d restants, %.0f blk/s, ~%s)",
"sb_waiting_config": "En attente de la configuration du daemon...",
"sb_waiting_daemon": "En attente de dragonxd...",
"sb_waiting_daemon_err": "En attente de dragonxd — %s",
"sb_warming_up": "Démarrage...",
"search_placeholder": "Rechercher...", "search_placeholder": "Rechercher...",
"security": "SÉCURITÉ", "security": "SÉCURITÉ",
"select_address": "Sélectionner une adresse...", "select_address": "Sélectionner une adresse...",

View File

@@ -241,6 +241,7 @@
"explorer_mempool_txs": "トランザクション", "explorer_mempool_txs": "トランザクション",
"explorer_recent_blocks": "最近のブロック", "explorer_recent_blocks": "最近のブロック",
"explorer_search": "検索", "explorer_search": "検索",
"explorer_section": "エクスプローラー",
"explorer_tx_outputs": "出力", "explorer_tx_outputs": "出力",
"explorer_tx_size": "サイズ", "explorer_tx_size": "サイズ",
"export": "エクスポート", "export": "エクスポート",
@@ -582,6 +583,39 @@
"save": "保存", "save": "保存",
"save_settings": "設定を保存", "save_settings": "設定を保存",
"save_z_transactions": "Z取引を取引リストに保存", "save_z_transactions": "Z取引を取引リストに保存",
"sb_auth_failed": "認証失敗 — rpcuser/rpcpassword を確認してください",
"sb_block": "ブロック: %d",
"sb_connecting_daemon": "dragonxd に接続中...",
"sb_connecting_err": "デーモンに接続中 — %s",
"sb_connecting_external": "外部デーモンに接続中...",
"sb_connecting_generic": "デーモンに接続中...",
"sb_daemon_crashed": "デーモンが %d 回クラッシュしました",
"sb_daemon_not_found": "デーモンが見つかりません",
"sb_dragonxd_running": "dragonxd 実行中",
"sb_dragonxd_stopped": "dragonxd 停止",
"sb_dragonxd_stopping": "dragonxd を停止中...",
"sb_extracting_sapling": "Sapling パラメータを展開中...",
"sb_importing_keys": "鍵をインポート中",
"sb_loading_config": "設定を読み込み中...",
"sb_mining_hs": "%.1f H/s",
"sb_net_ghs": "ネット: %.2f GH/s",
"sb_net_hs": "ネット: %.1f H/s",
"sb_net_khs": "ネット: %.2f KH/s",
"sb_net_mhs": "ネット: %.2f MH/s",
"sb_no_conf": "DRAGONX.conf が見つかりません",
"sb_peers": "ピア: %zu",
"sb_rescanning": "再スキャン",
"sb_rescanning_pct": "再スキャン %.0f%%",
"sb_restarting_daemon": "デーモンを再起動中...",
"sb_sapling_failed": "Sapling パラメータの展開に失敗しました。",
"sb_sapling_not_found": "Sapling パラメータが見つかりません。",
"sb_starting_daemon": "dragonxd を起動中...",
"sb_syncing_basic": "同期中 %.1f%% (残り %d)",
"sb_syncing_eta": "同期中 %.1f%% (残り %d, %.0f ブロック/秒, ~%s)",
"sb_waiting_config": "デーモン設定を待機中...",
"sb_waiting_daemon": "dragonxd を待機中...",
"sb_waiting_daemon_err": "dragonxd を待機中 — %s",
"sb_warming_up": "ウォームアップ中...",
"search_placeholder": "検索...", "search_placeholder": "検索...",
"security": "セキュリティ", "security": "セキュリティ",
"select_address": "アドレスを選択...", "select_address": "アドレスを選択...",

View File

@@ -241,6 +241,7 @@
"explorer_mempool_txs": "트랜잭션", "explorer_mempool_txs": "트랜잭션",
"explorer_recent_blocks": "최근 블록", "explorer_recent_blocks": "최근 블록",
"explorer_search": "검색", "explorer_search": "검색",
"explorer_section": "탐색기",
"explorer_tx_outputs": "출력", "explorer_tx_outputs": "출력",
"explorer_tx_size": "크기", "explorer_tx_size": "크기",
"export": "내보내기", "export": "내보내기",
@@ -582,6 +583,39 @@
"save": "저장", "save": "저장",
"save_settings": "설정 저장", "save_settings": "설정 저장",
"save_z_transactions": "Z 거래를 거래 목록에 저장", "save_z_transactions": "Z 거래를 거래 목록에 저장",
"sb_auth_failed": "인증 실패 — rpcuser/rpcpassword를 확인하세요",
"sb_block": "블록: %d",
"sb_connecting_daemon": "dragonxd에 연결 중...",
"sb_connecting_err": "데몬 연결 중 — %s",
"sb_connecting_external": "외부 데몬에 연결 중...",
"sb_connecting_generic": "데몬에 연결 중...",
"sb_daemon_crashed": "데몬이 %d회 충돌함",
"sb_daemon_not_found": "데몬을 찾을 수 없음",
"sb_dragonxd_running": "dragonxd 실행 중",
"sb_dragonxd_stopped": "dragonxd 중지됨",
"sb_dragonxd_stopping": "dragonxd 중지 중...",
"sb_extracting_sapling": "Sapling 매개변수 추출 중...",
"sb_importing_keys": "키 가져오기 중",
"sb_loading_config": "설정 불러오는 중...",
"sb_mining_hs": "%.1f H/s",
"sb_net_ghs": "네트: %.2f GH/s",
"sb_net_hs": "네트: %.1f H/s",
"sb_net_khs": "네트: %.2f KH/s",
"sb_net_mhs": "네트: %.2f MH/s",
"sb_no_conf": "DRAGONX.conf를 찾을 수 없음",
"sb_peers": "피어: %zu",
"sb_rescanning": "재스캔",
"sb_rescanning_pct": "재스캔 %.0f%%",
"sb_restarting_daemon": "데몬 재시작 중...",
"sb_sapling_failed": "Sapling 매개변수 추출 실패.",
"sb_sapling_not_found": "Sapling 매개변수를 찾을 수 없음.",
"sb_starting_daemon": "dragonxd 시작 중...",
"sb_syncing_basic": "동기화 %.1f%% (%d 남음)",
"sb_syncing_eta": "동기화 %.1f%% (%d 남음, %.0f 블록/초, ~%s)",
"sb_waiting_config": "데몬 설정 대기 중...",
"sb_waiting_daemon": "dragonxd 대기 중...",
"sb_waiting_daemon_err": "dragonxd 대기 중 — %s",
"sb_warming_up": "워밍업 중...",
"search_placeholder": "검색...", "search_placeholder": "검색...",
"security": "보안", "security": "보안",
"select_address": "주소 선택...", "select_address": "주소 선택...",

View File

@@ -226,7 +226,7 @@
"error_format": "Erro: %s", "error_format": "Erro: %s",
"est_time_to_block": "Tempo Est. por Bloco", "est_time_to_block": "Tempo Est. por Bloco",
"exit": "Sair", "exit": "Sair",
"explorer": "EXPLORADOR", "explorer": "Explorador",
"explorer_block_detail": "Bloco", "explorer_block_detail": "Bloco",
"explorer_block_hash": "Hash", "explorer_block_hash": "Hash",
"explorer_block_height": "Altura", "explorer_block_height": "Altura",
@@ -241,6 +241,7 @@
"explorer_mempool_txs": "Transações", "explorer_mempool_txs": "Transações",
"explorer_recent_blocks": "Blocos Recentes", "explorer_recent_blocks": "Blocos Recentes",
"explorer_search": "Pesquisar", "explorer_search": "Pesquisar",
"explorer_section": "EXPLORADOR",
"explorer_tx_outputs": "Saídas", "explorer_tx_outputs": "Saídas",
"explorer_tx_size": "Tamanho", "explorer_tx_size": "Tamanho",
"export": "Exportar", "export": "Exportar",
@@ -474,7 +475,7 @@
"notes": "Notas", "notes": "Notas",
"notes_optional": "Notas (opcional):", "notes_optional": "Notas (opcional):",
"output_filename": "Nome do arquivo de saída:", "output_filename": "Nome do arquivo de saída:",
"overview": "Visão Geral", "overview": "Resumo",
"paste": "Colar", "paste": "Colar",
"paste_from_clipboard": "Colar da Área de Transferência", "paste_from_clipboard": "Colar da Área de Transferência",
"pay_from": "Pagar de", "pay_from": "Pagar de",
@@ -582,6 +583,39 @@
"save": "Salvar", "save": "Salvar",
"save_settings": "Salvar Configurações", "save_settings": "Salvar Configurações",
"save_z_transactions": "Salvar Z-tx na lista de tx", "save_z_transactions": "Salvar Z-tx na lista de tx",
"sb_auth_failed": "Autenticação falhou — verifique rpcuser/rpcpassword",
"sb_block": "Bloco: %d",
"sb_connecting_daemon": "Conectando ao dragonxd...",
"sb_connecting_err": "Conectando ao daemon — %s",
"sb_connecting_external": "Conectando ao daemon externo...",
"sb_connecting_generic": "Conectando ao daemon...",
"sb_daemon_crashed": "O daemon travou %d vezes",
"sb_daemon_not_found": "Daemon não encontrado",
"sb_dragonxd_running": "dragonxd em execução",
"sb_dragonxd_stopped": "dragonxd parado",
"sb_dragonxd_stopping": "Parando dragonxd...",
"sb_extracting_sapling": "Extraindo parâmetros Sapling...",
"sb_importing_keys": "Importando chaves",
"sb_loading_config": "Carregando configuração...",
"sb_mining_hs": "%.1f H/s",
"sb_net_ghs": "Rede: %.2f GH/s",
"sb_net_hs": "Rede: %.1f H/s",
"sb_net_khs": "Rede: %.2f KH/s",
"sb_net_mhs": "Rede: %.2f MH/s",
"sb_no_conf": "DRAGONX.conf não encontrado",
"sb_peers": "Pares: %zu",
"sb_rescanning": "Reescaneando",
"sb_rescanning_pct": "Reescaneando %.0f%%",
"sb_restarting_daemon": "Reiniciando daemon...",
"sb_sapling_failed": "Falha ao extrair parâmetros Sapling.",
"sb_sapling_not_found": "Parâmetros Sapling não encontrados.",
"sb_starting_daemon": "Iniciando dragonxd...",
"sb_syncing_basic": "Sincronizando %.1f%% (%d restantes)",
"sb_syncing_eta": "Sincronizando %.1f%% (%d restantes, %.0f blk/s, ~%s)",
"sb_waiting_config": "Aguardando configuração do daemon...",
"sb_waiting_daemon": "Aguardando dragonxd...",
"sb_waiting_daemon_err": "Aguardando dragonxd — %s",
"sb_warming_up": "Aquecendo...",
"search_placeholder": "Pesquisar...", "search_placeholder": "Pesquisar...",
"security": "SEGURANÇA", "security": "SEGURANÇA",
"select_address": "Selecionar endereço...", "select_address": "Selecionar endereço...",
@@ -642,7 +676,7 @@
"sent_type": "Enviado", "sent_type": "Enviado",
"sent_upper": "ENVIADO", "sent_upper": "ENVIADO",
"set_label": "Definir Rótulo...", "set_label": "Definir Rótulo...",
"settings": "Configurações", "settings": "Ajustes",
"settings_about_text": "Uma carteira de criptomoeda blindada para DragonX (DRGX), criada com Dear ImGui para uma experiência leve e portátil.", "settings_about_text": "Uma carteira de criptomoeda blindada para DragonX (DRGX), criada com Dear ImGui para uma experiência leve e portátil.",
"settings_acrylic_level": "Nível acrílico:", "settings_acrylic_level": "Nível acrílico:",
"settings_address_book": "Livro de endereços...", "settings_address_book": "Livro de endereços...",

View File

@@ -42,7 +42,7 @@
"address_upper": "АДРЕС", "address_upper": "АДРЕС",
"address_url": "URL адреса", "address_url": "URL адреса",
"addresses_appear_here": "Ваши адреса для получения появятся здесь после подключения.", "addresses_appear_here": "Ваши адреса для получения появятся здесь после подключения.",
"advanced": "РАСШИРЕННЫЕ", "advanced": "ПРОЧЕЕ",
"advanced_effects": "Расширенные эффекты...", "advanced_effects": "Расширенные эффекты...",
"ago": "назад", "ago": "назад",
"all_filter": "Все", "all_filter": "Все",
@@ -226,7 +226,7 @@
"error_format": "Ошибка: %s", "error_format": "Ошибка: %s",
"est_time_to_block": "Расч. время до блока", "est_time_to_block": "Расч. время до блока",
"exit": "Выход", "exit": "Выход",
"explorer": "ОБОЗРЕВАТЕЛЬ", "explorer": "Проводник",
"explorer_block_detail": "Блок", "explorer_block_detail": "Блок",
"explorer_block_hash": "Хеш", "explorer_block_hash": "Хеш",
"explorer_block_height": "Высота", "explorer_block_height": "Высота",
@@ -241,6 +241,7 @@
"explorer_mempool_txs": "Транзакции", "explorer_mempool_txs": "Транзакции",
"explorer_recent_blocks": "Последние блоки", "explorer_recent_blocks": "Последние блоки",
"explorer_search": "Поиск", "explorer_search": "Поиск",
"explorer_section": "ОБОЗРЕВАТЕЛЬ",
"explorer_tx_outputs": "Выходы", "explorer_tx_outputs": "Выходы",
"explorer_tx_size": "Размер", "explorer_tx_size": "Размер",
"export": "Экспорт", "export": "Экспорт",
@@ -582,6 +583,39 @@
"save": "Сохранить", "save": "Сохранить",
"save_settings": "Сохранить настройки", "save_settings": "Сохранить настройки",
"save_z_transactions": "Сохранять Z-tx в списке транзакций", "save_z_transactions": "Сохранять Z-tx в списке транзакций",
"sb_auth_failed": "Ошибка авторизации — проверьте rpcuser/rpcpassword",
"sb_block": "Блок: %d",
"sb_connecting_daemon": "Подключение к dragonxd...",
"sb_connecting_err": "Подключение к демону — %s",
"sb_connecting_external": "Подключение к внешнему демону...",
"sb_connecting_generic": "Подключение к демону...",
"sb_daemon_crashed": "Демон упал %d раз",
"sb_daemon_not_found": "Демон не найден",
"sb_dragonxd_running": "dragonxd запущен",
"sb_dragonxd_stopped": "dragonxd остановлен",
"sb_dragonxd_stopping": "Остановка dragonxd...",
"sb_extracting_sapling": "Извлечение параметров Sapling...",
"sb_importing_keys": "Импорт ключей",
"sb_loading_config": "Загрузка конфигурации...",
"sb_mining_hs": "%.1f H/s",
"sb_net_ghs": "Сеть: %.2f GH/s",
"sb_net_hs": "Сеть: %.1f H/s",
"sb_net_khs": "Сеть: %.2f KH/s",
"sb_net_mhs": "Сеть: %.2f MH/s",
"sb_no_conf": "DRAGONX.conf не найден",
"sb_peers": "Пиры: %zu",
"sb_rescanning": "Пересканирование",
"sb_rescanning_pct": "Пересканирование %.0f%%",
"sb_restarting_daemon": "Перезапуск демона...",
"sb_sapling_failed": "Ошибка извлечения параметров Sapling.",
"sb_sapling_not_found": "Параметры Sapling не найдены.",
"sb_starting_daemon": "Запуск dragonxd...",
"sb_syncing_basic": "Синхронизация %.1f%% (%d осталось)",
"sb_syncing_eta": "Синхронизация %.1f%% (%d осталось, %.0f блк/с, ~%s)",
"sb_waiting_config": "Ожидание конфигурации демона...",
"sb_waiting_daemon": "Ожидание dragonxd...",
"sb_waiting_daemon_err": "Ожидание dragonxd — %s",
"sb_warming_up": "Прогрев...",
"search_placeholder": "Поиск...", "search_placeholder": "Поиск...",
"security": "БЕЗОПАСНОСТЬ", "security": "БЕЗОПАСНОСТЬ",
"select_address": "Выбрать адрес...", "select_address": "Выбрать адрес...",
@@ -767,7 +801,7 @@
"timeout_off": "Выкл", "timeout_off": "Выкл",
"to": "Кому", "to": "Кому",
"to_upper": "КОМУ", "to_upper": "КОМУ",
"tools": "ИНСТРУМЕНТЫ", "tools": "УТИЛИТЫ",
"tools_actions": "Инструменты и действия...", "tools_actions": "Инструменты и действия...",
"total": "Итого", "total": "Итого",
"transaction_id": "ID ТРАНЗАКЦИИ", "transaction_id": "ID ТРАНЗАКЦИИ",

View File

@@ -241,6 +241,7 @@
"explorer_mempool_txs": "交易", "explorer_mempool_txs": "交易",
"explorer_recent_blocks": "最近区块", "explorer_recent_blocks": "最近区块",
"explorer_search": "搜索", "explorer_search": "搜索",
"explorer_section": "浏览器",
"explorer_tx_outputs": "输出", "explorer_tx_outputs": "输出",
"explorer_tx_size": "大小", "explorer_tx_size": "大小",
"export": "导出", "export": "导出",
@@ -582,6 +583,39 @@
"save": "保存", "save": "保存",
"save_settings": "保存设置", "save_settings": "保存设置",
"save_z_transactions": "将 Z 交易保存到列表", "save_z_transactions": "将 Z 交易保存到列表",
"sb_auth_failed": "认证失败 — 请检查 rpcuser/rpcpassword",
"sb_block": "区块: %d",
"sb_connecting_daemon": "正在连接 dragonxd...",
"sb_connecting_err": "连接守护进程 — %s",
"sb_connecting_external": "正在连接外部守护进程...",
"sb_connecting_generic": "正在连接守护进程...",
"sb_daemon_crashed": "守护进程崩溃 %d 次",
"sb_daemon_not_found": "未找到守护进程",
"sb_dragonxd_running": "dragonxd 运行中",
"sb_dragonxd_stopped": "dragonxd 已停止",
"sb_dragonxd_stopping": "正在停止 dragonxd...",
"sb_extracting_sapling": "正在提取 Sapling 参数...",
"sb_importing_keys": "正在导入密钥",
"sb_loading_config": "正在加载配置...",
"sb_mining_hs": "%.1f H/s",
"sb_net_ghs": "网络: %.2f GH/s",
"sb_net_hs": "网络: %.1f H/s",
"sb_net_khs": "网络: %.2f KH/s",
"sb_net_mhs": "网络: %.2f MH/s",
"sb_no_conf": "未找到 DRAGONX.conf",
"sb_peers": "节点: %zu",
"sb_rescanning": "重新扫描",
"sb_rescanning_pct": "重新扫描 %.0f%%",
"sb_restarting_daemon": "正在重启守护进程...",
"sb_sapling_failed": "提取 Sapling 参数失败。",
"sb_sapling_not_found": "未找到 Sapling 参数。",
"sb_starting_daemon": "正在启动 dragonxd...",
"sb_syncing_basic": "同步中 %.1f%% (剩余 %d)",
"sb_syncing_eta": "同步中 %.1f%% (剩余 %d, %.0f 块/秒, ~%s)",
"sb_waiting_config": "等待守护进程配置...",
"sb_waiting_daemon": "等待 dragonxd 启动...",
"sb_waiting_daemon_err": "等待 dragonxd — %s",
"sb_warming_up": "正在预热...",
"search_placeholder": "搜索...", "search_placeholder": "搜索...",
"security": "安全", "security": "安全",
"select_address": "选择地址...", "select_address": "选择地址...",

View File

@@ -1910,6 +1910,196 @@ TRANSLATIONS = {
"pt": "Endereço Z", "ru": "Z-адрес", "zh": "Z 地址", "pt": "Endereço Z", "ru": "Z-адрес", "zh": "Z 地址",
"ja": "Zアドレス", "ko": "Z 주소" "ja": "Zアドレス", "ko": "Z 주소"
}, },
# ── Status bar strings ───────────────────────────────────────────────
"sb_warming_up": {
"es": "Calentando...", "de": "Aufwärmen...", "fr": "Démarrage...",
"pt": "Aquecendo...", "ru": "Прогрев...", "zh": "正在预热...",
"ja": "ウォームアップ中...", "ko": "워밍업 중..."
},
"sb_block": {
"es": "Bloque: %d", "de": "Block: %d", "fr": "Bloc : %d",
"pt": "Bloco: %d", "ru": "Блок: %d", "zh": "区块: %d",
"ja": "ブロック: %d", "ko": "블록: %d"
},
"sb_peers": {
"es": "Pares: %zu", "de": "Peers: %zu", "fr": "Pairs : %zu",
"pt": "Pares: %zu", "ru": "Пиры: %zu", "zh": "节点: %zu",
"ja": "ピア: %zu", "ko": "피어: %zu"
},
"sb_net_ghs": {
"es": "Red: %.2f GH/s", "de": "Netz: %.2f GH/s", "fr": "Rés: %.2f GH/s",
"pt": "Rede: %.2f GH/s", "ru": "Сеть: %.2f GH/s", "zh": "网络: %.2f GH/s",
"ja": "ネット: %.2f GH/s", "ko": "네트: %.2f GH/s"
},
"sb_net_mhs": {
"es": "Red: %.2f MH/s", "de": "Netz: %.2f MH/s", "fr": "Rés: %.2f MH/s",
"pt": "Rede: %.2f MH/s", "ru": "Сеть: %.2f MH/s", "zh": "网络: %.2f MH/s",
"ja": "ネット: %.2f MH/s", "ko": "네트: %.2f MH/s"
},
"sb_net_khs": {
"es": "Red: %.2f KH/s", "de": "Netz: %.2f KH/s", "fr": "Rés: %.2f KH/s",
"pt": "Rede: %.2f KH/s", "ru": "Сеть: %.2f KH/s", "zh": "网络: %.2f KH/s",
"ja": "ネット: %.2f KH/s", "ko": "네트: %.2f KH/s"
},
"sb_net_hs": {
"es": "Red: %.1f H/s", "de": "Netz: %.1f H/s", "fr": "Rés: %.1f H/s",
"pt": "Rede: %.1f H/s", "ru": "Сеть: %.1f H/s", "zh": "网络: %.1f H/s",
"ja": "ネット: %.1f H/s", "ko": "네트: %.1f H/s"
},
"sb_mining_hs": {
"es": "%.1f H/s", "de": "%.1f H/s", "fr": "%.1f H/s",
"pt": "%.1f H/s", "ru": "%.1f H/s", "zh": "%.1f H/s",
"ja": "%.1f H/s", "ko": "%.1f H/s"
},
"sb_syncing_eta": {
"es": "Sincronizando %.1f%% (%d restantes, %.0f blk/s, ~%s)",
"de": "Synchronisierung %.1f%% (%d übrig, %.0f Blk/s, ~%s)",
"fr": "Synchronisation %.1f%% (%d restants, %.0f blk/s, ~%s)",
"pt": "Sincronizando %.1f%% (%d restantes, %.0f blk/s, ~%s)",
"ru": "Синхронизация %.1f%% (%d осталось, %.0f блк/с, ~%s)",
"zh": "同步中 %.1f%% (剩余 %d, %.0f 块/秒, ~%s)",
"ja": "同期中 %.1f%% (残り %d, %.0f ブロック/秒, ~%s)",
"ko": "동기화 %.1f%% (%d 남음, %.0f 블록/초, ~%s)"
},
"sb_syncing_basic": {
"es": "Sincronizando %.1f%% (%d restantes)",
"de": "Synchronisierung %.1f%% (%d übrig)",
"fr": "Synchronisation %.1f%% (%d restants)",
"pt": "Sincronizando %.1f%% (%d restantes)",
"ru": "Синхронизация %.1f%% (%d осталось)",
"zh": "同步中 %.1f%% (剩余 %d)",
"ja": "同期中 %.1f%% (残り %d)",
"ko": "동기화 %.1f%% (%d 남음)"
},
"sb_rescanning_pct": {
"es": "Reescaneando %.0f%%", "de": "Neuscan %.0f%%", "fr": "Rescan %.0f%%",
"pt": "Reescaneando %.0f%%", "ru": "Пересканирование %.0f%%", "zh": "重新扫描 %.0f%%",
"ja": "再スキャン %.0f%%", "ko": "재스캔 %.0f%%"
},
"sb_rescanning": {
"es": "Reescaneando", "de": "Neuscan", "fr": "Rescan",
"pt": "Reescaneando", "ru": "Пересканирование", "zh": "重新扫描",
"ja": "再スキャン", "ko": "재스캔"
},
"sb_importing_keys": {
"es": "Importando claves", "de": "Schlüssel importieren", "fr": "Importation des clés",
"pt": "Importando chaves", "ru": "Импорт ключей", "zh": "正在导入密钥",
"ja": "鍵をインポート中", "ko": "키 가져오기 중"
},
"sb_daemon_not_found": {
"es": "Daemon no encontrado", "de": "Daemon nicht gefunden", "fr": "Daemon introuvable",
"pt": "Daemon não encontrado", "ru": "Демон не найден", "zh": "未找到守护进程",
"ja": "デーモンが見つかりません", "ko": "데몬을 찾을 수 없음"
},
"sb_loading_config": {
"es": "Cargando configuración...", "de": "Konfiguration laden...", "fr": "Chargement de la configuration...",
"pt": "Carregando configuração...", "ru": "Загрузка конфигурации...", "zh": "正在加载配置...",
"ja": "設定を読み込み中...", "ko": "설정 불러오는 중..."
},
"sb_waiting_config": {
"es": "Esperando configuración del daemon...", "de": "Warten auf Daemon-Konfiguration...", "fr": "En attente de la configuration du daemon...",
"pt": "Aguardando configuração do daemon...", "ru": "Ожидание конфигурации демона...", "zh": "等待守护进程配置...",
"ja": "デーモン設定を待機中...", "ko": "데몬 설정 대기 중..."
},
"sb_no_conf": {
"es": "DRAGONX.conf no encontrado", "de": "DRAGONX.conf nicht gefunden", "fr": "DRAGONX.conf introuvable",
"pt": "DRAGONX.conf não encontrado", "ru": "DRAGONX.conf не найден", "zh": "未找到 DRAGONX.conf",
"ja": "DRAGONX.conf が見つかりません", "ko": "DRAGONX.conf를 찾을 수 없음"
},
"sb_starting_daemon": {
"es": "Iniciando dragonxd...", "de": "dragonxd wird gestartet...", "fr": "Démarrage de dragonxd...",
"pt": "Iniciando dragonxd...", "ru": "Запуск dragonxd...", "zh": "正在启动 dragonxd...",
"ja": "dragonxd を起動中...", "ko": "dragonxd 시작 중..."
},
"sb_connecting_daemon": {
"es": "Conectando a dragonxd...", "de": "Verbindung zu dragonxd...", "fr": "Connexion à dragonxd...",
"pt": "Conectando ao dragonxd...", "ru": "Подключение к dragonxd...", "zh": "正在连接 dragonxd...",
"ja": "dragonxd に接続中...", "ko": "dragonxd에 연결 중..."
},
"sb_auth_failed": {
"es": "Autenticación fallida — verifique rpcuser/rpcpassword",
"de": "Authentifizierung fehlgeschlagen — rpcuser/rpcpassword prüfen",
"fr": "Authentification échouée — vérifiez rpcuser/rpcpassword",
"pt": "Autenticação falhou — verifique rpcuser/rpcpassword",
"ru": "Ошибка авторизации — проверьте rpcuser/rpcpassword",
"zh": "认证失败 — 请检查 rpcuser/rpcpassword",
"ja": "認証失敗 — rpcuser/rpcpassword を確認してください",
"ko": "인증 실패 — rpcuser/rpcpassword를 확인하세요"
},
"sb_waiting_daemon": {
"es": "Esperando a dragonxd...", "de": "Warten auf dragonxd...", "fr": "En attente de dragonxd...",
"pt": "Aguardando dragonxd...", "ru": "Ожидание dragonxd...", "zh": "等待 dragonxd 启动...",
"ja": "dragonxd を待機中...", "ko": "dragonxd 대기 중..."
},
"sb_waiting_daemon_err": {
"es": "Esperando a dragonxd — %s", "de": "Warten auf dragonxd — %s", "fr": "En attente de dragonxd — %s",
"pt": "Aguardando dragonxd — %s", "ru": "Ожидание dragonxd — %s", "zh": "等待 dragonxd — %s",
"ja": "dragonxd を待機中 — %s", "ko": "dragonxd 대기 중 — %s"
},
"sb_connecting_external": {
"es": "Conectando a daemon externo...", "de": "Verbindung zu externem Daemon...", "fr": "Connexion au daemon externe...",
"pt": "Conectando ao daemon externo...", "ru": "Подключение к внешнему демону...", "zh": "正在连接外部守护进程...",
"ja": "外部デーモンに接続中...", "ko": "외부 데몬에 연결 중..."
},
"sb_connecting_generic": {
"es": "Conectando al daemon...", "de": "Verbindung zum Daemon...", "fr": "Connexion au daemon...",
"pt": "Conectando ao daemon...", "ru": "Подключение к демону...", "zh": "正在连接守护进程...",
"ja": "デーモンに接続中...", "ko": "데몬에 연결 중..."
},
"sb_connecting_err": {
"es": "Conectando al daemon — %s", "de": "Verbindung zum Daemon — %s", "fr": "Connexion au daemon — %s",
"pt": "Conectando ao daemon — %s", "ru": "Подключение к демону — %s", "zh": "连接守护进程 — %s",
"ja": "デーモンに接続中 — %s", "ko": "데몬 연결 중 — %s"
},
"sb_daemon_crashed": {
"es": "El daemon se bloqueó %d veces", "de": "Daemon ist %d mal abgestürzt", "fr": "Le daemon a planté %d fois",
"pt": "O daemon travou %d vezes", "ru": "Демон упал %d раз", "zh": "守护进程崩溃 %d",
"ja": "デーモンが %d 回クラッシュしました", "ko": "데몬이 %d회 충돌함"
},
"sb_extracting_sapling": {
"es": "Extrayendo parámetros Sapling...", "de": "Sapling-Parameter werden extrahiert...", "fr": "Extraction des paramètres Sapling...",
"pt": "Extraindo parâmetros Sapling...", "ru": "Извлечение параметров Sapling...", "zh": "正在提取 Sapling 参数...",
"ja": "Sapling パラメータを展開中...", "ko": "Sapling 매개변수 추출 중..."
},
"sb_sapling_failed": {
"es": "Error al extraer parámetros Sapling.", "de": "Sapling-Parameter-Extraktion fehlgeschlagen.", "fr": "Échec de l'extraction des paramètres Sapling.",
"pt": "Falha ao extrair parâmetros Sapling.", "ru": "Ошибка извлечения параметров Sapling.", "zh": "提取 Sapling 参数失败。",
"ja": "Sapling パラメータの展開に失敗しました。", "ko": "Sapling 매개변수 추출 실패."
},
"sb_sapling_not_found": {
"es": "Parámetros Sapling no encontrados.", "de": "Sapling-Parameter nicht gefunden.", "fr": "Paramètres Sapling introuvables.",
"pt": "Parâmetros Sapling não encontrados.", "ru": "Параметры Sapling не найдены.", "zh": "未找到 Sapling 参数。",
"ja": "Sapling パラメータが見つかりません。", "ko": "Sapling 매개변수를 찾을 수 없음."
},
"sb_dragonxd_running": {
"es": "dragonxd ejecutándose", "de": "dragonxd läuft", "fr": "dragonxd en cours",
"pt": "dragonxd em execução", "ru": "dragonxd запущен", "zh": "dragonxd 运行中",
"ja": "dragonxd 実行中", "ko": "dragonxd 실행 중"
},
"sb_dragonxd_stopping": {
"es": "Deteniendo dragonxd...", "de": "dragonxd wird gestoppt...", "fr": "Arrêt de dragonxd...",
"pt": "Parando dragonxd...", "ru": "Остановка dragonxd...", "zh": "正在停止 dragonxd...",
"ja": "dragonxd を停止中...", "ko": "dragonxd 중지 중..."
},
"sb_dragonxd_stopped": {
"es": "dragonxd detenido", "de": "dragonxd gestoppt", "fr": "dragonxd arrêté",
"pt": "dragonxd parado", "ru": "dragonxd остановлен", "zh": "dragonxd 已停止",
"ja": "dragonxd 停止", "ko": "dragonxd 중지됨"
},
"sb_restarting_daemon": {
"es": "Reiniciando daemon...", "de": "Daemon wird neu gestartet...", "fr": "Redémarrage du daemon...",
"pt": "Reiniciando daemon...", "ru": "Перезапуск демона...", "zh": "正在重启守护进程...",
"ja": "デーモンを再起動中...", "ko": "데몬 재시작 중..."
},
# --- Sidebar / section label fixes ---
"explorer_section": {
"es": "EXPLORADOR", "de": "EXPLORER", "fr": "EXPLORATEUR",
"pt": "EXPLORADOR", "ru": "ОБОЗРЕВАТЕЛЬ", "zh": "浏览器",
"ja": "エクスプローラー", "ko": "탐색기"
},
} }
def main(): def main():

View File

@@ -1450,27 +1450,27 @@ void App::renderStatusBar()
ImGui::SameLine(0, sbIconTextGap); ImGui::SameLine(0, sbIconTextGap);
// Show truncated warmup status (e.g. "Activating best chain... (Block 12345)") // Show truncated warmup status (e.g. "Activating best chain... (Block 12345)")
const char* warmupText = state_.warmup_status.empty() 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); ImGui::TextColored(ImVec4(1.0f, 0.8f, 0.0f, 1.0f), "%s", warmupText);
} else if (state_.connected) { } else if (state_.connected) {
ImGui::PushFont(ui::material::Type().iconSmall()); ImGui::PushFont(ui::material::Type().iconSmall());
ImGui::TextColored(ImVec4(0.2f, 0.8f, 0.2f, dotOpacity), ICON_MD_CIRCLE); ImGui::TextColored(ImVec4(0.2f, 0.8f, 0.2f, dotOpacity), ICON_MD_CIRCLE);
ImGui::PopFont(); ImGui::PopFont();
ImGui::SameLine(0, sbIconTextGap); ImGui::SameLine(0, sbIconTextGap);
ImGui::Text("Connected"); ImGui::Text("%s", TR("connected"));
} else { } else {
ImGui::PushFont(ui::material::Type().iconSmall()); ImGui::PushFont(ui::material::Type().iconSmall());
ImGui::TextColored(ImVec4(0.8f, 0.2f, 0.2f, dotOpacity), ICON_MD_CIRCLE); ImGui::TextColored(ImVec4(0.8f, 0.2f, 0.2f, dotOpacity), ICON_MD_CIRCLE);
ImGui::PopFont(); ImGui::PopFont();
ImGui::SameLine(0, sbIconTextGap); ImGui::SameLine(0, sbIconTextGap);
ImGui::Text("Disconnected"); ImGui::Text("%s", TR("disconnected"));
} }
// Block height // Block height
ImGui::SameLine(0, sbSectionGap); ImGui::SameLine(0, sbSectionGap);
ImGui::TextDisabled("|"); ImGui::TextDisabled("|");
ImGui::SameLine(0, sbSeparatorGap); ImGui::SameLine(0, sbSeparatorGap);
ImGui::Text("Block: %d", state_.sync.blocks); ImGui::Text(TR("sb_block"), state_.sync.blocks);
// Sync status or peer count // Sync status or peer count
ImGui::SameLine(0, sbSectionGap); ImGui::SameLine(0, sbSectionGap);
@@ -1480,13 +1480,13 @@ void App::renderStatusBar()
// Show rescan progress (takes priority over sync) // Show rescan progress (takes priority over sync)
// Use animated dots if progress is unknown (0%) // Use animated dots if progress is unknown (0%)
if (state_.sync.rescan_progress > 0.01f) { 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); state_.sync.rescan_progress * 100.0f);
} else { } else {
// Animated "Rescanning..." with pulsing dots // Animated "Rescanning..." with pulsing dots
int dots = (int)(ImGui::GetTime() * 2.0f) % 4; int dots = (int)(ImGui::GetTime() * 2.0f) % 4;
const char* dotStr = (dots == 0) ? "." : (dots == 1) ? ".." : (dots == 2) ? "..." : ""; 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) { } else if (state_.sync.syncing) {
int chainTip = state_.longestchain > 0 ? state_.longestchain : state_.sync.headers; 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); snprintf(eta, sizeof(eta), "%dm %ds", eta_sec / 60, eta_sec % 60);
else else
snprintf(eta, sizeof(eta), "%ds", eta_sec); 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); state_.sync.verification_progress * 100.0, blocksLeft, s_blocks_per_sec, eta);
} else { } 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); state_.sync.verification_progress * 100.0, blocksLeft);
} }
} else if (state_.connected) { } 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) // Network hashrate (if connected and have data)
@@ -1544,13 +1544,13 @@ void App::renderStatusBar()
ImGui::TextDisabled("|"); ImGui::TextDisabled("|");
ImGui::SameLine(0, sbSeparatorGap); ImGui::SameLine(0, sbSeparatorGap);
if (state_.mining.networkHashrate >= 1e9) { 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) { } 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) { } 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 { } 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 double displayHashrate = state_.pool_mining.xmrig_running
? state_.pool_mining.hashrate_10s ? state_.pool_mining.hashrate_10s
: state_.mining.localHashrate; : 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); displayHashrate);
} }
@@ -1583,7 +1583,7 @@ void App::renderStatusBar()
ImGui::SameLine(0, sbIconTextGap); ImGui::SameLine(0, sbIconTextGap);
int dots = (int)(ImGui::GetTime() * 2.0f) % 4; int dots = (int)(ImGui::GetTime() * 2.0f) % 4;
const char* dotStr = (dots == 0) ? "." : (dots == 1) ? ".." : (dots == 2) ? "..." : ""; 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. // Right side: version always at far right, connection status to its left.
@@ -1605,7 +1605,7 @@ void App::renderStatusBar()
ImGui::SameLine(statusX); ImGui::SameLine(statusX);
ImGui::TextDisabled("%s", connection_status_.c_str()); ImGui::TextDisabled("%s", connection_status_.c_str());
} else if (!daemon_status_.empty() && daemon_status_.find("Error") != std::string::npos) { } 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 statusW = ImGui::CalcTextSize(errText).x;
float statusX = versionX - statusW - gap; float statusX = versionX - statusW - gap;
ImGui::SameLine(statusX); ImGui::SameLine(statusX);
@@ -2062,12 +2062,12 @@ bool App::startEmbeddedDaemon()
// Try to extract embedded resources if available // Try to extract embedded resources if available
if (resources::hasEmbeddedResources()) { if (resources::hasEmbeddedResources()) {
DEBUG_LOGF("Extracting embedded Sapling params...\n"); DEBUG_LOGF("Extracting embedded Sapling params...\n");
daemon_status_ = "Extracting Sapling parameters..."; daemon_status_ = TR("sb_extracting_sapling");
resources::extractEmbeddedResources(); resources::extractEmbeddedResources();
// Check again after extraction // Check again after extraction
if (!rpc::Connection::verifySaplingParams()) { 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("Sapling params still not found after extraction!\n");
DEBUG_LOGF("Expected location: %s\n", rpc::Connection::getSaplingParamsDir().c_str()); DEBUG_LOGF("Expected location: %s\n", rpc::Connection::getSaplingParamsDir().c_str());
return false; return false;
@@ -2113,7 +2113,7 @@ bool App::startEmbeddedDaemon()
if (copied && rpc::Connection::verifySaplingParams()) { if (copied && rpc::Connection::verifySaplingParams()) {
DEBUG_LOGF("Sapling params copied from exe directory successfully\n"); DEBUG_LOGF("Sapling params copied from exe directory successfully\n");
} else { } 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("Sapling params not found and no embedded resources available!\n");
DEBUG_LOGF("Expected location: %s\n", rpc::Connection::getSaplingParamsDir().c_str()); DEBUG_LOGF("Expected location: %s\n", rpc::Connection::getSaplingParamsDir().c_str());
return false; return false;
@@ -2163,16 +2163,16 @@ bool App::startEmbeddedDaemon()
embedded_daemon_->setStateCallback([this](daemon::EmbeddedDaemon::State state, const std::string& msg) { embedded_daemon_->setStateCallback([this](daemon::EmbeddedDaemon::State state, const std::string& msg) {
switch (state) { switch (state) {
case daemon::EmbeddedDaemon::State::Starting: case daemon::EmbeddedDaemon::State::Starting:
daemon_status_ = "Starting dragonxd..."; daemon_status_ = TR("sb_starting_daemon");
break; break;
case daemon::EmbeddedDaemon::State::Running: case daemon::EmbeddedDaemon::State::Running:
daemon_status_ = "dragonxd running"; daemon_status_ = TR("sb_dragonxd_running");
break; break;
case daemon::EmbeddedDaemon::State::Stopping: case daemon::EmbeddedDaemon::State::Stopping:
daemon_status_ = "Stopping dragonxd..."; daemon_status_ = TR("sb_dragonxd_stopping");
break; break;
case daemon::EmbeddedDaemon::State::Stopped: case daemon::EmbeddedDaemon::State::Stopped:
daemon_status_ = "dragonxd stopped"; daemon_status_ = TR("sb_dragonxd_stopped");
break; break;
case daemon::EmbeddedDaemon::State::Error: case daemon::EmbeddedDaemon::State::Error:
daemon_status_ = "Error: " + msg; daemon_status_ = "Error: " + msg;
@@ -3105,7 +3105,7 @@ void App::restartDaemon()
} }
DEBUG_LOGF("[App] Restarting embedded daemon...\n"); DEBUG_LOGF("[App] Restarting embedded daemon...\n");
connection_status_ = "Restarting daemon..."; connection_status_ = TR("sb_restarting_daemon");
// Disconnect RPC so the loading overlay appears // Disconnect RPC so the loading overlay appears
if (rpc_ && rpc_->isConnected()) { if (rpc_ && rpc_->isConnected()) {

View File

@@ -40,6 +40,7 @@
#include "default_banlist_embedded.h" #include "default_banlist_embedded.h"
#include "util/platform.h" #include "util/platform.h"
#include "util/perf_log.h" #include "util/perf_log.h"
#include "util/i18n.h"
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
#include <curl/curl.h> #include <curl/curl.h>
@@ -95,7 +96,7 @@ void App::tryConnect()
++connect_attempt; ++connect_attempt;
connection_in_progress_ = true; 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-detect configuration (file I/O — fast, safe on main thread)
auto config = rpc::Connection::autoDetectConfig(); 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 // 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). // for the config file to appear (the daemon creates it on first run).
if (embedded_daemon_ && embedded_daemon_->externalDaemonDetected()) { 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); 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; core_timer_ = CORE_INTERVAL_DEFAULT - 1.0f;
return; return;
} }
connection_status_ = "No DRAGONX.conf found"; connection_status_ = TR("sb_no_conf");
// Try to start embedded daemon if enabled // Try to start embedded daemon if enabled
if (use_embedded_daemon_ && !isEmbeddedDaemonRunning()) { if (use_embedded_daemon_ && !isEmbeddedDaemonRunning()) {
connection_status_ = "Starting dragonxd..."; connection_status_ = TR("sb_starting_daemon");
if (startEmbeddedDaemon()) { if (startEmbeddedDaemon()) {
// Will retry connection after daemon starts // Will retry connection after daemon starts
VERBOSE_LOGF("[connect #%d] Embedded daemon starting, will retry connection...\n", connect_attempt); VERBOSE_LOGF("[connect #%d] Embedded daemon starting, will retry connection...\n", connect_attempt);
core_timer_ = CORE_INTERVAL_DEFAULT - 1.0f; core_timer_ = CORE_INTERVAL_DEFAULT - 1.0f;
} else if (embedded_daemon_ && embedded_daemon_->externalDaemonDetected()) { } 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); VERBOSE_LOGF("[connect #%d] External daemon detected but no config yet, will retry...\n", connect_attempt);
core_timer_ = CORE_INTERVAL_DEFAULT - 1.0f; core_timer_ = CORE_INTERVAL_DEFAULT - 1.0f;
} else { } else {
@@ -141,7 +142,7 @@ void App::tryConnect()
return; return;
} }
connection_status_ = "Connecting to dragonxd..."; connection_status_ = TR("sb_connecting_daemon");
VERBOSE_LOGF("[connect #%d] Connecting to %s:%s (user=%s)\n", 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()); connect_attempt, config.host.c_str(), config.port.c_str(), config.rpcuser.c_str());
@@ -235,7 +236,7 @@ void App::tryConnect()
onConnected(); onConnected();
} else { } else {
state_.connected = false; 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); VERBOSE_LOGF("[connect #%d] .cookie auth also failed\n", attempt);
ui::Notifications::instance().error( ui::Notifications::instance().error(
"RPC authentication failed (HTTP 401). " "RPC authentication failed (HTTP 401). "
@@ -248,7 +249,7 @@ void App::tryConnect()
} }
state_.connected = false; state_.connected = false;
std::string confPath = rpc::Connection::getDefaultConfPath(); 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. " 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", "Edit the file or restart the daemon to regenerate credentials.\n",
attempt, confPath.c_str()); attempt, confPath.c_str());
@@ -261,9 +262,10 @@ void App::tryConnect()
// Show the actual RPC error alongside the waiting message so // Show the actual RPC error alongside the waiting message so
// auth mismatches and timeouts aren't silently hidden. // auth mismatches and timeouts aren't silently hidden.
if (!connectErr.empty()) { 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 { } 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", VERBOSE_LOGF("[connect #%d] RPC connection failed (%s) — daemon still starting, will retry...\n",
attempt, connectErr.c_str()); attempt, connectErr.c_str());
@@ -271,9 +273,10 @@ void App::tryConnect()
} else if (externalDetected) { } else if (externalDetected) {
state_.connected = false; state_.connected = false;
if (!connectErr.empty()) { 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 { } 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", VERBOSE_LOGF("[connect #%d] External daemon detected but RPC failed (%s), will retry...\n",
attempt, connectErr.c_str()); attempt, connectErr.c_str());
@@ -285,15 +288,16 @@ void App::tryConnect()
if (use_embedded_daemon_ && !isEmbeddedDaemonRunning()) { if (use_embedded_daemon_ && !isEmbeddedDaemonRunning()) {
// Prevent infinite crash-restart loop // Prevent infinite crash-restart loop
if (embedded_daemon_ && embedded_daemon_->getCrashCount() >= 3) { 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", VERBOSE_LOGF("[connect #%d] Daemon crashed %d times — not restarting (use Settings > Restart Daemon to retry)\n",
attempt, embedded_daemon_->getCrashCount()); attempt, embedded_daemon_->getCrashCount());
} else { } else {
connection_status_ = "Starting dragonxd..."; connection_status_ = TR("sb_starting_daemon");
if (startEmbeddedDaemon()) { if (startEmbeddedDaemon()) {
VERBOSE_LOGF("[connect #%d] Embedded daemon starting, will retry connection...\n", attempt); VERBOSE_LOGF("[connect #%d] Embedded daemon starting, will retry connection...\n", attempt);
} else if (embedded_daemon_ && embedded_daemon_->externalDaemonDetected()) { } 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); VERBOSE_LOGF("[connect #%d] External daemon detected, will connect via RPC...\n", attempt);
} else { } else {
VERBOSE_LOGF("[connect #%d] Failed to start embedded daemon — lastError: %s\n", VERBOSE_LOGF("[connect #%d] Failed to start embedded daemon — lastError: %s\n",
@@ -317,7 +321,7 @@ void App::tryConnect()
void App::onConnected() void App::onConnected()
{ {
state_.connected = true; state_.connected = true;
connection_status_ = "Connected"; connection_status_ = TR("connected");
// Reset crash counter on successful connection // Reset crash counter on successful connection
if (embedded_daemon_) { if (embedded_daemon_) {
@@ -597,7 +601,7 @@ void App::refreshCoreData()
state_.warming_up = false; state_.warming_up = false;
state_.warmup_status.clear(); state_.warmup_status.clear();
state_.warmup_description.clear(); state_.warmup_description.clear();
connection_status_ = "Connected"; connection_status_ = TR("connected");
VERBOSE_LOGF("[warmup] Daemon ready, warmup complete\n"); VERBOSE_LOGF("[warmup] Daemon ready, warmup complete\n");
// Parse initial info // Parse initial info
try { try {

View File

@@ -1005,7 +1005,7 @@ unsigned char res_lang_de_json[] = {
0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x69, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x69, 0x74, 0x22, 0x3a, 0x20, 0x22,
0x42, 0x65, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x42, 0x65, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x22, 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, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x6c, 0x6f,
0x72, 0x65, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x72, 0x65, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x64, 0x65,
0x74, 0x61, 0x69, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x42, 0x6c, 0x6f, 0x63, 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, 0x22, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x5f, 0x73, 0x65,
0x61, 0x72, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x68, 0x61, 0x72, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x68,
0x65, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 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, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x6f, 0x75,
0x74, 0x70, 0x75, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x75, 0x73, 0x74, 0x70, 0x75, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x75, 0x73,
0x67, 0x61, 0x62, 0x65, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 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, 0x22, 0x5a, 0x2d, 0x54, 0x78, 0x20, 0x69, 0x6e, 0x20, 0x54, 0x78, 0x2d,
0x4c, 0x69, 0x73, 0x74, 0x65, 0x20, 0x73, 0x70, 0x65, 0x69, 0x63, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x20, 0x73, 0x70, 0x65, 0x69, 0x63, 0x68,
0x65, 0x72, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 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, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68,
0x6f, 0x6c, 0x64, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63,
0x68, 0x65, 0x6e, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 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, 0x2d, 0x41, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x22, 0x0a, 0x7d,
0x0a 0x0a
}; };
unsigned int res_lang_de_json_len = 47893; unsigned int res_lang_de_json_len = 49657;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1675,7 +1675,7 @@ void RenderSettingsPage(App* app) {
// EXPLORER & OPTIONS — full-width card // 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())); ImGui::Dummy(ImVec2(0, Layout::spacingXs()));
ImVec2 cardMin = ImGui::GetCursorScreenPos(); ImVec2 cardMin = ImGui::GetCursorScreenPos();

View File

@@ -557,15 +557,21 @@ inline bool RenderSidebar(NavPage& current, float sidebarWidth, float contentHei
if (showLabels) { if (showLabels) {
ImFont* olFont = Type().overline(); ImFont* olFont = Type().overline();
float olFontSz = ScaledFontSize(olFont); float olFontSz = ScaledFontSize(olFont);
float maxSectionW = panelRight - wp.x - sbSectionLabelPadLeft;
int si = 0; int si = 0;
for (int i = 0; i < (int)NavPage::Count_; ++i) { for (int i = 0; i < (int)NavPage::Count_; ++i) {
if (kNavItems[i].section_label && si < nSectionLabels) { if (kNavItems[i].section_label && si < nSectionLabels) {
float ly = panelTopY + sectionLabelY[si++]; 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()); ImVec4 olCol = ImGui::ColorConvertU32ToFloat4(OnSurfaceMedium());
olCol.w *= expandFrac; olCol.w *= expandFrac;
dl->AddText(olFont, olFontSz, dl->AddText(olFont, drawFsz,
ImVec2(wp.x + sbSectionLabelPadLeft, ly), ImVec2(wp.x + sbSectionLabelPadLeft, ly),
ImGui::ColorConvertFloat4ToU32(olCol), NavSectionLabel(kNavItems[i])); ImGui::ColorConvertFloat4ToU32(olCol), sLabel);
} }
} }
} else { } else {

View File

@@ -195,7 +195,7 @@ static void RenderSyncBanner(const WalletState& state) {
? (float)state.sync.blocks / state.sync.headers * 100.0f : 0.0f; ? (float)state.sync.blocks / state.sync.headers * 100.0f : 0.0f;
char syncBuf[128]; char syncBuf[128];
snprintf(syncBuf, sizeof(syncBuf), 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))); 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()); 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), ImGui::BeginChild("##SyncBanner", ImVec2(ImGui::GetContentRegionAvail().x, syncH),

View File

@@ -181,7 +181,7 @@ void I18n::loadBuiltinEnglish()
strings_["node_security"] = "NODE & SECURITY"; strings_["node_security"] = "NODE & SECURITY";
strings_["node"] = "NODE"; strings_["node"] = "NODE";
strings_["security"] = "SECURITY"; strings_["security"] = "SECURITY";
strings_["explorer"] = "EXPLORER"; strings_["explorer_section"] = "EXPLORER";
strings_["about"] = "About"; strings_["about"] = "About";
strings_["backup_data"] = "BACKUP & DATA"; strings_["backup_data"] = "BACKUP & DATA";
strings_["balance_layout"] = "Balance Layout"; strings_["balance_layout"] = "Balance Layout";
@@ -671,6 +671,41 @@ void I18n::loadBuiltinEnglish()
strings_["syncing"] = "Syncing..."; strings_["syncing"] = "Syncing...";
strings_["block"] = "Block"; strings_["block"] = "Block";
strings_["no_addresses_available"] = "No addresses available"; 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 // Errors & Messages
strings_["error"] = "Error"; strings_["error"] = "Error";