feat(mining): persistent payout error, solo-address explainer, i18n cleanup

- The pool payout-address rule is no longer hover-only: an invalid payout
  address now outlines the field in red and shows a short reason below it (a row
  is reserved so it doesn't overlap the card beneath). The longer tooltip stays.
- The solo "Mining Addr" row gains a hover explainer and a "None yet" empty-state
  (with a tooltip pointing to Receive → New mining address) instead of a blank.
- Replaced hardcoded English in the earnings/stats cards ("(%d txn)", uptime
  "N/A"/"%lldm %llds"/"%lldh %lldm") with TR() keys.

Also carries the chat-export confirm strings used by the next commit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-10-18 23:04:58 -05:00
co-authored by Claude Opus 4.8
parent 3f127f9b62
commit dcb8e6eb25
4 changed files with 51 additions and 7 deletions
+11
View File
@@ -278,6 +278,10 @@ void I18n::loadBuiltinEnglish()
strings_["chat_export_warn"] = "Saves the decrypted messages as plain text. Store the file securely.";
strings_["chat_export_done"] = "Conversation exported";
strings_["chat_export_failed"] = "Could not write the export file.";
strings_["chat_export_confirm_title"] = "Export chat as plain text?";
strings_["chat_export_confirm_body"] = "This saves the decrypted messages as an UNENCRYPTED plain-text file. Anyone who can open the file can read the whole conversation. Store it securely and delete it when you no longer need it.";
strings_["chat_export_confirm_path"] = "Will be saved to:";
strings_["chat_export_confirm_btn"] = "Export";
strings_["chat_len_over"] = "Message too long";
strings_["chat_mute"] = "Mute";
strings_["chat_unmute"] = "Unmute";
@@ -2319,6 +2323,8 @@ void I18n::loadBuiltinEnglish()
strings_["send_mining_addr_short"] = "Mining address — can't be paid";
strings_["send_mining_addr_blocked"] = "This is a mining (transparent) address. On DragonX these can only receive mining rewards — the network rejects payments to them. Ask the recipient for a shielded address (it starts with zs).";
strings_["mining_payout_needs_shielded"] = "Pools pay out with ordinary transactions, which can't reach a mining (transparent, R…) address on DragonX. Use a shielded address (it starts with zs) as your payout address.";
strings_["mining_payout_invalid_short"] = "Not a valid DragonX address";
strings_["mining_payout_needs_shielded_short"] = "Use a shielded (zs…) address, not a mining address";
strings_["new_mining_address"] = "New mining address";
strings_["tt_new_mining_address"] = "Creates a transparent (R…) address for solo-mining rewards. It can't receive payments — share a shielded address for those.";
strings_["mining_address"] = "Mining address";
@@ -2335,6 +2341,8 @@ void I18n::loadBuiltinEnglish()
strings_["failed_create_mining_address"] = "Failed to create mining address";
strings_["new_mining_address_created"] = "New mining address created";
strings_["mining_addr_explainer"] = "Receives solo-mining rewards only — the network rejects payments to it. Rewards are shielded automatically once they mature.";
strings_["mining_addr_none"] = "None yet";
strings_["mining_addr_none_tip"] = "No mining address yet. Create one in the Receive tab (New mining address). Solo-mining rewards are paid to a transparent (R...) mining address, then shielded automatically once they mature.";
strings_["receive_use_shielded"] = "Use a shielded address";
strings_["receive_not_for_payments"] = "Not for payments";
strings_["validate_mining_type"] = "Mining address (transparent)";
@@ -2392,6 +2400,9 @@ void I18n::loadBuiltinEnglish()
strings_["mining_to_save"] = "to save";
strings_["mining_today"] = "Today";
strings_["mining_uptime"] = "Uptime";
strings_["mining_txn_count"] = "(%d txn)";
strings_["mining_uptime_ms"] = "%lldm %llds";
strings_["mining_uptime_hm"] = "%lldh %lldm";
strings_["mining_yesterday"] = "Yesterday";
// --- Miner (xmrig) updater ---