feat(wallets): open external wallets in place via datadir link (no copy)
Replace the "Import" action — which copied an out-of-datadir wallet into the datadir and cluttered the list with hard-to-tell-apart duplicates — with an in-place "Open" that links the real file into the datadir under a stable per-target name (wallet-ip-<FNV8>.dat) and switches to it. The daemon only loads a bare filename from its own datadir, so a link is the minimal bridge: hard link first (no privileges, same volume — covers non-admin Windows), symlink fallback (cross-volume), then an error. Never a copy (that would fork the wallet) and never a delete of a real file. Also: - show each external wallet's originating sub-directory (…/Backups/2021) - add a per-row "open folder location" button - widen the modal (780 → 860) for the extra button - guard the daemon against a dangling link (external file moved / USB unplugged) by falling back to wallet.dat rather than creating an empty one Per-target link names (not one shared name) make switching between two external wallets a real -wallet switch, so the rescan/cache index tracks each correctly. Drops the now-dead wallets_import* i18n keys and back-fills the new open/folder strings across all 8 languages + rebuilds the CJK subset. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -281,20 +281,18 @@ void I18n::loadBuiltinEnglish()
|
||||
strings_["wallets_badge_legacy_short"] = "Legacy";
|
||||
strings_["wallets_badge_unknown_short"] = "Unknown";
|
||||
strings_["wallets_open"] = "Open";
|
||||
strings_["wallets_open_folder"] = "Open folder location";
|
||||
strings_["wallets_open_inplace_tt"] = "Open this wallet where it is — linked into the data directory (no copy)";
|
||||
strings_["wallets_open_failed"] = "Couldn't open this wallet in place. It's likely on a different drive than your data directory — move it onto the same drive (on Windows, enabling Developer Mode also lets it link across drives).";
|
||||
strings_["wallets_never"] = "Never opened";
|
||||
strings_["wallets_import_hint"] = "Import to open";
|
||||
strings_["wallets_import_tt"] = "This wallet is outside the data directory. Opening it will copy it in first (coming soon).";
|
||||
strings_["wallets_external_tt"] = "Outside your data directory \xE2\x80\x94 Import to copy it in.";
|
||||
strings_["wallets_external_tt"] = "Outside your data directory \xE2\x80\x94 Open links it in place (no copy).";
|
||||
strings_["wallets_scan_folder"] = "Scan another folder for wallets\xE2\x80\xA6";
|
||||
strings_["wallets_folder_invalid"] = "That folder doesn't exist.";
|
||||
strings_["wallets_import"] = "Import";
|
||||
strings_["wallets_new_label"] = "Create a new wallet:";
|
||||
strings_["wallets_new_hint"] = "Name (e.g. savings)";
|
||||
strings_["wallets_create"] = "Create wallet";
|
||||
strings_["wallets_name_invalid"] = "Please enter a valid wallet name.";
|
||||
strings_["wallets_exists"] = "A wallet with that name already exists.";
|
||||
strings_["wallets_imported"] = "Wallet imported — switching…";
|
||||
strings_["wallets_import_failed"] = "Could not import that wallet file.";
|
||||
strings_["wallets_creating"] = "Creating wallet — the node will restart…";
|
||||
strings_["wallets_reveal"] = "Reveal folder";
|
||||
// In-app folder picker (Scan another folder)
|
||||
|
||||
Reference in New Issue
Block a user