Compare commits

...

129 Commits

Author SHA1 Message Date
GLaDOS
32d3f77f4f
Merge pull request #8694 from BlueWallet/renovate/rubygems-concurrent-ruby-vulnerability
Some checks failed
BuildReleaseApk / buildReleaseApk (push) Has been cancelled
Build Release and Upload to TestFlight (iOS) / build (push) Has been cancelled
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Has been cancelled
BuildReleaseApk / browserstack (push) Has been cancelled
OPS: Update dependency concurrent-ruby to '< 1.3.8' [SECURITY]
2026-06-22 17:13:35 +01:00
GLaDOS
f26ff9189c
Merge pull request #8695 from BlueWallet/fix-walletcarouselclipping
FIX: clipping wallet balance on carousel
2026-06-22 17:13:29 +01:00
ncoelho
1fa290652c FIX: clipping wallet balance on carousel 2026-06-22 15:41:14 +02:00
renovate[bot]
099f6f46a6
OPS: Update dependency concurrent-ruby to '< 1.3.8' [SECURITY] 2026-06-22 13:32:53 +00:00
Nuno
01a11bc8dd
FIX: text size on main app views (#8689)
* fix: text size on wallet view

* fix big font sizes

* fix lint

* fix Glados comments

* fix: run prettier

---------

Co-authored-by: Ivan Vershigora <ivan.vershigora@gmail.com>
2026-06-22 15:27:48 +02:00
GLaDOS
6639891c24
Merge pull request #8632 from BlueWallet/fix-custom-input-lag
Some checks failed
Build Release and Upload to TestFlight (iOS) / build (push) Has been cancelled
BuildReleaseApk / buildReleaseApk (push) Has been cancelled
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Has been cancelled
BuildReleaseApk / browserstack (push) Has been cancelled
FIX: Amount input lag in rbf custom fee input
2026-06-20 11:45:47 +01:00
GLaDOS
4029d294f8
Merge pull request #8566 from BlueWallet/cryptojs
Some checks are pending
Build Release and Upload to TestFlight (iOS) / build (push) Waiting to run
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Blocked by required conditions
BuildReleaseApk / buildReleaseApk (push) Waiting to run
BuildReleaseApk / browserstack (push) Blocked by required conditions
REF: swap crypto-js for @noble/ciphers + hashes
2026-06-19 15:00:49 +01:00
Ivan Vershigora
276a9ea8f8
REF: swap crypto-js for @noble/ciphers + hashes 2026-06-19 12:23:35 +01:00
Nuno
d415f1a0b8
feat: iOS 26 glass (#8508)
Some checks failed
Build Release and Upload to TestFlight (iOS) / build (push) Has been cancelled
BuildReleaseApk / buildReleaseApk (push) Has been cancelled
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Has been cancelled
BuildReleaseApk / browserstack (push) Has been cancelled
2026-06-18 16:37:24 +01:00
Nuno
6124cf1c04
fix: key on tx list (#8687) 2026-06-18 14:17:47 +01:00
renovate[bot]
b922346bb6
fix(deps): update dependency react-native-permissions to v5.5.3 (#8670)
Some checks are pending
Build Release and Upload to TestFlight (iOS) / build (push) Waiting to run
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Blocked by required conditions
BuildReleaseApk / buildReleaseApk (push) Waiting to run
BuildReleaseApk / browserstack (push) Blocked by required conditions
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Overtorment <overtorment@gmail.com>
2026-06-17 21:57:35 +01:00
Cursor Agent
64f1bd78db FIX: persist Arkade LNURL payment result
Co-authored-by: Overtorment <Overtorment@users.noreply.github.com>
2026-06-17 20:54:03 +01:00
Overtorment
1412a302a1 OPS: improve renovate bot 2026-06-17 17:57:39 +01:00
GLaDOS
6785427fe8
Merge pull request #8678 from BlueWallet/renovate/react-navigation-monorepo
fix(deps): update react-navigation monorepo
2026-06-17 17:47:50 +01:00
renovate[bot]
1f0ce7c813 chore(deps): update dependency @react-native/js-polyfills to ^0.86.0 2026-06-17 17:27:05 +01:00
Ramez Medhat
f5379795de ADD: support importing Unchained JSON as multisig cosigner
Some checks failed
Build Release and Upload to TestFlight (iOS) / build (push) Has been cancelled
BuildReleaseApk / buildReleaseApk (push) Has been cancelled
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Has been cancelled
BuildReleaseApk / browserstack (push) Has been cancelled
- Normalized `h` to `'` on all three derivation paths and accept either field name p2wsh_p2sh (Coldcard) or for p2sh_p2wsh (Unchained)
- Added a unit test for that.

Closes: https://github.com/BlueWallet/BlueWallet/issues/8251
2026-06-15 16:59:40 +01:00
Ivan Vershigora
c76db2f84a tst: fix flaky goBack in iOS e2e tests
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-15 16:20:46 +01:00
Andrew Camilleri (Kukks)
cb6e3ae69b OPS: bump Arkade SDKs (@arkade-os/sdk 0.4.35, @arkade-os/boltz-swap 0.3.40) 2026-06-15 16:12:52 +01:00
renovate[bot]
7bc2c0e797
fix(deps): update react-navigation monorepo 2026-06-14 17:19:34 +00:00
GLaDOS
5a7c514548
Merge pull request #8617 from BlueWallet/renovate/react-native-vector-icons-entypo-13.x
Some checks are pending
BuildReleaseApk / browserstack (push) Blocked by required conditions
Build Release and Upload to TestFlight (iOS) / build (push) Waiting to run
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Blocked by required conditions
BuildReleaseApk / buildReleaseApk (push) Waiting to run
fix(deps): update dependency @react-native-vector-icons/entypo to v13.1.2
2026-06-14 18:14:01 +01:00
Ojok Emmanuel Nsubuga
81cf0011b3
Merge branch 'master' into fix-custom-input-lag 2026-06-14 14:27:05 +03:00
Ivan Vershigora
94062ffc9f fix: improve typescript coverage
Some checks are pending
Build Release and Upload to TestFlight (iOS) / build (push) Waiting to run
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Blocked by required conditions
BuildReleaseApk / buildReleaseApk (push) Waiting to run
BuildReleaseApk / browserstack (push) Blocked by required conditions
2026-06-14 11:28:25 +01:00
GLaDOS
0449a25c6a
Merge pull request #8669 from BlueWallet/renovate/dayjs-1.x
Some checks are pending
BuildReleaseApk / browserstack (push) Blocked by required conditions
Build Release and Upload to TestFlight (iOS) / build (push) Waiting to run
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Blocked by required conditions
BuildReleaseApk / buildReleaseApk (push) Waiting to run
fix(deps): update dependency dayjs to v1.11.21
2026-06-13 19:06:04 +01:00
renovate[bot]
ff98ca0c1c
fix(deps): update dependency dayjs to v1.11.21 2026-06-13 16:00:26 +00:00
GLaDOS
c9dcbf40e7
Merge pull request #8653 from BlueWallet/renovate/react-native-vector-icons-material-icons-13.x
fix(deps): update dependency @react-native-vector-icons/material-icons to v13.1.2
2026-06-13 16:51:33 +01:00
GLaDOS
c8a7887808
Merge pull request #8649 from BlueWallet/renovate/react-native-vector-icons-fontawesome6-13.x
Some checks are pending
Build Release and Upload to TestFlight (iOS) / build (push) Waiting to run
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Blocked by required conditions
BuildReleaseApk / buildReleaseApk (push) Waiting to run
BuildReleaseApk / browserstack (push) Blocked by required conditions
fix(deps): update dependency @react-native-vector-icons/fontawesome6 to v13.1.2
2026-06-13 03:21:50 +01:00
Marcos Rodriguez Vélez
e4504b2355
FIX: Remove chevron on modal open ux (#8651)
* FIX: Remove chevron on modal open ux

* Update WalletDetails.tsx
2026-06-13 03:21:46 +01:00
renovate[bot]
13cedbe49e
fix(deps): update dependency @react-native-vector-icons/material-icons to v13.1.2 2026-06-12 17:26:13 +00:00
GLaDOS
abb80665af
Merge pull request #8652 from BlueWallet/renovate/react-native-vector-icons-material-design-icons-13.x
fix(deps): update dependency @react-native-vector-icons/material-design-icons to v13.1.2
2026-06-12 18:12:58 +01:00
renovate[bot]
681cbcf2dc
fix(deps): update dependency @react-native-vector-icons/material-design-icons to v13.1.2 2026-06-12 05:30:13 +00:00
renovate[bot]
78c9d49359
fix(deps): update dependency @react-native-vector-icons/fontawesome6 to v13.1.2 2026-06-12 05:30:02 +00:00
renovate[bot]
da606dbff0
fix(deps): update dependency @react-native-vector-icons/entypo to v13.1.2 2026-06-12 05:29:49 +00:00
GLaDOS
8fda883933
Merge pull request #8648 from BlueWallet/renovate/react-native-vector-icons-fontawesome-13.x
Some checks are pending
Build Release and Upload to TestFlight (iOS) / build (push) Waiting to run
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Blocked by required conditions
BuildReleaseApk / buildReleaseApk (push) Waiting to run
BuildReleaseApk / browserstack (push) Blocked by required conditions
fix(deps): update dependency @react-native-vector-icons/fontawesome to v13.1.2
2026-06-12 06:24:27 +01:00
GLaDOS
c4abe9562e
Merge pull request #8650 from BlueWallet/renovate/react-native-vector-icons-ionicons-13.x
fix(deps): update dependency @react-native-vector-icons/ionicons to v13.1.2
2026-06-12 06:24:22 +01:00
renovate[bot]
5d8e605fe7
fix(deps): update dependency @react-native-vector-icons/ionicons to v13.1.2 2026-06-12 00:17:10 +00:00
GLaDOS
387f8dffd6
Merge pull request #8646 from BlueWallet/renovate/arkade-os-boltz-swap-0.x
Some checks are pending
Build Release and Upload to TestFlight (iOS) / build (push) Waiting to run
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Blocked by required conditions
BuildReleaseApk / buildReleaseApk (push) Waiting to run
BuildReleaseApk / browserstack (push) Blocked by required conditions
fix(deps): update dependency @arkade-os/boltz-swap to v0.3.38
2026-06-12 01:10:04 +01:00
renovate[bot]
b34f52fdce
fix(deps): update dependency @arkade-os/boltz-swap to v0.3.38 2026-06-11 21:40:26 +00:00
GLaDOS
a3c12a27eb
Merge pull request #8647 from BlueWallet/renovate/arkade-os-sdk-0.x
fix(deps): update dependency @arkade-os/sdk to v0.4.33
2026-06-11 22:28:44 +01:00
Ivan Vershigora
a04cad686f fix: comment with the reference 2026-06-11 19:52:13 +01:00
D N
61877ed0db No babel duplicates 2026-06-11 19:52:13 +01:00
renovate[bot]
859877979e
fix(deps): update dependency @react-native-vector-icons/fontawesome to v13.1.2 2026-06-11 17:58:31 +00:00
GLaDOS
71c76bd8c8
Merge pull request #8643 from BlueWallet/renovate/actions-checkout-6.x
chore(deps): update actions/checkout action to v6.0.3
2026-06-11 18:44:41 +01:00
renovate[bot]
dd52747191
fix(deps): update dependency @arkade-os/sdk to v0.4.33 2026-06-11 16:45:01 +00:00
renovate[bot]
fa9434b0de
fix(deps): update dependency @noble/secp256k1 to v1.7.2 (#8590)
* fix(deps): update dependency @noble/secp256k1 to v1.7.2

* fix(deps): secp

* fix(deps): secp

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Overtorment <overtorment@gmail.com>
2026-06-11 17:27:52 +01:00
GLaDOS
770a7a4075
Merge pull request #8639 from BlueWallet/perf-hd-fetch-transactions
REF: single-pass tx-to-address mapping in HD fetchTransactions
2026-06-11 14:37:51 +01:00
renovate[bot]
f6f0238e0a
chore(deps): update actions/checkout action to v6.0.3 2026-06-11 11:47:08 +00:00
Ivan Vershigora
236791f32e
REF: single-pass tx-to-address mapping in HD fetchTransactions
Mapping fetched transactions into per-address cells re-scanned every
transaction for every address index, and the upsert-by-txid step
re-scanned the target cell for every insert — both quadratic. Build
address -> index lookup maps once, do a single pass over fetched
transactions, and keep a per-cell txid -> position map for
constant-time upserts.

Measured on a wallet emulating one address with 63,017 real
transactions (genesis address), median of 3 runs on real chain data:
mapping went from 32.1s to 0.47s.

Also remove a duplicate @babel/preset-env entry from devDependencies:
it is pinned in dependencies (needed by the --omit=dev iOS release
build), so the second entry was ignored by npm.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 10:54:15 +01:00
Overtorment
0181f0a849
ADD: arkade ln pushes (#8634)
Some checks are pending
Build Release and Upload to TestFlight (iOS) / build (push) Waiting to run
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Blocked by required conditions
BuildReleaseApk / buildReleaseApk (push) Waiting to run
BuildReleaseApk / browserstack (push) Blocked by required conditions
2026-06-10 17:35:17 +01:00
Cursor Agent
f334b985e8 REF: remove GroundControl server URI saving from notifications module
Some checks are pending
Build Release and Upload to TestFlight (iOS) / build (push) Waiting to run
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Blocked by required conditions
BuildReleaseApk / buildReleaseApk (push) Waiting to run
BuildReleaseApk / browserstack (push) Blocked by required conditions
Co-authored-by: Overtorment <Overtorment@users.noreply.github.com>
2026-06-10 12:44:18 +01:00
Cursor Agent
bfeda40284 REF: remove GroundControl server URL option from notification settings
Co-authored-by: Overtorment <Overtorment@users.noreply.github.com>
2026-06-10 12:44:18 +01:00
Ivan Vershigora
a4e224ec96 fix: no round corners in qrcode
Some checks failed
Build Release and Upload to TestFlight (iOS) / build (push) Has been cancelled
BuildReleaseApk / buildReleaseApk (push) Has been cancelled
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Has been cancelled
BuildReleaseApk / browserstack (push) Has been cancelled
2026-06-08 22:25:34 +01:00
Ojok Emmanuel Nsubuga
d259e68a85 FIX: Amount input lag in rbf custom fee input 2026-06-08 08:44:57 +03:00
Marcos Rodriguez
926a863d27 OPS: Bump version
Some checks failed
BuildReleaseApk / buildReleaseApk (push) Has been cancelled
Build Release and Upload to TestFlight (iOS) / build (push) Has been cancelled
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Has been cancelled
BuildReleaseApk / browserstack (push) Has been cancelled
2026-06-04 22:03:02 +01:00
GLaDOS
f0336e1789
Merge pull request #8618 from BlueWallet/fix-startup-crash
Some checks failed
Build Release and Upload to TestFlight (iOS) / build (push) Has been cancelled
BuildReleaseApk / buildReleaseApk (push) Has been cancelled
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Has been cancelled
BuildReleaseApk / browserstack (push) Has been cancelled
FIX: startup crash
2026-06-02 14:01:21 +01:00
Overtorment
2c8cfd3690 FIX: startup crash 2026-06-01 18:16:27 +01:00
pietro909
e37c4a693c
OPS: upgrade Arkade SDKs and harden Ark wallet integration (#8585)
Some checks are pending
Build Release and Upload to TestFlight (iOS) / build (push) Waiting to run
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Blocked by required conditions
BuildReleaseApk / buildReleaseApk (push) Waiting to run
BuildReleaseApk / browserstack (push) Blocked by required conditions
2026-06-01 15:22:17 +01:00
GladosBlueWallet
2a3de6f473 OPS: swap GroundControl production URL to groundcontrol.bluewallet.io 2026-06-01 11:08:57 +01:00
GLaDOS
bbd6101ddb
OPS: bump detox to 20.51.3 (#8613)
Some checks failed
Build Release and Upload to TestFlight (iOS) / build (push) Has been cancelled
BuildReleaseApk / buildReleaseApk (push) Has been cancelled
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Has been cancelled
BuildReleaseApk / browserstack (push) Has been cancelled
* OPS: bump detox to 20.51.3

* OPS: pin detox to exact version 20.51.3
2026-05-31 13:51:45 +01:00
Marcos Rodriguez Vélez
687e007c56
OPS: Bump Nav packages (#8573)
Some checks failed
Build Release and Upload to TestFlight (iOS) / build (push) Has been cancelled
BuildReleaseApk / buildReleaseApk (push) Has been cancelled
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Has been cancelled
BuildReleaseApk / browserstack (push) Has been cancelled
* OPS: Bump Nav packages

* OPS: Package update

---------

Co-authored-by: Overtorment <overtorment@gmail.com>
2026-05-28 23:03:43 +01:00
GLaDOS
0641bf70cd
Merge pull request #8588 from BlueWallet/renovate/bugsnag-js-monorepo
Some checks are pending
Build Release and Upload to TestFlight (iOS) / build (push) Waiting to run
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Blocked by required conditions
BuildReleaseApk / buildReleaseApk (push) Waiting to run
BuildReleaseApk / browserstack (push) Blocked by required conditions
fix(deps): update dependency @bugsnag/react-native to v8.9.0
2026-05-28 20:35:00 +01:00
renovate[bot]
cbe6ebb423
fix(deps): update dependency @bugsnag/react-native to v8.9.0 2026-05-28 14:09:13 +00:00
Overtorment
e19ce1136f REF: electrum 2026-05-28 13:04:49 +01:00
dependabot[bot]
1a88c085ec build(deps): bump tmp from 0.2.5 to 0.2.7
Bumps [tmp](https://github.com/raszi/node-tmp) from 0.2.5 to 0.2.7.
- [Changelog](https://github.com/raszi/node-tmp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/raszi/node-tmp/compare/v0.2.5...v0.2.7)

---
updated-dependencies:
- dependency-name: tmp
  dependency-version: 0.2.7
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-28 10:40:55 +01:00
PeterXMR
d7261d4d2a FIX: ElectrumTransaction confirmation fields are optional until mined (#8093)
Electrum's `blockchain.transaction.get` verbose response does not include
`blockhash`, `confirmations`, `time`, or `blocktime` when the transaction
is still in the mempool. Both `ElectrumTransaction` in
`blue_modules/BlueElectrum.ts` and the sibling `Transaction` type in
`class/wallets/types.ts` declared all four as required, which silently
let unguarded access compile and crash at runtime on real mempool data.

- Mark the four confirmation-only fields optional on both types. They
  describe the same shape and have the same bug.
- Export `ElectrumTransaction` so a regression test can reference it.
- Collapse the two-line `tx.timestamp = tx.blocktime; if (!tx.blocktime)
  tx.timestamp = ...` pattern in `abstract-hd-electrum-wallet.ts` into a
  single `||` fallback — type-safe and runtime-equivalent.
- Add nullish-coalesce guards at the two call sites that compared
  `confirmations` directly to a number. In `useWidgetCommunication.ios.ts`,
  `t.confirmations ?? 0` keeps the filter semantically unchanged. In
  `PaymentCodesList.tsx`, normalize once via
  `notificationTx?.confirmations ?? 0` and use the local in both the
  `> 0` (already confirmed) and `=== 0` (mempool / unconfirmed alert)
  branches — otherwise a mempool notification tx would skip both branches
  and the code would create a duplicate notification transaction.
- Add `tests/unit/electrum-transaction-types.test.ts` documenting that a
  mempool-shaped object satisfies the type.
2026-05-28 09:43:46 +01:00
GLaDOS
4aa07ed904
Merge pull request #8591 from BlueWallet/ref-managewallets-2
Some checks are pending
Build Release and Upload to TestFlight (iOS) / build (push) Waiting to run
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Blocked by required conditions
BuildReleaseApk / buildReleaseApk (push) Waiting to run
BuildReleaseApk / browserstack (push) Blocked by required conditions
tst: manage wallets
2026-05-27 22:22:18 +01:00
Marcos Rodriguez
b315d587ff FIX: Manage funds layout 2026-05-27 20:43:00 +01:00
Ivan Vershigora
d367a2f383 FIX: setDisabled aborts in-flight ensureConnected; keep disabled state through abort; add tests 2026-05-27 20:40:07 +01:00
Overtorment
e4c8a3057d REF: blue electrum 2026-05-27 20:40:07 +01:00
Overtorment
1109a836e9 REF: blue electrum 2026-05-27 20:40:07 +01:00
Overtorment
8e62aee2fc REF: blue electrum 2026-05-27 20:40:07 +01:00
Overtorment
220cd7e61d REF: blue electrum 2026-05-27 20:40:07 +01:00
Ivan Vershigora
d043b86310
tst: manage wallets 2026-05-27 19:23:55 +01:00
GLaDOS
8310c5f9fa
Merge pull request #8601 from BlueWallet/fix-amount-input
FIX: swap AmountInput zIndex so TextInput sits on top
2026-05-27 19:14:06 +01:00
Ivan Vershigora
8599607574
FIX: swap AmountInput zIndex so TextInput sits on top 2026-05-27 12:31:48 +01:00
dependabot[bot]
1a0ac1188e build(deps): bump qs from 6.15.0 to 6.15.2
Some checks failed
Build Release and Upload to TestFlight (iOS) / build (push) Has been cancelled
BuildReleaseApk / buildReleaseApk (push) Has been cancelled
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Has been cancelled
BuildReleaseApk / browserstack (push) Has been cancelled
Bumps [qs](https://github.com/ljharb/qs) from 6.15.0 to 6.15.2.
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.15.0...v6.15.2)

---
updated-dependencies:
- dependency-name: qs
  dependency-version: 6.15.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-23 15:59:27 +01:00
GLaDOS
66ca6a9fca
Merge pull request #8583 from BlueWallet/renovate/fastlane-2.x
Some checks are pending
Build Release and Upload to TestFlight (iOS) / build (push) Waiting to run
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Blocked by required conditions
BuildReleaseApk / buildReleaseApk (push) Waiting to run
BuildReleaseApk / browserstack (push) Blocked by required conditions
chore(deps): update dependency fastlane to "~> 2.234.0"
2026-05-22 13:05:33 +01:00
GLaDOS
90fdee2a8f
Merge pull request #8581 from BlueWallet/renovate/lottie-react-native-7.x
Some checks are pending
Build Release and Upload to TestFlight (iOS) / build (push) Waiting to run
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Blocked by required conditions
BuildReleaseApk / buildReleaseApk (push) Waiting to run
BuildReleaseApk / browserstack (push) Blocked by required conditions
fix(deps): update dependency lottie-react-native to v7.3.8
2026-05-22 00:58:37 +01:00
renovate[bot]
d14556ff80
fix(deps): update react-navigation monorepo (#8582)
* fix(deps): update react-navigation monorepo

* OPS: Ruby

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Marcos Rodriguez <marcospr@pm.me>
2026-05-22 00:32:17 +01:00
GLaDOS
047b675faf
Merge pull request #8543 from BlueWallet/renovate/react-native-reanimated-4.x
fix(deps): update dependency react-native-reanimated to v4.3.1
2026-05-22 00:04:06 +01:00
GLaDOS
7085dd4a81
Merge pull request #8565 from BlueWallet/deps
REF: prune unused deps + stale tsconfig entries
2026-05-21 22:56:49 +01:00
renovate[bot]
8c58df270a
chore(deps): update dependency fastlane to "~> 2.234.0" 2026-05-21 21:23:19 +00:00
Marcos Rodriguez Vélez
3952ec7e12
ADD: If lndhub server is set then button should be visible (#8572)
Co-authored-by: Overtorment <overtorment@gmail.com>
2026-05-21 22:21:41 +01:00
GLaDOS
26b6419507
Merge pull request #8578 from BlueWallet/prompt
ref: prompt
2026-05-21 21:46:52 +01:00
renovate[bot]
964ceecd6a
fix(deps): update dependency lottie-react-native to v7.3.8 2026-05-21 20:02:57 +00:00
renovate[bot]
df782c5f7a chore(deps): update dependency ruby to v3.4.9 2026-05-21 21:01:23 +01:00
Overtorment
f7c72e13d4
Merge branch 'master' into renovate/react-native-reanimated-4.x 2026-05-21 21:00:59 +01:00
renovate[bot]
9e66ed003a fix(deps): update electrum-client digest to 83420b8 2026-05-21 21:00:16 +01:00
renovate[bot]
08c4c02491 fix(deps): update dependency @babel/preset-env to v7.29.5 2026-05-21 20:59:49 +01:00
renovate[bot]
3c199ab9f2 fix(deps): update react-native-capture-protection digest to b17b9ec 2026-05-21 20:57:37 +01:00
GLaDOS
0881efbd40
Merge pull request #8580 from BlueWallet/fix-inputamount-2
fix: styles in AmountInput
2026-05-21 17:02:06 +01:00
Ivan Vershigora
a5a7d34478 FIX: patch react-native-tcp-socket onConnect crash; stabilize iOS e2e 2026-05-21 16:33:43 +01:00
Ivan Vershigora
c8344e6037
ref: prompt 2026-05-21 13:29:42 +01:00
Ivan Vershigora
54c5f34e11
fix: styles in AmountInput 2026-05-21 12:53:41 +01:00
Nuno
431a8006ea
fix: center amount input (#8574) 2026-05-21 12:18:52 +02:00
Nuno
092c437557
fix: fee jump on mount (#8575) 2026-05-21 12:17:39 +02:00
dependabot[bot]
f65ccb5427 build(deps-dev): bump @babel/plugin-transform-modules-systemjs
Bumps [@babel/plugin-transform-modules-systemjs](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-modules-systemjs) from 7.29.0 to 7.29.4.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.29.4/packages/babel-plugin-transform-modules-systemjs)

---
updated-dependencies:
- dependency-name: "@babel/plugin-transform-modules-systemjs"
  dependency-version: 7.29.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-21 11:09:37 +01:00
Nuno
aa5a6ba7f0
fix: inputs alignments (#8570) 2026-05-21 09:14:38 +02:00
Nuno
9e907566f0
feat: redesigned wallet details (#8301)
* feat: redesign transaction detail screen with unified layout and Lottie pending animation

* ADD: decode OP_RETURN payload as UTF-8 text in transaction detail

Co-authored-by: Cursor <cursoragent@cursor.com>

* REF: transaction detail redesign (themes, pending icon, loc)

Co-authored-by: Cursor <cursoragent@cursor.com>

* REF: remove deprecated TransactionDetails, TransactionStatus and getTransactionStatusOptions

Co-authored-by: Cursor <cursoragent@cursor.com>

* FIX: resolve lint errors (unused vars, styles, loc keys, no-bitwise, inline styles)

Co-authored-by: Cursor <cursoragent@cursor.com>

* FIX: remove redundant !tx check in transaction detail guard

Co-authored-by: Cursor <cursoragent@cursor.com>

* FIX: show transaction not available when tx not found after load

Co-authored-by: Cursor <cursoragent@cursor.com>

* FIX: remove unused transaction prop type from TransactionDetail

Co-authored-by: Cursor <cursoragent@cursor.com>

* TST: update UTXO note E2E to use new transaction detail note prompt UI

Co-authored-by: Cursor <cursoragent@cursor.com>

* simplify changes on the PR for review

* remove unused loc

* remove unchanged colors

* better offline support for tx details

* remove unused key loc

* fix code review issues

* fix balance

* fix tests

* REF: address PR #8289 review feedback

* redesigned wallets details

* fix lint

* fix lint

* fix bip84 test

* fix test

* fix tests

* fix tests

* fix: truncation and sendTo logic display

* fix: new arch fixes

* fix: lint

* fix: crash on status update

* fix: lint and tests

* fix: tests

* fix: tests

* fix: tests

* fix: tests

* fix: tests

* Potential fix for pull request finding 'Identical operands'

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>

* fix: tests

* fix: tests

* fix: tests

* fix: tests

* fix: tests

* fix style

* fix merge master

* Merge branch 'wallet-details' of https://github.com/BlueWallet/BlueWallet into wallet-details

* fix loc

* fix loc

* fix style

* improve coin control from wallet details

* fix: e2e

* fix: WalletDetails

* fix: flat

* fix: e2e

* fix: e2e

* Potential fix for pull request finding 'Unused variable, import, function or class'

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>

* fix: remove notifications dialogs

* fix: second button title

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Ivan Vershigora <ivan.vershigora@gmail.com>
Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
Co-authored-by: Overtorment <overtorment@gmail.com>
2026-05-21 09:12:49 +02:00
Ivan Vershigora
265cebef62 REF: prune unused deps + stale tsconfig entries 2026-05-20 18:40:25 +01:00
GLaDOS
c1c13e9e58
Merge pull request #8577 from BlueWallet/fix-wakeup-revert
Some checks failed
Build Release and Upload to TestFlight (iOS) / build (push) Has been cancelled
BuildReleaseApk / buildReleaseApk (push) Has been cancelled
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Has been cancelled
BuildReleaseApk / browserstack (push) Has been cancelled
fix: revert wake up
2026-05-20 17:37:13 +01:00
Ivan Vershigora
87b2bb2156
fix: revert wake up 2026-05-20 14:54:11 +01:00
GLaDOS
7a5589eb00
Merge pull request #8564 from BlueWallet/components
Some checks are pending
Build Release and Upload to TestFlight (iOS) / build (push) Waiting to run
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Blocked by required conditions
BuildReleaseApk / buildReleaseApk (push) Waiting to run
BuildReleaseApk / browserstack (push) Blocked by required conditions
REF: split BlueComponents, prune dead/optional props
2026-05-19 22:16:24 +01:00
GLaDOS
87cf8a5600
Merge pull request #8559 from BlueWallet/i18-lazy
Some checks are pending
Build Release and Upload to TestFlight (iOS) / build (push) Waiting to run
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Blocked by required conditions
BuildReleaseApk / buildReleaseApk (push) Waiting to run
BuildReleaseApk / browserstack (push) Blocked by required conditions
ref: lazy-load translations
2026-05-19 16:53:23 +01:00
Ojok Emmanuel Nsubuga
1da0414474
ADD: Import private keys in hex or base64 formats 2026-05-19 13:18:31 +01:00
GLaDOS
151dbbbc67
Merge pull request #8561 from BlueWallet/e2e-simplify
Some checks are pending
Build Release and Upload to TestFlight (iOS) / build (push) Waiting to run
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Blocked by required conditions
BuildReleaseApk / buildReleaseApk (push) Waiting to run
BuildReleaseApk / browserstack (push) Blocked by required conditions
tst: simplify wallet discovery and import test
2026-05-18 19:32:10 +01:00
renovate[bot]
bcc393dca8
fix(deps): update dependency react-native-reanimated to v4.3.1 2026-05-18 12:13:49 +00:00
Ivan Vershigora
1766cadcdf
REF: split BlueComponents, prune dead/optional props 2026-05-18 12:56:12 +01:00
Ivan Vershigora
4524882015
tst: simplify wallet discovery and import test 2026-05-18 10:29:13 +01:00
GLaDOS
4429f127c6
Merge pull request #8562 from BlueWallet/renovate/lottie-react-native-7.x
Some checks are pending
Build Release and Upload to TestFlight (iOS) / build (push) Waiting to run
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Blocked by required conditions
BuildReleaseApk / buildReleaseApk (push) Waiting to run
BuildReleaseApk / browserstack (push) Blocked by required conditions
fix(deps): update dependency lottie-react-native to v7.3.7
2026-05-18 00:49:27 +01:00
Ivan Vershigora
44b5640ff3
ref: lazy-load translations 2026-05-17 22:02:20 +01:00
renovate[bot]
8d8b2fb9cf
fix(deps): update dependency lottie-react-native to v7.3.7 2026-05-17 20:13:51 +00:00
GLaDOS
714984cefe
Merge pull request #8558 from BlueWallet/renovate/react-native-svg-15.x
fix(deps): update dependency react-native-svg to v15.15.5
2026-05-17 21:08:54 +01:00
GLaDOS
42b1154543
Merge pull request #8541 from BlueWallet/amouunt
Some checks failed
Build Release and Upload to TestFlight (iOS) / build (push) Has been cancelled
BuildReleaseApk / buildReleaseApk (push) Has been cancelled
Build Release and Upload to TestFlight (iOS) / testflight-upload (push) Has been cancelled
BuildReleaseApk / browserstack (push) Has been cancelled
FIX: amountinput layout
2026-05-16 00:56:27 +01:00
Marcos Rodriguez
492a617d42 Merge branch 'amouunt' of https://github.com/BlueWallet/BlueWallet into amouunt 2026-05-15 16:02:30 -05:00
Marcos Rodriguez
ebf8e245ec w 2026-05-15 16:02:24 -05:00
Overtorment
14b3695a36
Merge branch 'master' into amouunt 2026-05-15 21:49:39 +01:00
renovate[bot]
f3294d1fc6
fix(deps): update dependency react-native-svg to v15.15.5 2026-05-15 15:17:52 +00:00
GLaDOS
ae9a5605f3
Merge pull request #8535 from BlueWallet/renovate/react-native-gesture-handler-2.x
fix(deps): update dependency react-native-gesture-handler to v2.31.2
2026-05-15 16:13:30 +01:00
GLaDOS
0749457c04
Merge pull request #8542 from BlueWallet/e2e-stability
tst: e2e stability
2026-05-15 16:13:15 +01:00
GLaDOS
4fe998aad8
Merge pull request #8545 from BlueWallet/locsync31
ref: localization sweep — translations, lint script, cleanups
2026-05-15 16:13:05 +01:00
GLaDOS
5f865777c9
Merge pull request #8546 from BlueWallet/cursor-fix-tx-details-fee-rate-decimal-585e
FIX: transaction details fee rate to one decimal place
2026-05-15 16:13:00 +01:00
Ivan Vershigora
fef40b4990
fix: cleanup 2026-05-14 16:37:30 +01:00
Ivan Vershigora
8b16c53e5c
ref: localization sweep — translations, lint script, cleanups 2026-05-14 16:27:30 +01:00
Marcos Rodriguez
32f810cb46 Update StorageProvider.tsx 2026-05-13 16:51:05 -05:00
Marcos Rodriguez
fb8fd51d86 Update StorageProvider.tsx 2026-05-13 16:49:22 -05:00
Marcos Rodriguez
71dd93ede2 FIX: amountinput layout 2026-05-13 14:49:39 -05:00
Ivan Vershigora
295a32caef tst: e2e stability 2026-05-13 18:47:12 +01:00
renovate[bot]
ccb1dcaef7
fix(deps): update dependency react-native-gesture-handler to v2.31.2 2026-05-12 12:09:38 +00:00
Cursor Agent
3a48182105
FIX: show transaction fee rate with one decimal on details screen
Fee rate was computed with Math.round, collapsing values like 3.6 sats/vB
to 4. Round to one decimal place for display and copy text.

Co-authored-by: Overtorment <Overtorment@users.noreply.github.com>
2026-05-11 16:22:37 +00:00
320 changed files with 34166 additions and 5753 deletions

View File

@ -30,7 +30,7 @@ jobs:
steps:
- name: Checkout Project
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
fetch-depth: 0 # Ensures the full Git history is
@ -210,7 +210,7 @@ jobs:
- name: Set Up Ruby
uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0
with:
ruby-version: 3.4.8
ruby-version: 3.4.9
- name: System Debug Information
run: |
@ -490,12 +490,12 @@ jobs:
BRANCH_NAME: ${{ needs.build.outputs.branch_name }}
steps:
- name: Checkout Project
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Set Up Ruby
uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0
with:
ruby-version: 3.4.8
ruby-version: 3.4.9
- name: Install Dependencies with Bundler
run: |

View File

@ -49,7 +49,7 @@ jobs:
- name: Checkout project
if: github.event_name == 'workflow_dispatch' || steps.labels.outputs.has_mac_dmg == 'true'
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
fetch-depth: 0
@ -70,7 +70,7 @@ jobs:
if: github.event_name == 'workflow_dispatch' || steps.labels.outputs.has_mac_dmg == 'true'
uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0
with:
ruby-version: 3.4.8
ruby-version: 3.4.9
bundler-cache: true
- name: Install Node modules

View File

@ -15,7 +15,7 @@ jobs:
steps:
- name: Checkout project
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
fetch-depth: "0"
@ -72,7 +72,7 @@ jobs:
- name: Set up Ruby
uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0
with:
ruby-version: 3.4.8
ruby-version: 3.4.9
bundler-cache: true
- name: Generate Build Number based on timestamp
@ -135,12 +135,12 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Set up Ruby
uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0
with:
ruby-version: 3.4.8
ruby-version: 3.4.9
bundler-cache: true
- name: Install dependencies with Bundler

View File

@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout project
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
fetch-depth: 0
@ -34,7 +34,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout project
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
fetch-depth: 0
@ -53,6 +53,7 @@ jobs:
BIP47_HD_MNEMONIC: ${{ secrets.BIP47_HD_MNEMONIC}}
HD_MNEMONIC: ${{ secrets.HD_MNEMONIC }}
HD_MNEMONIC_BIP49: ${{ secrets.HD_MNEMONIC_BIP49 }}
HD_MNEMONIC_OLD: ${{ secrets.HD_MNEMONIC_OLD }}
HD_MNEMONIC_BIP49_MANY_TX: ${{ secrets.HD_MNEMONIC_BIP49_MANY_TX }}
HD_MNEMONIC_BIP84: ${{ secrets.HD_MNEMONIC_BIP84 }}
HD_MNEMONIC_BREAD: ${{ secrets.HD_MNEMONIC_BREAD }}
@ -64,7 +65,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout project
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
fetch-depth: 0
@ -83,6 +84,7 @@ jobs:
BIP47_HD_MNEMONIC: ${{ secrets.BIP47_HD_MNEMONIC}}
HD_MNEMONIC: ${{ secrets.HD_MNEMONIC }}
HD_MNEMONIC_BIP49: ${{ secrets.HD_MNEMONIC_BIP49 }}
HD_MNEMONIC_OLD: ${{ secrets.HD_MNEMONIC_OLD }}
HD_MNEMONIC_BIP49_MANY_TX: ${{ secrets.HD_MNEMONIC_BIP49_MANY_TX }}
HD_MNEMONIC_BIP84: ${{ secrets.HD_MNEMONIC_BIP84 }}
HD_MNEMONIC_BREAD: ${{ secrets.HD_MNEMONIC_BREAD }}

View File

@ -15,7 +15,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Free disk space (Ubuntu)
run: |
@ -86,7 +86,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Free disk space (Ubuntu)
run: |

View File

@ -19,7 +19,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
@ -30,7 +30,7 @@ jobs:
- name: Setup Ruby
uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0
with:
ruby-version: "3.4.8"
ruby-version: "3.4.9"
bundler-cache: true
- name: Install Node dependencies
@ -168,7 +168,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
@ -194,9 +194,6 @@ jobs:
mkdir -p ios/build/Build/Products/Release-iphonesimulator
tar -xzf BlueWallet.app.tar.gz -C ios/build/Build/Products/Release-iphonesimulator
- name: Disable simulator animations
run: defaults write com.apple.iphonesimulator SlowMotionAnimation -bool NO
# Pre-boot simulator so first detox launchApp lands warm.
- name: Pre-boot iOS simulator
run: |
@ -210,6 +207,13 @@ jobs:
xcrun simctl bootstatus "$UDID" -b
xcrun simctl launch "$UDID" com.apple.springboard >/dev/null 2>&1 || true
# Cut animations so detox sync stays steady on slow CI VMs; Reduce Motion makes reanimated skip to final value.
- name: Disable simulator animations
run: |
defaults write com.apple.iphonesimulator SlowMotionAnimation -bool NO
xcrun simctl spawn booted defaults write com.apple.Accessibility ReduceMotionEnabled -bool true
xcrun simctl spawn booted notifyutil -p com.apple.Accessibility.ReduceMotionStatusDidChange
- name: Run detox tests
timeout-minutes: 360
run: |

View File

@ -1 +1 @@
3.4.8
3.4.9

View File

@ -1,199 +0,0 @@
import { useLocale } from '@react-navigation/native';
import React, { forwardRef } from 'react';
import {
Dimensions,
Platform,
Pressable,
PressableProps,
StyleProp,
StyleSheet,
Text,
TextInput,
TextInputProps,
TextProps,
View,
ViewProps,
ViewStyle,
} from 'react-native';
import Icon from './components/Icon';
import { useTheme } from './components/themes';
const { height, width } = Dimensions.get('window');
const aspectRatio = height / width;
const isIpad = aspectRatio <= 1.6;
interface BlueButtonLinkProps extends PressableProps {
title: string;
}
export const BlueButtonLink = forwardRef<React.ElementRef<typeof Pressable>, BlueButtonLinkProps>((props, ref) => {
const { colors } = useTheme();
return (
<Pressable accessibilityRole="button" style={({ pressed }) => [styles.blueButtonLink, pressed && styles.pressed]} {...props} ref={ref}>
<Text style={[styles.blueButtonLinkText, { color: colors.foregroundColor }]}>{props.title}</Text>
</Pressable>
);
});
export const BlueCard: React.FC<ViewProps> = props => {
return <View {...props} style={styles.blueCard} />;
};
interface BlueTextProps extends TextProps {
bold?: boolean;
h1?: boolean;
h2?: boolean;
h3?: boolean;
h4?: boolean;
}
export const BlueText: React.FC<BlueTextProps> = ({ bold = false, h1, h2, h3, h4, style: passedStyle, ...props }) => {
const { colors } = useTheme();
const { direction } = useLocale();
let headingStyle = {};
if (h1) {
headingStyle = styles.h1;
} else if (h2) {
headingStyle = styles.h2;
} else if (h3) {
headingStyle = styles.h3;
} else if (h4) {
headingStyle = styles.h4;
}
const hasHeading = h1 || h2 || h3 || h4;
const style = StyleSheet.compose(
{
color: colors.foregroundColor,
writingDirection: direction,
fontWeight: hasHeading ? undefined : bold ? 'bold' : 'normal',
...headingStyle,
},
passedStyle,
);
return <Text style={style} {...props} />;
};
export const BlueTextCentered: React.FC<TextProps> = props => {
const { colors } = useTheme();
return <Text {...props} style={[styles.blueTextCentered, { color: colors.foregroundColor }]} />;
};
export const BlueFormLabel: React.FC<TextProps> = props => {
const { colors } = useTheme();
const { direction } = useLocale();
return <Text {...props} style={[styles.blueFormLabel, { color: colors.foregroundColor, writingDirection: direction }]} />;
};
export const BlueFormMultiInput: React.FC<TextInputProps> = props => {
const { colors } = useTheme();
const { style, editable, ...restProps } = props;
return (
<TextInput
multiline
underlineColorAndroid="transparent"
numberOfLines={4}
editable={editable}
style={[
styles.blueFormMultiInput,
{
borderColor: colors.formBorder,
borderBottomColor: colors.formBorder,
backgroundColor: colors.inputBackgroundColor,
color: colors.foregroundColor,
},
style,
]}
autoCorrect={false}
autoCapitalize="none"
spellCheck={false}
{...restProps}
selectTextOnFocus={false}
keyboardType={Platform.OS === 'android' ? 'visible-password' : 'default'}
/>
);
};
export class is {
static ipad() {
return isIpad;
}
}
interface BlueBigCheckmarkProps {
style?: StyleProp<ViewStyle>;
}
export function BlueBigCheckmark({ style }: BlueBigCheckmarkProps) {
const mergedStyles = [styles.checkmarkContainer, style];
return (
<View style={mergedStyles}>
<Icon name="check" size={50} type="font-awesome" color="#0f5cc0" />
</View>
);
}
const styles = StyleSheet.create({
blueButtonLink: {
minWidth: 100,
minHeight: 36,
justifyContent: 'center',
},
blueButtonLinkText: {
textAlign: 'center',
fontSize: 16,
},
blueCard: {
padding: 20,
},
h1: {
fontSize: 40,
fontWeight: 'bold',
},
h2: {
fontSize: 34,
fontWeight: 'bold',
},
h3: {
fontSize: 28,
fontWeight: 'bold',
},
h4: {
fontSize: 22,
fontWeight: 'bold',
},
blueTextCentered: {
textAlign: 'center',
},
blueFormLabel: {
fontWeight: '400',
marginHorizontal: 20,
},
blueFormMultiInput: {
paddingHorizontal: 8,
paddingVertical: 16,
flex: 1,
marginTop: 5,
marginHorizontal: 20,
borderWidth: 1,
borderBottomWidth: 0.5,
borderRadius: 4,
textAlignVertical: 'top',
},
pressed: {
opacity: 0.6,
},
checkmarkContainer: {
backgroundColor: '#ccddf9',
width: 120,
height: 120,
borderRadius: 60,
alignSelf: 'center',
justifyContent: 'center',
alignItems: 'center',
},
});

View File

@ -60,6 +60,8 @@ React Navigation 7.x with native stack. Typed params in `navigation/DetailViewSt
**Dependencies:** Do not add new dependencies without strong justification. Bonus for removing dependencies.
**Patches:** Local fixes to `node_modules` live in `patches/` and are applied by `patch-package` on `postinstall`. Each patch is documented in `patches/README.md` (what/why + upstream issue link); update it when adding or removing a patch.
**Components:** New components go in `components/`, not legacy `BlueComponents.js`.
**Linting Rules:**
@ -67,7 +69,7 @@ React Navigation 7.x with native stack. Typed params in `navigation/DetailViewSt
- No unused styles (`react-native/no-unused-styles`: error)
- Prettier: single quotes, 140 char width, trailing commas
**Localization:** Keys in `loc/en.json`. Run `find-unused-loc.js` to detect unused keys.
**Localization:** Keys in `loc/en.json`. Run `find-unused-loc.js` to detect unused keys. See `loc/vocabulary.md` for the canonical glossary of Bitcoin/Lightning terms and their per-language renderings — use it as ground truth when translating or generating translations with LLMs.
## Testing

View File

@ -1,13 +1,13 @@
source "https://rubygems.org"
# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version
ruby "3.4.8"
gem "fastlane", "~> 2.232.0"
ruby "3.4.9"
gem "fastlane", "~> 2.234.0"
# Exclude problematic versions of cocoapods and activesupport that causes build failures.
gem 'cocoapods', '>= 1.13', '!= 1.15.0', '!= 1.15.1'
gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0'
gem 'xcodeproj', '< 1.26.0'
gem 'concurrent-ruby', '< 1.3.4'
gem 'concurrent-ruby', '< 1.3.8'
# Ruby 3.4.0 removed these from the standard library
gem 'bigdecimal'

View File

@ -15,7 +15,7 @@ GEM
minitest (>= 5.1, < 6)
securerandom (>= 0.3)
tzinfo (~> 2.0, >= 2.0.5)
addressable (2.8.9)
addressable (2.9.0)
public_suffix (>= 2.0.2, < 8.0)
algoliasearch (1.27.5)
httpclient (~> 2.8, >= 2.8.3)
@ -23,8 +23,8 @@ GEM
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.4.0)
aws-partitions (1.1227.0)
aws-sdk-core (3.244.0)
aws-partitions (1.1252.0)
aws-sdk-core (3.247.0)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9)
@ -32,19 +32,19 @@ GEM
bigdecimal
jmespath (~> 1, >= 1.6.1)
logger
aws-sdk-kms (1.123.0)
aws-sdk-core (~> 3, >= 3.244.0)
aws-sdk-kms (1.127.0)
aws-sdk-core (~> 3, >= 3.247.0)
aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.217.0)
aws-sdk-core (~> 3, >= 3.244.0)
aws-sdk-s3 (1.223.0)
aws-sdk-core (~> 3, >= 3.247.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
aws-sigv4 (1.12.1)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
base64 (0.2.0)
base64 (0.3.0)
benchmark (0.5.0)
bigdecimal (4.0.1)
bigdecimal (4.1.2)
claide (1.1.0)
cocoapods (1.15.2)
addressable (~> 2.8)
@ -87,7 +87,7 @@ GEM
colored2 (3.1.2)
commander (4.6.0)
highline (~> 2.0.0)
concurrent-ruby (1.3.3)
concurrent-ruby (1.3.7)
connection_pool (3.0.2)
csv (3.3.5)
declarative (0.0.20)
@ -131,14 +131,14 @@ GEM
faraday_middleware (1.2.1)
faraday (~> 1.0)
fastimage (2.4.1)
fastlane (2.232.2)
CFPropertyList (>= 2.3, < 4.0.0)
abbrev (~> 0.1.2)
fastlane (2.234.0)
CFPropertyList (>= 2.3, < 5.0.0)
abbrev (~> 0.1)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
aws-sdk-s3 (~> 1.197)
babosa (>= 1.0.3, < 2.0.0)
base64 (~> 0.2.0)
base64 (~> 0.2)
benchmark (>= 0.1.0)
bundler (>= 1.17.3, < 5.0.0)
colored (~> 1.2)
@ -151,7 +151,7 @@ GEM
faraday-cookie_jar (~> 0.0.6)
faraday_middleware (~> 1.0)
fastimage (>= 2.1.0, < 3.0.0)
fastlane-sirp (>= 1.0.0)
fastlane-sirp (>= 1.1.0)
gh_inspector (>= 1.1.2, < 2.0.0)
google-apis-androidpublisher_v3 (~> 0.3)
google-apis-playcustomapp_v1 (~> 0.1)
@ -164,9 +164,9 @@ GEM
logger (>= 1.6, < 2.0)
mini_magick (>= 4.9.4, < 5.0.0)
multipart-post (>= 2.0.0, < 3.0.0)
mutex_m (~> 0.3.0)
mutex_m (~> 0.3)
naturally (~> 2.2)
nkf (~> 0.2.0)
nkf (~> 0.2)
optparse (>= 0.1.1, < 1.0.0)
ostruct (>= 0.1.0)
plist (>= 3.1.0, < 4.0.0)
@ -188,8 +188,7 @@ GEM
git
xml-simple
fastlane-plugin-bugsnag_sourcemaps_upload (0.2.0)
fastlane-sirp (1.0.0)
sysrandom (~> 1.0)
fastlane-sirp (1.1.0)
ffi (1.17.3)
fourflusher (2.3.1)
fuzzy_match (2.0.4)
@ -199,7 +198,7 @@ GEM
addressable (~> 2.8)
process_executer (~> 4.0)
rchardet (~> 1.9)
google-apis-androidpublisher_v3 (0.97.0)
google-apis-androidpublisher_v3 (0.100.0)
google-apis-core (>= 0.15.0, < 2.a)
google-apis-core (0.18.0)
addressable (~> 2.5, >= 2.5.1)
@ -209,19 +208,19 @@ GEM
mutex_m
representable (~> 3.0)
retriable (>= 2.0, < 4.a)
google-apis-iamcredentials_v1 (0.26.0)
google-apis-iamcredentials_v1 (0.27.0)
google-apis-core (>= 0.15.0, < 2.a)
google-apis-playcustomapp_v1 (0.17.0)
google-apis-core (>= 0.15.0, < 2.a)
google-apis-storage_v1 (0.61.0)
google-apis-storage_v1 (0.62.0)
google-apis-core (>= 0.15.0, < 2.a)
google-cloud-core (1.8.0)
google-cloud-env (>= 1.0, < 3.a)
google-cloud-errors (~> 1.0)
google-cloud-env (2.1.1)
faraday (>= 1.0, < 3.a)
google-cloud-errors (1.5.0)
google-cloud-storage (1.58.0)
google-cloud-errors (1.6.0)
google-cloud-storage (1.60.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
google-apis-core (>= 0.18, < 2)
@ -246,7 +245,7 @@ GEM
i18n (1.14.8)
concurrent-ruby (~> 1.0)
jmespath (1.6.2)
json (2.19.2)
json (2.19.5)
jwt (2.10.2)
base64
logger (1.7.0)
@ -258,7 +257,7 @@ GEM
mini_mime (1.1.5)
minitest (5.27.0)
molinillo (0.8.0)
multi_json (1.19.1)
multi_json (1.21.1)
multipart-post (2.4.1)
mutex_m (0.3.0)
nanaimo (0.3.0)
@ -273,7 +272,7 @@ GEM
process_executer (4.0.2)
track_open_instances (~> 0.1)
public_suffix (4.0.7)
rake (13.3.1)
rake (13.4.2)
rchardet (1.10.0)
representable (3.2.0)
declarative (< 0.1.0)
@ -300,7 +299,6 @@ GEM
simctl (1.6.10)
CFPropertyList
naturally
sysrandom (1.0.5)
terminal-notifier (2.0.0)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
@ -339,8 +337,8 @@ DEPENDENCIES
benchmark
bigdecimal
cocoapods (>= 1.13, != 1.15.1, != 1.15.0)
concurrent-ruby (< 1.3.4)
fastlane (~> 2.232.0)
concurrent-ruby (< 1.3.8)
fastlane (~> 2.234.0)
fastlane-plugin-browserstack
fastlane-plugin-bugsnag
fastlane-plugin-bugsnag_sourcemaps_upload
@ -353,20 +351,20 @@ CHECKSUMS
CFPropertyList (3.0.8) sha256=2c99d0d980536d3d7ab252f7bd59ac8be50fbdd1ff487c98c949bb66bb114261
abbrev (0.1.2) sha256=ad1b4eaaaed4cb722d5684d63949e4bde1d34f2a95e20db93aecfe7cbac74242
activesupport (7.2.3.1) sha256=11ebed516a43a0bb47346227a35ebae4d9427465a7c9eb197a03d5c8d283cb34
addressable (2.8.9) sha256=cc154fcbe689711808a43601dee7b980238ce54368d23e127421753e46895485
addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af
algoliasearch (1.27.5) sha256=26c1cddf3c2ec4bd60c148389e42702c98fdac862881dc6b07a4c0b89ffec853
artifactory (3.0.17) sha256=3023d5c964c31674090d655a516f38ca75665c15084140c08b7f2841131af263
atomos (0.1.3) sha256=7d43b22f2454a36bace5532d30785b06de3711399cb1c6bf932573eda536789f
aws-eventstream (1.4.0) sha256=116bf85c436200d1060811e6f5d2d40c88f65448f2125bc77ffce5121e6e183b
aws-partitions (1.1227.0) sha256=122dd20fe108cb38d38cccbc1f2592408bc1b30ca6e0d05797a7af2501567e29
aws-sdk-core (3.244.0) sha256=3e458c078b0c5bdee95bc370c3a483374b3224cf730c1f9f0faf849a5d9a18ea
aws-sdk-kms (1.123.0) sha256=d405f37e82f8fa32045ca8980be266c0b45b37aaf2012afe0254321a1e811f20
aws-sdk-s3 (1.217.0) sha256=6ea709272c666888b14e9c62345abd9a6a967759ae13667c28f01fde6823c24b
aws-partitions (1.1252.0) sha256=b44c74136ebd634d35f3fb8fd37def5214db21b9375f22c6954dbe7a7f2a449d
aws-sdk-core (3.247.0) sha256=789864594ce8cef05ee3d81fa8ed506099280bda6ea12a7612b8b7c5e5e62851
aws-sdk-kms (1.127.0) sha256=5d540b6afb9574327202989db2217741211e1cce3fb443ad0e1e37de730202e5
aws-sdk-s3 (1.223.0) sha256=655e382af34926caa76b77cf0171caed5f61ff52b8b58ae50f6f3e22c39e6cbc
aws-sigv4 (1.12.1) sha256=6973ff95cb0fd0dc58ba26e90e9510a2219525d07620c8babeb70ef831826c00
babosa (1.0.4) sha256=18dea450f595462ed7cb80595abd76b2e535db8c91b350f6c4b3d73986c5bc99
base64 (0.2.0) sha256=0f25e9b21a02a0cc0cea8ef92b2041035d39350946e8789c562b2d1a3da01507
base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
bigdecimal (4.0.1) sha256=8b07d3d065a9f921c80ceaea7c9d4ae596697295b584c296fe599dd0ad01c4a7
bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
claide (1.1.0) sha256=6d3c5c089dde904d96aa30e73306d0d4bd444b1accb9b3125ce14a3c0183f82e
cocoapods (1.15.2) sha256=f0f5153de8d028d133b96f423e04f37fb97a1da0d11dda581a9f46c0cba4090a
cocoapods-core (1.15.2) sha256=322650d97fe1ad4c0831a09669764b888bd91c6d79d0f6bb07281a17667a2136
@ -379,7 +377,7 @@ CHECKSUMS
colored (1.2) sha256=9d82b47ac589ce7f6cab64b1f194a2009e9fd00c326a5357321f44afab2c1d2c
colored2 (3.1.2) sha256=b13c2bd7eeae2cf7356a62501d398e72fde78780bd26aec6a979578293c28b4a
commander (4.6.0) sha256=7d1ddc3fccae60cc906b4131b916107e2ef0108858f485fdda30610c0f2913d9
concurrent-ruby (1.3.3) sha256=4f9cd28965c4dcf83ffd3ea7304f9323277be8525819cb18a3b61edcb56a7c6a
concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0
connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a
csv (3.3.5) sha256=6e5134ac3383ef728b7f02725d9872934f523cb40b961479f69cf3afa6c8e73f
declarative (0.0.20) sha256=8021dd6cb17ab2b61233c56903d3f5a259c5cf43c80ff332d447d395b17d9ff9
@ -405,25 +403,25 @@ CHECKSUMS
faraday-retry (1.0.4) sha256=dc659233777fabf96c69c2ffe56c0a5d2c102af90321a42cc6c90157bcd716aa
faraday_middleware (1.2.1) sha256=d45b78c8ee864c4783fbc276f845243d4a7918a67301c052647bacabec0529e9
fastimage (2.4.1) sha256=c64bebd46b6fd8943ab70c1e6e85ff728f970f2e48f92ecd249b6bc3a540ad20
fastlane (2.232.2) sha256=978689f60f0fc3d54699de86ef12be4eda9f5b52217c1798965257c390d2b112
fastlane (2.234.0) sha256=b74835681ad9a8e9c0931a5727dad1bab433895ac534c864a1ed5749625d26e9
fastlane-plugin-browserstack (0.3.4) sha256=a4f3e4a552e2390a4733570857512571535912100ffada177d5374413f2c1333
fastlane-plugin-bugsnag (3.0.0) sha256=8ddac4b79cb4b5d00432cccd5789a9e1a1119c29f7773a27d01b1d8a2363915d
fastlane-plugin-bugsnag_sourcemaps_upload (0.2.0) sha256=a05afaefa81a7bf56c36386dddeb0931db31ead6886e3eae24f9683bda1a064d
fastlane-sirp (1.0.0) sha256=66478f25bcd039ec02ccf65625373fca29646fa73d655eb533c915f106c5e641
fastlane-sirp (1.1.0) sha256=10bc94f9682efd8e1badfb31452a76dd8981f1f3a33717c765fde6d75b54d847
ffi (1.17.3) sha256=0e9f39f7bb3934f77ad6feab49662be77e87eedcdeb2a3f5c0234c2938563d4c
fourflusher (2.3.1) sha256=1b3de61c7c791b6a4e64f31e3719eb25203d151746bb519a0292bff1065ccaa9
fuzzy_match (2.0.4) sha256=b5de4f95816589c5b5c3ad13770c0af539b75131c158135b3f3bbba75d0cfca5
gh_inspector (1.1.3) sha256=04cca7171b87164e053aa43147971d3b7f500fcb58177698886b48a9fc4a1939
git (4.3.1) sha256=91ca566c39766a033e61a148c8f470908bd4786b818f8f3ff566d3a9a0200c50
google-apis-androidpublisher_v3 (0.97.0) sha256=0f3859844872ec09b64dde3bff6dee84458eb61d664337402adcbb4ac912322a
google-apis-androidpublisher_v3 (0.100.0) sha256=7a82935bee985190e8fe23bf5e53df3a27d65dd084114bb71b846b617de16489
google-apis-core (0.18.0) sha256=96b057816feeeab448139ed5b5c78eab7fc2a9d8958f0fbc8217dedffad054ee
google-apis-iamcredentials_v1 (0.26.0) sha256=3ff70a10a1d6cddf2554e95b7c5df2c26afdeaeb64100048a355194da19e48a3
google-apis-iamcredentials_v1 (0.27.0) sha256=9289f29968610754ef11d98b9ec627f0153f3e2616fef839aef096de529f6d1e
google-apis-playcustomapp_v1 (0.17.0) sha256=d5bc90b705f3f862bab4998086449b0abe704ee1685a84821daa90ca7fa95a78
google-apis-storage_v1 (0.61.0) sha256=b330e599b58e6a01533c189525398d6dbdbaf101ffb0c60145940b57e1c982e8
google-apis-storage_v1 (0.62.0) sha256=f62467c36df53287fb0252ebb4da85f9e25d7b4c5809d045c2aab1fc307760c1
google-cloud-core (1.8.0) sha256=e572edcbf189cfcab16590628a516cec3f4f63454b730e59f0b36575120281cf
google-cloud-env (2.1.1) sha256=cf4bb8c7d517ee1ea692baedf06e0b56ce68007549d8d5a66481aa9f97f46999
google-cloud-errors (1.5.0) sha256=b56be28b8c10628125214dde571b925cfcebdbc58619e598250c37a2114f7b4b
google-cloud-storage (1.58.0) sha256=1bedc07a9c75af169e1ede1dd306b9f941f9ffa9e7095d0364c0803c468fdffd
google-cloud-errors (1.6.0) sha256=1da8476dd706ad04b9d32e3c4b90d07d3463b37d6407cb56d41342ea7647d0a1
google-cloud-storage (1.60.0) sha256=b21b752d37945d678a4533be5ef4303f15d33a964d8bc709c7c41c3600f650db
googleauth (1.11.2) sha256=7e6bacaeed7aea3dd66dcea985266839816af6633e9f5983c3c2e0e40a44731e
highline (2.0.3) sha256=2ddd5c127d4692721486f91737307236fe005352d12a4202e26c48614f719479
http-accept (1.7.0) sha256=c626860682bfbb3b46462f8c39cd470fd7b0584f61b3cc9df5b2e9eb9972a126
@ -431,7 +429,7 @@ CHECKSUMS
httpclient (2.9.0) sha256=4b645958e494b2f86c2f8a2f304c959baa273a310e77a2931ddb986d83e498c8
i18n (1.14.8) sha256=285778639134865c5e0f6269e0b818256017e8cde89993fdfcbfb64d088824a5
jmespath (1.6.2) sha256=238d774a58723d6c090494c8879b5e9918c19485f7e840f2c1c7532cf84ebcb1
json (2.19.2) sha256=e7e1bd318b2c37c4ceee2444841c86539bc462e81f40d134cf97826cb14e83cf
json (2.19.5) sha256=218a18553e4801d579ca7e0f5bc72bafd776d7397238a1fb4e74db5b0a812c59
jwt (2.10.2) sha256=31e1ee46f7359883d5e622446969fe9c118c3da87a0b1dca765ce269c3a0c4f4
logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
mime-types (3.7.0) sha256=dcebf61c246f08e15a4de34e386ebe8233791e868564a470c3fe77c00eed5e56
@ -440,7 +438,7 @@ CHECKSUMS
mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef
minitest (5.27.0) sha256=2d3b17f8a36fe7801c1adcffdbc38233b938eb0b4966e97a6739055a45fa77d5
molinillo (0.8.0) sha256=efbff2716324e2a30bccd3eba1ff3a735f4d5d53ffddbc6a2f32c0ca9433045d
multi_json (1.19.1) sha256=7aefeff8f2c854bf739931a238e4aea64592845e0c0395c8a7d2eea7fdd631b7
multi_json (1.21.1) sha256=e6126a31808e3b4d19f483c775ceac34df190dffa62adfb63a165ee14ba68080
multipart-post (2.4.1) sha256=9872d03a8e552020ca096adadbf5e3cb1cd1cdd6acd3c161136b8a5737cdb4a8
mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751
nanaimo (0.3.0) sha256=aaaedc60497070b864a7e220f7c4b4cad3a0daddda2c30055ba8dae306342376
@ -454,7 +452,7 @@ CHECKSUMS
plist (3.7.2) sha256=d37a4527cc1116064393df4b40e1dbbc94c65fa9ca2eec52edf9a13616718a42
process_executer (4.0.2) sha256=c73eb646d450044241c973a8360f6326e33ec5ad933f7acf503f6f3579873a71
public_suffix (4.0.7) sha256=8be161e2421f8d45b0098c042c06486789731ea93dc3a896d30554ee38b573b8
rake (13.3.1) sha256=8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c
rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701
rchardet (1.10.0) sha256=d5ea2ed61a720a220f1914778208e718a0c7ed2a484b6d357ba695aa7001390f
representable (3.2.0) sha256=cc29bf7eebc31653586849371a43ffe36c60b54b0a6365b5f7d95ec34d1ebace
rest-client (2.1.0) sha256=35a6400bdb14fae28596618e312776c158f7ebbb0ccad752ff4fa142bf2747e3
@ -468,7 +466,6 @@ CHECKSUMS
security (0.1.5) sha256=3a977a0eca7706e804c96db0dd9619e0a94969fe3aac9680fcfc2bf9b8a833b7
signet (0.21.0) sha256=d617e9fbf24928280d39dcfefba9a0372d1c38187ffffd0a9283957a10a8cd5b
simctl (1.6.10) sha256=b99077f4d13ad81eace9f86bf5ba4df1b0b893a4d1b368bd3ed59b5b27f9236b
sysrandom (1.0.5) sha256=5ac1ac3c2ec64ef76ac91018059f541b7e8f437fbda1ccddb4f2c56a9ccf1e75
terminal-notifier (2.0.0) sha256=7a0d2b2212ab9835c07f4b2e22a94cff64149dba1eed203c04835f7991078cea
terminal-table (3.0.2) sha256=f951b6af5f3e00203fb290a669e0a85c5dd5b051b3b023392ccfd67ba5abae91
track_open_instances (0.1.15) sha256=7f0e48821e6b4c881daaa40fb1583e308937c22a9c84883c150b399c3b5c3029
@ -487,7 +484,7 @@ CHECKSUMS
xml-simple (1.1.9) sha256=d21131e519c86f1a5bc2b6d2d57d46e6998e47f18ed249b25cad86433dbd695d
RUBY VERSION
ruby 3.4.8
ruby 3.4.9
BUNDLED WITH
4.0.7

View File

@ -116,6 +116,10 @@ Please note the values in curly braces should not be translated. These are the n
Transifex automatically creates Pull Request when language reaches 100% translation. We also trigger this by hand before each release, so don't worry if you can't translate everything, every word counts.
### Vocabulary glossaries
[`loc/vocabulary.md`](loc/vocabulary.md) + the per-language files under [`loc/vocabulary/`](loc/vocabulary/) are the canonical glossary of Bitcoin/Lightning terms (Wallet, Vault, Seed, Mnemonic, Passphrase, Multisig, Payment Code, Coin Control, …) and their chosen rendering in each locale, with the reasoning behind each choice and ⚠️ anti-meaning callouts (e.g. Passcode ≠ Password, Change-output ≠ verb "to change"). Use them as ground truth when translating by hand or when feeding `loc/<lang>.json` to an LLM — terminology consistency across screens is the difference between "looks translated" and "is correct for a Bitcoin wallet". When you change a shipped string, update the matching row in the same PR.
## Q&A
Builds automated and tested with BrowserStack

View File

@ -87,7 +87,7 @@ android {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "8.0.0"
versionName "8.0.1"
testBuildType System.getProperty('testBuildType', 'debug')
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
// Keep compatibility across react-native-capture-protection flavor changes.

View File

@ -14,6 +14,8 @@ import com.facebook.react.ReactNativeHost
import com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative
import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost
import com.facebook.react.defaults.DefaultReactNativeHost
import com.facebook.drawee.backends.pipeline.Fresco
import com.facebook.react.modules.fresco.FrescoModule
import com.facebook.react.modules.i18nmanager.I18nUtil
import io.bluewallet.bluewallet.components.segmentedcontrol.SegmentedControlPackage
@ -97,6 +99,13 @@ class MainApplication : Application(), ReactApplication {
val sharedI18nUtilInstance = I18nUtil.getInstance()
sharedI18nUtilInstance.allowRTL(applicationContext, true)
// Initialize Fresco before RN mounts views. FrescoModule init can lag behind the first
// frame (e.g. UnlockWith logo) when OkHttp/SSL warms up network security config.
if (!FrescoModule.hasBeenInitialized()) {
Fresco.initialize(this)
}
loadReactNative(this)
initializeDeviceUID()

View File

@ -57,6 +57,13 @@ allprojects {
maven {
url("$rootDir/../node_modules/detox/Detox-android")
}
// react-native-background-fetch ships com.transistorsoft:tsbackgroundfetch
// as a bundled local Maven repo; the package's own build.gradle adds it
// for itself, but :app's runtime classpath resolution needs it visible
// at the root level too.
maven {
url("$rootDir/../node_modules/react-native-background-fetch/android/libs")
}
mavenCentral {
// We don't want to fetch react-native from Maven Central as there are
@ -85,6 +92,17 @@ if (buildscript != null) {
}
subprojects { project ->
// react-native-device-info's androidTest classpath pulls
// play-services-iid:16.0.1 -> play-services-base:16.0.1 -> support-v4:26.1.0,
// which collides with androidx.core:core:1.13.1 (Duplicate class
// android.support.v4.app.INotificationSideChannel). Exclude the pre-AndroidX
// support-* modules so the AndroidX equivalents in core win.
configurations.all {
exclude group: 'com.android.support', module: 'support-compat'
exclude group: 'com.android.support', module: 'support-annotations'
exclude group: 'com.android.support', module: 'support-core-utils'
}
// Remove and block any jcenter() repositories at both project and buildscript levels
def scrub = { repoContainer ->
repoContainer.all { repo ->

View File

@ -1,4 +1,7 @@
module.exports = {
presets: ['module:@react-native/babel-preset'],
// Pin the @babel/runtime version so Metro resolves a single copy instead of
// bundling duplicate helpers, which bloats the bundle.
// See https://github.com/babel/babel/issues/18050
presets: [['module:@react-native/babel-preset', { enableBabelRuntime: '^7.26.0' }]],
plugins: ['react-native-worklets/plugin'],
};

View File

@ -30,7 +30,7 @@ type Utxo = {
wif?: string;
};
type ElectrumTransaction = {
export type ElectrumTransaction = {
txid: string;
hash: string;
version: number;
@ -58,13 +58,14 @@ type ElectrumTransaction = {
addresses: string[];
};
}[];
blockhash: string;
confirmations: number;
time: number;
blocktime: number;
// Confirmation-only fields: absent on mempool (unconfirmed) responses.
blockhash?: string;
confirmations?: number;
time?: number;
blocktime?: number;
};
type ElectrumTransactionWithHex = ElectrumTransaction & {
export type ElectrumTransactionWithHex = ElectrumTransaction & {
hex: string;
};
@ -100,24 +101,84 @@ export const suggestedServers: Peer[] = hardcodedPeers.map(peer => ({
}));
let mainClient: typeof ElectrumClient | undefined;
let mainConnected: boolean = false;
let wasConnectedAtLeastOnce: boolean = false;
let serverName: string | false = false;
let disableBatching: boolean = false;
let connectionAttempt: number = 0;
let currentPeerIndex = hardcodedPeers.findIndex(peer => peer.host === defaultPeer.host && peer.ssl === defaultPeer.ssl);
if (currentPeerIndex < 0) currentPeerIndex = 0;
let latestBlock: { height: number; time: number } | { height: undefined; time: undefined } = { height: undefined, time: undefined };
const WAIT_TILL_CONNECTED_TICK_MS = 100;
/** After at least one successful Electrum session: wall ~30s before timeout (slow reconnect). */
const WAIT_TILL_CONNECTED_MAX_TICKS_AFTER_FIRST_CONNECT = 300;
/** First-ever connect: wall ~60s before timeout (cold start / slow TLS / flaky network). */
const WAIT_TILL_CONNECTED_MAX_TICKS_NEVER_CONNECTED = 600;
// --- Single source of truth for connection liveness -----------------------------
// We previously tracked `mainConnected` (boolean) separately from the client's own
// `mainClient.status`. They drifted on iOS suspend/resume: a transient `ping()`
// failure cleared the flag while the socket was still alive, then `waitTillConnected`
// blocked for ~30s on the stale flag and surfaced a false network-error alert. The
// state machine + `ensureConnected()` below is the only place that mutates the
// connection lifecycle, and UI is driven by subscribing to state changes.
/** Max wall time for one `waitTillConnected` wait (ms); derived from ticks above for callers (e.g. refresh fetch race). */
export const WAIT_TILL_CONNECTED_MAX_WALL_MS_AFTER_FIRST = WAIT_TILL_CONNECTED_MAX_TICKS_AFTER_FIRST_CONNECT * WAIT_TILL_CONNECTED_TICK_MS;
export const WAIT_TILL_CONNECTED_MAX_WALL_MS_NEVER = WAIT_TILL_CONNECTED_MAX_TICKS_NEVER_CONNECTED * WAIT_TILL_CONNECTED_TICK_MS;
export type ConnectionState = 'disabled' | 'disconnected' | 'connecting' | 'connected';
let connState: ConnectionState = 'disconnected';
type ConnectionListener = (state: ConnectionState) => void;
const connectionListeners = new Set<ConnectionListener>();
function setConnectionState(next: ConnectionState): void {
if (connState === next) return;
connState = next;
for (const l of connectionListeners) {
try {
l(next);
} catch (e) {
console.warn('[electrum] connection listener threw:', e);
}
}
}
/** Current connection state for UI. */
export function getConnectionState(): ConnectionState {
return connState;
}
/** Subscribe to state changes. Returns an unsubscribe function. */
export function subscribeConnectionState(listener: ConnectionListener): () => void {
connectionListeners.add(listener);
return () => {
connectionListeners.delete(listener);
};
}
/** Convenience: `true` iff a usable Electrum connection is currently believed to exist. */
export function isConnected(): boolean {
return connState === 'connected';
}
// --- Connection lifecycle internals ---------------------------------------------
/** One liveness check (`server_ping`) wall-time before giving up and marking the socket dead. */
const PING_TIMEOUT_MS = 5_000;
/** One full connect attempt (TLS + `server_version` handshake) wall-time before retrying. */
const CONNECT_ATTEMPT_TIMEOUT_MS = 10_000;
/** Reconnect attempts inside a single `ensureConnected()` call before declaring failure. */
const CONNECT_MAX_ATTEMPTS = 5;
/** Backoff between attempts to avoid hammering a flaky server. */
const CONNECT_BACKOFF_MS = 500;
/** Delay before the auto-reconnect triggered by a live-socket `onError`. Onions are slower. */
const RECONNECT_ONION_DELAY_MS = 4_000;
const RECONNECT_TCP_DELAY_MS = 500;
/** Max wall time one `ensureConnected()` call may take when no live socket exists. */
export const ENSURE_CONNECTED_MAX_WALL_MS =
CONNECT_MAX_ATTEMPTS * CONNECT_ATTEMPT_TIMEOUT_MS + (CONNECT_MAX_ATTEMPTS - 1) * CONNECT_BACKOFF_MS;
/** Coalesces concurrent `ensureConnected()` callers — at most one connect attempt at a time. */
let ensureInFlight: Promise<boolean> | null = null;
/** If any coalesced caller asked for the failure alert, honour it once the in-flight attempt finishes. */
let ensureInFlightShowAlert = false;
/**
* Bumps every time the caller asks us to abandon the current connection
* (`forceDisconnect()` or user disabling Electrum). In-flight `ensureConnected()`
* checks this between attempts so it can bail out promptly instead of racing back
* to `connected` after a disconnect was requested.
*/
let disconnectGeneration = 0;
const txhashHeightCache: Record<string, number> = {};
let _realm: Realm | undefined;
@ -163,10 +224,10 @@ export const getPreferredServer = async (): Promise<ElectrumServerItem | undefin
const tcpPort = await DefaultPreference.get(ELECTRUM_TCP_PORT);
const sslPort = await DefaultPreference.get(ELECTRUM_SSL_PORT);
console.log('Getting preferred server:', { host, tcpPort, sslPort });
console.log('[electrum] Getting preferred server:', { host, tcpPort, sslPort });
if (!host) {
console.warn('Preferred server host is undefined');
console.warn('[electrum] Preferred server host is undefined');
return;
}
@ -176,7 +237,7 @@ export const getPreferredServer = async (): Promise<ElectrumServerItem | undefin
ssl: sslPort ? Number(sslPort) : undefined,
};
} catch (error) {
console.error('Error in getPreferredServer:', error);
console.error('[electrum] Error in getPreferredServer:', error);
return undefined;
}
};
@ -184,12 +245,12 @@ export const getPreferredServer = async (): Promise<ElectrumServerItem | undefin
export const removePreferredServer = async () => {
try {
await DefaultPreference.setName(GROUP_IO_BLUEWALLET);
console.log('Removing preferred server');
console.log('[electrum] Removing preferred server');
await DefaultPreference.clear(ELECTRUM_HOST);
await DefaultPreference.clear(ELECTRUM_TCP_PORT);
await DefaultPreference.clear(ELECTRUM_SSL_PORT);
} catch (error) {
console.error('Error in removePreferredServer:', error);
console.error('[electrum] Error in removePreferredServer:', error);
}
};
@ -198,14 +259,14 @@ export async function isDisabled(): Promise<boolean> {
try {
await DefaultPreference.setName(GROUP_IO_BLUEWALLET);
const savedValue = await DefaultPreference.get(ELECTRUM_CONNECTION_DISABLED);
console.log('Getting Electrum connection disabled state:', savedValue);
console.log('[electrum] Getting Electrum connection disabled state:', savedValue);
if (savedValue === null) {
result = false;
} else {
result = savedValue;
}
} catch (error) {
console.error('Error getting Electrum connection disabled state:', error);
console.error('[electrum] Error getting Electrum connection disabled state:', error);
result = false;
}
return !!result;
@ -213,8 +274,23 @@ export async function isDisabled(): Promise<boolean> {
export async function setDisabled(disabled = true) {
await DefaultPreference.setName(GROUP_IO_BLUEWALLET);
console.log('Setting Electrum connection disabled state to:', disabled);
return DefaultPreference.set(ELECTRUM_CONNECTION_DISABLED, disabled ? '1' : '');
console.log('[electrum] Setting Electrum connection disabled state to:', disabled);
const result = await DefaultPreference.set(ELECTRUM_CONNECTION_DISABLED, disabled ? '1' : '');
// Disabling must abort any in-flight ensureConnected() and tear down the live
// socket so callers don't have to remember to pair this with forceDisconnect().
// Without bumping the generation, an in-flight connect could race back to
// 'connected' after the user toggled Electrum off.
if (disabled) {
disconnectGeneration += 1;
if (mainClient) {
try {
mainClient.close();
} catch {}
mainClient = undefined;
}
setConnectionState('disabled');
}
return result;
}
function getCurrentPeer() {
@ -238,7 +314,7 @@ async function getSavedPeer(): Promise<Peer | null> {
const tcpPort = await DefaultPreference.get(ELECTRUM_TCP_PORT);
const sslPort = await DefaultPreference.get(ELECTRUM_SSL_PORT);
console.log('Getting saved peer:', { host, tcpPort, sslPort });
console.log('[electrum] Getting saved peer:', { host, tcpPort, sslPort });
if (!host) {
return null;
@ -254,53 +330,98 @@ async function getSavedPeer(): Promise<Peer | null> {
return null;
} catch (error) {
console.error('Error in getSavedPeer:', error);
console.error('[electrum] Error in getSavedPeer:', error);
return null;
}
}
export async function connectMain(): Promise<void> {
if (await isDisabled()) {
console.log('Electrum connection disabled by user. Skipping connectMain call');
return;
}
/** Resolve to the peer this attempt should target (preferred saved peer, or rotate hardcoded list). */
async function pickPeer(): Promise<Peer> {
let usingPeer = getNextPeer();
const savedPeer = await getSavedPeer();
if (savedPeer && savedPeer.host && (savedPeer.tcp || savedPeer.ssl)) {
usingPeer = savedPeer;
}
return usingPeer;
}
console.log('Using peer:', JSON.stringify(usingPeer));
function scheduleReconnectFromClient(client: typeof ElectrumClient, usingPeer: Peer, reason: string): void {
if (connState !== 'connected' || mainClient !== client) return;
console.log(`[electrum] scheduling Electrum reconnect after ${reason}`);
try {
// Also neutralises electrum-client's own timers/reconnect hooks for this instance.
client.close();
} catch {}
if (mainClient === client) mainClient = undefined;
setConnectionState('disconnected');
const delay = usingPeer.host.endsWith('.onion') ? RECONNECT_ONION_DELAY_MS : RECONNECT_TCP_DELAY_MS;
const generationAtSchedule = disconnectGeneration;
setTimeout(() => {
if (generationAtSchedule !== disconnectGeneration) return;
// eslint-disable-next-line @typescript-eslint/no-use-before-define -- defined later in file
ensureConnected().catch(() => {
/* ensureConnected never throws, but be defensive */
});
}, delay);
}
/**
* One connect attempt: build a fresh `ElectrumClient`, run the version handshake,
* subscribe to headers. No retries, no UI side effects. Returns the peer used
* (for caller-side telemetry/alerts) and whether the attempt succeeded.
*/
async function attemptConnectOnce(): Promise<{ ok: boolean; peer: Peer }> {
const usingPeer = await pickPeer();
console.log('[electrum] Using peer:', JSON.stringify(usingPeer));
// Drop any prior client before allocating a new one. Closing also neutralises
// electrum-client's internal `reconnect()` loop on the old instance.
if (mainClient) {
try {
mainClient.close();
} catch {}
mainClient = undefined;
}
try {
console.log('begin connection:', JSON.stringify(usingPeer));
mainClient = new ElectrumClient(net, tls, usingPeer.ssl || usingPeer.tcp, usingPeer.host, usingPeer.ssl ? 'tls' : 'tcp');
console.log('[electrum] begin connection:', JSON.stringify(usingPeer));
const client = new ElectrumClient(net, tls, usingPeer.ssl || usingPeer.tcp, usingPeer.host, usingPeer.ssl ? 'tls' : 'tcp');
mainClient = client;
mainClient.onError = function (e: { message: string }) {
console.log('electrum mainClient.onError():', e.message);
if (mainConnected) {
// most likely got a timeout from electrum ping. lets reconnect
// but only if we were previously connected (mainConnected), otherwise theres other
// code which does connection retries
mainClient?.close();
mainClient = undefined;
mainConnected = false;
// dropping `mainConnected` flag ensures there wont be reconnection race condition if several
// errors triggered
console.log('reconnecting after socket error');
setTimeout(connectMain, usingPeer.host.endsWith('.onion') ? 4000 : 500);
}
// Live-socket errors after a successful handshake: schedule a single
// `ensureConnected()` (deduped). Errors during this attempt's own handshake
// are caught below — we must not double-handle them here.
client.onError = function (e: { message: string }) {
console.log('[electrum] electrum mainClient.onError():', e.message);
scheduleReconnectFromClient(client, usingPeer, 'socket error');
};
const ver = await mainClient.initElectrum({ client: 'bluewallet', version: '1.4' });
const ver = await Promise.race([
client.initElectrum(
{ client: 'bluewallet', version: '1.4' },
{
maxRetry: 0,
callback: () => scheduleReconnectFromClient(client, usingPeer, 'socket close'),
},
),
new Promise<never>((_resolve, reject) => setTimeout(() => reject(new Error('connect timeout')), CONNECT_ATTEMPT_TIMEOUT_MS)),
]);
if (mainClient !== client) {
// Caller raced `forceDisconnect()` while we were awaiting. Bail.
try {
client.close();
} catch {}
return { ok: false, peer: usingPeer };
}
if (ver && ver[0]) {
console.log('connected to ', ver);
console.log('[electrum] connected to ', ver);
serverName = ver[0];
mainConnected = true;
wasConnectedAtLeastOnce = true;
if (ver[0].startsWith('ElectrumPersonalServer') || ver[0].startsWith('electrs') || ver[0].startsWith('Fulcrum')) {
disableBatching = true;
// exeptions for versions:
const [electrumImplementation, electrumVersion] = ver[0].split(' ');
switch (electrumImplementation) {
case 'electrs':
@ -309,8 +430,6 @@ export async function connectMain(): Promise<void> {
}
break;
case 'electrs-esplora':
// its a different one, and it does NOT support batching
// nop
break;
case 'Fulcrum':
if (semVerToInt(electrumVersion) >= semVerToInt('1.9.0')) {
@ -319,36 +438,154 @@ export async function connectMain(): Promise<void> {
break;
}
}
const header = await mainClient.blockchainHeaders_subscribe();
const header = await client.blockchainHeaders_subscribe();
if (header && header.height) {
latestBlock = {
height: header.height,
time: Math.floor(+new Date() / 1000),
};
}
// AsyncStorage.setItem(storageKey, JSON.stringify(peers)); TODO: refactor
return { ok: true, peer: usingPeer };
}
return { ok: false, peer: usingPeer };
} catch (e) {
mainConnected = false;
console.log('bad connection:', JSON.stringify(usingPeer), e);
mainClient?.close();
mainClient = undefined;
console.log('[electrum] bad connection:', JSON.stringify(usingPeer), e);
if (mainClient) {
try {
mainClient.close();
} catch {}
mainClient = undefined;
}
return { ok: false, peer: usingPeer };
}
}
/** Single liveness check on the current `mainClient`, bounded by `PING_TIMEOUT_MS`. */
async function pingWithTimeout(timeoutMs: number = PING_TIMEOUT_MS): Promise<boolean> {
if (!mainClient) return false;
const client = mainClient;
try {
await Promise.race([
client.server_ping(),
new Promise<never>((_resolve, reject) => setTimeout(() => reject(new Error('ping timeout')), timeoutMs)),
]);
return mainClient === client; // server replied AND client wasn't swapped while we waited
} catch {
return false;
}
}
export type EnsureConnectedOptions = {
/**
* Show the legacy "couldn't connect" alert (Try again / Reset / Cancel) on failure.
* Used by initial bootstrap (`SettingsProvider` re-enabling Electrum) and the manual
* help alert. Off-hot-path callers (refresh, broadcast, etc.) should leave this false
* and surface their own UI.
*/
showAlertOnFailure?: boolean;
};
/**
* Make sure a usable Electrum connection exists, healing if needed.
*
* - If we already think we're connected, run one fast `ping` to verify. If the ping
* succeeds, we're done. If it fails the client is torn down and we fall through
* to a reconnect.
* - Otherwise run up to `CONNECT_MAX_ATTEMPTS` connect attempts (each with its own
* timeout + backoff).
*
* Concurrent callers share the same in-flight promise there is at most one connect
* attempt at a time per process. This replaces the old `mainConnected`-flag-polling
* `waitTillConnected()`, which could block ~30s on a stale flag while the socket was
* still alive.
*/
export async function ensureConnected(opts: EnsureConnectedOptions = {}): Promise<boolean> {
const { showAlertOnFailure = false } = opts;
if (await isDisabled()) {
setConnectionState('disabled');
return false;
}
if (!mainConnected) {
console.log('retry');
connectionAttempt = connectionAttempt + 1;
mainClient?.close();
mainClient = undefined;
if (connectionAttempt >= 5) {
// eslint-disable-next-line @typescript-eslint/no-use-before-define -- `presentNetworkErrorAlert` is defined below after `connectMain`
presentNetworkErrorAlert(usingPeer);
} else {
console.log('reconnection attempt #', connectionAttempt);
await new Promise(resolve => setTimeout(resolve, 500)); // sleep
return connectMain();
}
if (ensureInFlight) {
if (showAlertOnFailure) ensureInFlightShowAlert = true;
return ensureInFlight;
}
ensureInFlightShowAlert = showAlertOnFailure;
ensureInFlight = (async (): Promise<boolean> => {
const myGeneration = disconnectGeneration;
/** True iff the current generation no longer matches ours (i.e. `forceDisconnect()` ran). */
const aborted = (where: string): boolean => {
if (myGeneration === disconnectGeneration) return false;
console.log(`[electrum] ensureConnected aborted by forceDisconnect at ${where} (gen ${myGeneration}${disconnectGeneration})`);
return true;
};
let lastPeer: Peer | undefined;
try {
// Fast path: live ping on the existing client.
if (mainClient && connState === 'connected') {
if (await pingWithTimeout()) {
// If a disconnect/disable raced us, the bumper already set the right
// state ('disconnected' or 'disabled'); don't clobber it from here.
if (aborted('post-ping')) return false;
return true;
}
// Stale socket. Tear it down so the attempt loop starts fresh.
try {
mainClient.close();
} catch {}
mainClient = undefined;
setConnectionState('disconnected');
}
if (aborted('pre-loop')) return false;
setConnectionState('connecting');
for (let i = 0; i < CONNECT_MAX_ATTEMPTS; i++) {
if (await isDisabled()) {
setConnectionState('disabled');
return false;
}
// Generation-bumper (`forceDisconnect` or `setDisabled(true)`) already
// set the appropriate terminal state; we must not clobber 'disabled'
// back to 'disconnected' here.
if (aborted(`attempt ${i} start`)) return false;
const { ok, peer } = await attemptConnectOnce();
lastPeer = peer;
if (aborted(`attempt ${i} end`)) {
if (mainClient) {
try {
mainClient.close();
} catch {}
mainClient = undefined;
}
return false;
}
if (ok) {
setConnectionState('connected');
return true;
}
if (i < CONNECT_MAX_ATTEMPTS - 1) {
await new Promise(resolve => setTimeout(resolve, CONNECT_BACKOFF_MS));
}
}
setConnectionState('disconnected');
if (ensureInFlightShowAlert) {
// eslint-disable-next-line @typescript-eslint/no-use-before-define -- defined later in file
presentNetworkErrorAlert(lastPeer);
}
return false;
} finally {
ensureInFlight = null;
ensureInFlightShowAlert = false;
}
})();
return ensureInFlight;
}
export async function presentResetToDefaultsAlert(): Promise<boolean> {
@ -370,7 +607,7 @@ export async function presentResetToDefaultsAlert(): Promise<boolean> {
await DefaultPreference.clear(ELECTRUM_SSL_PORT);
await DefaultPreference.clear(ELECTRUM_TCP_PORT);
} catch (e) {
console.log(e); // Must be running on Android
console.log('[electrum]', e); // Must be running on Android
}
resolve(true);
},
@ -389,7 +626,7 @@ export async function presentResetToDefaultsAlert(): Promise<boolean> {
await DefaultPreference.clear(ELECTRUM_SSL_PORT);
await DefaultPreference.clear(ELECTRUM_TCP_PORT);
} catch (e) {
console.log(e); // Must be running on Android
console.log('[electrum]', e); // Must be running on Android
}
resolve(true);
},
@ -415,7 +652,7 @@ export async function presentResetToDefaultsAlert(): Promise<boolean> {
async function presentNetworkErrorAlert(usingPeer?: Peer, allowRepeat = false) {
if (await isDisabled()) {
console.log(
'Electrum connection disabled by user. Perhaps we are attempting to show this network error alert after the user disabled connections.',
'[electrum] Electrum connection disabled by user. Perhaps we are attempting to show this network error alert after the user disabled connections.',
);
return;
}
@ -431,10 +668,10 @@ async function presentNetworkErrorAlert(usingPeer?: Peer, allowRepeat = false) {
{
text: loc.wallets.list_tryagain,
onPress: () => {
connectionAttempt = 0;
mainClient?.close();
mainClient = undefined;
setTimeout(connectMain, 500);
forceDisconnect();
setTimeout(() => {
ensureConnected({ showAlertOnFailure: true }).catch(() => {});
}, 500);
},
style: 'default',
},
@ -443,10 +680,10 @@ async function presentNetworkErrorAlert(usingPeer?: Peer, allowRepeat = false) {
onPress: () => {
presentResetToDefaultsAlert().then(result => {
if (result) {
connectionAttempt = 0;
mainClient?.close();
mainClient = undefined;
setTimeout(connectMain, 500);
forceDisconnect();
setTimeout(() => {
ensureConnected({ showAlertOnFailure: true }).catch(() => {});
}, 500);
}
});
},
@ -455,9 +692,7 @@ async function presentNetworkErrorAlert(usingPeer?: Peer, allowRepeat = false) {
{
text: loc._.cancel,
onPress: () => {
connectionAttempt = 0;
mainClient?.close();
mainClient = undefined;
forceDisconnect();
},
style: 'cancel',
},
@ -518,18 +753,27 @@ export const getBalanceByAddress = async function (address: string): Promise<{ c
balance.addr = address;
return balance;
} catch (error) {
console.error('Error in getBalanceByAddress:', error);
console.error('[electrum] Error in getBalanceByAddress:', error);
throw error;
}
};
export const getConfig = async function () {
if (!mainClient) throw new Error('Electrum client is not connected');
if (!mainClient) {
return {
host: undefined,
port: undefined,
serverName: false as typeof serverName,
connected: connState === 'connected' ? 1 : 0,
};
}
return {
host: mainClient.host,
port: mainClient.port,
serverName,
connected: mainClient.timeLastCall !== 0 && mainClient.status,
// Drive UI "connected" indicator from the single state machine so the settings
// screen agrees with the wallets-list header pill and with `ensureConnected()`.
connected: connState === 'connected' ? 1 : 0,
};
};
@ -558,35 +802,25 @@ export const getMempoolTransactionsByAddress = async function (address: string):
return mainClient.blockchainScripthash_getMempool(uint8ArrayToHex(reversedHash));
};
export const ping = async function () {
try {
if (!mainClient) return false;
await mainClient.server_ping();
return true;
} catch (_) {}
mainConnected = false;
return false;
};
/**
* Verifies Electrum with server_ping. If the TCP socket died while the app was backgrounded,
* JS may still think we are connected ping fails, so we tear down the client and reconnect.
* Read-only liveness probe. Does NOT trigger reconnects (use `ensureConnected()`
* for that). Updates the connection state machine to reflect the probe result so
* subscribers (UI pill, settings screen) stay in sync.
*
* - `true`: server replied within `PING_TIMEOUT_MS`.
* - `false`: client missing, timed out, or server errored.
*/
export async function ensureElectrumConnection(): Promise<boolean> {
if (await isDisabled()) return true;
const believedConnected = mainConnected;
if (await ping()) return true;
console.log('ensureElectrumConnection: ping failed, forcing reconnect');
mainClient?.close();
mainClient = undefined;
mainConnected = false;
if (believedConnected) {
connectionAttempt = 0;
export const ping = async function (): Promise<boolean> {
if (await isDisabled()) return false;
const ok = await pingWithTimeout();
if (ok) {
// Heal stale `disconnected` state from a transient ping failure earlier.
if (connState !== 'connected') setConnectionState('connected');
} else if (connState === 'connected') {
setConnectionState('disconnected');
}
await connectMain();
return ping();
}
return ok;
};
// exported only to be used in unit tests
export function txhexToElectrumTransaction(txhex: string): ElectrumTransactionWithHex {
@ -798,7 +1032,7 @@ export const multiGetBalanceByAddress = async (addresses: string[], batchsize: n
}
for (const bal of balances) {
if (bal.error) console.warn('multiGetBalanceByAddress():', bal.error);
if (bal.error) console.warn('[electrum] multiGetBalanceByAddress():', bal.error);
ret.balance += +bal.result.confirmed;
ret.unconfirmed_balance += +bal.result.unconfirmed;
ret.addresses[scripthash2addr[bal.param]] = bal.result;
@ -892,7 +1126,7 @@ export const multiGetHistoryByAddress = async function (
}
for (const history of results) {
if (history.error) console.warn('multiGetHistoryByAddress():', history.error);
if (history.error) console.warn('[electrum] multiGetHistoryByAddress():', history.error);
ret[scripthash2addr[history.param]] = history.result || [];
for (const result of history.result || []) {
if (result.tx_hash) txhashHeightCache[result.tx_hash] = result.height; // cache tx height
@ -933,7 +1167,7 @@ export async function multiGetTransactionByTxid<T extends boolean>(
try {
ret[txid] = JSON.parse(jsonString.cache_value as string);
} catch (error) {
console.log(error, 'cache failed to parse', jsonString.cache_value);
console.log('[electrum]', error, 'cache failed to parse', jsonString.cache_value);
}
}
@ -983,7 +1217,7 @@ export async function multiGetTransactionByTxid<T extends boolean>(
tx = txhexToElectrumTransaction(tx);
results.push({ result: tx, param: txid });
} catch (err) {
console.log(err);
console.log('[electrum]', err);
}
}
} else {
@ -999,7 +1233,7 @@ export async function multiGetTransactionByTxid<T extends boolean>(
}
results.push({ result: tx, param: txid });
} catch (err) {
console.log(err);
console.log('[electrum]', err);
}
}
}
@ -1054,40 +1288,12 @@ export async function multiGetTransactionByTxid<T extends boolean>(
}
});
} catch (writeError) {
console.error('Failed to write transaction cache:', writeError);
console.error('[electrum] Failed to write transaction cache:', writeError);
}
return ret;
}
export const waitTillConnected = async function (): Promise<boolean> {
let waitTillConnectedInterval: NodeJS.Timeout | undefined;
let retriesCounter = 0;
if (await isDisabled()) {
console.warn('Electrum connections disabled by user. waitTillConnected skipping...');
return false;
}
return new Promise(function (resolve, reject) {
waitTillConnectedInterval = setInterval(() => {
if (mainConnected) {
clearInterval(waitTillConnectedInterval);
return resolve(true);
}
retriesCounter += 1;
const maxTicks = wasConnectedAtLeastOnce
? WAIT_TILL_CONNECTED_MAX_TICKS_AFTER_FIRST_CONNECT
: WAIT_TILL_CONNECTED_MAX_TICKS_NEVER_CONNECTED;
if (retriesCounter >= maxTicks) {
clearInterval(waitTillConnectedInterval);
presentNetworkErrorAlert();
reject(new Error('Waiting for Electrum connection timeout'));
}
}, WAIT_TILL_CONNECTED_TICK_MS);
});
};
// Returns the value at a given percentile in a sorted numeric array.
// "Linear interpolation between closest ranks" method
function percentile(arr: number[], p: number) {
@ -1239,10 +1445,11 @@ export const testConnection = async function (host: string, tcpPort?: number, ss
client.onError = () => {}; // mute
let timeoutId: NodeJS.Timeout | undefined;
const timeoutMs = host.endsWith('.onion') ? 21_000 : 5_000;
try {
const rez = await Promise.race([
new Promise(resolve => {
timeoutId = setTimeout(() => resolve('timeout'), 5000);
timeoutId = setTimeout(() => resolve('timeout'), timeoutMs);
}),
client.connect(),
]);
@ -1260,10 +1467,19 @@ export const testConnection = async function (host: string, tcpPort?: number, ss
return false;
};
/**
* Drop the current connection and tell any in-flight `ensureConnected()` to abort
* (so it doesn't race the disconnect by setting state back to `connected`).
*/
export const forceDisconnect = (): void => {
mainClient?.close();
mainClient = undefined;
mainConnected = false;
disconnectGeneration += 1;
if (mainClient) {
try {
mainClient.close();
} catch {}
mainClient = undefined;
}
setConnectionState('disconnected');
};
export const setBatchingDisabled = () => {

View File

@ -0,0 +1,71 @@
// Per-wallet Realm storage for notification-suppression entries.
//
// Lives inside the per-wallet Arkade Realm so suppression state is
// bucket-scoped, encrypted by the wallet's existing Realm key, and removed
// automatically when the wallet is deleted (deleteArkadeRealm tears down the
// whole file). Avoids leaking a stable per-wallet handle into a global
// AsyncStorage key.
export type ArkSwapNotificationAction = 'claim' | 'refund';
// Realm schema. `realm` is a peer dependency we don't import here directly;
// the schema is a plain object consumed by realmInstance.ts via the schemas
// array. Pattern matches BoltzSwapSchema in @arkade-os/boltz-swap.
export const ArkSwapNotificationSuppressionSchema = {
name: 'ArkSwapNotificationSuppression',
primaryKey: 'id',
properties: {
id: 'string',
swapId: 'string',
action: 'string',
postedAt: 'int',
},
};
const compositeId = (swapId: string, action: ArkSwapNotificationAction): string => `${swapId}:${action}`;
interface ArkSwapNotificationSuppressionRow {
id: string;
swapId: string;
action: ArkSwapNotificationAction;
postedAt: number;
}
export class RealmNotificationSuppressionRepository {
private readonly realm: any;
constructor(realm: any) {
this.realm = realm;
}
has(swapId: string, action: ArkSwapNotificationAction): boolean {
const row = this.realm.objectForPrimaryKey('ArkSwapNotificationSuppression', compositeId(swapId, action));
return Boolean(row);
}
record(swapId: string, action: ArkSwapNotificationAction): void {
this.realm.write(() => {
const row: ArkSwapNotificationSuppressionRow = {
id: compositeId(swapId, action),
swapId,
action,
postedAt: Date.now(),
};
this.realm.create('ArkSwapNotificationSuppression', row, 'modified');
});
}
clearForSwap(swapId: string): void {
this.realm.write(() => {
const matches = this.realm.objects('ArkSwapNotificationSuppression').filtered('swapId == $0', swapId);
this.realm.delete(matches);
});
}
clearForSwapAction(swapId: string, action: ArkSwapNotificationAction): void {
this.realm.write(() => {
const row = this.realm.objectForPrimaryKey('ArkSwapNotificationSuppression', compositeId(swapId, action));
if (row) this.realm.delete(row);
});
}
}

View File

@ -0,0 +1,197 @@
import RNFS from 'react-native-fs';
import Realm from 'realm';
import Keychain, { ACCESSIBLE, SECURITY_LEVEL } from 'react-native-keychain';
import { ArkRealmSchemas, ARK_REALM_SCHEMA_VERSION, runArkRealmMigrations } from '@arkade-os/sdk/repositories/realm';
import { BoltzRealmSchemas } from '@arkade-os/boltz-swap/repositories/realm';
import { randomBytes } from '../../../class/rng';
import { uint8ArrayToHex, hexToUint8Array } from '../../uint8array-extras';
import { ArkSwapNotificationSuppressionSchema } from './notificationSuppressionRepository';
const AllArkadeSchemas = [...ArkRealmSchemas, ...BoltzRealmSchemas, ArkSwapNotificationSuppressionSchema];
// App-owned schemas added on top of the SDK's. Bump when an app-owned schema
// changes; SDK bumps are handled by ARK_REALM_SCHEMA_VERSION. Realm requires
// a strictly increasing schemaVersion when objects are added; computing
// `SDK + offset` keeps the local additions ahead of any future SDK bump.
const LOCAL_ARK_SCHEMA_OFFSET = 1;
const ARKADE_REALM_SCHEMA_VERSION = ARK_REALM_SCHEMA_VERSION + LOCAL_ARK_SCHEMA_OFFSET;
const realmInstances: Map<string, Realm> = new Map();
const openInFlight: Map<string, Promise<Realm>> = new Map();
// Files live in a dedicated subdirectory so BlueApp.moveRealmFilesToCacheDirectory()
// — which sweeps top-level *.realm files from Documents into the OS-purgeable cache
// — never sees them. RNFS.readDir is non-recursive, so the subdirectory is invisible
// to that scan. Ark Realm holds non-recoverable swap/claim data and must stay in
// Documents.
const arkadeDir = (): string => `${RNFS.DocumentDirectoryPath}/arkade`;
const realmPathFor = (namespace: string): string => `${arkadeDir()}/arkade-${namespace}.realm`;
const keychainServiceFor = (namespace: string): string => `arkade_realm_${namespace}`;
async function ensureArkadeDir(): Promise<void> {
const dir = arkadeDir();
if (!(await RNFS.exists(dir))) await RNFS.mkdir(dir);
}
async function loadOrCreateEncryptionKey(namespace: string): Promise<Uint8Array> {
const service = keychainServiceFor(namespace);
const credentials = await Keychain.getGenericPassword({ service });
if (credentials) return hexToUint8Array(credentials.password);
const buf = await randomBytes(64);
const password = uint8ArrayToHex(buf);
// Accessibility: match the rest of the app's secret accessibility. RNSecureKeyStore
// in class/blue-app.ts and hooks/useBiometrics.ts both use WHEN_UNLOCKED_THIS_DEVICE_ONLY;
// the default of AFTER_FIRST_UNLOCK would expose the Realm key while the device is locked.
//
// Security level: preflight via getSecurityLevel() rather than try/catch around
// SECURE_HARDWARE. getSecurityLevel returns null on iOS (where the option is moot)
// and the highest supported level on Android. We only opt into SECURE_HARDWARE when
// the device actually backs it; otherwise let react-native-keychain pick its default.
// Catching every setGenericPassword error and silently retrying with ANY (the previous
// shape) downgrades on unrelated failures — preflight surfaces those instead.
const supportedLevel = await Keychain.getSecurityLevel();
const opts: Parameters<typeof Keychain.setGenericPassword>[2] = {
service,
accessible: ACCESSIBLE.WHEN_UNLOCKED_THIS_DEVICE_ONLY,
};
if (supportedLevel === SECURITY_LEVEL.SECURE_HARDWARE) {
opts.securityLevel = SECURITY_LEVEL.SECURE_HARDWARE;
}
await Keychain.setGenericPassword(service, password, opts);
return hexToUint8Array(password);
}
/**
* Returns a per-wallet Realm instance keyed by `namespace`. Each Ark wallet
* gets its own encrypted Realm file and its own Keychain entry so wallets
* never collide on WalletState/contracts/swaps and storage buckets stay
* isolated.
*
* Concurrent callers for the same namespace receive the same in-flight
* promise. Errors are surfaced to the caller; the in-flight entry is cleared
* so a later retry can succeed.
*/
export async function getArkadeRealm(namespace: string): Promise<Realm> {
const cached = realmInstances.get(namespace);
if (cached && !cached.isClosed) return cached;
if (cached && cached.isClosed) realmInstances.delete(namespace);
const inFlight = openInFlight.get(namespace);
if (inFlight) return inFlight;
const opening = (async () => {
await ensureArkadeDir();
const encryptionKey = await loadOrCreateEncryptionKey(namespace);
const realm = await Realm.open({
schema: AllArkadeSchemas as unknown as Realm.ObjectSchema[],
schemaVersion: ARKADE_REALM_SCHEMA_VERSION,
onMigration: (oldRealm, newRealm) => {
runArkRealmMigrations(oldRealm, newRealm);
},
path: realmPathFor(namespace),
encryptionKey,
excludeFromIcloudBackup: true,
});
realmInstances.set(namespace, realm);
return realm;
})();
openInFlight.set(namespace, opening);
try {
return await opening;
} finally {
openInFlight.delete(namespace);
}
}
/**
* Close the cached Realm for `namespace`, if any. The file and Keychain
* entry are preserved.
*/
export function closeArkadeRealm(namespace: string): void {
const realm = realmInstances.get(namespace);
if (realm && !realm.isClosed) {
realm.removeAllListeners();
realm.close();
}
realmInstances.delete(namespace);
}
/**
* Close every cached Arkade Realm instance. Used on app shutdown / sign out.
*/
export function closeAllArkadeRealms(): void {
for (const ns of Array.from(realmInstances.keys())) {
closeArkadeRealm(ns);
}
}
/**
* Delete the Realm file and the Keychain entry for `namespace`. Used when
* an Ark wallet is removed. Failures are logged but do not throw leaving
* an orphan file or Keychain entry is preferable to crashing the app's
* delete path. Ark Realm failures stay scoped to the Ark wallet path.
*
* The Keychain encryption key is reset only when the Realm file is gone
* (or never existed). Resetting the key while the encrypted file remains
* would leave the user unable to open the orphan on a future re-import:
* a fresh random key would be generated and the old file's ciphertext
* could not be decrypted.
*/
export async function deleteArkadeRealm(namespace: string): Promise<void> {
closeArkadeRealm(namespace);
const path = realmPathFor(namespace);
let realmRemoved = false;
try {
// Realm.deleteFile is sync and removes the .realm + .lock + .management
// siblings in one call. It is forgiving when the file does not exist
// (no-op), but we guard via Realm.exists to keep behavior explicit.
if (Realm.exists(path)) {
Realm.deleteFile({ path });
}
realmRemoved = true;
} catch (e: any) {
console.log(`[ArkadeRealm] Realm.deleteFile failed for ${path}:`, e?.message ?? e);
}
// Best-effort sweep of any sibling files Realm.deleteFile might have left
// behind. These are not load-bearing for re-import; failures are tolerated.
for (const suffix of ['.note']) {
const sibling = `${path}${suffix}`;
try {
if (await RNFS.exists(sibling)) await RNFS.unlink(sibling);
} catch (e: any) {
console.log(`[ArkadeRealm] failed to delete ${sibling}:`, e?.message ?? e);
}
}
if (!realmRemoved) {
console.log(
`[ArkadeRealm] keeping encryption key for ${namespace} because Realm file cleanup failed; key preserved so a future delete retry can still decrypt the orphan`,
);
return;
}
try {
await Keychain.resetGenericPassword({ service: keychainServiceFor(namespace) });
} catch (e: any) {
console.log(`[ArkadeRealm] failed to reset keychain for ${namespace}:`, e?.message ?? e);
}
}
// Exported for tests only.
export const __testing__ = {
realmInstances,
openInFlight,
realmPathFor,
keychainServiceFor,
};

View File

@ -0,0 +1,423 @@
// Background task module for Ark swap monitoring.
//
// Responsibilities:
// - Passive monitoring: poll Boltz swap status for non-terminal swaps in
// every Ark wallet's per-wallet Realm and persist remote changes through
// the SDK update helpers.
// - Post a local notification when an SDK predicate flags a swap as
// claimable/refundable. No claim, refund, recover, or signing happens in
// background — those remain foreground-only.
//
// State here is in-process: it survives configure→fetch→fetch ticks within a
// single JS runtime but is gone after process kill. Realm remains the
// durable source of truth for swap status and notification suppression.
import BackgroundFetch from 'react-native-background-fetch';
import {
BoltzSwapProvider,
isChainFinalStatus,
isReverseFinalStatus,
isSubmarineFinalStatus,
updateChainSwapStatus,
updateReverseSwapStatus,
updateSubmarineSwapStatus,
} from '@arkade-os/boltz-swap';
import type { BoltzChainSwap, BoltzReverseSwap, BoltzSubmarineSwap, BoltzSwap } from '@arkade-os/boltz-swap';
import { RealmSwapRepository } from '@arkade-os/boltz-swap/repositories/realm';
import { BlueApp as BlueAppClass } from '../class/blue-app';
import { LightningArkWallet } from '../class/wallets/lightning-ark-wallet';
import { getArkadeRealm } from './arkade-adapters/realm/realmInstance';
import {
RealmNotificationSuppressionRepository,
type ArkSwapNotificationAction,
} from './arkade-adapters/realm/notificationSuppressionRepository';
import { notifyArkSwapActionable, resolveActionableAction } from './arkade-notifications';
const BlueApp = BlueAppClass.getInstance();
// Single shared provider. The constructor only stores config; it does not
// open sockets. Re-using one instance avoids per-poll allocation.
const swapProvider = new BoltzSwapProvider({ network: 'bitcoin' });
const DEFAULT_MAX_RUN_MS = 25_000;
let maxRunMs = DEFAULT_MAX_RUN_MS;
interface ArkTaskState {
lastRegisteredAt: number | null;
lastUnregisteredAt: number | null;
lastRunStartedAt: number | null;
lastRunFinishedAt: number | null;
walletsScanned: number;
swapsPolled: number;
swapsUpdated: number;
lastError: string | null;
exitedDueToUnavailableStorage: boolean;
availability: 'unknown' | 'available' | 'denied' | 'restricted';
// Set whenever swapsUpdated is incremented. Used by reconcile() to detect
// updates that crossed run boundaries (per-run swapsUpdated is reset).
lastSwapUpdateAt: number;
lastReconciledAt: number;
}
const state: ArkTaskState = {
lastRegisteredAt: null,
lastUnregisteredAt: null,
lastRunStartedAt: null,
lastRunFinishedAt: null,
walletsScanned: 0,
swapsPolled: 0,
swapsUpdated: 0,
lastError: null,
exitedDueToUnavailableStorage: false,
availability: 'unknown',
lastSwapUpdateAt: 0,
lastReconciledAt: 0,
};
// Per-wallet last-seen status cache. Outer key: wallet namespace; inner key:
// swap ID; value: last status this background module observed. Diagnostic +
// reconciliation hint only — Realm is durable.
const swapStatusCache: Map<string, Map<string, string>> = new Map();
// Per-poll last-seen actionable action keyed by `${namespace}:${swapId}`.
// Used to detect predicate flips (true → false or claim ↔ refund) so we can
// clear the corresponding Realm suppression row even when the swap status
// has not yet reached a terminal state. In-process only; cleared by
// stopArkBackgroundTask so a later run does not falsely diagnose a flip on
// the first poll after restart.
const lastSeenActionMap: Map<string, ArkSwapNotificationAction> = new Map();
let configured = false;
let running = false;
let cancelRequested = false;
let runDeadline: number | null = null;
export function getArkTaskState(): Readonly<ArkTaskState> {
return Object.freeze({ ...state });
}
function recordError(message: string): void {
state.lastError = message;
}
function shouldStopRun(): boolean {
return cancelRequested || (runDeadline !== null && Date.now() >= runDeadline);
}
function remainingRunMs(): number {
if (runDeadline === null) return maxRunMs;
return Math.max(runDeadline - Date.now(), 0);
}
async function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {
let timer: ReturnType<typeof setTimeout> | undefined;
try {
return await Promise.race([
promise,
new Promise<never>((_resolve, reject) => {
timer = setTimeout(() => reject(new Error('deadline exceeded')), ms);
}),
]);
} finally {
if (timer) clearTimeout(timer);
}
}
function isFinalStatus(swap: BoltzSwap): boolean {
switch (swap.type) {
case 'reverse':
return isReverseFinalStatus(swap.status);
case 'submarine':
return isSubmarineFinalStatus(swap.status);
case 'chain':
return isChainFinalStatus(swap.status);
}
}
async function persistStatusChange(swap: BoltzSwap, newStatus: BoltzSwap['status'], repo: RealmSwapRepository): Promise<void> {
if (swap.type === 'reverse') {
await updateReverseSwapStatus(swap as BoltzReverseSwap, newStatus, s => repo.saveSwap(s));
} else if (swap.type === 'submarine') {
await updateSubmarineSwapStatus(swap as BoltzSubmarineSwap, newStatus, s => repo.saveSwap(s));
} else {
await updateChainSwapStatus(swap as BoltzChainSwap, newStatus, s => repo.saveSwap(s));
}
}
async function pollSwap(
swap: BoltzSwap,
namespace: string,
repo: RealmSwapRepository,
suppression: RealmNotificationSuppressionRepository,
walletID: string,
walletLabel: string,
): Promise<void> {
if (shouldStopRun()) return;
state.swapsPolled += 1;
let response;
try {
response = await withTimeout(swapProvider.getSwapStatus(swap.id), remainingRunMs());
} catch (e: any) {
recordError(`getSwapStatus(${swap.id}): ${e?.message ?? e}`);
if (e?.message === 'deadline exceeded' || remainingRunMs() <= 0) cancelRequested = true;
return;
}
if (shouldStopRun()) return;
const remoteStatus = response.status;
const statusChanged = remoteStatus !== swap.status;
// The SDK update helpers (updateReverseSwapStatus etc.) save a copy and do
// not mutate `swap`, so any post-persist predicate or terminal check on
// `swap` would read the pre-update status. effectiveSwap carries the
// status we want subsequent checks to evaluate against.
const effectiveSwap: BoltzSwap = statusChanged ? ({ ...swap, status: remoteStatus } as BoltzSwap) : swap;
if (statusChanged) {
try {
await persistStatusChange(swap, remoteStatus, repo);
} catch (e: any) {
recordError(`persistStatusChange(${swap.id}): ${e?.message ?? e}`);
return;
}
state.swapsUpdated += 1;
state.lastSwapUpdateAt = Date.now();
let perWallet = swapStatusCache.get(namespace);
if (!perWallet) {
perWallet = new Map();
swapStatusCache.set(namespace, perWallet);
}
perWallet.set(swap.id, remoteStatus);
}
// Actionable evaluation runs on every non-terminal poll, NOT only after a
// status change. Otherwise a swap that became actionable in a previous run
// but never received a successful post (notify failed mid-run, OS-level
// drop, permission-denied skip, app cold-started with already-actionable
// Realm state) would never be re-checked because subsequent polls observe
// remoteStatus === swap.status and would otherwise exit. The Realm
// suppression repo is the dedup layer.
const lastKey = `${namespace}:${effectiveSwap.id}`;
if (isFinalStatus(effectiveSwap)) {
try {
suppression.clearForSwap(effectiveSwap.id);
} catch (e: any) {
recordError(`suppression.clearForSwap(${effectiveSwap.id}): ${e?.message ?? e}`);
}
lastSeenActionMap.delete(lastKey);
return;
}
const action = resolveActionableAction(effectiveSwap);
const lastSeen = lastSeenActionMap.get(lastKey);
if (lastSeen && lastSeen !== action) {
// Predicate flipped out of `lastSeen` (either to null or to the other
// action). Clear the stale suppression so the next observed flip back
// re-fires.
try {
suppression.clearForSwapAction(effectiveSwap.id, lastSeen);
} catch (e: any) {
recordError(`suppression.clearForSwapAction(${effectiveSwap.id}): ${e?.message ?? e}`);
}
}
if (action) {
try {
await notifyArkSwapActionable(effectiveSwap, suppression, walletID, walletLabel);
} catch (e: any) {
recordError(`notifyArkSwapActionable(${effectiveSwap.id}): ${e?.message ?? e}`);
}
lastSeenActionMap.set(lastKey, action);
} else {
lastSeenActionMap.delete(lastKey);
}
}
async function processWallet(wallet: LightningArkWallet): Promise<void> {
state.walletsScanned += 1;
const namespace = wallet.getNamespace();
const walletID = wallet.getID();
const walletLabel = wallet.getLabel();
let realm;
try {
realm = await getArkadeRealm(namespace);
} catch (e: any) {
// Most likely the Keychain is locked (WHEN_UNLOCKED_THIS_DEVICE_ONLY) or
// the Realm file is unreachable. Either way the background task no-ops
// for this wallet — claim/refund is foreground-only anyway.
state.exitedDueToUnavailableStorage = true;
recordError(`getArkadeRealm(${namespace}): ${e?.message ?? e}`);
return;
}
let swaps: BoltzSwap[];
const repo = new RealmSwapRepository(realm as any);
const suppression = new RealmNotificationSuppressionRepository(realm);
try {
swaps = await repo.getAllSwaps<BoltzSwap>();
} catch (e: any) {
recordError(`getAllSwaps(${namespace}): ${e?.message ?? e}`);
return;
}
for (const swap of swaps) {
if (isFinalStatus(swap)) continue;
if (shouldStopRun()) return;
await pollSwap(swap, namespace, repo, suppression, walletID, walletLabel);
}
}
export async function runArkBackgroundTask(taskId: string): Promise<void> {
if (running) {
BackgroundFetch.finish(taskId);
return;
}
running = true;
cancelRequested = false;
runDeadline = Date.now() + maxRunMs;
state.lastRunStartedAt = Date.now();
state.walletsScanned = 0;
state.swapsPolled = 0;
state.swapsUpdated = 0;
state.exitedDueToUnavailableStorage = false;
try {
const wallets = BlueApp.getWallets().filter((w): w is LightningArkWallet => w instanceof LightningArkWallet);
if (wallets.length === 0) return;
for (const wallet of wallets) {
if (shouldStopRun()) break;
try {
await processWallet(wallet);
} catch (e: any) {
recordError(`processWallet: ${e?.message ?? e}`);
}
}
} finally {
state.lastRunFinishedAt = Date.now();
runDeadline = null;
cancelRequested = false;
running = false;
BackgroundFetch.finish(taskId);
}
}
export function onArkBackgroundTaskTimeout(taskId: string): void {
cancelRequested = true;
state.lastError = 'timeout';
state.lastRunFinishedAt = Date.now();
BackgroundFetch.finish(taskId);
}
function availabilityFromStatus(status: number): ArkTaskState['availability'] {
if (status === BackgroundFetch.STATUS_AVAILABLE) return 'available';
if (status === BackgroundFetch.STATUS_DENIED) return 'denied';
if (status === BackgroundFetch.STATUS_RESTRICTED) return 'restricted';
return 'unknown';
}
export async function registerArkBackgroundTask(): Promise<void> {
if (configured) {
await BackgroundFetch.start();
state.lastRegisteredAt = Date.now();
return;
}
const config: Parameters<typeof BackgroundFetch.configure>[0] = {
minimumFetchInterval: 15,
stopOnTerminate: false,
startOnBoot: true,
enableHeadless: true,
requiredNetworkType: BackgroundFetch.NETWORK_TYPE_ANY,
};
try {
const status = await BackgroundFetch.configure(config, runArkBackgroundTask, onArkBackgroundTaskTimeout);
state.availability = availabilityFromStatus(status);
if (state.availability === 'available') {
configured = true;
state.lastRegisteredAt = Date.now();
} else {
console.warn(`[ArkBackground] Background fetch unavailable: ${state.availability}`);
}
} catch (e: any) {
recordError(`configure: ${e?.message ?? e}`);
}
}
export async function stopArkBackgroundTask(): Promise<void> {
cancelRequested = true;
try {
await BackgroundFetch.stop();
} catch (e: any) {
recordError(`stop: ${e?.message ?? e}`);
}
// Await in-flight run completion (draining). A live background run keeps
// Detox's FabricTimersIdlingResource busy and disconnects the JS bridge.
const start = Date.now();
// eslint-disable-next-line no-unmodified-loop-condition
while (running && Date.now() - start < 30_000) {
await new Promise(resolve => setTimeout(resolve, 50));
}
swapStatusCache.clear();
// Clear in-process predicate-flip tracker so a later run does not
// diagnose a flip on the first poll after restart. Persistent suppression
// (Realm) is intentionally untouched — re-registering must keep history.
lastSeenActionMap.clear();
state.lastUnregisteredAt = Date.now();
}
export function reconcileArkBackgroundTaskResults(triggerRefreshForWallet: (walletId: string) => void): void {
if (state.lastSwapUpdateAt <= state.lastReconciledAt) return;
const wallets = BlueApp.getWallets().filter((w): w is LightningArkWallet => w instanceof LightningArkWallet);
for (const wallet of wallets) {
const namespace = wallet.getNamespace();
const perWallet = swapStatusCache.get(namespace);
if (perWallet && perWallet.size > 0) {
triggerRefreshForWallet(wallet.getID());
}
}
state.lastReconciledAt = Date.now();
}
// Exported for tests only.
export const __testing__ = {
state,
swapStatusCache,
lastSeenActionMap,
resetConfigured: (): void => {
configured = false;
},
setMaxRunMs: (ms: number): void => {
maxRunMs = ms;
},
reset: (): void => {
state.lastRegisteredAt = null;
state.lastUnregisteredAt = null;
state.lastRunStartedAt = null;
state.lastRunFinishedAt = null;
state.walletsScanned = 0;
state.swapsPolled = 0;
state.swapsUpdated = 0;
state.lastError = null;
state.exitedDueToUnavailableStorage = false;
state.availability = 'unknown';
state.lastSwapUpdateAt = 0;
state.lastReconciledAt = 0;
swapStatusCache.clear();
lastSeenActionMap.clear();
configured = false;
running = false;
cancelRequested = false;
runDeadline = null;
maxRunMs = DEFAULT_MAX_RUN_MS;
},
};

View File

@ -0,0 +1,163 @@
// Local-notification posting for actionable Ark swaps. Imported from headless
// background runtimes (no React dependency).
//
// Design notes:
// - Suppression state lives per-wallet in the Arkade Realm
// (RealmNotificationSuppressionRepository), not in a global AsyncStorage
// key — bucket-scoped and encrypted, so the suppression record never
// leaks a stable handle outside the wallet's encryption boundary.
// - Permission and app-level opt-out are checked read-only before each post
// (no prompting from headless context). Suppression is NOT recorded when
// the post is skipped, so a later state where the user grants permission
// triggers a fresh post on the next wake.
// - Notification payload deliberately does NOT include `namespace`. The OS
// notification database persists payloads and is global across BlueWallet
// encryption buckets; embedding a deterministic per-wallet identifier
// would tie a stable handle to the OS-visible record.
import AsyncStorage from '@react-native-async-storage/async-storage';
import { AppState, Platform } from 'react-native';
import { Notification, Notifications } from 'react-native-notifications';
import { checkNotifications, RESULTS } from 'react-native-permissions';
import { isChainSwapClaimable, isChainSwapRefundable, isReverseSwapClaimable, isSubmarineSwapRefundable } from '@arkade-os/boltz-swap';
import type { BoltzSwap } from '@arkade-os/boltz-swap';
import loc from '../loc';
import { NOTIFICATIONS_NO_AND_DONT_ASK_FLAG } from './notifications';
import type {
RealmNotificationSuppressionRepository,
ArkSwapNotificationAction,
} from './arkade-adapters/realm/notificationSuppressionRepository';
export const ARK_SWAP_NOTIFICATION_TYPE = 100;
const ANDROID_NOTIFICATION_CHANNEL_ID = 'channel_01';
let channelEnsured = false;
export function ensureArkNotificationChannel(): void {
if (Platform.OS !== 'android') return;
if (channelEnsured) return;
channelEnsured = true;
// Reuses the BlueWallet channel from blue_modules/notifications.ts:80-91 so
// headless runs do not register a second channel under a different name.
Notifications.setNotificationChannel({
channelId: ANDROID_NOTIFICATION_CHANNEL_ID,
name: 'BlueWallet notifications',
description: 'Notifications about incoming payments',
importance: 4,
enableVibration: true,
showBadge: true,
});
}
// Channel registration runs lazily on the first post (see notifyArkSwapActionable).
// Calling it at module-top would invoke the native bridge during JS bundle
// evaluation, which racy-blocks RN bootstrap on some devices and breaks
// Detox's RN-context wait. The existing blue_modules/notifications.ts pattern
// also defers channel setup to lazy invocation.
export function resolveActionableAction(swap: BoltzSwap): ArkSwapNotificationAction | null {
if (isReverseSwapClaimable(swap) || isChainSwapClaimable(swap)) return 'claim';
if (isSubmarineSwapRefundable(swap) || isChainSwapRefundable(swap)) return 'refund';
return null;
}
const interpolate = (template: string, walletLabel: string): string => template.replace('{walletLabel}', walletLabel);
// Static references so scripts/find-unused-loc.js can detect these keys.
const titleFor = (): string => loc.lndViewInvoice.notification_action_title;
const bodyFor = (action: ArkSwapNotificationAction): string =>
action === 'claim' ? loc.lndViewInvoice.notification_claim_body : loc.lndViewInvoice.notification_refund_body;
let appStateOverrideForTest: string | null = null;
let permissionResultOverrideForTest: string | null = null;
let optOutFlagOverrideForTest: string | null | undefined;
function currentAppState(): string {
return appStateOverrideForTest ?? AppState.currentState;
}
async function isOsNotificationPermissionGranted(): Promise<boolean> {
if (permissionResultOverrideForTest !== null) {
return permissionResultOverrideForTest === RESULTS.GRANTED;
}
try {
const { status } = await checkNotifications();
return status === RESULTS.GRANTED;
} catch {
return false;
}
}
async function isAppLevelOptedOut(): Promise<boolean> {
if (optOutFlagOverrideForTest !== undefined) {
return optOutFlagOverrideForTest === 'true';
}
try {
const flag = await AsyncStorage.getItem(NOTIFICATIONS_NO_AND_DONT_ASK_FLAG);
return flag === 'true';
} catch {
return false;
}
}
export async function notifyArkSwapActionable(
swap: BoltzSwap,
suppression: RealmNotificationSuppressionRepository,
walletID: string,
walletLabel: string,
): Promise<void> {
const action = resolveActionableAction(swap);
if (!action) return;
if (currentAppState() === 'active') return;
if (suppression.has(swap.id, action)) return;
if (!(await isOsNotificationPermissionGranted())) return;
if (await isAppLevelOptedOut()) return;
ensureArkNotificationChannel();
const title = titleFor();
const body = interpolate(bodyFor(action), walletLabel);
try {
Notifications.postLocalNotification(
// namespace is intentionally omitted; tap routing re-derives it from the loaded wallet.
new Notification({
title,
body,
type: ARK_SWAP_NOTIFICATION_TYPE,
walletID,
swapId: swap.id,
action,
}),
);
} catch (e: any) {
console.warn('[ArkNotifications] postLocalNotification failed:', e?.message ?? e);
return;
}
try {
suppression.record(swap.id, action);
} catch (e: any) {
console.warn('[ArkNotifications] suppression.record failed:', e?.message ?? e);
}
}
export const __testing__ = {
resetChannel: (): void => {
channelEnsured = false;
},
setAppStateForTest: (state: string | null): void => {
appStateOverrideForTest = state;
},
setPermissionResultForTest: (result: string | null): void => {
permissionResultOverrideForTest = result;
},
setOptOutFlagForTest: (value: string | null | undefined): void => {
optOutFlagOverrideForTest = value;
},
};

View File

@ -2,4 +2,7 @@
* Let's keep config vars, constants and definitions here
*/
export const groundControlUri: string = 'https://groundcontrol-bluewallet.herokuapp.com';
export const groundControlUri: string = 'https://groundcontrol.bluewallet.io';
/** bitcoin-payment-push-service base URL, no trailing slash. Empty = disabled. */
export const arkadePaymentPushUri: string = 'https://electrum2.bluewallet.io:444';

View File

@ -1,23 +1,98 @@
import AES from 'crypto-js/aes';
import Utf8 from 'crypto-js/enc-utf8';
import { cbc } from '@noble/ciphers/aes';
import { md5 } from '@noble/hashes/legacy';
import { randomBytes } from '@noble/hashes/utils';
import { areUint8ArraysEqual, base64ToUint8Array, concatUint8Arrays, stringToUint8Array, uint8ArrayToBase64 } from './uint8array-extras';
/**
* OpenSSL EVP_BytesToKey using MD5 with 1 iteration.
*
* Reproduces the default key+IV derivation used by CryptoJS@4.x's
* `AES.encrypt(string, password)` so the on-disk wire format stays
* bit-identical after we swap the underlying library.
*
* D1 = MD5( password || salt )
* Di = MD5( D(i-1) || password || salt ) for i 2
* key||iv = D1 || D2 || ... (take first `byteLength` bytes)
*
* MD5 is intentional: it matches the legacy OpenSSL format. The
* cryptographic weakness of MD5 is not relevant here the function is
* only used as a deterministic byte-stretcher; the password's entropy is
* what protects the wallet, not MD5.
*/
export function evpBytesToKeyMd5(password: Uint8Array, salt: Uint8Array, byteLength: number): Uint8Array {
if (!Number.isInteger(byteLength) || byteLength < 0) {
throw new Error('evpBytesToKeyMd5: byteLength must be a non-negative integer');
}
const out = new Uint8Array(byteLength);
let written = 0;
let prev: Uint8Array = new Uint8Array(0);
while (written < byteLength) {
prev = md5(concatUint8Arrays([prev, password, salt]));
const take = Math.min(prev.length, byteLength - written);
out.set(prev.subarray(0, take), written);
written += take;
}
return out;
}
// "Salted__" — OpenSSL envelope magic. Hardcoded as bytes so the wire
// format cannot drift through any encoder.
const SALT_MAGIC = new Uint8Array([0x53, 0x61, 0x6c, 0x74, 0x65, 0x64, 0x5f, 0x5f]);
const SALT_LEN = 8;
const KEY_LEN = 32;
const IV_LEN = 16;
const BLOCK_LEN = 16;
/**
* AES-256-CBC encrypt with the OpenSSL "Salted__" envelope, EVP_BytesToKey-MD5
* key derivation and PKCS7 padding. Output is base64-encoded.
*
* Wire format is bit-identical to CryptoJS@4.x's default
* `AES.encrypt(data, password).toString()` we kept the swap-the-library
* change a drop-in replacement so existing encrypted wallets on user
* devices remain readable, with no migration step.
*/
export function encrypt(data: string, password: string): string {
if (data.length < 10) throw new Error('data length cant be < 10');
const ciphertext = AES.encrypt(data, password);
return ciphertext.toString();
const salt = randomBytes(SALT_LEN);
const kdf = evpBytesToKeyMd5(stringToUint8Array(password), salt, KEY_LEN + IV_LEN);
const key = kdf.subarray(0, KEY_LEN);
const iv = kdf.subarray(KEY_LEN);
const ciphertext = cbc(key, iv).encrypt(stringToUint8Array(data));
return uint8ArrayToBase64(concatUint8Arrays([SALT_MAGIC, salt, ciphertext]));
}
/**
* Inverse of `encrypt`. Accepts the legacy CryptoJS wire format and returns
* the original UTF-8 plaintext. Any error (bad base64, missing magic, wrong
* password, bad padding) collapses to `false`.
*/
export function decrypt(data: string, password: string): string | false {
const bytes = AES.decrypt(data, password);
let str: string | false = false;
try {
str = bytes.toString(Utf8);
} catch (e) {}
// For some reason, sometimes decrypt would succeed with an incorrect password and return random characters.
// In this TypeScript version, we are not allowing the encryption of data that is shorter than
// 10 characters. If the decrypted data is less than 10 characters, we assume that the decrypt actually failed.
if (str && str.length < 10) return false;
return str;
// crypto-js's base64 decoder ignored whitespace. Some old encrypted-backup
// export/import flows (manual file paste, clipboard transit, email-based
// wallet transfer) introduced stray newlines or padding spaces. Strip them
// before strict base64 decode so legacy backups still open. `\s` does not
// include `=`, so base64 padding survives.
const envelope = base64ToUint8Array(data.replace(/\s+/g, ''));
if (envelope.length < SALT_MAGIC.length + SALT_LEN + BLOCK_LEN) return false;
if (!areUint8ArraysEqual(envelope.subarray(0, SALT_MAGIC.length), SALT_MAGIC)) return false;
const salt = envelope.subarray(SALT_MAGIC.length, SALT_MAGIC.length + SALT_LEN);
const ciphertext = envelope.subarray(SALT_MAGIC.length + SALT_LEN);
const kdf = evpBytesToKeyMd5(stringToUint8Array(password), salt, KEY_LEN + IV_LEN);
const key = kdf.subarray(0, KEY_LEN);
const iv = kdf.subarray(KEY_LEN);
const plain = cbc(key, iv).decrypt(ciphertext);
// Strict UTF-8 decode — wrong-password decrypts that happen to survive
// PKCS7 unpadding overwhelmingly fail here (crypto-js's `enc.Utf8` was
// strict too; we preserve that gate by using `fatal: true`).
const str = new TextDecoder('utf-8', { fatal: true }).decode(plain);
// Belt-and-suspenders: legitimate plaintext is always ≥ 10 chars
// (enforced by encrypt()), so anything shorter is rejected.
if (str.length < 10) return false;
return str;
} catch (e) {
return false;
}
}

View File

@ -26,44 +26,93 @@ export interface TinySecp256k1InterfaceExtended {
signDER(h: Uint8Array, d: Uint8Array, e?: Uint8Array): Uint8Array;
}
necc.utils.sha256Sync = (...messages: Uint8Array[]): Uint8Array => {
const combinedMessages = messages.reduce((acc, msg) => {
const newArray = new Uint8Array(acc.length + msg.length);
newArray.set(acc);
newArray.set(msg, acc.length);
return newArray;
}, new Uint8Array(0));
return sha256(combinedMessages);
};
// @noble/hashes types differ slightly from @noble/secp256k1 v3 hash slot typings.
necc.hashes.sha256 = sha256 as NonNullable<typeof necc.hashes.sha256>;
necc.hashes.hmacSha256 = ((key: Uint8Array, message: Uint8Array) => hmac(sha256, key, message)) as NonNullable<
typeof necc.hashes.hmacSha256
>;
necc.utils.hmacSha256Sync = (key: Uint8Array, ...messages: Uint8Array[]): Uint8Array => {
const combinedMessages = messages.reduce((acc, msg) => {
const newArray = new Uint8Array(acc.length + msg.length);
newArray.set(acc);
newArray.set(msg, acc.length);
return newArray;
}, new Uint8Array(0));
return hmac(sha256, key, combinedMessages);
};
/* const normal = necc.utils._normalizePrivateKey;
// Removed from @noble/secp256k1 v1.7; vendored from noble test vectors.
// @see https://github.com/paulmillr/noble-secp256k1/blob/1.7.2/test/index.ts
type Hex = string | Uint8Array;
type PrivKey = Hex | bigint | number;
necc.utils.privateAdd = (privateKey: PrivKey, tweak: Hex) => {
console.log({ privateKey, tweak });
const p = normal(privateKey);
const t = normal(tweak);
return necc.utils.privateAdd(necc.utils.mod(p + t, necc.CURVE.n));
}; */
const { mod, secretKeyToScalar, numberToBytesBE, bytesToNumberBE, hexToBytes } = necc.etc;
const CURVE_N = necc.Point.CURVE().n;
function pointFromBytes(p: Uint8Array): necc.Point {
if (p.length === 32) {
const prefixed = new Uint8Array(33);
prefixed[0] = 0x02;
prefixed.set(p, 1);
return necc.Point.fromBytes(prefixed);
}
return necc.Point.fromBytes(p);
}
const tweakUtils = {
privateAdd: (privateKey: Hex, tweak: Hex): Uint8Array => {
const p = secretKeyToScalar(typeof privateKey === 'string' ? hexToBytes(privateKey) : privateKey);
const t = secretKeyToScalar(typeof tweak === 'string' ? hexToBytes(tweak) : tweak);
return numberToBytesBE(mod(p + t, CURVE_N));
},
privateNegate: (privateKey: Hex): Uint8Array => {
const p = secretKeyToScalar(typeof privateKey === 'string' ? hexToBytes(privateKey) : privateKey);
return numberToBytesBE(CURVE_N - p);
},
pointAddScalar: (p: Hex, tweak: Hex, isCompressed?: boolean): Uint8Array => {
const P = typeof p === 'string' ? necc.Point.fromHex(p) : pointFromBytes(p);
const t = secretKeyToScalar(typeof tweak === 'string' ? hexToBytes(tweak) : tweak);
const Q = P.add(necc.Point.BASE.multiply(t));
if (Q.is0()) throw new Error('Tweaked point at infinity');
return Q.toBytes(isCompressed);
},
pointMultiply: (p: Hex, tweak: Hex, isCompressed?: boolean): Uint8Array => {
const P = typeof p === 'string' ? necc.Point.fromHex(p) : pointFromBytes(p);
const tweakBytes = typeof tweak === 'string' ? hexToBytes(tweak) : tweak;
const t = mod(bytesToNumberBE(tweakBytes), CURVE_N);
if (t === 0n) throw new Error('Point at infinity');
return P.multiply(t).toBytes(isCompressed);
},
};
const defaultTrue = (param?: boolean): boolean => param !== false;
function compactToDER(sig: Uint8Array): Uint8Array {
const encodeInt = (bytes: Uint8Array): Uint8Array => {
let i = 0;
while (i < bytes.length - 1 && bytes[i] === 0) i++;
let trimmed = bytes.subarray(i);
if (trimmed[0] >= 0x80) {
const prefixed = new Uint8Array(trimmed.length + 1);
prefixed[0] = 0;
prefixed.set(trimmed, 1);
trimmed = prefixed;
}
const encoded = new Uint8Array(2 + trimmed.length);
encoded[0] = 0x02;
encoded[1] = trimmed.length;
encoded.set(trimmed, 2);
return encoded;
};
const rDer = encodeInt(sig.subarray(0, 32));
const sDer = encodeInt(sig.subarray(32, 64));
const seqLen = rDer.length + sDer.length;
const der = new Uint8Array(2 + seqLen);
der[0] = 0x30;
der[1] = seqLen;
der.set(rDer, 2);
der.set(sDer, 2 + rDer.length);
return der;
}
function throwToNull<Type>(fn: () => Type): Type | null {
try {
return fn();
} catch (e) {
// console.log(e);
return null;
}
}
@ -71,7 +120,8 @@ function throwToNull<Type>(fn: () => Type): Type | null {
function isPoint(p: Uint8Array, xOnly: boolean): boolean {
if ((p.length === 32) !== xOnly) return false;
try {
return !!necc.Point.fromHex(p);
pointFromBytes(p);
return true;
} catch (e) {
return false;
}
@ -79,23 +129,12 @@ function isPoint(p: Uint8Array, xOnly: boolean): boolean {
const ecc: TinySecp256k1InterfaceExtended & TinySecp256k1Interface & TinySecp256k1InterfaceBIP32 = {
isPoint: (p: Uint8Array): boolean => isPoint(p, false),
isPrivate: (d: Uint8Array): boolean => {
/* if (
[
'0000000000000000000000000000000000000000000000000000000000000000',
'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141',
'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142',
].includes(d.toString('hex'))
) {
return false;
} */
return necc.utils.isValidPrivateKey(d);
},
isPrivate: (d: Uint8Array): boolean => necc.utils.isValidSecretKey(d),
isXOnlyPoint: (p: Uint8Array): boolean => isPoint(p, true),
xOnlyPointAddTweak: (p: Uint8Array, tweak: Uint8Array): { parity: 0 | 1; xOnlyPubkey: Uint8Array } | null =>
throwToNull(() => {
const P = necc.utils.pointAddScalar(p, tweak, true);
const P = tweakUtils.pointAddScalar(p, tweak, true);
const parity = P[0] % 2 === 1 ? 1 : 0;
return { parity, xOnlyPubkey: P.slice(1) };
}),
@ -104,60 +143,56 @@ const ecc: TinySecp256k1InterfaceExtended & TinySecp256k1Interface & TinySecp256
throwToNull(() => necc.getPublicKey(sk, defaultTrue(compressed))),
pointCompress: (p: Uint8Array, compressed?: boolean): Uint8Array => {
return necc.Point.fromHex(p).toRawBytes(defaultTrue(compressed));
return pointFromBytes(p).toBytes(defaultTrue(compressed));
},
pointMultiply: (a: Uint8Array, tweak: Uint8Array, compressed?: boolean): Uint8Array | null =>
throwToNull(() => necc.utils.pointMultiply(a, tweak, defaultTrue(compressed))),
throwToNull(() => tweakUtils.pointMultiply(a, tweak, defaultTrue(compressed))),
pointAdd: (a: Uint8Array, b: Uint8Array, compressed?: boolean): Uint8Array | null =>
throwToNull(() => {
const A = necc.Point.fromHex(a);
const B = necc.Point.fromHex(b);
return A.add(B).toRawBytes(defaultTrue(compressed));
const A = pointFromBytes(a);
const B = pointFromBytes(b);
return A.add(B).toBytes(defaultTrue(compressed));
}),
pointAddScalar: (p: Uint8Array, tweak: Uint8Array, compressed?: boolean): Uint8Array | null =>
throwToNull(() => necc.utils.pointAddScalar(p, tweak, defaultTrue(compressed))),
throwToNull(() => tweakUtils.pointAddScalar(p, tweak, defaultTrue(compressed))),
privateAdd: (d: Uint8Array, tweak: Uint8Array): Uint8Array | null =>
throwToNull(() => {
// console.log({ d, tweak });
if (d.join('') === '00000000000000000000000000000001' && tweak.join('') === '00000000000000000000000000000000') {
return new Uint8Array(d); // make test_ecc happy
}
const ret = necc.utils.privateAdd(d, tweak);
// console.log(ret);
const ret = tweakUtils.privateAdd(d, tweak);
if (ret.join('') === '00000000000000000000000000000000') {
return null;
}
return ret;
}),
privateNegate: (d: Uint8Array): Uint8Array => necc.utils.privateNegate(d),
privateNegate: (d: Uint8Array): Uint8Array => tweakUtils.privateNegate(d),
sign: (h: Uint8Array, d: Uint8Array, e?: Uint8Array): Uint8Array => {
return necc.signSync(h, d, { der: false, extraEntropy: e });
return necc.sign(h, d, { prehash: false, extraEntropy: e });
},
signDER: (h: Uint8Array, d: Uint8Array, e?: Uint8Array): Uint8Array => {
return necc.signSync(h, d, { der: true, extraEntropy: e });
return compactToDER(necc.sign(h, d, { prehash: false, extraEntropy: e }));
},
signSchnorr: (h: Uint8Array, d: Uint8Array, e: Uint8Array = new Uint8Array(32).fill(0x00)): Uint8Array => {
return necc.schnorr.signSync(h, d, e);
return necc.schnorr.sign(h, d, e);
},
verify: (h: Uint8Array, Q: Uint8Array, signature: Uint8Array, strict?: boolean): boolean => {
return necc.verify(signature, h, Q, { strict });
return necc.verify(signature, h, Q, { prehash: false, lowS: strict !== false });
},
verifySchnorr: (h: Uint8Array, Q: Uint8Array, signature: Uint8Array): boolean => {
return necc.schnorr.verifySync(signature, h, Q);
return necc.schnorr.verify(signature, h, Q);
},
};
export default ecc;
// module.exports.ecc = ecc;

View File

@ -8,16 +8,16 @@ import {
Notifications,
} from 'react-native-notifications';
import { checkNotifications, requestNotifications, RESULTS } from 'react-native-permissions';
import type { BoltzReverseSwap } from '@arkade-os/boltz-swap';
import loc from '../loc';
import { groundControlUri } from './constants';
import { arkadePaymentPushUri, groundControlUri } from './constants';
import { fetch } from '../util/fetch';
const PUSH_TOKEN = 'PUSH_TOKEN';
const GROUNDCONTROL_BASE_URI = 'GROUNDCONTROL_BASE_URI';
const NOTIFICATIONS_STORAGE = 'NOTIFICATIONS_STORAGE';
const ANDROID_NOTIFICATION_CHANNEL_ID = 'channel_01';
export const NOTIFICATIONS_NO_AND_DONT_ASK_FLAG = 'NOTIFICATIONS_NO_AND_DONT_ASK_FLAG';
let baseURI = groundControlUri;
const baseURI = groundControlUri;
let notificationSubscriptions: EmitterSubscription[] = [];
let onProcessNotificationsHandler: undefined | (() => void | Promise<void>);
const handledNotificationKeys = new Set<string>();
@ -252,6 +252,29 @@ export const tryToObtainPermissions = async (): Promise<boolean> => {
return false;
}
};
export const enqueueTestPushNotification = async (): Promise<void> => {
const pushToken = await getPushToken();
if (!pushToken?.token || !pushToken?.os) {
throw new Error('No push token available');
}
const response = await fetch(`${baseURI}/enqueue`, {
method: 'POST',
headers: _getHeaders(),
body: JSON.stringify({
type: 5,
token: pushToken.token,
os: pushToken.os,
text: 'Test push notification',
}),
});
if (!response.ok) {
throw new Error(`Enqueue request failed with status ${response.status}: ${response.statusText}`);
}
};
/**
* Submits onchain bitcoin addresses and ln invoice preimage hashes to GroundControl server, so later we could
* be notified if they were paid
@ -327,6 +350,44 @@ export const majorTomToGroundControl = async (addresses: string[], hashes: strin
}
};
/**
* Registers an Ark swap with the bitcoin-payment-push-service so the device is
* pushed when the invoice gets paid. Fire-and-forget: never throws, gated by
* the same opt-out/token rules as majorTomToGroundControl(). The swap's
* preimage is always stripped before leaving the device.
*/
export const registerArkPaymentPush = async (paymentHash: string, label: string, pendingSwap: BoltzReverseSwap): Promise<void> => {
if (!arkadePaymentPushUri) return;
try {
const noAndDontAskFlag = await AsyncStorage.getItem(NOTIFICATIONS_NO_AND_DONT_ASK_FLAG);
if (noAndDontAskFlag === 'true') {
console.warn('User has opted out of notifications.');
return;
}
const pushToken = await getPushToken();
if (!pushToken || !pushToken.token || !pushToken.os) {
return;
}
const response = await fetch(`${arkadePaymentPushUri}/register`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
topic: paymentHash,
label,
swap: { ...pendingSwap, preimage: '' },
}),
});
if (!response.ok) {
throw new Error(`status ${response.status}`);
}
console.log('[ARK] payment push registration ok');
} catch (e: any) {
console.log('[ARK] payment push registration failed:', e?.message ?? e);
}
};
/**
* Returns a permissions object:
* alert: boolean
@ -529,22 +590,6 @@ const configureNotifications = async (onProcessNotifications?: () => void): Prom
}
};
/**
* Validates whether the provided GroundControl URI is valid by pinging it.
*
* @param uri {string}
* @returns {Promise<boolean>} TRUE if valid, FALSE otherwise
*/
export const isGroundControlUriValid = async (uri: string) => {
try {
const response = await fetch(`${uri}/ping`, { headers: _getHeaders() });
const json = await response.json();
return !!json.description;
} catch (_) {
return false;
}
};
export const isNotificationsCapable = hasGmsSync() || hasHmsSync() || Platform.OS !== 'android';
export const getPushToken = async (): Promise<TPushToken> => {
@ -676,38 +721,6 @@ export const removeAllDeliveredNotifications = () => {
Notifications.removeAllDeliveredNotifications();
};
export const getDefaultUri = () => {
return groundControlUri;
};
export const saveUri = async (uri: string) => {
try {
baseURI = uri || groundControlUri;
await AsyncStorage.setItem(GROUNDCONTROL_BASE_URI, baseURI);
} catch (error) {
console.error('Error saving URI:', error);
throw error;
}
};
export const getSavedUri = async () => {
try {
const baseUriStored = await AsyncStorage.getItem(GROUNDCONTROL_BASE_URI);
if (baseUriStored) {
baseURI = baseUriStored;
}
return baseUriStored;
} catch (e) {
console.error(e);
try {
await AsyncStorage.setItem(GROUNDCONTROL_BASE_URI, groundControlUri);
} catch (storageError) {
console.error('Failed to reset URI:', storageError);
}
throw e;
}
};
export const isNotificationsEnabled = async () => {
try {
const levels = await getLevels();
@ -757,10 +770,6 @@ export const initializeNotifications = async (onProcessNotifications?: () => voi
return;
}
const baseUriStored = await AsyncStorage.getItem(GROUNDCONTROL_BASE_URI);
baseURI = baseUriStored || groundControlUri;
console.log('Base URI set to:', baseURI);
setApplicationIconBadgeNumber(0);
// Only check permissions, never request
@ -781,7 +790,5 @@ export const initializeNotifications = async (onProcessNotifications?: () => voi
}
} catch (error) {
console.error('Failed to initialize notifications:', error);
baseURI = groundControlUri;
await AsyncStorage.setItem(GROUNDCONTROL_BASE_URI, groundControlUri).catch(err => console.error('Failed to reset URI:', err));
}
};

View File

@ -23,7 +23,7 @@ export const startAndDecrypt = async (retry?: boolean, passwordPrompt?: Password
password = await passwordPrompt();
} else {
do {
password = await prompt((retry && loc._.bad_password) || loc._.enter_password, loc._.storage_is_encrypted, false);
password = await prompt((retry && loc._.bad_password) || loc._.enter_password, loc._.storage_is_encrypted, { cancelable: false });
} while (!password);
}
}

View File

@ -0,0 +1,41 @@
// Display state for the transaction detail screen.
//
// On-chain rows (a real Bitcoin txid is present in `hash`) keep the existing
// confirmations-based logic. Ark/Lightning rows synthesized by
// LightningArkWallet.getTransactions() carry no on-chain `hash` and never a
// `confirmations` field, so their state is derived from row semantics instead.
// The off-chain branch mirrors the off-chain cases of
// components/TransactionListItem.tsx `listTitleKey` so the list row and the detail
// screen always agree. A `boarding-utxo-` row is a refill still awaiting
// settlement and is pending (matches TransactionListItem.isPendingRefill); a
// settled `boarding-` refill is a confirmed receive. Today only `bitcoind_tx` Ark
// rows reach the detail screen (swap rows route to LNDViewInvoice); the invoice
// cases are handled defensively.
export type TxDisplayState = 'pending' | 'sent' | 'received';
export function isOnChainTransaction(tx: any): boolean {
return typeof tx?.hash === 'string' && tx.hash.length > 0;
}
export function resolveTxDisplayState(tx: any): TxDisplayState {
if (isOnChainTransaction(tx)) {
const confs = Number(tx?.confirmations);
const pending = Number.isFinite(confs) ? confs <= 0 : !tx?.confirmations;
if (pending) return 'pending';
return Number(tx?.value) < 0 ? 'sent' : 'received';
}
// A refill awaiting settlement (boarding UTXO not yet swept into a VTXO) is
// pending until it promotes to a settled `boarding-<txid>` refill — mirror
// TransactionListItem.isPendingRefill so the list row and detail screen agree.
if (typeof tx?.txid === 'string' && tx.txid.startsWith('boarding-utxo-')) return 'pending';
// Off-chain Ark/Lightning row — never confirmations-based.
switch (tx?.type) {
case 'paid_invoice':
return 'sent';
case 'user_invoice':
case 'payment_request':
return tx?.ispaid ? 'received' : 'pending';
default: // settled refill (boarding-<txid>), native Ark legs (ark-), any other hash-less row
return Number(tx?.value) < 0 ? 'sent' : 'received';
}
}

View File

@ -147,11 +147,10 @@ export class BlueApp {
console.warn('error reading', key, error.message);
console.warn('fallback to realm');
const realmKeyValue = await this.openRealmKeyValue();
const obj = realmKeyValue.objectForPrimaryKey('KeyValue', key); // search for a realm object with a primary key
const obj = realmKeyValue.objectForPrimaryKey<{ key: string; value: string }>('KeyValue', key);
value = obj?.value;
realmKeyValue.close();
if (value) {
// @ts-ignore value.length
console.warn('successfully recovered', value.length, 'bytes from realm for key', key);
return value;
}
@ -547,10 +546,11 @@ export class BlueApp {
(walletToInflate._txs_by_internal_index[tx.index] as Transaction[]).push(transaction);
}
} else {
if (!Array.isArray(walletToInflate._txs_by_external_index)) walletToInflate._txs_by_external_index = [];
walletToInflate._txs_by_external_index = walletToInflate._txs_by_external_index || [];
// Legacy single-address wallets - store under index 0
walletToInflate._txs_by_external_index = walletToInflate._txs_by_external_index || {};
walletToInflate._txs_by_external_index[0] = walletToInflate._txs_by_external_index[0] || [];
const transaction = JSON.parse(tx.tx);
(walletToInflate._txs_by_external_index as Transaction[]).push(transaction);
walletToInflate._txs_by_external_index[0].push(transaction);
}
}
}
@ -559,32 +559,6 @@ export class BlueApp {
const id = wallet.getID();
const walletToSave = ('_hdWalletInstance' in wallet && wallet._hdWalletInstance) || wallet;
if (Array.isArray(walletToSave._txs_by_external_index)) {
// if this var is an array that means its a single-address wallet class, and this var is a flat array
// with transactions
realm.write(() => {
// cleanup all existing transactions for the wallet first
const walletTransactionsToDelete = realm.objects('WalletTransactions').filtered(`walletid = '${id}'`);
realm.delete(walletTransactionsToDelete);
// @ts-ignore walletToSave._txs_by_external_index is array
for (const tx of walletToSave._txs_by_external_index) {
realm.create(
'WalletTransactions',
{
walletid: id,
tx: JSON.stringify(tx),
},
Realm.UpdateMode.Modified,
);
}
});
return;
}
/// ########################################################################################################
if (walletToSave._txs_by_external_index) {
realm.write(() => {
// cleanup all existing transactions for the wallet first
@ -592,16 +566,14 @@ export class BlueApp {
realm.delete(walletTransactionsToDelete);
// insert new ones:
for (const index of Object.keys(walletToSave._txs_by_external_index)) {
// @ts-ignore index is number
const txs = walletToSave._txs_by_external_index[index];
for (const [indexStr, txs] of Object.entries(walletToSave._txs_by_external_index)) {
for (const tx of txs) {
realm.create(
'WalletTransactions',
{
walletid: id,
internal: false,
index: parseInt(index, 10),
index: parseInt(indexStr, 10),
tx: JSON.stringify(tx),
},
Realm.UpdateMode.Modified,
@ -609,16 +581,14 @@ export class BlueApp {
}
}
for (const index of Object.keys(walletToSave._txs_by_internal_index)) {
// @ts-ignore index is number
const txs = walletToSave._txs_by_internal_index[index];
for (const [indexStr, txs] of Object.entries(walletToSave._txs_by_internal_index)) {
for (const tx of txs) {
realm.create(
'WalletTransactions',
{
walletid: id,
internal: true,
index: parseInt(index, 10),
index: parseInt(indexStr, 10),
tx: JSON.stringify(tx),
},
Realm.UpdateMode.Modified,

View File

@ -390,7 +390,7 @@ export class HDSegwitBech32Transaction {
}
}
// @ts-ignore stfu
return { tx, inputs, outputs, fee };
// Non-null assertions are safe here because the while loop always runs at least once (add starts at 0)
return { tx: tx!, inputs: inputs!, outputs: outputs!, fee: fee! };
}
}

View File

@ -2,7 +2,7 @@ import { bech32 } from 'bech32';
import bolt11 from 'bolt11';
import { sha256 } from '@noble/hashes/sha256';
import { hmac } from '@noble/hashes/hmac';
import CryptoJS from 'crypto-js';
import { cbc } from '@noble/ciphers/aes';
import ecc from '../blue_modules/noble_ecc';
import { parse } from 'url'; // eslint-disable-line n/no-deprecated-api
import { fetch } from '../util/fetch';
@ -321,13 +321,24 @@ export default class Lnurl {
}
static decipherAES(ciphertextBase64: string, preimageHex: string, ivBase64: string): string {
const iv = CryptoJS.enc.Base64.parse(ivBase64);
const key = CryptoJS.enc.Hex.parse(preimageHex);
return CryptoJS.AES.decrypt(uint8ArrayToHex(base64ToUint8Array(ciphertextBase64)), key, {
iv,
mode: CryptoJS.mode.CBC,
format: CryptoJS.format.Hex,
}).toString(CryptoJS.enc.Utf8);
// crypto-js's old implementation silently returned '' on malformed
// ciphertext (non-16-aligned bytes, bad PKCS7 padding) and threw on
// malformed UTF-8 plaintext. @noble/ciphers throws on the former. We
// catch every throw and return '' — the call site at
// screen/lnd/lnurlPaySuccess.tsx renders this directly without a
// try/catch, so a misbehaving LNURL server should not crash the screen.
// Note: unlike crypto-js's strict `enc.Utf8` decoder, `uint8ArrayToString`
// is lenient on bad UTF-8 (mojibake instead of throw); this is strictly
// safer than the old behaviour for this user-facing path.
try {
const key = hexToUint8Array(preimageHex);
const iv = base64ToUint8Array(ivBase64);
const ct = base64ToUint8Array(ciphertextBase64);
const pt = cbc(key, iv).decrypt(ct);
return uint8ArrayToString(pt);
} catch (_) {
return '';
}
}
getCommentAllowed(): number | false {

View File

@ -106,23 +106,31 @@ export class MultisigCosigner {
this._valid = false;
}
// is it coldcard json?
// is it coldcard / unchained json?
try {
const json = JSON.parse(data);
if (json.p2sh && json.p2sh_deriv && json.xfp) {
const cc = new MultisigCosigner(MultisigCosigner.exportToJson(json.xfp, json.p2sh, json.p2sh_deriv));
// p2wsh_p2sh (Coldcard), p2sh_p2wsh (Unchained)
// same script type with reversed naming
const xpub = json.p2wsh_p2sh || json.p2sh_p2wsh;
const path = (json.p2wsh_p2sh_deriv || json.p2sh_p2wsh_deriv)?.replace(/h/g, "'");
const p2sh_deriv = json.p2sh_deriv?.replace(/h/g, "'");
const p2wsh_deriv = json.p2wsh_deriv?.replace(/h/g, "'");
if (json.p2sh && p2sh_deriv && json.xfp) {
const cc = new MultisigCosigner(MultisigCosigner.exportToJson(json.xfp, json.p2sh, p2sh_deriv));
this._valid = true;
this._cosigners.push(cc);
}
if (json.p2wsh_p2sh && json.p2wsh_p2sh_deriv && json.xfp) {
const cc = new MultisigCosigner(MultisigCosigner.exportToJson(json.xfp, json.p2wsh_p2sh, json.p2wsh_p2sh_deriv));
if (xpub && path && json.xfp) {
const cc = new MultisigCosigner(MultisigCosigner.exportToJson(json.xfp, xpub, path));
this._valid = true;
this._cosigners.push(cc);
}
if (json.p2wsh && json.p2wsh_deriv && json.xfp) {
const cc = new MultisigCosigner(MultisigCosigner.exportToJson(json.xfp, json.p2wsh, json.p2wsh_deriv));
if (json.p2wsh && p2wsh_deriv && json.xfp) {
const cc = new MultisigCosigner(MultisigCosigner.exportToJson(json.xfp, json.p2wsh, p2wsh_deriv));
this._valid = true;
this._cosigners.push(cc);
}

View File

@ -11,7 +11,7 @@
* @return {Promise.<Uint8Array>} The random bytes
*/
export async function randomBytes(size: number): Promise<Uint8Array> {
const g: any = globalThis as any;
const g = globalThis as any;
const rnCrypto = g && g.crypto;
if (!rnCrypto || typeof rnCrypto.getRandomValues !== 'function') {
throw new Error('crypto.getRandomValues is not available');

View File

@ -216,10 +216,35 @@ const startImport = (
if (text.startsWith('arkade://')) {
const ark = new LightningArkWallet();
ark.setSecret(text);
await ark.init();
// Defer init() to first wallet open when offline — init touches the ASP
// and delegator over the network. We still detect the wallet by prefix
// and persist it with its secret.
// A network or SDK failure during init must not abort the import: the
// wallet type and secret are known, and the SDK runtime can be brought
// up the next time the wallet is opened.
if (!offline) {
await ark.fetchBalance();
await ark.fetchTransactions();
try {
await ark.init();
// Restore any previous Boltz swap activity for this seed exactly
// once, here at import time. We never run this on later wallet
// opens — the app does not sweep all swaps on bootstrap. A failure
// must not block the import: the wallet itself is fine, the
// restored rows are an optional bonus for imported-from-elsewhere
// wallets.
try {
await ark.restoreSwaps();
} catch (e: any) {
console.log('[wallet-import] restoreSwaps failed:', e?.message ?? e);
}
try {
await ark.fetchBalance();
await ark.fetchTransactions();
} catch (e: any) {
console.log('[wallet-import] initial Ark sync failed:', e?.message ?? e);
}
} catch (e: any) {
console.log('[wallet-import] Ark init failed; deferring to next open:', e?.message ?? e);
}
}
yield { wallet: ark };
}
@ -319,6 +344,7 @@ const startImport = (
}
yield { progress: 'wif' };
const segwitWallet = new SegwitP2SHWallet();
segwitWallet.setSecret(text);
if (segwitWallet.getAddress()) {
@ -382,6 +408,89 @@ const startImport = (
yield { wallet: legacyWallet };
}
yield { progress: 'Private key in hex/base64' };
// check if text is in hex or base64 format
const isHexKey = /^[0-9a-fA-F]{64}$/.test(text);
const isBase64Key = /^[A-Za-z0-9+/=]{43,44}$/.test(text);
let rawKeyBuffer;
let privateKey;
if (isHexKey) {
rawKeyBuffer = Buffer.from(text, 'hex');
} else if (isBase64Key) {
rawKeyBuffer = Buffer.from(text, 'base64');
}
if (rawKeyBuffer && rawKeyBuffer.length === 32) {
let walletFound = false;
// convert the bytes to Wallet import format, 0x80 for mainnet,
// start with uncompressed p2pkh
privateKey = wif.encode(0x80, rawKeyBuffer, false);
yield { progress: 'p2pkh uncompressed' };
const legacyWalletUncompressed = new LegacyWallet('Legacy (P2PKH) - Uncompressed');
legacyWalletUncompressed.setSecret(privateKey);
if (await wasUsed(legacyWalletUncompressed)) {
await fetch(legacyWalletUncompressed, true);
walletFound = true;
yield { wallet: legacyWalletUncompressed };
}
// compressed is true for other wallet types
privateKey = wif.encode(0x80, rawKeyBuffer, true);
yield { progress: 'p2wpkh' };
const segwitBech32Wallet = new SegwitBech32Wallet();
segwitBech32Wallet.setSecret(privateKey);
if (await wasUsed(segwitBech32Wallet)) {
await fetch(segwitBech32Wallet, true);
walletFound = true;
yield { wallet: segwitBech32Wallet };
}
yield { progress: 'p2tr' };
const taprootWallet = new TaprootWallet();
taprootWallet.setSecret(privateKey);
if (await wasUsed(taprootWallet)) {
await fetch(taprootWallet, true);
walletFound = true;
yield { wallet: taprootWallet };
}
yield { progress: 'p2wpkh-p2sh' };
segwitWallet.setSecret(privateKey);
if (await wasUsed(segwitWallet)) {
await fetch(segwitWallet, true);
walletFound = true;
yield { wallet: segwitWallet };
}
yield { progress: 'p2pkh compressed' };
const legacyWalletCompressed = new LegacyWallet('Legacy (P2PKH) - Compressed');
legacyWalletCompressed.setSecret(privateKey);
if (await wasUsed(legacyWalletCompressed)) {
await fetch(legacyWalletCompressed, true);
walletFound = true;
yield { wallet: legacyWalletCompressed };
}
if (!walletFound) {
yield { wallet: segwitBech32Wallet };
yield { wallet: segwitWallet };
yield { wallet: legacyWalletCompressed };
yield { wallet: taprootWallet };
yield { wallet: legacyWalletUncompressed };
}
}
// maybe its a watch-only address?
yield { progress: 'watch only' };
const wo1 = new WatchOnlyWallet();

View File

@ -45,9 +45,7 @@ export class AbstractHDElectrumWallet extends AbstractHDWallet {
_balances_by_external_index: Record<number, BalanceByIndex>;
_balances_by_internal_index: Record<number, BalanceByIndex>;
// @ts-ignore
_txs_by_external_index: Record<number, Transaction[]>;
// @ts-ignore
_txs_by_internal_index: Record<number, Transaction[]>;
_utxo: any[];
@ -204,70 +202,37 @@ export class AbstractHDElectrumWallet extends AbstractHDWallet {
return child.toWIF();
}
_getNodeAddressByIndex(node: number, index: number): string {
index = index * 1; // cast to int
_getNodeByIndex(node: 0 | 1, index: number): BIP32Interface {
const cachedNode = node === 0 ? this._node0 : this._node1;
if (cachedNode) {
return cachedNode.derive(index);
}
const xpub = this._zpubToXpub(this.getXpub());
const hdNode = bip32.fromBase58(xpub).derive(node);
if (node === 0) {
if (this.external_addresses_cache[index]) return this.external_addresses_cache[index]; // cache hit
}
if (node === 1) {
if (this.internal_addresses_cache[index]) return this.internal_addresses_cache[index]; // cache hit
}
if (node === 0 && !this._node0) {
const xpub = this._zpubToXpub(this.getXpub());
const hdNode = bip32.fromBase58(xpub);
this._node0 = hdNode.derive(node);
}
if (node === 1 && !this._node1) {
const xpub = this._zpubToXpub(this.getXpub());
const hdNode = bip32.fromBase58(xpub);
this._node1 = hdNode.derive(node);
}
let address: string;
if (node === 0) {
// @ts-ignore
address = this._hdNodeToAddress(this._node0.derive(index));
this._node0 = hdNode;
} else {
// tbh the only possible else is node === 1
// @ts-ignore
address = this._hdNodeToAddress(this._node1.derive(index));
this._node1 = hdNode;
}
if (node === 0) {
return (this.external_addresses_cache[index] = address);
} else {
// tbh the only possible else option is node === 1
return (this.internal_addresses_cache[index] = address);
}
return hdNode.derive(index);
}
_getNodePubkeyByIndex(node: number, index: number) {
index = index * 1; // cast to int
_getNodeAddressByIndex(node: 0 | 1, index: number): string {
const cache = node === 0 ? this.external_addresses_cache : this.internal_addresses_cache;
if (node === 0 && !this._node0) {
const xpub = this._zpubToXpub(this.getXpub());
const hdNode = bip32.fromBase58(xpub);
this._node0 = hdNode.derive(node);
}
if (cache[index]) return cache[index]; // cache hit
if (node === 1 && !this._node1) {
const xpub = this._zpubToXpub(this.getXpub());
const hdNode = bip32.fromBase58(xpub);
this._node1 = hdNode.derive(node);
}
const hdNode = this._getNodeByIndex(node, index);
const address = this._hdNodeToAddress(hdNode);
if (node === 0 && this._node0) {
return this._node0.derive(index).publicKey;
}
return (cache[index] = address);
}
if (node === 1 && this._node1) {
return this._node1.derive(index).publicKey;
}
throw new Error('Internal error: this._node0 or this._node1 is undefined');
_getNodePubkeyByIndex(node: 0 | 1, index: number) {
return this._getNodeByIndex(node, index).publicKey;
}
_getExternalAddressByIndex(index: number): string {
@ -424,137 +389,95 @@ export class AbstractHDElectrumWallet extends AbstractHDWallet {
// now, we need to put transactions in all relevant `cells` of internal hashmaps:
// this._txs_by_internal_index, this._txs_by_external_index & this._txs_by_payment_code_index
// address -> index lookup maps; the single pass over transactions below uses them
// to find which cells a transaction belongs to
const externalIndexByAddress = new Map<string, number>();
for (let c = 0; c < next_free_address_index + this.gap_limit; c++) {
for (const tx of Object.values(txdatas)) {
for (const vin of tx.vin) {
if (vin.addresses && vin.addresses.indexOf(this._getExternalAddressByIndex(c)) !== -1) {
// this TX is related to our address
this._txs_by_external_index[c] = this._txs_by_external_index[c] || [];
const { vin: txVin, vout: txVout, ...txRest } = tx;
const clonedTx = {
...txRest,
inputs: txVin.slice(0),
outputs: txVout.slice(0),
timestamp: tx.blocktime || tx.time || Math.floor(+new Date() / 1000) - 30 /* unconfirmed */,
};
// trying to replace tx if it exists already (because it has lower confirmations, for example)
let replaced = false;
for (let cc = 0; cc < this._txs_by_external_index[c].length; cc++) {
if (this._txs_by_external_index[c][cc].txid === clonedTx.txid) {
replaced = true;
this._txs_by_external_index[c][cc] = clonedTx;
}
}
if (!replaced) this._txs_by_external_index[c].push(clonedTx);
}
}
for (const vout of tx.vout) {
if (vout.scriptPubKey.addresses && vout.scriptPubKey.addresses.indexOf(this._getExternalAddressByIndex(c)) !== -1) {
// this TX is related to our address
this._txs_by_external_index[c] = this._txs_by_external_index[c] || [];
const { vin: txVin, vout: txVout, ...txRest } = tx;
const clonedTx = {
...txRest,
inputs: txVin.slice(0),
outputs: txVout.slice(0),
timestamp: tx.blocktime || tx.time || Math.floor(+new Date() / 1000) - 30 /* unconfirmed */,
};
// trying to replace tx if it exists already (because it has lower confirmations, for example)
let replaced = false;
for (let cc = 0; cc < this._txs_by_external_index[c].length; cc++) {
if (this._txs_by_external_index[c][cc].txid === clonedTx.txid) {
replaced = true;
this._txs_by_external_index[c][cc] = clonedTx;
}
}
if (!replaced) this._txs_by_external_index[c].push(clonedTx);
}
}
}
externalIndexByAddress.set(this._getExternalAddressByIndex(c), c);
}
const internalIndexByAddress = new Map<string, number>();
for (let c = 0; c < next_free_change_address_index + this.gap_limit; c++) {
for (const tx of Object.values(txdatas)) {
for (const vin of tx.vin) {
if (vin.addresses && vin.addresses.indexOf(this._getInternalAddressByIndex(c)) !== -1) {
// this TX is related to our address
this._txs_by_internal_index[c] = this._txs_by_internal_index[c] || [];
const { vin: txVin, vout: txVout, ...txRest } = tx;
const clonedTx = {
...txRest,
inputs: txVin.slice(0),
outputs: txVout.slice(0),
timestamp: tx.blocktime || tx.time || Math.floor(+new Date() / 1000) - 30 /* unconfirmed */,
};
// trying to replace tx if it exists already (because it has lower confirmations, for example)
let replaced = false;
for (let cc = 0; cc < this._txs_by_internal_index[c].length; cc++) {
if (this._txs_by_internal_index[c][cc].txid === clonedTx.txid) {
replaced = true;
this._txs_by_internal_index[c][cc] = clonedTx;
}
}
if (!replaced) this._txs_by_internal_index[c].push(clonedTx);
}
}
for (const vout of tx.vout) {
if (vout.scriptPubKey.addresses && vout.scriptPubKey.addresses.indexOf(this._getInternalAddressByIndex(c)) !== -1) {
// this TX is related to our address
this._txs_by_internal_index[c] = this._txs_by_internal_index[c] || [];
const { vin: txVin, vout: txVout, ...txRest } = tx;
const clonedTx = {
...txRest,
inputs: txVin.slice(0),
outputs: txVout.slice(0),
timestamp: tx.blocktime || tx.time || Math.floor(+new Date() / 1000) - 30 /* unconfirmed */,
};
// trying to replace tx if it exists already (because it has lower confirmations, for example)
let replaced = false;
for (let cc = 0; cc < this._txs_by_internal_index[c].length; cc++) {
if (this._txs_by_internal_index[c][cc].txid === clonedTx.txid) {
replaced = true;
this._txs_by_internal_index[c][cc] = clonedTx;
}
}
if (!replaced) this._txs_by_internal_index[c].push(clonedTx);
}
}
}
internalIndexByAddress.set(this._getInternalAddressByIndex(c), c);
}
const paymentCodeIndexByAddress = new Map<string, { pc: string; c: number }>();
for (const pc of this._receive_payment_codes) {
for (let c = 0; c < this._getNextFreePaymentCodeIndexReceive(pc) + this.gap_limit; c++) {
for (const tx of Object.values(txdatas)) {
// since we are iterating PCs who can pay us, we can completely ignore `tx.vin` and only iterate `tx.vout`
for (const vout of tx.vout) {
if (vout.scriptPubKey.addresses && vout.scriptPubKey.addresses.indexOf(this._getBIP47AddressReceive(pc, c)) !== -1) {
// this TX is related to our address
this._txs_by_payment_code_index[pc] = this._txs_by_payment_code_index[pc] || {};
this._txs_by_payment_code_index[pc][c] = this._txs_by_payment_code_index[pc][c] || [];
const { vin: txVin, vout: txVout, ...txRest } = tx;
const clonedTx = {
...txRest,
inputs: txVin.slice(0),
outputs: txVout.slice(0),
timestamp: tx.blocktime || tx.time || Math.floor(+new Date() / 1000) - 30 /* unconfirmed */,
};
paymentCodeIndexByAddress.set(this._getBIP47AddressReceive(pc, c), { pc, c });
}
}
// trying to replace tx if it exists already (because it has lower confirmations, for example)
let replaced = false;
for (let cc = 0; cc < this._txs_by_payment_code_index[pc][c].length; cc++) {
if (this._txs_by_payment_code_index[pc][c][cc].txid === clonedTx.txid) {
replaced = true;
this._txs_by_payment_code_index[pc][c][cc] = clonedTx;
}
}
if (!replaced) this._txs_by_payment_code_index[pc][c].push(clonedTx);
}
}
// per-cell txid -> position lookup, used to replace-or-push a transaction into a cell in constant time
const cellPositionsByTxid = new Map<Transaction[], Map<string, number>>();
const getCellPositions = (cell: Transaction[]): Map<string, number> => {
let positions = cellPositionsByTxid.get(cell);
if (!positions) {
positions = new Map();
for (let cc = 0; cc < cell.length; cc++) positions.set(cell[cc].txid, cc);
cellPositionsByTxid.set(cell, positions);
}
return positions;
};
for (const tx of Object.values(txdatas)) {
// collecting which of our address `cells` this transaction touches:
const externalCells = new Set<number>();
const internalCells = new Set<number>();
const paymentCodeCells = new Map<string, { pc: string; c: number }>();
const matchAddress = (address: string, isVout: boolean) => {
const externalIndex = externalIndexByAddress.get(address);
if (externalIndex !== undefined) externalCells.add(externalIndex);
const internalIndex = internalIndexByAddress.get(address);
if (internalIndex !== undefined) internalCells.add(internalIndex);
if (isVout) {
// since we are iterating PCs who can pay us, we can completely ignore `tx.vin` and only check `tx.vout`
const paymentCodeIndex = paymentCodeIndexByAddress.get(address);
if (paymentCodeIndex) paymentCodeCells.set(address, paymentCodeIndex);
}
};
for (const vin of tx.vin) {
for (const address of vin.addresses ?? []) matchAddress(address, false);
}
for (const vout of tx.vout) {
for (const address of vout.scriptPubKey.addresses ?? []) matchAddress(address, true);
}
if (externalCells.size === 0 && internalCells.size === 0 && paymentCodeCells.size === 0) continue;
// this TX is related to our address(es)
const upsertClone = (cell: Transaction[]) => {
const { vin: txVin, vout: txVout, ...txRest } = tx;
const clonedTx = {
...txRest,
inputs: txVin.slice(0),
outputs: txVout.slice(0),
timestamp: tx.blocktime || tx.time || Math.floor(+new Date() / 1000) - 30 /* unconfirmed */,
};
// trying to replace tx if it exists already (because it has lower confirmations, for example)
const positions = getCellPositions(cell);
const existingPosition = positions.get(clonedTx.txid);
if (existingPosition !== undefined) {
cell[existingPosition] = clonedTx;
} else {
positions.set(clonedTx.txid, cell.length);
cell.push(clonedTx);
}
};
for (const c of externalCells) {
this._txs_by_external_index[c] = this._txs_by_external_index[c] || [];
upsertClone(this._txs_by_external_index[c]);
}
for (const c of internalCells) {
this._txs_by_internal_index[c] = this._txs_by_internal_index[c] || [];
upsertClone(this._txs_by_internal_index[c]);
}
for (const { pc, c } of paymentCodeCells.values()) {
this._txs_by_payment_code_index[pc] = this._txs_by_payment_code_index[pc] || {};
this._txs_by_payment_code_index[pc][c] = this._txs_by_payment_code_index[pc][c] || [];
upsertClone(this._txs_by_payment_code_index[pc][c]);
}
}
@ -601,8 +524,7 @@ export class AbstractHDElectrumWallet extends AbstractHDWallet {
const ret: Transaction[] = [];
for (const tx of txs) {
tx.timestamp = tx.blocktime;
if (!tx.blocktime) tx.timestamp = Math.floor(+new Date() / 1000) - 30; // unconfirmed
tx.timestamp = tx.blocktime || Math.floor(+new Date() / 1000) - 30; // fallback for unconfirmed
tx.confirmations = tx.confirmations || 0; // unconfirmed
tx.hash = tx.txid;
tx.value = 0;
@ -653,8 +575,7 @@ export class AbstractHDElectrumWallet extends AbstractHDWallet {
let lastHistoriesWithUsedAddresses = null;
for (let c = 0; c < Math.round(index / this.gap_limit); c++) {
const histories = await BlueElectrum.multiGetHistoryByAddress(gerenateChunkAddresses(c));
// @ts-ignore
if (this.constructor._getTransactionsFromHistories(histories).length > 0) {
if (AbstractHDElectrumWallet._getTransactionsFromHistories(histories).length > 0) {
// in this particular chunk we have used addresses
lastChunkWithUsedAddressesNum = c;
lastHistoriesWithUsedAddresses = histories;
@ -696,8 +617,7 @@ export class AbstractHDElectrumWallet extends AbstractHDWallet {
let lastHistoriesWithUsedAddresses = null;
for (let c = 0; c < Math.round(index / this.gap_limit); c++) {
const histories = await BlueElectrum.multiGetHistoryByAddress(gerenateChunkAddresses(c));
// @ts-ignore
if (this.constructor._getTransactionsFromHistories(histories).length > 0) {
if (AbstractHDElectrumWallet._getTransactionsFromHistories(histories).length > 0) {
// in this particular chunk we have used addresses
lastChunkWithUsedAddressesNum = c;
lastHistoriesWithUsedAddresses = histories;
@ -739,8 +659,7 @@ export class AbstractHDElectrumWallet extends AbstractHDWallet {
let lastHistoriesWithUsedAddresses = null;
for (let c = 0; c < Math.round(index / this.gap_limit); c++) {
const histories = await BlueElectrum.multiGetHistoryByAddress(generateChunkAddresses(c));
// @ts-ignore
if (this.constructor._getTransactionsFromHistories(histories).length > 0) {
if (AbstractHDElectrumWallet._getTransactionsFromHistories(histories).length > 0) {
// in this particular chunk we have used addresses
lastChunkWithUsedAddressesNum = c;
lastHistoriesWithUsedAddresses = histories;

View File

@ -315,7 +315,7 @@ export class AbstractHDWallet extends LegacyWallet {
throw new Error('Not implemented');
}
_getNodePubkeyByIndex(node: number, index: number): Uint8Array | undefined {
_getNodePubkeyByIndex(node: 0 | 1, index: number): Uint8Array | undefined {
throw new Error('Not implemented');
}

View File

@ -21,14 +21,20 @@ bitcoin.initEccLib(ecc);
*/
export class LegacyWallet extends AbstractWallet {
static readonly type = 'legacy';
static readonly typeReadable = 'Legacy (P2PKH)';
static readonly defaultTypeReadable = 'Legacy (P2PKH)';
// @ts-ignore: override
public readonly type = LegacyWallet.type;
// @ts-ignore: override
public readonly typeReadable = LegacyWallet.typeReadable;
public readonly typeReadable: string;
_txs_by_external_index: Transaction[] = [];
_txs_by_internal_index: Transaction[] = [];
_txs_by_external_index: Record<number, Transaction[]> = {};
_txs_by_internal_index: Record<number, Transaction[]> = {};
constructor(typeReadable?: string) {
super();
this.typeReadable = typeReadable ?? LegacyWallet.defaultTypeReadable;
}
/**
* Simple function which says that we havent tried to fetch balance
@ -338,14 +344,14 @@ export class LegacyWallet extends AbstractWallet {
}
}
this._txs_by_external_index = _txsByExternalIndex;
this._txs_by_external_index = { 0: _txsByExternalIndex };
this._lastTxFetch = +new Date();
}
getTransactions(): Transaction[] {
// a hacky code reuse from electrum HD wallet:
this._txs_by_external_index = this._txs_by_external_index || [];
this._txs_by_internal_index = [];
this._txs_by_external_index = this._txs_by_external_index || {};
this._txs_by_internal_index = {};
const { HDSegwitBech32Wallet } = require('./hd-segwit-bech32-wallet') as {
HDSegwitBech32Wallet: typeof HDSegwitBech32WalletT;

File diff suppressed because it is too large Load Diff

View File

@ -104,6 +104,11 @@ export type LightningTransaction = {
timestamp: number; // seconds, not milliseconds
expire_time?: number;
ispaid?: boolean;
// Terminal non-success state (failed/refunded/expired swap). Distinct from
// `ispaid:false`, which on its own only means "not settled yet" and is also
// true for in-flight rows. Consumers that gate on pending vs. dead state
// (e.g. the wallet-card pending pill) must treat `failed` rows as terminal.
failed?: boolean;
walletID?: string;
value?: number;
amt?: number;
@ -123,10 +128,11 @@ export type Transaction = {
locktime: number;
inputs: TransactionInput[];
outputs: TransactionOutput[];
blockhash: string;
confirmations: number;
time: number;
blocktime: number;
// Confirmation-only fields: absent on mempool (unconfirmed) responses.
blockhash?: string;
confirmations?: number;
time?: number;
blocktime?: number;
timestamp: number; // seconds, not milliseconds
value?: number;

View File

@ -197,12 +197,13 @@ export class WatchOnlyWallet extends LegacyWallet {
async fetchUtxo() {
if (this._hdWalletInstance) return this._hdWalletInstance.fetchUtxo();
throw new Error('Not initialized');
// Single-address watch-only uses LegacyWallet UTXO + derivation from txs (no HD instance).
return super.fetchUtxo();
}
getUtxo(...args: Parameters<THDWalletForWatchOnly['getUtxo']>) {
if (this._hdWalletInstance) return this._hdWalletInstance.getUtxo(...args);
throw new Error('Not initialized');
return super.getUtxo(...args);
}
combinePsbt(...args: Parameters<THDWalletForWatchOnly['combinePsbt']>) {

View File

@ -8,7 +8,7 @@ import loc from '../loc';
import { useExtendedNavigation } from '../hooks/useExtendedNavigation';
type AddWalletButtonProps = {
onPress?: (event: GestureResponderEvent) => void;
onPress: (event: GestureResponderEvent) => void;
};
const AddWalletButton: React.FC<AddWalletButtonProps> = ({ onPress }) => {

View File

@ -94,6 +94,8 @@ const styles = StyleSheet.create({
flex: 1,
paddingHorizontal: 8,
minHeight: 33,
fontSize: 15,
lineHeight: 19,
},
});

View File

@ -1,22 +1,20 @@
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import Clipboard from '@react-native-clipboard/clipboard';
import BigNumber from 'bignumber.js';
import dayjs from 'dayjs';
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import {
Text,
Image,
LayoutAnimation,
NativeSyntheticEvent,
Platform,
Pressable,
StyleSheet,
Text,
TextInput,
TextInputProps,
TextInputSelectionChangeEventData,
TextInputSelectionChangeEvent,
TouchableOpacity,
View,
} from 'react-native';
import Badge from './Badge';
import Icon from './Icon';
import BigNumber from 'bignumber.js';
import dayjs from 'dayjs';
import Animated, { Easing, FadeIn, FadeOut, LinearTransition } from 'react-native-reanimated';
import {
CurrencyRate,
@ -28,10 +26,12 @@ import {
updateExchangeRate,
} from '../blue_modules/currency';
import triggerHapticFeedback, { HapticFeedbackTypes } from '../blue_modules/hapticFeedback';
import { BlueText } from '../BlueComponents';
import confirm from '../helpers/confirm';
import loc, { formatBalancePlain, formatBalanceWithoutSuffix, removeTrailingZeros } from '../loc';
import { BitcoinUnit } from '../models/bitcoinUnits';
import Badge from './Badge';
import BlueText from './BlueText';
import Icon from './Icon';
import { useTheme } from './themes';
export const conversionCache: { [key: string]: string } = {};
@ -44,6 +44,23 @@ export const setCachedSatoshis = (amount: string, sats: string): void => {
conversionCache[amount + BitcoinUnit.LOCAL_CURRENCY] = sats;
};
const INPUT_HORIZONTAL_PADDING = 6;
const INPUT_VERTICAL_PADDING = 2;
const MAX_INPUT_WIDTH = 320;
const CRYPTO_CONTAINER_OFFSET = -12;
const SWAP_ICON_SIZE = 24;
const CHAR_FADE_IN_DURATION_MS = 240;
const CHAR_FADE_OUT_DURATION_MS = 160;
const CHAR_LAYOUT_DURATION_MS = 180;
const SIZER_LAYOUT_DURATION_MS = 200;
const androidFontPaddingStyle = Platform.OS === 'android' ? { includeFontPadding: false } : null;
const sizerLayoutTransition = LinearTransition.duration(SIZER_LAYOUT_DURATION_MS).easing(Easing.out(Easing.quad));
const charLayoutTransition = LinearTransition.duration(CHAR_LAYOUT_DURATION_MS).easing(Easing.out(Easing.quad));
const charEntering = FadeIn.duration(CHAR_FADE_IN_DURATION_MS);
const charExiting = FadeOut.duration(CHAR_FADE_OUT_DURATION_MS);
type AmountInputProps = Omit<TextInputProps, 'onChangeText' | 'value'> & {
/**
* Whether the input is in a loading state
@ -95,6 +112,7 @@ export const AmountInput: React.FC<AmountInputProps> = props => {
isLoading = false,
maxSendableAmount,
isMaxAmountEstimate,
style: styleOverride,
...otherProps
} = props;
const [isRateBeingUpdatedLocal, setIsRateBeingUpdatedLocal] = useState(false);
@ -111,6 +129,23 @@ export const AmountInput: React.FC<AmountInputProps> = props => {
}
}, [unit]);
const displayAmount = useMemo(() => {
if (amount === BitcoinUnit.MAX) {
return loc.units.MAX;
}
return parseFloat(amount) >= 0 ? String(amount) : undefined;
}, [amount]);
const inputFontSize = useMemo(() => (amount.length > 10 ? 20 : 36), [amount.length]);
const measureAmountText = displayAmount && displayAmount.length > 0 ? displayAmount : '0';
const inputTextAlign = useMemo((): 'left' | 'right' | 'center' => {
if (amount === BitcoinUnit.MAX) return 'center';
return unit === BitcoinUnit.LOCAL_CURRENCY ? 'left' : 'right';
}, [amount, unit]);
const secondaryDisplayCurrency = useMemo(() => {
if (amount === BitcoinUnit.MAX) {
return '';
@ -140,7 +175,6 @@ export const AmountInput: React.FC<AmountInputProps> = props => {
useEffect(() => {
(async () => {
if (await isRateOutdated()) {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
const recent = await mostRecentFetchedRate();
setOutdatedRefreshRate(recent);
}
@ -180,7 +214,6 @@ export const AmountInput: React.FC<AmountInputProps> = props => {
* here we must recalculate old amont value (which was denominated in `previousUnit`) to new denomination `newUnit`
* and fill this value in input box, so user can switch between, for example, 0.001 BTC <=> 100000 sats
*/
const log = `${amount}(${previousUnit}) ->`;
let sats: string = '0';
switch (previousUnit) {
case BitcoinUnit.BTC:
@ -199,7 +232,6 @@ export const AmountInput: React.FC<AmountInputProps> = props => {
}
const newInputValue = formatBalancePlain(+sats, newUnit, false);
console.log(`${log} ${sats}(sats) -> ${newInputValue}(${newUnit})`);
if (newUnit === BitcoinUnit.LOCAL_CURRENCY && previousUnit === BitcoinUnit.SATS) {
// we cache conversion, so when we will need reverse conversion there wont be a rounding error
@ -269,7 +301,7 @@ export const AmountInput: React.FC<AmountInputProps> = props => {
}, [maxSendableAmount]);
const handleSelectionChange = useCallback(
(event: NativeSyntheticEvent<TextInputSelectionChangeEventData>) => {
(event: TextInputSelectionChangeEvent) => {
const { selection } = event.nativeEvent;
if (selection.start !== selection.end || selection.start !== amount.length) {
textInputRef.current?.setNativeProps({ selection: { start: amount.length, end: amount.length } });
@ -278,40 +310,120 @@ export const AmountInput: React.FC<AmountInputProps> = props => {
[amount],
);
const stylesHook = StyleSheet.create({
center: { padding: amount === BitcoinUnit.MAX ? 0 : 15 },
localCurrency: { color: disabled ? colors.buttonDisabledTextColor : colors.alternativeTextColor2 },
input: { color: disabled ? colors.buttonDisabledTextColor : colors.alternativeTextColor2, fontSize: amount.length > 10 ? 20 : 36 },
cryptoCurrency: { color: disabled ? colors.buttonDisabledTextColor : colors.alternativeTextColor2 },
});
const isCryptoUnit = unit !== BitcoinUnit.LOCAL_CURRENCY;
const amountCharacters = useMemo(() => measureAmountText.split(''), [measureAmountText]);
const displayJustifyContent = useMemo((): 'flex-start' | 'flex-end' | 'center' => {
if (inputTextAlign === 'right') return 'flex-end';
if (inputTextAlign === 'left') return 'flex-start';
return 'center';
}, [inputTextAlign]);
const inputTextColor = disabled ? colors.buttonDisabledTextColor : colors.alternativeTextColor2;
const hiddenInputTextColor = Platform.OS === 'android' ? `${inputTextColor}00` : 'transparent';
const inputTypography = {
fontSize: inputFontSize,
lineHeight: Math.round(inputFontSize * 1.15),
minHeight: Math.round(inputFontSize * 1.15) + INPUT_VERTICAL_PADDING * 2,
textAlign: inputTextAlign,
...(isCryptoUnit && {
paddingLeft: INPUT_HORIZONTAL_PADDING + 4,
}),
};
const stylesHook = {
container: {
marginLeft: unit === BitcoinUnit.LOCAL_CURRENCY ? 0 : CRYPTO_CONTAINER_OFFSET,
},
localCurrency: { color: inputTextColor },
input: {
color: inputTextColor,
...inputTypography,
},
inputDisplay: {
justifyContent: displayJustifyContent,
...(isCryptoUnit && {
paddingLeft: INPUT_HORIZONTAL_PADDING + 4,
}),
},
inputGlyph: {
color: inputTextColor,
fontSize: inputTypography.fontSize,
lineHeight: inputTypography.lineHeight,
},
inputTransparent: {
color: hiddenInputTextColor,
},
cryptoCurrency: { color: inputTextColor },
};
return (
<Pressable accessibilityRole="button" accessibilityLabel={loc._.enter_amount} disabled={disabled} onPress={handleTextInputOnPress}>
<View style={styles.root}>
{!disabled && <View style={[styles.center, stylesHook.center]} />}
{!disabled && <View style={styles.sideRail} />}
<View style={styles.flex}>
<View style={styles.container}>
<View style={[styles.container, stylesHook.container]}>
{unit === BitcoinUnit.LOCAL_CURRENCY && amount !== BitcoinUnit.MAX && (
<Text style={[styles.localCurrency, stylesHook.localCurrency]}>{getCurrencySymbol() + ' '}</Text>
<Text style={[styles.localCurrency, stylesHook.localCurrency]}>{getCurrencySymbol()}</Text>
)}
{amount !== BitcoinUnit.MAX ? (
<TextInput
onSelectionChange={handleSelectionChange}
testID="BitcoinAmountInput"
keyboardType="numeric"
onChangeText={handleChangeText}
placeholder="0"
maxLength={maxLength}
ref={textInputRef}
editable={!isLoading && !disabled}
value={amount === BitcoinUnit.MAX ? loc.units.MAX : parseFloat(amount) >= 0 ? String(amount) : undefined}
placeholderTextColor={disabled ? colors.buttonDisabledTextColor : colors.alternativeTextColor2}
style={[styles.input, stylesHook.input]}
{...otherProps}
/>
<Animated.View layout={sizerLayoutTransition} style={styles.inputSizer}>
<Text
style={[styles.input, styles.inputMeasure, stylesHook.input, androidFontPaddingStyle]}
numberOfLines={1}
allowFontScaling={false}
accessible={false}
importantForAccessibility="no-hide-descendants"
>
{measureAmountText}
</Text>
<Animated.View layout={charLayoutTransition} style={[styles.inputDisplay, stylesHook.inputDisplay]} pointerEvents="none">
{amountCharacters.map((char, index) => (
<Animated.Text
key={index}
entering={charEntering}
exiting={charExiting}
layout={charLayoutTransition}
allowFontScaling={false}
style={[styles.inputGlyph, stylesHook.inputGlyph, androidFontPaddingStyle]}
>
{char}
</Animated.Text>
))}
</Animated.View>
<TextInput
{...otherProps}
allowFontScaling={false}
underlineColorAndroid="transparent"
onSelectionChange={handleSelectionChange}
testID="BitcoinAmountInput"
keyboardType="numeric"
onChangeText={handleChangeText}
placeholder="0"
maxLength={maxLength}
ref={textInputRef}
editable={!isLoading && !disabled}
value={displayAmount}
placeholderTextColor={inputTextColor}
cursorColor={inputTextColor}
selectionColor={inputTextColor}
style={[
styles.input,
styles.inputOverlay,
stylesHook.input,
stylesHook.inputTransparent,
androidFontPaddingStyle,
styleOverride,
]}
/>
</Animated.View>
) : (
<Pressable onPress={resetAmount} style={styles.maxPressable}>
<Text style={[styles.input, stylesHook.input]}>{BitcoinUnit.MAX}</Text>
<Text numberOfLines={1} style={[styles.input, styles.maxLabel, stylesHook.input]}>
{BitcoinUnit.MAX}
</Text>
{maxSendableAmount != null && (
<Text style={[styles.maxEstimate, stylesHook.localCurrency]} onLongPress={copyMaxEstimate}>
{(isMaxAmountEstimate ? '≈ ' : '') +
@ -323,7 +435,7 @@ export const AmountInput: React.FC<AmountInputProps> = props => {
</Pressable>
)}
{unit !== BitcoinUnit.LOCAL_CURRENCY && amount !== BitcoinUnit.MAX && (
<Text style={[styles.cryptoCurrency, stylesHook.cryptoCurrency]}>{' ' + loc.units[unit]}</Text>
<Text style={[styles.cryptoCurrency, stylesHook.cryptoCurrency]}>{loc.units[unit]}</Text>
)}
</View>
<View style={styles.secondaryRoot}>
@ -332,17 +444,20 @@ export const AmountInput: React.FC<AmountInputProps> = props => {
</Text>
</View>
</View>
{!disabled && amount !== BitcoinUnit.MAX && (
<TouchableOpacity
accessibilityRole="button"
accessibilityLabel={loc._.change_input_currency}
testID="changeAmountUnitButton"
style={styles.changeAmountUnit}
onPress={changeAmountUnit}
>
<Image source={require('../img/round-compare-arrows-24-px.png')} />
</TouchableOpacity>
)}
{!disabled &&
(amount !== BitcoinUnit.MAX ? (
<TouchableOpacity
accessibilityRole="button"
accessibilityLabel={loc._.change_input_currency}
testID="changeAmountUnitButton"
style={[styles.sideRail, styles.changeAmountUnit]}
onPress={changeAmountUnit}
>
<Image source={require('../img/round-compare-arrows-24-px.png')} />
</TouchableOpacity>
) : (
<View style={styles.sideRail} />
))}
</View>
{outdatedRefreshRate && (
<View style={styles.outdatedRateContainer}>
@ -355,7 +470,7 @@ export const AmountInput: React.FC<AmountInputProps> = props => {
accessibilityLabel={loc._.refresh}
onPress={updateRate}
disabled={isRateBeingUpdatedLocal}
style={isRateBeingUpdatedLocal ? styles.disabledButton : styles.enabledButon}
style={isRateBeingUpdatedLocal ? styles.disabledButton : undefined}
>
<Icon name="arrows-rotate" type="font-awesome-6" size={16} color={colors.buttonAlternativeTextColor} />
</TouchableOpacity>
@ -370,11 +485,15 @@ const styles = StyleSheet.create({
flexDirection: 'row',
justifyContent: 'space-between',
},
center: {
alignSelf: 'center',
},
flex: {
flex: 1,
overflow: 'visible',
},
sideRail: {
width: SWAP_ICON_SIZE,
alignItems: 'center',
justifyContent: 'center',
alignSelf: 'center',
},
spacing8: {
width: 8,
@ -388,9 +507,6 @@ const styles = StyleSheet.create({
disabledButton: {
opacity: 0.5,
},
enabledButon: {
opacity: 1,
},
outdatedRateContainer: {
flexDirection: 'row',
justifyContent: 'center',
@ -399,24 +515,55 @@ const styles = StyleSheet.create({
},
container: {
flexDirection: 'row',
alignItems: 'center',
alignContent: 'space-between',
justifyContent: 'center',
paddingTop: 16,
paddingBottom: 2,
overflow: 'visible',
},
localCurrency: {
fontSize: 18,
marginHorizontal: 4,
marginRight: 2,
fontWeight: 'bold',
alignSelf: 'center',
justifyContent: 'center',
},
inputSizer: {
maxWidth: MAX_INPUT_WIDTH,
position: 'relative',
overflow: 'visible',
},
input: {
fontWeight: 'bold',
margin: 0,
borderWidth: 0,
paddingHorizontal: INPUT_HORIZONTAL_PADDING,
paddingVertical: INPUT_VERTICAL_PADDING,
},
inputGlyph: {
fontWeight: 'bold',
margin: 0,
padding: 0,
},
inputMeasure: {
opacity: 0,
},
inputDisplay: {
...StyleSheet.absoluteFill,
flexDirection: 'row',
alignItems: 'center',
paddingHorizontal: INPUT_HORIZONTAL_PADDING,
paddingVertical: INPUT_VERTICAL_PADDING,
zIndex: 1,
},
inputOverlay: {
...StyleSheet.absoluteFill,
zIndex: 2,
},
cryptoCurrency: {
fontSize: 15,
marginHorizontal: 4,
marginLeft: 2,
fontWeight: '600',
alignSelf: 'center',
justifyContent: 'center',
@ -437,11 +584,12 @@ const styles = StyleSheet.create({
},
maxPressable: {
alignItems: 'center',
flexShrink: 0,
},
maxLabel: {
flexShrink: 0,
},
changeAmountUnit: {
alignSelf: 'center',
marginRight: 16,
paddingLeft: 16,
paddingVertical: 16,
},
});

View File

@ -1,93 +0,0 @@
/* eslint react/prop-types: "off", react-native/no-inline-styles: "off" */
import React, { useState } from 'react';
import { Keyboard, Pressable, StyleSheet, Text, View } from 'react-native';
import Icon from './Icon';
import loc from '../loc';
import { useTheme } from './themes';
interface IHash {
[key: string]: string;
}
type ArrowPickerProps = {
onChange: (key: string) => void;
items: IHash;
isItemUnknown: boolean;
};
export const ArrowPicker = (props: ArrowPickerProps) => {
const keys = Object.keys(props.items);
const [keyIndex, setKeyIndex] = useState(0);
const { colors } = useTheme();
const stylesHook = {
text: {
color: colors.foregroundColor,
},
};
return (
<View style={{ flexDirection: 'row', alignItems: 'center' }}>
<Pressable
accessibilityRole="button"
accessibilityLabel={loc.send.dynamic_prev}
onPress={() => {
Keyboard.dismiss();
let newIndex = keyIndex;
if (keyIndex <= 0) {
newIndex = keys.length - 1;
} else {
newIndex--;
}
setKeyIndex(newIndex);
props.onChange(keys[newIndex]);
}}
style={({ pressed }) => [
{
backgroundColor: pressed ? 'rgb(210, 230, 255)' : 'white',
},
styles.wrapperCustom,
]}
>
<Icon size={24} name="chevron-back" type="ionicons" />
</Pressable>
<View style={{ width: 200 }}>
<Text style={[styles.text, stylesHook.text]}>{props.isItemUnknown ? loc.send.fee_custom : keys[keyIndex]}</Text>
</View>
<Pressable
accessibilityRole="button"
accessibilityLabel={loc.send.dynamic_next}
onPress={() => {
Keyboard.dismiss();
let newIndex = keyIndex;
if (keyIndex + 1 >= keys.length) {
newIndex = 0;
} else {
newIndex++;
}
setKeyIndex(newIndex);
props.onChange(keys[newIndex]);
}}
style={({ pressed }) => [
{
backgroundColor: pressed ? 'rgb(210, 230, 255)' : 'white',
},
styles.wrapperCustom,
]}
>
<Icon size={24} name="chevron-forward" type="ionicons" />
</Pressable>
</View>
);
};
const styles = StyleSheet.create({
wrapperCustom: {
borderRadius: 8,
padding: 5,
marginLeft: 20,
marginRight: 20,
},
text: { fontWeight: 'bold', fontSize: 12, textAlign: 'center' },
});

View File

@ -4,13 +4,13 @@ import Icon, { type IconProps } from './Icon';
export interface AvatarProps {
rounded?: boolean;
size?: number;
containerStyle?: StyleProp<ViewStyle>;
size: number;
containerStyle: StyleProp<ViewStyle>;
icon?: Pick<IconProps, 'name' | 'type' | 'color' | 'size'>;
onPress?: () => void;
}
const Avatar: React.FC<AvatarProps> = ({ rounded, size = 40, containerStyle, icon, onPress }) => {
const Avatar: React.FC<AvatarProps> = ({ rounded, size, containerStyle, icon, onPress }) => {
const dimensionStyle = { width: size, height: size, borderRadius: rounded ? size / 2 : 0 } as ViewStyle;
const content = (
<View style={[styles.container, dimensionStyle, containerStyle]}>

View File

@ -5,11 +5,12 @@ export interface BadgeProps {
value?: string | number | React.ReactNode;
badgeStyle?: StyleProp<ViewStyle>;
textStyle?: StyleProp<TextStyle>;
testID?: string;
}
const Badge: React.FC<BadgeProps> = ({ value, badgeStyle, textStyle }) => {
const Badge: React.FC<BadgeProps> = ({ value, badgeStyle, textStyle, testID }) => {
return (
<View style={[styles.badge, badgeStyle]}>
<View testID={testID} style={[styles.badge, badgeStyle]}>
{typeof value === 'string' || typeof value === 'number' ? <Text style={[styles.text, textStyle]}>{value}</Text> : value}
</View>
);

View File

@ -0,0 +1,34 @@
import React, { forwardRef } from 'react';
import { Pressable, PressableProps, StyleSheet, Text } from 'react-native';
import { useTheme } from './themes';
interface BlueButtonLinkProps extends PressableProps {
title: string;
}
const BlueButtonLink = forwardRef<React.ElementRef<typeof Pressable>, BlueButtonLinkProps>((props, ref) => {
const { colors } = useTheme();
return (
<Pressable accessibilityRole="button" style={({ pressed }) => [styles.blueButtonLink, pressed && styles.pressed]} {...props} ref={ref}>
<Text style={[styles.blueButtonLinkText, { color: colors.foregroundColor }]}>{props.title}</Text>
</Pressable>
);
});
const styles = StyleSheet.create({
blueButtonLink: {
minWidth: 100,
minHeight: 36,
justifyContent: 'center',
},
blueButtonLinkText: {
textAlign: 'center',
fontSize: 16,
},
pressed: {
opacity: 0.6,
},
});
export default BlueButtonLink;

14
components/BlueCard.tsx Normal file
View File

@ -0,0 +1,14 @@
import React from 'react';
import { StyleSheet, View, ViewProps } from 'react-native';
const BlueCard: React.FC<ViewProps> = props => {
return <View {...props} style={styles.blueCard} />;
};
const styles = StyleSheet.create({
blueCard: {
padding: 20,
},
});
export default BlueCard;

View File

@ -0,0 +1,21 @@
import { useLocale } from '@react-navigation/native';
import React from 'react';
import { StyleSheet, Text, TextProps } from 'react-native';
import { useTheme } from './themes';
const BlueFormLabel: React.FC<TextProps> = props => {
const { colors } = useTheme();
const { direction } = useLocale();
return <Text {...props} style={[styles.blueFormLabel, { color: colors.foregroundColor, writingDirection: direction }]} />;
};
const styles = StyleSheet.create({
blueFormLabel: {
fontWeight: '400',
marginHorizontal: 20,
},
});
export default BlueFormLabel;

View File

@ -0,0 +1,50 @@
import React from 'react';
import { Platform, StyleSheet, TextInput, TextInputProps } from 'react-native';
import { useTheme } from './themes';
const BlueFormMultiInput: React.FC<TextInputProps> = props => {
const { colors } = useTheme();
const { style, editable, ...restProps } = props;
return (
<TextInput
multiline
underlineColorAndroid="transparent"
numberOfLines={4}
editable={editable}
style={[
styles.blueFormMultiInput,
{
borderColor: colors.formBorder,
borderBottomColor: colors.formBorder,
backgroundColor: colors.inputBackgroundColor,
color: colors.foregroundColor,
},
style,
]}
autoCorrect={false}
autoCapitalize="none"
spellCheck={false}
{...restProps}
selectTextOnFocus={false}
keyboardType={Platform.OS === 'android' ? 'visible-password' : 'default'}
/>
);
};
const styles = StyleSheet.create({
blueFormMultiInput: {
paddingHorizontal: 8,
paddingVertical: 16,
flex: 1,
marginTop: 5,
marginHorizontal: 20,
borderWidth: 1,
borderBottomWidth: 0.5,
borderRadius: 4,
textAlignVertical: 'top',
},
});
export default BlueFormMultiInput;

62
components/BlueText.tsx Normal file
View File

@ -0,0 +1,62 @@
import { useLocale } from '@react-navigation/native';
import React from 'react';
import { StyleSheet, Text, TextProps } from 'react-native';
import { useTheme } from './themes';
interface BlueTextProps extends TextProps {
bold?: boolean;
h1?: boolean;
h2?: boolean;
h3?: boolean;
h4?: boolean;
}
const BlueText: React.FC<BlueTextProps> = ({ bold = false, h1, h2, h3, h4, style: passedStyle, ...props }) => {
const { colors } = useTheme();
const { direction } = useLocale();
let headingStyle = {};
if (h1) {
headingStyle = styles.h1;
} else if (h2) {
headingStyle = styles.h2;
} else if (h3) {
headingStyle = styles.h3;
} else if (h4) {
headingStyle = styles.h4;
}
const hasHeading = h1 || h2 || h3 || h4;
const style = StyleSheet.compose(
{
color: colors.foregroundColor,
writingDirection: direction,
fontWeight: hasHeading ? undefined : bold ? 'bold' : 'normal',
...headingStyle,
},
passedStyle,
);
return <Text style={style} {...props} />;
};
const styles = StyleSheet.create({
h1: {
fontSize: 40,
fontWeight: 'bold',
},
h2: {
fontSize: 34,
fontWeight: 'bold',
},
h3: {
fontSize: 28,
fontWeight: 'bold',
},
h4: {
fontSize: 22,
fontWeight: 'bold',
},
});
export default BlueText;

View File

@ -0,0 +1,17 @@
import React from 'react';
import { StyleSheet, Text, TextProps } from 'react-native';
import { useTheme } from './themes';
const BlueTextCentered: React.FC<TextProps> = props => {
const { colors } = useTheme();
return <Text {...props} style={[styles.blueTextCentered, { color: colors.foregroundColor }]} />;
};
const styles = StyleSheet.create({
blueTextCentered: {
textAlign: 'center',
},
});
export default BlueTextCentered;

View File

@ -220,7 +220,11 @@ export const SettingsProvider: React.FC<{ children: React.ReactNode }> = React.m
useEffect(() => {
if (walletsInitialized) {
isElectrumDisabled ? BlueElectrum.forceDisconnect() : BlueElectrum.connectMain();
if (isElectrumDisabled) {
BlueElectrum.forceDisconnect();
} else {
BlueElectrum.ensureConnected({ showAlertOnFailure: true });
}
}
}, [isElectrumDisabled, walletsInitialized]);

View File

@ -1,13 +1,14 @@
import React, { createContext, useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { AppState, AppStateStatus, LayoutAnimation } from 'react-native';
import { BlueApp as BlueAppClass, TCounterpartyMetadata, TTXMetadata } from '../../class/blue-app';
import { LegacyWallet } from '../../class/wallets/legacy-wallet';
import { LightningArkWallet } from '../../class/wallets/lightning-ark-wallet';
import { WatchOnlyWallet } from '../../class/wallets/watch-only-wallet';
import type { TWallet } from '../../class/wallets/types';
import presentAlert from '../../components/Alert';
import loc, { formatBalanceWithoutSuffix } from '../../loc';
import * as BlueElectrum from '../../blue_modules/BlueElectrum';
import triggerHapticFeedback, { HapticFeedbackTypes } from '../../blue_modules/hapticFeedback';
import { registerArkBackgroundTask, stopArkBackgroundTask } from '../../blue_modules/arkade-background';
import { startAndDecrypt } from '../../blue_modules/start-and-decrypt';
import { isNotificationsEnabled, majorTomToGroundControl, unsubscribe } from '../../blue_modules/notifications';
import { BitcoinUnit } from '../../models/bitcoinUnits';
@ -175,6 +176,15 @@ export const StorageProvider = ({ children }: { children: React.ReactNode }) =>
const deleteWallet = useCallback((wallet: TWallet) => {
BlueApp.deleteWallet(wallet);
setWallets([...BlueApp.getWallets()]);
if (wallet.type === LightningArkWallet.type) {
// Fire-and-forget: cleans up the per-wallet Arkade Realm (close + delete files)
// and the Keychain encryption key. Errors stay scoped to the Ark wallet path
// and never block deletion.
(wallet as LightningArkWallet).onDelete().catch(e => console.warn('[StorageProvider] Ark wallet cleanup failed:', e?.message ?? e));
if (!BlueApp.getWallets().some(w => w.type === LightningArkWallet.type)) {
stopArkBackgroundTask().catch(e => console.warn('[StorageProvider] Ark background task stop failed:', e?.message ?? e));
}
}
}, []);
const handleWalletDeletion = useCallback(
@ -308,7 +318,11 @@ export const StorageProvider = ({ children }: { children: React.ReactNode }) =>
if (walletsInitialized) {
txMetadata.current = BlueApp.tx_metadata;
counterpartyMetadata.current = BlueApp.counterparty_metadata;
setWallets(BlueApp.getWallets());
const loaded = BlueApp.getWallets();
setWallets(loaded);
if (loaded.some(w => w.type === LightningArkWallet.type)) {
registerArkBackgroundTask().catch(e => console.warn('[StorageProvider] Ark background task register failed:', e?.message ?? e));
}
}
}, [walletsInitialized]);
@ -331,20 +345,22 @@ export const StorageProvider = ({ children }: { children: React.ReactNode }) =>
console.debug('[refreshAllWalletTransactions] Setting wallet transaction status to ALL');
setWalletTransactionUpdateStatus(WalletTransactionsStatus.ALL);
}
console.debug('[refreshAllWalletTransactions] Ensuring Electrum connection (ping / reconnect if stale)...');
await BlueElectrum.ensureElectrumConnection();
console.debug('[refreshAllWalletTransactions] Waiting for connectivity...');
await BlueElectrum.waitTillConnected();
// `ensureConnected()` ping-checks the existing socket and, only if needed,
// tears it down and reconnects. Replaces the old wait+ping+wait pattern
// which surfaced false "network error" alerts after iOS suspend/resume.
const connected = await BlueElectrum.ensureConnected();
if (!connected) {
console.log('[refreshAllWalletTransactions] could not establish Electrum connection, aborting refresh');
return;
}
console.debug('[refreshAllWalletTransactions] Connected to Electrum');
// Race only the post-connect work. `waitTillConnected` can take up to
// WAIT_TILL_CONNECTED_MAX_WALL_MS_NEVER (+ a second wait); starting the timer earlier caused refresh to abort
// while Electrum was still legitimately connecting.
const REFRESH_FETCH_PHASE_TIMEOUT_MS = Math.max(
120_000,
BlueElectrum.WAIT_TILL_CONNECTED_MAX_WALL_MS_NEVER + BlueElectrum.WAIT_TILL_CONNECTED_MAX_WALL_MS_AFTER_FIRST,
);
// Race only the post-connect work. We budget ample time so that a slow
// initial Electrum connection (cold start, slow TLS, flaky network) doesn't
// cause the fetch race to abort prematurely.
const REFRESH_FETCH_PHASE_TIMEOUT_MS = Math.max(120_000, BlueElectrum.ENSURE_CONNECTED_MAX_WALL_MS * 2);
const timeoutPromise = new Promise<never>(
(_resolve, reject) =>
(refreshTimeout = setTimeout(() => {
@ -403,52 +419,6 @@ export const StorageProvider = ({ children }: { children: React.ReactNode }) =>
[saveToDisk],
);
const refreshAllWalletTransactionsRef = useRef(refreshAllWalletTransactions);
refreshAllWalletTransactionsRef.current = refreshAllWalletTransactions;
useEffect(() => {
if (!walletsInitialized) return;
let wasInBackground = false;
let debounceTimer: ReturnType<typeof setTimeout> | null = null;
const DEBOUNCE_MS = 1200;
const onAppStateChange = (next: AppStateStatus) => {
if (next === 'background') {
wasInBackground = true;
}
if (next !== 'active') {
if (debounceTimer) {
clearTimeout(debounceTimer);
debounceTimer = null;
}
return;
}
if (!wasInBackground) return;
wasInBackground = false;
if (debounceTimer) clearTimeout(debounceTimer);
debounceTimer = setTimeout(() => {
debounceTimer = null;
(async () => {
if (AppState.currentState !== 'active') return;
if (await BlueElectrum.isDisabled()) return;
await refreshAllWalletTransactionsRef.current(undefined, false);
})().catch(() => {
/* refresh logs errors internally */
});
}, DEBOUNCE_MS);
};
const subscription = AppState.addEventListener('change', onAppStateChange);
return () => {
subscription.remove();
if (debounceTimer) clearTimeout(debounceTimer);
};
}, [walletsInitialized]);
const fetchAndSaveWalletTransactions = useCallback(
async (walletID: string) => {
const index = wallets.findIndex(wallet => wallet.getID() === walletID);
@ -460,8 +430,11 @@ export const StorageProvider = ({ children }: { children: React.ReactNode }) =>
}
_lastTimeTriedToRefetchWallet[walletID] = Date.now();
await BlueElectrum.ensureElectrumConnection();
await BlueElectrum.waitTillConnected();
const connected = await BlueElectrum.ensureConnected();
if (!connected) {
console.log('[fetchAndSaveWalletTransactions] could not establish Electrum connection, aborting');
return;
}
setWalletTransactionUpdateStatus(walletID);
const balanceStart = Date.now();
@ -495,6 +468,9 @@ export const StorageProvider = ({ children }: { children: React.ReactNode }) =>
if (w.getLabel() === emptyWalletLabel) w.setLabel(loc.wallets.import_imported + ' ' + w.typeReadable);
w.setUserHasSavedExport(true);
addWallet(w);
if (w instanceof LightningArkWallet) {
registerArkBackgroundTask().catch(e => console.warn('[StorageProvider] Ark background task register failed:', e?.message ?? e));
}
if (getScanWasBBQR()) {
// to avoid proxying `useBBQR` through a bunch of screens during import procedure, we use a trick:
// on add-wallet screen we reset `lastScanWasBBQR` to false. then potentially user scans QR in BBQR format
@ -533,7 +509,6 @@ export const StorageProvider = ({ children }: { children: React.ReactNode }) =>
text: loc.wallets.details_delete,
onPress: () => {
triggerHapticFeedback(HapticFeedbackTypes.NotificationSuccess);
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
onConfirmed();
},
style: 'destructive',

View File

@ -3,7 +3,7 @@ import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo
import { StyleSheet, Text, TextProps, TextStyle, TouchableOpacity, View, ViewStyle } from 'react-native';
import triggerHapticFeedback, { HapticFeedbackTypes } from '../blue_modules/hapticFeedback';
import { BlueText } from '../BlueComponents';
import BlueText from './BlueText';
import loc from '../loc';
import { useTheme } from './themes';

View File

@ -1,7 +1,7 @@
import React from 'react';
import { InputAccessoryView, Keyboard, Platform, StyleSheet, View } from 'react-native';
import { useTheme } from './themes';
import { BlueButtonLink } from '../BlueComponents';
import BlueButtonLink from './BlueButtonLink';
import loc from '../loc';
export const DismissKeyboardInputAccessoryViewID = 'DismissKeyboardInputAccessory';

View File

@ -1,6 +1,6 @@
import React from 'react';
import { InputAccessoryView, Keyboard, Platform, StyleSheet, View } from 'react-native';
import { BlueButtonLink } from '../BlueComponents';
import BlueButtonLink from './BlueButtonLink';
import loc from '../loc';
import { useTheme } from './themes';
import Clipboard from '@react-native-clipboard/clipboard';

View File

@ -1,5 +1,5 @@
import React, { Component } from 'react';
import { Dimensions, LayoutAnimation, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
import { Dimensions, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
import { encodeUR } from '../blue_modules/ur';
import { BlueCurrentTheme } from '../components/themes';
@ -159,7 +159,6 @@ export class DynamicQRCode extends Component<DynamicQRCodeProps, DynamicQRCodeSt
accessibilityRole="button"
testID="DynamicCode"
onPress={() => {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
this.setState(prevState => ({ hideControls: !prevState.hideControls }));
}}
>

View File

@ -52,7 +52,14 @@ const useFloatButtonAnimation = (initialHeight: number) => {
};
};
const useFloatButtonLayout = (width: number, sizeClass: SizeClass) => {
const getScaledButtonHeight = (fontScale: number): number => Math.round(LAYOUT.BUTTON_HEIGHT * fontScale);
/** Scroll padding so list content clears float buttons (excludes safe-area inset). Default 70 at fontScale 1. */
const FLOAT_BUTTON_LIST_CLEARANCE = 18;
export const getFloatingButtonReservedHeight = (fontScale = 1): number => getScaledButtonHeight(fontScale) + FLOAT_BUTTON_LIST_CLEARANCE;
const useFloatButtonLayout = (width: number, sizeClass: SizeClass, fontScale: number) => {
const lastVerticalDecision = useRef(false);
const shouldUseVerticalLayout = useCallback(
@ -152,15 +159,19 @@ const useFloatButtonLayout = (width: number, sizeClass: SizeClass) => {
[width, sizeClass, shouldUseVerticalLayout],
);
const calculateContainerHeight = useCallback((childrenCount: number, isVerticalLayout: boolean) => {
if (!isVerticalLayout) return { height: '8%', minHeight: LAYOUT.BUTTON_HEIGHT };
const calculateContainerHeight = useCallback(
(childrenCount: number, isVerticalLayout: boolean) => {
const buttonHeight = getScaledButtonHeight(fontScale);
if (!isVerticalLayout) return { height: '8%', minHeight: buttonHeight };
const totalButtonsHeight = childrenCount * LAYOUT.BUTTON_HEIGHT;
const totalMarginsHeight = (childrenCount - 1) * LAYOUT.BUTTON_MARGIN;
const calculatedHeight = totalButtonsHeight + totalMarginsHeight;
const totalButtonsHeight = childrenCount * buttonHeight;
const totalMarginsHeight = (childrenCount - 1) * LAYOUT.BUTTON_MARGIN;
const calculatedHeight = totalButtonsHeight + totalMarginsHeight;
return { height: calculatedHeight };
}, []);
return { height: calculatedHeight };
},
[fontScale],
);
const calculateButtonFontSize = useMemo(() => {
const divisor = sizeClass === SizeClass.Large ? 22 : sizeClass === SizeClass.Regular ? 24 : 28;
@ -267,6 +278,7 @@ interface FButtonProps {
isVertical?: boolean;
borderRadius?: number;
fontSize?: number;
buttonHeight?: number;
disabled?: boolean;
testID?: string;
onPress: () => void;
@ -277,13 +289,14 @@ interface ButtonContentProps {
icon: ReactNode;
text: string;
textStyle: StyleProp<TextStyle>;
buttonHeight: number;
}
const getScaledIconSize = (fontSize: number): number => {
return Math.max(Math.round(fontSize * 1.2), 16);
};
const ButtonContent = ({ icon, text, textStyle }: ButtonContentProps) => {
const ButtonContent = ({ icon, text, textStyle, buttonHeight }: ButtonContentProps) => {
const computedStyle = StyleSheet.flatten(textStyle);
const fontSize = computedStyle.fontSize || LAYOUT.MAX_BUTTON_FONT_SIZE;
const iconSize = getScaledIconSize(Number(fontSize));
@ -307,9 +320,14 @@ const ButtonContent = ({ icon, text, textStyle }: ButtonContentProps) => {
}
return (
<View style={buttonContentStaticStyles.contentContainer}>
<View style={[buttonContentStaticStyles.contentContainer, { minHeight: buttonHeight }]}>
<View style={buttonStyles.iconContainer}>{scaledIcon}</View>
<Text numberOfLines={1} adjustsFontSizeToFit style={[textStyle, buttonStyles.centeredText, { lineHeight: fontSize * 1.2 }]}>
<Text
numberOfLines={1}
adjustsFontSizeToFit
minimumFontScale={0.8}
style={[textStyle, buttonStyles.centeredText, { lineHeight: fontSize * 1.2 }]}
>
{text}
</Text>
</View>
@ -325,6 +343,7 @@ export const FButton = ({
isVertical,
borderRadius = LAYOUT.PILL_BORDER_RADIUS,
fontSize = LAYOUT.MAX_BUTTON_FONT_SIZE,
buttonHeight = LAYOUT.BUTTON_HEIGHT,
testID,
...props
}: FButtonProps) => {
@ -347,6 +366,8 @@ export const FButton = ({
return {
root: {
...baseStyles,
height: buttonHeight,
minHeight: buttonHeight,
backgroundColor: colors.buttonBackgroundColor,
},
text: {
@ -360,7 +381,7 @@ export const FButton = ({
marginBottom: buttonContentStaticStyles.marginBottom,
textBase: buttonContentStaticStyles.textBase,
};
}, [colors, fontSize]);
}, [colors, fontSize, buttonHeight]);
const style: Record<string, any> = {};
const additionalStyles = !last ? (isVertical ? customButtonStyles.marginBottom : customButtonStyles.marginRight) : {};
@ -397,7 +418,7 @@ export const FButton = ({
style={[buttonStyles.root, customButtonStyles.root, style, { borderRadius }]}
{...props}
>
<ButtonContent icon={icon} text={text} textStyle={textStyle} />
<ButtonContent icon={icon} text={text} textStyle={textStyle} buttonHeight={buttonHeight} />
</TouchableOpacity>
</Animated.View>
);
@ -405,8 +426,9 @@ export const FButton = ({
export const FContainer = forwardRef<View, FContainerProps>((props, ref) => {
const insets = useSafeAreaInsets();
const { height, width } = useWindowDimensions();
const { height, width, fontScale } = useWindowDimensions();
const { sizeClass } = useSizeClass();
const scaledButtonHeight = getScaledButtonHeight(fontScale);
const childrenCount = React.Children.toArray(props.children).filter(Boolean).length;
@ -419,6 +441,7 @@ export const FContainer = forwardRef<View, FContainerProps>((props, ref) => {
const { calculateButtonWidth, calculateVisualParameters, calculateContainerHeight, buttonFontSize } = useFloatButtonLayout(
width,
sizeClass,
fontScale,
);
// Compute initial geometry up-front so the slide-in animation starts at the final (computed) size,
@ -508,7 +531,7 @@ export const FContainer = forwardRef<View, FContainerProps>((props, ref) => {
useEffect(() => {
debouncedCalculateLayout();
}, [debouncedCalculateLayout, width, height, childrenCount, sizeClass]);
}, [debouncedCalculateLayout, width, height, childrenCount, sizeClass, fontScale]);
const onLayout = (event: { nativeEvent: { layout: { width: number } } }) => {
const { width: currentLayoutWidth } = event.nativeEvent.layout;
@ -545,6 +568,7 @@ export const FContainer = forwardRef<View, FContainerProps>((props, ref) => {
isVertical,
borderRadius: buttonBorderRadius,
fontSize: buttonFontSize,
buttonHeight: scaledButtonHeight,
});
};
@ -561,10 +585,10 @@ export const FContainer = forwardRef<View, FContainerProps>((props, ref) => {
props.inline ? containerStyles.rootInline : containerStyles.rootAbsolute,
bottomInsets,
effectiveNewWidth ? (isVertical ? containerStyles.rootPostVertical : containerStyles.rootPost) : containerStyles.rootPre,
isVertical ? containerHeight : null,
isVertical ? containerHeight : { minHeight: scaledButtonHeight },
{ transform: [{ translateY: slideAnimation }] },
],
[props.inline, bottomInsets, effectiveNewWidth, isVertical, containerHeight, slideAnimation],
[props.inline, bottomInsets, effectiveNewWidth, isVertical, containerHeight, slideAnimation, scaledButtonHeight],
);
return (

View File

@ -4,13 +4,13 @@ import { StyleSheet, Text, TouchableOpacity } from 'react-native';
import { useTheme } from './themes';
interface HeaderRightButtonProps {
disabled?: boolean;
disabled: boolean;
onPress?: () => void;
title: string;
testID?: string;
}
const HeaderRightButton: React.FC<HeaderRightButtonProps> = ({ disabled = true, onPress, title, testID }) => {
const HeaderRightButton: React.FC<HeaderRightButtonProps> = ({ disabled, onPress, title, testID }) => {
const { colors } = useTheme();
const opacity = disabled ? 0.5 : 1;
return (

View File

@ -1,6 +1,6 @@
import React from 'react';
import { InputAccessoryView, Keyboard, Platform, StyleSheet, Text, View } from 'react-native';
import { BlueButtonLink } from '../BlueComponents';
import BlueButtonLink from './BlueButtonLink';
import loc from '../loc';
import { BitcoinUnit } from '../models/bitcoinUnits';
import { useTheme } from './themes';

View File

@ -1,24 +1,30 @@
import React, { useMemo } from 'react';
import { Pressable, StyleProp, StyleSheet, Switch, SwitchProps, Text, TextStyle, View, ViewStyle } from 'react-native';
import { Pressable, StyleProp, StyleSheet, Switch, SwitchProps, Text, TextStyle, useWindowDimensions, View, ViewStyle } from 'react-native';
import { useLocale } from '@react-navigation/native';
import Icon from './Icon';
import { useTheme } from './themes';
/** Base row height for transaction list `getItemLayout` (padding + title + subtitle at fontScale 1). */
export const TX_ROW_BASE_HEIGHT = 64;
interface ListItemProps {
leftAvatar?: React.JSX.Element;
containerStyle?: StyleProp<ViewStyle>;
noFeedback?: boolean;
bottomDivider?: boolean;
testID?: string;
switchTestID?: string;
onPress?: () => void;
disabled?: boolean;
switch?: SwitchProps;
title: string;
titleStyle?: StyleProp<TextStyle>;
subtitle?: string | React.ReactNode;
subtitleNumberOfLines?: number;
rightTitle?: string;
rightTitleStyle?: StyleProp<TextStyle>;
rightTitleSelectable?: boolean;
rightSubtitle?: string | React.ReactNode;
rightSubtitleStyle?: StyleProp<TextStyle>;
chevron?: boolean;
@ -33,14 +39,17 @@ const ListItem: React.FC<ListItemProps> = React.memo(
noFeedback = false,
bottomDivider = true,
testID,
switchTestID,
onPress,
disabled,
switch: switchProps,
title,
titleStyle,
subtitle,
subtitleNumberOfLines,
rightTitle,
rightTitleStyle,
rightTitleSelectable,
rightSubtitle,
rightSubtitleStyle,
chevron,
@ -49,12 +58,20 @@ const ListItem: React.FC<ListItemProps> = React.memo(
}: ListItemProps) => {
const { colors } = useTheme();
const { direction } = useLocale();
const { fontScale } = useWindowDimensions();
const isRtl = direction === 'rtl';
const contentRowStyle = useMemo(
() => ({
paddingVertical: Math.round(12 * fontScale),
}),
[fontScale],
);
const stylesHook = StyleSheet.create({
title: {
color: disabled ? colors.buttonDisabledTextColor : colors.foregroundColor,
fontSize: 16,
fontWeight: '500',
lineHeight: Math.round(22 * fontScale),
writingDirection: direction,
},
rightMemoText: {
@ -66,7 +83,7 @@ const ListItem: React.FC<ListItemProps> = React.memo(
color: colors.alternativeTextColor,
fontWeight: '400',
paddingVertical: switchProps ? 8 : 0,
lineHeight: 20,
lineHeight: Math.round(20 * fontScale),
fontSize: 14,
marginTop: 2,
},
@ -83,10 +100,11 @@ const ListItem: React.FC<ListItemProps> = React.memo(
const memoizedSwitchProps = useMemo(() => {
return switchProps ? { ...switchProps } : undefined;
}, [switchProps]);
const resolvedSwitchTestID = switchTestID ?? memoizedSwitchProps?.testID;
const enableFeedback = !noFeedback && !!onPress && !disabled;
const renderContent = () => (
<View style={styles.contentRow}>
<View style={[styles.contentRow, contentRowStyle]}>
{leftAvatar && (
<View style={styles.leftAvatarContainer}>
{leftAvatar}
@ -94,7 +112,7 @@ const ListItem: React.FC<ListItemProps> = React.memo(
</View>
)}
<View style={styles.content}>
<Text style={stylesHook.title} numberOfLines={0} accessibilityRole="text">
<Text style={[stylesHook.title, titleStyle]} numberOfLines={0} accessibilityRole="text">
{title}
</Text>
{subtitle ? (
@ -107,7 +125,14 @@ const ListItem: React.FC<ListItemProps> = React.memo(
{rightTitle || rightSubtitle ? (
<View style={styles.rightColumn}>
{rightTitle ? (
<Text style={rightTitleStyle} numberOfLines={1} accessibilityRole="text">
<Text
style={rightTitleStyle}
numberOfLines={1}
adjustsFontSizeToFit
minimumFontScale={0.75}
accessibilityRole="text"
selectable={rightTitleSelectable}
>
{rightTitle}
</Text>
) : null}
@ -124,7 +149,14 @@ const ListItem: React.FC<ListItemProps> = React.memo(
<Icon name={isRtl ? 'angle-left' : 'angle-right'} type="font-awesome" color={colors.alternativeTextColor} size={18} />
) : null}
{switchProps ? (
<Switch {...memoizedSwitchProps} accessibilityLabel={title} style={styles.margin16} accessible accessibilityRole="switch" />
<Switch
{...memoizedSwitchProps}
testID={resolvedSwitchTestID}
accessibilityLabel={title}
style={styles.margin16}
accessible
accessibilityRole="switch"
/>
) : null}
{checkmark ? (
<View style={styles.checkmarkContainer}>
@ -178,16 +210,20 @@ const styles = StyleSheet.create({
},
content: {
flex: 1,
flexShrink: 1,
minWidth: 0,
justifyContent: 'center',
},
leftAvatarContainer: {
flexDirection: 'row',
alignItems: 'center',
alignSelf: 'center',
},
rightColumn: {
marginStart: 8,
minWidth: 0,
flexShrink: 0,
alignItems: 'flex-end',
alignSelf: 'center',
},
rightMemoWrapper: {
flexShrink: 1,

View File

@ -153,6 +153,7 @@ const ManageWalletsListItem: React.FC<ManageWalletsListItemProps> = ({
]}
onPress={onToggle}
accessibilityRole="button"
testID={isHidden ? 'SwipeShowBalance' : 'SwipeHideBalance'}
>
<Text style={[styles.rightActionText, { color: colors.buttonTextColor }]}>
{isHidden ? loc.wallets.swipe_balance_show : loc.wallets.swipe_balance_hide}

View File

@ -14,7 +14,7 @@ type ErrorCorrectionLevel = 'H' | 'Q' | 'M' | 'L';
interface QRCodeProps {
value: string;
size?: number;
size: number;
isLogoRendered?: boolean;
isMenuAvailable?: boolean;
logoSize?: number;
@ -144,7 +144,7 @@ const getCachedPlan = (value: string, ecl: ErrorCorrectionLevel, size: number, i
const QRCode: React.FC<QRCodeProps> = ({
value = '',
size = 300,
size,
isLogoRendered = true,
isMenuAvailable = true,
logoSize = 90,
@ -216,24 +216,11 @@ const QRCode: React.FC<QRCodeProps> = ({
const gradFill = `url(#${GRADIENT_ID})`;
const finderShapes: React.ReactElement[] = [];
const outerR = 2 * cell;
const holeR = 1.25 * cell;
const dotR = 0.9 * cell;
finderOrigins.forEach(([fr, fc], i) => {
const x = (fc + 1) * cell;
const y = (fr + 1) * cell;
finderShapes.push(
<Rect
key={`finder-frame-${i}`}
testID="qr-finder-frame"
x={x}
y={y}
width={7 * cell}
height={7 * cell}
rx={outerR}
ry={outerR}
fill={gradFill}
/>,
<Rect key={`finder-frame-${i}`} testID="qr-finder-frame" x={x} y={y} width={7 * cell} height={7 * cell} fill={gradFill} />,
<Rect
key={`finder-hole-${i}`}
testID="qr-finder-hole"
@ -241,8 +228,6 @@ const QRCode: React.FC<QRCodeProps> = ({
y={y + cell}
width={5 * cell}
height={5 * cell}
rx={holeR}
ry={holeR}
fill={BACKGROUND}
/>,
<Rect
@ -252,8 +237,6 @@ const QRCode: React.FC<QRCodeProps> = ({
y={y + 2 * cell}
width={3 * cell}
height={3 * cell}
rx={dotR}
ry={dotR}
fill={gradFill}
/>,
);
@ -277,16 +260,7 @@ const QRCode: React.FC<QRCodeProps> = ({
{finderShapes}
{isLogoRendered && logoCells > 0 && (
<>
<Rect
testID="qr-logo-backdrop"
x={backdropX}
y={backdropY}
width={backdropSize}
height={backdropSize}
rx={cell * 0.5}
ry={cell * 0.5}
fill={LOGO_BACKGROUND}
/>
<Rect testID="qr-logo-backdrop" x={backdropX} y={backdropY} width={backdropSize} height={backdropSize} fill={LOGO_BACKGROUND} />
<SvgImage
testID="qr-logo-image"
href={require('../img/qr-code.png')}

View File

@ -1,7 +1,7 @@
import React, { useState, useEffect, useRef, useCallback } from 'react';
import { View, Text, TextInput, TouchableOpacity, Keyboard, StyleSheet } from 'react-native';
import AsyncStorage from '@react-native-async-storage/async-storage';
import { BlueText } from '../BlueComponents';
import BlueText from './BlueText';
import loc, { formatStringAddTwoWhiteSpaces } from '../loc';
import NetworkTransactionFees, { NetworkTransactionFee, NetworkTransactionFeeType } from '../models/networkTransactionFees';
import { useTheme } from './themes';
@ -67,26 +67,25 @@ const ReplaceFeeSuggestions: React.FC<ReplaceFeeSuggestionsProps> = ({ onFeeSele
}, []);
const handleFeeSelection = (feeType: NetworkTransactionFeeType) => {
if (feeType !== NetworkTransactionFeeType.CUSTOM) {
Keyboard.dismiss();
if (feeType === NetworkTransactionFeeType.CUSTOM) {
setSelectedFeeType(feeType);
return;
}
Keyboard.dismiss();
if (networkFees) {
let selectedFee: number;
switch (feeType) {
case NetworkTransactionFeeType.FAST:
selectedFee = networkFees.fastestFee;
onFeeSelected(networkFees.fastestFee);
break;
case NetworkTransactionFeeType.MEDIUM:
selectedFee = networkFees.mediumFee;
onFeeSelected(networkFees.mediumFee);
break;
case NetworkTransactionFeeType.SLOW:
selectedFee = networkFees.slowFee;
break;
case NetworkTransactionFeeType.CUSTOM:
selectedFee = Number(customFeeValue);
onFeeSelected(networkFees.slowFee);
break;
}
onFeeSelected(selectedFee);
setSelectedFeeType(feeType);
}
};
@ -94,7 +93,8 @@ const ReplaceFeeSuggestions: React.FC<ReplaceFeeSuggestionsProps> = ({ onFeeSele
const handleCustomFeeChange = (customFee: string) => {
const sanitizedFee = customFee.replace(/[^0-9]/g, '');
setCustomFeeValue(sanitizedFee);
handleFeeSelection(NetworkTransactionFeeType.CUSTOM);
onFeeSelected(Number(sanitizedFee));
setSelectedFeeType(NetworkTransactionFeeType.CUSTOM);
};
return (
@ -156,7 +156,10 @@ const ReplaceFeeSuggestions: React.FC<ReplaceFeeSuggestionsProps> = ({ onFeeSele
ref={customTextInput}
maxLength={9}
style={[styles.customFeeInput, stylesHook.customFeeInput]}
onFocus={() => handleCustomFeeChange(customFeeValue)}
onFocus={() => {
setSelectedFeeType(NetworkTransactionFeeType.CUSTOM);
onFeeSelected(Number(customFeeValue));
}}
placeholder={loc.send.fee_satvbyte}
placeholderTextColor="#81868e"
inputAccessoryViewID={DismissKeyboardInputAccessoryViewID}

View File

@ -7,10 +7,18 @@ import { useTheme } from './themes';
interface SafeAreaScrollViewProps extends ScrollViewProps {
floatingButtonHeight?: number;
headerHeight?: number; // Additional header height to account for (e.g., when headerTransparent is true)
disableDefaultTopPadding?: boolean;
}
const SafeAreaScrollView = forwardRef<ScrollView, SafeAreaScrollViewProps>((props, ref) => {
const { style, contentContainerStyle, floatingButtonHeight = 0, headerHeight = 0, ...otherProps } = props;
const {
style,
contentContainerStyle,
floatingButtonHeight = 0,
headerHeight = 0,
disableDefaultTopPadding = false,
...otherProps
} = props;
const { colors } = useTheme();
const insets = useSafeAreaInsets();
@ -32,7 +40,10 @@ const SafeAreaScrollView = forwardRef<ScrollView, SafeAreaScrollViewProps>((prop
if (headerHeight > 0) {
return headerHeight;
}
// iOS safe area or no status bar
if (disableDefaultTopPadding) {
return 0;
}
// Preserve legacy behavior for existing screens
return insets.top > 0 ? 5 : 0;
})(),
};
@ -48,7 +59,7 @@ const SafeAreaScrollView = forwardRef<ScrollView, SafeAreaScrollViewProps>((prop
// Now compose with contentContainerStyle to ensure passed styles override defaults
return StyleSheet.compose(basePadding, contentContainerStyle);
}, [insets, contentContainerStyle, floatingButtonHeight, headerHeight]);
}, [insets, contentContainerStyle, floatingButtonHeight, headerHeight, disableDefaultTopPadding]);
return (
<ScrollView

View File

@ -10,7 +10,8 @@ type SecondButtonProps = {
backgroundColor?: string;
disabled?: boolean;
icon?: IconButtonProps;
title?: string;
title: string;
textColor?: string;
onPress?: () => void;
loading?: boolean;
testID?: string;
@ -19,7 +20,7 @@ type SecondButtonProps = {
export const SecondButton = forwardRef<React.ElementRef<typeof TouchableOpacity>, SecondButtonProps>((props, ref) => {
const { colors } = useTheme();
let backgroundColor = props.backgroundColor ? props.backgroundColor : colors.buttonGrayBackgroundColor;
let fontColor = colors.secondButtonTextColor;
let fontColor = props.textColor ?? colors.secondButtonTextColor;
if (props.disabled === true) {
backgroundColor = colors.buttonDisabledBackgroundColor;
fontColor = colors.buttonDisabledTextColor;

View File

@ -1,87 +0,0 @@
import React, { FC } from 'react';
import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
import { useTheme } from './themes';
export const StyledButtonType: Record<string, string> = { default: 'default', destroy: 'destroy', grey: 'grey' };
interface StyledButtonProps {
onPress: () => void;
text: string;
disabled?: boolean;
buttonStyle?: keyof typeof StyledButtonType;
}
const StyledButton: FC<StyledButtonProps> = ({ onPress, text, disabled = false, buttonStyle = StyledButtonType.default }) => {
const { colors } = useTheme();
const stylesHook = StyleSheet.create({
buttonGrey: {
backgroundColor: colors.lightButton,
},
textGray: {
color: colors.buttonTextColor,
},
container: {
opacity: disabled ? 0.5 : 1.0,
},
});
const textStyles = () => {
if (buttonStyle === StyledButtonType.grey) {
return stylesHook.textGray;
} else if (buttonStyle === StyledButtonType.destroy) {
return styles.textDestroy;
} else {
return styles.textDefault;
}
};
const buttonStyles = () => {
if (buttonStyle === StyledButtonType.grey) {
return stylesHook.buttonGrey;
} else if (buttonStyle === StyledButtonType.destroy) {
return styles.buttonDestroy;
} else {
return styles.buttonDefault;
}
};
return (
<TouchableOpacity accessibilityRole="button" onPress={onPress} disabled={disabled} style={stylesHook.container}>
<View style={[styles.buttonContainer, buttonStyles()]}>
<Text style={[styles.text, textStyles()]}>{text}</Text>
</View>
</TouchableOpacity>
);
};
const styles = StyleSheet.create({
buttonContainer: {
borderRadius: 9,
minHeight: 49,
paddingHorizontal: 8,
justifyContent: 'center',
alignItems: 'center',
flexDirection: 'row',
alignSelf: 'auto',
flexGrow: 1,
marginHorizontal: 4,
},
buttonDefault: {
backgroundColor: '#EBF2FB',
},
buttonDestroy: {
backgroundColor: '#FFF5F5',
},
text: {
fontWeight: '600',
fontSize: 15,
},
textDefault: {
color: '#1961B9',
},
textDestroy: {
color: '#D0021B',
},
});
export default StyledButton;

View File

@ -1,8 +1,7 @@
import React from 'react';
import { View, StyleSheet, ViewStyle } from 'react-native';
import { useTheme } from './themes';
import { BlueText } from '../BlueComponents';
import BlueText from './BlueText';
interface TipBoxProps {
number?: string;
title?: string;

View File

@ -89,13 +89,23 @@ const ToolTipMenu = (props: ToolTipMenuProps) => {
// Android gesture-cancel race documented above.
return (
<View
style={visibleStyle}
testID={testID}
accessibilityLabel={accessibilityLabel}
accessibilityHint={accessibilityHint}
accessibilityRole={accessibilityRole}
accessibilityState={accessibilityState}
>
{menu}
<ContextMenu
title={title}
previewBackgroundColor="transparent"
onPress={handlePressMenuItem}
actions={items}
dropdownMenuMode={!shouldOpenOnLongPress}
style={styles.menuFlex}
>
{children}
</ContextMenu>
</View>
);
}

View File

@ -1,5 +1,5 @@
import React, { useMemo, useCallback } from 'react';
import { TouchableOpacity, Text, StyleSheet, LayoutAnimation, View } from 'react-native';
import { TouchableOpacity, Text, StyleSheet, View, useWindowDimensions } from 'react-native';
import { useStorage } from '../hooks/context/useStorage';
import loc, { formatBalanceWithoutSuffix } from '../loc';
import { BitcoinUnit } from '../models/bitcoinUnits';
@ -22,6 +22,7 @@ const TotalWalletsBalance: React.FC = React.memo(() => {
setTotalBalancePreferredUnitStorage,
} = useSettings();
const { colors } = useTheme();
const { fontScale } = useWindowDimensions();
const totalBalanceFormatted = useMemo(() => {
const totalBalance = wallets.reduce((prev, curr) => {
@ -31,6 +32,22 @@ const TotalWalletsBalance: React.FC = React.memo(() => {
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [wallets, totalBalancePreferredUnit, preferredFiatCurrency]);
const scaledStyles = useMemo(
() => ({
container: {
paddingVertical: Math.round(8 * fontScale),
},
label: {
lineHeight: Math.round(18 * fontScale),
marginBottom: Math.round(2 * fontScale),
},
balance: {
lineHeight: Math.round(38 * Math.max(1, fontScale)),
},
}),
[fontScale],
);
const toolTipActions = useMemo(
() => [
{
@ -55,7 +72,6 @@ const TotalWalletsBalance: React.FC = React.memo(() => {
const onPressMenuItem = useCallback(
async (id: string) => {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
switch (id) {
case CommonToolTipActions.ViewInFiat.id:
await setTotalBalancePreferredUnitStorage(BitcoinUnit.LOCAL_CURRENCY);
@ -80,7 +96,6 @@ const TotalWalletsBalance: React.FC = React.memo(() => {
);
const handleBalanceOnPress = useCallback(async () => {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
const nextUnit =
totalBalancePreferredUnit === BitcoinUnit.BTC
? BitcoinUnit.SATS
@ -94,13 +109,20 @@ const TotalWalletsBalance: React.FC = React.memo(() => {
return (
<ToolTipMenu actions={toolTipActions} onPressMenuItem={onPressMenuItem} shouldOpenOnLongPress style={styles.menuContainer}>
<View style={styles.container}>
<Text style={styles.label}>{loc.wallets.total_balance}</Text>
<TouchableOpacity onPress={handleBalanceOnPress}>
<Text style={[styles.balance, { color: colors.foregroundColor }]}>
{totalBalanceFormatted}{' '}
<View style={[styles.container, scaledStyles.container]}>
<Text style={[styles.label, scaledStyles.label]} numberOfLines={1} adjustsFontSizeToFit minimumFontScale={0.8}>
{loc.wallets.total_balance}
</Text>
<TouchableOpacity onPress={handleBalanceOnPress} style={styles.balanceTouchable}>
<Text
style={[styles.balance, scaledStyles.balance, { color: colors.foregroundColor }]}
numberOfLines={1}
adjustsFontSizeToFit
minimumFontScale={0.55}
>
{totalBalanceFormatted}
{totalBalancePreferredUnit !== BitcoinUnit.LOCAL_CURRENCY && (
<Text style={[styles.currency, { color: colors.foregroundColor }]}>{totalBalancePreferredUnit}</Text>
<Text style={[styles.currency, { color: colors.foregroundColor }]}>{` ${totalBalancePreferredUnit}`}</Text>
)}
</Text>
</TouchableOpacity>
@ -118,6 +140,11 @@ const styles = StyleSheet.create({
alignItems: 'flex-start',
paddingHorizontal: 16,
paddingVertical: 8,
width: '100%',
},
balanceTouchable: {
alignSelf: 'stretch',
width: '100%',
},
label: {
fontSize: 14,
@ -127,6 +154,7 @@ const styles = StyleSheet.create({
balance: {
fontSize: 32,
fontWeight: 'bold',
lineHeight: 38,
},
currency: {
fontSize: 18,

View File

@ -1,8 +1,9 @@
import React, { memo, useCallback, useMemo, useRef } from 'react';
import AsyncStorage from '@react-native-async-storage/async-storage';
import Clipboard from '@react-native-clipboard/clipboard';
import { Animated, Easing, Linking, Pressable, Text, TextStyle, ViewStyle, StyleSheet, View } from 'react-native';
import { Animated, Easing, Linking, Pressable, Text, TextStyle, ViewStyle, StyleSheet, View, useWindowDimensions } from 'react-native';
import Lnurl from '../class/lnurl';
import { LightningArkWallet } from '../class/wallets/lightning-ark-wallet';
import { LightningTransaction, Transaction } from '../class/wallets/types';
import TransactionExpiredIcon from '../components/icons/TransactionExpiredIcon';
import TransactionIncomingIcon from '../components/icons/TransactionIncomingIcon';
@ -28,9 +29,6 @@ import { uint8ArrayToHex } from '../blue_modules/uint8array-extras';
import ListItem from './ListItem';
const styles = StyleSheet.create({
dateLine: {
fontSize: 13,
},
fullWidthButton: {
width: '100%',
alignSelf: 'stretch',
@ -105,7 +103,7 @@ const AnimatedPressableRow: React.FC<AnimatedPressableRowProps> = ({ onPress, ch
};
interface TransactionListItemProps {
itemPriceUnit?: BitcoinUnit;
itemPriceUnit: BitcoinUnit;
walletID: string;
item: Transaction & LightningTransaction; // using type intersection to have less issues with ts
searchQuery?: string;
@ -119,7 +117,7 @@ type NavigationProps = NativeStackNavigationProp<DetailViewStackParamList>;
const TransactionListItemComponent: React.FC<TransactionListItemProps> = ({
item,
itemPriceUnit = BitcoinUnit.BTC,
itemPriceUnit,
walletID,
searchQuery,
style,
@ -132,6 +130,7 @@ const TransactionListItemComponent: React.FC<TransactionListItemProps> = ({
const { txMetadata, counterpartyMetadata, wallets } = useStorage();
const { language, selectedBlockExplorer } = useSettings();
const insets = useSafeAreaInsets();
const { fontScale } = useWindowDimensions();
const containerStyle = useMemo(
() => ({
backgroundColor: colors.background,
@ -154,7 +153,30 @@ const TransactionListItemComponent: React.FC<TransactionListItemProps> = ({
const txMemo = (counterparty ? `[${shortenContactName(counterparty)}] ` : '') + (txMetadata[item.hash]?.memo ?? '');
const noteForCopy = (txMemo || item.memo || '').trim() || undefined;
// For LightningArkWallet rows, prepend a kind tag to the date subtitle. Such a
// wallet transacts entirely via Boltz swaps, so every row is Lightning; the
// only genuinely on-chain activity is onboarding/refill (boarding UTXOs),
// tagged from the synthetic `boarding-…` txid set in
// lightning-ark-wallet.getTransactions(). Other wallet types are unaffected.
const arkRowKind = useMemo<'Lightning' | 'Refill' | undefined>(() => {
const wallet = wallets.find(w => w.getID() === item.walletID);
if (wallet?.type !== LightningArkWallet.type) return undefined;
const txid = (item as { txid?: string }).txid;
if (txid?.startsWith('boarding-')) return 'Refill';
return 'Lightning';
}, [item, wallets]);
// A refill is "Pending" until the SDK settles its boarding UTXO into a VTXO
// (also when it enters the spendable balance). getTransactions() pass 2 tags
// those not-yet-settled rows with a `boarding-utxo-…` id; settled refills use
// `boarding-…` and render as a normal confirmed receive.
const isPendingRefill = useMemo(
() => arkRowKind === 'Refill' && !!(item as { txid?: string }).txid?.startsWith('boarding-utxo-'),
[arkRowKind, item],
);
const listTitleKey = useMemo((): 'pending' | 'sent' | 'received' => {
if (isPendingRefill) return 'pending';
if (item.category === 'receive' && item.confirmations! < 3) return 'pending';
if (item.type === 'bitcoind_tx') return item.value! < 0 ? 'sent' : 'received';
if (item.type === 'paid_invoice') return 'sent';
@ -164,7 +186,7 @@ const TransactionListItemComponent: React.FC<TransactionListItemProps> = ({
}
if (!item.confirmations) return 'pending';
return item.value! < 0 ? 'sent' : 'received';
}, [item.category, item.confirmations, item.type, item.value, item.ispaid]);
}, [isPendingRefill, item.category, item.confirmations, item.type, item.value, item.ispaid]);
const listTitle = useMemo(() => {
if (listTitleKey === 'pending') return loc.transactions.pending;
@ -175,11 +197,11 @@ const TransactionListItemComponent: React.FC<TransactionListItemProps> = ({
const isPending = listTitleKey === 'pending';
const dateLine = useMemo(() => {
if (isPending) return transactionTimeToReadable(item.timestamp);
return formatTransactionListDate(item.timestamp * 1000);
const formatted = isPending ? transactionTimeToReadable(item.timestamp) : formatTransactionListDate(item.timestamp * 1000);
return arkRowKind ? `${arkRowKind} · ${formatted}` : formatted;
// language in deps so date format updates when locale changes (formatters use global locale)
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isPending, item.timestamp, language]);
}, [isPending, item.timestamp, language, arkRowKind]);
const formattedAmount = useMemo(() => {
return formatBalanceWithoutSuffix(item.value, itemPriceUnit, true).toString();
@ -224,6 +246,7 @@ const TransactionListItemComponent: React.FC<TransactionListItemProps> = ({
color,
fontSize: 14,
fontWeight: '600' as TextStyle['fontWeight'],
lineHeight: Math.round(20 * fontScale),
textAlign: 'right',
paddingRight: insets.right,
paddingLeft: insets.left,
@ -238,9 +261,18 @@ const TransactionListItemComponent: React.FC<TransactionListItemProps> = ({
item.ispaid,
insets.right,
insets.left,
fontScale,
]);
const determineTransactionTypeAndAvatar = () => {
// A refill awaiting settlement: show it as pending, not as a completed receive.
if (isPendingRefill) {
return {
label: loc.transactions.pending_transaction,
icon: <TransactionPendingIcon />,
};
}
if (item.category === 'receive' && item.confirmations! < 3) {
return {
label: loc.transactions.pending_transaction,
@ -248,6 +280,14 @@ const TransactionListItemComponent: React.FC<TransactionListItemProps> = ({
};
}
// Recovered Arkade Lightning legs are bitcoind_tx but represent Boltz swaps,
// not on-chain transfers — render them with the off-chain (Lightning) icon.
if (arkRowKind === 'Lightning' && item.type === 'bitcoind_tx') {
return item.value! < 0
? { label: loc.transactions.offchain, icon: <TransactionOffchainIcon /> }
: { label: loc.transactions.incoming_transaction, icon: <TransactionOffchainIncomingIcon /> };
}
if (item.type && item.type === 'bitcoind_tx') {
return {
label: loc.transactions.onchain,
@ -321,7 +361,11 @@ const TransactionListItemComponent: React.FC<TransactionListItemProps> = ({
pop();
}
navigate('TransactionStatus', { hash: item.hash, walletID, tx: item });
} else if (item.type === 'user_invoice' || item.type === 'payment_request' || item.type === 'paid_invoice') {
} else if (item.type === 'user_invoice' || item.type === 'payment_request' || item.type === 'paid_invoice' || item.payment_request) {
// A settled Arkade swap is an enriched native Ark leg (type 'bitcoind_tx')
// carrying the swap's invoice payload (payment_request/hash/preimage). Route
// it to the Lightning invoice view by that payload, not by type — otherwise
// it falls through to the on-chain TransactionStatus branch below.
const lightningWallet = wallets.filter(wallet => wallet?.getID() === item.walletID);
if (lightningWallet.length === 1) {
try {
@ -352,15 +396,24 @@ const TransactionListItemComponent: React.FC<TransactionListItemProps> = ({
walletID: lightningWallet[0].getID(),
});
}
} else {
console.log('cant handle press');
} else if ((item as { txid?: string }).txid) {
// Hash-less Ark rows carry a synthetic `txid`. Native transfer legs
// (`ark-…`) open the hash-less-tolerant TransactionStatus detail. Refill
// rows (`boarding-…` / `boarding-utxo-…`) have no detail surface and are
// not tappable — matching master, where on-chain top-ups aren't tappable.
const txid = (item as { txid: string }).txid;
if (!txid.startsWith('boarding-')) {
navigate('TransactionStatus', { tx: item, hash: txid, walletID });
}
}
}, [item, renderHighlightedText, navigate, walletID, wallets, customOnPress, disableNavigation]);
const handleOnDetailsPress = useCallback(() => {
if (walletID && item && item.hash) {
navigate('TransactionStatus', { hash: item.hash, walletID, tx: item });
} else {
} else if (item.type === 'user_invoice' || item.type === 'payment_request' || item.type === 'paid_invoice' || item.payment_request) {
// Settled Arkade swaps carry invoice data on a 'bitcoind_tx' leg; route by
// payload so they open the Lightning invoice view (see onPress above).
const lightningWallet = wallets.find(wallet => wallet?.getID() === item.walletID);
if (lightningWallet) {
navigate('LNDViewInvoice', {
@ -368,6 +421,13 @@ const TransactionListItemComponent: React.FC<TransactionListItemProps> = ({
walletID: lightningWallet.getID(),
});
}
} else if ((item as { txid?: string }).txid) {
// Match the regular tap path for Ark non-swap rows: native transfer legs
// open TransactionStatus; refills (`boarding-…`) are not tappable (master).
const txid = (item as { txid: string }).txid;
if (!txid.startsWith('boarding-')) {
navigate('TransactionStatus', { tx: item, hash: txid, walletID });
}
}
}, [item, navigate, walletID, wallets]);
@ -449,7 +509,10 @@ const TransactionListItemComponent: React.FC<TransactionListItemProps> = ({
if (renderHighlightedText && searchQuery) {
const highlighted = renderHighlightedText(subtitle, searchQuery);
if (React.isValidElement(highlighted)) {
const highlightedElement = highlighted as React.ReactElement<{ numberOfLines?: number; style?: TextStyle | TextStyle[] }>;
const highlightedElement = highlighted as React.ReactElement<{
numberOfLines?: number;
style?: TextStyle | TextStyle[];
}>;
const existingStyle = highlightedElement.props?.style;
const mergedStyle: TextStyle[] = (
Array.isArray(existingStyle)
@ -486,7 +549,7 @@ const TransactionListItemComponent: React.FC<TransactionListItemProps> = ({
<ListItem
leftAvatar={avatar}
title={listTitle}
subtitle={<Text style={styles.dateLine}>{dateLine}</Text>}
subtitle={dateLine}
chevron={false}
rightTitle={rowTitle}
rightTitleStyle={rowTitleStyle}

View File

@ -1,8 +1,8 @@
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import Clipboard from '@react-native-clipboard/clipboard';
import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
import Animated, { useAnimatedStyle, useSharedValue, withSpring, withTiming } from 'react-native-reanimated';
import { Platform, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
import LinearGradient from 'react-native-linear-gradient';
import { useTheme } from './themes';
import { LightningArkWallet } from '../class/wallets/lightning-ark-wallet';
import { LightningCustodianWallet } from '../class/wallets/lightning-custodian-wallet';
import { MultisigHDWallet } from '../class/wallets/multisig-hd-wallet';
@ -14,36 +14,42 @@ import { FiatUnit } from '../models/fiatUnit';
import { BlurredBalanceView } from './BlurredBalanceView';
import { useSettings } from '../hooks/context/useSettings';
import ToolTipMenu from './TooltipMenu';
import useAnimateOnChange from '../hooks/useAnimateOnChange';
import { useLocale } from '@react-navigation/native';
import ActionSheet from '../screen/ActionSheet';
const HERO_BASE_BODY_MIN_HEIGHT = 120;
const HERO_MIN_BODY_HEIGHT = Math.round(HERO_BASE_BODY_MIN_HEIGHT * 1.2);
const HERO_BOTTOM_PADDING = 32;
const WALLET_LABEL_TOP_GAP = 32;
interface TransactionsNavigationHeaderProps {
wallet: TWallet;
unit: BitcoinUnit;
headerOverlayHeight: number;
onWalletUnitChange: (unit: BitcoinUnit) => void;
onManageFundsPressed?: (id?: string) => void;
onWalletBalanceVisibilityChange?: (isShouldBeVisible: boolean) => void;
onWalletBalanceVisibilityChange?: (shouldHideBalance: boolean) => void;
unitSwitching?: boolean;
}
const TransactionsNavigationHeader: React.FC<TransactionsNavigationHeaderProps> = ({
wallet,
headerOverlayHeight,
onWalletUnitChange,
onManageFundsPressed,
onWalletBalanceVisibilityChange,
unit = BitcoinUnit.BTC,
unitSwitching = false,
}) => {
const { colors } = useTheme();
const { hideBalance } = wallet;
const [allowOnchainAddress, setAllowOnchainAddress] = useState(false);
const isLightningWallet = wallet.type === LightningCustodianWallet.type || wallet.type === LightningArkWallet.type;
const [allowOnchainAddress, setAllowOnchainAddress] = useState(isLightningWallet);
const { preferredFiatCurrency } = useSettings();
const { direction } = useLocale();
const balanceOpacity = useSharedValue(1);
const balanceTranslateY = useSharedValue(0);
const previousBalance = useRef<string | undefined>(undefined);
const verifyIfWalletAllowsOnchainAddress = useCallback(() => {
if (wallet.type === LightningCustodianWallet.type || wallet.type === LightningArkWallet.type) {
if (isLightningWallet) {
wallet
.allowOnchainAddress()
.then((value: boolean) => setAllowOnchainAddress(value))
@ -52,7 +58,11 @@ const TransactionsNavigationHeader: React.FC<TransactionsNavigationHeaderProps>
setAllowOnchainAddress(false);
});
}
}, [wallet]);
}, [isLightningWallet, wallet]);
useEffect(() => {
setAllowOnchainAddress(isLightningWallet);
}, [isLightningWallet]);
useEffect(() => {
verifyIfWalletAllowsOnchainAddress();
@ -67,13 +77,14 @@ const TransactionsNavigationHeader: React.FC<TransactionsNavigationHeaderProps>
const handleBalanceVisibility = useCallback(() => {
onWalletBalanceVisibilityChange?.(!hideBalance);
}, [onWalletBalanceVisibilityChange, hideBalance]);
}, [hideBalance, onWalletBalanceVisibilityChange]);
const changeWalletBalanceUnit = () => {
if (hideBalance) {
return;
}
let newWalletPreferredUnit = wallet.getPreferredBalanceUnit();
console.debug('[UnitSwitch/UI] tap unit change', { walletID: wallet.getID?.(), current: newWalletPreferredUnit });
if (newWalletPreferredUnit === BitcoinUnit.BTC) {
newWalletPreferredUnit = BitcoinUnit.SATS;
} else if (newWalletPreferredUnit === BitcoinUnit.SATS) {
@ -82,7 +93,6 @@ const TransactionsNavigationHeader: React.FC<TransactionsNavigationHeaderProps>
newWalletPreferredUnit = BitcoinUnit.BTC;
}
console.debug('[UnitSwitch/UI] next unit resolved', { walletID: wallet.getID?.(), next: newWalletPreferredUnit });
onWalletUnitChange(newWalletPreferredUnit);
};
@ -97,29 +107,34 @@ const TransactionsNavigationHeader: React.FC<TransactionsNavigationHeaderProps>
const onPressMenuItem = useCallback(
(id: string) => {
if (id === 'walletBalanceVisibility') {
if (id === actionKeys.WalletBalanceVisibility) {
handleBalanceVisibility();
} else if (id === 'copyToClipboard') {
} else if (id === actionKeys.CopyToClipboard) {
handleCopyPress();
}
},
[handleBalanceVisibility, handleCopyPress],
);
const toolTipActions = useMemo(() => {
return [
// The Manage Funds menu is presented via a JS ActionSheet rather than the
// native context menu (ToolTipMenu): react-native-context-menu-view is
// Paper-only and, routed through Fabric's legacy interop on the New
// Architecture, its host view gets mispositioned to the header origin —
// overlapping the wallet label. A plain TouchableOpacity + ActionSheet lays
// out correctly (same pattern as the Multisig button below).
const showManageFundsActionSheet = useCallback(() => {
ActionSheet.showActionSheetWithOptions(
{
id: actionKeys.Refill,
text: loc.lnd.refill,
icon: actionIcons.Refill,
title: loc.lnd.title,
options: [loc._.cancel, loc.lnd.refill, loc.lnd.refill_external],
cancelButtonIndex: 0,
},
{
id: actionKeys.RefillWithExternalWallet,
text: loc.lnd.refill_external,
icon: actionIcons.RefillWithExternalWallet,
buttonIndex => {
if (buttonIndex === 1) handleManageFundsPressed(actionKeys.Refill);
else if (buttonIndex === 2) handleManageFundsPressed(actionKeys.RefillWithExternalWallet);
},
];
}, []);
);
}, [handleManageFundsPressed]);
const currentBalance = wallet ? wallet.getBalance() : 0;
const formattedBalance = useMemo(() => {
@ -129,154 +144,160 @@ const TransactionsNavigationHeader: React.FC<TransactionsNavigationHeaderProps>
}, [unit, currentBalance]);
const balance = !wallet.hideBalance && formattedBalance;
const safeBalance = balance ? String(balance) : undefined;
useEffect(() => {
if (hideBalance) {
previousBalance.current = undefined;
balanceOpacity.value = 1;
balanceTranslateY.value = 0;
return;
}
if (previousBalance.current !== undefined && previousBalance.current !== safeBalance) {
balanceOpacity.value = 0;
balanceTranslateY.value = 6;
balanceOpacity.value = withTiming(1, { duration: 180 });
balanceTranslateY.value = withSpring(0, { damping: 16, stiffness: 220 });
}
previousBalance.current = safeBalance;
}, [safeBalance, hideBalance, balanceOpacity, balanceTranslateY]);
const balanceAnimationKey = useMemo(
() => `${wallet.getID?.() ?? ''}-${unit}-${hideBalance}-${safeBalance ?? ''}`,
[safeBalance, hideBalance, unit, wallet],
);
const balanceAnimatedStyle = useAnimateOnChange(balanceAnimationKey);
const animatedBalanceTextStyle = useAnimatedStyle(() => ({
opacity: balanceOpacity.value,
transform: [{ translateY: balanceTranslateY.value }],
}));
const toolTipWalletBalanceActions = useMemo(() => {
return hideBalance
? [
{
id: 'walletBalanceVisibility',
id: actionKeys.WalletBalanceVisibility,
text: loc.transactions.details_balance_show,
icon: {
iconValue: 'eye',
},
icon: actionIcons.Eye,
},
]
: [
{
id: 'walletBalanceVisibility',
id: actionKeys.WalletBalanceVisibility,
text: loc.transactions.details_balance_hide,
icon: {
iconValue: 'eye.slash',
},
icon: actionIcons.EyeSlash,
},
{
id: 'copyToClipboard',
id: actionKeys.CopyToClipboard,
text: loc.transactions.details_copy,
icon: {
iconValue: 'doc.on.doc',
},
icon: actionIcons.Clipboard,
},
];
}, [hideBalance]);
useEffect(() => {
console.debug('[UnitSwitch/UI] render state', {
walletID: wallet.getID?.(),
unit,
hideBalance,
preferredFiat: preferredFiatCurrency?.endPointKey,
switching: unitSwitching,
});
}, [wallet, unit, hideBalance, preferredFiatCurrency, unitSwitching]);
return (
<LinearGradient colors={WalletGradient.gradientsFor(wallet.type)} style={styles.lineaderGradient}>
<View
style={[
styles.lineaderGradient,
{
paddingTop: headerOverlayHeight,
minHeight: headerOverlayHeight + HERO_MIN_BODY_HEIGHT,
backgroundColor: WalletGradient.headerColorFor(wallet.type),
},
]}
>
<LinearGradient colors={WalletGradient.gradientsFor(wallet.type)} style={StyleSheet.absoluteFill} />
<View style={styles.contentContainer}>
<Text testID="WalletLabel" numberOfLines={1} style={[styles.walletLabel, { writingDirection: direction }]}>
{wallet.getLabel()}
</Text>
<Animated.View style={[styles.walletBalanceAndUnitContainer, balanceAnimatedStyle]}>
<ToolTipMenu
shouldOpenOnLongPress
isButton
enableAndroidRipple={false}
buttonStyle={styles.walletBalance}
onPressMenuItem={onPressMenuItem}
actions={toolTipWalletBalanceActions}
>
<View style={styles.walletBalance}>
{hideBalance ? (
<BlurredBalanceView />
) : (
<View key={`wallet-balance-textwrap-${wallet.getID?.() ?? ''}-${String(balance)}`}>
<Animated.Text
key={`wallet-balance-text-${wallet.getID?.() ?? ''}-${String(balance)}`} // force recreation on balance change for RTL correctness
<View style={styles.balanceSection}>
<View style={styles.walletBalanceAndUnitContainer}>
<ToolTipMenu
shouldOpenOnLongPress
isButton
enableAndroidRipple={false}
buttonStyle={styles.walletBalance}
onPressMenuItem={onPressMenuItem}
actions={toolTipWalletBalanceActions}
>
<View style={styles.walletBalance}>
{hideBalance ? (
<BlurredBalanceView />
) : (
<Text
testID="WalletBalance"
numberOfLines={1}
minimumFontScale={0.5}
adjustsFontSizeToFit
style={[styles.walletBalanceText, animatedBalanceTextStyle]}
style={styles.walletBalanceText}
>
{balance}
</Animated.Text>
</View>
)}
</View>
</ToolTipMenu>
<TouchableOpacity style={styles.walletPreferredUnitView} onPress={changeWalletBalanceUnit} disabled={unitSwitching}>
<Text style={styles.walletPreferredUnitText}>
{unit === BitcoinUnit.LOCAL_CURRENCY ? (preferredFiatCurrency?.endPointKey ?? FiatUnit.USD) : unit}
</Text>
</TouchableOpacity>
</Animated.View>
{(wallet.type === LightningCustodianWallet.type || wallet.type === LightningArkWallet.type) && allowOnchainAddress && (
<ToolTipMenu
shouldOpenOnLongPress
isButton
onPressMenuItem={handleManageFundsPressed}
actions={toolTipActions}
buttonStyle={styles.manageFundsButton}
>
<Text style={styles.manageFundsButtonText}>{loc.lnd.title}</Text>
</ToolTipMenu>
)}
</Text>
)}
</View>
</ToolTipMenu>
{!hideBalance && (
<TouchableOpacity style={styles.walletPreferredUnitView} onPress={changeWalletBalanceUnit} disabled={unitSwitching}>
<Text style={styles.walletPreferredUnitText}>
{unit === BitcoinUnit.LOCAL_CURRENCY ? (preferredFiatCurrency?.endPointKey ?? FiatUnit.USD) : unit}
</Text>
</TouchableOpacity>
)}
</View>
{(wallet.type === LightningCustodianWallet.type || wallet.type === LightningArkWallet.type) && allowOnchainAddress && (
<TouchableOpacity style={styles.manageFundsButton} accessibilityRole="button" onPress={showManageFundsActionSheet}>
<Text style={styles.manageFundsButtonText}>{loc.lnd.title}</Text>
</TouchableOpacity>
)}
</View>
{wallet.type === MultisigHDWallet.type && (
<TouchableOpacity style={styles.manageFundsButton} accessibilityRole="button" onPress={() => handleManageFundsPressed()}>
<Text style={styles.manageFundsButtonText}>{loc.multisig.manage_keys}</Text>
</TouchableOpacity>
)}
</View>
</LinearGradient>
<View style={styles.bottomBarSpacer}>
<View
style={[
styles.bottomBar,
{
backgroundColor: colors.background,
...Platform.select({
ios: { shadowColor: colors.shadowColor },
android: {},
}),
},
]}
/>
</View>
</View>
);
};
const styles = StyleSheet.create({
lineaderGradient: {
minHeight: 140,
justifyContent: 'flex-start',
position: 'relative',
},
contentContainer: {
padding: 15,
flex: 1,
paddingTop: WALLET_LABEL_TOP_GAP,
paddingHorizontal: 16,
paddingBottom: HERO_BOTTOM_PADDING,
},
bottomBarSpacer: {
position: 'relative',
height: 12,
marginBottom: 0,
},
bottomBar: {
position: 'absolute',
left: 0,
right: 0,
bottom: -1,
height: 13,
borderTopLeftRadius: 20,
borderTopRightRadius: 20,
...Platform.select({
ios: {
shadowOffset: { width: 0, height: -8 },
shadowOpacity: 0.1,
shadowRadius: 6,
},
android: {
elevation: 0.5,
},
}),
},
walletLabel: {
backgroundColor: 'transparent',
fontSize: 19,
color: '#fff',
marginBottom: 10,
color: 'rgba(255, 255, 255, 0.7)',
marginBottom: 4,
},
walletBalance: {
flexShrink: 1,
marginRight: 6,
minHeight: 39,
justifyContent: 'center',
},
balanceSection: {
flexDirection: 'column',
alignItems: 'flex-start',
},
manageFundsButton: {
marginTop: 14,
@ -297,13 +318,13 @@ const styles = StyleSheet.create({
walletBalanceAndUnitContainer: {
flexDirection: 'row',
alignItems: 'center',
paddingRight: 10, // Ensure there's some padding to the right
paddingRight: 10,
},
walletBalanceText: {
color: '#fff',
fontWeight: 'bold',
fontSize: 36,
flexShrink: 1, // Allow the text to shrink if there's not enough space
flexShrink: 1,
},
walletPreferredUnitView: {
justifyContent: 'center',

View File

@ -107,7 +107,7 @@ const WalletListItem: React.FC<Props> = ({
)}
{wallet.hideBalance ? (
<View style={styles.hiddenBalance}>
<View style={styles.hiddenBalance} testID="HiddenBalance">
<View style={styles.hiddenBalanceBar} />
</View>
) : (

View File

@ -30,6 +30,7 @@ import WalletGradient from '../class/wallet-gradient';
import { useSizeClass, SizeClass } from '../blue_modules/sizeClass';
import loc, { formatBalance, transactionTimeToReadable } from '../loc';
import { BlurredBalanceView } from './BlurredBalanceView';
import { withAlpha } from './color';
import { useTheme } from './themes';
import { Transaction, TWallet } from '../class/wallets/types';
import { BlueSpacing10 } from './BlueSpacing';
@ -37,6 +38,30 @@ import { useLocale } from '@react-navigation/native';
export const WALLET_CAROUSEL_HEADER_WIDTH = 16;
/** Base card body height at default Dynamic Type — grows with larger Dynamic Type, never shrinks below default. */
export const WALLET_CARD_BASE_MIN_HEIGHT = 164;
/** Top inset above wallet cards in the horizontal home carousel. */
export const WALLET_CAROUSEL_PADDING_TOP = 12;
/** Bottom inset so iOS card shadows (offset 4 + radius 8) are not clipped by the list row. */
export const WALLET_CAROUSEL_PADDING_BOTTOM = 20;
/** Scale layout metrics up for accessibility sizes; keep the design default when fontScale ≤ 1. */
const scaleLayoutUp = (base: number, fontScale: number): number => Math.round(base * Math.max(1, fontScale));
export const getWalletCardMinHeight = (fontScale = 1): number => scaleLayoutUp(WALLET_CARD_BASE_MIN_HEIGHT, fontScale);
export const getWalletCarouselHeight = (fontScale = 1): number =>
scaleLayoutUp(WALLET_CAROUSEL_PADDING_TOP, fontScale) +
getWalletCardMinHeight(fontScale) +
scaleLayoutUp(WALLET_CAROUSEL_PADDING_BOTTOM, fontScale);
/** Default carousel row height at `fontScale` 1 — prefer `getWalletCarouselHeight(fontScale)` when layout depends on Dynamic Type. */
export const WALLET_CAROUSEL_HEIGHT = getWalletCarouselHeight(1);
/** Vertical gap between the wallet title/balance block and the latest-tx footer on carousel cards. */
const WALLET_CARD_SECTION_GAP = 12;
const WALLET_CARD_TEXT_OPACITY = 0.85;
export const getWalletCarouselItemWidth = (screenWidth: number) => Math.round(screenWidth * 0.82 > 375 ? 375 : screenWidth * 0.82);
interface NewWalletPanelProps {
@ -160,23 +185,28 @@ const iStyles = StyleSheet.create({
borderRadius: 12,
minHeight: 164,
overflow: 'hidden',
justifyContent: 'flex-end',
},
gradCompact: {
borderRadius: 10,
minHeight: 132,
overflow: 'hidden',
justifyContent: 'flex-end',
},
gradContent: {
padding: 15,
width: '100%',
},
gradContentCompact: {
padding: 12,
},
balanceContainer: {
height: 40,
minHeight: 40,
justifyContent: 'center',
},
balanceContainerCompact: {
height: 32,
minHeight: 32,
justifyContent: 'center',
},
image: {
width: 99,
@ -189,9 +219,6 @@ const iStyles = StyleSheet.create({
width: 78,
height: 74,
},
br: {
backgroundColor: 'transparent',
},
label: {
backgroundColor: 'transparent',
fontSize: 19,
@ -206,7 +233,6 @@ const iStyles = StyleSheet.create({
},
balanceCompact: {
fontSize: 28,
lineHeight: 34,
},
latestTx: {
backgroundColor: 'transparent',
@ -282,11 +308,32 @@ export const WalletCarouselItem: React.FC<WalletCarouselItemProps> = React.memo(
const balanceOpacity = useSharedValue(1);
const balanceTranslateY = useSharedValue(0);
const { colors } = useTheme();
const { width } = useWindowDimensions();
const { width, fontScale } = useWindowDimensions();
const itemWidth = getWalletCarouselItemWidth(width);
const { sizeClass } = useSizeClass();
const isCompact = sizeVariant === 'compact';
const { direction } = useLocale();
const scaledCardStyles = useMemo(
() => ({
grad: { minHeight: getWalletCardMinHeight(fontScale) },
gradContent: { padding: scaleLayoutUp(15, fontScale) },
balanceContainer: { minHeight: scaleLayoutUp(40, fontScale) },
textSpacer: { height: scaleLayoutUp(WALLET_CARD_SECTION_GAP, fontScale) },
label: { lineHeight: scaleLayoutUp(24, fontScale) },
balance: { lineHeight: scaleLayoutUp(38, fontScale) },
balanceCompact: { lineHeight: scaleLayoutUp(30, fontScale) },
latestTx: { lineHeight: scaleLayoutUp(18, fontScale) },
latestTxTime: { lineHeight: scaleLayoutUp(22, fontScale) },
}),
[fontScale],
);
const cardTextStyle = useMemo(
() => ({
color: withAlpha(colors.inverseForegroundColor, WALLET_CARD_TEXT_OPACITY),
writingDirection: direction,
}),
[colors.inverseForegroundColor, direction],
);
const previousBalance = useRef<string | undefined>(undefined);
const balance = !hideBalance && formatBalance(Number(item.getBalance()), item.getPreferredBalanceUnit(), true);
const safeBalance = balance || undefined;
@ -383,9 +430,21 @@ export const WalletCarouselItem: React.FC<WalletCarouselItemProps> = React.memo(
let latestTransactionText;
// Lightning / Ark wallets do not have on-chain confirmations — settlement is
// signaled by `ispaid`. Bitcoin/on-chain wallets keep the existing
// `confirmations === 0` rule unchanged so their pending-pill semantics
// never depend on a Lightning shape.
// `ispaid === false` alone is not "pending": it is also true for terminal
// failed/refunded swaps, which stay in history. Gate on `!tx.failed` so a
// dead swap doesn't pin the card to "pending" forever.
const isLightningShaped = item.type === LightningCustodianWallet.type || item.type === LightningArkWallet.type;
const hasPendingTx = isLightningShaped
? item.getTransactions().some((tx: any) => tx.ispaid === false && !tx.failed)
: item.getTransactions().some((tx: Transaction) => tx.confirmations === 0);
if (item.getBalance() !== 0 && item.getLatestTransactionTime() === 0) {
latestTransactionText = loc.wallets.pull_to_refresh;
} else if (item.getTransactions().find((tx: Transaction) => tx.confirmations === 0)) {
} else if (hasPendingTx) {
latestTransactionText = loc.transactions.pending;
} else {
latestTransactionText = transactionTimeToReadable(item.getLatestTransactionTime());
@ -419,23 +478,23 @@ export const WalletCarouselItem: React.FC<WalletCarouselItemProps> = React.memo(
{ backgroundColor: colors.background, shadowColor: colors.shadowColor },
]}
>
<LinearGradient colors={WalletGradient.gradientsFor(item.type)} style={[iStyles.grad, isCompact && iStyles.gradCompact]}>
<LinearGradient
colors={WalletGradient.gradientsFor(item.type)}
style={[iStyles.grad, isCompact && iStyles.gradCompact, scaledCardStyles.grad]}
>
<ImageBackground source={image} style={[iStyles.image, isCompact && iStyles.imageCompact]} />
<View style={[iStyles.gradContent, isCompact && iStyles.gradContentCompact]}>
<Text style={iStyles.br} />
<View style={[iStyles.gradContent, isCompact && iStyles.gradContentCompact, !isCompact && scaledCardStyles.gradContent]}>
{!isPlaceHolder && (
<>
<Text
numberOfLines={1}
style={[
iStyles.label,
isCompact && iStyles.labelCompact,
{ color: colors.inverseForegroundColor, writingDirection: direction },
]}
style={[iStyles.label, isCompact && iStyles.labelCompact, scaledCardStyles.label, cardTextStyle]}
>
{renderHighlightedText ? renderHighlightedText(walletLabel, searchQuery || '') : walletLabel}
</Text>
<View style={[iStyles.balanceContainer, isCompact && iStyles.balanceContainerCompact]}>
<View
style={[iStyles.balanceContainer, isCompact && iStyles.balanceContainerCompact, scaledCardStyles.balanceContainer]}
>
{hideBalance ? (
<>
<BlueSpacing10 />
@ -445,11 +504,13 @@ export const WalletCarouselItem: React.FC<WalletCarouselItemProps> = React.memo(
<Animated.Text
numberOfLines={1}
adjustsFontSizeToFit
minimumFontScale={0.55}
key={`${balance}`} // force component recreation on balance change. To fix right-to-left languages, like Farsi
style={[
iStyles.balance,
isCompact && iStyles.balanceCompact,
{ color: colors.inverseForegroundColor, writingDirection: direction },
isCompact ? scaledCardStyles.balanceCompact : scaledCardStyles.balance,
cardTextStyle,
animatedBalanceStyle,
]}
>
@ -457,24 +518,20 @@ export const WalletCarouselItem: React.FC<WalletCarouselItemProps> = React.memo(
</Animated.Text>
)}
</View>
<Text style={iStyles.br} />
<View style={scaledCardStyles.textSpacer} />
<Text
numberOfLines={1}
style={[
iStyles.latestTx,
isCompact && iStyles.latestTxCompact,
{ color: colors.inverseForegroundColor, writingDirection: direction },
]}
adjustsFontSizeToFit
minimumFontScale={0.8}
style={[iStyles.latestTx, isCompact && iStyles.latestTxCompact, scaledCardStyles.latestTx, cardTextStyle]}
>
{loc.wallets.list_latest_transaction}
</Text>
<Text
numberOfLines={1}
style={[
iStyles.latestTxTime,
isCompact && iStyles.latestTxTimeCompact,
{ color: colors.inverseForegroundColor, writingDirection: direction },
]}
adjustsFontSizeToFit
minimumFontScale={0.8}
style={[iStyles.latestTxTime, isCompact && iStyles.latestTxTimeCompact, scaledCardStyles.latestTxTime, cardTextStyle]}
>
{latestTransactionText}
</Text>
@ -503,15 +560,7 @@ interface WalletsCarouselProps extends Partial<FlatListProps<any>> {
animateChanges?: boolean;
}
type FlatListRefType = FlatList<any> & {
scrollToEnd(params?: { animated?: boolean | null }): void;
scrollToIndex(params: { animated?: boolean | null; index: number; viewOffset?: number; viewPosition?: number }): void;
scrollToItem(params: { animated?: boolean | null; item: TWallet; viewPosition?: number }): void;
scrollToOffset(params: { animated?: boolean | null; offset: number }): void;
recordInteraction(): void;
flashScrollIndicators(): void;
getNativeScrollRef(): View;
};
export type CarouselListRefType = FlatList<TWallet>;
const styles = StyleSheet.create({
listHeaderSeparator: {
@ -522,7 +571,7 @@ const styles = StyleSheet.create({
const ListHeaderSeparator = () => <View style={styles.listHeaderSeparator} />;
const WalletsCarousel = forwardRef<FlatListRefType, WalletsCarouselProps>((props, ref) => {
const WalletsCarousel = forwardRef<CarouselListRefType, WalletsCarouselProps>((props, ref) => {
const {
horizontal = true,
data,
@ -537,7 +586,7 @@ const WalletsCarousel = forwardRef<FlatListRefType, WalletsCarouselProps>((props
animateChanges = false,
} = props;
const { width } = useWindowDimensions();
const { width, fontScale } = useWindowDimensions();
const itemWidth = React.useMemo(() => getWalletCarouselItemWidth(width), [width]);
const snapInterval = React.useMemo(() => itemWidth, [itemWidth]);
const snapOffsets = React.useMemo(() => {
@ -557,7 +606,7 @@ const WalletsCarousel = forwardRef<FlatListRefType, WalletsCarouselProps>((props
const scrollTimeoutRef = useRef<NodeJS.Timeout | null>(null);
const isInitialMount = useRef(true);
const flatListRef = useRef<FlatList<any>>(null);
const flatListRef = useRef<FlatList<TWallet>>(null);
const walletRefs = useRef<Record<string, React.MutableRefObject<View | null>>>({});
const { sizeClass } = useSizeClass();
@ -646,7 +695,7 @@ const WalletsCarousel = forwardRef<FlatListRefType, WalletsCarouselProps>((props
console.warn('[WalletsCarousel] Error scrolling to wallet:', error);
// Fallback: try scrolling to offset
// Use different measurement based on orientation
const itemSize = horizontal ? itemWidth : 195; // 195 is the approximate height of wallet card
const itemSize = horizontal ? itemWidth : WALLET_CAROUSEL_HEIGHT;
flatListRef.current.scrollToOffset({
offset: itemSize * walletIndex,
animated,
@ -768,7 +817,7 @@ const WalletsCarousel = forwardRef<FlatListRefType, WalletsCarouselProps>((props
const keyExtractor = useCallback((item: TWallet, index: number) => (item?.getID ? item.getID() : index.toString()), []);
const sliderHeight = 195;
const sliderHeight = getWalletCarouselHeight(fontScale);
useEffect(() => {
return () => {
@ -851,7 +900,8 @@ const WalletsCarousel = forwardRef<FlatListRefType, WalletsCarouselProps>((props
const cStyles = StyleSheet.create({
content: {
paddingTop: 16,
paddingTop: scaleLayoutUp(WALLET_CAROUSEL_PADDING_TOP, fontScale),
paddingBottom: scaleLayoutUp(WALLET_CAROUSEL_PADDING_BOTTOM, fontScale),
},
contentLargeScreen: {
paddingHorizontal: sizeClass === SizeClass.Large ? 16 : 12,
@ -882,7 +932,7 @@ const WalletsCarousel = forwardRef<FlatListRefType, WalletsCarouselProps>((props
automaticallyAdjustContentInsets
automaticallyAdjustKeyboardInsets
automaticallyAdjustsScrollIndicatorInsets
style={{ minHeight: sliderHeight + 12 }}
style={{ minHeight: sliderHeight }}
onScrollToIndexFailed={onScrollToIndexFailed}
ListFooterComponent={onNewWalletPress ? <NewWalletPanel onPress={onNewWalletPress} /> : null}
{...props}

View File

@ -66,10 +66,13 @@ const getHandleCloseAction = (
const navigationStyle = (
{
closeButtonPosition,
closeButtonIfFirstInStack,
onCloseButtonPressed,
...opts
}: NativeStackNavigationOptions & {
closeButtonPosition?: CloseButtonPosition;
/** When set, show this close control only if this screen is the first route in the stack (e.g. Coin Control opened from wallet details). */
closeButtonIfFirstInStack?: CloseButtonPosition;
onCloseButtonPressed?: (deps: { navigation: any; route: any }) => void;
},
formatter?: OptionsFormatter,
@ -80,7 +83,10 @@ const navigationStyle = (
const isModal = route.params?.presentation === 'modal' || route.params?.presentation === 'transparentModal';
const isFormSheet = route.params?.presentation === 'formSheet';
const closeButton = getCloseButtonPosition(closeButtonPosition, isFirstRouteInStack, isModal);
const closeButton =
closeButtonIfFirstInStack && isFirstRouteInStack
? closeButtonIfFirstInStack
: getCloseButtonPosition(closeButtonPosition, isFirstRouteInStack, isModal);
const handleClose = getHandleCloseAction(onCloseButtonPressed, navigation, route);
let headerRight;

View File

@ -31,6 +31,8 @@ export { platformColors } from '../themes';
export const isAndroid = Platform.OS === 'android';
const isIOS = Platform.OS === 'ios';
const iosMajorVersion = isIOS ? Number(String(Platform.Version).split('.')[0]) : 0;
export const isIOS26OrHigher = isIOS && Number.isFinite(iosMajorVersion) && iosMajorVersion >= 26;
export const platformSizing = {
horizontalPadding: isIOS ? 16 : 20,
@ -107,6 +109,15 @@ export const getSettingsHeaderOptions = (
const cardColor = colors.lightButton ?? colors.modal ?? colors.elevated ?? defaultBackgroundColor;
const headerBackgroundColor = isIOS ? (dark ? defaultBackgroundColor : cardColor) : defaultBackgroundColor;
if (isIOS26OrHigher) {
return {
title,
headerLargeTitle: true,
headerLargeTitleShadowVisible: true,
headerBackButtonDisplayMode: 'minimal' as const,
};
}
return {
title,
headerLargeTitle: isIOS,
@ -192,6 +203,7 @@ export const SettingsScrollView = forwardRef<ScrollView, SettingsScrollViewProps
ref={ref}
style={[style, { backgroundColor: screenBackgroundColor }]}
headerHeight={resolvedHeaderHeight}
disableDefaultTopPadding={isIOS26OrHigher}
floatingButtonHeight={floatingButtonHeight}
contentContainerStyle={[staticStyles.contentContainer, contentContainerStyle]}
{...rest}

View File

@ -14,6 +14,8 @@ export const BlueDefaultTheme = {
foregroundColor: '#0c2550',
borderTopColor: 'rgba(0, 0, 0, 0.1)',
buttonBackgroundColor: '#ccddf9',
/** Softer fill for native iOS 26+ prominent header bar buttons (derived from `buttonBackgroundColor`). */
headerProminentButtonBackgroundColor: 'rgba(204, 221, 249, 0.9)',
buttonTextColor: '#0c2550',
secondButtonTextColor: '#50555C',
buttonAlternativeTextColor: '#2f5fb3',
@ -101,6 +103,7 @@ export const BlueDarkTheme: Theme = {
foregroundColor: '#ffffff',
buttonDisabledBackgroundColor: '#3A3A3C',
buttonBackgroundColor: '#3A3A3C',
headerProminentButtonBackgroundColor: 'rgba(58, 58, 60, 0.6)',
buttonTextColor: '#ffffff',
lightButton: 'rgba(255,255,255,.1)',
buttonAlternativeTextColor: '#ffffff',

View File

@ -2,15 +2,18 @@ import { Platform } from 'react-native';
import prompt from 'react-native-prompt-android';
import loc from '../loc';
export default (
title: string,
text: string,
isCancelable = true,
type: PromptType | PromptTypeIOS | PromptTypeAndroid = 'secure-text',
isOKDestructive = false,
continueButtonText = loc._.ok,
defaultInputValue?: string,
): Promise<string> => {
type PromptHelperOptions = {
cancelable?: boolean;
type?: PromptType | PromptTypeIOS | PromptTypeAndroid;
destructive?: boolean; // applies only to the cancelable (two-button) layout
continueButtonText?: string;
defaultValue?: string;
};
export default (title: string, text: string, options: PromptHelperOptions = {}): Promise<string> => {
const { cancelable = true, destructive = false, continueButtonText = loc._.ok, defaultValue } = options;
let { type = 'secure-text' } = options;
const keyboardType = type === 'numeric' ? 'numeric' : 'default';
if (Platform.OS === 'ios' && type === 'numeric') {
@ -19,7 +22,7 @@ export default (
}
return new Promise((resolve, reject) => {
const buttons: Array<PromptButton> = isCancelable
const buttons: Array<PromptButton> = cancelable
? [
{
text: loc._.cancel,
@ -34,7 +37,7 @@ export default (
console.log('OK Pressed');
resolve(password);
},
style: isOKDestructive ? 'destructive' : 'default',
style: destructive ? 'destructive' : 'default',
},
]
: [
@ -47,13 +50,12 @@ export default (
},
];
const message = defaultInputValue !== undefined ? '' : text;
const message = defaultValue !== undefined ? '' : text;
prompt(title, message, buttons, {
type,
cancelable: isCancelable,
// @ts-ignore suppressed because its supported only on ios and is absent from type definitions
cancelable,
keyboardType,
...(defaultInputValue !== undefined && { defaultValue: defaultInputValue }),
...(defaultValue !== undefined && { defaultValue }),
});
});
};

View File

@ -1,6 +1,7 @@
import { CommonActions } from '@react-navigation/native';
import { useCallback, useEffect, useRef } from 'react';
import { AppState, AppStateStatus, Linking } from 'react-native';
import { reconcileArkBackgroundTaskResults } from '../blue_modules/arkade-background';
import { getClipboardContent } from '../blue_modules/clipboard';
import { updateExchangeRate } from '../blue_modules/currency';
import triggerHapticFeedback, { HapticFeedbackTypes } from '../blue_modules/hapticFeedback';
@ -13,6 +14,7 @@ import {
setApplicationIconBadgeNumber,
} from '../blue_modules/notifications';
import { LightningCustodianWallet } from '../class/wallets/lightning-custodian-wallet';
import { LightningArkWallet } from '../class/wallets/lightning-ark-wallet';
import DeeplinkSchemaMatch from '../class/deeplink-schema-match';
import loc from '../loc';
import { Chain } from '../models/bitcoinUnits';
@ -86,6 +88,47 @@ const useCompanionListeners = (skipIfNotInitialized = true) => {
const wasTapped = payload.foreground === false || (payload.foreground === true && payload.userInteraction);
console.log('processing push notification:', payload);
// Local notification for actionable Ark swaps. Routed by walletID
// rather than address/txid because the payload is locally generated;
// see blue_modules/arkade-notifications.ts.
if (+payload.type === 100) {
const arkWallet = wallets.find(w => w.getID() === payload.walletID);
if (!arkWallet || !(arkWallet instanceof LightningArkWallet)) {
if (wasTapped) {
navigation.navigate('WalletTransactions', {
walletID: payload.walletID,
walletType: arkWallet?.type,
});
return true;
}
continue;
}
// Refresh swap-derived rows directly via the wallet method to
// bypass the 5-second NOP throttle in StorageProvider.fetchAndSaveWalletTransactions:
// reconcileArkBackgroundTaskResults often runs on app resume immediately
// before this handler, which would make a throttled call NOP and
// leave the synthetic row stale.
try {
await arkWallet.fetchTransactions();
await saveToDisk();
} catch (e: any) {
console.warn('[useCompanionListeners] arkWallet.fetchTransactions failed:', e?.message ?? e);
}
if (wasTapped) {
const arkWalletID = arkWallet.getID();
const row = arkWallet.getTransactions().find(tx => tx.txid === `swap-${payload.swapId}`);
if (row) {
navigation.navigate('LNDViewInvoice', { invoice: row, walletID: arkWalletID });
} else {
navigation.navigate('WalletTransactions', { walletID: arkWalletID, walletType: arkWallet.type });
}
return true;
}
continue;
}
let wallet;
switch (+payload.type) {
case 2:
@ -126,6 +169,51 @@ const useCompanionListeners = (skipIfNotInitialized = true) => {
const wasTapped = payload.foreground === false || (payload.foreground === true && payload.userInteraction);
console.log('processing push notification:', payload);
if (+payload.type === 100) {
const arkWallet = wallets.find(w => w.getID() === payload.walletID);
if (!arkWallet || !(arkWallet instanceof LightningArkWallet)) {
if (wasTapped) {
navigationRef.dispatch(
CommonActions.navigate({
name: 'WalletTransactions',
params: { walletID: payload.walletID, walletType: arkWallet?.type },
}),
);
return true;
}
continue;
}
try {
await arkWallet.fetchTransactions();
await saveToDisk();
} catch (e: any) {
console.warn('[useCompanionListeners] arkWallet.fetchTransactions failed:', e?.message ?? e);
}
if (wasTapped) {
const arkWalletID = arkWallet.getID();
const row = arkWallet.getTransactions().find(tx => tx.txid === `swap-${payload.swapId}`);
if (row) {
navigationRef.dispatch(
CommonActions.navigate({
name: 'LNDViewInvoice',
params: { invoice: row, walletID: arkWalletID },
}),
);
} else {
navigationRef.dispatch(
CommonActions.navigate({
name: 'WalletTransactions',
params: { walletID: arkWalletID, walletType: arkWallet.type },
}),
);
}
return true;
}
continue;
}
let wallet;
switch (+payload.type) {
case 2:
@ -179,7 +267,7 @@ const useCompanionListeners = (skipIfNotInitialized = true) => {
console.error('Failed to process push notifications:', error);
}
return false;
}, [shouldActivateListeners, wallets, fetchAndSaveWalletTransactions, navigation, refreshAllWalletTransactions]);
}, [shouldActivateListeners, wallets, fetchAndSaveWalletTransactions, saveToDisk, navigation, refreshAllWalletTransactions]);
useEffect(() => {
if (!shouldActivateListeners) return;
@ -214,16 +302,12 @@ const useCompanionListeners = (skipIfNotInitialized = true) => {
throw new Error(loc.send.qr_error_no_qrcode);
}
triggerHapticFeedback(HapticFeedbackTypes.NotificationSuccess);
DeeplinkSchemaMatch.navigationRouteFor(
{ url: qrValue },
(value: [string, any]) => navigationRef.navigate(...value),
{
wallets,
addWallet,
saveToDisk,
setSharedCosigner,
},
);
DeeplinkSchemaMatch.navigationRouteFor({ url: qrValue }, (value: [string, any]) => navigationRef.navigate(...value), {
wallets,
addWallet,
saveToDisk,
setSharedCosigner,
});
} else {
DeeplinkSchemaMatch.navigationRouteFor(event, (value: [string, any]) => navigationRef.navigate(...value), {
wallets,
@ -277,6 +361,12 @@ const useCompanionListeners = (skipIfNotInitialized = true) => {
if ((appState.current.match(/inactive|background/) && nextAppState === 'active') || nextAppState === undefined) {
updateExchangeRate();
const processed = await processPushNotifications();
// Reconcile in-process Ark background task results before the
// notification-handled early return: if the background task observed
// status changes while the app was backgrounded, the affected
// wallets need a transactions refresh whether or not a notification
// also fired.
reconcileArkBackgroundTaskResults(fetchAndSaveWalletTransactions);
if (processed) return;
const clipboard = await getClipboardContent();
if (!clipboard) return;
@ -312,7 +402,7 @@ const useCompanionListeners = (skipIfNotInitialized = true) => {
appState.current = nextAppState;
}
},
[processPushNotifications, showClipboardAlert, wallets, shouldActivateListeners],
[processPushNotifications, fetchAndSaveWalletTransactions, showClipboardAlert, wallets, shouldActivateListeners],
);
const addListeners = useCallback(() => {

View File

@ -74,7 +74,7 @@ export const calculateBalanceAndTransactionTime = async (
const balance = await wallet.getBalance();
const transactions: Transaction[] = await wallet.getTransactions();
const confirmedTransactions = transactions.filter(t => t.confirmations > 0);
const confirmedTransactions = transactions.filter(t => (t.confirmations ?? 0) > 0);
const latestTransactionTime =
confirmedTransactions.length > 0
? secondsToMilliseconds(Math.max(...confirmedTransactions.map(t => t.timestamp || t.time || 0)))

View File

@ -4,20 +4,30 @@ import 'react-native-get-random-values';
import './shim.js';
import React, { useEffect } from 'react';
import { AppRegistry, LogBox, Platform, UIManager } from 'react-native';
import { AppRegistry, LogBox } from 'react-native';
import BackgroundFetch from 'react-native-background-fetch';
import App from './App';
import { restoreSavedPreferredFiatCurrencyAndExchangeFromStorage } from './blue_modules/currency';
import { runArkBackgroundTask } from './blue_modules/arkade-background';
// Android headless execution boots a bare JS runtime without the React tree.
// The headless task callback must be registered at module scope before
// AppRegistry.registerComponent so the symbol exists when the OS dispatches a
// terminated-process wake.
BackgroundFetch.registerHeadlessTask(async event => {
if (event.timeout) {
BackgroundFetch.finish(event.taskId);
return;
}
await runArkBackgroundTask(event.taskId);
});
if (!Error.captureStackTrace) {
// captureStackTrace is only available when debugging
Error.captureStackTrace = () => {};
}
if (Platform.OS === 'android' && UIManager.setLayoutAnimationEnabledExperimental) {
UIManager.setLayoutAnimationEnabledExperimental(true);
}
LogBox.ignoreLogs([
'Require cycle:',
'Battery state `unknown` and monitoring disabled, this is normal for simulators and tvOS.',

View File

@ -1356,7 +1356,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1703259999;
CURRENT_PROJECT_VERSION = 1703279999;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = A7W54YZ4WU;
@ -1383,7 +1383,7 @@
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
"$(inherited)",
);
MARKETING_VERSION = 8.0.0;
MARKETING_VERSION = 8.0.1;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@ -1418,7 +1418,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1703259999;
CURRENT_PROJECT_VERSION = 1703279999;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = A7W54YZ4WU;
@ -1440,7 +1440,7 @@
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
"$(inherited)",
);
MARKETING_VERSION = 8.0.0;
MARKETING_VERSION = 8.0.1;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@ -1476,7 +1476,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1703259999;
CURRENT_PROJECT_VERSION = 1703279999;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = "";
@ -1489,7 +1489,7 @@
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
"$(inherited)",
);
MARKETING_VERSION = 8.0.0;
MARKETING_VERSION = 8.0.1;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
@ -1519,7 +1519,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1703259999;
CURRENT_PROJECT_VERSION = 1703279999;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = "";
@ -1532,7 +1532,7 @@
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
"$(inherited)",
);
MARKETING_VERSION = 8.0.0;
MARKETING_VERSION = 8.0.1;
MTL_FAST_MATH = YES;
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers;
@ -1564,7 +1564,7 @@
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1703259999;
CURRENT_PROJECT_VERSION = 1703279999;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = "";
@ -1584,7 +1584,7 @@
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
"$(inherited)",
);
MARKETING_VERSION = 8.0.0;
MARKETING_VERSION = 8.0.1;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
@ -1625,7 +1625,7 @@
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Manual;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1703259999;
CURRENT_PROJECT_VERSION = 1703279999;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = "";
@ -1645,7 +1645,7 @@
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
"$(inherited)",
);
MARKETING_VERSION = 8.0.0;
MARKETING_VERSION = 8.0.1;
MTL_FAST_MATH = YES;
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget;
@ -1832,7 +1832,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1703259999;
CURRENT_PROJECT_VERSION = 1703279999;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = "";
@ -1854,7 +1854,7 @@
"$(inherited)",
);
MACOSX_DEPLOYMENT_TARGET = 12.4;
MARKETING_VERSION = 8.0.0;
MARKETING_VERSION = 8.0.1;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
@ -1890,7 +1890,7 @@
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1703259999;
CURRENT_PROJECT_VERSION = 1703279999;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = "";
@ -1912,7 +1912,7 @@
"$(inherited)",
);
MACOSX_DEPLOYMENT_TARGET = 12.4;
MARKETING_VERSION = 8.0.0;
MARKETING_VERSION = 8.0.1;
MTL_FAST_MATH = YES;
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch;

View File

@ -5,6 +5,7 @@
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>io.bluewallet.bluewallet.fetchTxsForWallet</string>
<string>com.transistorsoft.fetch</string>
</array>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
@ -244,8 +245,6 @@
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>
<key>UIDesignRequiresCompatibility</key>
<true/>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>

View File

@ -1,5 +1,5 @@
PODS:
- BugsnagReactNative (8.8.1):
- BugsnagReactNative (8.9.0):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@ -29,7 +29,7 @@ PODS:
- hermes-engine/Pre-built (= 250829098.0.10)
- hermes-engine/Pre-built (250829098.0.10)
- lottie-ios (4.6.0)
- lottie-react-native (7.3.6):
- lottie-react-native (7.3.8):
- hermes-engine
- lottie-ios (= 4.6.0)
- RCTRequired
@ -1529,7 +1529,7 @@ PODS:
- Yoga
- react-native-notifications (5.2.2):
- React-Core
- react-native-safe-area-context (5.7.0):
- react-native-safe-area-context (5.8.0):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@ -1541,8 +1541,8 @@ PODS:
- React-graphics
- React-ImageManager
- React-jsi
- react-native-safe-area-context/common (= 5.7.0)
- react-native-safe-area-context/fabric (= 5.7.0)
- react-native-safe-area-context/common (= 5.8.0)
- react-native-safe-area-context/fabric (= 5.8.0)
- React-NativeModulesApple
- React-RCTFabric
- React-renderercss
@ -1553,7 +1553,7 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- react-native-safe-area-context/common (5.7.0):
- react-native-safe-area-context/common (5.8.0):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@ -1575,7 +1575,7 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- react-native-safe-area-context/fabric (5.7.0):
- react-native-safe-area-context/fabric (5.8.0):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@ -2018,6 +2018,8 @@ PODS:
- ReactNativeDependencies (0.85.3)
- RealmJS (20.2.0):
- React
- RNBackgroundFetch (4.2.9):
- React-Core
- RNCAsyncStorage (2.2.0):
- hermes-engine
- RCTRequired
@ -2068,7 +2070,7 @@ PODS:
- React-Core
- RNFS (2.20.0):
- React-Core
- RNGestureHandler (2.31.1):
- RNGestureHandler (2.31.2):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@ -2182,7 +2184,7 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- RNReanimated (4.3.0):
- RNReanimated (4.3.1):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@ -2204,11 +2206,11 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- RNReanimated/apple (= 4.3.0)
- RNReanimated/common (= 4.3.0)
- RNReanimated/apple (= 4.3.1)
- RNReanimated/common (= 4.3.1)
- RNWorklets
- Yoga
- RNReanimated/apple (4.3.0):
- RNReanimated/apple (4.3.1):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@ -2232,7 +2234,7 @@ PODS:
- ReactNativeDependencies
- RNWorklets
- Yoga
- RNReanimated/common (4.3.0):
- RNReanimated/common (4.3.1):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@ -2256,7 +2258,7 @@ PODS:
- ReactNativeDependencies
- RNWorklets
- Yoga
- RNScreens (4.24.0):
- RNScreens (4.25.2):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@ -2278,9 +2280,9 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- RNScreens/common (= 4.24.0)
- RNScreens/common (= 4.25.2)
- Yoga
- RNScreens/common (4.24.0):
- RNScreens/common (4.25.2):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@ -2325,7 +2327,7 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- RNSVG (15.15.4):
- RNSVG (15.15.5):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@ -2346,9 +2348,9 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- RNSVG/common (= 15.15.4)
- RNSVG/common (= 15.15.5)
- Yoga
- RNSVG/common (15.15.4):
- RNSVG/common (15.15.5):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@ -2543,6 +2545,7 @@ DEPENDENCIES:
- ReactNativeCameraKit (from `../node_modules/react-native-camera-kit-no-google`)
- ReactNativeDependencies (from `../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec`)
- RealmJS (from `../node_modules/realm`)
- RNBackgroundFetch (from `../node_modules/react-native-background-fetch`)
- "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)"
- "RNCClipboard (from `../node_modules/@react-native-clipboard/clipboard`)"
- RNDefaultPreference (from `../node_modules/react-native-default-preference`)
@ -2762,6 +2765,8 @@ EXTERNAL SOURCES:
:podspec: "../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec"
RealmJS:
:path: "../node_modules/realm"
RNBackgroundFetch:
:path: "../node_modules/react-native-background-fetch"
RNCAsyncStorage:
:path: "../node_modules/@react-native-async-storage/async-storage"
RNCClipboard:
@ -2802,13 +2807,13 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/ReactCommon/yoga"
SPEC CHECKSUMS:
BugsnagReactNative: bee770e3f497a8571feb1579bdc083a070bee1f3
BugsnagReactNative: 73ce58aac04585e7cba3081c0abba06d848d62fc
BVLinearGradient: cb006ba232a1f3e4f341bb62c42d1098c284da70
CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
FBLazyVector: 24e62c765683b8d89006a88a2c8f5cf019f0074d
hermes-engine: 4ed74710a31e8e31f20356c641eab1d8f7d54595
lottie-ios: 8f959969761e9c45d70353667d00af0e5b9cadb3
lottie-react-native: 615e5f4651bee144ea991ad8e900630b6b3daf5d
lottie-react-native: ee142214581f3bb68fbda7efcf07b835a189eeda
RCTDeprecation: a4c521821fab57cbb125b36effe84d897d0dfa12
RCTRequired: 9f3a7e5645d4bc3f551593de7550bb66ab6e42bc
RCTSwiftUI: 239ed2eb9e73de5a6f518810630f0c95e01c8702
@ -2855,7 +2860,7 @@ SPEC CHECKSUMS:
react-native-get-random-values: d16467cf726c618e9c7a8c3c39c31faa2244bbba
react-native-image-picker: 23540feacc79c63c60857f318fdfa8477c26e70a
react-native-notifications: e2d3c022d6077de7e420ba5c01b4bd9464f3941d
react-native-safe-area-context: 6b4966397ada0f7dd481e4486a2ef936834861a1
react-native-safe-area-context: fb5c8ee9f6dd62ef710611b3d370c501f42a4ac0
react-native-secure-key-store: eb45b44bdec3f48e9be5cdfca0f49ddf64892ea6
react-native-tcp-socket: 7c7e53a07f122ecf00fb3626684bc0ca82c4f044
react-native-vector-icons-entypo: f9de1c24005da510dde0de27caf0d2f5471bd433
@ -2900,22 +2905,23 @@ SPEC CHECKSUMS:
ReactNativeCameraKit: 5974256fc608631c1c812710cd98abe95dae0f88
ReactNativeDependencies: 75299c281f422106c723e79dc1f6ce7ef03241be
RealmJS: 1c37c6bdfe060f4caa0f9175aa0eedb962622ee1
RNBackgroundFetch: 64b1215fbb8ec58afba877ca0ce177e009ce12b7
RNCAsyncStorage: 2ad919e88b8bc2cd80e8697ce66d04d006743283
RNCClipboard: 715fa7c6c8366f17d00f05a439ee7488f390fa5f
RNDefaultPreference: 8a089ee8ce829a66c5453e3c5434f0785499d1c3
RNDeviceInfo: bcce8752b5043a623fe3c26789679b473f705d3c
RNFS: 89de7d7f4c0f6bafa05343c578f61118c8282ed8
RNGestureHandler: 187c5c7936abf427bc4d22d6c3b1ac80ad1f63c0
RNGestureHandler: 2ff61eac036eaf89f6818bf4ed9c39771a17d134
RNHandoff: bc8af5a86853ff13b033e7ba1114c3c5b38e6385
RNKeychain: 6778b35b5bd067c322f8479526ac09b1d61f31d0
RNLocalize: f370284ea42c48f29f0d8dd3a7bcc28a04f82155
RNPermissions: dfbe915a8ee532bc55018cf5e387407847713b02
RNQuickAction: c2c8f379e614428be0babe4d53a575739667744d
RNReactNativeHapticFeedback: 576e23c1ad2d800ded4502be3f66b767308b63a1
RNReanimated: c4e6659e58b793885ae6da476cb514fc913e7b85
RNScreens: 01b065ded2dfe7987bcce770ff3a196be417ff41
RNReanimated: f735b1747a7a93bda7ca102c6d37a3cf54b6d5e8
RNScreens: 991cc417cd396602a6cf59a42139e5a9d91462a9
RNShare: 2afdc1739d80ac140b2870ae81e8b2098f4599d9
RNSVG: 04044c3abcf177fd674a1a3d13097efa1adebcbe
RNSVG: 0e52210d4d43165e7e2cf9c890a9848b27e513ac
RNWatch: 28fe1f5e0c6410d45fd20925f4796fce05522e3f
RNWorklets: dd3b2cb0750090d78d85cd3b3ec0fdbeab5ce118
Yoga: 77dfa8673de2874e1855002ae59c68b8be9b007b

View File

@ -11,6 +11,13 @@ module.exports = {
'^expo/fetch$': '<rootDir>/util/expo-fetch-nodejs.js',
'^@react-native-vector-icons/(.*)$': '<rootDir>/tests/mocks/vector-icons.js',
'^react-native-svg$': '<rootDir>/tests/mocks/react-native-svg.js',
// Mirror of metro.config.js resolveRequest: descriptors-core uses @noble/hashes v2
// subpaths (e.g. `sha2.js`, `legacy.js`) but does not declare it as a dep, so npm
// resolves up to v1.3.3 (which only exposes the no-extension subpaths via `exports`).
// Redirect any `.js`-suffixed @noble/hashes subpath to the v2 copy nested under
// descriptors-scure. bitcoinjs-lib imports `@noble/hashes/sha256` (no extension)
// so it is unaffected.
'^@noble/hashes/(.+\\.js)$': '<rootDir>/node_modules/@bitcoinerlab/descriptors-scure/node_modules/@noble/hashes/$1',
},
setupFiles: ['./tests/setup.js'],
watchPathIgnorePatterns: ['<rootDir>/node_modules'],

View File

@ -15,12 +15,21 @@
"seed": "عبارة الاسترداد",
"success": "نجاح",
"wallet_key": "مفتاح المحفظة",
"close": "اغلاق",
"change_input_currency": "تغيير عملة الادخال",
"close": "إغلاق",
"change_input_currency": "تغيير عملة الإدخال",
"refresh": "تحديث",
"pick_file": "اختر ملف",
"enter_amount": "أدخل القيمة",
"qr_custom_input_button": "أنقر ١٠ مرات لإدخال قيمة مخصصة"
"qr_custom_input_button": "أنقر ١٠ مرات لإدخال قيمة مخصصة",
"copied": "تم النسخ!",
"discard_changes_explain": "لديك تغييرات غير محفوظة. هل أنت متأكد أنك تريد تجاهلها ومغادرة الشاشة؟",
"enter_url": "إدخال الرابط",
"save": "حفظ...",
"pick_image": "اختيار من المكتبة",
"unlock": "فتح القفل",
"port": "المنفذ",
"ssl_port": "منفذ SSL",
"suggested": "مقترح"
},
"azteco": {
"codeIs": "رمز القسيمة الخاص بك هو",
@ -29,12 +38,14 @@
"redeem": "الاسترداد إلى المحفظة",
"redeemButton": "الاسترداد",
"success": "نجح الاسترداد",
"title": "استرداد قسيمة Azte.co"
"title": "استرداد قسيمة Azte.co",
"successMessage": "تم استرداد القسيمة بنجاح! من المفترض أن تصل أموالك إلى محفظة Bitcoin الخاصة بك قريبًا."
},
"entropy": {
"save": "حفظ",
"title": "الإنتروبيا (العشوائية)",
"undo": "تراجع"
"undo": "تراجع",
"amountOfEntropy": "{bits} من {limit} بت"
},
"errors": {
"broadcast": "فشل البث",
@ -52,7 +63,9 @@
"refill_external": "إعادة التعبئة باستخدام محفظة خارجية",
"refill_lnd_balance": "إعادة تعبئة رصيد محفظة البرق (Lightning)",
"sameWalletAsInvoiceError": "لا يمكنك دفع فاتورة بنفس المحفظة المستخدمة لإنشائها.",
"title": "إدارة الأموال"
"title": "إدارة الأموال",
"errorInvoiceExpired": "انتهت صلاحية الفاتورة.",
"payment": "دفعة"
},
"lndViewInvoice": {
"additional_info": "معلومة إضافية",
@ -61,7 +74,9 @@
"please_pay_between_and": "يرجى دفع ما بين {min} و{max}",
"please_pay": "يُرجى الدفع",
"sats": "بالساتوشي",
"wasnt_paid_and_expired": "لم يتم دفع هذه البرقية وانتهت صلاحيتها"
"wasnt_paid_and_expired": "لم يتم دفع هذه البرقية وانتهت صلاحيتها",
"preimage": "صورة أولية",
"date_time": "التاريخ والوقت"
},
"plausibledeniability": {
"create_fake_storage": "إنشاء وحدة تخزين مشفرة",
@ -75,9 +90,11 @@
"ask": "هل حفظت العبارة الاحتياطية لمحفظتك؟ ستحتاج إلى هذه العبارة الاحتياطية للوصول إلى أموالك في حالة فقدانك لهذا الجهاز. ودون العبارة الاحتياطية، ستفقد أموالك للأبد.",
"ok": "حسنًا، لقد دوَّنتها!",
"ok_lnd": "حسنًا، لقد حفظتها.",
"text": "يُرجى أخذ لحظة من وقتك لكتابة هذه العبارة التذكيرية على ورقة. إنها وسيلتك الاحتياطية لاستعادة المحفظة على جهاز آخر.",
"text_lnd": "يُرجى حفظ هذه النسخة الاحتياطية للمحفظة. لكي تتتمكن من استعادة المحفظة في حالة فقدها.",
"title": "تم إنشاء محفظتك..."
"text": "يُرجى أخذ لحظة من وقتك لكتابة هذه العبارة التذكيرية على ورقة.\nإنها وسيلتك الاحتياطية لاستعادة المحفظة على جهاز آخر.",
"text_lnd": "يُرجى حفظ هذه النسخة الاحتياطية للمحفظة. لكي تتمكن من استعادة المحفظة في حالة فقدها.",
"title": "تم إنشاء محفظتك...",
"ask_no": "لا، لم أقم بذلك.",
"ask_yes": "نعم، لقد قمت بذلك."
},
"receive": {
"details_create": "إنشاء",
@ -87,7 +104,12 @@
"maxSats": "الحد الأقصى للمبلغ هو {max} ساتوشي",
"maxSatsFull": "الحد الأقصى للمبلغ هو {max} ساتوشي أو {currency}",
"minSats": "الحد الأدنى للمبلغ هو {min} ساتوشي",
"minSatsFull": "الحد الأدنى للمبلغ هو {min} ساتوشي أو {currency}"
"minSatsFull": "الحد الأدنى للمبلغ هو {min} ساتوشي أو {currency}",
"details_share": "مشاركة...",
"address_not_found": "تعذر إنشاء عنوان استلام.",
"reset": "إعادة تعيين",
"qrcode_for_the_address": "رمز QR للعنوان",
"bip47_explanation": "رموز الدفع هي عنوان عالمي يتجنب الكشف عن عناوين محفظتك. لن تدعمها جميع الخدمات."
},
"send": {
"provided_address_is_invoice": "يبدو أن هذا عنوان برقية. من فضلك انتقل إلى محفظة البرق الخاصة بك لدفع هذه الفاتورة.",
@ -105,7 +127,7 @@
"create_fee": "الرسوم",
"create_memo": "مذكرة",
"create_satoshi_per_vbyte": "ساتوشي لكل بايت افتراضي",
"create_this_is_hex": "هذا هو رقم العملية بصيغة ست عشرية (Hex) ، موقَّع وجاهز للبث على الشبكة.",
"create_this_is_hex": "هذا هو رقم العملية بصيغة ست عشرية (Hex)، موقَّع وجاهز للبث على الشبكة.",
"create_to": "إلى",
"create_tx_size": "حجم المعاملة",
"create_verify": "التحقق على coinb.in",
@ -116,21 +138,21 @@
"details_adv_fee_bump": "السماح بزيادة الرسوم",
"details_adv_full": "استخدام الرصيد الكامل",
"details_adv_full_sure": "هل أنت متأكد أنك تريد استخدام الرصيد الكامل لمحفظتك لهذه المعاملة؟",
"details_adv_full_sure_frozen": "هل أنت متأكد انك ترغب بإستخدام الرصيد الكامل لمحفظتك لهذة المعاملة؟ يرجى ملاحظة انه تم استبعاد العملات المجمدة.",
"details_adv_full_sure_frozen": "هل أنت متأكد أنك ترغب باستخدام الرصيد الكامل لمحفظتك لهذه المعاملة؟ يرجى ملاحظة أنه تم استبعاد العملات المجمدة.",
"details_adv_import": "استيراد العملية",
"details_adv_import_qr": "استيراد معاملة (QR)",
"details_amount_field_is_not_valid": "المبلغ غير صالح",
"details_amount_field_is_less_than_minimum_amount_sat": "المبلغ المحدد صغير جدًا. الرجاء إدخال مبلغ أكبر من 500 ساتوشي.",
"details_create": "إنشاء برقية",
"details_error_decode": "يتعذَّر تجزئة وتحليل عنوان البتكوين",
"details_error_decode": "يتعذَّر فك ترميز عنوان البتكوين",
"details_fee_field_is_not_valid": "حقل الرسوم غير صالح",
"details_next": "التالي",
"details_no_signed_tx": "لا يحتوي الملف المحدَّد على معاملة موقَّعة يمكن استيرادها.",
"details_note_placeholder": "ملاحظة شخصية",
"details_scan": "المسح الضوئي",
"details_scan_hint": "انقر نقرًا مزدوجًا لنسخ او استيراد مستلم",
"details_scan_hint": "انقر نقرًا مزدوجًا لنسخ أو استيراد مستلم",
"details_total_exceeds_balance": "مبلغ الإرسال يتجاوز الرصيد المتاح.",
"details_total_exceeds_balance_frozen": "مبلغ الإرسال يتجاوز الرصيد المتاح، يرجى ملاحظة انه تم استبعاد العملات المجمدة.",
"details_total_exceeds_balance_frozen": "مبلغ الإرسال يتجاوز الرصيد المتاح، يرجى ملاحظة أنه تم استبعاد العملات المجمدة.",
"details_unrecognized_file_format": "تنسيق ملف غير معروف",
"details_wallet_before_tx": "يجب عليك إضافة محفظة بتكوين أولًا قبل إنشاء معاملة.",
"dynamic_init": "جارٍ التهيئة...",
@ -167,7 +189,24 @@
"reset_amount": "إعادة تعيين المبلغ",
"reset_amount_confirm": "هل تريد إعادة تعيين المبلغ؟",
"success_done": "تم",
"problem_with_psbt": "مشكلة مع PSBT"
"problem_with_psbt": "مشكلة مع PSBT",
"details_insert_contact": "إدراج جهة اتصال",
"details_add_recc_rem_all_alert_description": "هل أنت متأكد أنك تريد إزالة جميع المستلمين؟",
"details_add_rec_rem_all": "إزالة جميع المستلمين",
"details_recipients_title": "المستلمون",
"details_recipient_title": "المستلم #{number} من #{total}",
"please_complete_recipient_title": "مستلم غير مكتمل",
"please_complete_recipient_details": "يُرجى إكمال تفاصيل المستلم #{number} قبل إضافة مستلم جديد.",
"details_frozen": "{amount} BTC مجمدة.",
"details_scan_error": "خطأ في المسح الضوئي",
"insert_custom_fee": "إدخال الرسوم",
"invalid_psbt": "PSBT غير صالحة.",
"qr_error_no_qrcode": "تعذر العثور على رمز QR صالح في الصورة المحددة. تأكد من أن الصورة تحتوي على رمز QR فقط دون أي محتوى إضافي مثل النصوص أو الأزرار.",
"txSaved": "تم حفظ ملف المعاملة ({filePath}).",
"file_saved_at_path": "تم حفظ الملف ({filePath}).",
"cant_send_to_silentpayment_adress": "لا يمكن لهذه المحفظة الإرسال إلى عناوين Silent Payments",
"cant_send_to_bip47": "لا يمكن لهذه المحفظة الإرسال إلى رموز الدفع BIP47",
"cant_find_bip47_notification": "أضف رمز الدفع هذا إلى جهات الاتصال أولاً"
},
"settings": {
"about": "نبذة",
@ -180,14 +219,14 @@
"performance_score": "معدل الأداء: {num}",
"run_performance_test": "اختبار الأداء",
"about_selftest": "تشغيل اختبار ذاتي",
"about_selftest_electrum_disabled": "لا يتوفر الاختبار الذاتي مع وضع Electrum الغير متصل بالانترنت. يرجى تعطيل وضع عدم اتصال الشبكة والمحاولة مرة أخرى.",
"about_selftest_electrum_disabled": "لا يتوفر الاختبار الذاتي مع وضع Electrum غير المتصل بالإنترنت. يرجى تعطيل وضع عدم اتصال الشبكة والمحاولة مرة أخرى.",
"about_selftest_ok": "تم اجتياز جميع الاختبارات الداخلية بنجاح. المحفظة تعمل بشكل جيد.",
"about_sm_github": "GitHub",
"about_sm_telegram": "قناة تيليجرام",
"biometrics": "القياسات الحيوية",
"biom_10times": "لقد حاولت إدخال كلمة المرور الخاصة بك 10 مرات. هل ترغب في إعادة تعيين التخزين الخاص بك؟ سيؤدي هذا إلى إزالة جميع المحافظ وفك تشفير التخزين الخاص بك.",
"biom_conf_identity": "الرجاء تأكيد هويتك.",
"biom_remove_decrypt": "ستتم إزالة جميع محافظك وفك تشفير التخزين الخاص بك. هل انت متأكد انك تريد المتابعة؟",
"biom_remove_decrypt": "ستتم إزالة جميع محافظك وفك تشفير التخزين الخاص بك. هل أنت متأكد أنك تريد المتابعة؟",
"currency": "العملة",
"currency_fetch_error": "حدث خطأ أثناء الحصول على سعر العملة المحددة.",
"default_title": "عند التشغيل",
@ -217,7 +256,7 @@
"header": "الإعدادات",
"language": "اللغة",
"last_updated": "آخر تحديث",
"language_isRTL": "يجب اعادة تشغيل BlueWallet حتى تظهر تعديلات تغيير اللغة.",
"language_isRTL": "يجب إعادة تشغيل BlueWallet حتى تظهر تعديلات تغيير اللغة.",
"lightning_saved": "تم حفظ تغييراتك بنجاح",
"lightning_settings": "إعدادات البرق",
"network": "الشبكة",
@ -226,11 +265,11 @@
"not_a_valid_uri": "معرِّف URI غير صالح",
"notifications": "الإشعارات",
"open_link_in_explorer": "فتح الرابط في المتصفح",
"password": "كلمه المرور",
"password": "كلمة المرور",
"plausible_deniability": "الإنكار المقبول",
"privacy": "الخصوصية",
"privacy_read_clipboard": "قراءة الحافظة",
"privacy_system_settings": "اعدادات الجهاز",
"privacy_system_settings": "إعدادات الجهاز",
"privacy_quickactions": "اختصارات المحفظة",
"privacy_clipboard_explanation": "عرض اختصار إذا تم العثور على عنوان أو فاتورة في الحافظة الخاصة بك.",
"privacy_do_not_track": "تعطيل التحليلات",
@ -239,20 +278,61 @@
"selfTest": "اختبار ذاتي",
"save": "حفظ",
"saved": "تم الحفظ",
"total_balance": "الرصيد الاجمالي",
"total_balance": "الرصيد الإجمالي",
"total_balance_explanation": "اعرض الرصيد الإجمالي لجميع محافظك على ويدجت الشاشة الرئيسية الخاصة بك.",
"widgets": "ويدجت",
"tools": "ادوات"
"tools": "أدوات",
"block_explorer_invalid_custom_url": "الرابط المقدم غير صالح. يُرجى إدخال رابط صالح يبدأ بـ http:// أو https://.",
"privacy_temporary_screenshots": "السماح بالتقاط الشاشة",
"privacy_temporary_screenshots_instructions": "سيتم إيقاف حماية التقاط الشاشة مؤقتًا، مما يسمح بأخذ لقطات وتسجيلات الشاشة. ستعاد الحماية تلقائيًا عند إغلاق BlueWallet وإعادة فتحه.",
"biometrics_no_longer_available": "تغيرت إعدادات جهازك ولم تعد متطابقة مع إعدادات الأمان المحددة في التطبيق. يُرجى إعادة تفعيل القياسات الحيوية أو رمز المرور، ثم إعادة تشغيل التطبيق لتطبيق هذه التغييرات.",
"biom_no_passcode": "لا يحتوي جهازك على رمز المرور أو القياسات الحيوية. للمتابعة، يُرجى تكوين رمز المرور أو القياسات الحيوية في تطبيق الإعدادات.",
"currency_source": "يتم الحصول على السعر من",
"donate": "تبرع",
"donate_description": "ساعدنا في إبقاء Blue مجانيًا!",
"electrum_error_connect": "تعذر الاتصال بخادم Electrum المقدم",
"electrum_error_connect_tor": "تعذر الاتصال بخادم Electrum المقدم. يُرجى التأكد من اتصال تطبيق Orbot والمحاولة مرة أخرى.",
"set_lndhub_as_default": "تعيين {url} كخادم LNDhub الافتراضي؟",
"electrum_preferred_server": "الخادم المفضل",
"electrum_preferred_server_description": "أدخل الخادم الذي تريد أن تستخدمه محفظتك لجميع أنشطة Bitcoin. بمجرد التعيين، ستستخدم محفظتك هذا الخادم حصريًا للتحقق من الأرصدة وإرسال المعاملات وجلب بيانات الشبكة. تأكد من ثقتك بهذا الخادم قبل تعيينه.",
"electrum_history": "السجل",
"electrum_reset_to_default": "سيسمح هذا لـ BlueWallet باختيار خادم عشوائيًا من قائمة الخوادم.",
"electrum_reset_to_default_and_clear_history": "إعادة التعيين إلى الافتراضي ومسح السجل",
"encrypt_enc_and_pass": "محمي بكلمة مرور",
"encrypt_storage_explanation_headline": "تمكين تشفير التخزين",
"encrypt_storage_explanation_description_line1": "يضيف تمكين تشفير التخزين طبقة حماية إضافية لتطبيقك من خلال تأمين طريقة تخزين بياناتك على جهازك. هذا يجعل من الصعب على أي شخص الوصول إلى معلوماتك دون إذن.",
"encrypt_storage_explanation_description_line2": "ومع ذلك، من المهم أن تعلم أن هذا التشفير يحمي فقط الوصول إلى محافظك المخزنة في حلقة مفاتيح الجهاز. لا يضع كلمة مرور أو أي حماية إضافية على المحافظ نفسها.",
"i_understand": "أنا أفهم",
"block_explorer": "مستكشف الكتل",
"block_explorer_preferred": "استخدام مستكشف الكتل المفضل",
"block_explorer_error_saving_custom": "حدث خطأ في حفظ مستكشف الكتل المفضل",
"set_as_preferred": "تعيين كمفضل",
"set_as_preferred_electrum": "تعيين {host}:{port} كخادم مفضل سيعطل الاتصال بخادم مقترح عشوائيًا.",
"encrypted_feature_disabled": "لا يمكن استخدام هذه الميزة عند تمكين التخزين المشفر.",
"encrypt_use_expl": "سيتم استخدام {type} لتأكيد هويتك قبل إجراء معاملة أو فتح القفل أو التصدير أو حذف محفظة.",
"biometrics_fail": "إذا لم يتم تمكين {type}، أو فشل في فتح القفل، يمكنك استخدام رمز مرور جهازك كبديل.",
"license": "الترخيص",
"lightning_error_lndhub_uri": "URI خاص بـ LNDhub غير صالح",
"lightning_error_lndhub_uri_tor": "URI خاص بـ LNDhub غير صالح. يُرجى التأكد من اتصال تطبيق Orbot والمحاولة مرة أخرى.",
"lightning_settings_explain": "للاتصال بنود LND الخاص بك، يُرجى تثبيت LNDhub ووضع عنوانه هنا في الإعدادات. يُرجى ملاحظة أن المحافظ التي يتم إنشاؤها بعد حفظ التغييرات فقط ستتصل بـ LNDhub المحدد.",
"lndhub_github": "مستودع GitHub",
"electrum_suggested_description": "عندما لا يتم تعيين خادم مفضل، سيتم اختيار خادم مقترح للاستخدام عشوائيًا.",
"password_explain": "أدخل كلمة المرور التي ستستخدمها لفتح تخزينك.",
"privacy_quickactions_explanation": "اضغط مع الاستمرار على أيقونة تطبيق BlueWallet لعرض رصيد محفظتك بسرعة.",
"push_notifications_explanation": "من خلال تمكين الإشعارات، سيتم إرسال رمز الجهاز الخاص بك إلى الخادم، إلى جانب عناوين المحفظة ومعرفات المعاملات لجميع المحافظ والمعاملات التي تتم بعد تمكين الإشعارات. يُستخدم رمز الجهاز لإرسال الإشعارات، وتسمح لنا معلومات المحفظة بإعلامك بشأن Bitcoin الوارد أو تأكيدات المعاملات.\n\nيتم نقل المعلومات فقط من بعد تمكين الإشعارات—لا يتم جمع أي شيء من قبل ذلك.\n\nسيؤدي تعطيل الإشعارات إلى إزالة كل هذه المعلومات من الخادم. بالإضافة إلى ذلك، فإن حذف محفظة من التطبيق سيؤدي أيضًا إلى إزالة المعلومات المرتبطة بها من الخادم.",
"success_transaction_broadcasted": "تم بث معاملتك بنجاح!"
},
"notifications": {
"would_you_like_to_receive_notifications": "هل ترغب في تلقي إشعارات عند استلام مدفوعات؟"
"would_you_like_to_receive_notifications": "هل ترغب في تلقي إشعارات عند استلام مدفوعات؟",
"notifications_subtitle": "المدفوعات الواردة وتأكيدات المعاملات",
"no_and_dont_ask": "لا، ولا تسألني مرة أخرى.",
"permission_denied_message": "لقد رفضت الإذن لإرسال الإشعارات إليك. إذا كنت ترغب في تلقي الإشعارات، يُرجى تفعيلها في إعدادات جهازك."
},
"transactions": {
"cancel_explain": "سنستبدل هذه المعاملة بمعاملة ذات رسوم أعلى وتُدفع لك انت؛ سيؤدي ذلك الى الغاء المعاملة واعادة المبلغ لمحفظتك. وهذا ما يُسمَّى RBF؛ أي الاستبدال بالرسوم.",
"cancel_explain": "سنستبدل هذه المعاملة بمعاملة ذات رسوم أعلى وتُدفع لك أنت؛ سيؤدي ذلك إلى إلغاء المعاملة وإعادة المبلغ لمحفظتك. وهذا ما يُسمَّى RBF؛ أي الاستبدال بالرسوم.",
"cancel_no": "هذه المعاملة غير قابلة للاستبدال",
"cancel_title": "إلغاء هذه المعاملة (RBF)",
"confirmations_lowercase": "{confirmations} تأكيد",
"copy_link": "نسخ الرابط",
"expand_note": "توسيع الملاحظة",
"cpfp_create": "إنشاء",
"cpfp_exp": "سننشئ عملية أخرى تستبدل عمليتك غير المؤكدة. وسيكون إجمالي الرسوم أعلى من رسوم العملية الأصلية؛ حتى يجري تعدينها بشكلٍ أسرع. وهذا ما يُسمَّى CPFP؛ أي التحكم بالعملية الرئيسية بمعاملة فرعية.",
@ -264,7 +344,6 @@
"details_copy_block_explorer_link": "نسخ رابط متصفح الكتل",
"details_copy_note": "نسخ الملاحظة",
"details_copy_txid": "نسخ معرّف المعاملة",
"details_from": "من",
"details_inputs": "المدخلات",
"details_outputs": "المخرجات",
"date": "التاريخ",
@ -279,7 +358,6 @@
"eta_10m": "الوقت المقدر للتأكيد: في حوالي 10 دقائق",
"eta_3h": "الوقت المقدر للتأكيد: في حوالي 3 ساعات",
"eta_1d": "الوقت المقدر للتأكيد: في حوالي يوم واحد",
"view_wallet": "عرض {walletLabel}",
"list_title": "العمليات",
"list_title_received": "التاريخ",
"transaction": "العملية",
@ -291,13 +369,42 @@
"transactions_count": "عدد العمليات",
"txid": "معرّف العملية",
"updating": "جارٍ التحديث ...",
"watchOnlyWarningDescription": "تنبيه احتيال: انتبه إلى أن المحتالين عادةً ما يستخدمون هذا النوع من المحفظة \"للمشاهدة فقط\" لمحاولة السرقة من المستخدمين. هذه المحفظة التي لا يمكنك التحكم بها أو الإرسال منها، إلا بتصريح جهاز آخر، المحفظة تسمح فقط بمراقبة الرصيد."
"watchOnlyWarningDescription": "تنبيه احتيال: انتبه إلى أن المحتالين عادةً ما يستخدمون هذا النوع من المحفظة \"للمشاهدة فقط\" لمحاولة السرقة من المستخدمين. هذه المحفظة التي لا يمكنك التحكم بها أو الإرسال منها، إلا بتصريح جهاز آخر، المحفظة تسمح فقط بمراقبة الرصيد.",
"transaction_loading_error": "حدثت مشكلة في تحميل المعاملة. يُرجى المحاولة لاحقًا.",
"transaction_not_available": "المعاملة غير متوفرة",
"details_view_in_browser": "العرض في المتصفح",
"incoming_transaction": "معاملة واردة",
"outgoing_transaction": "معاملة صادرة",
"expired_transaction": "معاملة منتهية الصلاحية",
"pending_transaction": "معاملة قيد الانتظار",
"offchain": "خارج السلسلة",
"onchain": "على السلسلة",
"list_title_sent": "مرسلة",
"watchOnlyWarningTitle": "تحذير أمني",
"custom_fee_warning_title": "تحذير",
"custom_fee_warning_description": "الرسوم الأقل من 1 ساتوشي/بايت افتراضي صالحة، ولكن قد لا يتم نقلها بسبب سياسات النود.",
"details_eta_analyzing": "جارٍ التحليل...",
"details_sent": "مرسلة",
"details_section": "التفاصيل",
"details_explorer": "مستكشف",
"details_network_fee": "رسوم الشبكة",
"details_to_address": "إلى",
"details_id": "المعرّف",
"details_note": "ملاحظة",
"details_add_note": "إضافة",
"details_advanced": "متقدم",
"details_fee_rate": "معدل الرسوم",
"details_size": "الحجم",
"details_virtual_size": "الحجم الافتراضي",
"details_tx_hex": "Hex المعاملة",
"details_inputs_count": "المدخلات ({count})",
"details_outputs_count": "المخرجات ({count})"
},
"wallets": {
"add_bitcoin": "بتكوين",
"add_bitcoin_explain": "محفظة بتكوين بسيطة وقوية",
"add_create": "إنشاء",
"total_balance": "الرصيد الاجمالي",
"total_balance": "الرصيد الإجمالي",
"add_entropy": "الإنتروبيا (العشوائية)",
"add_entropy_generated": "{gen} بايت من الإنتروبيا (العشوائية) المحققة",
"add_entropy_provide": "توفير الإنتروبيا (العشوائية) باستخدام النرد",
@ -316,12 +423,12 @@
"details_advanced": "الخيارات المتقدمة",
"details_are_you_sure": "هل أنت متأكد؟",
"details_connected_to": "متصلة بـ",
"details_del_wb_q": "هذه المحفظة يوجد بها رصيد. قبل الاستمرار يرجى العلم أنك لن تتمكن من استرداد الأموال بدون عبارة الاسترداد لهذه المحفظة. لتجنب الحذف الغير متعمد، يرجى إدخال رصيد المحفظة البالغ {balance} ساتوشي.",
"details_del_wb_q": "هذه المحفظة يوجد بها رصيد. قبل الاستمرار يرجى العلم أنك لن تتمكن من استرداد الأموال بدون عبارة الاسترداد لهذه المحفظة. لتجنب الحذف غير المتعمد، يرجى إدخال رصيد المحفظة البالغ {balance} ساتوشي.",
"details_delete": "الحذف",
"details_delete_wallet": "حذف المحفظة",
"details_derivation_path": "مسار الاشتقاق (derivation path)",
"details_export_backup": "التصدير/النسخ الاحتياطي",
"details_export_history": "تصدير السجل ل ملف CSV",
"details_export_history": "تصدير السجل إلى ملف CSV",
"details_master_fingerprint": "البصمة الرئيسية",
"details_multisig_type": "متعدد التواقيع",
"details_show_xpub": "إظهار عنوان XPUB للمحفظة",
@ -364,38 +471,80 @@
"list_title": "المحافظ",
"list_tryagain": "إعادة المحاولة",
"no_ln_wallet_error": "قبل دفع البرقية، يجب عليك أولاً إضافة محفظة برق.",
"looks_like_bip38": "يبدوا ان هذا مفتاح خاص محمي بكلمة مرور (BIP38).",
"looks_like_bip38": "يبدو أن هذا مفتاح خاص محمي بكلمة مرور (BIP38).",
"please_continue_scanning": "الرجاء متابعة الفحص.",
"select_no_bitcoin": "لا توجد محافظ بتكوين متاحة حاليًا.",
"select_no_bitcoin_exp": "تحتاج إلى محفظة بتكوين لإعادة تعبئة محافظ البرق. يُرجى إنشاء محفظة أو استيراد واحدة.",
"select_wallet": "اختيار محفظة",
"xpub_copiedToClipboard": "تم النسخ إلى الحافظة.",
"pull_to_refresh": "اسحب للتحديث",
"add_ln_wallet_first": "يجب عليك أولاً إضافة محفظة برق.",
"identity_pubkey": "هوية Pubkey",
"xpub_title": "عنوان XPUB للمحفظة"
"xpub_title": "عنوان XPUB للمحفظة",
"add_entropy_reset_title": "إعادة تعيين الإنتروبيا",
"add_entropy_reset_message": "سيؤدي تغيير نوع المحفظة إلى إعادة تعيين الإنتروبيا الحالية. هل تريد المتابعة؟",
"add_entropy_bytes": "{bytes} بايت من الإنتروبيا",
"add_lndhub": "الاتصال بـ LNDhub الخاص بك",
"add_lndhub_error": "عنوان النود المقدم هو نود LNDhub غير صالح.",
"add_wallet_seed_length": "طول عبارة الاسترداد",
"add_wallet_seed_length_12": "12 كلمة",
"add_wallet_seed_length_24": "24 كلمة",
"clear_clipboard_on_import": "مسح الحافظة عند الاستيراد",
"details_del_wb_err": "مبلغ الرصيد المقدم لا يطابق رصيد هذه المحفظة. يُرجى المحاولة مرة أخرى.",
"details_display": "العرض في الشاشة الرئيسية",
"swipe_balance_hide": "إخفاء",
"swipe_balance_show": "إظهار",
"drag_to_reorder": "اسحب لإعادة الترتيب",
"clear_search": "مسح البحث",
"learn_more": "معرفة المزيد",
"import_discovery_offline": "BlueWallet حاليًا في وضع عدم الاتصال. في هذا الوضع، لا يمكنه التحقق من وجود المحفظة، لذلك ستحتاج إلى تحديد المحفظة الصحيحة يدويًا",
"import_derivation_found": "تم العثور",
"import_derivation_found_not": "لم يتم العثور",
"import_derivation_loading": "جارٍ التحميل...",
"import_derivation_subtitle": "أدخل مسار اشتقاق مخصص، وسنحاول اكتشاف محفظتك.",
"import_derivation_unknown": "غير معروف",
"import_wrong_path": "مسار اشتقاق خاطئ",
"list_create_a_wallet_text": "إنها مجانية، ويمكنك إنشاء \nالعديد منها كما تشاء.",
"manage_title": "إدارة المحافظ",
"no_results_found": "لم يتم العثور على نتائج.",
"warning_do_not_disclose": "لا تشارك المعلومات أدناه أبدًا",
"scan_import": "امسح رمز QR هذا لاستيراد محفظتك في تطبيق آخر.",
"write_down_header": "إنشاء نسخة احتياطية يدوية",
"write_down": "اكتب هذه الكلمات واحفظها بأمان. استخدمها لاستعادة محفظتك لاحقًا.",
"wallet_type_this": "نوع هذه المحفظة هو {type}.",
"share_number": "مشاركة {number}",
"copy_ln_url": "انسخ هذا الرابط واحفظه بأمان لاستعادة محفظتك لاحقًا.",
"copy_ln_public": "انسخ هذه المعلومات واحفظها بأمان لاستعادة محفظتك لاحقًا.",
"manage_wallets_search_placeholder": "البحث في المحافظ والعناوين والمعاملات والمذكرات",
"more_info": "المزيد من المعلومات",
"details_delete_wallet_error_message": "حدثت مشكلة في تأكيد ما إذا كانت هذه المحفظة قد أُزيلت من الإشعارات—قد يكون ذلك بسبب مشكلة في الشبكة أو ضعف الاتصال. إذا تابعت، فقد تستمر في تلقي إشعارات للمعاملات المتعلقة بهذه المحفظة، حتى بعد حذفها.",
"details_delete_anyway": "احذف على أي حال"
},
"total_balance_view": {
"title": "الرصيد الاجمالي"
"title": "الرصيد الإجمالي",
"display_in_bitcoin": "العرض بـ Bitcoin",
"hide": "إخفاء",
"display_in_sats": "العرض بالساتوشي",
"display_in_fiat": "العرض بـ {currency}",
"explanation": "عرض الرصيد الإجمالي لجميع محافظك في شاشة النظرة العامة."
},
"multisig": {
"multisig_vault": "خزنة متعددة التواقيع",
"default_label": "خزنة متعددة التواقيع",
"multisig_vault_explain": "افضل حماية للمبالغ الكبيرة",
"multisig_vault_explain": "أفضل حماية للمبالغ الكبيرة",
"provide_signature": "قدم توقيعًا",
"vault_key": "مفتاح الخزنة {number}",
"required_keys_out_of_total": "المفاتيح المطلوبة من الاجمالي",
"required_keys_out_of_total": "المفاتيح المطلوبة من الإجمالي",
"fee": "الرسوم: {number}",
"fee_btc": "{number} BTC",
"confirm": "تأكيد",
"header": "إرسال",
"view": "عرض",
"manage_keys": "إدارة المفاتيح",
"how_many_signatures_can_bluewallet_make": "كم عدد التوقيعات التي يمكن لـ BlueWallet ان تنشأها",
"how_many_signatures_can_bluewallet_make": "كم عدد التوقيعات التي يمكن لـ BlueWallet أن تنشئها",
"signatures_required_to_spend": "التوقيعات المطلوبة {number}",
"signatures_we_can_make": "يمكن أن تنشأ {number}",
"signatures_we_can_make": "يمكن أن تنشئ {number}",
"scan_or_import_file": "المسح الضوئي أو استيراد ملف",
"export_coordination_setup": "تصدير تنسيق الاعدادات",
"export_coordination_setup": "تصدير تنسيق الإعدادات",
"cosign_this_transaction": "المشاركة في التوقيع على هذه المعاملة؟",
"lets_start": "لنبدأ",
"create": "إنشاء",
@ -406,11 +555,11 @@
"what_is_vault": "الخزنة هي",
"what_is_vault_numberOfWallets": "{m}-من-{n} محفظة متعددة التواقيع",
"what_is_vault_wallet": ".",
"vault_advanced_customize": "اعدادات الخزنة",
"vault_advanced_customize": "إعدادات الخزنة",
"needs": "تحتاج",
"what_is_vault_description_number_of_vault_keys": "{m} من مفاتيح الخزنة",
"what_is_vault_description_to_spend": ارسال اي معاملة ومفتاح ثالث يمكنك استخدامه كاحتياطي.",
"what_is_vault_description_to_spend_other": ارسال اي معاملة",
"what_is_vault_description_to_spend": إرسال أي معاملة ومفتاح ثالث\nيمكنك استخدامه كاحتياطي.",
"what_is_vault_description_to_spend_other": إرسال أي معاملة",
"quorum": "العدد {m} من {n}",
"quorum_header": "العدد",
"of": "من",
@ -420,34 +569,55 @@
"scan_or_open_file": "المسح الضوئي أو استيراد ملف",
"i_have_mnemonics": "لدي عبارة تذكيرية لهذا المفتاح.",
"type_your_mnemonics": "أدخل العبارة التذكيرية لاستيراد مفتاح خزنتك الحالية.",
"wallet_key_created": "تم انشاء خزنتك. يُرجى أخذ لحظة من وقتك لتدوين عبارة الاسترداد في مكان آمن.",
"wallet_key_created": "تم إنشاء خزنتك. يُرجى أخذ لحظة من وقتك لتدوين عبارة الاسترداد في مكان آمن.",
"are_you_sure_seed_will_be_lost": "هل أنت متأكد؟ ستفقد عبارة الاسترداد إذا لم تحتفظ بها في مكان آخر آمن.",
"forget_this_seed": "انسى هذه العبارة التذكيرية واستخدام XPUB بدلا من ذلك.",
"forget_this_seed": "انسَ هذه العبارة التذكيرية واستخدم XPUB بدلاً من ذلك.",
"export_signed_psbt": "تصدير توقيع PSBT",
"input_fp": "أدخل بصمة الإصبع",
"input_fp": "أدخل البصمة (fingerprint)",
"input_fp_explain": "تخطي لاستخدام الرقم الافتراضي (00000000)",
"input_path": "ادخل مسار الاشتقاق (derivation path)",
"input_path": "أدخل مسار الاشتقاق (derivation path)",
"input_path_explain": "تخطي لاستخدام الخيار الافتراضي ({default})",
"ms_help": "مساعدة",
"ms_help_title": "كيف تعمل الخزائن معتددة التواقيع : النصائح والحيل",
"ms_help_title": "كيف تعمل الخزائن متعددة التواقيع: النصائح والحيل",
"ms_help_text": "محفظة بمفاتيح متعددة، لزيادة الأمان أو التملك المشترك",
"ms_help_title1": "ينصح باستخدام أجهزة متعددة.",
"ms_help_1": "ستعمل الخزنة مع تطبيقات BlueWallet الأخرى والمحافظ المتوافقة مع PSBT، مثل Electrum و Specter و Coldcard و Cobo Vault، إلخ.",
"ms_help_title2": "تحرير المفاتيح",
"ms_help_2": "يمكنك إنشاء جميع مفاتيح الخزنة في هذا الجهاز وإزالتها أو تعديلها لاحقًا. إن وجود جميع المفاتيح على نفس الجهاز له نفس درجة الامان لمحفظة أحادية التوقيع.",
"ms_help_2": "يمكنك إنشاء جميع مفاتيح الخزنة في هذا الجهاز وإزالتها أو تعديلها لاحقًا. إن وجود جميع المفاتيح على نفس الجهاز له نفس درجة الأمان لمحفظة أحادية التوقيع.",
"ms_help_title3": "النسخ الاحتياطية للخزنة",
"ms_help_3": "في خيارات المحفظة، ستجد نسخة احتياطية من الخزنة ونسخة احتياطية بصلاحيات \"مراقبة فقط\". هذه النسخة الاحتياطية هي بمثابة الخريطة لمحفظتك. إنها ضرورية لاستعادة الخزنة في حالة فقدان إحدى عبارات الاسترداد الخاصة بك.",
"ms_help_title4": "استيراد الخزائن",
"ms_help_4": "لاستيراد خزنة متعددة التواقيع، استخدم ملف النسخ الاحتياطي وميزة الاستيراد. إذا كان لديك عبارات الاسترداد و XPUBs فقط ، فيمكنك استخدام زر الاستيراد الفردي عند إنشاء مفاتيح الخزنة.",
"ms_help_4": "لاستيراد خزنة متعددة التواقيع، استخدم ملف النسخ الاحتياطي وميزة الاستيراد. إذا كان لديك عبارات الاسترداد و XPUBs فقط، فيمكنك استخدام زر الاستيراد الفردي عند إنشاء مفاتيح الخزنة.",
"ms_help_title5": "الوضع المتقدم",
"ms_help_5": "بشكل افتراضي، ستقوم BlueWallet بإنشاء خزنة متعددة التواقيع لـ 2 من 3. لإنشاء اعدادًا مختلفة أو تغيير نوع العنوان، قم بتنشيط الوضع المتقدم في الإعدادات."
"ms_help_5": "بشكل افتراضي، ستقوم BlueWallet بإنشاء خزنة متعددة التواقيع لـ 2 من 3. لإنشاء إعدادات مختلفة أو تغيير نوع العنوان، قم بتنشيط الوضع المتقدم في الإعدادات.",
"provide_signature_details": "استخدم جهازك ومحفظتك حيث يوجد المفتاح لتوقيع هذه المعاملة",
"provide_signature_details_bluewallet": "في BlueWallet، انتقل إلى قائمة شاشة الإرسال وحدد ",
"provide_signature_next_steps": "مسح أو استيراد معاملة موقعة",
"provide_signature_next_steps_details": "بمجرد أن توقع محفظتك المعاملة بنجاح، امسح رمز QR المقدم أو استورد الملف المرافق، ثم راجع جميع تفاصيل المعاملة قبل بثها.",
"share": "مشاركة...",
"shared_key_detected": "شريك توقيع تمت مشاركته",
"shared_key_detected_question": "تمت مشاركة شريك توقيع معك، هل تريد استيراده؟",
"invalid_mnemonics": "لا تبدو عبارة الاسترداد هذه صالحة.",
"invalid_cosigner": "بيانات شريك التوقيع غير صالحة",
"invalid_cosigner_format": "شريك توقيع غير صحيح: هذا ليس شريك توقيع لتنسيق {format}.",
"this_is_cosigners_xpub": "هذا هو XPUB الخاص بشريك التوقيع—جاهز للاستيراد إلى محفظة أخرى. من الآمن مشاركته.",
"this_is_cosigners_xpub_airdrop": "إذا قمت بالمشاركة عبر AirDrop، يجب أن يكون المستلمون في شاشة التنسيق.",
"view_edit_cosigners": "عرض/تحرير شركاء التوقيع",
"this_cosigner_is_already_imported": "تم استيراد شريك التوقيع هذا بالفعل."
},
"is_it_my_address": {
"title": "هل هذا عنواني؟",
"owns": "{label} يملك {address}",
"enter_address": "أدخل العنوان",
"check_address": "تحقق من العنوان",
"no_wallet_owns_address": "لا تمتلك أي من المحافظ المتاحة هذا العنوان."
"no_wallet_owns_address": "لا تمتلك أي من المحافظ المتاحة هذا العنوان.",
"view_qrcode": "عرض رمز QR"
},
"autofill_word": {
"title": "الكلمة الأخيرة من عبارة الاسترداد",
"enter": "أدخل عبارة الاسترداد الجزئية",
"generate_word": "إنشاء الكلمة الأخيرة",
"error": "المدخل ليس عبارة استرداد جزئية من 11 أو 23 كلمة. يُرجى المحاولة مرة أخرى."
},
"cc": {
"change": "تغيير",
@ -460,7 +630,14 @@
"use_coin": "استخدم العملة",
"use_coins": "استخدام العملات",
"tip": "تتيح لك هذه الميزة رؤية العملات أو تسميتها أو تجميدها أو تحديدها لتحسين إدارة المحفظة. يمكنك تحديد عدة عملات من خلال النقر على الدوائر الملونة.",
"sort_status": "الحالة"
"sort_status": "الحالة",
"empty": "لا تحتوي هذه المحفظة على أي عملات في الوقت الحالي.",
"sort_asc": "تصاعدي",
"sort_desc": "تنازلي",
"sort_height": "الارتفاع",
"sort_value": "القيمة",
"sort_label": "العلامة",
"sort_by": "الترتيب حسب"
},
"units": {
"BTC": "BTC",
@ -482,7 +659,9 @@
"type_change": "الباقي",
"type_receive": "استلام",
"type_used": "مستخدم",
"transactions": "الحوالات"
"transactions": "الحوالات",
"copy_private_key": "نسخ المفتاح الخاص",
"sensitive_private_key": "تحذير: المفاتيح الخاصة حساسة للغاية. متابعة؟"
},
"lnurl_auth": {
"register_question_part_1": "هل ترغب بفتح حساب في",
@ -502,7 +681,24 @@
},
"bip47": {
"payment_code": "كود الدفع",
"purpose": "أكواد المشاركة التي يمكن أعادة استخدامها (BIP47)",
"not_found": "لم يتم العثور على كود الدفع"
"purpose": "أكواد المشاركة التي يمكن إعادة استخدامها (BIP47)",
"not_found": "لم يتم العثور على كود الدفع",
"contacts": "جهات الاتصال",
"bip47_explain": "رمز قابل لإعادة الاستخدام والمشاركة",
"bip47_explain_subtitle": "BIP47",
"pay_this_contact": "ادفع لجهة الاتصال هذه",
"rename_contact": "إعادة تسمية جهة الاتصال",
"copy_payment_code": "نسخ رمز الدفع",
"hide_contact": "إخفاء جهة الاتصال",
"rename": "إعادة التسمية",
"provide_name": "قدم اسمًا جديدًا لجهة الاتصال هذه",
"add_contact": "إضافة جهة اتصال",
"provide_payment_code": "قدم رمز الدفع",
"invalid_pc": "رمز دفع غير صالح",
"notification_tx_unconfirmed": "معاملة الإشعار غير مؤكدة بعد، يُرجى الانتظار",
"failed_create_notif_tx": "فشل إنشاء المعاملة على السلسلة",
"onchain_tx_needed": "معاملة على السلسلة مطلوبة",
"notif_tx_sent": "تم إرسال معاملة الإشعار. يُرجى الانتظار حتى يتم تأكيدها",
"notif_tx": "معاملة الإشعار"
}
}

View File

@ -4,30 +4,48 @@
"cancel": "Адмяніць",
"continue": "Працягнуць",
"clipboard": "Буфер абмену",
"copied": "Скапіявана!",
"discard_changes": "Адмяніць зьмены?",
"discard_changes_explain": "У вас ёсьць незахаваныя зьмены. Вы ўпэўненыя, што хочаце адхіліць іх і пакінуць экран?",
"enter_password": "Увесьці пароль",
"never": "Ніколі",
"of": "{number} ад {total}",
"ok": "Акей",
"enter_url": "Увесьці URL",
"storage_is_encrypted": "Ваша сховішча зашыфравана. Для расшыфроўкі патрабуецца пароль.",
"yes": "Так",
"no": "Не",
"seed": "Семя",
"save": "Захаваць...",
"seed": "Сід-фраза",
"success": "Посьпех",
"wallet_key": "Ключ ад кашалька"
"wallet_key": "Ключ ад кашалька",
"close": "Закрыць",
"change_input_currency": "Зьмяніць валюту ўводу",
"refresh": "Абнавіць",
"pick_image": "Выбраць з бібліятэкі",
"pick_file": "Выбраць файл",
"enter_amount": "Увесьці суму",
"qr_custom_input_button": "Націсьніце 10 разоў, каб увесьці адвольны ўвод",
"unlock": "Разблякаваць",
"port": "Порт",
"ssl_port": "SSL-порт",
"suggested": "Прапанаваны"
},
"azteco": {
"codeIs": "Ваш код ваўчара",
"errorBeforeRefeem": "Перад выплатай вы павінны спачатку дадаць кашалёк Bitcoin.",
"errorSomething": "Нешта пайшло не так. Сапраўдны ці гэты ваўчар па-ранейшаму?",
"errorSomething": "Нешта пайшло не так. Ці гэты ваўчар яшчэ сапраўдны?",
"redeem": "Перавесьці на кашалёк",
"redeemButton": "Перавесьці",
"success": "Посьпех"
"success": "Посьпех",
"successMessage": "Ваўчар пасьпяхова перавядзены! Вашы сродкі павінны неўзабаве паступіць на ваш кашалёк Bitcoin.",
"title": "Перавесьці ваўчар Azte.co"
},
"entropy": {
"save": "Захаваць",
"title": "Энтрапія",
"undo": "Адмяніць"
"undo": "Адмяніць",
"amountOfEntropy": "{bits} з {limit} бітаў"
},
"errors": {
"broadcast": "Збой трансляцыі.",
@ -35,17 +53,652 @@
"network": "Памылка Сеткі"
},
"lnd": {
"expired": "Скончыўся"
"errorInvoiceExpired": "Тэрмін дзеяньня інвойсу скончыўся.",
"expired": "Скончыўся",
"expiresIn": "Скончыцца праз {time} хвілінаў",
"payButton": "Заплаціць",
"payment": "Плацёж",
"placeholder": "Інвойс альбо адрас",
"potentialFee": "Магчымая камісія: {fee}",
"refill": "Папоўніць",
"refill_create": "Каб працягнуць, калі ласка, стварыце кашалёк Bitcoin для папаўненьня.",
"refill_external": "Папоўніць зь вонкавага кашалька",
"refill_lnd_balance": "Папоўніць баланс кашалька Lightning",
"sameWalletAsInvoiceError": "Вы ня можаце аплаціць інвойс тым жа кашальком, які быў выкарыстаны для яго стварэньня.",
"title": "Кіраваньне сродкамі"
},
"lndViewInvoice": {
"additional_info": "Дадатковая інфармацыя",
"for": "Для:",
"lightning_invoice": "Інвойс Lightning",
"please_pay_between_and": "Калі ласка, заплаціце ад {min} да {max}",
"please_pay": "Калі ласка, заплаціце",
"preimage": "Прообраз",
"sats": "sats.",
"date_time": "Дата і час",
"wasnt_paid_and_expired": "Гэты інвойс ня быў аплачаны, і тэрмін яго дзеяньня скончыўся."
},
"plausibledeniability": {
"create_fake_storage": "Стварыць зашыфраванае сховішча",
"create_password_explanation": "Пароль для падманнага сховішча не павінен супадаць з паролем для вашага асноўнага сховішча.",
"help": "Пры пэўных абставінах вас могуць прымусіць раскрыць пароль. Каб захаваць вашы манэты ў бясьпецы, BlueWallet можа стварыць яшчэ адно зашыфраванае сховішча зь іншым паролем. Пад ціскам вы можаце раскрыць гэты пароль трэцяй асобе. Калі ён будзе ўведзены ў BlueWallet, ён разблакуе новае „падманнае” сховішча. Гэта будзе выглядаць пераканаўча для трэцяй асобы, але сакрэтна захавае ваша асноўнае сховішча з манэтамі ў бясьпецы.",
"help2": "Новае сховішча будзе цалкам функцыянальным, і вы можаце захоўваць там некаторыя мінімальныя сумы, каб яно выглядала больш праўдападобна.",
"password_should_not_match": "Пароль ужо выкарыстоўваецца. Калі ласка, паспрабуйце іншы пароль.",
"title": "Праўдападобнае адмаўленьне"
},
"pleasebackup": {
"ask": "Ці захавалі вы рэзервовую фразу вашага кашалька? Гэтая рэзервовая фраза патрэбна для доступу да вашых сродкаў, калі вы страціце гэтую прыладу. Без рэзервовай фразы вашы сродкі будуць назаўжды страчаны.",
"ask_no": "Не, не захаваў.",
"ask_yes": "Так, захаваў.",
"ok": "Добра, я запісаў гэта.",
"ok_lnd": "Добра, я гэта захаваў.",
"text": "Калі ласка, надайце хвілінку, каб запісаць гэтую мнэмонічную фразу на лісьце паперы.\nГэта ваша рэзервовая копія, і вы можаце выкарыстаць яе для аднаўленьня кашалька.",
"text_lnd": "Калі ласка, захавайце гэтую рэзервовую копію кашалька. Яна дазваляе вам аднавіць кашалёк у выпадку страты.",
"title": "Ваш кашалёк створаны."
},
"receive": {
"details_create": "Стварыць",
"details_label": "Апісаньне",
"details_setAmount": "Атрымаць з сумай",
"details_share": "Падзяліцца...",
"address_not_found": "Немагчыма згенэраваць адрас для атрыманьня.",
"bip47_explanation": "Плацежныя коды — гэта ўнівэрсальны адрас, які пазьбягае раскрыцьця адрасоў вашага кашалька. Не ўсе сэрвісы будуць іх падтрымліваць.",
"header": "Атрымаць",
"reset": "Скінуць",
"maxSats": "Максымальная сума — {max} sats",
"maxSatsFull": "Максымальная сума — {max} sats альбо {currency}",
"minSats": "Мінімальная сума — {min} sats",
"minSatsFull": "Мінімальная сума — {min} sats альбо {currency}",
"qrcode_for_the_address": "QR-код для адрасу"
},
"send": {
"provided_address_is_invoice": "Гэты адрас, здаецца, належыць да інвойсу Lightning. Калі ласка, перайдзіце ў ваш кашалёк Lightning, каб аплаціць гэты інвойс.",
"broadcastButton": "Транслюваць",
"broadcastError": "Памылка",
"broadcastNone": "Уставіць hex трансакцыі",
"broadcastPending": "У чаканьні",
"broadcastSuccess": "Посьпех",
"create_to": "Да"
"confirm_header": "Пацьвердзіць",
"confirm_sendNow": "Даслаць зараз",
"create_amount": "Сума",
"create_broadcast": "Транслюваць",
"create_copy": "Скапіяваць і транслюваць пазьней",
"create_fee": "Камісія",
"create_memo": "Нататка",
"create_satoshi_per_vbyte": "Satoshi за vByte",
"create_details": "Дэталі",
"create_to": "Да",
"create_this_is_hex": "Гэта hex вашай трансакцыі — падпісаны і гатовы да трансьляцыі ў сетку.",
"create_tx_size": "Памер трансакцыі",
"create_verify": "Праверыць на coinb.in",
"details_insert_contact": "Уставіць кантакт",
"details_add_rec_add": "Дадаць атрымальніка",
"details_add_rec_rem": "Выдаліць атрымальніка",
"details_add_recc_rem_all_alert_description": "Вы ўпэўненыя, што хочаце выдаліць усіх атрымальнікаў?",
"details_add_rec_rem_all": "Выдаліць усіх атрымальнікаў",
"details_recipients_title": "Атрымальнікі",
"details_recipient_title": "Атрымальнік #{number} з #{total}",
"please_complete_recipient_title": "Няпоўны атрымальнік",
"please_complete_recipient_details": "Калі ласка, запоўніце дэталі атрымальніка #{number} перад дадаваньнем новага атрымальніка.",
"details_address": "Адрас",
"details_address_field_is_not_valid": "Адрас несапраўдны.",
"details_adv_fee_bump": "Дазволіць павышэньне камісіі",
"details_adv_full": "Выкарыстаць поўны баланс",
"details_adv_full_sure": "Вы ўпэўненыя, што хочаце выкарыстаць поўны баланс кашалька для гэтай трансакцыі?",
"details_adv_full_sure_frozen": "Вы ўпэўненыя, што хочаце выкарыстаць поўны баланс кашалька для гэтай трансакцыі? Калі ласка, заўважце, што замарожаныя манэты выключаны.",
"details_adv_import": "Імпартаваць трансакцыю",
"details_adv_import_qr": "Імпартаваць трансакцыю (QR)",
"details_amount_field_is_not_valid": "Сума несапраўдная.",
"details_amount_field_is_less_than_minimum_amount_sat": "Указаная сума занадта малая. Калі ласка, увядзіце суму большую за 500 sats.",
"details_create": "Стварыць інвойс",
"details_error_decode": "Немагчыма дэкадаваць адрас Bitcoin",
"details_fee_field_is_not_valid": "Камісія несапраўдная.",
"details_frozen": "{amount} BTC замарожана.",
"details_next": "Далей",
"details_no_signed_tx": "Выбраны файл ня ўтрымлівае трансакцыі, якую можна імпартаваць.",
"details_note_placeholder": "Нататка сабе",
"details_scan": "Сканаваць",
"details_scan_hint": "Двойчы націсьніце, каб сканаваць альбо імпартаваць пункт прызначэньня",
"details_scan_error": "Памылка сканаваньня",
"details_total_exceeds_balance": "Сума адпраўкі перавышае даступны баланс.",
"details_total_exceeds_balance_frozen": "Сума адпраўкі перавышае даступны баланс. Калі ласка, заўважце, што замарожаныя манэты выключаны.",
"details_unrecognized_file_format": "Нераспазнаны фармат файлу",
"details_wallet_before_tx": "Перш чым ствараць трансакцыю, вы павінны спачатку дадаць кашалёк Bitcoin.",
"dynamic_init": "Ініцыялізацыя",
"dynamic_next": "Далей",
"dynamic_prev": "Папярэдні",
"dynamic_start": "Пачаць",
"dynamic_stop": "Спыніць",
"fee_10m": "10хв",
"fee_1d": "1д",
"fee_3h": "3г",
"fee_custom": "Адвольная",
"insert_custom_fee": "Уставіць камісію",
"fee_fast": "Хуткая",
"fee_medium": "Сярэдняя",
"fee_replace_minvb": "Агульная стаўка камісіі (satoshi за vByte), якую вы хочаце заплаціць, павінна быць вышэйшая за {min} sat/vByte.",
"fee_satvbyte": "у sat/vByte",
"fee_slow": "Павольная",
"header": "Даслаць",
"input_clear": "Ачысьціць",
"input_done": "Гатова",
"input_paste": "Уставіць",
"input_total": "Усяго:",
"permission_camera_message": "Нам патрэбны ваш дазвол на выкарыстаньне камэры.",
"psbt_sign": "Падпісаць трансакцыю",
"invalid_psbt": "Прадастаўлены няправільны PSBT.",
"open_settings": "Адкрыць налады",
"permission_storage_denied_message": "BlueWallet ня можа захаваць гэты файл. Калі ласка, адкрыйце налады вашай прылады і ўключыце дазвол на доступ да сховішча.",
"permission_storage_title": "Дазвол на доступ да сховішча",
"psbt_clipboard": "Скапіяваць у буфэр абмену",
"psbt_this_is_psbt": "Гэта часткова падпісаная трансакцыя Bitcoin (PSBT). Калі ласка, скончыце яе падпісаньне з дапамогай вашага апаратнага кашалька.",
"psbt_tx_export": "Экспартаваць у файл",
"no_tx_signing_in_progress": "Няма падпісаньня трансакцыі ў працэсе.",
"outdated_rate": "Курс быў апошні раз абноўлены: {date}",
"psbt_tx_open": "Адкрыць падпісаную трансакцыю",
"psbt_tx_scan": "Сканаваць падпісаную трансакцыю",
"qr_error_no_qrcode": "Мы не змаглі знайсьці сапраўдны QR-код на выбранай выяве. Пераканайцеся, што выява ўтрымлівае толькі QR-код і ніякага дадатковага зьместу, такога як тэкст альбо кнопкі.",
"reset_amount": "Скінуць суму",
"reset_amount_confirm": "Жадаеце скінуць суму?",
"success_done": "Гатова",
"txSaved": "Файл трансакцыі ({filePath}) быў захаваны.",
"file_saved_at_path": "Файл ({filePath}) быў захаваны.",
"cant_send_to_silentpayment_adress": "Гэты кашалёк ня можа адсылаць на адрасы Silent Payments",
"cant_send_to_bip47": "Гэты кашалёк ня можа адсылаць на плацежныя коды BIP47",
"cant_find_bip47_notification": "Спачатку дадайце гэты плацежны код у кантакты",
"problem_with_psbt": "Праблема з PSBT"
},
"settings": {
"save": "Захаваць"
"about": "Пра праграму",
"about_awesome": "Зроблена з выдатнымі",
"about_backup": "Заўсёды рабіце рэзервовую копію вашых ключоў!",
"about_free": "BlueWallet — гэта бясплатны праект з адкрытым зыходным кодам. Створаны карыстальнікамі Bitcoin.",
"about_license": "Ліцэнзія MIT",
"about_release_notes": "Заўвагі да выпуску",
"about_review": "Пакіньце нам водгук",
"performance_score": "Балы прадукцыйнасьці: {num}",
"run_performance_test": "Праверыць прадукцыйнасьць",
"about_selftest": "Запусьціць самаправерку",
"about_selftest_electrum_disabled": "Самаправерка недаступная ў афлайнавым рэжыме Electrum. Калі ласка, адключыце афлайнавы рэжым і паспрабуйце зноў.",
"about_selftest_ok": "Усе ўнутраныя тэсты пасьпяхова пройдзены. Кашалёк працуе добра.",
"about_sm_github": "GitHub",
"about_sm_telegram": "Канал у Telegram",
"privacy_temporary_screenshots": "Дазволіць захоп экрану",
"privacy_temporary_screenshots_instructions": "Абарона ад захопу экрану будзе часова адключана, дазваляючы рабіць здымкі экрану і запіс экрану. Абарона аўтаматычна актывуецца зноў, калі вы закрыеце і адкрыеце BlueWallet.",
"biometrics": "Біямэтрыя",
"biometrics_no_longer_available": "Налады вашай прылады зьмяніліся і больш не адпавядаюць выбраным наладам бясьпекі ў праграме. Калі ласка, паўторна ўключыце біямэтрыю альбо код доступу, а затым перазапусьціце праграму, каб прымяніць гэтыя зьмены.",
"biom_10times": "Вы 10 разоў спрабавалі ўвесьці пароль. Жадаеце скінуць ваша сховішча? Гэта выдаліць усе кашалькі і расшыфруе ваша сховішча.",
"biom_conf_identity": "Калі ласка, пацьвердзіце вашу асобу.",
"biom_remove_decrypt": "Усе вашы кашалькі будуць выдалены, і ваша сховішча будзе расшыфравана. Вы ўпэўненыя, што хочаце працягнуць?",
"currency": "Валюта",
"currency_source": "Курс атрыманы з",
"currency_fetch_error": "Узьнікла памылка пры атрыманьні курсу для выбранай валюты.",
"default_title": "Пры запуску",
"donate": "Ахвяраваць",
"donate_description": "Дапамажыце нам захаваць Blue бясплатнай!",
"electrum_connected": "Падключана",
"electrum_connected_not": "Не падключана",
"electrum_error_connect": "Немагчыма падключыцца да ўказанага сэрвэра Electrum",
"electrum_error_connect_tor": "Немагчыма падключыцца да ўказанага сэрвэра Electrum. Калі ласка, пераканайцеся, што праграма Orbot падключана, і паспрабуйце зноў.",
"lndhub_uri": "Напр., {example}",
"electrum_host": "Напр., {example}",
"electrum_offline_mode": "Афлайнавы рэжым",
"electrum_offline_description": "Калі ўключана, вашы кашалькі Bitcoin не будуць спрабаваць атрымліваць балансы альбо трансакцыі.",
"electrum_port": "Порт, звычайна {example}",
"use_ssl": "Выкарыстоўваць SSL",
"electrum_settings_server": "Сэрвэр Electrum",
"electrum_status": "Статус",
"electrum_preferred_server": "Пераважны сэрвэр",
"electrum_preferred_server_description": "Увядзіце сэрвэр, які вы хочаце, каб ваш кашалёк выкарыстоўваў для ўсіх дзеяньняў Bitcoin. Пасьля ўстаноўкі ваш кашалёк будзе выключна выкарыстоўваць гэты сэрвэр для праверкі балансаў, адпраўкі трансакцыяў і атрыманьня сеткавых дадзеных. Пераканайцеся, што вы давяраеце гэтаму сэрвэру, перш чым яго ўстанаўліваць.",
"electrum_history": "Гісторыя",
"electrum_reset_to_default": "Гэта дазволіць BlueWallet выпадковым чынам выбраць сэрвэр са сьпісу сэрвэраў.",
"electrum_reset": "Скінуць да змаўчаньня",
"electrum_reset_to_default_and_clear_history": "Скінуць да змаўчаньня і ачысьціць гісторыю",
"electrum_saved": "Вашы зьмены пасьпяхова захаваны. Перазапуск BlueWallet можа спатрэбіцца для прымяненьня зьменаў.",
"electrum_unable_to_connect": "Немагчыма падключыцца да {server}.",
"encrypt_decrypt": "Расшыфраваць сховішча",
"encrypt_decrypt_q": "Вы ўпэўненыя, што хочаце расшыфраваць ваша сховішча? Гэта дазволіць атрымаць доступ да вашых кашалькоў без пароля.",
"encrypt_enc_and_pass": "Абаронена паролем",
"encrypt_storage_explanation_headline": "Уключыць шыфраваньне сховішча",
"encrypt_storage_explanation_description_line1": "Уключэньне шыфраваньня сховішча дадае дадатковы ўзровень абароны вашай праграмы, забясьпечваючы спосаб захоўваньня вашых дадзеных на вашай прыладзе. Гэта робіць больш цяжкім доступ да вашай інфармацыі бяз дазволу.",
"encrypt_storage_explanation_description_line2": "Аднак важна ведаць, што гэтае шыфраваньне абараняе толькі доступ да вашых кашалькоў, захаваных у keychain прылады. Яно не ўсталёўвае пароль альбо дадатковую абарону для саміх кашалькоў.",
"encrypted_feature_disabled": "Гэтую функцыю немагчыма выкарыстоўваць з уключаным шыфраваным сховішчам.",
"i_understand": "Я разумею",
"block_explorer": "Аглядальнік блёкаў",
"block_explorer_preferred": "Выкарыстоўваць пераважны аглядальнік блёкаў",
"block_explorer_invalid_custom_url": "Прадастаўлены URL няправільны. Калі ласка, увядзіце сапраўдны URL, які пачынаецца з http:// альбо https://.",
"block_explorer_error_saving_custom": "Памылка пры захаваньні пераважнага аглядальніка блёкаў",
"encrypt_title": "Бясьпека",
"encrypt_tstorage": "Сховішча",
"encrypt_use": "Выкарыстоўваць {type}",
"encrypt_use_expl": "{type} будзе выкарыстоўвацца для пацьверджаньня вашай асобы перад правядзеньнем трансакцыі, разблакаваньнем, экспартам альбо выдаленьнем кашалька.",
"set_as_preferred": "Зрабіць пераважным",
"set_as_preferred_electrum": "Усталяваньне {host}:{port} як пераважнага сэрвэра адключыць выпадковае падключэньне да прапанаванага сэрвэра.",
"general": "Агульныя",
"general_continuity": "Continuity",
"general_continuity_e": "Калі ўключана, вы зможаце праглядаць выбраныя кашалькі і трансакцыі, выкарыстоўваючы вашы іншыя прылады Apple, падключаныя да iCloud.",
"groundcontrol_explanation": "GroundControl — гэта бясплатны сэрвэр пуш-апавяшчэньняў з адкрытым зыходным кодам для кашалькоў Bitcoin. Вы можаце ўсталяваць ваш уласны сэрвэр GroundControl і ўвесьці яго URL сюды, каб не залежаць ад інфраструктуры BlueWallet. Пакіньце пустым, каб выкарыстаць стандартны сэрвэр GroundControl.",
"header": "Налады",
"language": "Мова",
"language_isRTL": "Перазапуск BlueWallet патрабуецца, каб арыентацыя мовы ўступіла ў сілу.",
"last_updated": "Апошняе абнаўленьне",
"license": "Ліцэнзія",
"lightning_error_lndhub_uri": "Няправільны URI LNDhub",
"lightning_error_lndhub_uri_tor": "Няправільны URI LNDhub. Калі ласка, пераканайцеся, што праграма Orbot падключана, і паспрабуйце зноў.",
"lightning_saved": "Вашы зьмены пасьпяхова захаваны.",
"lightning_settings": "Налады Lightning",
"lightning_settings_explain": "Каб падключыцца да вашага ўласнага вузла LND, калі ласка, устанавіце LNDhub і ўвядзіце яго URL тут у наладах. Калі ласка, заўважце, што толькі кашалькі, створаныя пасьля захаваньня зьменаў, будуць падключацца да ўказанага LNDhub.",
"lndhub_github": "Рэпазытар на GitHub",
"network": "Сетка",
"network_broadcast": "Транслюваць трансакцыю",
"network_electrum": "Сэрвэр Electrum",
"electrum_suggested_description": "Калі пераважны сэрвэр ня ўстаноўлены, прапанаваны сэрвэр будзе выпадковым чынам выбіраны для выкарыстаньня.",
"not_a_valid_uri": "Няправільны URI",
"notifications": "Апавяшчэньні",
"open_link_in_explorer": "Адкрыць спасылку ў аглядальніку",
"password": "Пароль",
"password_explain": "Увядзіце пароль, які вы будзеце выкарыстоўваць для разблакаваньня вашага сховішча.",
"plausible_deniability": "Праўдападобнае адмаўленьне",
"privacy": "Прыватнасьць",
"privacy_read_clipboard": "Чытаць буфэр абмену",
"privacy_system_settings": "Сыстэмныя налады",
"privacy_quickactions": "Цэтлікі кашалька",
"privacy_quickactions_explanation": "Націсьніце і ўтрымлівайце значок BlueWallet, каб хутка прагледзець баланс вашага кашалька.",
"privacy_clipboard_explanation": "Прадастаўляць цэтлікі, калі адрас альбо інвойс знойдзены ў вашым буфэры абмену.",
"privacy_do_not_track": "Адключыць аналітыку",
"privacy_do_not_track_explanation": "Інфармацыя пра прадукцыйнасьць і надзейнасьць ня будзе адпраўляцца для аналізу.",
"rate": "Курс",
"biometrics_fail": "Калі {type} не ўключана, альбо ня ўдаецца разблакаваць, вы можаце выкарыстаць код доступу прылады як альтэрнатыву.",
"biom_no_passcode": "Ваша прылада ня мае ўключанага коду доступу альбо біямэтрыі. Каб працягнуць, калі ласка, наладзьце код доступу альбо біямэтрыю ў наладах праграмы.",
"push_notifications_explanation": "Уключыўшы апавяшчэньні, токэн вашай прылады будзе адпраўлены на сэрвэр разам з адрасамі кашалькоў і ID трансакцыяў для ўсіх кашалькоў і трансакцыяў, зробленых пасьля ўключэньня апавяшчэньняў. Токэн прылады выкарыстоўваецца для адпраўкі апавяшчэньняў, а інфармацыя пра кашалёк дазваляе нам апавяшчаць вас аб уваходных Bitcoin альбо пацьверджаньнях трансакцыяў.\n\nПерадаецца толькі інфармацыя пасьля таго, як вы ўключыце апавяшчэньні — нічога зь перыяду да гэтага не зьбіраецца.\n\nАдключэньне апавяшчэньняў выдаліць усю гэтую інфармацыю з сэрвэра. Акрамя таго, выдаленьне кашалька з праграмы таксама выдаліць зьвязаную зь ім інфармацыю з сэрвэра.",
"selfTest": "Самаправерка",
"save": "Захаваць",
"saved": "Захавана",
"set_electrum_server_as_default": "Усталяваць {server} як стандартны сэрвэр Electrum?",
"set_lndhub_as_default": "Усталяваць {url} як стандартны сэрвэр LNDhub?",
"success_transaction_broadcasted": "Ваша трансакцыя пасьпяхова транслявана!",
"total_balance": "Агульны баланс",
"total_balance_explanation": "Адлюстраваць агульны баланс усіх вашых кашалькоў на віджэтах хатняга экрану.",
"widgets": "Віджэты",
"tools": "Інструмэнты"
},
"notifications": {
"would_you_like_to_receive_notifications": "Ці жадаеце вы атрымліваць апавяшчэньні аб уваходных плацяжах?",
"notifications_subtitle": "Уваходныя плацяжы і пацьверджаньні трансакцыяў",
"no_and_dont_ask": "Не, і больш не пытайцеся.",
"permission_denied_message": "Вы адмовіліся ад дазволу на дасыланьне вам апавяшчэньняў. Калі вы хочаце атрымліваць апавяшчэньні, калі ласка, уключыце іх у наладах вашай прылады."
},
"transactions": {
"cancel_explain": "Мы заменім гэтую трансакцыю на тую, што плаціць вам і мае больш высокія камісіі. Гэта эфэктыўна адмяняе бягучую трансакцыю. Гэта называецца RBF — Replace by Fee.",
"cancel_no": "Гэтая трансакцыя не падлягае замене.",
"cancel_title": "Адмяніць гэтую трансакцыю (RBF)",
"transaction_loading_error": "Узьнікла праблема пры загрузцы трансакцыі. Калі ласка, паспрабуйце пазьней.",
"transaction_not_available": "Трансакцыя недаступная",
"confirmations_lowercase": "{confirmations} пацьверджаньняў",
"expand_note": "Разгарнуць нататку",
"cpfp_create": "Стварыць",
"cpfp_exp": "Мы створым яшчэ адну трансакцыю, якая будзе расходаваць вашу непацьверджаную трансакцыю. Агульная камісія будзе вышэйшая за камісію зыходнай трансакцыі, таму яна павінна быць намайнена хутчэй. Гэта называецца CPFP — Child Pays for Parent.",
"cpfp_no_bump": "Камісію гэтай трансакцыі нельга павысіць.",
"cpfp_title": "Павысіць камісію (CPFP)",
"details_balance_hide": "Схаваць баланс",
"details_balance_show": "Паказаць баланс",
"details_copy": "Скапіяваць",
"details_copy_block_explorer_link": "Скапіяваць спасылку аглядальніка блёкаў",
"details_copy_note": "Скапіяваць нататку",
"details_copy_txid": "Скапіяваць ID трансакцыі",
"details_inputs": "Уваходы",
"details_outputs": "Выхады",
"date": "Дата",
"details_received": "Атрымана",
"details_view_in_browser": "Адкрыць у браўзэры",
"details_title": "Трансакцыя",
"incoming_transaction": "Уваходная трансакцыя",
"outgoing_transaction": "Выходная трансакцыя",
"expired_transaction": "Пратэрмінаваная трансакцыя",
"pending_transaction": "Трансакцыя ў чаканьні",
"offchain": "Оф-чэйн",
"onchain": "Он-чэйн",
"details_to": "Выхад",
"list_conf": "Пацьв.: {number}",
"pending": "У чаканьні",
"eta_10m": "Чакана: прыкл. праз 10 хвілінаў",
"eta_3h": "Чакана: прыкл. праз 3 гадзіны",
"eta_1d": "Чакана: прыкл. праз 1 дзень",
"list_title": "Трансакцыі",
"list_title_sent": "Дасланыя",
"list_title_received": "Атрыманыя",
"transaction": "Трансакцыя",
"pending_with_amount": "У чаканьні {amt1} ({amt2})",
"received_with_amount": "+{amt1} ({amt2})",
"rbf_title": "Паскорыць (RBF)",
"status_bump": "Паскорыць",
"status_cancel": "Адмяніць",
"transactions_count": "Колькасьць трансакцыяў",
"txid": "ID трансакцыі",
"updating": "Абнаўленьне...",
"watchOnlyWarningTitle": "Папярэджаньне аб бясьпецы",
"watchOnlyWarningDescription": "Сьцеражыцеся ашуканцаў, якія часта выкарыстоўваюць кашалькі „толькі для прагляду”, каб падмануць карыстальнікаў. Гэтыя кашалькі не дазваляюць вам кіраваць ці адсылаць сродкі; яны дазваляюць толькі бачыць баланс.",
"custom_fee_warning_title": "Папярэджаньне",
"custom_fee_warning_description": "Камісіі ніжэйшыя за 1 sat/vB сапраўдныя, але могуць не транслявацца з-за палітыкі вузлоў.",
"rbf_explain": "Мы заменім гэтую трансакцыю на тую, што мае больш высокую камісію, так што яна будзе хутчэй намайнена. Гэта называецца RBF — Replace by Fee.",
"open_url_error": "Немагчыма адкрыць спасылку з браўзэрам па змаўчаньні. Калі ласка, зьмяніце ваш браўзэр па змаўчаньні і паспрабуйце зноў.",
"enable_offline_signing": "Гэты кашалёк не выкарыстоўваецца ў сувязі з афлайнавым падпісаньнем. Жадаеце ўключыць яго зараз?",
"details_eta_analyzing": "Аналіз...",
"details_sent": "Дасланыя",
"details_section": "Дэталі",
"details_explorer": "аглядальнік",
"details_network_fee": "Сеткавая камісія",
"details_to_address": "Да",
"details_id": "ID",
"details_note": "Нататка",
"details_add_note": "дадаць",
"details_advanced": "Дадаткова",
"details_fee_rate": "Стаўка камісіі",
"details_size": "Памер",
"details_virtual_size": "Віртуальны памер",
"details_tx_hex": "Hex трансакцыі",
"details_inputs_count": "Уваходы ({count})",
"details_outputs_count": "Выхады ({count})"
},
"wallets": {
"add_entropy": "Энтрапія"
"add_bitcoin": "Bitcoin",
"add_bitcoin_explain": "Просты і магутны кашалёк Bitcoin",
"add_create": "Стварыць",
"total_balance": "Агульны баланс",
"add_entropy_reset_title": "Скінуць энтрапію",
"add_entropy_reset_message": "Зьмена тыпу кашалька скіне бягучую энтрапію. Жадаеце працягнуць?",
"add_entropy": "Энтрапія",
"add_entropy_bytes": "{bytes} байтаў энтрапіі",
"add_entropy_generated": "{gen} байтаў згенэраванай энтрапіі",
"add_entropy_provide": "Прадаставіць энтрапію праз кідкі касьцяў",
"add_entropy_remain": "{gen} байтаў згенэраванай энтрапіі. Астатнія {rem} байтаў будуць атрыманы ад сыстэмнага генэратара выпадковых лікаў.",
"add_import_wallet": "Імпартаваць кашалёк",
"add_lightning": "Lightning",
"add_lightning_explain": "Для расходаваньня зь імгненнымі трансакцыямі",
"add_lndhub": "Падключыцца да вашага LNDhub",
"add_lndhub_error": "Прадастаўлены адрас вузла зьяўляецца няправільным вузлом LNDhub.",
"add_lndhub_placeholder": "Адрас вашага вузла",
"add_placeholder": "мой першы кашалёк",
"add_title": "Дадаць кашалёк",
"add_wallet_name": "Назва",
"add_wallet_type": "Тып",
"add_wallet_seed_length": "Даўжыня сід-фразы",
"add_wallet_seed_length_12": "12 словаў",
"add_wallet_seed_length_24": "24 словы",
"clipboard_bitcoin": "У вашым буфэры абмену ёсьць адрас Bitcoin. Жадаеце выкарыстаць яго для трансакцыі?",
"clipboard_lightning": "У вашым буфэры абмену ёсьць інвойс Lightning. Жадаеце выкарыстаць яго для трансакцыі?",
"clear_clipboard_on_import": "Ачысьціць буфэр абмену пры імпарце",
"details_address": "Адрас",
"details_advanced": "Дадаткова",
"details_are_you_sure": "Вы ўпэўненыя?",
"details_connected_to": "Падключана да",
"details_del_wb_err": "Прадастаўленая сума балансу не супадае з балансам гэтага кашалька. Калі ласка, паспрабуйце зноў.",
"details_del_wb_q": "У гэтага кашалька ёсьць баланс. Перад тым, як працягнуць, зьвярніце ўвагу, што вы ня зможаце аднавіць сродкі без сід-фразы гэтага кашалька. Каб пазьбегнуць выпадковага выдаленьня, увядзіце баланс кашалька — {balance} сатошы.",
"details_delete": "Выдаліць",
"details_delete_wallet": "Выдаліць кашалёк",
"details_delete_wallet_error_message": "Узьнікла праблема з пацьверджаньнем таго, што гэты кашалёк быў выдалены з апавяшчэньняў — гэта можа быць зьвязана з праблемай сеткі альбо слабым злучэньнем. Калі вы працягнеце, вы можаце працягваць атрымліваць апавяшчэньні аб трансакцыях, зьвязаных з гэтым кашальком, нават пасьля яго выдаленьня.",
"details_derivation_path": "шлях дэрывацыі",
"details_display": "Паказаць на хатнім экране",
"details_export_backup": "Экспарт/Рэзервовая копія",
"details_export_history": "Экспартаваць гісторыю ў CSV",
"details_master_fingerprint": "Майстар-адбітак",
"details_multisig_type": "мультыподпіс",
"details_show_xpub": "Паказаць XPUB кашалька",
"details_show_addresses": "Паказаць адрасы",
"details_title": "Кашалёк",
"wallets": "Кашалькі",
"swipe_balance_hide": "Схаваць",
"swipe_balance_show": "Паказаць",
"drag_to_reorder": "Перацягніце для пераўпарадкаваньня",
"clear_search": "Ачысьціць пошук",
"details_type": "Тып",
"details_use_with_hardware_wallet": "Выкарыстоўваць з апаратным кашальком",
"details_yes_delete": "Так, выдаліць",
"enter_bip38_password": "Увесьці пароль для расшыфроўкі",
"export_title": "Экспарт кашалька",
"import_do_import": "Імпартаваць",
"import_passphrase": "Кодавая фраза",
"import_passphrase_title": "Кодавая фраза",
"import_passphrase_message": "Увядзіце кодавую фразу, калі вы яе выкарыстоўвалі",
"import_error": "Не атрымалася імпартаваць. Калі ласка, праверце, што прадастаўленыя дадзеныя сапраўдныя.",
"import_explanation": "Калі ласка, увядзіце словы сід-фразы, публічны ключ, WIF або што заўгодна. BlueWallet паспрабуе адгадаць правільны фармат і імпартаваць ваш кашалёк.",
"import_imported": "Імпартавана",
"import_scan_qr": "Сканаваць альбо імпартаваць файл",
"import_success": "Ваш кашалёк пасьпяхова імпартаваны.",
"import_success_watchonly": "Ваш кашалёк пасьпяхова імпартаваны. ПАПЯРЭДЖАНЬНЕ: гэта кашалёк толькі для прагляду, вы НЕ можаце расходаваць зь яго.",
"import_search_accounts": "Шукаць рахункі",
"import_title": "Імпарт",
"learn_more": "Даведацца больш",
"import_discovery_title": "Адкрыцьцё",
"import_discovery_subtitle": "Выберыце знойдзены кашалёк",
"import_discovery_derivation": "Выкарыстаць адвольны шлях дэрывацыі",
"import_discovery_no_wallets": "Кашалькі не знойдзены.",
"import_discovery_offline": "BlueWallet зараз знаходзіцца ў афлайнавым рэжыме. У гэтым рэжыме ён ня можа праверыць існаваньне кашалька, таму вам спатрэбіцца выбраць правільны ўручную",
"import_derivation_subtitle": "Увядзіце адвольны шлях дэрывацыі, і мы паспрабуем знайсьці ваш кашалёк.",
"import_derivation_found": "Знойдзена",
"import_derivation_found_not": "Не знойдзена",
"import_derivation_loading": "Загрузка...",
"import_derivation_title": "Шлях дэрывацыі",
"import_derivation_unknown": "Невядома",
"import_wrong_path": "Няправільны шлях дэрывацыі",
"list_create_a_button": "Дадаць цяпер",
"list_create_a_wallet": "Дадаць кашалёк",
"list_empty_txs1": "Вашы трансакцыі будуць адлюстроўвацца тут.",
"list_empty_txs1_lightning": "Кашалёк Lightning варта выкарыстоўваць для штодзённых трансакцыяў. Камісіі вельмі танныя, а хуткасьць маланкавая.",
"list_empty_txs2": "Пачніце са свайго кашалька.",
"list_empty_txs2_lightning": "\nКаб пачаць яго выкарыстоўваць, націсьніце Кіраваньне сродкамі і папоўніце ваш баланс.",
"list_latest_transaction": "Апошняя трансакцыя",
"list_long_choose": "Выбраць фота",
"list_create_a_wallet_text": "Гэта бясплатна, і вы можаце ствараць \nіх столькі, колькі захочаце.",
"paste_from_clipboard": "Уставіць",
"import_file": "Імпартаваць файл",
"list_long_scan": "Сканаваць QR-код",
"list_title": "Кашалькі",
"list_tryagain": "Паспрабаваць зноў",
"looks_like_bip38": "Гэта выглядае як прыватны ключ, абаронены паролем (BIP38).",
"manage_title": "Кіраваньне кашалькамі",
"no_results_found": "Нічога не знойдзена.",
"please_continue_scanning": "Калі ласка, працягвайце сканаваньне.",
"select_wallet": "Выбраць кашалёк",
"pull_to_refresh": "Пацягніце, каб абнавіць",
"warning_do_not_disclose": "Ніколі не дзяліцеся прыведзенай ніжэй інфармацыяй",
"identity_pubkey": "Публічны ключ ідэнтычнасьці",
"xpub_title": "XPUB кашалька",
"manage_wallets_search_placeholder": "Шукаць кашалькі, адрасы, трансакцыі і нататкі",
"more_info": "Больш інфармацыі",
"no_ln_wallet_error": "Перш чым аплачваць інвойс Lightning, вы павінны спачатку дадаць кашалёк Lightning.",
"add_ln_wallet_first": "Вы павінны спачатку дадаць кашалёк Lightning.",
"select_no_bitcoin": "Зараз няма даступных кашалькоў Bitcoin.",
"select_no_bitcoin_exp": "Каб папоўніць кашалькі Lightning, патрэбны кашалёк Bitcoin. Калі ласка, стварыце альбо імпартуйце адзін.",
"wallet_type_this": "Тып гэтага кашалька — {type}.",
"share_number": "Падзяліцца {number}",
"scan_import": "Адсканіруйце гэты QR-код, каб імпартаваць ваш кашалёк у іншую праграму.",
"write_down_header": "Стварыце ручную рэзервовую копію",
"write_down": "Запішыце і бясьпечна захавайце гэтыя словы. Выкарыстоўвайце іх, каб аднавіць кашалёк пазьней.",
"copy_ln_url": "Скапіюйце і бясьпечна захавайце гэты URL, каб аднавіць ваш кашалёк пазьней.",
"copy_ln_public": "Скапіюйце і бясьпечна захавайце гэтую інфармацыю, каб аднавіць ваш кашалёк пазьней.",
"details_delete_anyway": "Усё роўна выдаліць"
},
"total_balance_view": {
"display_in_bitcoin": "Паказаць у Bitcoin",
"hide": "Схаваць",
"display_in_sats": "Паказаць у sats",
"display_in_fiat": "Паказаць у {currency}",
"title": "Агульны баланс",
"explanation": "Прагляд агульнага балансу ўсіх вашых кашалькоў на экране агляду."
},
"multisig": {
"multisig_vault": "Мультыподпісны сэйф",
"default_label": "Мультыподпісны сэйф",
"multisig_vault_explain": "Найлепшая бясьпека для вялікіх сумаў",
"provide_signature": "Падпісаць",
"provide_signature_details": "Выкарыстайце вашу прыладу і кашалёк, дзе знаходзіцца ключ, каб падпісаць гэтую трансакцыю",
"provide_signature_details_bluewallet": "У BlueWallet перайдзіце ў мэню экрану Даслаць і выберыце ",
"provide_signature_next_steps": "Сканаваць альбо імпартаваць падпісаную трансакцыю",
"provide_signature_next_steps_details": "Як толькі ваш кашалёк пасьпяхова падпіша трансакцыю, адсканіруйце прадастаўлены QR-код альбо імпартуйце суправаджальны файл, а затым праверце ўсе дэталі трансакцыі перад яе трансьляцыяй.",
"vault_key": "Ключ сэйфу {number}",
"required_keys_out_of_total": "Патрабуемых ключоў з агульнай колькасьці",
"fee": "Камісія: {number}",
"fee_btc": "{number} BTC",
"confirm": "Пацьвердзіць",
"header": "Даслаць",
"share": "Падзяліцца...",
"view": "Прагляд",
"shared_key_detected": "Агульны сападпісант",
"shared_key_detected_question": "З вамі падзяліліся сападпісантам, ці жадаеце вы яго імпартаваць?",
"manage_keys": "Кіраваньне ключамі",
"signatures_required_to_spend": "Патрабуецца подпісаў: {number}",
"signatures_we_can_make": "можам зрабіць {number}",
"scan_or_import_file": "Сканаваць альбо імпартаваць файл",
"export_coordination_setup": "Экспартаваць наладку каардынацыі",
"cosign_this_transaction": "Падпісаць гэтую трансакцыю?",
"lets_start": "Пачнем",
"create": "Стварыць",
"native_segwit_title": "Найлепшая практыка",
"wrapped_segwit_title": "Найлепшая сумяшчальнасьць",
"legacy_title": "Састарэлы",
"co_sign_transaction": "Падпісаць трансакцыю",
"what_is_vault": "Сэйф — гэта",
"what_is_vault_numberOfWallets": " {m}-з-{n} мультыподпісны ",
"what_is_vault_wallet": "кашалёк.",
"needs": "Яму патрэбна",
"what_is_vault_description_number_of_vault_keys": " {m} ключоў сэйфу ",
"what_is_vault_description_to_spend": "для расходаваньня і трэці, які вы \nможаце выкарыстаць як рэзервовую копію.",
"what_is_vault_description_to_spend_other": "для расходаваньня.",
"vault_advanced_customize": "Налады сэйфу",
"quorum": "{m} з {n} (кворум)",
"quorum_header": "Кворум",
"of": "з",
"wallet_type": "Тып кашалька",
"invalid_mnemonics": "Гэтая мнэмонічная фраза, здаецца, нядзейсная.",
"invalid_cosigner": "Няправільныя дадзеныя сападпісанта",
"not_a_multisignature_xpub": "Гэта не XPUB ад мультыподпіснага кашалька!",
"invalid_cosigner_format": "Няправільны сападпісант: Гэта не сападпісант для фармату {format}.",
"create_new_key": "Стварыць новы",
"scan_or_open_file": "Сканаваць альбо адкрыць файл",
"i_have_mnemonics": "У мяне ёсьць сід-фраза для гэтага ключа.",
"type_your_mnemonics": "Уведзіце сід-фразу, каб імпартаваць існуючы ключ сэйфа.",
"this_is_cosigners_xpub": "Гэта XPUB сападпісанта — гатовы да імпарту ў іншы кашалёк. Ім можна бясьпечна дзяліцца.",
"this_is_cosigners_xpub_airdrop": "Калі вы дзеліцеся праз AirDrop, атрымальнікі павінны знаходзіцца на экране каардынацыі.",
"wallet_key_created": "Ваш ключ сэйфа створаны. Выдзеліце момант, каб надзейна захаваць мнэманічную фразу.",
"are_you_sure_seed_will_be_lost": "Вы ўпэўненыя? Вашая мнэманічная фраза будзе страчаная, калі ў вас няма рэзэрвовай копіі.",
"forget_this_seed": "Забыцца на гэтую сід-фразу і выкарыстоўваць XPUB.",
"view_edit_cosigners": "Прагляд/рэдагаваньне сападпісантаў",
"this_cosigner_is_already_imported": "Гэты сападпісант ужо імпартаваны.",
"export_signed_psbt": "Экспартаваць падпісаны PSBT",
"input_fp": "Увесьці адбітак",
"input_path": "Уставіць шлях дэрывацыі",
"ms_help": "Дапамога",
"ms_help_title": "Як працуюць мультыподпісныя сэйфы: парады і хітрыкі",
"ms_help_text": "Кашалёк зь некалькімі ключамі, для павышанай бясьпекі альбо сумеснага захоўваньня",
"ms_help_title1": "Рэкамэндуюцца некалькі прылад.",
"ms_help_title2": "Рэдагаваньне ключоў",
"ms_help_title3": "Рэзервовыя копіі сэйфу",
"ms_help_title4": "Імпарт сэйфаў",
"ms_help_title5": "Пашыраны рэжым",
"ms_help_1": "Сэйф будзе працаваць зь іншымі праграмамі BlueWallet і кашалькамі, сумяшчальнымі з PSBT, такімі як Electrum, Specter, Coldcard, Cobo Vault і г.д.",
"ms_help_2": "Вы можаце стварыць усе ключы сэйфу на гэтай прыладзе і выдаліць альбо адрэдагаваць іх пазьней. Маючы ўсе ключы на адной прыладзе, бясьпека эквівалентна звычайнаму кашальку Bitcoin.",
"ms_help_3": "У наладах кашалька вы знойдзеце рэзэрвовую копію сэйфа і watch-only копію. Гэтая рэзэрвовая копія — як мапа да вашага кашалька. Яна вельмі важная для аднаўленьня кашалька, калі вы згубіце адну з сід-фразаў.",
"ms_help_4": "Каб імпартаваць multisig, выкарыстайце файл рэзэрвовай копіі і функцыю «Імпарт». Калі ў вас ёсьць толькі сід-фразы і XPUB, можаце выкарыстаць асобную кнопку імпарту пры стварэньні ключоў сэйфа.",
"ms_help_5": "Па змаўчаньні BlueWallet створыць сэйф 2-з-3. Каб стварыць іншы кворум альбо зьмяніць тып адрасу, актывуйце Пашыраны рэжым у наладах.",
"input_fp_explain": "Прапусьціце, каб выкарыстаць стандартны (00000000)",
"input_path_explain": "Прапусьціце, каб выкарыстаць стандартны ({default})",
"how_many_signatures_can_bluewallet_make": "колькі подпісаў можа зрабіць BlueWallet"
},
"is_it_my_address": {
"title": "Гэта мой адрас?",
"owns": "{label} валодае {address}",
"enter_address": "Увесьці адрас",
"check_address": "Праверыць адрас",
"no_wallet_owns_address": "Ні адзін з даступных кашалькоў не валодае прадастаўленым адрасам.",
"view_qrcode": "Паглядзець QR-код"
},
"autofill_word": {
"title": "Апошняе слова сід-фразы",
"enter": "Увядзіце вашу частковую мнэмонічную фразу",
"generate_word": "Згенэраваць апошняе слова",
"error": "Увод не зьяўляецца 11- альбо 23-словнай частковай мнэмонічнай фразай. Калі ласка, паспрабуйце зноў."
},
"cc": {
"change": "Рэшта",
"coins_selected": "Выбрана манэт ({number})",
"selected_summ": "{value} выбрана",
"empty": "У гэтым кашальку зараз няма манэт.",
"tip": "Гэтая функцыя дазваляе вам бачыць, пазначаць, замарозьваць альбо выбіраць манэты для лепшага кіраваньня кашальком. Вы можаце выбіраць некалькі манэт, націскаючы на каляровыя кругі.",
"freeze": "Замарозіць",
"freezeLabel": "Замарозіць",
"freezeLabel_un": "Размарозіць",
"header": "Кіраваньне UTXO",
"use_coin": "Выкарыстаць манэту",
"use_coins": "Выкарыстаць манэты",
"sort_asc": "Па ўзрастаньні",
"sort_desc": "Па зьніжэньні",
"sort_height": "Вышыня",
"sort_value": "Значэньне",
"sort_label": "Метка",
"sort_status": "Статус",
"sort_by": "Сартаваць па"
},
"units": {
"BTC": "BTC",
"MAX": "Макс",
"sat_vbyte": "sat/vByte",
"sats": "sats"
},
"addresses": {
"copy_private_key": "Скапіяваць прыватны ключ",
"sensitive_private_key": "Папярэджаньне: прыватныя ключы вельмі канфідэнцыйныя. Працягнуць?",
"sign_title": "Падпісаць/праверыць паведамленьне",
"sign_help": "Тут вы можаце стварыць альбо праверыць крыптаграфічны подпіс на аснове адрасу Bitcoin.",
"sign_sign": "Падпісаць",
"sign_verify": "Праверыць",
"sign_signature_correct": "Праверка пасьпяховая!",
"sign_signature_incorrect": "Праверка ня ўдалася!",
"sign_placeholder_address": "Адрас",
"sign_placeholder_message": "Паведамленьне",
"sign_placeholder_signature": "Подпіс",
"addresses_title": "Адрасы",
"type_change": "Рэшта",
"type_receive": "Атрымаць",
"type_used": "Выкарыстана",
"transactions": "Трансакцыі"
},
"lnurl_auth": {
"register_question_part_1": "Жадаеце зарэгістраваць рахунак на",
"register_question_part_2": "выкарыстоўваючы ваш кашалёк Lightning?",
"register_answer": "Вы пасьпяхова зарэгістравалі рахунак на {hostname}!",
"login_question_part_1": "Жадаеце ўвайсьці на",
"login_question_part_2": "выкарыстоўваючы ваш кашалёк Lightning?",
"login_answer": "Вы пасьпяхова ўвайшлі на {hostname}!",
"link_question_part_1": "Жадаеце прывязаць ваш рахунак на",
"link_question_part_2": "да вашага кашалька Lightning?",
"link_answer": "Ваш кашалёк Lightning пасьпяхова прывязаны да вашага рахунку на {hostname}!",
"auth_question_part_1": "Жадаеце аўтэнтыфікавацца на",
"auth_question_part_2": "выкарыстоўваючы ваш кашалёк Lightning?",
"auth_answer": "Вы пасьпяхова аўтэнтыфікаваны на {hostname}!",
"could_not_auth": "Мы не змаглі аўтэнтыфікаваць вас на {hostname}.",
"authenticate": "Аўтэнтыфікавацца"
},
"bip47": {
"payment_code": "Плацежны код",
"contacts": "Кантакты",
"bip47_explain": "Шматразовы код, якім можна дзяліцца",
"bip47_explain_subtitle": "BIP47",
"purpose": "Шматразовы код, якім можна дзяліцца (BIP47)",
"pay_this_contact": "Заплаціць гэтаму кантакту",
"rename_contact": "Перайменаваць кантакт",
"copy_payment_code": "Скапіяваць плацежны код",
"hide_contact": "Схаваць кантакт",
"rename": "Перайменаваць",
"provide_name": "Увядзіце новую назву для гэтага кантакту",
"add_contact": "Дадаць кантакт",
"provide_payment_code": "Прадаставіць плацежны код",
"invalid_pc": "Няправільны плацежны код",
"notification_tx_unconfirmed": "Трансакцыя-паведамленьне яшчэ не пацьверджана, калі ласка, пачакайце",
"onchain_tx_needed": "Патрабуецца он-чэйн трансакцыя",
"notif_tx_sent": "Трансакцыя-паведамленьне дасланая. Калі ласка, дачакайцеся яе пацьверджаньня",
"notif_tx": "Трансакцыя-паведамленьне",
"failed_create_notif_tx": "Не атрымалася стварыць он-чэйн трансакцыю",
"not_found": "Плацежны код не знойдзены"
}
}

View File

@ -3,31 +3,49 @@
"bad_password": "Грешна парола, опитайте отново.",
"cancel": "Отказ",
"continue": "Продължи",
"clipboard": "Клипборд",
"copied": "Копирано!",
"discard_changes": "Отказваш промените?",
"discard_changes_explain": "Имате незапазени промени. Сигурни ли сте, че искате да ги отхвърлите и да напуснете екрана?",
"enter_password": "Въведете парола",
"never": "Никога",
"of": "{number} от {total}",
"ok": "OK",
"enter_url": "Въведете URL",
"storage_is_encrypted": "Вашият портфейл е криптиран. Необходима е парола за декриптиране",
"yes": "Да",
"no": "Не",
"seed": "Сиид",
"save": "Запази...",
"seed": "Сийд",
"success": "Успех",
"wallet_key": "Парола на портфейла"
"wallet_key": "Парола на портфейла",
"close": "Затвори",
"change_input_currency": "Промени валутата за въвеждане",
"refresh": "Обнови",
"pick_image": "Избери от библиотеката",
"pick_file": "Избери файл",
"enter_amount": "Въведете сума",
"qr_custom_input_button": "Докоснете 10 пъти за персонализирано въвеждане",
"unlock": "Отключи",
"port": "Порт",
"ssl_port": "SSL порт",
"suggested": "Препоръчан"
},
"azteco": {
"codeIs": "Цода на вашият ваучър е",
"errorBeforeRefeem": "Преди осребряване, трябва да добавиш Бикойн портфейл.",
"errorSomething": "Възникна грешка. Уверете се, че ваучъра е валиден?",
"redeem": "Депозирай в уолета",
"codeIs": "Кодът на вашия ваучър е",
"errorBeforeRefeem": "Преди осребряване, трябва да добавиш Биткойн портфейл.",
"errorSomething": "Възникна грешка. Уверете се, че ваучърът е валиден?",
"redeem": "Депозирай в портфейла",
"redeemButton": "Осребри",
"success": "Успех",
"successMessage": "Ваучерът е осребрен успешно! Вашите средства трябва да пристигнат в Bitcoin портфейла ви скоро.",
"title": "Осребри Azte.co ваучър"
},
"entropy": {
"save": "Запази",
"title": "Ентропия",
"undo": "Отмени"
"undo": "Отмени",
"amountOfEntropy": "{bits} от {limit} бита"
},
"errors": {
"broadcast": "Неуспешно изпращане",
@ -35,48 +53,70 @@
"network": "Грешка с мрежата"
},
"lnd": {
"errorInvoiceExpired": "Фактурата е изтекла.",
"expired": "Изтекла",
"expiresIn": "Изтича след {time} минути",
"payButton": "Плати",
"payment": "Плащане",
"placeholder": "Фактура или адрес",
"potentialFee": "Възможна такса: {fee}",
"refill": "Зареди",
"refill_create": "За да продължите, моля създайте Биткойн портфейл",
"refill_external": "Зареди с Външен Портфейл",
"refill_lnd_balance": "Зареди Лайтнинг Баланс",
"sameWalletAsInvoiceError": "Не можете да платите фактура със същия портфейл, който е използван за нейното създаване.",
"title": "Управление на средства"
},
"lndViewInvoice": {
"additional_info": "Допълнителна информация",
"for": "За:",
"lightning_invoice": "Лайтнинг фактура",
"please_pay_between_and": "Моля, платете между {min} и {max}",
"please_pay": "Моля, плати",
"preimage": "Прообраз",
"sats": "сатоши",
"date_time": "Дата и час",
"wasnt_paid_and_expired": "Фактурата не е платена и е изтекла."
},
"plausibledeniability": {
"create_fake_storage": "Създайте Криптирано Хранилище",
"create_password_explanation": "Паролата за 'Фалшивото' хранилище трябва да е различна от паролата за главното хранилище",
"help": "При определени обстоятелства, може да се наложи да предадете Вашата парола. За да предпазите средствата си, Блу Уолет може да създаде допълнително хранилище с различна парола. Ако сте в ситуация където сте принудени да предадете Вашата парола, дайте паролата за фалшивото хранилище. Когато я въведете, Блу Уолет ще отключи 'Фалшивото' хранилище. Портфеиля изглежда легитимен, като в същото време средствата ви ще са в безопасност.",
"help2": "Новото хранилище ще бъде напълно функционално и може да държите минимални средства в него. Така ще изглежда като легитимен портфеил.",
"help": "При определени обстоятелства, може да се наложи да предадете Вашата парола. За да предпазите средствата си, Блу Уолет може да създаде допълнително хранилище с различна парола. Ако сте в ситуация където сте принудени да предадете Вашата парола, дайте паролата за фалшивото хранилище. Когато я въведете, Блу Уолет ще отключи 'Фалшивото' хранилище. Портфейлът изглежда легитимен, като в същото време средствата ви ще са в безопасност.",
"help2": "Новото хранилище ще бъде напълно функционално и може да държите минимални средства в него. Така ще изглежда като легитимен портфейл.",
"password_should_not_match": "Моля, изберете различна парола.",
"title": "Plausible Deniability"
"title": "Правдоподобно отричане"
},
"pleasebackup": {
"ask": "Запазихте ли паролата - 12/24 думи за портфейла? В случай, че изгубите достъп до устройството, паролата е необходима за да въстановите средствата. В случай, че загубите паролата - 12/24 думи, перманентно ще изгубите достъп до средствата.",
"ok_lnd": "Да, запазих паролата.",
"text_lnd": "Моля, запазете паролата/ думите. Те ви позволяват да възтановите портфейла и средствата си на друго устройство.",
"ask": "Запазихте ли сийд фразата - 12/24 думи за портфейла? В случай, че изгубите достъп до устройството, сийд фразата е необходима за да възстановите средствата. В случай, че загубите сийд фразата - 12/24 думи, перманентно ще изгубите достъп до средствата.",
"ask_no": "Не, не съм.",
"ask_yes": "Да, запазих ги.",
"ok": "OK, записах ги.",
"ok_lnd": "Да, запазих сийда.",
"text": "Моля, отделете малко време, за да запишете тази мнемонична фраза на лист хартия.\nТова е вашето резервно копие и можете да го използвате, за да възстановите портфейла.",
"text_lnd": "Моля, запазете сийд фразата. Тя ви позволява да възстановите портфейла и средствата си на друго устройство.",
"title": "Портфейла е създаден."
},
"receive": {
"details_create": "Създай",
"details_label": "Описание",
"details_setAmount": "Получаване на определена сума",
"header": "Получаване"
"details_share": "Сподели...",
"address_not_found": "Не може да се генерира адрес за получаване.",
"header": "Получаване",
"reset": "Нулирай",
"maxSats": "Максималната сума е {max} сатоши",
"maxSatsFull": "Максималната сума е {max} сатоши или {currency}",
"minSats": "Минималната сума е {min} сатоши",
"minSatsFull": "Минималната сума е {min} сатоши или {currency}",
"qrcode_for_the_address": "QR код за адреса",
"bip47_explanation": "Платежните кодове са универсален адрес, който избягва разкриването на адресите на портфейла ви. Не всички услуги ги поддържат."
},
"send": {
"provided_address_is_invoice": "Този адрес изглежда е за Lightning фактура. Моля, отидете в Lightning портфейла си, за да извършите плащане по тази фактура.",
"broadcastButton": "Изпрати",
"broadcastError": "Грешка",
"broadcastNone": "Въведи Transaction Hex",
"broadcastPending": "Не потвърдена транзакция",
"broadcastPending": "Чакаща",
"broadcastSuccess": "Успех",
"confirm_header": "Потвърди",
"confirm_sendNow": "Изпрати сега",
@ -86,27 +126,42 @@
"create_details": "Детайли",
"create_fee": "Такса",
"create_memo": "Бележка",
"create_this_is_hex": "Това е вашата трансакция/и hex-подписана и гова/и за изпращане",
"create_satoshi_per_vbyte": "Сатоши на vByte",
"create_this_is_hex": "Това е вашата транзакция/и hex-подписана и готова/и за изпращане",
"create_to": "До",
"create_tx_size": "Размер на Транзакцията",
"create_verify": "Потвърди в coinb.in",
"details_insert_contact": "Въведи контакт",
"details_add_rec_add": "Добави Контакт",
"details_add_rec_rem": "Премахни Контакт",
"details_add_recc_rem_all_alert_description": "Сигурни ли сте, че искате да премахнете всички получатели?",
"details_add_rec_rem_all": "Премахни всички получатели",
"details_recipients_title": "Получатели",
"details_recipient_title": "Получател #{number} от #{total}",
"please_complete_recipient_title": "Непълен получател",
"please_complete_recipient_details": "Моля, попълнете данните на получател #{number}, преди да добавите нов получател.",
"details_address": "Адрес",
"details_address_field_is_not_valid": "Невалиден адрес",
"details_adv_fee_bump": "Разреши увеличаване та таксата",
"details_adv_fee_bump": "Разреши увеличаване на таксата",
"details_adv_full": "Използвай целия наличен баланс",
"details_adv_full_sure": "Сигурни ли сте, че искате да използвате целия наличен баланс в портфейла?",
"details_adv_full_sure_frozen": "Сигурни ли сте, че искате да използвате целия наличен баланс на портфейла за тази транзакция? Моля, имайте предвид, че замразените монети са изключени.",
"details_adv_import": "Въведете Транзакция",
"details_adv_import_qr": "Импортирай транзакция (QR)",
"details_amount_field_is_not_valid": "Сумата е невалидна",
"details_amount_field_is_less_than_minimum_amount_sat": "Сумата е прекалено малка. Моля, въведете сума по-голяма от 500 сатошита.",
"details_amount_field_is_less_than_minimum_amount_sat": "Сумата е прекалено малка. Моля, въведете сума по-голяма от 500 сатоши.",
"details_create": "Създайте Фактура",
"details_error_decode": "Биткойн адреса не може да бъде разпознат",
"details_fee_field_is_not_valid": "Не валидна такса",
"details_fee_field_is_not_valid": "Невалидна такса",
"details_frozen": "{amount} BTC са замразени.",
"details_next": "Следващ",
"details_no_signed_tx": "Избраният файл не съдържа транзакция, която може да бъде импортирана.",
"details_note_placeholder": "Бележка за мен",
"details_scan": "Сканирай",
"details_total_exceeds_balance": "Сумата надвишава наличният баланс.",
"details_scan_hint": "Докоснете два пъти, за да сканирате или импортирате дестинация",
"details_scan_error": "Грешка при сканиране",
"details_total_exceeds_balance": "Сумата надвишава наличния баланс.",
"details_total_exceeds_balance_frozen": "Сумата за изпращане надвишава наличния баланс. Моля, имайте предвид, че замразените монети са изключени.",
"details_unrecognized_file_format": "Непознат файл формат",
"details_wallet_before_tx": "Преди създаване на транзакция, трябва да създадете Биткойн портфейл.",
"dynamic_init": "Начало",
@ -118,83 +173,532 @@
"fee_1d": "1 ден",
"fee_3h": "3ч",
"fee_custom": "Персонализиран",
"insert_custom_fee": "Въведете такса",
"fee_fast": "Бързо",
"fee_medium": "Средно",
"fee_replace_minvb": "Общата ставка на таксата (сатоши на vByte), която искате да платите, трябва да е по-висока от {min} sat/vByte.",
"fee_satvbyte": "в sat/vByte",
"fee_slow": "Бавно",
"header": "Изпрати",
"input_clear": "Изчисти",
"input_done": "Готово",
"input_paste": "Постави",
"input_total": "Тотално:",
"input_total": "Общо:",
"permission_camera_message": "Необходимо е вашето разрешение за достъп до камерата.",
"psbt_sign": "Подпиши транзакция",
"invalid_psbt": "Предоставен е невалиден PSBT.",
"open_settings": "Отвори настройки",
"permission_storage_denied_message": "BlueWallet не може да запази този файл. Моля, отворете настройките на устройството си и разрешете достъп до хранилището.",
"permission_storage_title": "Достъп до папките с файлове",
"psbt_clipboard": "Копирай",
"psbt_this_is_psbt": "Това е Частично Подписана Биткойн Транзакция (ЧПБТ - en. PSBT). Моля, подпишете транзакцията на хардуер портфейла си.",
"psbt_this_is_psbt": "Това е Частично Подписана Биткойн Транзакция (ЧПБТ - en. PSBT). Моля, подпишете транзакцията на хардуерния си портфейл.",
"psbt_tx_export": "Запиши като файл",
"no_tx_signing_in_progress": "Няма транзакция в прогрес.",
"outdated_rate": "Курсът е обновен последно: {date}",
"psbt_tx_open": "Отвори подписана транзакция",
"psbt_tx_scan": "Подпиши транзакция",
"qr_error_no_qrcode": "Не успяхме да намерим валиден QR код в избраното изображение. Уверете се, че изображението съдържа само QR код и няма допълнително съдържание като текст или бутони.",
"reset_amount": "Нулирай сумата",
"reset_amount_confirm": "Искате ли да нулирате сумата?",
"success_done": "Готово",
"txSaved": "Файлът с транзакцията ({filePath}) беше запазен.",
"file_saved_at_path": "Файлът ({filePath}) беше запазен.",
"cant_send_to_silentpayment_adress": "Този портфейл не може да изпраща към Silent Payments адреси",
"cant_send_to_bip47": "Този портфейл не може да изпраща към BIP47 платежни кодове",
"cant_find_bip47_notification": "Първо добавете този платежен код към контактите",
"problem_with_psbt": "Проблем с ЧПБТ / PSBT"
},
"settings": {
"about": "Повече",
"about_awesome": "Създаден с любов",
"about_backup": "Не забравяйте да направите копие от паролата/думите!",
"about_backup": "Винаги архивирайте ключовете си!",
"about_free": "Блу Уолет е безплатен и отворен код проект. Създаден от Биткойн фенове",
"about_license": "MIT Лиценз",
"about_release_notes": "Промени и Подобрения",
"about_review": "Напишете мнение",
"performance_score": "Резултат за производителност: {num}",
"run_performance_test": "Тествай производителността",
"about_selftest": "Направете селф-тест",
"about_selftest_ok": "Теста прмина успешно. Портфейла работи отлично.",
"block_explorer_invalid_custom_url": "Предоставеният URL е невалиден. Моля, въведете валиден URL, започващ с http:// или https://.",
"about_selftest_electrum_disabled": "Самотестът не е достъпен в офлайн режим на Electrum. Моля, изключете офлайн режима и опитайте отново.",
"about_selftest_ok": "Тестът премина успешно. Портфейлът работи отлично.",
"about_sm_github": "GitHub",
"about_sm_telegram": "Telegram",
"privacy_temporary_screenshots": "Разреши заснемане на екрана",
"privacy_temporary_screenshots_instructions": "Защитата срещу заснемане на екрана ще бъде временно изключена, което позволява екранни снимки и запис на екрана. Защитата ще се активира автоматично, когато затворите и отворите отново BlueWallet.",
"biometrics": "Биометрични данни",
"biometrics_no_longer_available": "Настройките на устройството ви са се променили и вече не съответстват на избраните настройки за сигурност в приложението. Моля, активирайте отново биометрията или кода за достъп и след това рестартирайте приложението, за да приложите тези промени.",
"biom_10times": "Опитахте се да въведете вашата парола 10 пъти. Желаете ли да направите ресет на апликацията? Това ще изтрие всички портфейли и ще декриптира хранилището.",
"biom_conf_identity": "Моля, потвърдете вашата самоличност.",
"biom_no_passcode": "Вашето устройство няма зададен код за достъп или активирана биометрия. За да продължите, моля, конфигурирайте код за достъп или биометрия в приложението Настройки.",
"biom_remove_decrypt": "Всички портфейли ще бъдат изтрити и хранилището ще бъде декриптирано. Сигурни ли сте, че искате да продължите?",
"currency": "Валута",
"currency_source": "Курсът се получава от",
"currency_fetch_error": "Възникна грешка при получаването на курса за избраната валута.",
"default_title": "При Стартиране",
"donate": "Дарение",
"donate_description": "Помогнете ни да запазим Blue безплатен!",
"electrum_connected": "Свързан",
"electrum_connected_not": "Няма връзка",
"electrum_error_connect": "Не може да се свърже с предоставения Electrum сървър",
"electrum_error_connect_tor": "Не може да се свърже с предоставения Electrum сървър. Моля, уверете се, че Orbot е свързан и опитайте отново.",
"lndhub_uri": "Напр., {example}",
"electrum_host": "Напр., {example}",
"electrum_offline_mode": "Офлайн режим",
"electrum_offline_description": "Когато е активиран, вашите Bitcoin портфейли няма да се опитват да зареждат балансите или транзакциите.",
"electrum_port": "Порт, обикновено {example}",
"use_ssl": "Използвай SSL",
"electrum_saved": "Промените бяха запазени успешно. Моля, рестартирайте Блу Уолет за да видите промените.",
"set_electrum_server_as_default": "Задайте {server} като Електрум сървър по подразбиране? ",
"set_electrum_server_as_default": "Задайте {server} като Електрум сървър по подразбиране?",
"set_lndhub_as_default": "Задайте {url} като LNDhub сървър по подразбиране?",
"electrum_settings_server": "Electrum сървър",
"electrum_status": "Статус",
"electrum_unable_to_connect": "Не възможно свързване със сървър {server}.",
"electrum_preferred_server": "Предпочитан сървър",
"electrum_preferred_server_description": "Въведете сървъра, който искате портфейлът ви да използва за всички Bitcoin дейности. След като бъде зададен, портфейлът ви ще използва изключително този сървър за проверка на баланси, изпращане на транзакции и получаване на мрежови данни. Уверете се, че имате доверие на този сървър, преди да го зададете.",
"electrum_unable_to_connect": "Невъзможно свързване със сървър {server}.",
"electrum_history": "История",
"electrum_reset_to_default": "Това ще позволи на BlueWallet да избере произволно сървър от списъка със сървъри.",
"electrum_reset": "Начални настройки",
"electrum_reset_to_default_and_clear_history": "Възстановяване по подразбиране и изчистване на историята",
"encrypt_decrypt": "Декриптирай хранилището",
"encrypt_decrypt_q": "Сигурни ли сте, че искате да декриптирате хранилището? Това ще направи портфейлите ви достъпни без парола.",
"encrypt_enc_and_pass": "Защитен с парола",
"encrypt_storage_explanation_headline": "Активиране на криптираното хранилище",
"encrypt_storage_explanation_description_line1": "Активирането на криптираното хранилище добавя допълнителен слой защита към приложението ви, като защитава начина, по който данните ви се съхраняват на устройството. Това затруднява достъпа на трети страни до информацията ви без разрешение.",
"encrypt_storage_explanation_description_line2": "Важно е обаче да знаете, че това криптиране защитава само достъпа до портфейлите ви, съхранявани в ключодържателя на устройството. То не поставя парола или допълнителна защита върху самите портфейли.",
"i_understand": "Разбирам",
"block_explorer": "Блок експлорър",
"block_explorer_preferred": "Използвай предпочитан блок експлорър",
"block_explorer_error_saving_custom": "Грешка при запазване на предпочитания блок експлорър",
"encrypt_title": "Сигурност",
"encrypt_tstorage": "Хранилище",
"encrypt_use": "Използвай {type}",
"set_as_preferred": "Задай като предпочитан",
"set_as_preferred_electrum": "Задаването на {host}:{port} като предпочитан сървър ще деактивира свързването с произволен предложен сървър.",
"encrypted_feature_disabled": "Тази функция не може да се използва, когато е активирано криптираното хранилище.",
"encrypt_use_expl": "{type} ще се използва за потвърждаване на самоличността ви преди извършване на транзакция, отключване, експортиране или изтриване на портфейл.",
"biometrics_fail": "Ако {type} не е активирана или не успее да отключи, можете да използвате кода за достъп на устройството като алтернатива.",
"general": "Основно",
"plausible_deniability": "Plausible Deniability",
"save": "Запази"
"general_continuity": "Непрекъснатост",
"general_continuity_e": "Когато е активирано, ще можете да преглеждате избрани портфейли и транзакции с помощта на другите си устройства, свързани с Apple iCloud.",
"groundcontrol_explanation": "GroundControl е безплатен сървър за push известия с отворен код за Bitcoin портфейли. Можете да инсталирате собствен GroundControl сървър и да поставите неговия URL тук, за да не разчитате на инфраструктурата на BlueWallet. Оставете празно, за да използвате сървъра по подразбиране на GroundControl.",
"header": "Настройки",
"language": "Език",
"last_updated": "Последно обновено",
"language_isRTL": "Рестартирането на BlueWallet е необходимо, за да влезе в сила ориентацията на езика.",
"license": "Лиценз",
"lightning_error_lndhub_uri": "Невалиден LNDhub URI",
"lightning_error_lndhub_uri_tor": "Невалиден LNDhub URI. Моля, уверете се, че Orbot е свързан и опитайте отново.",
"lightning_saved": "Промените бяха запазени успешно.",
"lightning_settings": "Lightning настройки",
"lightning_settings_explain": "За да се свържете със собствения си LND възел, моля, инсталирайте LNDhub и поставете неговия URL тук в настройките. Моля, имайте предвид, че само портфейли, създадени след запазване на промените, ще се свържат с посочения LNDhub.",
"lndhub_github": "GitHub хранилище",
"network": "Мрежа",
"network_broadcast": "Излъчи транзакция",
"network_electrum": "Electrum сървър",
"electrum_suggested_description": "Когато не е зададен предпочитан сървър, ще бъде избран произволен предложен сървър.",
"not_a_valid_uri": "Невалиден URI",
"notifications": "Известия",
"open_link_in_explorer": "Отвори връзката в експлорър",
"password": "Парола",
"password_explain": "Въведете паролата, която ще използвате за отключване на хранилището си.",
"plausible_deniability": "Правдоподобно отричане",
"privacy": "Поверителност",
"privacy_read_clipboard": "Чети клипборда",
"privacy_system_settings": "Системни настройки",
"privacy_quickactions": "Преки пътища за портфейла",
"privacy_quickactions_explanation": "Докоснете и задръжте иконата на приложението BlueWallet, за да видите бързо баланса на портфейла си.",
"privacy_clipboard_explanation": "Предоставя преки пътища, ако в клипборда ви се намери адрес или фактура.",
"privacy_do_not_track": "Деактивирай анализите",
"privacy_do_not_track_explanation": "Информацията за производителността и надеждността няма да бъде изпращана за анализ.",
"rate": "Курс",
"push_notifications_explanation": "Чрез активиране на известията, токенът на устройството ви ще бъде изпратен на сървъра, заедно с адресите на портфейлите и идентификаторите на транзакциите за всички портфейли и транзакции, направени след активиране на известията. Токенът на устройството се използва за изпращане на известия, а информацията за портфейла ни позволява да ви известяваме за входящи Bitcoin или потвърждения на транзакции.\n\nПредава се само информация след като активирате известията — нищо от преди не се събира.\n\nДеактивирането на известията ще премахне цялата тази информация от сървъра. Освен това, изтриването на портфейл от приложението също ще премахне свързаната с него информация от сървъра.",
"selfTest": "Самотест",
"save": "Запази",
"saved": "Запазено",
"success_transaction_broadcasted": "Вашата транзакция беше успешно излъчена!",
"total_balance": "Общ баланс",
"total_balance_explanation": "Показва общия баланс на всички ваши портфейли в джаджите на началния екран.",
"widgets": "Джаджи",
"tools": "Инструменти"
},
"transactions": {
"cancel_explain": "Ще заменим тази транзакция с такава, която плаща на вас и има по-висока такса. Това на практика отменя текущата транзакция. Това се нарича RBF — Replace by Fee.",
"cancel_no": "Тази транзакция не може да бъде заменена.",
"cancel_title": "Отмени тази транзакция (RBF)",
"transaction_loading_error": "Имаше проблем при зареждане на транзакцията. Моля, опитайте отново по-късно.",
"transaction_not_available": "Транзакцията не е налична",
"confirmations_lowercase": "{confirmations} потвърждения",
"expand_note": "Разшири бележката",
"cpfp_create": "Създай",
"pending": "Не потвърдена транзакция"
"cpfp_exp": "Ще създадем друга транзакция, която изразходва вашата непотвърдена транзакция. Общата такса ще бъде по-висока от таксата на оригиналната транзакция, така че би трябвало да бъде минирана по-бързо. Това се нарича CPFP — Child Pays for Parent.",
"cpfp_no_bump": "Тази транзакция не може да бъде ускорена.",
"cpfp_title": "Увеличи такса (CPFP)",
"details_balance_hide": "Скрий баланса",
"details_balance_show": "Покажи баланса",
"details_copy": "Копирай",
"details_copy_block_explorer_link": "Копирай линка към блок експлоръра",
"details_copy_note": "Копирай бележката",
"details_copy_txid": "Копирай ID на транзакцията",
"details_inputs": "Входове",
"details_outputs": "Изходи",
"date": "Дата",
"details_received": "Получено",
"details_view_in_browser": "Виж в браузъра",
"details_title": "Транзакция",
"incoming_transaction": "Входяща транзакция",
"outgoing_transaction": "Изходяща транзакция",
"expired_transaction": "Изтекла транзакция",
"pending_transaction": "Транзакция в очакване",
"offchain": "Оф-чейн",
"onchain": "Он-чейн",
"details_to": "Изход",
"enable_offline_signing": "Този портфейл не се използва във връзка с офлайн подписване. Желаете ли да го активирате сега?",
"list_conf": "Потв.: {number}",
"pending": "Чакаща",
"pending_with_amount": "В очакване {amt1} ({amt2})",
"received_with_amount": "+{amt1} ({amt2})",
"eta_10m": "ETA: за ~10 минути",
"eta_3h": "ETA: за ~3 часа",
"eta_1d": "ETA: за ~1 ден",
"list_title": "Транзакции",
"list_title_sent": "Изпратени",
"list_title_received": "Получени",
"transaction": "Транзакция",
"open_url_error": "Не може да се отвори връзката с браузъра по подразбиране. Моля, променете браузъра си по подразбиране и опитайте отново.",
"rbf_explain": "Ще заменим тази транзакция с такава с по-висока такса, за да бъде минирана по-бързо. Това се нарича RBF — Replace by Fee.",
"rbf_title": "Ускори (RBF)",
"status_bump": "Ускори",
"status_cancel": "Отмени",
"transactions_count": "Брой транзакции",
"txid": "ID на транзакцията",
"updating": "Обновяване...",
"watchOnlyWarningTitle": "Предупреждение за сигурност",
"watchOnlyWarningDescription": "Внимавайте за измамници, които често използват портфейли „само за наблюдение“, за да заблудят потребителите. Тези портфейли не ви позволяват да контролирате или изпращате средства; те ви позволяват само да виждате баланса.",
"custom_fee_warning_title": "Внимание",
"custom_fee_warning_description": "Такси под 1 sat/vB са валидни, но може да не бъдат препредадени поради политиките на възела.",
"details_eta_analyzing": "Анализиране...",
"details_sent": "Изпратени",
"details_section": "Детайли",
"details_explorer": "експлорър",
"details_network_fee": "Мрежова такса",
"details_to_address": "До",
"details_id": "ID",
"details_note": "Бележка",
"details_add_note": "добави",
"details_advanced": "Разширени",
"details_fee_rate": "Ставка на таксата",
"details_size": "Размер",
"details_virtual_size": "Виртуален размер",
"details_tx_hex": "Hex на транзакцията",
"details_inputs_count": "Входове ({count})",
"details_outputs_count": "Изходи ({count})"
},
"wallets": {
"add_bitcoin": "Bitcoin",
"add_bitcoin_explain": "Прост и мощен Bitcoin портфейл",
"add_create": "Създай",
"total_balance": "Общ баланс",
"add_entropy_reset_title": "Нулирай ентропията",
"add_entropy_reset_message": "Промяната на типа на портфейла ще нулира текущата ентропия. Искате ли да продължите?",
"add_entropy": "Ентропия",
"add_entropy_bytes": "{bytes} байта ентропия",
"add_entropy_generated": "{gen} байта генерирана ентропия",
"add_entropy_provide": "Предостави ентропия чрез хвърляне на зар",
"add_entropy_remain": "{gen} байта генерирана ентропия. Останалите {rem} байта ще бъдат получени от системния генератор на случайни числа.",
"add_import_wallet": "Импортирай портфейл",
"add_lightning": "Lightning",
"add_lightning_explain": "За харчене с мигновени транзакции",
"add_lndhub": "Свържи се с твоя LNDhub",
"add_lndhub_error": "Предоставеният адрес на възел е невалиден LNDhub възел.",
"add_lndhub_placeholder": "Адрес на твоя възел",
"add_placeholder": "моят първи портфейл",
"add_title": "Добави портфейл",
"add_wallet_name": "Име",
"add_wallet_type": "Тип",
"add_wallet_seed_length": "Дължина на сийда",
"add_wallet_seed_length_12": "12 думи",
"add_wallet_seed_length_24": "24 думи",
"clipboard_bitcoin": "В клипборда ви има Bitcoin адрес. Искате ли да го използвате за транзакция?",
"clipboard_lightning": "В клипборда ви има Lightning фактура. Искате ли да я използвате за транзакция?",
"clear_clipboard_on_import": "Изчисти клипборда при импорт",
"details_address": "Адрес",
"paste_from_clipboard": "Постави"
"details_advanced": "Разширени",
"details_are_you_sure": "Сигурни ли сте?",
"details_connected_to": "Свързан с",
"details_del_wb_err": "Предоставената сума на баланса не съответства на баланса на този портфейл. Моля, опитайте отново.",
"details_del_wb_q": "Този портфейл има баланс. Преди да продължите, моля, имайте предвид, че няма да можете да възстановите средствата без сийд фразата на този портфейл. За да избегнете случайно премахване, моля, въведете баланса на портфейла си от {balance} сатоши.",
"details_delete": "Изтрий",
"details_delete_wallet": "Изтрий портфейла",
"details_derivation_path": "път на деривация",
"details_display": "Покажи на началния екран",
"details_export_backup": "Експортирай/Резервно копие",
"details_export_history": "Експортирай историята в CSV",
"details_master_fingerprint": "Отпечатък на главния ключ",
"details_multisig_type": "мултисиг",
"details_show_xpub": "Покажи xpub на портфейла",
"details_show_addresses": "Покажи адресите",
"details_title": "Портфейл",
"wallets": "Портфейли",
"swipe_balance_hide": "Скрий",
"swipe_balance_show": "Покажи",
"drag_to_reorder": "Влачете, за да пренаредите",
"clear_search": "Изчисти търсенето",
"details_type": "Тип",
"details_use_with_hardware_wallet": "Използвай с хардуерен портфейл",
"details_yes_delete": "Да, изтрий",
"enter_bip38_password": "Въведете парола за декриптиране",
"export_title": "Експорт на портфейла",
"import_do_import": "Импортирай",
"import_passphrase": "Тайна фраза",
"import_passphrase_title": "Тайна фраза",
"import_passphrase_message": "Въведете тайна фраза, ако сте използвали такава",
"import_error": "Импортирането е неуспешно. Моля, уверете се, че предоставените данни са валидни.",
"import_explanation": "Моля, въведете думите на сийда, публичния ключ, WIF или каквото и да имате. BlueWallet ще се опита да отгатне правилния формат и да импортира портфейла ви.",
"import_imported": "Импортирано",
"import_scan_qr": "Сканирай или импортирай файл",
"import_success": "Вашият портфейл беше успешно импортиран.",
"import_success_watchonly": "Вашият портфейл беше успешно импортиран. ВНИМАНИЕ: Това е портфейл само за наблюдение, не можете да харчите от него.",
"import_search_accounts": "Търси акаунти",
"import_title": "Импортирай",
"learn_more": "Научи повече",
"import_discovery_title": "Откриване",
"import_discovery_subtitle": "Изберете открит портфейл",
"import_discovery_derivation": "Използвай персонализиран път на деривация",
"import_discovery_no_wallets": "Не са намерени портфейли.",
"import_discovery_offline": "BlueWallet в момента е в офлайн режим. В този режим не може да провери съществуването на портфейла, така че ще трябва да изберете правилния ръчно",
"import_derivation_found": "Намерен",
"import_derivation_found_not": "Не е намерен",
"import_derivation_loading": "Зареждане...",
"import_derivation_subtitle": "Въведете персонализиран път на деривация и ние ще се опитаме да открием вашия портфейл.",
"import_derivation_title": "Път на деривация",
"import_derivation_unknown": "Неизвестен",
"import_wrong_path": "Грешен път на деривация",
"list_create_a_button": "Добави сега",
"list_create_a_wallet": "Добави портфейл",
"list_create_a_wallet_text": "Безплатно е и можете да създадете \nколкото искате.",
"list_empty_txs1": "Вашите транзакции ще се появяват тук.",
"list_empty_txs1_lightning": "Lightning портфейлът трябва да се използва за ежедневните ви транзакции. Таксите са нечестно евтини, а скоростта е светкавична.",
"list_empty_txs2": "Започнете с вашия портфейл.",
"list_empty_txs2_lightning": "\nЗа да започнете да го използвате, докоснете „Управление на средства“ и заредете баланса си.",
"list_latest_transaction": "Последна транзакция",
"list_long_choose": "Избери снимка",
"paste_from_clipboard": "Постави",
"import_file": "Импортирай файл",
"list_long_scan": "Сканирай QR код",
"list_title": "Портфейли",
"list_tryagain": "Опитай отново",
"no_ln_wallet_error": "Преди да платите Lightning фактура, трябва първо да добавите Lightning портфейл.",
"looks_like_bip38": "Това изглежда като защитен с парола частен ключ (BIP38).",
"manage_title": "Управление на портфейлите",
"no_results_found": "Не са намерени резултати.",
"please_continue_scanning": "Моля, продължете сканирането.",
"select_no_bitcoin": "В момента няма налични Bitcoin портфейли.",
"select_no_bitcoin_exp": "Необходим е Bitcoin портфейл, за да зареждате Lightning портфейли. Моля, създайте или импортирайте такъв.",
"select_wallet": "Избери портфейл",
"pull_to_refresh": "Дръпни за обновяване",
"warning_do_not_disclose": "Никога не споделяйте информацията по-долу",
"scan_import": "Сканирайте този QR код, за да импортирате портфейла си в друго приложение.",
"write_down_header": "Създай ръчно резервно копие",
"write_down": "Запишете и съхранявайте сигурно тези думи. Използвайте ги, за да възстановите портфейла си по-късно.",
"wallet_type_this": "Типът на този портфейл е {type}.",
"share_number": "Сподели {number}",
"copy_ln_url": "Копирайте и съхранявайте сигурно този URL, за да възстановите портфейла си по-късно.",
"copy_ln_public": "Копирайте и съхранявайте сигурно тази информация, за да възстановите портфейла си по-късно.",
"add_ln_wallet_first": "Първо трябва да добавите Lightning портфейл.",
"identity_pubkey": "Публичен ключ за идентичност",
"xpub_title": "xpub на портфейла",
"manage_wallets_search_placeholder": "Търси портфейли, адреси, транзакции и бележки",
"more_info": "Повече информация",
"details_delete_wallet_error_message": "Имаше проблем при потвърждаването дали този портфейл е премахнат от известията — това може да се дължи на мрежов проблем или лоша връзка. Ако продължите, може все още да получавате известия за транзакции, свързани с този портфейл, дори след като той бъде изтрит.",
"details_delete_anyway": "Изтрий въпреки това"
},
"multisig": {
"multisig_vault": "Мултисиг сейф",
"default_label": "Мултисиг сейф",
"multisig_vault_explain": "Най-добра сигурност за големи суми",
"provide_signature": "Предостави подпис",
"provide_signature_details": "Използвайте устройството и портфейла си, където се намира ключът, за да подпишете тази транзакция",
"provide_signature_details_bluewallet": "В BlueWallet отидете в менюто на екрана Изпрати и изберете ",
"provide_signature_next_steps": "Сканирай или импортирай подписана транзакция",
"provide_signature_next_steps_details": "След като портфейлът ви успешно подпише транзакцията, сканирайте предоставения QR код или импортирайте придружаващия файл, и след това прегледайте всички детайли на транзакцията преди да я излъчите.",
"vault_key": "Ключ на сейфа {number}",
"required_keys_out_of_total": "Необходими ключове от общия брой",
"fee": "Такса: {number}",
"fee_btc": "{number} BTC",
"confirm": "Потвърди",
"header": "Изпрати",
"share": "Сподели...",
"view": "Виж",
"shared_key_detected": "Споделен съподписващ",
"shared_key_detected_question": "С вас беше споделен съподписващ, искате ли да го импортирате?",
"manage_keys": "Управление на ключовете",
"how_many_signatures_can_bluewallet_make": "колко подписа може да направи BlueWallet",
"signatures_required_to_spend": "Необходими подписи {number}",
"signatures_we_can_make": "може да направи {number}",
"scan_or_import_file": "Сканирай или импортирай файл",
"export_coordination_setup": "Експортирай координационната настройка",
"cosign_this_transaction": "Съподпиши тази транзакция?",
"lets_start": "Да започваме",
"create": "Създай",
"native_segwit_title": "Най-добра практика",
"wrapped_segwit_title": "Най-добра съвместимост",
"legacy_title": "Legacy",
"co_sign_transaction": "Подпиши транзакция",
"ms_help_title5": "Развирени Настройки"
"what_is_vault": "Сейфът е",
"what_is_vault_numberOfWallets": " {m}-от-{n} мултисиг ",
"what_is_vault_wallet": "портфейл.",
"vault_advanced_customize": "Настройки на сейфа",
"needs": "Има нужда от",
"what_is_vault_description_number_of_vault_keys": " {m} ключа на сейфа ",
"what_is_vault_description_to_spend": "за харчене и трети, който \nможете да използвате като резервно копие.",
"what_is_vault_description_to_spend_other": "за харчене.",
"quorum": "{m} от {n} кворум",
"quorum_header": "Кворум",
"of": "от",
"wallet_type": "Тип на портфейла",
"invalid_mnemonics": "Тази мнемонична фраза изглежда не е валидна.",
"invalid_cosigner": "Невалидни данни за съподписващ",
"not_a_multisignature_xpub": "Това не е xpub от мултисиг портфейл!",
"invalid_cosigner_format": "Неправилен съподписващ: Това не е съподписващ за формат {format}.",
"create_new_key": "Създай нов",
"scan_or_open_file": "Сканирай или отвори файл",
"i_have_mnemonics": "Имам сийд за този ключ.",
"type_your_mnemonics": "Въведете сийд, за да импортирате съществуващ ключ на сейфа.",
"this_is_cosigners_xpub": "Това е xpub на съподписващия — готов за импортиране в друг портфейл. Безопасно е да го споделите.",
"this_is_cosigners_xpub_airdrop": "Ако споделяте чрез AirDrop, получателите трябва да са в екрана за координация.",
"wallet_key_created": "Вашият ключ на сейфа беше създаден. Отделете време да направите сигурно резервно копие на мнемоничния си сийд.",
"are_you_sure_seed_will_be_lost": "Сигурни ли сте? Вашият мнемоничен сийд ще бъде загубен, ако нямате резервно копие.",
"forget_this_seed": "Забрави този сийд и използвай xpub вместо него.",
"view_edit_cosigners": "Виж/Редактирай съподписващите",
"this_cosigner_is_already_imported": "Този съподписващ вече е импортиран.",
"export_signed_psbt": "Експортирай подписан PSBT",
"input_fp": "Въведете отпечатък",
"input_fp_explain": "Пропуснете, за да използвате стойността по подразбиране (00000000)",
"input_path": "Въведете път на деривация",
"input_path_explain": "Пропуснете, за да използвате стойността по подразбиране ({default})",
"ms_help": "Помощ",
"ms_help_title": "Как работят мултисиг сейфовете: съвети и трикове",
"ms_help_text": "Портфейл с множество ключове, за повишена сигурност или споделено пазене",
"ms_help_title1": "Препоръчват се множество устройства.",
"ms_help_1": "Сейфът ще работи с други приложения BlueWallet и PSBT съвместими портфейли, като Electrum, Specter, Coldcard, Cobo Vault и др.",
"ms_help_title2": "Редактиране на ключове",
"ms_help_2": "Можете да създадете всички ключове на сейфа на това устройство и да ги премахнете или редактирате по-късно. Наличието на всички ключове на едно и също устройство има еквивалентна сигурност на обикновен Bitcoin портфейл.",
"ms_help_title3": "Резервни копия на сейфа",
"ms_help_3": "В опциите на портфейла ще намерите резервното копие на сейфа и резервното копие само за наблюдение. Това резервно копие е като карта към вашия портфейл. То е от съществено значение за възстановяване на портфейла в случай, че загубите един от сийдовете си.",
"ms_help_title4": "Импортиране на сейфове",
"ms_help_4": "За да импортирате мултисиг, използвайте файла с резервно копие и функцията Импортирай. Ако имате само сийдове и xpub-ове, можете да използвате индивидуалния бутон Импортирай при създаване на ключове на сейфа.",
"ms_help_title5": "Разширен режим",
"ms_help_5": "По подразбиране BlueWallet ще генерира сейф 2-от-3. За да създадете различен кворум или да промените типа на адреса, активирайте Разширен режим в Настройките."
},
"cc": {
"sort_status": "Статус"
"change": "Ресто",
"coins_selected": "Избрани монети ({number})",
"selected_summ": "{value} избрани",
"empty": "Този портфейл в момента няма монети.",
"freeze": "Замрази",
"freezeLabel": "Замразена",
"freezeLabel_un": "Размразена",
"header": "Управление на UTXO",
"use_coin": "Използвай монета",
"use_coins": "Използвай монети",
"tip": "Тази функция ви позволява да виждате, етикетирате, замразявате или избирате монети за по-добро управление на портфейла. Можете да изберете няколко монети, като докоснете цветните кръгчета.",
"sort_asc": "Възходящо",
"sort_desc": "Низходящо",
"sort_height": "Височина",
"sort_value": "Стойност",
"sort_label": "Етикет",
"sort_status": "Статус",
"sort_by": "Сортирай по"
},
"addresses": {
"copy_private_key": "Копирай частния ключ",
"sensitive_private_key": "Внимание: частните ключове са изключително чувствителни. Продължаване?",
"sign_title": "Подпиши/Провери съобщение",
"sign_help": "Тук можете да създадете или проверите криптографски подпис въз основа на Bitcoin адрес.",
"sign_sign": "Подпиши",
"sign_verify": "Провери",
"sign_signature_correct": "Проверката е успешна!",
"sign_signature_incorrect": "Проверката е неуспешна!",
"sign_placeholder_address": "Адрес",
"type_receive": "Получаване"
"sign_placeholder_message": "Съобщение",
"sign_placeholder_signature": "Подпис",
"addresses_title": "Адреси",
"type_change": "Ресто",
"type_receive": "Получаване",
"type_used": "Използван",
"transactions": "Транзакции"
},
"notifications": {
"would_you_like_to_receive_notifications": "Искате ли да получавате известия, когато получите входящи плащания?",
"notifications_subtitle": "Входящи плащания и потвърждения на транзакции",
"no_and_dont_ask": "Не, и не ме питай отново.",
"permission_denied_message": "Отказахте разрешение да ви изпращаме известия. Ако искате да получавате известия, моля, активирайте ги в настройките на устройството си."
},
"total_balance_view": {
"display_in_bitcoin": "Покажи в Bitcoin",
"hide": "Скрий",
"display_in_sats": "Покажи в сатоши",
"display_in_fiat": "Покажи в {currency}",
"title": "Общ баланс",
"explanation": "Виж общия баланс на всички твои портфейли в екрана за преглед."
},
"is_it_my_address": {
"title": "Това моят адрес ли е?",
"owns": "{label} притежава {address}",
"enter_address": "Въведете адрес",
"check_address": "Провери адреса",
"no_wallet_owns_address": "Никой от наличните портфейли не притежава предоставения адрес.",
"view_qrcode": "Виж QR код"
},
"autofill_word": {
"title": "Последна дума на сийда",
"enter": "Въведете частичната си мнемонична фраза",
"generate_word": "Генерирай последната дума",
"error": "Входните данни не са частична мнемонична фраза от 11 или 23 думи. Моля, опитайте отново."
},
"units": {
"BTC": "BTC",
"MAX": "Макс",
"sat_vbyte": "sat/vByte",
"sats": "сатоши"
},
"lnurl_auth": {
"register_question_part_1": "Искате ли да регистрирате акаунт в",
"register_question_part_2": "използвайки вашия Lightning портфейл?",
"register_answer": "Успешно регистрирахте акаунт в {hostname}!",
"login_question_part_1": "Искате ли да влезете в",
"login_question_part_2": "използвайки вашия Lightning портфейл?",
"login_answer": "Успешно влязохте в {hostname}!",
"link_question_part_1": "Искате ли да свържете акаунта си в",
"link_question_part_2": "с вашия Lightning портфейл?",
"link_answer": "Вашият Lightning портфейл беше успешно свързан с акаунта ви в {hostname}!",
"auth_question_part_1": "Искате ли да се удостоверите в",
"auth_question_part_2": "използвайки вашия Lightning портфейл?",
"auth_answer": "Успешно се удостоверихте в {hostname}!",
"could_not_auth": "Не можахме да ви удостоверим в {hostname}.",
"authenticate": "Удостовери"
},
"bip47": {
"payment_code": "Платежен код",
"contacts": "Контакти",
"bip47_explain": "Многократно използваем и споделим код",
"bip47_explain_subtitle": "BIP47",
"purpose": "Многократно използваем и споделим код (BIP47)",
"pay_this_contact": "Плати на този контакт",
"rename_contact": "Преименувай контакта",
"copy_payment_code": "Копирай платежния код",
"hide_contact": "Скрий контакта",
"rename": "Преименувай",
"provide_name": "Въведете ново име за този контакт",
"add_contact": "Добави контакт",
"provide_payment_code": "Въведете платежен код",
"invalid_pc": "Невалиден платежен код",
"notification_tx_unconfirmed": "Транзакцията за уведомление все още не е потвърдена, моля изчакайте",
"failed_create_notif_tx": "Неуспешно създаване на он-чейн транзакция",
"onchain_tx_needed": "Необходима е он-чейн транзакция",
"notif_tx_sent": "Транзакцията за уведомление е изпратена. Моля, изчакайте да бъде потвърдена",
"notif_tx": "Транзакция за уведомление",
"not_found": "Платежният код не е намерен"
}
}

View File

@ -27,7 +27,9 @@
"unlock": "گۊشیڌن چفت",
"port": "پورت",
"ssl_port": "پورت SSL",
"suggested": "پؽشنهاڌی"
"suggested": "پؽشنهاڌی",
"copied": "لف گیری وابی!",
"discard_changes_explain": "آلشتکاریا زفت نوابیڌه دارین. اخۊی هونا ن نیڌه گری ۉ ز ای بلگه و در بئری؟"
},
"azteco": {
"codeIs": "کوڌ تخفیف ایسا",
@ -36,7 +38,8 @@
"redeem": "ازاف کردن و کیف پیل",
"redeemButton": "فعال کردن",
"success": "سر ٱنجوم گرهڌ",
"title": "فعال کردن کوڌ تخفیف Azte.co"
"title": "فعال کردن کوڌ تخفیف Azte.co",
"successMessage": "ووچر وا مووفقیت فعال وابی! دارایی ایسا و زۊڌی و کیف پیل بیت کوین ایسا اوݩ."
},
"entropy": {
"save": "زفت کردن",
@ -80,14 +83,18 @@
"create_password_explanation": "رزمی ک سی جاگه زفت کردنی جعلی هڌ، نوا وا رزم جاگه زفت کردنی ٱلسی ی جۊر بۊ.",
"help2": "جاگه زفت کردنی نۊ قلوه و کار ایا وو ایسا ترین یتی ز دارایی خوتۉݩ ن اۊچنا واڌارنین تا ب تؽ بیا ک هونی زس استفاڌه اکۊنین.",
"password_should_not_match": "رزم هونی ب کار اروه. ی رزم دیری ن ب کار بگر.",
"title": "انکار مووجه"
"title": "انکار مووجه",
"help": "تو هالاتی، شاید ایسا ن مجبۊر کۊنن رزم خوته فاش کۊنی. سی ایکه کوینا خوته امن داری، BlueWallet اتره ی جاگه زفت کردنی دؽ ریس رزم وا رزم دیر وورکل کونه. د هالت فشار، تری ای رزم ن وا ی نفر ی غیر فاش کۊنی. ٱر منه BlueWallet زیڌه بۊ، جاگه زفت کردنی نۊ «جعلی» گۊشیڌه ابۊ. یۊ سی ی نفر ی غیر، واقعی ب نظر اونه، اما د دل، جاگه زفت کردنی ٱلسی ایسا وا کوینا امن میمونه."
},
"pleasebackup": {
"ask_no": "ن، مو نڌاروم.",
"ask_yes": "هری، مو داروم.",
"ok": "خا، هو ن هؽل کردوم.",
"ok_lnd": "خا، هو ن زفت کردوم.",
"title": "کیف پیل ایسا وورکل وابی."
"title": "کیف پیل ایسا وورکل وابی.",
"ask": "عبارت بازیابی کیف پیلته زفت کردیه؟ ای عبارت بازیابی سی دسرسی و دارایی خوت لازمه، ٱر ای دسگاهن گوم کۊنی. بؽ ای عبارت بازیابی، دارایی خوت سی همیشه گوم اونه.",
"text": "ی دیقه ویرگار بنا تا ای عبارت بازیابی ن ری ی بلگه کاغذ بنویسی.\nیۊ نوسخه لادرار خوته هڌ ۉ تری وا یۊ کیف پیلته بازیابی کۊنی.",
"text_lnd": "تی کۊن ای نوسخه لادرار کیف پیل ن زفت کۊنی. یۊ ایلیه ٱر گوم وابی، کیف پیل ته بازیابی کۊنی."
},
"receive": {
"details_create": "وورکل",
@ -101,7 +108,8 @@
"maxSatsFull": "بیشترین مقدار {max} ساتۊشی یا {currency} هڌ.",
"minSats": "کمترین مقدار {min} ساتۊشی هڌ.",
"minSatsFull": "کمترین مقدار {min} ساتۊشی یا {currency} هڌ.",
"qrcode_for_the_address": "QR کود سی ای نشۊوی"
"qrcode_for_the_address": "QR کود سی ای نشۊوی",
"bip47_explanation": "کود پرداخت ی آدرس عمومی هڌ ک بؽ فاش کردن آدرسا کیف پیل ایسا کار اکونه. هومه خدماتا تی پشتؽوانی نکونن."
},
"send": {
"provided_address_is_invoice": "منی ای آدرس ی سۊرت هساو لایتنینگ هڌ. سی پرداخت ای سۊرت هساو، و کیف پیل لایتنینگ خوتۉݩ ریوین.",
@ -147,7 +155,6 @@
"details_next": "نیایی",
"details_no_signed_tx": "فایل پسند بیڌه، تراکونشی منس نؽڌ ک ترسته بویم ب من یاریمس.",
"details_note_placeholder": "ویرداشت و خوت",
"counterparty_label_placeholder": "آلشت نوم هومدنگ",
"details_scan": "اسکن",
"details_scan_hint": "سی اسکن یا و من ٱووردن مقسد، دو کرت بزن ریس",
"details_scan_error": "ختا اسکن",
@ -189,7 +196,17 @@
"success_done": "ٱنجوم وابی",
"txSaved": "فایل تراکونش ({filePath}) زفت وابیڌه.",
"file_saved_at_path": "فایل ({filePath}) زفت وابیڌه.",
"problem_with_psbt": "موشکل وا تراکونش ناقس امزا بیڌه PSBT"
"problem_with_psbt": "موشکل وا تراکونش ناقس امزا بیڌه PSBT",
"details_add_recc_rem_all_alert_description": "اخۊی پوی گیرنده یل ن پاک کۊنی؟",
"please_complete_recipient_details": "تی کۊن جۊزیات گیرنده #{number} ن پؽش ز ٱووردن گیرنده نۊ کامل کۊنی.",
"details_total_exceeds_balance_frozen": "مقداری ک خۊی فیشنی، بیشتر ز مۉجۊڌیت هڌ. ویرت بۊ ک کوینا مسدۊد، شومارش نوابن.",
"fee_replace_minvb": "نرخ کارمزد کول (ساتۊشی سی هر بایت مجازی) ک اخۊی پرداخت کۊنی، وا بیشتر ز {min} ساتۊشی سی هر بایت مجازی بۊ.",
"permission_storage_denied_message": "BlueWallet نتره ای فایل ن زفت کونه. تی کۊن سامووا دسگا ته ن گۊشی ۉ موجوز دسرسی و جاگه زفت کردنی ن فعال کۊنی.",
"psbt_this_is_psbt": "یۊ ی تراکونش بیت کوین ناقس امزا بیڌه (PSBT) هڌ. تی کۊن وا کیف پیل سخت ٱفزاری خوت امزاسه کامل کۊنی.",
"qr_error_no_qrcode": "ایما نترسیم ی QR کود زبال منه کتاو هووه پسند بیڌه پؽڌا کۊنیم. موتمعن بۊ ک کتاو هووه فقط ی QR کود داره ۉ هیچ دؽوار، چی نوشتار یا دگمه نڌاره.",
"cant_send_to_silentpayment_adress": "ای کیف پیل نتره و آدرسا Silent Payments فیشنه",
"cant_send_to_bip47": "ای کیف پیل نتره و کود پرداخت BIP47 فیشنه",
"cant_find_bip47_notification": "ٱول ای کود پرداخت ن و هومدنگا اضاف کۊنی"
},
"settings": {
"about": "زبار",
@ -214,7 +231,7 @@
"default_title": "موقه ره وندن",
"electrum_connected": "منپیز",
"electrum_connected_not": "بؽ منپیز",
"electrum_error_connect": "نتره و سرور الکتروم داڌه وابیڌه منپیز بۊوه",
"electrum_error_connect": "نتره و سرور الکترام داڌه وابیڌه منپیز بۊوه",
"lndhub_uri": "سی نمووه، {example}",
"electrum_host": "سی نمووه، {example}",
"electrum_offline_mode": "هالت آفلاین",
@ -242,7 +259,7 @@
"header": "سامووا",
"language": "زووݩ",
"last_updated": "ورۊ رسۊوی دیندایی",
"language_isRTL": وندن دووارته BlueWallet سی انجوم آلشت کاریا ری زووݩ الن وا انجوم بۊ.",
"language_isRTL": ه وندن دۊوارته BlueWallet سی انجوم آلشت کاریا ری زووݩ الن وا انجوم بۊ.",
"license": "موجوز",
"lightning_error_lndhub_uri": "یۊ آر آی LNDhub زبال نؽ",
"lightning_saved": "آلشت کاریا ایسا و خۊوی زفت وابین.",
@ -266,12 +283,48 @@
"saved": "زفت وابی",
"total_balance": "پوی مۉجۊدی",
"widgets": "اوزارکا",
"tools": "اوزارا"
"tools": "اوزارا",
"about_free": "BlueWallet ی پروژه ٱزاد ۉ بازیه ٱفرینش کۊن. ساته وابیڌه وا کاربرا بیت کوین.",
"block_explorer_invalid_custom_url": "نشۊوی داڌه وابیڌه زبال نؽ. تی کۊن ی نشۊوی زبال ک وا http:// یا https:// شۊرۊ بۊ بزن.",
"privacy_temporary_screenshots_instructions": "موسامینیڌن بلگه نمایش موقتاً قیر فعال اونه، تا بلگه نمایش زفت کردن ۉ بلگه نمایش هۉنبلت کردن مومکن بۊ. ٱر BlueWallet ن بستی ۉ ز نۊ گۊشی، موسامینیڌن ب توور خوس کار وا فعال اونه.",
"biometrics_no_longer_available": "سامووا دسگاه ایسا آلشت وابیڌه ۉ ز ای ب دیندا وا سامووا امنیتی پسند بیڌه من برنامه هومخۊوݩ نؽ. تی کۊن بیومتریک یا کد دسترسی ن ز نۊ فعال کۊنی، ۉ بعد برنامه ن ز نۊ شۊرۊ کۊنی تا آلشتا اعمال بۊن.",
"biom_10times": "ایسا 10 کرت کۊشش کردیه رزم ته بزنی. اخۊی جاگه زفت کردنی ته وورنشۊوی کۊنی؟ ای کار، پوی کیف پیلا ن پاک اکونه ۉ جاگه زفت کردنی ته رزم گوشایی اکونه.",
"biom_no_passcode": "دسگا ایسا کد دسترسی یا بیومتریک فعال نڌاره. سی ادامه، تی کۊن کد دسترسی یا بیومتریک ن منه برنامه سامووا ساموو کۊنی.",
"biom_remove_decrypt": "پوی کیف پیلا ایسا پاک اونن ۉ جاگه زفت کردنی ایسا رزم گوشایی اونه. اخۊی ادامه دی؟",
"donate": "اهدا",
"donate_description": "هؽاری کۊن تا Blue ٱزاد بمونه!",
"electrum_error_connect_tor": "نتره و سرور الکترام داڌه وابیڌه منپیز بۊوه. تی کۊن موتمعن بۊ ک برنامه Orbot منپیز هڌ ۉ ز نۊ تفره کو.",
"electrum_saved": "آلشتکاریا ایسا وا مووفقیت زفت وابین. شاید لازم بۊ BlueWallet ن ز نۊ شۊرۊ کۊنی تا آلشتکاریا اعمال بۊن.",
"set_lndhub_as_default": "{url} سی سرور پؽش فرز LNDhub ساموو بۊوه؟",
"electrum_preferred_server_description": "سروری ک اخۊی کیف پیلت سی پوی کارا بیت کوین استفاڌه کونه ن بزن. ٱر ساموو وابی، کیف پیلت فقط ز ای سرور سی واجۊری مۉجۊڌی، فشناڌن تراکونش ۉ گرؽڌن داڌه شبکه استفاڌه اکونه. پؽش ز سامووݩ، موتمعن بۊ ک و ای سرور اعتماد داری.",
"electrum_reset_to_default": "یۊ ایلیه ک BlueWallet ی سرور ن ز فهرست سرورا تسادفی پسند کونه.",
"electrum_reset_to_default_and_clear_history": "ورگندن و پؽش فرز ۉ پاک کردن ویرگار",
"encrypt_decrypt_q": "اخۊی جاگه زفت کردنی ته رزم گوشایی کۊنی؟ ای کار ایلیه کیف پیلا ته بؽ رزم دسرس بۊن.",
"encrypt_enc_and_pass": "موسامینیڌه وا رزم",
"encrypt_storage_explanation_description_line1": "فعال کردن رزم ناهاڌن ری جاگه زفت کردنی، ی لایه موسامینیڌن دؽ و برنامه ایسا اضاف اکونه ۉ شیوه ناهاڌن داڌه ها ری دسگا ته امن اکونه. یۊ کار اکونه ک سختر بۊ تا هرکی بؽ موجوز و داڌه ها ایسا دسرس داشته بۊ.",
"encrypt_storage_explanation_description_line2": "اما، لازمه بدۊنی ک ای رزم ناهاڌن، فقط دسرسی و کیف پیلا ناهاڌه وابیڌه ری کیچین دسگا ته موسامینه. کیف پیلا ٱلسی ن وا رزم یا موسامینیڌن دؽ، موسامینه نکونه.",
"set_as_preferred_electrum": "سامووݩ {host}:{port} و عونوان سرور ترجیهی، منپیز و سرور پؽشنهاڌی تسادفی ن قیر فعال اکونه.",
"encrypted_feature_disabled": "ای ویژگی وا جاگه زفت کردنی موسامینیڌه فعال نتره ب کار رئڌه بۊوه.",
"encrypt_use_expl": "{type} سی تاییڌ هۊویت ایسا پؽش ز انجوم تراکونش، گۊشیڌن چفت، و در کشیڌن، یا پاک کردن کیف پیل ب کار رئڌه ابۊ.",
"biometrics_fail": "ٱر {type} فعال نؽ، یا منه گۊشیڌن چفت ناکام بۊ، تری ز کد دسترسی دسگا ته و عونوان جانشین استفاڌه کۊنی.",
"general_continuity": "تڌاوم",
"general_continuity_e": "ٱر فعال بۊ، تری کیف پیلا ۉ تراکونشا پسند بیڌه ن ز دۊیار دسگاها Apple iCloud منپیز خوت ووینی.",
"groundcontrol_explanation": "GroundControl ی سرور وارسۊوی ٱزاد ۉ بازیه ٱفرینش کۊن سی کیف پیلا بیت کوین هڌ. تری سرور GroundControl خوته نسو کۊنی ۉ نشۊوی ٱنا ای جا بنی تا و زیر ساخت BlueWallet وابسته نووی. سی استفاڌه ز سرور پؽش فرز GroundControl، ای جا ن خالی هؽل کو.",
"lightning_error_lndhub_uri_tor": "یۊ آر آی LNDhub زبال نؽ. تی کۊن موتمعن بۊ ک برنامه Orbot منپیز هڌ ۉ ز نۊ تفره کو.",
"lightning_settings_explain": "سی منپیز و گره LND خوت، تی کۊن LNDhub ن نسو کۊنی ۉ نشۊوی ٱنا ای جا منه سامووا بنی. ویرت بۊ ک فقط کیف پیلایی ک پس ز زفت آلشتکاریا وورکل اونن، و LNDhub داڌه وابیڌه منپیز اونن.",
"lndhub_github": "گنجگه گیت هاب",
"electrum_suggested_description": "ٱر سرور ترجیهی ساموو نوابی، ی سرور پؽشنهاڌی ب توور تسادفی سی استفاڌه پسند اونه.",
"password_explain": "رزمی ک سی گۊشیڌن چفت جاگه زفت کردنی ته ب کار اوری ن بزن.",
"privacy_quickactions_explanation": "ری نشۊن BlueWallet نگاه دار ۉ بفشار تا مۉجۊڌی کیف پیل خوته ب زۊڌی ووینی.",
"privacy_clipboard_explanation": "ٱر آدرس یا سۊرت هساوی منه ویرگه ایسا پؽڌا وابی، ر نهنگا نشۉݩ بڌه.",
"privacy_do_not_track_explanation": "دؽوسمندیا کارکرد ۉ اعتماد ٱفرینی سی تئلیل فیشناڌه نوابن.",
"push_notifications_explanation": "وا فعال کردن وارسۊویا، توکن دسگا ایسا و گرا وا آدرسا کیف پیل ۉ شناسه تراکونشا سی پوی کیف پیلا ۉ تراکونشایی ک پس ز فعال کردن وارسۊویا ٱنجوم اونن، فیشناڌه ابۊ. توکن دسگا سی فشناڌن وارسۊویا ب کار رئڌه ابۊ، ۉ دؽوسمندیا کیف پیل ایلیه ایما ایسا ن ز بیت کوین وۊرۊڌی یا تاییڌ تراکونش ٱگاه کۊنیم.\n\nفقط دؽوسمندی پس ز فعال کردن وارسۊویا ، فیشناڌه اونه—هیچ چی ز پؽش، گرها وابیڌه نؽ.\n\nقیر فعال کردن وارسۊویا، پوی ای دؽوسمندی ن ز سرور پاک اکونه. ای جور، پاک کردن ی کیف پیل ز برنامه، دؽوسمندی پۊشمت وا هون ن نی ز سرور پاک اکونه.",
"success_transaction_broadcasted": "تراکونش ایسا وا مووفقیت تیجنیڌه وابی!",
"total_balance_explanation": "پوی مۉجۊڌی کیف پیلا خوته من اوزارکا بلگه ٱلسی نشۉݩ بڌه."
},
"transactions": {
"cancel_title": "ای تراکونشن لقو کوݩ (RBF)",
"confirmations_lowercase": "{confirmations} تاییڌ",
"copy_link": "لف گیری لینگ",
"expand_note": "نشۉݩ داڌن کامل ویرداشت",
"cpfp_create": "وورکل",
"cpfp_no_bump": "ای تراکونش نتره کارمزدس بیشتر بۊ.",
@ -284,12 +337,62 @@
"date": "ویرگار",
"details_received": "گرؽڌه وابیڌه",
"details_title": "تراکونش",
"details_inputs": "وۊرۊڌیا",
"details_outputs": "خروجیا",
"details_to": "خروجی",
"details_to_address": "وه",
"details_network_fee": "کارمزد شبکه",
"details_section": "جۊزیات",
"details_explorer": "گشت گر",
"details_size": "هندا",
"details_virtual_size": "هندا مجازی",
"details_tx_hex": "هگزادسیمال تراکونش",
"details_inputs_count": "وۊرۊڌیا ({count})",
"details_outputs_count": "خروجیا ({count})",
"expired_transaction": "تراکونش مونقزی وابیڌه",
"pending_transaction": "تراکونش مندیر سی زفت",
"pending_with_amount": "مندیر سی زفت {amt1} ({amt2})",
"received_with_amount": "+{amt1} ({amt2})",
"list_title": "تراکونشا",
"rbf_title": "تسریع (RBF)",
"status_bump": "تسریع",
"status_cancel": "لقو",
"offchain": "آفچین",
"onchain": "آنچین",
"pending": "مندیر سی زفت",
"list_title_received": "گرؽڌه وابیڌه",
"transaction": "تراکونش",
"open_url_error": "نا مووفق منه گۊشیڌن لینگ وا گشت گر پؽش فرز. گشت گر پؽش فرز خوته آلشت کوݩ ۉ ز نۊ تفره کو."
"open_url_error": "نا مووفق منه گۊشیڌن لینگ وا گشت گر پؽش فرز. گشت گر پؽش فرز خوته آلشت کوݩ ۉ ز نۊ تفره کو.",
"cancel_explain": "ای تراکونش ن وا تراکونش دیر ک و خوت پرداخت اکونه ۉ کارمزد بیشتر داره، جانشین اکۊنیم. یۊ تراکونش الن ن لقو اکونه. ای کار ن RBF—جانشینی وا کارمزد اگۊن.",
"cancel_no": "ای تراکونش جانشین پزیر نؽ.",
"transaction_loading_error": "موشکلؽ منه بار ونی تراکونش پؽش ٱووڌ. تی کۊن دیرتر ز نۊ تفره کۊنی.",
"transaction_not_available": "تراکونش منه دسرس نؽ",
"cpfp_exp": "ایما تراکونش دؽر وورکل اکۊنیم ک تراکونش تاییڌ نوابیڌه ته خرج اکونه. کارمزد کول ز کارمزد تراکونش ٱلسی بیشتر اونه، سی همیمی زۊڌتر استخراج اونه. ای کار ن CPFP—بچه سی ٱقا پرداخت اکونه اگۊن.",
"details_copy_txid": "لف گیری شناسه تراکونش",
"details_view_in_browser": "ووینسن من گشت گر",
"incoming_transaction": "تراکونش وۊرۊڌی",
"outgoing_transaction": "تراکونش خروجی",
"enable_offline_signing": "ای کیف پیل وا امزای آفلاین ب کار نری ابۊ. اخۊی ایسا هونه فعال کۊنی؟",
"list_conf": "تاییڌ: {number}",
"eta_10m": "زمووݩ تخمینی: حدود 10 دؽقه دی",
"eta_3h": "زمووݩ تخمینی: حدود 3 ساعت دی",
"eta_1d": "زمووݩ تخمینی: حدود 1 رۊز دی",
"list_title_sent": "فیشناڌه وابیڌه",
"rbf_explain": "ای تراکونش ن وا تراکونش دیر ک کارمزدس بیشتره، جانشین اکۊنیم تا زۊڌتر استخراج بۊ. ای کار ن RBF—جانشینی وا کارمزد اگۊن.",
"transactions_count": "شومار تراکونشا",
"txid": "شناسه تراکونش",
"updating": "ورۊ رسۊوی...",
"watchOnlyWarningTitle": "هشڌار امنیتی",
"watchOnlyWarningDescription": "ز کلاش بازا ک گاهاً ز کیف پیلا «فقط‌خواندنی» سی فریو کاربرا استفاڌه اکونن، باپرها بۊ. ای کیف پیلا ایلیه نڌن دارایی ن وار آور یا فیشنی؛ فقط ایلیه مۉجۊڌی ن ووینی.",
"custom_fee_warning_title": "هشڌار",
"custom_fee_warning_description": "کارمزدا کمتر ز 1 ساتۊشی سی هر بایت مجازی زبالن، اما شاید ب ٱر سامووا گره ها، بازنشر نوابن.",
"details_eta_analyzing": "تئلیل...",
"details_sent": "فیشناڌه وابی",
"details_id": "شناسه",
"details_note": "ویرداشت",
"details_add_note": "ٱووردن",
"details_advanced": "پؽشرفته",
"details_fee_rate": "نرخ کارمزد"
},
"wallets": {
"add_bitcoin": "بیت کوین",
@ -307,10 +410,10 @@
"details_multisig_type": "چند امزایی",
"details_show_xpub": "نشووݩ داڌن XPUB کیف پیل",
"details_show_addresses": "نشووݩ داڌن آدرسا",
"details_title": "کیف پبل",
"details_title": "کیف پیل",
"wallets": "کیف پیلا",
"details_type": "نوع",
"details_use_with_hardware_wallet": "و کار گرؽڌن وابا کیف پیل سخت ٱفزاری",
"details_use_with_hardware_wallet": "و کار گرؽڌن وا کیف پیل سخت ٱفزاری",
"details_yes_delete": "هری پاک کوݩ",
"enter_bip38_password": "رزمن سی رزم گوشایی بزنین",
"export_title": "و در کشیڌن کیف پیل",
@ -345,13 +448,78 @@
"list_title": "کیف پیلا",
"list_tryagain": "ز نۊ تفره کوݩ",
"more_info": "دووسمندیا قلوه",
"details_delete_anyway": "و هر هال پاک بۊ"
"details_delete_anyway": "و هر هال پاک بۊ",
"add_lightning": "لایتنینگ",
"swipe_balance_hide": "بؽڌار",
"details_delete": "پاک کردن",
"add_bitcoin_explain": "کیف پیل بیت کوین ساڌه ۉ پۊر هؽز",
"add_entropy_reset_title": "وورنشۊوی آنتروپی",
"add_entropy_reset_message": "آلشت نوع کیف پیل، آنتروپی الن ن وورنشۊوی اکونه. اخۊی ادامه دی؟",
"add_entropy_bytes": "{bytes} بایت آنتروپی",
"add_entropy_generated": "{gen} بایت آنتروپی وورکل وابیڌه",
"add_entropy_provide": "آنتروپی ن ز ریشت کوݩ تاسا فره کۊن",
"add_entropy_remain": "{gen} بایت آنتروپی وورکل وابیڌه. {rem} بایت ماݩ ز وورکل کوݩ شومارا تسادفی سیستم گرها اونن.",
"add_import_wallet": "و من ٱووردن کیف پیل",
"add_lightning_explain": "سی خرج کردن وا تراکونشا فۊری",
"add_lndhub": "منپیز و LNDhub خوت",
"add_lndhub_error": "نشۊوی گره داڌه وابیڌه، ی گره LNDhub زبال نؽ.",
"add_lndhub_placeholder": "نشۊوی گره ایسا",
"add_placeholder": "کیف پیل ٱوولی مو",
"add_title": "ٱووردن کیف پیل",
"add_wallet_name": "نوم",
"add_wallet_seed_length": "هندا سید",
"add_wallet_seed_length_12": "12 وشه",
"add_wallet_seed_length_24": "24 وشه",
"clipboard_bitcoin": "ی آدرس بیت کوین منه ویرگه ایسا هڌ. اخۊی هونه سی ی تراکونش ب کار بگری؟",
"clipboard_lightning": "ی سۊرت هساو لایتنینگ منه ویرگه ایسا هڌ. اخۊی هونه سی ی تراکونش ب کار بگری؟",
"clear_clipboard_on_import": "پاک کردن ویرگه موقع و من ٱووردن",
"details_advanced": "پؽشرفته",
"details_are_you_sure": "اخۊی موتمعنی؟",
"details_connected_to": "منپیز و",
"details_del_wb_err": "مقدار مۉجۊڌی داڌه وابیڌه وا مۉجۊڌی ای کیف پیل هومخۊوݩ نؽ. تی کۊن ز نۊ تفره کۊنی.",
"details_del_wb_q": "ای کیف پیل مۉجۊڌی داره. پؽش ز ادامه، ویرت بۊ ک بؽ عبارت بازیابی ای کیف پیل، نتری دارایی ن بازیابی کۊنی. سی پؽش گری ز پاک کردن نا خۊسته، تی کۊن مۉجۊڌی کیف پیلت {balance} ساتۊشی ن بزن.",
"swipe_balance_show": "نشۉݩ داڌن",
"drag_to_reorder": "سی ترتیو دی، بکش",
"clear_search": "پاک کردن پیتینیڌن",
"import_explanation": "تی کۊن وشه ها سید، کلید عمومی، WIF، یا هر چی ک داری ن بزن. BlueWallet پوی تلاش خوسه اکونه تا فورمت زبال ن خومه بزنه ۉ کیف پیل ته و من بئره.",
"import_success_watchonly": "کیف پیل ایسا وا مووفقیت و من ٱووڌ. هشڌار: یۊ ی کیف پیل فقط‌خواندنی هڌ، نتری زس فیشنی.",
"import_discovery_offline": "BlueWallet هونی منه هالت آفلاینه. د ای هالت، نتره وجۊد کیف پیل ن تاییڌ کونه، سی همیمی وا دس کیف پیل زبال ن پسند کۊنی",
"import_derivation_subtitle": "تور موشتق وابیڌن دلخای خوته بزن، ایما تلاش اکۊنیم کیف پیل ته پؽڌا کۊنیم.",
"import_wrong_path": "تور موشتق وابیڌن زبال نؽ",
"list_create_a_wallet_text": "ٱزاده، تری هر گد ک اخۊی\nوورکل کۊنی.",
"list_empty_txs1": "تراکونشا ایسا ای جا اوینسن.",
"list_empty_txs1_lightning": "کیف پیل لایتنینگ وا تراکونشا رۊزانه ایسا ب کار رئڌه ابۊ. کارمزدا ب توور بؽ انسافی ارزۊن ۉ پؽڌنی زل هڌ.",
"list_empty_txs2_lightning": "\nسی شۊرۊ ب کار گرهڌن، ری دؽوۉداری دارایی بزن ۉ مۉجۊڌی ته پور کۊن.",
"no_ln_wallet_error": "پؽش ز پرداخت ی سۊرت هساو لایتنینگ، ٱول وا ی کیف پیل لایتنینگ ازاف کۊنی.",
"looks_like_bip38": "یۊ ی کلید خصوصی موسامینیڌه وا رزم (BIP38) ب نظر اونه.",
"manage_title": "مدیریت کیف پیلا",
"no_results_found": "هیچ ناتجه ای پؽڌا نوابی.",
"please_continue_scanning": "تی کۊن ب اسکن کردن ادامه دی.",
"select_no_bitcoin": "هونی هیچ کیف پیل بیت کوین منه دسرس نؽ.",
"select_no_bitcoin_exp": "سی پور کردن کیف پیلا لایتنینگ، ی کیف پیل بیت کوین لازمه. تی کۊن یتی ن وورکل یا و من بئر.",
"select_wallet": "پسند کیف پیل",
"pull_to_refresh": "بکش سی وانۊ کردن",
"warning_do_not_disclose": "دؽوسمندی پاوین ن هیچ گد ب اشتراک نگرا",
"scan_import": "ای QR کود ن اسکن کۊنی تا کیف پیل ته و ی برنامه دؽ و من بئری.",
"write_down_header": "ی نوسخه لادرار دسی وورکل کۊنی",
"write_down": "ای وشه ها ن بنویس ۉ امن نگه دار. هونا ن سی بازیابی کیف پیلت دیرتر ب کار بگر.",
"wallet_type_this": "نوع ای کیف پیل {type} هڌ.",
"share_number": "یک رسۊوی {number}",
"copy_ln_url": "ای نشۊوی ن لف گیری ۉ امن نگه دار تا دیرتر کیف پیل ته بازیابی کۊنی.",
"copy_ln_public": "ای دؽوسمندی ن لف گیری ۉ امن نگه دار تا دیرتر کیف پیل ته بازیابی کۊنی.",
"add_ln_wallet_first": "ٱول وا ی کیف پیل لایتنینگ ازاف کۊنی.",
"identity_pubkey": "کلید عمومی هۊویت",
"xpub_title": "xpub کیف پیل",
"manage_wallets_search_placeholder": "پیتینیڌن کیف پیلا، آدرسا، تراکونشا ۉ ویرداشتا",
"details_delete_wallet_error_message": "موشکلؽ منه تاییڌ پاک وابیڌن ای کیف پیل ز وارسۊویا پؽش ٱووڌ — یۊ شاید ز موشکل شبکه یا منپیز زبال نکوݩ بۊ. ٱر ادامه دی، شاید هنی سی تراکونشا پۊشمت وا ای کیف پیل وارسۊوی گری، حتا پس ز پاک وابیڌنس."
},
"total_balance_view": {
"display_in_bitcoin": "نشووݩ داڌن من بیت کوین",
"hide": "بؽڌار",
"display_in_sats": "نشووݩ داڌن و ری ساتۊشی",
"title": "پوی مۉجۊدی"
"display_in_fiat": "نشووݩ داڌن من {currency}",
"title": "پوی مۉجۊدی",
"explanation": "پوی مۉجۊڌی کیف پیلا خوته من بلگه نمای کلی ووین."
},
"multisig": {
"confirm": "تاییڌ",
@ -359,13 +527,178 @@
"share": "یک رسۊوی...",
"create": "وورکل",
"co_sign_transaction": "امزا کردن تراکونش",
"ms_help_title5": "هالت پؽش رئڌه"
"ms_help_title5": "هالت پؽش رئڌه",
"multisig_vault": "گاوصندوق چند امزایی",
"default_label": "گاوصندوق چند امزایی",
"provide_signature": "دین امزا",
"vault_key": "کیلیت گاوصندوق {number}",
"fee": "کارمزد: {number}",
"fee_btc": "{number} BTC",
"quorum": "{m} ز {n} حد نصاب",
"quorum_header": "حد نصاب",
"of": "ز",
"wallet_type": "نوع کیف پیل",
"vault_advanced_customize": "سامووا گاوصندوق",
"multisig_vault_explain": "بؽڌرین امنیت سی مقدارا گت",
"provide_signature_details": "ز دسگا ۉ کیف پیل خوت ک کلید ٱنا هڌ سی امزا ای تراکونش استفاڌه کۊنی",
"provide_signature_details_bluewallet": "د BlueWallet، و بلگه فشناڌن ر ۉ ز فهرست، یۊ ن پسند کۊن: ",
"provide_signature_next_steps": "اسکن یا و من ٱووردن تراکونش امزا وابیڌه",
"provide_signature_next_steps_details": "ٱر کیف پیلت تراکونش ن وا مووفقیت امزا کرد، QR کود داڌه وابیڌه ن اسکن کۊن یا فایل هومرا ن و من بئر، ۉ بعد پوی جۊزیات تراکونش ن پؽش ز انتشار وارسی کۊن.",
"required_keys_out_of_total": "کلیدا لازم ز کول",
"view": "ووینسن",
"shared_key_detected": "امزا کوݩ هومبهر یک رسۊوی وابیڌه",
"shared_key_detected_question": "ی امزا کوݩ هومبهر وا ایسا یک رسۊوی وابیڌه، اخۊی هونه و من بئری؟",
"manage_keys": "مدیریت کلیدا",
"how_many_signatures_can_bluewallet_make": "BlueWallet چن گد امزا تره بکونه",
"signatures_required_to_spend": "امزا یل لازم {number}",
"signatures_we_can_make": "تره {number} ن بکونه",
"scan_or_import_file": "اسکن یا و من ٱووردن فایل",
"export_coordination_setup": "و در کردن سامووا هومٱئنگی",
"cosign_this_transaction": "ای تراکونش ن هومرا امزا کۊنی؟",
"lets_start": "بیا شۊرۊ کۊنیم",
"native_segwit_title": "بؽڌرین کاره",
"wrapped_segwit_title": "بؽڌرین هومخۊوݩ کاری",
"legacy_title": "قدیمی",
"what_is_vault": "گاوصندوق ی",
"what_is_vault_numberOfWallets": " چن امزایی {m} ز {n} ",
"what_is_vault_wallet": "کیف پیل هڌ.",
"needs": "هون اخا",
"what_is_vault_description_number_of_vault_keys": " {m} کلید گاوصندوق ",
"what_is_vault_description_to_spend": "سی خرج کردن ۉ یۊ سؽومی ک \nتری سی نوسخه لادرار ب کار بگری.",
"what_is_vault_description_to_spend_other": "سی خرج کردن.",
"invalid_mnemonics": "ای عبارت بازیابی زبال ب نظر نونه.",
"invalid_cosigner": "داڌه امزا کوݩ هومبهر زبال نؽ",
"not_a_multisignature_xpub": "یۊ xpub ز ی کیف پیل چند امزایی نؽ!",
"invalid_cosigner_format": "امزا کوݩ هومبهر زبال نؽ: یۊ امزا کوݩ هومبهر سی فورمت {format} نؽ.",
"create_new_key": "وورکل نۊ",
"scan_or_open_file": "اسکن یا گۊشیڌن فایل",
"i_have_mnemonics": "مو سید سی ای کلید داروم.",
"type_your_mnemonics": "ی سید بزن سی و من ٱووردن کلید گاوصندوق الن.",
"this_is_cosigners_xpub": "یۊ xpub امزا کوݩ هومبهر هڌ—ٱماڌه سی و من ٱووردن من ی کیف پیل دؽ. یک رسۊویس امنه.",
"this_is_cosigners_xpub_airdrop": "ٱر ز AirDrop یک رسۊوی کۊنی، گرنده ها وا منه بلگه هومٱئنگی بۊن.",
"wallet_key_created": "کلید گاوصندوق ایسا وورکل وابی. ی دیقه ویرگار بنا تا سید عبارت بازیابی ته امن نوسخه لادرار بگری.",
"are_you_sure_seed_will_be_lost": "اخۊی موتمعنی؟ ٱر نوسخه لادرار نڌاری، سید عبارت بازیابی ته گوم اونه.",
"forget_this_seed": "ای سید ن ز ویر بئر ۉ ز xpub و جاس استفاڌه کو.",
"view_edit_cosigners": "ووینسن/ویرٱست امزا کوݩ هومبهر",
"this_cosigner_is_already_imported": "ای امزا کوݩ هومبهر ز پؽش و من ٱووڌه.",
"export_signed_psbt": "و در کردن PSBT امزا وابیڌه",
"input_fp": "جا کلک ن بزن",
"input_fp_explain": "سی استفاڌه ز پؽش فرز (00000000) ز ای کار بئر",
"input_path": "ٱووردن تور موشتق وابیڌن",
"input_path_explain": "سی استفاڌه ز پؽش فرز ({default}) ز ای کار بئر",
"ms_help": "هؽاری",
"ms_help_title": "گاوصندوقا چن امزایی چی جور کار اکونن: نکات ۉ ترفندا",
"ms_help_text": "ی کیف پیل وا چن کلید، سی امنیت بیشتر یا دؽوۉداری اشتراکی",
"ms_help_title1": "استفاڌه ز چن دسگا پؽشنهاڌ اونه.",
"ms_help_1": "گاوصندوق وا برنامه ها دؽر BlueWallet ۉ کیف پیلا هومخۊوݩ وا PSBT چی Electrum، Specter، Coldcard، Cobo Vault ۉ غیره کار اکونه.",
"ms_help_title2": "ویرٱست کلیدا",
"ms_help_2": "تری پوی کلیدا گاوصندوق ن ری ای دسگا وورکل کۊنی ۉ دیرتر هونا ن پاک یا ویرٱست کۊنی. ناهاڌن پوی کلیدا ری ی دسگا، هومراز ی کیف پیل بیت کوین مئمۊلی امنه.",
"ms_help_title3": "نوسخه لادرارا گاوصندوق",
"ms_help_3": "منه گیزینه ها کیف پیل، نوسخه لادرار گاوصندوق ۉ نوسخه لادرار فقط‌خواندنی ته پؽڌا اکۊنی. ای نوسخه لادرار چی ی نخشه ز کیف پیلته. هون سی بازیابی کیف پیل ٱر یتی ز سیدا ته گوم کۊنی ضروریه.",
"ms_help_title4": "و من ٱووردن گاوصندوقا",
"ms_help_4": "سی و من ٱووردن چن امزایی، ز فایل نوسخه لادرار خوت ۉ ویژگی و من ٱووردن استفاڌه کۊن. ٱر فقط سیدا ۉ xpub داری، تری ز دگمه و من ٱووردن جودا موقع وورکل کلیدا گاوصندوق استفاڌه کۊنی.",
"ms_help_5": "ب توور پؽش فرز، BlueWallet ی گاوصندوق 2 ز 3 وورکل اکونه. سی وورکل ی حد نصاب دیر یا آلشت نوع آدرس، هالت پؽشرفته ن منه سامووا فعال کۊن."
},
"cc": {
"sort_status": "وزیت"
"sort_status": "وزیت",
"change": "آلشتکاری",
"header": "مدیریت UTXO",
"selected_summ": "{value} پسند بیڌه",
"sort_label": "برچسب",
"coins_selected": "کوینا پسند بیڌه ({number})",
"empty": "ای کیف پیل هونی هیچ کوینی نڌاره.",
"freeze": "مسدۊد کردن",
"freezeLabel": "مسدۊد کردن",
"freezeLabel_un": "گۊشیڌن مسدۊدی",
"use_coin": "استفاڌه ز کوین",
"use_coins": "استفاڌه ز کوینا",
"tip": "ای ویژگی ایلیه کوینا ته سی مدیریت بؽڌر کیف پیلت ووینی، برچسب بنی، مسدۊد کۊنی یا پسند کۊنی. تری وا زیڌن ری دایره ها رنگی، چن کوین ن پسند کۊنی.",
"sort_asc": "ز کم و بیشتر",
"sort_desc": "ز بیشتر و کم",
"sort_height": "بلندی",
"sort_value": "ارزش",
"sort_by": "ترتیو ری ٱر"
},
"addresses": {
"sign_placeholder_address": "آدرس",
"type_receive": "گرؽڌن"
"type_receive": "گرؽڌن",
"type_change": "آلشتکاری",
"addresses_title": "آدرسا",
"transactions": "تراکونشا",
"copy_private_key": "لف گیری کلید خصوصی",
"sensitive_private_key": "هشڌار: کلیدا خصوصی قلوه هساسن. ادامه دی؟",
"sign_title": "امزا/وارسی پیوم",
"sign_help": "ای جا تری ی امزای رزمی ن ری مووا ی آدرس بیت کوین وورکل یا وارسی کۊنی.",
"sign_sign": "امزا",
"sign_verify": "وارسی",
"sign_signature_correct": "وارسی وا مووفقیت ٱنجوم وابی!",
"sign_signature_incorrect": "وارسی ناکام بی!",
"sign_placeholder_message": "پیوم",
"sign_placeholder_signature": "امزا",
"type_used": "ب کار رئڌه وابی"
},
"units": {
"BTC": "BTC",
"sat_vbyte": "ساتۊشی سی هر بایت مجازی",
"sats": "ساتۊشی",
"MAX": "بیشترین"
},
"bip47": {
"payment_code": "کود پرداخت",
"contacts": "هومدنگا",
"bip47_explain_subtitle": "BIP47",
"copy_payment_code": "لف گیری کود پرداخت",
"add_contact": "ٱووردن هومدنگ",
"invalid_pc": "کود پرداخت زبال نؽ",
"not_found": "کود پرداخت نجۊرست",
"bip47_explain": "کود قابل استفاڌه دۊوار ۉ یک رسۊوی",
"purpose": "کود قابل استفاڌه دۊوار ۉ یک رسۊوی (BIP47)",
"pay_this_contact": "پرداخت و ای هومدنگ",
"rename_contact": "آلشت نوم هومدنگ",
"hide_contact": "بؽڌار کردن هومدنگ",
"rename": "آلشت نوم",
"provide_name": "نوم نۊ سی ای هومدنگ بزن",
"provide_payment_code": "کود پرداخت ن بزن",
"notification_tx_unconfirmed": "تراکونش وارسۊوی هنی تاییڌ نوابیڌه، تی کۊن مندیر بۊ",
"failed_create_notif_tx": "وورکل کردن تراکونش آنچین ناکام بی",
"onchain_tx_needed": "تراکونش آنچین لازمه",
"notif_tx_sent": "تراکونش وارسۊوی فیشناڌه وابی. تی کۊن مندیر بۊ تا تاییڌ بۊ",
"notif_tx": "تراکونش وارسۊوی"
},
"notifications": {
"would_you_like_to_receive_notifications": "اخۊی موقع گرؽڌن پرداختا وۊرۊڌی، وارسۊوی گری؟",
"notifications_subtitle": "پرداختا وۊرۊڌی ۉ تاییڌ تراکونشا",
"no_and_dont_ask": "ن، ز نۊ نی پرس.",
"permission_denied_message": "ایسا موجوز فشناڌن وارسۊویا ن قبۊل نکردیه. ٱر اخۊی وارسۊویا گری، تی کۊن هونا ن منه سامووا دسگا ته فعال کۊنی."
},
"is_it_my_address": {
"title": "آدرس مونه؟",
"owns": "{label} {address} ن داره",
"enter_address": "آدرس ن بزن",
"check_address": "وارسی آدرس",
"no_wallet_owns_address": "هیچ یتی ز کیف پیلا منه دسرس، آدرس داڌه وابیڌه ن نڌاره.",
"view_qrcode": "ووینسن QR کود"
},
"autofill_word": {
"title": "وشه ٱخر سید",
"enter": "عبارت بازیابی ناقس ته بزن",
"generate_word": "وورکل وشه ٱخر",
"error": "وۊرۊڌی ی عبارت بازیابی ناقس 11 یا 23 وشه ای نؽ. تی کۊن ز نۊ تفره کۊنی."
},
"lnurl_auth": {
"register_question_part_1": "اخۊی ی هساو ای جا نوم نویسی کۊنی",
"register_question_part_2": "وا استفاڌه ز کیف پیل لایتنینگ خوت؟",
"register_answer": "ایسا وا مووفقیت ی هساو من {hostname} نوم نویسی کردیه!",
"login_question_part_1": "اخۊی ای جا وۊرۊڌ بۊوی",
"login_question_part_2": "وا استفاڌه ز کیف پیل لایتنینگ خوت؟",
"login_answer": "ایسا وا مووفقیت من {hostname} وۊرۊڌ وابیه!",
"link_question_part_1": "اخۊی هساو خوته ای جا پیوست کۊنی",
"link_question_part_2": "و کیف پیل لایتنینگ خوت؟",
"link_answer": "کیف پیل لایتنینگ ایسا وا مووفقیت و هساو ایسا من {hostname} پیوست وابی!",
"auth_question_part_1": "اخۊی ای جا هۊویت ته تاییڌ کۊنی",
"auth_question_part_2": "وا استفاڌه ز کیف پیل لایتنینگ خوت؟",
"auth_answer": "ایسا وا مووفقیت من {hostname} هۊویت ته تاییڌ کردیه!",
"could_not_auth": "ایما نترسیم هۊویت ایسا ن من {hostname} تاییڌ کۊنیم.",
"authenticate": "تاییڌ هۊویت"
}
}

View File

@ -4,37 +4,48 @@
"cancel": "Cancel·lar",
"continue": "Continuar",
"clipboard": "Porta-retalls",
"copied": "Copiat!",
"discard_changes": "Descartar els canvis?",
"discard_changes_explain": "Teniu canvis sense desar. Esteu segur que voleu descartar-los i sortir de la pantalla?",
"enter_password": "Introduïu la contrasenya",
"never": "mai",
"of": "{number} de {total}",
"ok": "OK",
"enter_url": "Entrar URL",
"storage_is_encrypted": "L'informació està xifrada. Es requereix la contrasenya per a desxifrar-la.",
"yes": "Si",
"storage_is_encrypted": "La informació està xifrada. Es requereix la contrasenya per a desxifrar-la.",
"yes": "Sí",
"no": "No",
"save": "Desar...",
"seed": "Llavor",
"success": "Èxit",
"wallet_key": "Clau del moneder",
"close": "Tancar",
"change_input_currency": "Canviar moneda d'entrada",
"refresh": "Refresca",
"pick_image": "Triar de la biblioteca",
"pick_file": "Triar arxiu",
"enter_amount": "Introdueix la quantitat",
"qr_custom_input_button": "Toqueu 10 vegades per introduir una entrada personalitzada"
"qr_custom_input_button": "Toqueu 10 vegades per introduir una entrada personalitzada",
"unlock": "Desbloquejar",
"port": "Port",
"ssl_port": "Port SSL",
"suggested": "Suggerit"
},
"azteco": {
"codeIs": "El codi del teu val és",
"errorBeforeRefeem": "Abans de canviar, primer heu dafegir un moneder de Bitcoin.",
"errorSomething": "Quelcom ha anat malament. Aquest val continua sent vàlid? ",
"errorSomething": "Quelcom ha anat malament. Aquest val continua sent vàlid?",
"redeem": "Canviar al moneder",
"redeemButton": "Canviar",
"success": "Completat",
"title": "Canviar cupó de Azte.co"
"successMessage": "Val bescanviat correctament! Els vostres fons haurien d'arribar al vostre moneder de Bitcoin en breu.",
"title": "Canviar cupó d'Azte.co"
},
"entropy": {
"save": "Desar",
"title": "Entropia",
"undo": "Desfer"
"undo": "Desfer",
"amountOfEntropy": "{bits} de {limit} bits"
},
"errors": {
"broadcast": "La transmissió ha fallat",
@ -42,12 +53,15 @@
"network": "Error de xarxa"
},
"lnd": {
"errorInvoiceExpired": "Factura caducada.",
"expired": "Caducat",
"expiresIn": "Caduca en {time} minuts",
"payButton": "Pagar",
"payment": "Pagament",
"placeholder": "Factura o adreça",
"potentialFee": "Comissió potencial: {fee}",
"refill": "Recarregar",
"refill_create": "Per a continuar, creeu un moneder de Bitcoin amb el qual recarregar.",
"refill_external": "Recarregar amb un moneder extern",
"refill_lnd_balance": "Recarregar el balanç del moneder Lightning",
"sameWalletAsInvoiceError": "No pots pagar una factura amb el mateix moneder que l'ha creat.",
@ -59,20 +73,26 @@
"lightning_invoice": "Factura Lightning",
"please_pay_between_and": "Si us plau, pagui entre {min} i {max}",
"please_pay": "Si us plau, pagui",
"preimage": "Preimatge",
"sats": "sats",
"date_time": "Data i hora",
"wasnt_paid_and_expired": "Aquesta factura no ha estat pagada i ha caducat"
},
"plausibledeniability": {
"create_fake_storage": "Crear informació xifrada falsa",
"create_password_explanation": "La contrasenya no pot ser la mateixa que la del seu moneder principal.",
"help": "Sota certes circumstàncies, vostè podria ser obligat a revelar la contrasenya del seu moneder. Per a mantenir les seves monedes segures, BlueWallet pot crear un altre moneder xifrat, amb una altra contrasenya. Si es veu obligat, pot revelar la contrasenya per al fals moneder a un tercer de manera que ells creuran que és el seu moneder principal",
"help2": "El moneder \"false\" és completament funcional. Pot dipositar una quantitat mínima perquè sigui més creïble.",
"help": "Sota certes circumstàncies, vostè podria ser obligat a revelar la contrasenya del seu moneder. Per a mantenir les seves monedes segures, BlueWallet pot crear un altre moneder xifrat, amb una altra contrasenya. Si es veu obligat, pot revelar la contrasenya per al fals moneder a un tercer de manera que ells creuran que és el seu moneder principal.",
"help2": "El moneder \"fals\" és completament funcional. Pot dipositar una quantitat mínima perquè sigui més creïble.",
"password_should_not_match": "La contrasenya no pot ser la mateixa que la del seu moneder principal.",
"title": "Negació plausible"
},
"pleasebackup": {
"ask": "Heu desat la frase de recuperació del vostre moneder? Aquesta frase de recuperació és necessària per accedir als vostres fons en cas que perdeu aquest dispositiu. Sense la frase de recuperació, els vostres fons es perdran permanentment.",
"ask_no": "No, encara no.",
"ask_yes": "Sí, ja ho he fet.",
"ok": "D'acord, ho he apuntat.",
"ok_lnd": "D'acord, l'he guardat",
"text": "Si us plau, dediqueu un moment a apuntar aquesta frase mnemònica en un paper.\nÉs la vostra còpia de seguretat i la podeu utilitzar per recuperar el moneder.",
"text_lnd": "Si us plau, deseu aquesta còpia de seguretat del moneder. Permet restaurar el moneder en cas de pèrdua.",
"title": "El teu moneder ha estat creat..."
},
@ -80,9 +100,19 @@
"details_create": "Crear",
"details_label": "Descripció",
"details_setAmount": "Rebre quantitat",
"header": "Rebre"
"details_share": "Compartir...",
"address_not_found": "No s'ha pogut generar l'adreça de recepció.",
"header": "Rebre",
"reset": "Restablir",
"maxSats": "La quantitat màxima és {max} sats",
"maxSatsFull": "La quantitat màxima és {max} sats o {currency}",
"minSats": "La quantitat mínima és {min} sats",
"minSatsFull": "La quantitat mínima és {min} sats o {currency}",
"qrcode_for_the_address": "Codi QR per a l'adreça",
"bip47_explanation": "Els codis de pagament són una adreça universal que evita revelar les adreces del vostre moneder. No tots els serveis els admeten."
},
"send": {
"provided_address_is_invoice": "Aquesta adreça sembla ser per a una factura Lightning. Si us plau, aneu al vostre moneder Lightning per realitzar un pagament d'aquesta factura.",
"broadcastButton": "Enviar",
"broadcastError": "Error",
"broadcastNone": "Inserir la transacció Hex",
@ -97,27 +127,41 @@
"create_fee": "Comissió",
"create_memo": "Comentari",
"create_satoshi_per_vbyte": "Satoshis per vByte",
"create_this_is_hex": "Això és la representació en hexadecimal (hex) de la transacció, firmada i llesta per ser enviada a la xarxa. ¿Continuar?",
"create_this_is_hex": "Això és la representació en hexadecimal (hex) de la transacció, signada i llesta per ser enviada a la xarxa. Continuar?",
"create_to": "A",
"create_tx_size": "Mida de TX",
"create_verify": "Verificar a coinb.in",
"details_insert_contact": "Inserir contacte",
"details_add_rec_add": "Afegir receptor",
"details_add_rec_rem": "Eliminar receptor",
"details_add_recc_rem_all_alert_description": "Esteu segur que voleu eliminar tots els destinataris?",
"details_add_rec_rem_all": "Eliminar tots els destinataris",
"details_recipients_title": "Destinataris",
"details_recipient_title": "Destinatari núm. {number} de núm. {total}",
"please_complete_recipient_title": "Destinatari incomplet",
"please_complete_recipient_details": "Si us plau, completeu les dades del destinatari núm. {number} abans d'afegir-ne un de nou.",
"details_address": "Adreça",
"details_address_field_is_not_valid": "Adreça invalida",
"details_address_field_is_not_valid": "Adreça no vàlida",
"details_adv_fee_bump": "Permeteu ampliar la comissió",
"details_adv_full": "Utilitzeu tot el saldo",
"details_adv_full_sure": "Esteu segur que voleu utilitzar el saldo complet del moneder per a aquesta transacció?",
"details_adv_full_sure_frozen": "Esteu segur que voleu utilitzar el saldo complet del moneder per a aquesta transacció? Tingueu en compte que les monedes congelades queden excloses.",
"details_adv_import": "Importar transacció",
"details_adv_import_qr": "Importar transacció (QR)",
"details_amount_field_is_not_valid": "Quantitat invalida",
"details_amount_field_is_not_valid": "Quantitat no vàlida",
"details_amount_field_is_less_than_minimum_amount_sat": "La quantitat especificada és massa petita. Introduïu una quantitat superior a 500 sats.",
"details_create": "Crear",
"details_fee_field_is_not_valid": "Comissió invalida",
"details_error_decode": "No s'ha pogut descodificar l'adreça de Bitcoin",
"details_fee_field_is_not_valid": "Comissió no vàlida",
"details_frozen": "{amount} BTC està congelat.",
"details_next": "Següent",
"details_no_signed_tx": "El fitxer seleccionat no conté una transacció que es pugui importar.",
"details_note_placeholder": "comentari (útil per tu)",
"details_scan": "Escanejar",
"details_scan_hint": "Toqueu dues vegades per escanejar o importar una destinació",
"details_scan_error": "Error d'escaneig",
"details_total_exceeds_balance": "La quantitat excedeix el balanç disponible.",
"details_total_exceeds_balance_frozen": "La quantitat a enviar excedeix el saldo disponible. Tingueu en compte que les monedes congelades queden excloses.",
"details_unrecognized_file_format": "Format de fitxer no reconegut",
"details_wallet_before_tx": "Abans de crear una transacció, primer heu dafegir un moneder Bitcoin.",
"dynamic_init": "Inicialitzant",
@ -129,8 +173,10 @@
"fee_1d": "1d",
"fee_3h": "3h",
"fee_custom": "Personalitzada",
"insert_custom_fee": "Inserir comissió",
"fee_fast": "Ràpid",
"fee_medium": "Mitjà",
"fee_replace_minvb": "La taxa total de comissió (satoshi per vByte) que voleu pagar hauria de ser superior a {min} sat/vByte.",
"fee_satvbyte": "en sat/vByte",
"fee_slow": "Lent",
"header": "enviar",
@ -140,113 +186,307 @@
"input_total": "Total:",
"permission_camera_message": "Necessitem el vostre permís per usar la vostra càmera.",
"psbt_sign": "Signar una transacció",
"invalid_psbt": "PSBT no vàlid.",
"open_settings": "Obre configuració",
"permission_storage_denied_message": "BlueWallet no pot desar aquest fitxer. Si us plau, obriu la configuració del dispositiu i activeu el permís d'emmagatzematge.",
"permission_storage_title": "Permís d'accés a emmagatzematge",
"psbt_clipboard": "Copiar al portapapers",
"psbt_this_is_psbt": "Aquesta és una transacció de Bitcoin parcialment signada (PSBT). Si us plau, acabeu de signar-la amb el vostre moneder de maquinari.",
"psbt_tx_export": "Exportar a arxiu",
"no_tx_signing_in_progress": "No hi ha cap signatura de transacció en curs.",
"outdated_rate": "La cotització es va actualitzar per última vegada: {date}",
"psbt_tx_open": "Obrir transacció signada",
"psbt_tx_scan": "Escanejar transacció signada",
"qr_error_no_qrcode": "No hem pogut trobar un codi QR vàlid a la imatge seleccionada. Assegureu-vos que la imatge només conté un codi QR i no conté contingut addicional com text o botons.",
"reset_amount": "Restablir quantitat",
"reset_amount_confirm": "Voleu restablir la quantitat?",
"success_done": "Fet",
"txSaved": "El fitxer de la transacció ({filePath}) s'ha desat.",
"file_saved_at_path": "El fitxer ({filePath}) s'ha desat.",
"cant_send_to_silentpayment_adress": "Aquest moneder no pot enviar a adreces SilentPayment",
"cant_send_to_bip47": "Aquest moneder no pot enviar a codis de pagament BIP47",
"cant_find_bip47_notification": "Afegiu primer aquest codi de pagament als contactes",
"problem_with_psbt": "Problema amb PSBT"
},
"settings": {
"about": "Sobre nosaltres",
"about_awesome": "Construït amb l'increïble",
"about_backup": "Feu sempre còpies de seguretat de les vostres claus!",
"about_free": "BlueWallet és un projecte gratuït i de codi obert. Creat per usuaris de Bitcoin.",
"about_license": "Llicència MIT",
"about_release_notes": "Notes de la versió",
"about_review": "Deixa'ns una ressenya",
"performance_score": "Puntuació de rendiment: {num}",
"run_performance_test": "Provar rendiment",
"about_selftest": "Executa l'autotest",
"block_explorer_invalid_custom_url": "L'URL proporcionat no és vàlid. Si us plau, introduïu un URL vàlid que comenci per http:// o https://.",
"about_selftest_electrum_disabled": "L'autotest no està disponible amb el mode fora de línia d'Electrum. Si us plau, desactiveu el mode fora de línia i torneu-ho a provar.",
"about_selftest_ok": "Totes les proves internes s'han superat correctament. El moneder funciona bé.",
"about_sm_github": "GitHub",
"about_sm_telegram": "Canal de Telegram",
"privacy_temporary_screenshots": "Permetre captures de pantalla",
"privacy_temporary_screenshots_instructions": "La protecció contra captures de pantalla es desactivarà temporalment, permetent captures i enregistraments de pantalla. La protecció es reactivarà automàticament quan tanqueu i torneu a obrir BlueWallet.",
"biometrics": "Biometria",
"biometrics_no_longer_available": "La configuració del dispositiu ha canviat i ja no coincideix amb la configuració de seguretat seleccionada a l'aplicació. Si us plau, torneu a activar la biometria o el codi d'accés, i després reinicieu l'aplicació per aplicar aquests canvis.",
"biom_10times": "Heu intentat introduir la contrasenya 10 vegades. Voleu restablir l'emmagatzematge? Això eliminarà tots els moneders i desxifrarà l'emmagatzematge.",
"biom_conf_identity": "Si us plau, confirmeu la vostra identitat.",
"biom_no_passcode": "El vostre dispositiu no té cap codi d'accés ni biometria activats. Per a continuar, configureu un codi d'accés o biometria a l'aplicació Configuració.",
"biom_remove_decrypt": "Tots els vostres moneders s'eliminaran i el vostre emmagatzematge es desxifrarà. Esteu segur que voleu continuar?",
"currency": "Moneda",
"electrum_connected": "Conectat",
"electrum_connected_not": "No conectat",
"currency_source": "La cotització s'obté de",
"currency_fetch_error": "S'ha produït un error en obtenir la cotització per a la moneda seleccionada.",
"default_title": "En obrir",
"donate": "Donar",
"donate_description": "Ajudeu-nos a mantenir Blue gratuït!",
"electrum_connected": "Connectat",
"electrum_connected_not": "No connectat",
"electrum_error_connect": "No es pot connectar al servidor Electrum proporcionat",
"electrum_error_connect_tor": "No es pot connectar al servidor Electrum proporcionat. Si us plau, assegureu-vos que l'aplicació Orbot està connectada i torneu-ho a provar.",
"lndhub_uri": "P. ex., {example}",
"electrum_host": "P. ex., {example}",
"electrum_offline_mode": "Mode fora de línia",
"electrum_offline_description": "Quan està activat, els vostres moneders de Bitcoin no intentaran obtenir saldos ni transaccions.",
"electrum_port": "Port, normalment {example}",
"use_ssl": "Utilitza SSL",
"electrum_saved": "Els vostres canvis s'han desat correctament. Pot ser necessari reiniciar BlueWallet perquè els canvis tinguin efecte.",
"set_electrum_server_as_default": "Establir {server} com a servidor Electrum predeterminat?",
"set_lndhub_as_default": "Establir {url} com a servidor LNDhub predeterminat?",
"electrum_settings_server": "Servidor Electrum",
"electrum_status": "estat",
"electrum_preferred_server": "Servidor preferit",
"electrum_preferred_server_description": "Introduïu el servidor que voleu que el vostre moneder utilitzi per a totes les activitats de Bitcoin. Un cop establert, el vostre moneder utilitzarà exclusivament aquest servidor per consultar saldos, enviar transaccions i obtenir dades de la xarxa. Assegureu-vos que confieu en aquest servidor abans de configurar-lo.",
"electrum_unable_to_connect": "No es pot connectar a {server}.",
"electrum_history": "Historial",
"electrum_reset_to_default": "Això permetrà que BlueWallet triï aleatòriament un servidor de la llista de servidors.",
"electrum_reset": "Restableix la configuració predeterminada",
"electrum_reset_to_default_and_clear_history": "Restablir als valors predeterminats i esborrar l'historial",
"encrypt_decrypt": "Desxifrar emmagatzematge",
"encrypt_decrypt_q": "Esteu segur que voleu desxifrar el vostre emmagatzematge? Això permetrà accedir als vostres moneders sense contrasenya.",
"encrypt_enc_and_pass": "Protegit amb contrasenya",
"encrypt_storage_explanation_headline": "Activar el xifratge de l'emmagatzematge",
"encrypt_storage_explanation_description_line1": "Activar el xifratge de l'emmagatzematge afegeix una capa extra de protecció a la vostra aplicació, assegurant la manera com les vostres dades es guarden al dispositiu. Això fa més difícil que ningú accedeixi a la vostra informació sense permís.",
"encrypt_storage_explanation_description_line2": "Tanmateix, és important saber que aquest xifratge només protegeix l'accés als moneders emmagatzemats al clauer del dispositiu. No posa cap contrasenya ni protecció addicional als moneders mateixos.",
"i_understand": "Ho entenc",
"block_explorer": "Explorador de blocs",
"block_explorer_preferred": "Utilitzar l'explorador de blocs preferit",
"block_explorer_error_saving_custom": "Error en desar l'explorador de blocs preferit",
"encrypt_title": "Seguretat",
"encrypt_tstorage": "Emmagatzematge",
"encrypt_use": "Utilitza {type}",
"set_as_preferred": "Establir com a preferit",
"set_as_preferred_electrum": "Establir {host}:{port} com a servidor preferit desactivarà la connexió aleatòria a un servidor suggerit.",
"encrypted_feature_disabled": "Aquesta funcionalitat no es pot utilitzar amb el xifratge de l'emmagatzematge activat.",
"encrypt_use_expl": "{type} s'utilitzarà per confirmar la vostra identitat abans de fer una transacció, desbloquejar, exportar o eliminar un moneder.",
"biometrics_fail": "Si {type} no està activat o falla en desbloquejar, podeu utilitzar el codi d'accés del dispositiu com a alternativa.",
"general": "General",
"general_continuity": "Continuïtat",
"general_continuity_e": "Quan està activat, podreu visualitzar moneders i transaccions seleccionats mitjançant els vostres altres dispositius Apple connectats amb iCloud.",
"groundcontrol_explanation": "GroundControl és un servidor de notificacions push gratuït i de codi obert per a moneders de Bitcoin. Podeu instal·lar el vostre propi servidor GroundControl i posar-ne l'URL aquí per no dependre de la infraestructura de BlueWallet. Deixeu-ho en blanc per utilitzar el servidor predeterminat de GroundControl.",
"header": "Configuració",
"language": "Idioma",
"last_updated": "Última actualització",
"language_isRTL": "Cal reiniciar BlueWallet perquè l'orientació de l'idioma tingui efecte.",
"license": "Llicència",
"lightning_error_lndhub_uri": "URI de LNDhub no vàlid",
"lightning_error_lndhub_uri_tor": "URI de LNDhub no vàlid. Si us plau, assegureu-vos que l'aplicació Orbot està connectada i torneu-ho a provar.",
"lightning_saved": "Els vostres canvis s'han desat correctament.",
"lightning_settings": "Configuració Lightning",
"lightning_settings_explain": "Per connectar-vos al vostre propi node LND, si us plau instal·leu LNDhub i poseu-ne l'URL aquí a la configuració. Tingueu en compte que només els moneders creats després de desar els canvis es connectaran al LNDhub especificat.",
"lndhub_github": "Repositori de GitHub",
"network": "Xarxa",
"network_broadcast": "Transmetre transacció",
"network_electrum": "Servidor Electrum",
"electrum_suggested_description": "Quan no s'estableix cap servidor preferit, se seleccionarà aleatòriament un servidor suggerit per utilitzar.",
"not_a_valid_uri": "URI no vàlid",
"notifications": "Notificacions",
"open_link_in_explorer": "Obre l'enllaç a l'explorador",
"password": "Contrasenya",
"password_explain": "Introduïu la contrasenya que utilitzareu per desbloquejar el vostre emmagatzematge.",
"plausible_deniability": "Negació plausible...",
"privacy": "Privacitat",
"privacy_read_clipboard": "Llegir el portapapers",
"privacy_system_settings": "Configuració del Sistema",
"privacy_quickactions": "Dreceres del moneder",
"privacy_quickactions_explanation": "Mantingueu premuda la icona de l'aplicació BlueWallet per consultar ràpidament el saldo del vostre moneder.",
"privacy_clipboard_explanation": "Proporcionar dreceres si es troba una adreça o factura al vostre porta-retalls.",
"privacy_do_not_track": "Desactivar analítiques",
"privacy_do_not_track_explanation": "La informació de rendiment i fiabilitat no s'enviarà per a la seva anàlisi.",
"rate": "Cotització",
"push_notifications_explanation": "En activar les notificacions, el token del vostre dispositiu s'enviarà al servidor, juntament amb les adreces del moneder i els IDs de les transaccions per a tots els moneders i transaccions fets després d'activar les notificacions. El token del dispositiu s'utilitza per enviar notificacions, i la informació del moneder ens permet notificar-vos sobre Bitcoin entrants o confirmacions de transaccions.\n\nNomés es transmet la informació posterior a l'activació de les notificacions—no es recopila res anterior.\n\nDesactivar les notificacions eliminarà tota aquesta informació del servidor. A més, eliminar un moneder de l'aplicació també eliminarà la seva informació associada del servidor.",
"selfTest": "Autotest",
"save": "guardar",
"saved": "Desat",
"success_transaction_broadcasted": "La vostra transacció s'ha transmès correctament!",
"total_balance": "Saldo total",
"total_balance_explanation": "Mostrar el saldo total de tots els vostres moneders als ginys de la pantalla d'inici.",
"widgets": "Ginys",
"tools": "Eines"
},
"notifications": {
"would_you_like_to_receive_notifications": "Voleu rebre notificacions quan rebeu pagaments entrants?",
"notifications_subtitle": "Pagaments entrants i confirmacions de transaccions",
"no_and_dont_ask": "No, i no em tornis a preguntar.",
"permission_denied_message": "Heu denegat el permís per enviar-vos notificacions. Si voleu rebre notificacions, activeu-les a la configuració del vostre dispositiu."
},
"transactions": {
"cancel_explain": "Reemplaçarem aquesta transacció per una que us paga a vós mateix i té comissions més altes. Això cancel·la efectivament la transacció actual. Aquesta tècnica s'anomena RBF—Replace by Fee.",
"cancel_no": "Aquesta transacció no es pot reemplaçar.",
"cancel_title": "Cancel·lar aquesta transacció (RBF)",
"transaction_loading_error": "S'ha produït un problema en carregar la transacció. Si us plau, torneu-ho a provar més tard.",
"transaction_not_available": "Transacció no disponible",
"confirmations_lowercase": "{confirmations} confirmacions",
"copy_link": "Còpia l'enllaç",
"expand_note": "Ampliar nota",
"cpfp_create": "Crear",
"cpfp_exp": "Crearem una altra transacció que gasta la vostra transacció sense confirmar. La comissió total serà més alta que la comissió de la transacció original, de manera que s'hauria de minar més ràpid. Aquesta tècnica s'anomena CPFP—Child Pays for Parent.",
"cpfp_no_bump": "A aquesta transacció no se li pot ampliar la comissió.",
"cpfp_title": "Ampliar comissió (CPFP)",
"details_balance_hide": "Amaga el saldo",
"details_balance_show": "Mostra el saldo",
"details_copy": "Copiar",
"details_from": "De",
"details_copy_block_explorer_link": "Copiar enllaç de l'explorador de blocs",
"details_copy_note": "Copiar nota",
"details_copy_txid": "Copiar ID de la transacció",
"details_inputs": "Entrades",
"details_outputs": "Sortides",
"date": "Data",
"details_received": "Rebut",
"details_view_in_browser": "Veure al navegador",
"details_title": "Transacció",
"incoming_transaction": "Transacció entrant",
"outgoing_transaction": "Transacció sortint",
"expired_transaction": "Transacció caducada",
"pending_transaction": "Transacció pendent",
"offchain": "Fora de cadena",
"onchain": "En cadena",
"details_to": "A",
"enable_offline_signing": "Aquest moneder no s'està utilitzant juntament amb una signatura fora de línia. Voleu activar-la ara?",
"list_conf": "Conf: {number}",
"pending": "Pendent",
"view_wallet": "Veure {walletLabel}",
"pending_with_amount": "Pendent {amt1} ({amt2})",
"received_with_amount": "+{amt1} ({amt2})",
"eta_10m": "ETA: En ~10 minuts",
"eta_3h": "ETA: En ~3 hores",
"eta_1d": "ETA: En ~1 dia",
"list_title": "transaccions",
"list_title_sent": "Enviat",
"list_title_received": "Rebut",
"transaction": "Transacció",
"open_url_error": "No es pot obrir l'enllaç amb el navegador per defecte. Si us plau, canvieu el navegador per defecte i torneu-ho a provar.",
"rbf_explain": "Reemplaçarem aquesta transacció per una amb una comissió més alta perquè es mini més ràpid. Aquesta tècnica s'anomena RBF—Replace by Fee.",
"rbf_title": "Accelerar (RBF)",
"status_bump": "Accelerar",
"status_cancel": "Cancel·lar la Transacció",
"transactions_count": "Recompte de transaccions",
"txid": "ID de la transacció",
"updating": "Actualitzant..."
"updating": "Actualitzant...",
"watchOnlyWarningTitle": "Advertència de seguretat",
"watchOnlyWarningDescription": "Aneu amb compte amb els estafadors que sovint utilitzen moneders \"només lectura\" per enganyar els usuaris. Aquests moneders no us permeten controlar ni enviar fons; només us permeten veure el saldo.",
"custom_fee_warning_title": "Advertència",
"custom_fee_warning_description": "Les comissions inferiors a 1 sat/vB són vàlides, però podrien no ser propagades a causa de les polítiques dels nodes.",
"details_eta_analyzing": "Analitzant...",
"details_sent": "Enviat",
"details_section": "Detalls",
"details_explorer": "explorador",
"details_network_fee": "Comissió de xarxa",
"details_to_address": "A",
"details_id": "ID",
"details_note": "Nota",
"details_add_note": "afegir",
"details_advanced": "Avançat",
"details_fee_rate": "Taxa de comissió",
"details_size": "Mida",
"details_virtual_size": "Mida virtual",
"details_tx_hex": "Hex de la TX",
"details_inputs_count": "Entrades ({count})",
"details_outputs_count": "Sortides ({count})"
},
"wallets": {
"add_bitcoin": "Bitcoin",
"add_bitcoin_explain": "Moneder de Bitcoin senzill i potent",
"add_create": "Crear",
"total_balance": "Saldo total",
"add_entropy_reset_title": "Restablir entropia",
"add_entropy_reset_message": "Canviar el tipus de moneder restablirà l'entropia actual. Voleu continuar?",
"add_entropy": "Entropia",
"add_entropy_bytes": "{bytes} bytes d'entropia",
"add_entropy_generated": "{gen} bytes d'entropia generada",
"add_entropy_provide": "Proporcionar entropia mitjançant llançaments de daus",
"add_entropy_remain": "{gen} bytes d'entropia generada. Els {rem} bytes restants s'obtindran del generador de nombres aleatoris del sistema.",
"add_import_wallet": "Importar moneder",
"add_lightning": "Lightning",
"add_lightning_explain": "Per gastar amb transaccions instantànies",
"add_lndhub": "Connectar al vostre LNDhub",
"add_lndhub_error": "L'adreça del node proporcionada no és un node LNDhub vàlid.",
"add_lndhub_placeholder": "L'adreça del vostre node",
"add_placeholder": "el meu primer moneder",
"add_title": "Afegir moneder",
"add_wallet_name": "nom del moneder",
"add_wallet_type": "tipus de moneder",
"details_address": "Direcció",
"add_wallet_seed_length": "Longitud de la llavor",
"add_wallet_seed_length_12": "12 paraules",
"add_wallet_seed_length_24": "24 paraules",
"clipboard_bitcoin": "Teniu una adreça de Bitcoin al porta-retalls. Voleu utilitzar-la per a una transacció?",
"clipboard_lightning": "Teniu una factura Lightning al porta-retalls. Voleu utilitzar-la per a una transacció?",
"clear_clipboard_on_import": "Esborrar el porta-retalls en importar",
"details_address": "Adreça",
"details_advanced": "Avançat",
"details_are_you_sure": "¿Estàs segur?",
"details_are_you_sure": "Estàs segur?",
"details_connected_to": "Connectat a",
"details_del_wb_err": "La quantitat de saldo proporcionada no coincideix amb el saldo d'aquest moneder. Si us plau, torneu-ho a provar.",
"details_del_wb_q": "Aquest moneder té saldo. Abans de continuar, tingueu en compte que no podreu recuperar els fons sense la frase de recuperació d'aquest moneder. Per evitar l'eliminació accidental, introduïu el saldo del vostre moneder de {balance} satoshis.",
"details_delete": "Eliminar",
"details_delete_wallet": "Eliminar Moneder",
"details_derivation_path": "camí de derivació",
"details_display": "Mostrar a la pantalla d'inici",
"details_export_backup": "Exportar / Guardar",
"details_master_fingerprint": "Petjada digital mestre",
"details_show_xpub": "Mostrar wallet XPUB",
"details_export_history": "Exportar historial a CSV",
"details_master_fingerprint": "Empremta digital mestra",
"details_multisig_type": "multisig",
"details_show_xpub": "Mostrar XPUB del moneder",
"details_show_addresses": "Mostrar adreces",
"details_title": "Detalls del moneder",
"wallets": "moneders",
"swipe_balance_hide": "Amagar",
"swipe_balance_show": "Mostrar",
"drag_to_reorder": "Arrossegueu per reordenar",
"clear_search": "Esborrar cerca",
"details_type": "Tipus",
"details_use_with_hardware_wallet": "Usar amb un moneder hardware",
"details_yes_delete": "Si, eliminar",
"details_use_with_hardware_wallet": "Usar amb un moneder de maquinari",
"details_yes_delete": "Sí, eliminar",
"enter_bip38_password": "Introduïu la contrasenya per desxifrar",
"export_title": "Exportació de moneder",
"import_do_import": "Importar",
"import_error": "No s'ha pogut importar. ¿És vàlid?",
"import_passphrase": "Frase de contrasenya",
"import_passphrase_title": "Frase de contrasenya",
"import_passphrase_message": "Introduïu la frase de contrasenya si n'heu utilitzat alguna",
"import_error": "No s'ha pogut importar. És vàlid?",
"import_explanation": "Si us plau, introduïu les vostres paraules de la llavor, la clau pública, el WIF o qualsevol cosa que tingueu. BlueWallet farà tot el possible per endevinar el format correcte i importar el vostre moneder.",
"import_imported": "Importat",
"import_scan_qr": "o escanejar codi QR?",
"import_success": "Èxit",
"import_success_watchonly": "El vostre moneder s'ha importat correctament. AVÍS: Aquest és un moneder només lectura, NO podeu gastar des d'ell.",
"import_search_accounts": "Cercar comptes",
"import_title": "importar",
"learn_more": "Aprendre'n més",
"import_discovery_title": "Descobriment",
"import_discovery_subtitle": "Trieu un moneder descobert",
"import_discovery_derivation": "Utilitzar camí de derivació personalitzat",
"import_discovery_no_wallets": "No s'ha trobat cap moneder.",
"import_discovery_offline": "BlueWallet està actualment en mode fora de línia. En aquest mode, no es pot verificar l'existència del moneder, així que haureu de seleccionar-ne el correcte manualment",
"import_derivation_found": "Trobat",
"import_derivation_found_not": "No trobat",
"import_derivation_loading": "Carregant...",
"import_derivation_subtitle": "Introduïu un camí de derivació personalitzat i intentarem descobrir el vostre moneder.",
"import_derivation_title": "Camí de derivació",
"import_derivation_unknown": "Desconegut",
"import_wrong_path": "Camí de derivació incorrecte",
"list_create_a_button": "Afegir ara",
"list_create_a_wallet": "Afegeix un moneder",
"list_create_a_wallet_text": "És gratuït i en podeu crear \ntants com vulgueu.",
"list_empty_txs1": "Les seves transaccions apareixeran aquí,",
"list_empty_txs1_lightning": "Els moneders Lightning poden ser usats per les seves transaccions diàries. Les comissions són baixes i els pagaments ràpids.",
"list_empty_txs2": "Comenceu amb el vostre moneder.",
"list_empty_txs2_lightning": "\nPer començar a utilitzar-lo, toqueu a Gestionar fons i recarregueu el vostre saldo.",
"list_latest_transaction": "última transacció",
"list_long_choose": "Tria la foto",
"paste_from_clipboard": "Enganxar",
@ -254,36 +494,211 @@
"list_long_scan": "Escaneja el codi QR",
"list_title": "moneders",
"list_tryagain": "Torna-ho a provar",
"no_ln_wallet_error": "Abans de pagar una factura Lightning, primer heu d'afegir un moneder Lightning.",
"looks_like_bip38": "Això sembla una clau privada protegida amb contrasenya (BIP38).",
"manage_title": "Gestionar moneders",
"no_results_found": "No s'han trobat resultats.",
"please_continue_scanning": "Si us plau, continueu escanejant.",
"select_no_bitcoin": "Actualment no hi ha cap moneder de Bitcoin disponible.",
"select_no_bitcoin_exp": "Es requereix un moneder de Bitcoin per recarregar moneders Lightning. Si us plau, creeu-ne o importeu-ne un.",
"select_wallet": "Seleccioni moneder",
"xpub_copiedToClipboard": "Copiat al porta-retalls."
"pull_to_refresh": "Estireu per actualitzar",
"warning_do_not_disclose": "No compartiu mai la informació següent",
"scan_import": "Escanegeu aquest codi QR per importar el vostre moneder en una altra aplicació.",
"write_down_header": "Crear una còpia de seguretat manual",
"write_down": "Apunteu i guardeu de forma segura aquestes paraules. Utilitzeu-les per restaurar el vostre moneder més endavant.",
"wallet_type_this": "Aquest tipus de moneder és {type}.",
"share_number": "Compartir {number}",
"copy_ln_url": "Copieu i guardeu de forma segura aquest URL per restaurar el vostre moneder més endavant.",
"copy_ln_public": "Copieu i guardeu de forma segura aquesta informació per restaurar el vostre moneder més endavant.",
"add_ln_wallet_first": "Primer heu d'afegir un moneder Lightning.",
"identity_pubkey": "Clau pública d'identitat",
"xpub_title": "XPUB del moneder",
"manage_wallets_search_placeholder": "Cercar moneders, adreces, transaccions i comentaris",
"more_info": "Més informació",
"details_delete_wallet_error_message": "Hi ha hagut un problema en confirmar si aquest moneder s'ha eliminat de les notificacions—això podria ser degut a un problema de xarxa o una mala connexió. Si continueu, podríeu seguir rebent notificacions per a transaccions relacionades amb aquest moneder, fins i tot després d'eliminar-lo.",
"details_delete_anyway": "Eliminar igualment"
},
"total_balance_view": {
"title": "Saldo total"
"display_in_bitcoin": "Mostrar en Bitcoin",
"hide": "Amagar",
"display_in_sats": "Mostrar en sats",
"display_in_fiat": "Mostrar en {currency}",
"title": "Saldo total",
"explanation": "Visualitzeu el saldo total de tots els vostres moneders a la pantalla de visió general."
},
"multisig": {
"multisig_vault": "Caixa forta multisig",
"default_label": "Caixa forta multisig",
"multisig_vault_explain": "La millor seguretat per a grans quantitats",
"provide_signature": "Aportar signatura",
"provide_signature_details": "Utilitzeu el vostre dispositiu i moneder on resideix la clau per signar aquesta transacció",
"provide_signature_details_bluewallet": "A BlueWallet, aneu al menú de la pantalla Enviar i seleccioneu ",
"provide_signature_next_steps": "Escanejar o importar transacció signada",
"provide_signature_next_steps_details": "Un cop el vostre moneder hagi signat correctament la transacció, escanegeu el codi QR proporcionat o importeu el fitxer adjunt, i després reviseu tots els detalls de la transacció abans de transmetre-la.",
"vault_key": "Clau de caixa forta {number}",
"required_keys_out_of_total": "Claus requerides del total",
"fee": "Comissió: {number}",
"fee_btc": "{number} BTC",
"confirm": "Confirmar",
"header": "Enviar",
"share": "Compartir...",
"view": "Vista",
"shared_key_detected": "Cosignant compartit",
"shared_key_detected_question": "Us han compartit un cosignant, el voleu importar?",
"manage_keys": "Gestionar claus",
"how_many_signatures_can_bluewallet_make": "quantes signatures pot fer BlueWallet",
"signatures_required_to_spend": "Signatures requerides {number}",
"signatures_we_can_make": "pot fer-ne {number}",
"scan_or_import_file": "Escanejar o importar arxiu",
"export_coordination_setup": "Exportar configuració de coordinació",
"cosign_this_transaction": "Cosignar aquesta transacció?",
"lets_start": "Comencem",
"create": "Crear",
"native_segwit_title": "Millor pràctica",
"wrapped_segwit_title": "Millor compatibilitat",
"legacy_title": "Legat",
"co_sign_transaction": "Signar una transacció",
"what_is_vault": "Una caixa forta és un",
"what_is_vault_numberOfWallets": " multisig {m}-de-{n} ",
"what_is_vault_wallet": "moneder",
"vault_advanced_customize": "Configuració de la caixa forta",
"needs": "Necessita",
"what_is_vault_description_number_of_vault_keys": " {m} claus de caixa forta ",
"what_is_vault_description_to_spend": "per gastar i una tercera que \npodeu utilitzar com a còpia de seguretat.",
"what_is_vault_description_to_spend_other": "per gastar.",
"quorum": "quòrum {m} de {n}",
"quorum_header": "Quòrum",
"of": "de",
"wallet_type": "Tipus de moneder",
"invalid_mnemonics": "Aquesta frase mnemònica no sembla ser vàlida.",
"invalid_cosigner": "Dades de cosignant no vàlides",
"not_a_multisignature_xpub": "Aquest no és un XPUB d'un moneder multisignatura!",
"invalid_cosigner_format": "Cosignant incorrecte: aquest no és un cosignant per al format {format}.",
"create_new_key": "Crear nou",
"scan_or_open_file": "Escanejar o obrir arxiu",
"i_have_mnemonics": "Tinc una llavor per a aquesta clau.",
"type_your_mnemonics": "Inseriu una llavor per importar la vostra clau de caixa forta existent.",
"this_is_cosigners_xpub": "Aquest és l'XPUB del cosignant—llest per ser importat a un altre moneder. És segur compartir-lo.",
"this_is_cosigners_xpub_airdrop": "Si compartiu via AirDrop, els receptors han d'estar a la pantalla de coordinació.",
"wallet_key_created": "S'ha creat la vostra clau de caixa forta. Dediqueu un moment a fer una còpia de seguretat segura de la vostra llavor mnemònica.",
"are_you_sure_seed_will_be_lost": "Esteu segur? La vostra llavor mnemònica es perdrà si no en teniu una còpia de seguretat.",
"forget_this_seed": "Oblidar aquesta llavor i utilitzar l'XPUB en el seu lloc.",
"view_edit_cosigners": "Veure/editar cosignants",
"this_cosigner_is_already_imported": "Aquest cosignant ja està importat.",
"export_signed_psbt": "Exportar PSBT signat",
"input_fp": "Introduïu la petjada digital",
"input_fp_explain": "Ometeu per utilitzar la predeterminada (00000000)",
"input_path": "Inserir camí de derivació",
"input_path_explain": "Ometeu per utilitzar el predeterminat ({default})",
"ms_help": "Ajuda",
"ms_help_title5": "Habilitar el mode avançat"
"ms_help_title": "Com funcionen les caixes fortes multisig: consells i trucs",
"ms_help_text": "Un moneder amb múltiples claus, per a major seguretat o custòdia compartida",
"ms_help_title1": "Es recomanen múltiples dispositius.",
"ms_help_1": "La caixa forta funcionarà amb altres aplicacions BlueWallet i moneders compatibles amb PSBT, com ara Electrum, Specter, Coldcard, Cobo Vault, etc.",
"ms_help_title2": "Edició de claus",
"ms_help_2": "Podeu crear totes les claus de la caixa forta en aquest dispositiu i eliminar-les o editar-les més endavant. Tenir totes les claus al mateix dispositiu té la seguretat equivalent a un moneder de Bitcoin normal.",
"ms_help_title3": "Còpies de seguretat de la caixa forta",
"ms_help_3": "A les opcions del moneder, hi trobareu la còpia de seguretat de la vostra caixa forta i la còpia de seguretat només lectura. Aquesta còpia de seguretat és com un mapa del vostre moneder. És essencial per recuperar el moneder en cas que perdeu una de les vostres llavors.",
"ms_help_title4": "Importació de caixes fortes",
"ms_help_4": "Per importar una multisig, utilitzeu el fitxer de còpia de seguretat i la funció Importar. Si només teniu llavors i XPUBs, podeu utilitzar el botó Importar individual en crear les claus de la caixa forta.",
"ms_help_title5": "Habilitar el mode avançat",
"ms_help_5": "Per defecte, BlueWallet generarà una caixa forta de 2 de 3. Per crear un quòrum diferent o canviar el tipus d'adreça, activeu el mode avançat a la Configuració."
},
"is_it_my_address": {
"title": "És la meva adreça?",
"owns": "{label} posseeix {address}",
"enter_address": "Introduïu l'adreça",
"check_address": "Comprovar adreça",
"no_wallet_owns_address": "Cap dels moneders disponibles posseeix l'adreça proporcionada.",
"view_qrcode": "Veure codi QR"
},
"autofill_word": {
"title": "Paraula final de la llavor",
"enter": "Introduïu la vostra frase mnemònica parcial",
"generate_word": "Generar la paraula final",
"error": "L'entrada no és una mnemònica parcial d'11 o 23 paraules. Si us plau, torneu-ho a provar."
},
"cc": {
"change": "Canvi",
"coins_selected": "Monedes seleccionades ({number})",
"selected_summ": "{value} seleccionat",
"empty": "Aquest moneder no té cap moneda en aquest moment.",
"freeze": "Congelar",
"freezeLabel": "Congelar",
"freezeLabel_un": "Descongelar",
"header": "Control de monedes",
"use_coin": "Utilitzar moneda",
"use_coins": "Utilitzar monedes",
"tip": "Aquesta funcionalitat us permet veure, etiquetar, congelar o seleccionar monedes per a una millor gestió del moneder. Podeu seleccionar diverses monedes tocant els cercles de colors.",
"sort_asc": "Ascendent",
"sort_desc": "Descendent",
"sort_height": "Alçada",
"sort_value": "Valor",
"sort_label": "Etiqueta",
"sort_status": "estat"
"sort_status": "estat",
"sort_by": "Ordenar per"
},
"units": {
"BTC": "BTC",
"MAX": "Màx",
"sat_vbyte": "sat/vByte",
"sats": "sats"
},
"addresses": {
"copy_private_key": "Copiar clau privada",
"sensitive_private_key": "Advertència: les claus privades són extremadament sensibles. Continuar?",
"sign_title": "Signar/Verificar missatge",
"sign_help": "Aquí podeu crear o verificar una signatura criptogràfica basada en una adreça de Bitcoin.",
"sign_sign": "Signar",
"sign_verify": "Verificar",
"sign_signature_correct": "Verificació correcta!",
"sign_signature_incorrect": "La verificació ha fallat!",
"sign_placeholder_address": "Adreça",
"sign_placeholder_message": "Missatge",
"sign_placeholder_signature": "Signatura",
"addresses_title": "Adreces",
"type_change": "Canvi",
"type_receive": "Rebre",
"type_used": "Utilitzada",
"transactions": "transaccions"
},
"lnurl_auth": {
"register_question_part_1": "Voleu registrar un compte a",
"register_question_part_2": "utilitzant el vostre moneder Lightning?",
"register_answer": "Heu registrat correctament un compte a {hostname}!",
"login_question_part_1": "Voleu iniciar sessió a",
"login_question_part_2": "utilitzant el vostre moneder Lightning?",
"login_answer": "Heu iniciat sessió correctament a {hostname}!",
"link_question_part_1": "Voleu enllaçar el vostre compte a",
"link_question_part_2": "amb el vostre moneder Lightning?",
"link_answer": "El vostre moneder Lightning s'ha enllaçat correctament al vostre compte a {hostname}!",
"auth_question_part_1": "Voleu autenticar-vos a",
"auth_question_part_2": "utilitzant el vostre moneder Lightning?",
"auth_answer": "Us heu autenticat correctament a {hostname}!",
"could_not_auth": "No hem pogut autenticar-vos a {hostname}.",
"authenticate": "Autenticar"
},
"bip47": {
"payment_code": "Codi de pagament",
"contacts": "Contactes",
"bip47_explain": "Codi reutilitzable i compartible",
"bip47_explain_subtitle": "BIP47",
"purpose": "Codi reutilitzable i compartible (BIP47)",
"pay_this_contact": "Pagar a aquest contacte",
"rename_contact": "Reanomenar contacte",
"copy_payment_code": "Copiar codi de pagament",
"hide_contact": "Amagar contacte",
"rename": "Reanomenar",
"provide_name": "Proporcioneu un nou nom per a aquest contacte",
"add_contact": "Afegir contacte",
"provide_payment_code": "Proporcioneu el codi de pagament",
"invalid_pc": "Codi de pagament no vàlid",
"notification_tx_unconfirmed": "La transacció de notificació encara no està confirmada, si us plau espereu",
"failed_create_notif_tx": "No s'ha pogut crear la transacció en cadena",
"onchain_tx_needed": "Cal una transacció en cadena",
"notif_tx_sent": "Transacció de notificació enviada. Si us plau, espereu que es confirmi",
"notif_tx": "Transacció de notificació",
"not_found": "No s'ha trobat el codi de pagament"
}
}

View File

@ -4,6 +4,7 @@
"cancel": "Zrušit",
"continue": "Pokračovat",
"clipboard": "Schránka",
"copied": "Zkopírováno!",
"discard_changes": "Zahodit změny?",
"discard_changes_explain": "Máte neuložené změny. Opravdu je chcete zahodit a opustit obrazovku?",
"enter_password": "Zadejte heslo",
@ -26,9 +27,9 @@
"enter_amount": "Zadejte částku",
"qr_custom_input_button": "Klepněte 10× k zadání vlastního vstupu",
"unlock": "Odemknout",
"port": "Port",
"ssl_port": "SSL port",
"suggested": "Doporučené"
"suggested": "Doporučené",
"port": "Port"
},
"azteco": {
"codeIs": "Váš kód voucheru je",
@ -73,9 +74,9 @@
"please_pay_between_and": "Zaplaťte prosím mezi {min} a {max}",
"please_pay": "Zaplaťte prosím",
"preimage": "Předobraz",
"sats": "sats.",
"date_time": "Datum a čas",
"wasnt_paid_and_expired": "Tato faktura nebyla zaplacena a její platnost vypršela."
"wasnt_paid_and_expired": "Tato faktura nebyla zaplacena a její platnost vypršela.",
"sats": "sats."
},
"plausibledeniability": {
"create_fake_storage": "Vytvořit zašifrované úložiště",
@ -104,9 +105,9 @@
"header": "Přijmout",
"reset": "Obnovit",
"maxSats": "Maximální množství je {max} sats",
"maxSatsFull": "Maximální částka je {max} sats nebo {currency} ",
"maxSatsFull": "Maximální částka je {max} sats nebo {currency}",
"minSats": "Minimální množství je {min} sats",
"minSatsFull": "Minimální částka je {min} sats nebo {currency} ",
"minSatsFull": "Minimální částka je {min} sats nebo {currency}",
"qrcode_for_the_address": "QR kód pro adresu",
"bip47_explanation": "Platební kódy jsou univerzální adresy, které zabraňují prozrazení adres vaší peněženky. Ne všechny služby je však podporují."
},
@ -156,7 +157,6 @@
"details_next": "Další",
"details_no_signed_tx": "Vybraný soubor neobsahuje transakci, kterou lze importovat.",
"details_note_placeholder": "Poznámka pro sebe",
"counterparty_label_placeholder": "Upravit jméno kontaktu",
"details_scan": "Skenovat",
"details_scan_hint": "Dvojitým klepnutím naskenujete nebo importujete cíl",
"details_scan_error": "Chyba skenování",
@ -205,7 +205,7 @@
"file_saved_at_path": "Soubor ({filePath}) byl uložen.",
"cant_send_to_silentpayment_adress": "Tato peněženka nedokáže odesílat prostředky na SilentPayment adresy",
"cant_send_to_bip47": "Tato peněženka nedokáže odesílat prostředky na platební kódy BIP47",
"cant_find_bip47_notification": "Nejdříve teno platební kód přidejte mezi kontakty",
"cant_find_bip47_notification": "Nejdříve tento platební kód přidejte mezi kontakty",
"problem_with_psbt": "Problém s PSBT (částečně podepsanou bitcoinovou transakcí)"
},
"settings": {
@ -227,7 +227,7 @@
"privacy_temporary_screenshots": "Umožnit zachycení snímku obrazovky",
"privacy_temporary_screenshots_instructions": "Ochrana proti zachycení snímku obrazovky bude dočasně vypnuta, aby bylo možné pořizovat snímky obrazovky a nahrávání obrazovky. Ochrana se znovu automaticky aktivuje, když zavřete a znovu otevřete aplikaci BlueWallet.",
"biometrics": "Biometrie",
"biometrics_no_longer_available": "Nastavení vašeho zařízení se změnily a již neodpovídají zvoleným nastavením zabezpečení v aplikaci. Aktivujte prosím znovu biometrii nebo přístupový kód, a poté aplikaci restartujte, aby se tyto změny projevily.",
"biometrics_no_longer_available": "Nastavení vašeho zařízení se změnila a již neodpovídají zvoleným nastavením zabezpečení v aplikaci. Aktivujte prosím znovu biometrii nebo přístupový kód, a poté aplikaci restartujte, aby se tyto změny projevily.",
"biom_10times": "Pokusili jste se zadat heslo 10×. Chcete obnovit úložiště? Tím odstraníte všechny peněženky a dešifrujete úložiště.",
"biom_conf_identity": "Potvrďte prosím svoji identitu.",
"biom_no_passcode": "Vaše zařízení nemá povolené odemykání pomocí přístupového kódu nebo biometriky. Abyste mohli pokračovat, nastavte prosím přístupový kód nebo biometriku v aplikaci Nastavení.",
@ -335,7 +335,6 @@
"transaction_loading_error": "Během načítání transakce došlo k problému. Zkuste to prosím znovu později.",
"transaction_not_available": "Transakce není dostupná",
"confirmations_lowercase": "{confirmations} potvrzení",
"copy_link": "Zkopírovat odkaz",
"expand_note": "Rozbalit poznámku",
"cpfp_create": "Vytvořit",
"cpfp_exp": "Vytvoříme další transakci, která utratí vaši nepotvrzenou transakci. Celkový poplatek bude vyšší než původní transakční poplatek, takže by měl být těžen rychleji. Tomu se říká CPFP Child Pays for Parent (dítě platí za rodiče).",
@ -347,7 +346,6 @@
"details_copy_block_explorer_link": "Zkopírovat odkaz na průzkumník bloků",
"details_copy_note": "Zkopírovat poznámku",
"details_copy_txid": "Zkopírovat ID transakce",
"details_from": "Vstup",
"details_inputs": "Vstupy",
"details_outputs": "Výstupy",
"date": "Datum",
@ -369,7 +367,6 @@
"eta_10m": "Doručení: Za ~10 minut",
"eta_3h": "Doručení: Za ~3 hodiny",
"eta_1d": "Doručení: Za ~1 den",
"view_wallet": "Zobrazit {walletLabel}",
"list_title": "Transakce",
"list_title_sent": "Odeslané",
"list_title_received": "Přijato",
@ -381,13 +378,27 @@
"status_cancel": "Zrušit transakci",
"transactions_count": "Počet transakcí",
"txid": "ID transakce",
"from": "Od: {counterparty}",
"to": "Pro: {counterparty}",
"updating": "Aktualizování…",
"watchOnlyWarningTitle": "Bezpečnostní upozornění",
"watchOnlyWarningDescription": "Dávejte si pozor na podvodníky, kteří často používají peněženky „pouze pro sledování“ ke klamání uživatelů. Tyto peněženky vám neumožňují kontrolovat nebo odesílat prostředky; umožňují vám pouze zobrazit zůstatek.",
"custom_fee_warning_title": "Varování",
"custom_fee_warning_description": "Poplatky ve výši pod 1 sat/vB jsou platné, ale nemusí být vyslány dále do sítě z důvodu zásad uzlu."
"custom_fee_warning_description": "Poplatky ve výši pod 1 sat/vB jsou platné, ale nemusí být vyslány dále do sítě z důvodu zásad uzlu.",
"details_eta_analyzing": "Analyzování…",
"details_sent": "Odesláno",
"details_section": "Podrobnosti",
"details_id": "ID",
"details_explorer": "průzkumník",
"details_network_fee": "Síťový poplatek",
"details_to_address": "Komu",
"details_note": "Poznámka",
"details_add_note": "přidat",
"details_advanced": "Pokročilé",
"details_fee_rate": "Sazba poplatku",
"details_size": "Velikost",
"details_virtual_size": "Virtuální velikost",
"details_tx_hex": "Hex transakce",
"details_inputs_count": "Vstupy ({count})",
"details_outputs_count": "Výstupy ({count})"
},
"wallets": {
"add_bitcoin": "Bitcoin",
@ -435,6 +446,10 @@
"details_show_addresses": "Zobrazit adresy",
"details_title": "Peněženka",
"wallets": "Peněženky",
"swipe_balance_hide": "Skrýt",
"swipe_balance_show": "Zobrazit",
"drag_to_reorder": "Přetažením změníte pořadí",
"clear_search": "Vymazat vyhledávání",
"details_type": "Typ",
"details_use_with_hardware_wallet": "Použít s hardwarovou peněženkou",
"details_yes_delete": "Ano, smazat",
@ -487,7 +502,6 @@
"select_no_bitcoin": "V současné době nejsou k dispozici žádné bitcoinové peněženky.",
"select_no_bitcoin_exp": "Bitcoinová peněženka je vyžadována pro doplnění Lightning peněženky. Nějakou prosím vytvořte nebo importujte.",
"select_wallet": "Vyberte peněženku",
"xpub_copiedToClipboard": "Zkopírováno do schránky.",
"pull_to_refresh": "Zatáhněte pro obnovení",
"warning_do_not_disclose": "Níže uvedené info nikdy nesdílejte",
"scan_import": "Chcete-li importovat vaši peněženku do jiné aplikace, naskenujte tento QR kód.",
@ -560,7 +574,7 @@
"invalid_mnemonics": "Zdá se, že tato mnemotechnická fráze není platná.",
"invalid_cosigner": "Neplatná data spolupodepisujícího",
"not_a_multisignature_xpub": "Toto není XPUB z vícepodpisové peněženky!",
"invalid_cosigner_format": "Nesprávný spolupodepsaný: toto není spolupodepsaný pro {format} formát.",
"invalid_cosigner_format": "Nesprávný spolupodepisující: toto není spolupodepisující pro {format} formát.",
"create_new_key": "Vytvořit nový",
"scan_or_open_file": "Naskenujte nebo otevřete soubor",
"i_have_mnemonics": "Mám seed pro tento klíč.",
@ -568,7 +582,7 @@
"this_is_cosigners_xpub": "Toto je XPUB spolupodepisujícího připravený k importu do jiné peněženky. Je bezpečné ho sdílet.",
"this_is_cosigners_xpub_airdrop": "Pokud sdílíte přes AirDrop, příjemci musí být na obrazovce koordinace.",
"wallet_key_created": "Klíč k Úložišti byl vytvořen. Udělejte si chvíli a bezpečně zálohujte svůj mnemotechnický seed.",
"are_you_sure_seed_will_be_lost": "Jste si jisti? Vaš mnemotechnický seed bude ztracen, pokud nemáte zálohu.",
"are_you_sure_seed_will_be_lost": "Jste si jisti? Váš mnemotechnický seed bude ztracen, pokud nemáte zálohu.",
"forget_this_seed": "Zapomenout tento seed a použít namísto něj XPUB.",
"view_edit_cosigners": "Zobrazit/upravit spolupodepisující",
"this_cosigner_is_already_imported": "Tento spolupodepisující je již importován.",
@ -644,7 +658,7 @@
"sign_placeholder_message": "Zpráva",
"sign_placeholder_signature": "Podpis",
"addresses_title": "Adresy",
"type_change": "Change",
"type_change": "Drobné",
"type_receive": "Přijímací",
"type_used": "Použitá",
"transactions": "Transakce"

View File

@ -3,24 +3,49 @@
"bad_password": "Cyfrinair anghywir. Tria eto. ",
"cancel": "Canslo",
"continue": "Parhau",
"clipboard": "Clipfwrdd",
"copied": "Wedi'i gopïo!",
"discard_changes": "Gwaredu newidiadau?",
"discard_changes_explain": "Mae gennyt newidiadau heb eu safio. Wyt ti'n siŵr dy fod eisiau eu gwaredu a gadael y sgrin?",
"enter_password": "Cyfrinair",
"never": "Byth",
"of": "{number} o {total}",
"ok": "Iawn",
"storage_is_encrypted": "Mae'r storfa wedi encryptio. Mae angen Cyfrinair i'w ddad-gryptio. ",
"enter_url": "Mewnosod URL",
"storage_is_encrypted": "Mae'r storfa wedi'i hamgryptio. Mae angen cyfrinair i'w dadgryptio.",
"yes": "Ie",
"no": "Na",
"seed": "Hadyn",
"save": "Safio...",
"seed": "Seed",
"success": "Llwyddiant",
"wallet_key": "Allwedd waled"
"wallet_key": "Allwedd waled",
"close": "Cau",
"change_input_currency": "Newid arian mewnbwn",
"refresh": "Adnewyddu",
"pick_image": "Dewis o'r llyfrgell",
"pick_file": "Dewis ffeil",
"enter_amount": "Mewnosod swm",
"qr_custom_input_button": "Tapio 10 gwaith i fewnosod mewnbwn arbennig",
"unlock": "Datgloi",
"port": "Porth",
"ssl_port": "Porth SSL",
"suggested": "Awgrymir"
},
"azteco": {
"success": "Llwyddiant"
"codeIs": "Dy god taleb ydi",
"errorBeforeRefeem": "Cyn actifadu, rhaid yn gyntaf adio waled Bitcoin.",
"errorSomething": "Aeth rhywbeth o'i le. Ydi'r daleb hon dal yn ddilys?",
"redeem": "Actifadu i'r waled",
"redeemButton": "Actifadu",
"success": "Llwyddiant",
"successMessage": "Daleb wedi'i hactifadu'n llwyddiannus! Dylai dy gyllid gyrraedd dy waled Bitcoin yn fuan.",
"title": "Actifadu taleb Azte.co"
},
"entropy": {
"save": "Safio",
"undo": "Dad-wneud"
"title": "Entropi",
"undo": "Dad-wneud",
"amountOfEntropy": "{bits} o {limit} did"
},
"errors": {
"broadcast": "Methu darlledu",
@ -28,8 +53,13 @@
"network": "Camgymeriad rhwydwaith"
},
"lnd": {
"expired": "Gorffen",
"errorInvoiceExpired": "Mae'r anfoneb wedi dod i ben.",
"expired": "Wedi dod i ben",
"expiresIn": "Yn dod i ben mewn {time} munud",
"payButton": "Talu",
"payment": "Taliad",
"placeholder": "Anfoneb neu gyfeiriad",
"potentialFee": "Ffi posib: {fee}",
"refill": "Ail-lenwi",
"refill_create": "Er mwyn parhau, ffurfia waled Bitcoin i'w ail-lenwi. ",
"refill_external": "Ail-lenwi efo Waled Allanol",
@ -41,26 +71,51 @@
"additional_info": "Gwybodaeth Ychwanegol",
"for": "Ar Gyfer:",
"lightning_invoice": "Anfoneb Mellten",
"please_pay_between_and": "Tala rhwng {min} a {max}",
"please_pay": "Talu",
"wasnt_paid_and_expired": "Ni chafodd yr anfoneb ei thalu, ac mae wedi gorffen."
"preimage": "Cynddelw",
"date_time": "Dyddiad ac Amser",
"wasnt_paid_and_expired": "Ni chafodd yr anfoneb ei thalu, ac mae wedi gorffen.",
"sats": "sats."
},
"plausibledeniability": {
"create_fake_storage": "Creu storfa wedi encryptio",
"create_fake_storage": "Creu storfa wedi'i hamgryptio",
"create_password_explanation": "Ni ddyliai'r cyfrinair ar gyfer y storfa ffug fod yr un cyfrinair ag ar gyfer y brif storfa",
"password_should_not_match": "Mae'r cyfrinair yn cael ei ddefnyddio'n barod. Tria gyfrinair gwahanol."
"help": "O dan rai amgylchiadau, gallai rhywun dy orfodi i ddatgelu cyfrinair. Er mwyn cadw dy gyllid yn ddiogel, gall BlueWallet greu storfa wedi'i hamgryptio arall efo cyfrinair gwahanol. O dan bwysau, gelli ddatgelu'r cyfrinair hwn i drydydd parti. Os caiff ei fewnosod yn BlueWallet, bydd yn datgloi storfa “ffug” newydd. Bydd hyn yn ymddangos yn ddilys i'r trydydd parti, ond bydd dy brif storfa yn parhau'n gyfrinachol gyda dy gyllid yn ddiogel.",
"help2": "Bydd y storfa newydd yn gwbl weithredol, a gelli storio rhywfaint o gyllid yno er mwyn iddi edrych yn fwy credadwy.",
"password_should_not_match": "Mae'r cyfrinair yn cael ei ddefnyddio'n barod. Tria gyfrinair gwahanol.",
"title": "Gwadu credadwy"
},
"pleasebackup": {
"ask": "Wyt ti wedi safio ymadrodd cofiadwy dy waled? Mae angen yr ymadrodd hwn i gael mynediad at dy gyllid os byddi'n colli'r ddyfais. Heb yr ymadrodd cofiadwy, bydd dy gyllid yn cael ei golli'n barhaol.",
"ask_no": "Na, dydw i ddim.",
"ask_yes": "Ydw, rwyf wedi.",
"ok": "Iawn, rwyf wedi ei ysgrifennu.",
"ok_lnd": "Iawn, rwyf wedi ei safio.",
"text": "Cymer foment i ysgrifennu'r ymadrodd cofiadwy yma ar ddarn o bapur.\nDyma dy gopi wrth gefn a gelli ei ddefnyddio i adfer y waled.",
"text_lnd": "Safia'r copi wrth gefn yma. Mae'n caniatáu iti adfer y waled os byddi'n ei cholli.",
"title": "Mae dy waled wedi cael ei chreu."
},
"receive": {
"details_create": "Creu",
"details_label": "Disgrifiad",
"details_setAmount": "Derbyn efo swm",
"header": "Derbyn"
"details_share": "Rhannu...",
"address_not_found": "Methu cynhyrchu cyfeiriad derbyn.",
"header": "Derbyn",
"reset": "Ailosod",
"maxSats": "Swm uchafswm yw {max} sats",
"maxSatsFull": "Swm uchafswm yw {max} sats neu {currency}",
"minSats": "Swm lleiafswm yw {min} sats",
"minSatsFull": "Swm lleiafswm yw {min} sats neu {currency}",
"qrcode_for_the_address": "Cod QR ar gyfer y cyfeiriad",
"bip47_explanation": "Mae codau taliad yn gyfeiriad cyffredinol sy'n osgoi datgelu cyfeiriadau dy waled. Ni fydd pob gwasanaeth yn eu cefnogi."
},
"send": {
"provided_address_is_invoice": "Mae'r cyfeiriad hwn yn edrych fel anfoneb Mellten. Dos i dy waled Mellten er mwyn talu'r anfoneb hon.",
"broadcastButton": "Darlledu",
"broadcastError": "Camgymeriad",
"broadcastNone": "Mewnosod hex y trafodyn",
"broadcastPending": "Disgwyl",
"broadcastSuccess": "Llwyddiant",
"confirm_header": "Cadarnhau",
@ -70,146 +125,580 @@
"create_copy": "Copïo a darlledu'n hwyrach",
"create_details": "Manylion",
"create_fee": "Ffi",
"create_memo": "Nodyn",
"create_satoshi_per_vbyte": "Satoshi y vByte",
"create_this_is_hex": "Dyma hex dy drafodyn—wedi'i lofnodi ac yn barod i'w ddarlledu i'r rhwydwaith.",
"create_to": "At",
"create_tx_size": "Maint Trafodyn",
"create_verify": "Gwirio ar coinb.in",
"details_insert_contact": "Mewnosod Cyswllt",
"details_add_rec_add": "Adio Derbynwr",
"details_add_rec_rem": "Tynnu Derbynwr",
"details_add_recc_rem_all_alert_description": "Wyt ti'n siŵr dy fod eisiau tynnu pob derbynnydd?",
"details_add_rec_rem_all": "Tynnu Pob Derbynnydd",
"details_recipients_title": "Derbynwyr",
"details_recipient_title": "Derbynnydd #{number} o #{total}",
"please_complete_recipient_title": "Derbynnydd anghyflawn",
"please_complete_recipient_details": "Cwblha fanylion derbynnydd #{number} cyn adio un newydd.",
"details_address": "Cyfeiriad",
"details_address_field_is_not_valid": "Dydi'r cyfeiriad ddim yn ddilys.",
"details_adv_fee_bump": "Caniatáu Codi'r Ffi",
"details_adv_full": "Defnyddio Balans Llawn",
"details_adv_full_sure": "Wyt ti'n sicr dy fod eisiau defnyddio balans llawn dy walet ar gyfer y trafodyn hwn?",
"details_adv_full_sure": "Wyt ti'n siŵr dy fod eisiau defnyddio balans llawn dy waled ar gyfer y trafodyn hwn?",
"details_adv_full_sure_frozen": "Wyt ti'n siŵr dy fod eisiau defnyddio balans llawn dy waled ar gyfer y trafodyn hwn? Sylwer bod darnau arian wedi'u rhewi yn cael eu heithrio.",
"details_adv_import": "Mewnforio Trafodyn",
"details_adv_import_qr": "Mewnforio Trafodyn (QR)",
"details_amount_field_is_not_valid": "Dydi'r swm ddim yn ddilys.",
"details_amount_field_is_less_than_minimum_amount_sat": "Mae'r swm a nodwyd yn rhy fach. Nodi swm sy'n fwy na 500 sats.",
"details_create": "Creu Anfoneb",
"details_error_decode": "Methu datgodio cyfeiriad Bitcoin",
"details_fee_field_is_not_valid": "Dydi'r ffi ddim yn ddilys.",
"details_frozen": "Mae {amount} BTC wedi'i rewi.",
"details_next": "Nesaf",
"details_no_signed_tx": "Nid yw'r ffeil a ddewiswyd yn cynnwys trafodyn y gellir ei fewnforio.",
"details_note_placeholder": "Hunan Nodyn",
"details_scan": "Sganio",
"details_scan_hint": "Tapio dwbl i sganio neu fewnforio cyrchfan",
"details_scan_error": "Camgymeriad sganio",
"details_total_exceeds_balance": "Mae'r swm anfon yn fwy na'r balans sydd ar gael.",
"details_total_exceeds_balance_frozen": "Mae'r swm anfon yn fwy na'r balans sydd ar gael. Sylwer bod darnau arian wedi'u rhewi yn cael eu heithrio.",
"details_unrecognized_file_format": "Fformat ffeil heb ei gydnabod",
"details_wallet_before_tx": "Cyn creu trafodyn, mae angen adio waled Bitcoin.",
"dynamic_init": "Cychwyn",
"dynamic_next": "Nesaf",
"dynamic_prev": "Blaenorol",
"dynamic_start": "Dechrau",
"dynamic_stop": "Stopio",
"fee_3h": "3a",
"fee_custom": "Arbennig",
"insert_custom_fee": "Mewnosod ffi",
"fee_fast": "Cyflym",
"fee_medium": "Canolig",
"fee_replace_minvb": "Dylai'r gyfradd ffi gyfan (satoshi y vByte) yr wyt eisiau ei thalu fod yn uwch na {min} sat/vByte.",
"fee_satvbyte": "mewn sat/vByte",
"fee_slow": "Araf",
"header": "Anfon",
"input_clear": "Clirio",
"input_done": "Wedi Cwblhau",
"input_paste": "Pastio",
"input_total": "Cyfanswm:",
"permission_camera_message": "Angen dy ganiatad i ddefnyddio dy gamera.",
"permission_camera_message": "Angen dy ganiatâd i ddefnyddio dy gamera.",
"psbt_sign": "Arwyddo trafodyn",
"invalid_psbt": "PSBT annilys.",
"open_settings": "Agor Gosodiadau",
"success_done": "Wedi Cwblhau"
"permission_storage_denied_message": "Mae BlueWallet yn methu safio'r ffeil hon. Agor gosodiadau dy ddyfais a galluogi Caniatâd Storfa.",
"permission_storage_title": "Caniatâd Mynediad Storfa",
"psbt_clipboard": "Copïo i'r Clipfwrdd",
"psbt_this_is_psbt": "Dyma Drafodyn Bitcoin wedi'i Lofnodi'n Rhannol (PSBT). Cwblha'r llofnodi efo dy waled caledwedd.",
"psbt_tx_export": "Allforio i ffeil",
"no_tx_signing_in_progress": "Nid oes unrhyw lofnodi trafodyn ar y gweill.",
"outdated_rate": "Diweddarwyd y gyfradd ddiwethaf: {date}",
"psbt_tx_open": "Agor Trafodyn wedi'i Lofnodi",
"psbt_tx_scan": "Sganio Trafodyn wedi'i Lofnodi",
"qr_error_no_qrcode": "Methu canfod Cod QR dilys yn y ddelwedd a ddewiswyd. Sicrha bod y ddelwedd yn cynnwys dim ond Cod QR a dim cynnwys ychwanegol fel testun na botymau.",
"reset_amount": "Ailosod Swm",
"reset_amount_confirm": "A hoffet ailosod y swm?",
"success_done": "Wedi Cwblhau",
"txSaved": "Mae'r ffeil trafodyn ({filePath}) wedi'i safio.",
"file_saved_at_path": "Mae'r ffeil ({filePath}) wedi'i safio.",
"cant_send_to_silentpayment_adress": "Ni all y waled hon anfon at gyfeiriadau Silent Payments",
"cant_send_to_bip47": "Ni all y waled hon anfon at godau taliad BIP47",
"cant_find_bip47_notification": "Adia'r Cod Taliad hwn at gysylltiadau yn gyntaf",
"problem_with_psbt": "Problem efo'r PSBT",
"fee_10m": "10m",
"fee_1d": "1d"
},
"settings": {
"about": "Amdano",
"about_awesome": "Wedi'i adeiladu gyda'r gwych",
"about_backup": "Cofia wneud copi wrth gefn o'th allweddi bob amser!",
"about_free": "Mae BlueWallet yn brosiect am ddim a chod-agored. Wedi'i grefftio gan ddefnyddwyr Bitcoin.",
"about_license": "Trwydded MIT",
"about_release_notes": "Nodiadau rhyddhau",
"about_review": "Gad adolygiad i ni",
"performance_score": "Sgôr perfformiad: {num}",
"run_performance_test": "Profi perfformiad",
"about_selftest": "Cynnal hunan-brawf",
"block_explorer_invalid_custom_url": "Mae'r URL a ddarparwyd yn annilys. Mewnosod URL dilys sy'n dechrau gyda http:// neu https://.",
"about_selftest_electrum_disabled": "Nid yw hunan-brofi ar gael gyda Modd All-lein Electrum. Analluoga'r modd all-lein a thria eto.",
"about_selftest_ok": "Mae pob prawf mewnol wedi pasio'n llwyddiannus. Mae'r waled yn gweithio'n iawn.",
"about_sm_github": "GitHub",
"about_sm_telegram": "Sianel Telegram",
"privacy_temporary_screenshots": "Caniatáu Cipio Sgrin",
"privacy_temporary_screenshots_instructions": "Bydd amddiffyniad cipio sgrin yn cael ei ddiffodd dros dro, gan alluogi sgrinluniau a recordiadau sgrin. Bydd yr amddiffyniad yn ailalluogi'n awtomatig pan fyddi'n cau ac ailagor BlueWallet.",
"biometrics": "Biometreg",
"biometrics_no_longer_available": "Mae gosodiadau dy ddyfais wedi newid ac nid ydynt bellach yn cyfateb i'r gosodiadau diogelwch a ddewiswyd yn yr ap. Ailalluoga biometreg neu god mynediad, yna ailddechrau'r ap i gymhwyso'r newidiadau.",
"biom_10times": "Rwyt wedi ceisio mewnosod dy gyfrinair 10 gwaith. A hoffet ailosod dy storfa? Bydd hyn yn gwaredu pob waled ac yn datgryptio dy storfa.",
"biom_conf_identity": "Cadarnha dy hunaniaeth.",
"biom_no_passcode": "Nid oes gan dy ddyfais god mynediad na biometreg wedi'u galluogi. Er mwyn parhau, ffurfweddi god mynediad neu fiometreg yn yr ap Gosodiadau.",
"biom_remove_decrypt": "Bydd pob un o'th waledi yn cael ei gwaredu a bydd dy storfa yn cael ei datgryptio. Wyt ti'n siŵr dy fod eisiau parhau?",
"currency": "Arian",
"currency_source": "Cyfradd wedi'i chael o",
"currency_fetch_error": "Bu camgymeriad wrth gael y gyfradd ar gyfer yr arian a ddewiswyd.",
"default_title": "Wrth Gychwyn",
"donate": "Cyfrannu",
"donate_description": "Cynorthwya ni i gadw Blue yn rhad ac am ddim!",
"electrum_connected": "Wedi Cysylltu",
"electrum_connected_not": "Heb Gysylltu",
"electrum_error_connect": "Methu cysylltu â'r gweinydd Electrum a ddarparwyd",
"electrum_error_connect_tor": "Methu cysylltu â'r gweinydd Electrum a ddarparwyd. Sicrha bod yr ap Orbot wedi'i gysylltu a thria eto.",
"lndhub_uri": "E.e., {example}",
"electrum_host": "E.e., {example}",
"electrum_offline_mode": "Modd All-lein",
"electrum_offline_description": "Pan fydd wedi'i alluogi, ni fydd dy waledi Bitcoin yn ceisio nôl balansau na thrafodion.",
"electrum_port": "Porth, fel arfer {example}",
"use_ssl": "Defnyddio SSL",
"electrum_saved": "Mae dy newidiadau wedi cael eu safio'n llwyddiannus. Efallai bydd angen ailddechrau BlueWallet i'r newidiadau gael effaith.",
"set_electrum_server_as_default": "Gosod {server} fel y gweinydd Electrum diofyn?",
"set_lndhub_as_default": "Gosod {url} fel y gweinydd LNDhub diofyn?",
"electrum_settings_server": "Gweinydd Electrum",
"electrum_status": "Statws",
"electrum_preferred_server": "Gweinydd Dewisol",
"electrum_preferred_server_description": "Mewnosod y gweinydd yr wyt eisiau i'th waled ei ddefnyddio ar gyfer pob gweithgaredd Bitcoin. Unwaith ei osod, bydd dy waled yn defnyddio'r gweinydd hwn yn unig i wirio balansau, anfon trafodion a nôl data rhwydwaith. Sicrha dy fod yn ymddiried yn y gweinydd hwn cyn ei osod.",
"electrum_unable_to_connect": "Methu cysylltu â {server}.",
"electrum_history": "Hanes",
"electrum_reset_to_default": "Bydd hyn yn caniatáu i BlueWallet ddewis gweinydd ar hap o'r rhestr gweinyddion.",
"electrum_reset": "Ailosod i'r diofyn",
"electrum_reset_to_default_and_clear_history": "Ailosod i'r diofyn a chlirio'r hanes",
"encrypt_decrypt": "Dadgryptio'r Storfa",
"encrypt_decrypt_q": "Wyt ti'n siŵr dy fod eisiau datgryptio dy storfa? Bydd hyn yn caniatáu mynediad i'th waledi heb gyfrinair.",
"encrypt_enc_and_pass": "Wedi'i Ddiogelu â Chyfrinair",
"encrypt_storage_explanation_headline": "Galluogi Amgryptio'r Storfa",
"encrypt_storage_explanation_description_line1": "Mae galluogi Amgryptio'r Storfa yn ychwanegu haen ychwanegol o ddiogelwch i'th ap drwy ddiogelu sut mae dy ddata yn cael ei storio ar dy ddyfais. Mae hyn yn ei gwneud yn anoddach i unrhyw un gael mynediad at dy wybodaeth heb ganiatâd.",
"encrypt_storage_explanation_description_line2": "Fodd bynnag, mae'n bwysig gwybod mai'r amgryptio hwn sy'n diogelu mynediad at dy waledi a storir yng nghadwyn allweddi dy ddyfais yn unig. Nid yw'n rhoi cyfrinair na diogelwch ychwanegol ar y waledi eu hunain.",
"i_understand": "Rwy'n deall",
"block_explorer": "Archwiliwr Blociau",
"block_explorer_preferred": "Defnyddio archwiliwr blociau dewisol",
"block_explorer_error_saving_custom": "Camgymeriad wrth safio'r archwiliwr blociau dewisol",
"encrypt_title": "Diogelwch",
"encrypt_tstorage": "Storfa",
"encrypt_use": "Defnydd {type}",
"set_as_preferred": "Gosod fel dewisol",
"set_as_preferred_electrum": "Bydd gosod {host}:{port} fel gweinydd dewisol yn analluogi cysylltu â gweinydd awgrymedig ar hap.",
"encrypted_feature_disabled": "Ni ellir defnyddio'r nodwedd hon gydag amgryptio'r storfa wedi'i alluogi.",
"encrypt_use_expl": "Defnyddir {type} i gadarnhau dy hunaniaeth cyn gwneud trafodyn, datgloi, allforio neu ddileu waled.",
"biometrics_fail": "Os nad yw {type} wedi'i alluogi, neu'n methu â datgloi, gelli ddefnyddio cod mynediad dy ddyfais fel dewis arall.",
"general": "Cyffredinol",
"general_continuity": "Parhad",
"general_continuity_e": "Pan fydd wedi'i alluogi, byddi'n gallu gweld waledi a thrafodion dethol gan ddefnyddio dy ddyfeisiau Apple iCloud eraill sydd wedi'u cysylltu.",
"groundcontrol_explanation": "Mae GroundControl yn weinydd hysbysiadau gwthio rhad ac am ddim, cod-agored ar gyfer waledi Bitcoin. Gelli osod dy weinydd GroundControl dy hun a rhoi ei URL yma er mwyn peidio â dibynnu ar seilwaith BlueWallet. Gad yn wag i ddefnyddio gweinydd diofyn GroundControl.",
"header": "Gosodiadau",
"language": "Iaith",
"last_updated": "Diweddarwyd ddiwethaf",
"language_isRTL": "Mae angen ail ddechrau BlueWallet i'r newidiadau iaith gael effaith.",
"lightning_saved": "Mae dy newidiadau wedi cael eu safio'n llwyddianus.",
"license": "Trwydded",
"lightning_error_lndhub_uri": "URI LNDhub annilys",
"lightning_error_lndhub_uri_tor": "URI LNDhub annilys. Sicrha bod yr ap Orbot wedi'i gysylltu a thria eto.",
"lightning_saved": "Mae dy newidiadau wedi cael eu safio'n llwyddiannus.",
"lightning_settings": "Gosodiadau Mellten",
"lightning_settings_explain": "I gysylltu â'th nod LND dy hun, gosoda LNDhub a rho ei URL yma yn y gosodiadau. Sylwer mai dim ond waledi a grëwyd ar ôl safio'r newidiadau fydd yn cysylltu â'r LNDhub penodol.",
"lndhub_github": "Storfa GitHub",
"network": "Rhwydwaith",
"network_broadcast": "Darlledu Trafodyn",
"notifications": "Hysbysebion",
"network_electrum": "Gweinydd Electrum",
"electrum_suggested_description": "Pan na fydd gweinydd dewisol wedi'i osod, dewisir gweinydd awgrymedig ar hap.",
"not_a_valid_uri": "URI annilys",
"notifications": "Hysbysiadau",
"open_link_in_explorer": "Agor dolen yn yr archwiliwr",
"password": "Cyfrinair",
"privacy": "Prefiatrwydd",
"password_explain": "Mewnosod y cyfrinair y byddi'n ei ddefnyddio i ddatgloi dy storfa.",
"plausible_deniability": "Gwadu credadwy",
"privacy": "Preifatrwydd",
"privacy_read_clipboard": "Darllen Clipfwrdd",
"privacy_system_settings": "Gosodiadau System",
"privacy_quickactions": "Llwybrau Byr Waled",
"privacy_quickactions_explanation": "Cyffwrdd a dal eicon yr ap BlueWallet i weld balans dy waled yn gyflym.",
"privacy_clipboard_explanation": "Darparu llwybrau byr os canfyddir cyfeiriad neu anfoneb yn dy glipfwrdd.",
"privacy_do_not_track": "Analluogi Dadansoddeg",
"privacy_do_not_track_explanation": "Ni fydd gwybodaeth perfformiad a dibynadwyedd yn cael ei chyflwyno i'w dadansoddi.",
"rate": "Cyfradd",
"push_notifications_explanation": "Drwy alluogi hysbysiadau, bydd tocyn dy ddyfais yn cael ei anfon at y gweinydd, ynghyd â chyfeiriadau waled a IDs trafodion ar gyfer pob waled a thrafodyn a wnaed ar ôl galluogi hysbysiadau. Defnyddir tocyn y ddyfais i anfon hysbysiadau, ac mae gwybodaeth y waled yn caniatáu i ni dy hysbysu am Bitcoin sy'n dod i mewn neu gadarnhad trafodion.\n\nDim ond gwybodaeth o ar ôl iti alluogi hysbysiadau a drosglwyddir—ni chesglir unrhyw beth o cyn hynny.\n\nBydd analluogi hysbysiadau yn gwaredu'r holl wybodaeth hon o'r gweinydd. Yn ogystal, bydd dileu waled o'r ap hefyd yn gwaredu ei gwybodaeth gysylltiedig o'r gweinydd.",
"selfTest": "Hunan-brawf",
"save": "Safio",
"saved": "Wedi Safio",
"total_balance": "Balans Llawn"
"success_transaction_broadcasted": "Mae dy drafodyn wedi'i ddarlledu'n llwyddiannus!",
"total_balance": "Balans Llawn",
"total_balance_explanation": "Dangos cyfanswm balans pob un o'th waledi ar dy declyn sgrin gartref.",
"widgets": "Teclynnau",
"tools": "Offer"
},
"notifications": {
"would_you_like_to_receive_notifications": "A hoffet dderbyn hysbysiadau pan fydd taliadau yn dod i mewn?",
"notifications_subtitle": "Taliadau sy'n dod i mewn a chadarnhad trafodion",
"no_and_dont_ask": "Na, a phaid â gofyn eto.",
"permission_denied_message": "Rwyt wedi gwrthod caniatâd i anfon hysbysiadau atat. Os hoffet dderbyn hysbysiadau, galluoga nhw yng ngosodiadau dy ddyfais."
},
"transactions": {
"cancel_explain": "Byddwn yn disodli'r trafodyn hwn gydag un sy'n dy dalu di ac sydd â ffioedd uwch. Mae hyn yn canslo'r trafodyn presennol yn effeithiol. Gelwir hyn yn RBF—Replace by Fee.",
"cancel_no": "Ni ellir disodli'r trafodyn hwn.",
"cancel_title": "Canslo'r trafodyn hwn (RBF)",
"transaction_loading_error": "Cafwyd problem wrth lwytho'r trafodyn. Tria eto'n hwyrach.",
"transaction_not_available": "Trafodyn ddim ar gael",
"confirmations_lowercase": "{confirmations} o gadarnhadau",
"expand_note": "Ehangu Nodyn",
"cpfp_create": "Creu",
"cpfp_exp": "Byddwn yn creu trafodyn arall sy'n gwario dy drafodyn heb ei gadarnhau. Bydd y ffi gyfan yn uwch na ffi'r trafodyn gwreiddiol, felly dylai gael ei gloddio'n gyflymach. Gelwir hyn yn CPFP—Child Pays for Parent.",
"cpfp_no_bump": "Ni ellir codi ffi'r trafodyn hwn.",
"cpfp_title": "Codi'r Ffi (CPFP)",
"details_balance_hide": "Cuddio Balans",
"details_balance_show": "Dangos Balans",
"details_copy": "Copïo",
"details_from": "Mewnbwn",
"details_copy_block_explorer_link": "Copïo Dolen yr Archwiliwr Blociau",
"details_copy_note": "Copïo Nodyn",
"details_copy_txid": "Copïo ID y Trafodyn",
"details_inputs": "Mewnbynau",
"details_outputs": "Allbynau",
"date": "Dyddiad",
"details_received": "Derbynwyd",
"details_view_in_browser": "Gweld yn y Porwr",
"details_title": "Trafodyn",
"incoming_transaction": "Trafodyn yn Dod i Mewn",
"outgoing_transaction": "Trafodyn yn Mynd Allan",
"expired_transaction": "Trafodyn Wedi Dod i Ben",
"pending_transaction": "Trafodyn yn Aros",
"offchain": "Oddi ar y gadwyn",
"onchain": "Ar y gadwyn",
"details_to": "Allbwn",
"enable_offline_signing": "Nid yw'r waled hon yn cael ei defnyddio ar y cyd â llofnodi all-lein. A hoffet ei alluogi nawr?",
"list_conf": "Cad: {number}",
"pending": "Disgwyl",
"pending_with_amount": "Yn aros {amt1} ({amt2})",
"received_with_amount": "+{amt1} ({amt2})",
"eta_10m": "ETA: Mewn ~10 munud",
"eta_3h": "ETA: Mewn ~3 awr",
"eta_1d": "ETA: Mewn ~1 diwrnod",
"list_title": "Trafodion",
"list_title_sent": "Anfonwyd",
"list_title_received": "Derbynwyd",
"transaction": "Trafodyn"
"transaction": "Trafodyn",
"open_url_error": "Methu agor y ddolen gyda'r porwr diofyn. Newida dy borwr diofyn a thria eto.",
"rbf_explain": "Byddwn yn disodli'r trafodyn hwn gydag un â ffi uwch fel y caiff ei gloddio'n gyflymach. Gelwir hyn yn RBF—Replace by Fee.",
"rbf_title": "Cyflymu (RBF)",
"status_bump": "Cyflymu",
"status_cancel": "Canslo",
"transactions_count": "Nifer y Trafodion",
"txid": "ID y Trafodyn",
"updating": "Diweddaru...",
"watchOnlyWarningTitle": "Rhybudd diogelwch",
"watchOnlyWarningDescription": "Bydd yn ofalus o dwyllwyr sy'n aml yn defnyddio waledi “gwylio'n unig” i dwyllo defnyddwyr. Nid yw'r waledi hyn yn caniatáu iti reoli na anfon cyllid; dim ond y balans y maent yn caniatáu iti ei weld.",
"custom_fee_warning_title": "Rhybudd",
"custom_fee_warning_description": "Mae ffioedd o dan 1 sat/vB yn ddilys, ond efallai na chânt eu hailddarlledu oherwydd polisïau nodau.",
"details_eta_analyzing": "Dadansoddi...",
"details_sent": "Anfonwyd",
"details_section": "Manylion",
"details_explorer": "archwiliwr",
"details_network_fee": "Ffi Rhwydwaith",
"details_to_address": "At",
"details_note": "Nodyn",
"details_add_note": "adio",
"details_advanced": "Arbenigol",
"details_fee_rate": "Cyfradd ffi",
"details_size": "Maint",
"details_virtual_size": "Maint rhithwir",
"details_tx_hex": "Hex y Trafodyn",
"details_inputs_count": "Mewnbynau ({count})",
"details_outputs_count": "Allbynau ({count})",
"details_id": "ID"
},
"wallets": {
"add_bitcoin_explain": "Waled Bitcoin syml a cryf",
"add_bitcoin": "Bitcoin",
"add_bitcoin_explain": "Waled Bitcoin syml a chryf",
"add_create": "Creu",
"total_balance": "Balans Llawn",
"add_entropy_reset_title": "Ailosod Entropi",
"add_entropy_reset_message": "Bydd newid math y waled yn ailosod yr entropi cyfredol. Wyt ti eisiau parhau?",
"add_entropy": "Entropi",
"add_entropy_bytes": "{bytes} beit o entropi",
"add_entropy_generated": "{gen} beit o entropi a gynhyrchwyd",
"add_entropy_provide": "Darparu entropi drwy rolio dis",
"add_entropy_remain": "{gen} beit o entropi a gynhyrchwyd. Bydd y {rem} beit sy'n weddill yn cael eu cael o gynhyrchydd rhifau ar hap y System.",
"add_import_wallet": "Mewnforio waled",
"add_lightning": "Mellten",
"add_lightning_explain": "Er mwyn gwario yn syth",
"add_lndhub": "Cysylltu â'th LNDhub",
"add_lndhub_error": "Mae cyfeiriad y nod a ddarparwyd yn nod LNDhub annilys.",
"add_lndhub_placeholder": "Cyfeiriad dy Nod",
"add_placeholder": "fy waled gyntaf",
"add_title": "Adio waled",
"add_wallet_name": "Enw",
"add_wallet_type": "Math",
"add_wallet_seed_length": "Hyd y Seed",
"add_wallet_seed_length_12": "12 gair",
"add_wallet_seed_length_24": "24 gair",
"clipboard_bitcoin": "Mae gen ti gyfeiriad Bitcoin ar dy glipfwrdd. Wyt ti isio ei ddefnyddio ar gyfer trafodyn?",
"clipboard_lightning": "Mae gen ti anfoneb Mellten ar dy glipfwrdd. Wyt ti isio ei ddefnyddio ar gyfer trafodyn?",
"clear_clipboard_on_import": "Clirio'r clipfwrdd ar ôl mewnforio",
"details_address": "Cyfeiriad",
"details_advanced": "Arbenigol",
"details_are_you_sure": "Wyt ti'n siwr?",
"details_are_you_sure": "Wyt ti'n siŵr?",
"details_connected_to": "Wedi cysylltu efo",
"details_del_wb_err": "Nid yw'r swm balans a ddarparwyd yn cyfateb i falans y waled hon. Tria eto.",
"details_del_wb_q": "Mae gan y waled hon falans. Cyn parhau, sylwer na fyddi'n gallu adfer y cyllid heb ymadrodd hadyn y waled hon. Er mwyn osgoi gwaredu damweiniol, mewnosod balans dy waled o {balance} satoshis.",
"details_delete": "Gwaredu",
"details_delete_wallet": "Gwaredu Waled",
"details_derivation_path": "llwybr deilliant",
"details_display": "Dangos ar y Sgrin Gartref",
"details_export_backup": "Allforio/Copi wrth gefn",
"details_export_history": "Allforio Hanes i CSV",
"details_master_fingerprint": "Ôl Bys y Brif Allwedd",
"details_multisig_type": "aml-lofnod",
"details_show_xpub": "Dangos xpub y Waled",
"details_show_addresses": "Dangos cyfeiriadau",
"details_title": "Waled",
"wallets": "Waledi",
"swipe_balance_hide": "Cuddio",
"swipe_balance_show": "Dangos",
"drag_to_reorder": "Llusgo i aildrefnu",
"clear_search": "Clirio chwiliad",
"details_type": "Math",
"details_use_with_hardware_wallet": "Defnyddio gyda Waled Caledwedd",
"details_yes_delete": "Ia, dileu",
"enter_bip38_password": "Angen cyfrinair i ddad-gryptio",
"enter_bip38_password": "Angen cyfrinair i ddadgryptio",
"export_title": "Waled Allfor",
"import_do_import": "Mewnforio",
"import_passphrase": "Geiriau pas",
"import_passphrase_title": "Geiriau pas",
"import_passphrase_message": "Mewnosod geiriau pas os defnyddiaist rai",
"import_error": "Methu mewnforio. Sicrha bod y data a ddarparwyd yn ddilys.",
"import_explanation": "Mewnosod dy eiriau hadyn, allwedd gyhoeddus, WIF, neu beth bynnag sydd gennyt. Bydd BlueWallet yn gwneud ei orau i ddyfalu'r fformat cywir a mewnforio dy waled.",
"import_imported": "Mewnforwyd",
"import_scan_qr": "Sganio neu fewnforio ffeil",
"import_success": "Mae dy waled wedi cael ei fewnforio'n llwyddiannus.",
"import_success": "Mae dy waled wedi cael ei mewnforio'n llwyddiannus.",
"import_success_watchonly": "Mae dy waled wedi'i mewnforio'n llwyddiannus. RHYBUDD: Waled gwylio'n unig yw hon, NI elli wario ohoni.",
"import_search_accounts": "Chwilio cyfrifon",
"import_title": "Mewnforio",
"learn_more": "Dysgu mwy",
"import_discovery_title": "Darganfod",
"import_discovery_subtitle": "Dewis waled a ddarganfuwyd",
"import_discovery_derivation": "Defnyddio llwybr deilliant arbennig",
"import_discovery_no_wallets": "Ni chanfuwyd unrhyw waledi.",
"import_discovery_offline": "Mae BlueWallet ar hyn o bryd yn y modd all-lein. Yn y modd hwn, ni all wirio bodolaeth y waled, felly bydd angen iti ddewis yr un cywir â llaw",
"import_derivation_found": "Wedi'i ganfod",
"import_derivation_found_not": "Heb ei ganfod",
"import_derivation_loading": "Llwytho...",
"import_derivation_subtitle": "Mewnosod llwybr deilliant arbennig, a byddwn yn ceisio darganfod dy waled.",
"import_derivation_title": "Llwybr deilliant",
"import_derivation_unknown": "Anhysbys",
"import_wrong_path": "Llwybr deilliant anghywir",
"list_create_a_button": "Adio rwan",
"list_create_a_wallet": "Adio waled",
"list_create_a_wallet_text": "Mae'n rhad ac am ddim, a gelli greu \ncymaint ag y dymuni.",
"list_empty_txs1": "Bydd trafodion yn dangos yma.",
"list_empty_txs1_lightning": "Dylid defnyddio waled Mellten ar gyfer dy drafodion dyddiol. Mae'r ffioedd yn annheg o rad a'r cyflymder yn ofnadwy o sydyn.",
"list_empty_txs2": "Dechrau efo dy waled",
"list_empty_txs2_lightning": "\nI ddechrau ei defnyddio, tapio ar Reoli Cyllid ac ail-lenwi dy falans.",
"list_latest_transaction": "Trafodyn Diweddaraf",
"list_long_choose": "Dewis Llun",
"paste_from_clipboard": "Pastio",
"import_file": "Mewnforio ffeil",
"list_long_scan": "Sganio Cod QR",
"list_title": "Waledi",
"list_tryagain": "Trio eto",
"no_ln_wallet_error": "Cyn talu anfoneb Mellten, rhaid yn gyntaf adio waled Mellten.",
"looks_like_bip38": "Mae hwn yn edrych fel allwedd breifat wedi'i diogelu â chyfrinair (BIP38).",
"manage_title": "Rheoli Waledi",
"no_results_found": "Ni chanfuwyd unrhyw ganlyniadau.",
"please_continue_scanning": "Parhau i sganio.",
"select_no_bitcoin": "Nid oes unrhyw waledi Bitcoin ar gael ar hyn o bryd.",
"select_no_bitcoin_exp": "Mae angen waled Bitcoin i ail-lenwi waledi Mellten. Creu neu fewnforio un.",
"select_wallet": "Dewis waled",
"xpub_copiedToClipboard": "Wedi gopio i'r clipfwrdd.",
"pull_to_refresh": "Tynnu i Adnewyddu"
"pull_to_refresh": "Tynnu i Adnewyddu",
"warning_do_not_disclose": "Paid â rhannu'r wybodaeth isod byth",
"scan_import": "Sganio'r cod QR hwn i fewnforio dy waled mewn ap arall.",
"write_down_header": "Creu copi wrth gefn â llaw",
"write_down": "Ysgrifenna a storia'r geiriau hyn yn ddiogel. Defnyddia hwy i adfer dy waled yn hwyrach.",
"wallet_type_this": "{type} yw math y waled hon.",
"share_number": "Rhannu {number}",
"copy_ln_url": "Copïa a storia'r URL hwn yn ddiogel i adfer dy waled yn hwyrach.",
"copy_ln_public": "Copïa a storia'r wybodaeth hon yn ddiogel i adfer dy waled yn hwyrach.",
"add_ln_wallet_first": "Rhaid yn gyntaf adio waled Mellten.",
"identity_pubkey": "Allwedd Gyhoeddus Hunaniaeth",
"xpub_title": "xpub y Waled",
"manage_wallets_search_placeholder": "Chwilio waledi, cyfeiriadau, trafodion a nodion",
"more_info": "Mwy o Wybodaeth",
"details_delete_wallet_error_message": "Cafwyd problem wrth gadarnhau a oedd y waled hon wedi'i gwaredu o'r hysbysiadau—gallai hyn fod oherwydd problem rhwydwaith neu gysylltiad gwael. Os byddi'n parhau, gallet dal i dderbyn hysbysiadau am drafodion sy'n gysylltiedig â'r waled hon, hyd yn oed ar ôl ei dileu.",
"details_delete_anyway": "Dileu beth bynnag"
},
"total_balance_view": {
"title": "Balans Llawn"
"display_in_bitcoin": "Dangos mewn Bitcoin",
"hide": "Cuddio",
"display_in_sats": "Dangos mewn sats",
"display_in_fiat": "Dangos mewn {currency}",
"title": "Balans Llawn",
"explanation": "Gweld cyfanswm balans pob un o'th waledi yn y sgrin trosolwg."
},
"multisig": {
"multisig_vault": "Claddgell Aml-lofnod",
"default_label": "Claddgell Aml-lofnod",
"multisig_vault_explain": "Y diogelwch gorau ar gyfer symiau mawr",
"provide_signature": "Darparu llofnod",
"provide_signature_details": "Defnyddia dy ddyfais a waled lle mae'r allwedd yn byw i lofnodi'r trafodyn hwn",
"provide_signature_details_bluewallet": "Yn BlueWallet, dos i ddewislen y sgrin Anfon a dewisa ",
"provide_signature_next_steps": "Sganio neu Fewnforio Trafodyn wedi'i Lofnodi",
"provide_signature_next_steps_details": "Unwaith y bydd dy waled wedi llofnodi'r trafodyn yn llwyddiannus, sgania'r cod QR a ddarparwyd neu fewnforia'r ffeil gysylltiedig, ac yna adolyga holl fanylion y trafodyn cyn ei ddarlledu.",
"vault_key": "Allwedd Claddgell {number}",
"required_keys_out_of_total": "Allweddi gofynnol o'r cyfanswm",
"fee": "Ffi: {number}",
"fee_btc": "{number} BTC",
"confirm": "Cadarnhau",
"header": "Anfon",
"share": "Rhannu...",
"view": "Golwg",
"shared_key_detected": "Cyd-lofnodwr wedi'i rannu",
"shared_key_detected_question": "Rhannwyd cyd-lofnodwr efo ti, wyt ti eisiau ei fewnforio?",
"manage_keys": "Rheoli Allweddi",
"how_many_signatures_can_bluewallet_make": "faint o lofnodion all BlueWallet eu gwneud",
"signatures_required_to_spend": "Llofnodion gofynnol {number}",
"signatures_we_can_make": "gall wneud {number}",
"scan_or_import_file": "Sganio neu fewnforio ffeil",
"export_coordination_setup": "Allforio Gosodiad Cydlynu",
"cosign_this_transaction": "Cyd-lofnodi'r trafodyn hwn?",
"lets_start": "Gad i ni ddechrau",
"create": "Creu",
"native_segwit_title": "Arfer gorau",
"wrapped_segwit_title": "Cydnawsedd gorau",
"legacy_title": "Etifeddiaeth",
"co_sign_transaction": "Arwyddo trafodyn",
"wallet_type": "Math o Waled"
"what_is_vault": "Mae Claddgell yn",
"what_is_vault_numberOfWallets": " waled aml-lofnod {m}-o-{n} ",
"what_is_vault_wallet": ".",
"vault_advanced_customize": "Gosodiadau Claddgell",
"needs": "Mae angen",
"what_is_vault_description_number_of_vault_keys": " {m} allwedd claddgell ",
"what_is_vault_description_to_spend": "i wario a thrydydd y gelli ei \nddefnyddio fel copi wrth gefn.",
"what_is_vault_description_to_spend_other": "i wario.",
"quorum": "cworwm {m} o {n}",
"quorum_header": "Cworwm",
"of": "o",
"wallet_type": "Math o Waled",
"invalid_mnemonics": "Nid yw'r ymadrodd cofiadwy hwn yn ymddangos yn ddilys.",
"invalid_cosigner": "Data cyd-lofnodwr annilys",
"not_a_multisignature_xpub": "Nid xpub o waled aml-lofnod yw hwn!",
"invalid_cosigner_format": "Cyd-lofnodwr anghywir: Nid yw hwn yn gyd-lofnodwr ar gyfer fformat {format}.",
"create_new_key": "Creu Newydd",
"scan_or_open_file": "Sganio neu agor ffeil",
"i_have_mnemonics": "Mae gen i hadyn ar gyfer yr allwedd hon.",
"type_your_mnemonics": "Mewnosod hadyn i fewnforio dy allwedd Claddgell bresennol.",
"this_is_cosigners_xpub": "Dyma xpub y cyd-lofnodwr—yn barod i'w fewnforio i waled arall. Mae'n ddiogel ei rannu.",
"this_is_cosigners_xpub_airdrop": "Os byddi'n rhannu drwy AirDrop, rhaid i'r derbynwyr fod ar y sgrin gydlynu.",
"wallet_key_created": "Crëwyd dy allwedd Claddgell. Cymer foment i wneud copi wrth gefn diogel o'th hadyn cofiadwy.",
"are_you_sure_seed_will_be_lost": "Wyt ti'n siŵr? Bydd dy hadyn cofiadwy yn cael ei golli os nad oes gennyt gopi wrth gefn.",
"forget_this_seed": "Anghofio'r hadyn hwn a defnyddio'r xpub yn ei le.",
"view_edit_cosigners": "Gweld/Golygu Cyd-lofnodwyr",
"this_cosigner_is_already_imported": "Mae'r cyd-lofnodwr hwn eisoes wedi'i fewnforio.",
"export_signed_psbt": "Allforio PSBT wedi'i Lofnodi",
"input_fp": "Mewnosod ôl bys",
"input_fp_explain": "Hepgor i ddefnyddio'r un diofyn (00000000)",
"input_path": "Mewnosod Llwybr Deilliant",
"input_path_explain": "Hepgor i ddefnyddio'r un diofyn ({default})",
"ms_help": "Cymorth",
"ms_help_title": "Sut Mae Claddgelloedd Aml-lofnod yn Gweithio: Awgrymiadau a Thriciau",
"ms_help_text": "Waled gydag allweddi lluosog, ar gyfer diogelwch uwch neu warchodaeth rhanedig",
"ms_help_title1": "Argymhellir dyfeisiau lluosog.",
"ms_help_1": "Bydd y Claddgell yn gweithio gydag apiau BlueWallet eraill a waledi cydnaws PSBT, megis Electrum, Specter, Coldcard, Cobo Vault, ac ati.",
"ms_help_title2": "Golygu Allweddi",
"ms_help_2": "Gelli greu'r holl allweddi Claddgell yn y ddyfais hon a'u gwaredu neu eu golygu yn hwyrach. Mae cael yr holl allweddi ar yr un ddyfais yn cyfateb i ddiogelwch waled Bitcoin arferol.",
"ms_help_title3": "Copïau Wrth Gefn o'r Claddgell",
"ms_help_3": "Ar opsiynau'r waled, fe ddoi o hyd i'th gopi wrth gefn o'r Claddgell a'r copi wrth gefn gwylio'n unig. Mae'r copi wrth gefn hwn fel map i'th waled. Mae'n hanfodol ar gyfer adfer y waled os byddi'n colli un o'th hadau.",
"ms_help_title4": "Mewnforio Claddgelloedd",
"ms_help_4": "I fewnforio aml-lofnod, defnyddia'r ffeil copi wrth gefn a'r nodwedd Mewnforio. Os mai dim ond hadau a xpubs sydd gennyt, gelli ddefnyddio'r botwm Mewnforio unigol wrth greu allweddi Claddgell.",
"ms_help_title5": "Modd Arbenigol",
"ms_help_5": "Yn ddiofyn, bydd BlueWallet yn cynhyrchu Claddgell 2-o-3. I greu cworwm gwahanol neu newid math y cyfeiriad, actifada'r Modd Arbenigol yn y Gosodiadau."
},
"is_it_my_address": {
"title": "Ai fy nghyfeiriad i ydyw?",
"owns": "Mae {label} yn berchen ar {address}",
"enter_address": "Mewnosod cyfeiriad",
"check_address": "Gwirio cyfeiriad",
"no_wallet_owns_address": "Nid yw'r un o'r waledi sydd ar gael yn berchen ar y cyfeiriad a ddarparwyd.",
"view_qrcode": "Gweld Cod QR"
},
"autofill_word": {
"title": "Gair olaf yr hadyn",
"enter": "Mewnosod dy ymadrodd cofiadwy rhannol",
"generate_word": "Cynhyrchu'r gair olaf",
"error": "Nid yw'r mewnbwn yn ymadrodd cofiadwy rhannol o 11 nac 23 gair. Tria eto."
},
"cc": {
"change": "Newid"
"change": "Newid",
"coins_selected": "Darnau Arian wedi'u Dewis ({number})",
"selected_summ": "{value} wedi'i ddewis",
"empty": "Nid oes gan y waled hon unrhyw ddarnau arian ar hyn o bryd.",
"freeze": "Rhewi",
"freezeLabel": "Rhewi",
"freezeLabel_un": "Dadrewi",
"header": "Rheoli UTXO",
"use_coin": "Defnyddio Darn Arian",
"use_coins": "Defnyddio Darnau Arian",
"tip": "Mae'r nodwedd hon yn caniatáu iti weld, labelu, rhewi neu ddewis darnau arian ar gyfer rheoli waled gwell. Gelli ddewis darnau arian lluosog drwy dapio ar y cylchoedd lliw.",
"sort_asc": "Esgynnol",
"sort_desc": "Disgynnol",
"sort_height": "Uchder",
"sort_value": "Gwerth",
"sort_status": "Statws",
"sort_by": "Trefnu yn ôl",
"sort_label": "Label"
},
"units": {
"MAX": "Mwyafswm"
"BTC": "BTC",
"MAX": "Mwyafswm",
"sat_vbyte": "sat/vByte",
"sats": "sats"
},
"addresses": {
"copy_private_key": "Copïo allwedd breifat",
"sensitive_private_key": "Rhybudd: mae allweddi preifat yn hynod sensitif. Parhau?",
"sign_title": "Llofnodi/Gwirio Neges",
"sign_help": "Yma gelli greu neu wirio llofnod cryptograffig yn seiliedig ar gyfeiriad Bitcoin.",
"sign_sign": "Arwyddo",
"sign_verify": "Gwirio",
"sign_signature_correct": "Gwiriad llwyddiannus!",
"sign_signature_incorrect": "Gwiriad wedi methu!",
"sign_placeholder_address": "Cyfeiriad",
"sign_placeholder_message": "Neges",
"sign_placeholder_signature": "Llofnod",
"addresses_title": "Cyfeiriadau",
"type_change": "Newid",
"type_receive": "Derbyn",
"type_used": "Defnyddiwyd",
"transactions": "Trafodion"
},
"lnurl_auth": {
"register_question_part_1": "A hoffet gofrestru cyfrif yn",
"register_question_part_2": "gan ddefnyddio dy waled Mellten?",
"register_answer": "Rwyt wedi cofrestru cyfrif yn llwyddiannus yn {hostname}!",
"login_question_part_1": "A hoffet fewngofnodi yn",
"login_question_part_2": "gan ddefnyddio dy waled Mellten?",
"login_answer": "Rwyt wedi mewngofnodi yn llwyddiannus yn {hostname}!",
"link_question_part_1": "A hoffet gysylltu dy gyfrif yn",
"link_question_part_2": "i'th waled Mellten?",
"link_answer": "Mae dy waled Mellten wedi'i chysylltu'n llwyddiannus â'th gyfrif yn {hostname}!",
"auth_question_part_1": "A hoffet gael dy ddilysu yn",
"auth_question_part_2": "gan ddefnyddio dy waled Mellten?",
"auth_answer": "Rwyt wedi cael dy ddilysu'n llwyddiannus yn {hostname}!",
"could_not_auth": "Ni allem dy ddilysu i {hostname}.",
"authenticate": "Dilysu"
},
"bip47": {
"payment_code": "Cod Taliad",
"contacts": "Cysylltiadau",
"bip47_explain": "Cod ailddefnyddiadwy a rhanadwy",
"bip47_explain_subtitle": "BIP47",
"purpose": "Cod ailddefnyddiadwy a rhanadwy (BIP47)",
"pay_this_contact": "Talu'r cyswllt hwn",
"rename_contact": "Ailenwi cyswllt",
"copy_payment_code": "Copïo Cod Taliad",
"hide_contact": "Cuddio cyswllt",
"rename": "Ailenwi",
"provide_name": "Darparu enw newydd i'r cyswllt hwn",
"add_contact": "Adio Cyswllt",
"provide_payment_code": "Darparu Cod Taliad",
"invalid_pc": "Cod Taliad annilys",
"notification_tx_unconfirmed": "Nid yw'r trafodyn hysbysu wedi'i gadarnhau eto, aros",
"failed_create_notif_tx": "Methu creu trafodyn ar y gadwyn",
"onchain_tx_needed": "Mae angen trafodyn ar y gadwyn",
"notif_tx_sent": "Anfonwyd y trafodyn hysbysu. Aros iddo gadarnhau",
"notif_tx": "Trafodyn hysbysu",
"not_found": "Cod taliad heb ei ganfod"
}
}

View File

@ -6,32 +6,110 @@
"never": "aldrig",
"ok": "OK",
"storage_is_encrypted": "Lageret er krypteret. Indtast adgangskode for at dekryptere",
"success": "Succes"
"success": "Succes",
"continue": "Fortsæt",
"clipboard": "Udklipsholder",
"copied": "Kopieret!",
"discard_changes": "Kassér ændringer?",
"discard_changes_explain": "Du har ugemte ændringer. Er du sikker på, at du vil kassere dem og forlade skærmen?",
"of": "{number} af {total}",
"enter_url": "Indtast URL",
"yes": "Ja",
"no": "Nej",
"save": "Gem...",
"seed": "Seed",
"wallet_key": "Wallet-nøgle",
"close": "Luk",
"change_input_currency": "Skift inputvaluta",
"refresh": "Opdater",
"pick_image": "Vælg fra bibliotek",
"pick_file": "Vælg fil",
"enter_amount": "Indtast beløb",
"qr_custom_input_button": "Tryk 10 gange for at indtaste brugerdefineret input",
"unlock": "Lås op",
"port": "Port",
"ssl_port": "SSL-port",
"suggested": "Foreslået"
},
"azteco": {
"success": "Succes"
"success": "Succes",
"codeIs": "Din voucher-kode er",
"errorBeforeRefeem": "Før du indløser, skal du først tilføje en Bitcoin-wallet.",
"errorSomething": "Noget gik galt. Er denne voucher stadig gyldig?",
"redeem": "Indløs til wallet",
"redeemButton": "Indløs",
"successMessage": "Voucher indløst! Dine midler bør ankomme i din Bitcoin-wallet inden længe.",
"title": "Indløs Azte.co-voucher"
},
"entropy": {
"save": "save"
"save": "Gem",
"title": "Entropi",
"undo": "Fortryd",
"amountOfEntropy": "{bits} af {limit} bit"
},
"errors": {
"broadcast": "Transmission mislykkedes.",
"error": "Fejl",
"network": "Netværksfejl"
},
"lnd": {
"refill": "Genopfyld",
"refill_lnd_balance": "Genopfyld Lightning wallet",
"title": "Administration"
"title": "Administration",
"errorInvoiceExpired": "Faktura udløbet.",
"expired": "Udløbet",
"expiresIn": "Udløber om {time} minutter",
"payButton": "Betal",
"payment": "Betaling",
"placeholder": "Faktura eller adresse",
"potentialFee": "Potentielt gebyr: {fee}",
"refill_create": "For at fortsætte skal du oprette en Bitcoin-wallet at genopfylde med.",
"refill_external": "Genopfyld med ekstern wallet",
"sameWalletAsInvoiceError": "Du kan ikke betale en faktura med den samme wallet, som blev brugt til at oprette den."
},
"lndViewInvoice": {
"additional_info": "Yderligere information",
"for": "Til:",
"lightning_invoice": "Lightning-faktura",
"please_pay_between_and": "Betal venligst mellem {min} og {max}",
"please_pay": "Betal venligst",
"preimage": "Pre-image",
"sats": "sats.",
"date_time": "Dato og tid",
"wasnt_paid_and_expired": "Denne faktura blev ikke betalt og er udløbet."
},
"plausibledeniability": {
"create_fake_storage": "Opret falsk kryopteret lager",
"create_fake_storage": "Opret falsk krypteret lager",
"create_password_explanation": "Adgangskoden til det falske lager må ikke være den samme som den du bruger til det rigtige lager",
"help": "Under visse omstændighder, kan du blive tvunget til at give din adgangskode. For at beskytte dine coins kan du med Bluewallet lave et falsk krypteret lager, med en anden kode. I en presset situation, kan du give denne adgangskode istedet. Hvis denne kode indtastes i BlueWallet, vil brugeren se den alternative wallet. Det vil se heltlegitimt ud for andre, og dermed beskytte din originale wallet og dine coins.",
"help2": "Det nye lager vil være fuldt funktionsdygtigt, og du kan evt have nogle småbeløb så det ser troværdigt ud.",
"help": "Under visse omstændigheder kan du blive tvunget til at give din adgangskode. For at beskytte dine coins kan du med BlueWallet lave et falsk krypteret lager med en anden kode. I en presset situation kan du give denne adgangskode i stedet. Hvis denne kode indtastes i BlueWallet, vil brugeren se den alternative wallet. Det vil se helt legitimt ud for andre, og dermed beskytte din originale wallet og dine coins.",
"help2": "Det nye lager vil være fuldt funktionsdygtigt, og du kan eventuelt have nogle småbeløb, så det ser troværdigt ud.",
"password_should_not_match": "Adgangskoden til det falske lager må ikke være den samme som den du bruger til det rigtige lager",
"title": "Sandsynlig benægtelse"
},
"pleasebackup": {
"ask": "Har du gemt din wallets seed-frase? Denne seed-frase er nødvendig for at få adgang til dine midler, hvis du mister denne enhed. Uden seed-frasen vil dine midler være permanent tabt.",
"ask_no": "Nej, det har jeg ikke.",
"ask_yes": "Ja, det har jeg.",
"ok": "OK, jeg har skrevet det ned.",
"ok_lnd": "OK, jeg har gemt den.",
"text": "Tag dig venligst et øjeblik til at skrive denne mnemonic ned på et stykke papir.\nDet er din backup, og du kan bruge den til at gendanne wallet'en.",
"text_lnd": "Gem venligst denne wallet-backup. Den giver dig mulighed for at gendanne wallet'en i tilfælde af tab.",
"title": "Din wallet er blevet oprettet."
},
"receive": {
"details_create": "Opret",
"details_label": "Beskrivelse",
"details_setAmount": "Modtag med beløb",
"header": "Modtag"
"header": "Modtag",
"details_share": "Del...",
"address_not_found": "Kunne ikke generere modtageradresse.",
"reset": "Nulstil",
"maxSats": "Maksimalt beløb er {max} sats",
"maxSatsFull": "Maksimalt beløb er {max} sats eller {currency}",
"minSats": "Minimumsbeløb er {min} sats",
"minSatsFull": "Minimumsbeløb er {min} sats eller {currency}",
"qrcode_for_the_address": "QR-kode for adressen",
"bip47_explanation": "Payment Codes er en universel adresse, der undgår at afsløre dine wallet-adresser. Ikke alle tjenester understøtter dem."
},
"send": {
"broadcastButton": "Transmitter",
@ -46,72 +124,581 @@
"create_this_is_hex": "Dette er transaktion hex, klar til at sende ud til netværket.",
"create_to": "Til",
"create_tx_size": "TX størrelse",
"details_address": "adresse",
"details_address_field_is_not_valid": "Adresse felt er ikke gyldigt",
"details_amount_field_is_not_valid": "Beløbsfeltet er ikke gyldigt",
"details_address": "Adresse",
"details_address_field_is_not_valid": "Adressen er ikke gyldig.",
"details_amount_field_is_not_valid": "Beløbet er ikke gyldigt.",
"details_create": "Opret",
"details_fee_field_is_not_valid": "Gebyr feltet er ikke gyldigt",
"details_fee_field_is_not_valid": "Gebyret er ikke gyldigt.",
"details_note_placeholder": "Notat til eget brug",
"details_scan": "Scan",
"details_total_exceeds_balance": "Beløbet du prøver at sende er større end din kontosaldo.",
"input_done": "Udført",
"success_done": "Udført"
"success_done": "Udført",
"provided_address_is_invoice": "Denne adresse ser ud til at være en Lightning-faktura. Gå venligst til din Lightning-wallet for at betale denne faktura.",
"broadcastError": "Fejl",
"broadcastNone": "Indsæt transaktions-hex",
"broadcastPending": "Afventende",
"create_copy": "Kopier og transmitter senere",
"create_satoshi_per_vbyte": "Satoshi pr. vByte",
"create_verify": "Verificer på coinb.in",
"details_insert_contact": "Indsæt kontakt",
"details_add_rec_add": "Tilføj modtager",
"details_add_rec_rem": "Fjern modtager",
"details_add_recc_rem_all_alert_description": "Er du sikker på, at du vil fjerne alle modtagere?",
"details_add_rec_rem_all": "Fjern alle modtagere",
"details_recipients_title": "Modtagere",
"details_recipient_title": "Modtager #{number} af #{total}",
"please_complete_recipient_title": "Ufuldstændig modtager",
"please_complete_recipient_details": "Udfyld venligst detaljerne for modtager #{number}, før du tilføjer en ny modtager.",
"details_adv_fee_bump": "Tillad gebyrforøgelse",
"details_adv_full": "Brug fuld saldo",
"details_adv_full_sure": "Er du sikker på, at du vil bruge din wallets fulde saldo til denne transaktion?",
"details_adv_full_sure_frozen": "Er du sikker på, at du vil bruge din wallets fulde saldo til denne transaktion? Bemærk, at frosne coins er udelukket.",
"details_adv_import": "Importér transaktion",
"details_adv_import_qr": "Importér transaktion (QR)",
"details_amount_field_is_less_than_minimum_amount_sat": "Det angivne beløb er for lille. Indtast venligst et beløb større end 500 sats.",
"details_error_decode": "Kunne ikke afkode Bitcoin-adresse",
"details_frozen": "{amount} BTC er frosset.",
"details_next": "Næste",
"details_no_signed_tx": "Den valgte fil indeholder ikke en transaktion, der kan importeres.",
"details_scan_hint": "Dobbelttryk for at scanne eller importere en destination",
"details_scan_error": "Scanningsfejl",
"details_total_exceeds_balance_frozen": "Sendebeløbet overstiger den tilgængelige saldo. Bemærk, at frosne coins er udelukket.",
"details_unrecognized_file_format": "Filformat ikke genkendt",
"details_wallet_before_tx": "Før du opretter en transaktion, skal du først tilføje en Bitcoin-wallet.",
"dynamic_init": "Initialiserer",
"dynamic_next": "Næste",
"dynamic_prev": "Forrige",
"dynamic_start": "Start",
"dynamic_stop": "Stop",
"fee_10m": "10m",
"fee_1d": "1d",
"fee_3h": "3t",
"fee_custom": "Brugerdefineret",
"insert_custom_fee": "Indsæt gebyr",
"fee_fast": "Hurtig",
"fee_medium": "Mellem",
"fee_replace_minvb": "Den samlede gebyrsats (satoshi per vByte), du vil betale, skal være højere end {min} sat/vByte.",
"fee_satvbyte": "i sat/vByte",
"fee_slow": "Langsom",
"header": "Send",
"input_clear": "Ryd",
"input_paste": "Indsæt",
"input_total": "I alt:",
"permission_camera_message": "Vi har brug for din tilladelse til at bruge dit kamera.",
"psbt_sign": "Signer en transaktion",
"invalid_psbt": "Ugyldig PSBT angivet.",
"open_settings": "Åbn indstillinger",
"permission_storage_denied_message": "BlueWallet kan ikke gemme denne fil. Åbn venligst dine enhedsindstillinger og aktivér lagertilladelse.",
"permission_storage_title": "Tilladelse til lageradgang",
"psbt_clipboard": "Kopier til udklipsholder",
"psbt_this_is_psbt": "Dette er en Partially Signed Bitcoin Transaction (PSBT). Færdiggør venligst signeringen med din hardware wallet.",
"psbt_tx_export": "Eksportér til fil",
"no_tx_signing_in_progress": "Der er ingen transaktionssignering i gang.",
"outdated_rate": "Kurs blev sidst opdateret: {date}",
"psbt_tx_open": "Åbn signeret transaktion",
"psbt_tx_scan": "Scan signeret transaktion",
"qr_error_no_qrcode": "Vi kunne ikke finde en gyldig QR-kode i det valgte billede. Sørg for, at billedet kun indeholder en QR-kode og intet yderligere indhold såsom tekst eller knapper.",
"reset_amount": "Nulstil beløb",
"reset_amount_confirm": "Vil du nulstille beløbet?",
"txSaved": "Transaktionsfilen ({filePath}) er blevet gemt.",
"file_saved_at_path": "Filen ({filePath}) er blevet gemt.",
"cant_send_to_silentpayment_adress": "Denne wallet kan ikke sende til Silent Payments-adresser",
"cant_send_to_bip47": "Denne wallet kan ikke sende til BIP47 Payment Codes",
"cant_find_bip47_notification": "Tilføj denne Payment Code til kontakter først",
"problem_with_psbt": "Problem med PSBT"
},
"settings": {
"about": "Andet",
"currency": "Valuta",
"header": "indstillinger",
"header": "Indstillinger",
"language": "Sprog",
"lightning_settings": "Lightning settings",
"lightning_settings": "Lightning-indstillinger",
"password": "Adgangskode",
"plausible_deniability": "Sandsynlig benægtelse...",
"save": "save"
"save": "Gem",
"about_awesome": "Bygget med det fantastiske",
"about_backup": "Tag altid backup af dine nøgler!",
"about_free": "BlueWallet er et gratis og open source-projekt. Lavet af Bitcoin-brugere.",
"about_license": "MIT-licens",
"about_release_notes": "Versionsnoter",
"about_review": "Efterlad os en anmeldelse",
"performance_score": "Ydeevnescore: {num}",
"run_performance_test": "Test ydeevne",
"about_selftest": "Kør selvtest",
"block_explorer_invalid_custom_url": "Den angivne URL er ugyldig. Indtast venligst en gyldig URL, der starter med http:// eller https://.",
"about_selftest_electrum_disabled": "Selvtest er ikke tilgængelig med Electrum offline-tilstand. Deaktiver venligst offline-tilstand og prøv igen.",
"about_selftest_ok": "Alle interne tests er bestået. Wallet'en fungerer fint.",
"about_sm_github": "GitHub",
"about_sm_telegram": "Telegram-kanal",
"privacy_temporary_screenshots": "Tillad skærmoptagelse",
"privacy_temporary_screenshots_instructions": "Beskyttelse mod skærmoptagelse vil midlertidigt blive slået fra, hvilket tillader skærmbilleder og skærmoptagelser. Beskyttelsen genaktiveres automatisk, når du lukker og genåbner BlueWallet.",
"biometrics": "Biometri",
"biometrics_no_longer_available": "Dine enhedsindstillinger er ændret og matcher ikke længere de valgte sikkerhedsindstillinger i appen. Genaktivér venligst biometri eller kode, og genstart derefter appen for at anvende disse ændringer.",
"biom_10times": "Du har forsøgt at indtaste din adgangskode 10 gange. Vil du nulstille dit lager? Dette vil fjerne alle wallets og dekryptere dit lager.",
"biom_conf_identity": "Bekræft venligst din identitet.",
"biom_no_passcode": "Din enhed har ikke en kode eller biometri aktiveret. For at fortsætte skal du konfigurere en kode eller biometri i indstillingsappen.",
"biom_remove_decrypt": "Alle dine wallets vil blive fjernet, og dit lager vil blive dekrypteret. Er du sikker på, at du vil fortsætte?",
"currency_source": "Kursen hentes fra",
"currency_fetch_error": "Der opstod en fejl under hentning af kursen for den valgte valuta.",
"default_title": "Ved opstart",
"donate": "Doner",
"donate_description": "Hjælp os med at holde Blue gratis!",
"electrum_connected": "Forbundet",
"electrum_connected_not": "Ikke forbundet",
"electrum_error_connect": "Kan ikke oprette forbindelse til den angivne Electrum-server",
"electrum_error_connect_tor": "Kan ikke oprette forbindelse til den angivne Electrum-server. Sørg venligst for, at Orbot-appen er forbundet, og prøv igen.",
"lndhub_uri": "F.eks. {example}",
"electrum_host": "F.eks. {example}",
"electrum_offline_mode": "Offline-tilstand",
"electrum_offline_description": "Når aktiveret, vil dine Bitcoin-wallets ikke forsøge at hente saldi eller transaktioner.",
"electrum_port": "Port, normalt {example}",
"use_ssl": "Brug SSL",
"electrum_saved": "Dine ændringer er blevet gemt. Genstart af BlueWallet kan være nødvendig, for at ændringerne træder i kraft.",
"set_electrum_server_as_default": "Indstil {server} som standard Electrum-server?",
"set_lndhub_as_default": "Indstil {url} som standard LNDhub-server?",
"electrum_settings_server": "Electrum-server",
"electrum_status": "Status",
"electrum_preferred_server": "Foretrukken server",
"electrum_preferred_server_description": "Indtast den server, du vil have din wallet til at bruge til alle Bitcoin-aktiviteter. Når den er indstillet, vil din wallet udelukkende bruge denne server til at tjekke saldi, sende transaktioner og hente netværksdata. Sørg for, at du har tillid til denne server, før du indstiller den.",
"electrum_unable_to_connect": "Kan ikke oprette forbindelse til {server}.",
"electrum_history": "Historik",
"electrum_reset_to_default": "Dette vil lade BlueWallet vælge en server tilfældigt fra serverlisten.",
"electrum_reset": "Nulstil til standard",
"electrum_reset_to_default_and_clear_history": "Nulstil til standard og ryd historik",
"encrypt_decrypt": "Dekrypter lager",
"encrypt_decrypt_q": "Er du sikker på, at du vil dekryptere dit lager? Dette vil tillade adgang til dine wallets uden en adgangskode.",
"encrypt_enc_and_pass": "Adgangskodebeskyttet",
"encrypt_storage_explanation_headline": "Aktivér lagerkryptering",
"encrypt_storage_explanation_description_line1": "Aktivering af lagerkryptering tilføjer et ekstra lag af beskyttelse til din app ved at sikre den måde, dine data lagres på din enhed. Dette gør det sværere for nogen at få adgang til dine oplysninger uden tilladelse.",
"encrypt_storage_explanation_description_line2": "Det er dog vigtigt at vide, at denne kryptering kun beskytter adgangen til dine wallets, der er gemt i enhedens keychain. Den sætter ikke en adgangskode eller ekstra beskyttelse på selve wallets.",
"i_understand": "Jeg forstår",
"block_explorer": "Block Explorer",
"block_explorer_preferred": "Brug foretrukken block explorer",
"block_explorer_error_saving_custom": "Fejl ved lagring af foretrukken block explorer",
"encrypt_title": "Sikkerhed",
"encrypt_tstorage": "Lager",
"encrypt_use": "Brug {type}",
"set_as_preferred": "Indstil som foretrukken",
"set_as_preferred_electrum": "Indstilling af {host}:{port} som foretrukken server vil deaktivere tilfældig forbindelse til en foreslået server.",
"encrypted_feature_disabled": "Denne funktion kan ikke bruges med krypteret lager aktiveret.",
"encrypt_use_expl": "{type} vil blive brugt til at bekræfte din identitet, før du foretager en transaktion, låser op, eksporterer eller sletter en wallet.",
"biometrics_fail": "Hvis {type} ikke er aktiveret eller ikke kan låse op, kan du bruge din enheds kode som alternativ.",
"general": "Generelt",
"general_continuity": "Kontinuitet",
"general_continuity_e": "Når aktiveret, vil du kunne se udvalgte wallets og transaktioner ved hjælp af dine andre Apple iCloud-tilsluttede enheder.",
"groundcontrol_explanation": "GroundControl er en gratis, open source push notifikationsserver til Bitcoin-wallets. Du kan installere din egen GroundControl-server og indsætte dens URL her for ikke at være afhængig af BlueWallets infrastruktur. Lad være tom for at bruge GroundControls standardserver.",
"last_updated": "Sidst opdateret",
"language_isRTL": "Genstart af BlueWallet er nødvendig, for at sprogretningen træder i kraft.",
"license": "Licens",
"lightning_error_lndhub_uri": "Ugyldig LNDhub-URI",
"lightning_error_lndhub_uri_tor": "Ugyldig LNDhub-URI. Sørg venligst for, at Orbot-appen er forbundet, og prøv igen.",
"lightning_saved": "Dine ændringer er blevet gemt.",
"lightning_settings_explain": "For at oprette forbindelse til din egen LND-node skal du installere LNDhub og indsætte dens URL her i indstillingerne. Bemærk, at kun tegnebøger oprettet efter at have gemt ændringer vil oprette forbindelse til den angivne LNDhub.",
"lndhub_github": "GitHub-arkiv",
"network": "Netværk",
"network_broadcast": "Transmitter transaktion",
"network_electrum": "Electrum-server",
"electrum_suggested_description": "Når en foretrukken server ikke er indstillet, vil en foreslået server blive valgt til brug tilfældigt.",
"not_a_valid_uri": "Ugyldig URI",
"notifications": "Notifikationer",
"open_link_in_explorer": "Åbn link i explorer",
"password_explain": "Indtast den adgangskode, du vil bruge til at låse dit lager op.",
"privacy": "Privatliv",
"privacy_read_clipboard": "Læs udklipsholder",
"privacy_system_settings": "Systemindstillinger",
"privacy_quickactions": "Wallet-genveje",
"privacy_quickactions_explanation": "Tryk og hold på BlueWallet-appikonet for hurtigt at se din wallets saldo.",
"privacy_clipboard_explanation": "Tilbyd genveje, hvis en adresse eller faktura findes i din udklipsholder.",
"privacy_do_not_track": "Deaktiver analyse",
"privacy_do_not_track_explanation": "Oplysninger om ydeevne og pålidelighed vil ikke blive indsendt til analyse.",
"rate": "Kurs",
"push_notifications_explanation": "Ved at aktivere notifikationer vil dit enhedstoken blive sendt til serveren sammen med wallet-adresser og transaktions-id'er for alle wallets og transaktioner foretaget efter aktivering af notifikationer. Enhedstokenet bruges til at sende notifikationer, og wallet-informationen tillader os at give dig besked om indgående Bitcoin eller transaktionsbekræftelser.\n\nKun oplysninger fra efter du aktiverer notifikationer overføres—intet fra før indsamles.\n\nDeaktivering af notifikationer vil fjerne alle disse oplysninger fra serveren. Derudover vil sletning af en wallet fra appen også fjerne dens tilknyttede oplysninger fra serveren.",
"selfTest": "Selvtest",
"saved": "Gemt",
"success_transaction_broadcasted": "Din transaktion er blevet transmitteret!",
"total_balance": "Samlet saldo",
"total_balance_explanation": "Vis den samlede saldo for alle dine wallets på din startskærms-widgets.",
"widgets": "Widgets",
"tools": "Værktøjer"
},
"notifications": {
"would_you_like_to_receive_notifications": "Vil du modtage notifikationer, når du får indgående betalinger?",
"notifications_subtitle": "Indgående betalinger og transaktionsbekræftelser",
"no_and_dont_ask": "Nej, og spørg mig ikke igen.",
"permission_denied_message": "Du har afvist tilladelsen til at sende dig notifikationer. Hvis du gerne vil modtage notifikationer, skal du aktivere dem i dine enhedsindstillinger."
},
"transactions": {
"cpfp_create": "Opret",
"details_copy": "Kopier",
"details_from": "Fra",
"details_title": "Transaktion",
"details_to": "Til",
"list_title": "transaktioner",
"transaction": "Transaktion"
"list_title": "Transaktioner",
"transaction": "Transaktion",
"cancel_explain": "Vi vil erstatte denne transaktion med en, der betaler dig og har højere gebyrer. Dette annullerer effektivt den aktuelle transaktion. Dette kaldes RBF—Replace by Fee.",
"cancel_no": "Denne transaktion kan ikke erstattes.",
"cancel_title": "Annuller denne transaktion (RBF)",
"transaction_loading_error": "Der opstod et problem ved indlæsning af transaktionen. Prøv venligst igen senere.",
"transaction_not_available": "Transaktion ikke tilgængelig",
"confirmations_lowercase": "{confirmations} bekræftelser",
"expand_note": "Udvid note",
"cpfp_exp": "Vi vil oprette en anden transaktion, der bruger din ubekræftede transaktion. Det samlede gebyr vil være højere end det oprindelige transaktionsgebyr, så den bør udvindes hurtigere. Dette kaldes CPFP—Child Pays for Parent.",
"cpfp_no_bump": "Denne transaktions gebyr kan ikke forøges.",
"cpfp_title": "Forøg gebyr (CPFP)",
"details_balance_hide": "Skjul saldo",
"details_balance_show": "Vis saldo",
"details_copy_block_explorer_link": "Kopier block explorer-link",
"details_copy_note": "Kopier note",
"details_copy_txid": "Kopier transaktions-ID",
"details_inputs": "Input",
"details_outputs": "Output",
"date": "Dato",
"details_received": "Modtaget",
"details_view_in_browser": "Vis i browser",
"incoming_transaction": "Indgående transaktion",
"outgoing_transaction": "Udgående transaktion",
"expired_transaction": "Udløbet transaktion",
"pending_transaction": "Afventende transaktion",
"offchain": "Offchain",
"onchain": "Onchain",
"enable_offline_signing": "Denne wallet bruges ikke sammen med offline-signering. Vil du aktivere det nu?",
"list_conf": "Bekr.: {number}",
"pending": "Afventende",
"pending_with_amount": "Afventende {amt1} ({amt2})",
"received_with_amount": "+{amt1} ({amt2})",
"eta_10m": "ETA: Om ~10 minutter",
"eta_3h": "ETA: Om ~3 timer",
"eta_1d": "ETA: Om ~1 dag",
"list_title_sent": "Sendt",
"list_title_received": "Modtaget",
"open_url_error": "Kunne ikke åbne linket med standardbrowseren. Skift venligst din standardbrowser, og prøv igen.",
"rbf_explain": "Vi vil erstatte denne transaktion med en med et højere gebyr, så den vil blive udvundet hurtigere. Dette kaldes RBF—Replace by Fee.",
"rbf_title": "Fremskynd (RBF)",
"status_bump": "Fremskynd",
"status_cancel": "Annuller",
"transactions_count": "Antal transaktioner",
"txid": "Transaktions-ID",
"updating": "Opdaterer...",
"watchOnlyWarningTitle": "Sikkerhedsadvarsel",
"watchOnlyWarningDescription": "Vær forsigtig med svindlere, som ofte bruger watch-only wallets til at narre brugere. Disse wallets giver dig ikke mulighed for at kontrollere eller sende midler; de lader dig kun se saldoen.",
"custom_fee_warning_title": "Advarsel",
"custom_fee_warning_description": "Gebyrer under 1 sat/vB er gyldige, men videresendes muligvis ikke på grund af nodepolitikker.",
"details_eta_analyzing": "Analyserer...",
"details_sent": "Sendt",
"details_section": "Detaljer",
"details_explorer": "explorer",
"details_network_fee": "Netværksgebyr",
"details_to_address": "Til",
"details_id": "ID",
"details_note": "Note",
"details_add_note": "tilføj",
"details_advanced": "Avanceret",
"details_fee_rate": "Gebyrsats",
"details_size": "Størrelse",
"details_virtual_size": "Virtuel størrelse",
"details_tx_hex": "Tx hex",
"details_inputs_count": "Input ({count})",
"details_outputs_count": "Output ({count})"
},
"wallets": {
"add_bitcoin_explain": "Simple and powerful Bitcoin wallet",
"add_bitcoin_explain": "Enkel og kraftfuld Bitcoin-wallet",
"add_create": "Opret",
"add_import_wallet": "Importer wallet",
"add_title": "Tilføj wallet",
"add_wallet_name": "wallet navn",
"add_wallet_name": "Navn",
"add_wallet_type": "Type",
"details_address": "Adresse",
"details_are_you_sure": "Er du sikker?",
"details_delete": "Slet",
"details_export_backup": "Eksporter / backup",
"details_show_xpub": "Vis wallet XPUB",
"details_title": "Wallet",
"wallets": "Wallets",
"details_type": "Type",
"details_yes_delete": "Ja, slet",
"export_title": "wallet eksport",
"export_title": "Wallet-eksport",
"import_do_import": "Importer",
"import_error": "Importen lykkedes ikke. Er det en gyldig nøgle?",
"import_imported": "Importeret",
"import_scan_qr": "eller scan QR kode istedet?",
"import_scan_qr": "Scan eller importer en fil",
"import_success": "Succes",
"import_title": "importer",
"import_title": "Importer",
"list_create_a_button": "Tilføj nu",
"list_create_a_wallet": "Tilføj en tegnebog",
"list_create_a_wallet": "Tilføj en wallet",
"list_title": "Wallets",
"list_empty_txs1": "Dine transaktioner vil blive vist her,",
"list_latest_transaction": "seneste transaktion",
"select_wallet": "Vælg wallet",
"xpub_copiedToClipboard": "Kopieret til udklipsholder."
"add_bitcoin": "Bitcoin",
"total_balance": "Samlet saldo",
"add_entropy_reset_title": "Nulstil entropi",
"add_entropy_reset_message": "Ændring af wallet-typen vil nulstille den aktuelle entropi. Vil du fortsætte?",
"add_entropy": "Entropi",
"add_entropy_bytes": "{bytes} bytes entropi",
"add_entropy_generated": "{gen} bytes genereret entropi",
"add_entropy_provide": "Tilvejebring entropi via terningekast",
"add_entropy_remain": "{gen} bytes genereret entropi. Resterende {rem} bytes vil blive hentet fra systemets tilfældighedsgenerator.",
"add_lightning": "Lightning",
"add_lightning_explain": "Til forbrug med øjeblikkelige transaktioner",
"add_lndhub": "Forbind til din LNDhub",
"add_lndhub_error": "Den angivne nodeadresse er en ugyldig LNDhub-node.",
"add_lndhub_placeholder": "Din nodeadresse",
"add_placeholder": "min første wallet",
"add_wallet_seed_length": "Seed-længde",
"add_wallet_seed_length_12": "12 ord",
"add_wallet_seed_length_24": "24 ord",
"clipboard_bitcoin": "Du har en Bitcoin-adresse i din udklipsholder. Vil du bruge den til en transaktion?",
"clipboard_lightning": "Du har en Lightning-faktura i din udklipsholder. Vil du bruge den til en transaktion?",
"clear_clipboard_on_import": "Ryd udklipsholder ved import",
"details_advanced": "Avanceret",
"details_connected_to": "Forbundet til",
"details_del_wb_err": "Det angivne saldobeløb matcher ikke denne wallets saldo. Prøv venligst igen.",
"details_del_wb_q": "Denne wallet har en saldo. Før du fortsætter, skal du være opmærksom på, at du ikke vil være i stand til at genskabe midlerne uden denne wallets seed-frase. For at undgå utilsigtet fjernelse skal du indtaste din wallets saldo på {balance} satoshis.",
"details_delete_wallet": "Slet wallet",
"details_derivation_path": "afledningssti",
"details_display": "Vis på startskærm",
"details_export_history": "Eksportér historik til CSV",
"details_master_fingerprint": "Master fingerprint",
"details_multisig_type": "multisig",
"details_show_addresses": "Vis adresser",
"swipe_balance_hide": "Skjul",
"swipe_balance_show": "Vis",
"drag_to_reorder": "Træk for at omarrangere",
"clear_search": "Ryd søgning",
"details_use_with_hardware_wallet": "Brug med hardware wallet",
"enter_bip38_password": "Indtast adgangskode for at dekryptere",
"import_passphrase": "Adgangsfrase",
"import_passphrase_title": "Adgangsfrase",
"import_passphrase_message": "Indtast adgangsfrase, hvis du har brugt en",
"import_explanation": "Indtast venligst dine seed-ord, offentlige nøgle, WIF eller hvad du har. BlueWallet vil gøre sit bedste for at gætte det korrekte format og importere din wallet.",
"import_success_watchonly": "Din wallet er blevet importeret. ADVARSEL: Dette er en watch-only wallet, du kan IKKE sende fra den.",
"import_search_accounts": "Søg konti",
"learn_more": "Lær mere",
"import_discovery_title": "Opdagelse",
"import_discovery_subtitle": "Vælg en opdaget wallet",
"import_discovery_derivation": "Brug brugerdefineret afledningssti",
"import_discovery_no_wallets": "Ingen wallets blev fundet.",
"import_discovery_offline": "BlueWallet er i øjeblikket i offline-tilstand. I denne tilstand kan den ikke verificere eksistensen af wallet'en, så du skal vælge den korrekte manuelt",
"import_derivation_found": "Fundet",
"import_derivation_found_not": "Ikke fundet",
"import_derivation_loading": "Indlæser...",
"import_derivation_subtitle": "Indtast brugerdefineret afledningssti, og vi vil forsøge at opdage din wallet.",
"import_derivation_title": "Afledningssti",
"import_derivation_unknown": "Ukendt",
"import_wrong_path": "Forkert afledningssti",
"list_create_a_wallet_text": "Det er gratis, og du kan oprette \nså mange du vil.",
"list_empty_txs1_lightning": "Lightning-wallet bør bruges til dine daglige transaktioner. Gebyrer er uretfærdigt billige, og hastigheden er lynhurtig.",
"list_empty_txs2": "Start med din wallet.",
"list_empty_txs2_lightning": "\nFor at begynde at bruge den skal du trykke på Administrer midler og fylde op på din saldo.",
"list_long_choose": "Vælg foto",
"paste_from_clipboard": "Indsæt",
"import_file": "Importér fil",
"list_long_scan": "Scan QR-kode",
"list_tryagain": "Prøv igen",
"no_ln_wallet_error": "Før du betaler en Lightning-faktura, skal du først tilføje en Lightning-wallet.",
"looks_like_bip38": "Dette ligner en adgangskodebeskyttet privat nøgle (BIP38).",
"manage_title": "Administrer wallets",
"no_results_found": "Ingen resultater fundet.",
"please_continue_scanning": "Fortsæt venligst med at scanne.",
"select_no_bitcoin": "Der er i øjeblikket ingen Bitcoin-wallets tilgængelige.",
"select_no_bitcoin_exp": "En Bitcoin-wallet er påkrævet for at genopfylde Lightning-wallets. Opret eller importer venligst en.",
"pull_to_refresh": "Træk for at opdatere",
"warning_do_not_disclose": "Del aldrig oplysningerne nedenfor",
"scan_import": "Scan denne QR-kode for at importere din wallet i en anden applikation.",
"write_down_header": "Opret en manuel backup",
"write_down": "Skriv disse ord ned og opbevar dem sikkert. Brug dem til at gendanne din wallet senere.",
"wallet_type_this": "Denne wallet-type er {type}.",
"share_number": "Del {number}",
"copy_ln_url": "Kopier og opbevar denne URL sikkert for at gendanne din wallet senere.",
"copy_ln_public": "Kopier og opbevar disse oplysninger sikkert for at gendanne din wallet senere.",
"add_ln_wallet_first": "Du skal først tilføje en Lightning-wallet.",
"identity_pubkey": "Identitets-pubkey",
"xpub_title": "Wallet XPUB",
"manage_wallets_search_placeholder": "Søg wallets, adresser, transaktioner og notater",
"more_info": "Mere info",
"details_delete_wallet_error_message": "Der opstod et problem med at bekræfte, om denne wallet blev fjernet fra notifikationer—dette kan skyldes et netværksproblem eller dårlig forbindelse. Hvis du fortsætter, modtager du muligvis stadig notifikationer for transaktioner relateret til denne wallet, selv efter den er slettet.",
"details_delete_anyway": "Slet alligevel"
},
"total_balance_view": {
"display_in_bitcoin": "Vis i Bitcoin",
"hide": "Skjul",
"display_in_sats": "Vis i sats",
"display_in_fiat": "Vis i {currency}",
"title": "Samlet saldo",
"explanation": "Vis den samlede saldo for alle dine wallets på oversigtsskærmen."
},
"multisig": {
"confirm": "Bekræft",
"create": "Opret",
"ms_help_title5": "Enable advanced mode"
"header": "Send",
"multisig_vault": "Multisig Vault",
"default_label": "Multisig Vault",
"ms_help_title5": "Avanceret tilstand",
"multisig_vault_explain": "Bedste sikkerhed til store beløb",
"provide_signature": "Signer",
"provide_signature_details": "Brug din enhed og wallet, hvor nøglen findes, til at signere denne transaktion",
"provide_signature_details_bluewallet": "I BlueWallet skal du gå til Send-skærmens menu og vælge",
"provide_signature_next_steps": "Scan eller importér signeret transaktion",
"provide_signature_next_steps_details": "Når din wallet har signeret transaktionen, scan den angivne QR-kode eller importer den medfølgende fil, og gennemse derefter alle transaktionsdetaljerne, før du transmitterer den.",
"vault_key": "Vault-nøgle {number}",
"required_keys_out_of_total": "Påkrævede nøgler ud af det samlede antal",
"fee": "Gebyr: {number}",
"fee_btc": "{number} BTC",
"share": "Del...",
"view": "Vis",
"shared_key_detected": "Delt co-signer",
"shared_key_detected_question": "En co-signer er blevet delt med dig, vil du importere den?",
"manage_keys": "Administrer nøgler",
"how_many_signatures_can_bluewallet_make": "hvor mange signaturer kan BlueWallet lave",
"signatures_required_to_spend": "Påkrævede signaturer {number}",
"signatures_we_can_make": "kan lave {number}",
"scan_or_import_file": "Scan eller importér fil",
"export_coordination_setup": "Eksportér koordineringsopsætning",
"cosign_this_transaction": "Co-sign denne transaktion?",
"lets_start": "Lad os starte",
"native_segwit_title": "Bedste praksis",
"wrapped_segwit_title": "Bedste kompatibilitet",
"legacy_title": "Legacy",
"co_sign_transaction": "Signer en transaktion",
"what_is_vault": "En Vault er en",
"what_is_vault_numberOfWallets": " {m}-af-{n} multisig ",
"what_is_vault_wallet": "wallet.",
"vault_advanced_customize": "Vault-indstillinger",
"needs": "Den kræver",
"what_is_vault_description_number_of_vault_keys": " {m} Vault-nøgler ",
"what_is_vault_description_to_spend": "til at sende og en tredje, som du \nkan bruge som backup.",
"what_is_vault_description_to_spend_other": "til at sende.",
"quorum": "{m} af {n} quorum",
"quorum_header": "Quorum",
"of": "af",
"wallet_type": "Wallet-type",
"invalid_mnemonics": "Denne mnemonic ser ikke ud til at være gyldig.",
"invalid_cosigner": "Ugyldige co-signer-data",
"not_a_multisignature_xpub": "Dette er ikke en XPUB fra en multisignatur-wallet!",
"invalid_cosigner_format": "Forkert co-signer: Dette er ikke en co-signer til {format}-formatet.",
"create_new_key": "Opret ny",
"scan_or_open_file": "Scan eller åbn fil",
"i_have_mnemonics": "Jeg har en seed til denne nøgle.",
"type_your_mnemonics": "Indsæt en seed for at importere din eksisterende Vault-nøgle.",
"this_is_cosigners_xpub": "Dette er co-signerens XPUB—klar til at blive importeret til en anden wallet. Det er sikkert at dele den.",
"this_is_cosigners_xpub_airdrop": "Hvis du deler via AirDrop, skal modtagerne være på koordineringsskærmen.",
"wallet_key_created": "Din Vault-nøgle er oprettet. Tag et øjeblik til sikkert at sikkerhedskopiere dit mnemonic seed.",
"are_you_sure_seed_will_be_lost": "Er du sikker? Dit mnemonic seed vil gå tabt, hvis du ikke har en backup.",
"forget_this_seed": "Glem denne seed og brug XPUB i stedet.",
"view_edit_cosigners": "Vis/rediger co-signers",
"this_cosigner_is_already_imported": "Denne co-signer er allerede importeret.",
"export_signed_psbt": "Eksportér signeret PSBT",
"input_fp": "Indtast fingerprint",
"input_fp_explain": "Spring over for at bruge standardværdien (00000000)",
"input_path": "Indsæt afledningssti",
"input_path_explain": "Spring over for at bruge standardværdien ({default})",
"ms_help": "Hjælp",
"ms_help_title": "Sådan fungerer Multisig Vaults: Tips og tricks",
"ms_help_text": "En wallet med flere nøgler, til øget sikkerhed eller delt opbevaring",
"ms_help_title1": "Flere enheder anbefales.",
"ms_help_1": "Vault'en vil fungere med andre BlueWallet-apps og PSBT-kompatible wallets såsom Electrum, Specter, Coldcard, Cobo Vault osv.",
"ms_help_title2": "Redigering af nøgler",
"ms_help_2": "Du kan oprette alle Vault-nøgler på denne enhed og fjerne eller redigere dem senere. At have alle nøgler på samme enhed har samme sikkerhed som en almindelig Bitcoin-wallet.",
"ms_help_title3": "Vault-backups",
"ms_help_3": "Under wallet-indstillingerne finder du din Vault-backup og watch-only-backup. Denne backup er som et kort til din wallet. Den er afgørende for wallet-gendannelse, hvis du mister et af dine seeds.",
"ms_help_title4": "Import af Vaults",
"ms_help_4": "For at importere en multisig skal du bruge din backup-fil og Import-funktionen. Hvis du kun har seeds og XPUB'er, kan du bruge den individuelle Import-knap, når du opretter Vault-nøgler.",
"ms_help_5": "Som standard vil BlueWallet generere en 2-af-3 Vault. For at oprette et andet quorum eller ændre adressetypen skal du aktivere Avanceret tilstand i indstillingerne."
},
"is_it_my_address": {
"title": "Er det min adresse?",
"owns": "{label} ejer {address}",
"enter_address": "Indtast adresse",
"check_address": "Tjek adresse",
"no_wallet_owns_address": "Ingen af de tilgængelige wallets ejer den angivne adresse.",
"view_qrcode": "Vis QR-kode"
},
"autofill_word": {
"title": "Sidste seed-ord",
"enter": "Indtast din delvise mnemonic",
"generate_word": "Generér det sidste ord",
"error": "Inputtet er ikke en delvis mnemonic med 11 eller 23 ord. Prøv venligst igen."
},
"cc": {
"sort_label": "Etiket"
"header": "Coin Control",
"sort_label": "Etiket",
"sort_status": "Status",
"change": "Byttepenge",
"coins_selected": "Coins valgt ({number})",
"selected_summ": "{value} valgt",
"empty": "Denne wallet har ingen coins i øjeblikket.",
"freeze": "Frys",
"freezeLabel": "Frys",
"freezeLabel_un": "Frigør",
"use_coin": "Brug coin",
"use_coins": "Brug coins",
"tip": "Denne funktion giver dig mulighed for at se, mærke, fryse eller vælge coins for forbedret wallet-styring. Du kan vælge flere coins ved at trykke på de farvede cirkler.",
"sort_asc": "Stigende",
"sort_desc": "Faldende",
"sort_height": "Højde",
"sort_value": "Værdi",
"sort_by": "Sortér efter"
},
"units": {
"BTC": "BTC",
"MAX": "Maks",
"sat_vbyte": "sat/vByte",
"sats": "sats"
},
"addresses": {
"sign_placeholder_address": "adresse",
"sign_placeholder_address": "Adresse",
"type_receive": "Modtag",
"transactions": "transaktioner"
"transactions": "Transaktioner",
"copy_private_key": "Kopier privat nøgle",
"sensitive_private_key": "Advarsel: private nøgler er ekstremt følsomme. Fortsæt?",
"sign_title": "Signer/verificer besked",
"sign_help": "Her kan du oprette eller verificere en kryptografisk signatur baseret på en Bitcoin-adresse.",
"sign_sign": "Signer",
"sign_verify": "Verificer",
"sign_signature_correct": "Verificering lykkedes!",
"sign_signature_incorrect": "Verificering mislykkedes!",
"sign_placeholder_message": "Besked",
"sign_placeholder_signature": "Signatur",
"addresses_title": "Adresser",
"type_change": "Byttepenge",
"type_used": "Brugt"
},
"lnurl_auth": {
"register_question_part_1": "Vil du registrere en konto hos",
"register_question_part_2": "ved hjælp af din Lightning-wallet?",
"register_answer": "Du har registreret en konto hos {hostname}!",
"login_question_part_1": "Vil du logge ind hos",
"login_question_part_2": "ved hjælp af din Lightning-wallet?",
"login_answer": "Du er logget ind hos {hostname}!",
"link_question_part_1": "Vil du knytte din konto hos",
"link_question_part_2": "til din Lightning-wallet?",
"link_answer": "Din Lightning-wallet blev knyttet til din konto hos {hostname}!",
"auth_question_part_1": "Vil du blive godkendt hos",
"auth_question_part_2": "ved hjælp af din Lightning-wallet?",
"auth_answer": "Du er blevet godkendt hos {hostname}!",
"could_not_auth": "Vi kunne ikke godkende dig hos {hostname}.",
"authenticate": "Godkend"
},
"bip47": {
"payment_code": "Payment Code",
"contacts": "Kontakter",
"bip47_explain": "Genbrugelig og delbar kode",
"bip47_explain_subtitle": "BIP47",
"purpose": "Genbrugelig og delbar kode (BIP47)",
"pay_this_contact": "Betal denne kontakt",
"rename_contact": "Omdøb kontakt",
"copy_payment_code": "Kopier Payment Code",
"hide_contact": "Skjul kontakt",
"rename": "Omdøb",
"provide_name": "Angiv nyt navn til denne kontakt",
"add_contact": "Tilføj kontakt",
"provide_payment_code": "Angiv Payment Code",
"invalid_pc": "Ugyldig Payment Code",
"notification_tx_unconfirmed": "Notification transaction er endnu ikke bekræftet, vent venligst",
"failed_create_notif_tx": "Kunne ikke oprette onchain-transaktion",
"onchain_tx_needed": "Onchain-transaktion er nødvendig",
"notif_tx_sent": "Notification transaction sendt. Vent venligst på, at den bekræftes",
"notif_tx": "Notification transaction",
"not_found": "Payment Code ikke fundet"
}
}

View File

@ -4,8 +4,9 @@
"cancel": "Abbrechen",
"continue": "Fortsetzen",
"clipboard": "Zwischenablage",
"copied": "Kopiert!",
"discard_changes": "Änderungen verwerfen?",
"discard_changes_explain": "Die ungespeicherten Änderungen verwerfen und den Bildschrim verlassen?",
"discard_changes_explain": "Die ungespeicherten Änderungen verwerfen und den Bildschirm verlassen?",
"enter_password": "Passwort eingeben",
"never": "nie",
"of": "{number} von {total}",
@ -19,7 +20,7 @@
"success": "Erfolg",
"wallet_key": "Wallet Schlüssel",
"close": "Schließen",
"change_input_currency": "Eingangswährung ändern",
"change_input_currency": "Eingabewährung ändern",
"refresh": "Aktualisieren",
"pick_image": "Aus der Bibliothek wählen",
"pick_file": "Datei auswählen",
@ -27,17 +28,17 @@
"qr_custom_input_button": "10x antippen für individuelle Eingabe",
"unlock": "Entsperren",
"port": "Port",
"ssl_port": "SSL Port",
"ssl_port": "SSL-Port",
"suggested": "Vorgeschlagen"
},
"azteco": {
"codeIs": "Dein Gutscheincode lautet",
"errorBeforeRefeem": "Vor dem Einlösen zuerst eine Bitcoin Wallet hinzufügen.",
"errorBeforeRefeem": "Vor dem Einlösen zuerst eine Bitcoin-Wallet hinzufügen.",
"errorSomething": "Etwas ist schiefgelaufen. Ist der Gutscheincode noch gültig?",
"redeem": "Einlösen in eine Wallet",
"redeemButton": "Einlösen",
"success": "Erfolg",
"successMessage": "Gutschein erfolgreich eingelöst! Ihre Gelder sollten in Kürze in Ihrer Bitcoin-Wallet ankommen.",
"successMessage": "Gutschein erfolgreich eingelöst! Deine Gelder sollten in Kürze in deiner Bitcoin-Wallet ankommen.",
"title": "Azte.co Gutschein einlösen"
},
"entropy": {
@ -60,10 +61,10 @@
"placeholder": "Rechnung oder Adresse",
"potentialFee": "Geschätzte Gebühr: {fee}",
"refill": "Aufladen",
"refill_create": "Bitte eine Bitcoin Wallet erstellen um fortzufahren",
"refill_external": "Mit externem Wallet aufladen",
"refill_lnd_balance": "Lade deine Lightning Wallet auf",
"sameWalletAsInvoiceError": "Die Rechnung lässt sich nicht mit gleichen Wallet begleichen, mit der sie erstellt wurde.",
"refill_create": "Bitte eine Bitcoin-Wallet erstellen, um fortzufahren",
"refill_external": "Mit externer Wallet aufladen",
"refill_lnd_balance": "Lade deine Lightning-Wallet auf",
"sameWalletAsInvoiceError": "Die Rechnung lässt sich nicht mit derselben Wallet begleichen, mit der sie erstellt wurde.",
"title": "Beträge verwalten"
},
"lndViewInvoice": {
@ -72,7 +73,7 @@
"lightning_invoice": "Lightning Rechnung",
"please_pay_between_and": "Zwischen {min} und {max} zahlen",
"please_pay": "Bitte zahle",
"preimage": "Urbild",
"preimage": "Pre-image",
"sats": "sats",
"date_time": "Datum und Zeit",
"wasnt_paid_and_expired": "Diese Rechnung ist unbezahlt abgelaufen."
@ -80,20 +81,20 @@
"plausibledeniability": {
"create_fake_storage": "Verschlüsselten Speicher erstellen",
"create_password_explanation": "Das Passwort für den täuschenden Speicher darf nicht mit dem deines Hauptspeichers übereinstimmen",
"help": "BlueWallet erlaubt die Erstellung eines zweiten verschlüsselten Speichers mit eigenem Passwort. Sodass unter Zwang das Passwort preiszugeben, dann dies, anstelle des richtigen Passwortes genannt werden kann. BlueWallet öffnet dann die Wallet, welche im zweiten Speicher zur Täuschung angelegt ist und der Hauptspeicher bleibt geheim und sicher.",
"help2": "Der zweite Speicher ist funktional identisch. Zahle auf die darin angelegten Wallet ein Minimalbetrag ein, um die Täuschung glaubhafter zu machen.",
"help": "BlueWallet erlaubt die Erstellung eines zweiten verschlüsselten Speichers mit eigenem Passwort. Wird unter Zwang die Preisgabe des Passworts verlangt, kann anstelle des richtigen Passworts dieses genannt werden. BlueWallet öffnet dann die Wallet, welche im zweiten Speicher zur Täuschung angelegt ist, und der Hauptspeicher bleibt geheim und sicher.",
"help2": "Der zweite Speicher ist funktional identisch. Zahle auf die darin angelegte Wallet einen Minimalbetrag ein, um die Täuschung glaubhafter zu machen.",
"password_should_not_match": "Das Passwort für den täuschenden Speicher darf nicht mit dem deines Hauptspeichers übereinstimmen",
"title": "Glaubhafte Täuschung"
},
"pleasebackup": {
"ask": "Ist die Wiederherstellungs-Phrase des Wallets gesichert? Ohne Sie lässt sich nie mehr auf die bitcoin zugreifen und sie wären für immer verloren, sollte das Gerät verloren oder kaputt gehen.",
"ask": "Ist die Wiederherstellungs-Phrase der Wallet gesichert? Ohne sie lässt sich nie mehr auf die Bitcoin zugreifen und sie wären für immer verloren, sollte das Gerät verloren oder kaputt gehen.",
"ask_no": "Nein, habe ich nicht.",
"ask_yes": "Ja, habe ich.",
"ok": "Ok, sie sind notiert.",
"ok_lnd": "Die Sicherung ist erstellt.",
"text": "Unbedingt die mnemonischen Wörter auf Papier schreiben.\nDiese Wörter sind das Backup zur Wallet-Wiederherstellung.",
"text_lnd": "Zur Wiederherstellung des Wallet im Verlustfall bitte dieses Wallet-Backup sichern. ",
"title": "Dein Wallet ist erstellt."
"text": "Unbedingt die Seed-Wörter auf Papier schreiben.\nDiese Wörter sind das Backup zur Wallet-Wiederherstellung.",
"text_lnd": "Zur Wiederherstellung der Wallet im Verlustfall bitte dieses Wallet-Backup sichern.",
"title": "Deine Wallet ist erstellt."
},
"receive": {
"details_create": "Erstelle",
@ -111,7 +112,7 @@
"bip47_explanation": "Zahlungscodes sind eine universelle Adresse. Sie vermeiden die Offenlegung der Wallet-Adressen, werden aber nicht durch alle Dienste unterstützt."
},
"send": {
"provided_address_is_invoice": "Diese Adresse ist für eine Lightning-Rechnung. Um diese Rechnung zu zahlen ist ein Lightning Wallet zu verwenden.",
"provided_address_is_invoice": "Diese Adresse ist für eine Lightning-Rechnung. Um diese Rechnung zu zahlen, ist eine Lightning-Wallet zu verwenden.",
"broadcastButton": "Ins Netzwerk übertragen",
"broadcastError": "Fehler",
"broadcastNone": "Rohtransaktion eingeben",
@ -126,7 +127,7 @@
"create_fee": "Gebühr",
"create_memo": "Notiz",
"create_satoshi_per_vbyte": "Satoshi pro vByte",
"create_this_is_hex": "Dies ist die signierte Transaktion. Hexadezimal dargestellt und bereit zu Übertragung ins Netzwerk.",
"create_this_is_hex": "Dies ist die signierte Transaktion. Hexadezimal dargestellt und bereit zur Übertragung ins Netzwerk.",
"create_to": "An",
"create_tx_size": "Transaktionsgröße",
"create_verify": "Verifiziere auf coinb.in",
@ -156,7 +157,6 @@
"details_next": "Weiter",
"details_no_signed_tx": "Die ausgewählte Datei enthält keine importierbare signierte Transaktion.",
"details_note_placeholder": "Eigene Bezeichnung",
"counterparty_label_placeholder": "Kontaktnamen bearbeiten",
"details_scan": "Scannen",
"details_scan_hint": "Zum Importieren / Scannen zweimal tippen",
"details_scan_error": "Scan-Fehler",
@ -168,7 +168,7 @@
"dynamic_next": "Nächste",
"dynamic_prev": "Vorherige",
"dynamic_start": "Start",
"dynamic_stop": "Stop",
"dynamic_stop": "Stopp",
"fee_10m": "10min",
"fee_1d": "1T",
"fee_3h": "3h",
@ -184,14 +184,14 @@
"input_done": "Fertig",
"input_paste": "Einfügen",
"input_total": "Gesamt:",
"permission_camera_message": "BlueWallet braucht Deine Erlaubnis, um die Kamera zu nutzen.",
"permission_camera_message": "BlueWallet braucht deine Erlaubnis, um die Kamera zu nutzen.",
"psbt_sign": "Transaktion signieren",
"invalid_psbt": "Ungültige PSBT bereitgestellt.",
"open_settings": "Einstellungen öffnen",
"permission_storage_denied_message": "BlueWallet kann die Datei nicht speichern. Dazu in den Systemeinstellungen der App BlueWallet das Recht erteilen, den internen Speicher zu verwenden.",
"permission_storage_title": "Speicherzugriffsrecht",
"psbt_clipboard": "In die Zwischenablage kopieren",
"psbt_this_is_psbt": "Dies ist eine partiell signierte Bitcoin-Transaktion (PSBT). Zum Senden mithilfe der Hardware-Wallet final signieren.",
"psbt_this_is_psbt": "Dies ist eine partiell signierte Bitcoin-Transaktion (PSBT). Zum Senden mithilfe der Hardware Wallet final signieren.",
"psbt_tx_export": "In Datei exportieren",
"no_tx_signing_in_progress": "Keine Transaktionsignierung in Arbeit",
"outdated_rate": "Kurs zuletzt aktualisiert: {date}",
@ -203,14 +203,14 @@
"success_done": "Fertig",
"txSaved": "Die Transaktionsdatei ({filePath}) wurde gespeichert.",
"file_saved_at_path": "Die Datei ({filePath}) wurde gespeichert.",
"cant_send_to_silentpayment_adress": "Diese Wallet kann nicht an Stille Zahlung Adressen senden",
"cant_send_to_bip47": "Dieses Wallet kann nicht an BIP47 Zahlungscodes senden",
"cant_send_to_silentpayment_adress": "Diese Wallet kann nicht an Silent-Payment-Adressen senden",
"cant_send_to_bip47": "Diese Wallet kann nicht an BIP47-Zahlungscodes senden",
"cant_find_bip47_notification": "Diesen Zahlungscode zuerst zu den Kontakten hinzufügen ",
"problem_with_psbt": "PSBT-Problem"
},
"settings": {
"about": "Über",
"about_awesome": "Entwickelt mt dem eindrucksvollen",
"about_awesome": "Entwickelt mit dem eindrucksvollen",
"about_backup": "Stets die Backup-Phrase sichern!",
"about_free": "BlueWallet ist kostenlose Open Source Software. Produziert von Bitcoin-Benutzern.",
"about_license": "MIT-Lizenz",
@ -225,17 +225,19 @@
"about_sm_github": "GitHub",
"about_sm_telegram": "Telegram-Channel",
"privacy_temporary_screenshots": "Bildschirmaufnahme erlauben",
"privacy_temporary_screenshots_instructions": "Der Schutz vor Bildschirmaufnahmen wird vorübergehend deaktiviert, wodurch Screenshots und Bildschirmaufzeichnungen möglich sind. Der Schutz wird automatisch reaktiviert, wenn Sie BlueWallet schließen und erneut öffnen.",
"privacy_temporary_screenshots_instructions": "Der Schutz vor Bildschirmaufnahmen wird vorübergehend deaktiviert, wodurch Screenshots und Bildschirmaufzeichnungen möglich sind. Der Schutz wird automatisch reaktiviert, wenn du BlueWallet schließt und erneut öffnest.",
"biometrics": "Biometrie",
"biometrics_no_longer_available": "Die Geräteeinstellungen stimmen nicht mehr mit den App Sicherheitseinstellungen überein. Um die Änderungen zu übernehmen, die Biometrie oder den Passcode einrichten, dann die App neu starten.",
"biom_10times": "Es wurde 10 Mal versucht, das Passwort einzugeben. Soll der Speicher zurückgesetzt werden? Dabei werden alle Wallets entfernt der Speicher entschlüsselt.",
"biometrics_no_longer_available": "Die Geräteeinstellungen stimmen nicht mehr mit den App-Sicherheitseinstellungen überein. Um die Änderungen zu übernehmen, die Biometrie oder den Passcode einrichten, dann die App neu starten.",
"biom_10times": "Es wurde 10 Mal versucht, das Passwort einzugeben. Soll der Speicher zurückgesetzt werden? Dabei werden alle Wallets entfernt und der Speicher entschlüsselt.",
"biom_conf_identity": "Bitte deine Identität bestätigen.",
"biom_no_passcode": "Um fortzufahren müssen auf dem Gerät entweder ein Sicherheitscode oder biometrische Daten aktiviert sein. Dies lässt sich in der App \"Einstellungen\" vornehmen.",
"biom_remove_decrypt": "Alle Wallet werden entfernt und der Speicher wird entschlüsselt. Wirklich fortfahren?",
"biom_no_passcode": "Um fortzufahren, müssen auf dem Gerät entweder ein Sicherheitscode oder biometrische Daten aktiviert sein. Dies lässt sich in der App „Einstellungen“ vornehmen.",
"biom_remove_decrypt": "Alle Wallets werden entfernt und der Speicher wird entschlüsselt. Wirklich fortfahren?",
"currency": "Währung",
"currency_source": "Der Kurs wird bezogen von",
"currency_fetch_error": "Beim Abrufen des Wechselkurses für die ausgewählte Währung trat ein Fehler auf.",
"default_title": "Beim Start",
"donate": "Spenden",
"donate_description": "Hilf uns, Blue kostenlos zu halten!",
"electrum_connected": "Verbunden",
"electrum_connected_not": "Nicht verbunden",
"electrum_error_connect": "Keine Verbindung zum angegebenen Electrum-Server möglich.",
@ -247,33 +249,35 @@
"electrum_port": "Port, üblich {example}",
"use_ssl": "SSL verwenden",
"electrum_saved": "Deine Änderungen wurden gespeichert. Zur Aktivierung ist ggf. ein Neustart von BlueWallet erforderlich.",
"set_electrum_server_as_default": "{server} als Standard Electrum-Server setzten?",
"set_electrum_server_as_default": "{server} als Standard-Electrum-Server festlegen?",
"set_lndhub_as_default": "{url} als Standard LNDhub-Server festlegen?",
"electrum_settings_server": "Electrum Server",
"electrum_settings_server": "Electrum-Server",
"electrum_status": "Status",
"electrum_preferred_server": "Präferierter Server",
"electrum_preferred_server_description": "Den Server eingeben, der die Wallet für alle Bitcoin-Aktivitäten verwenden soll. Sobald festgelegt, wird die Wallet um Salden abzufragen, Transaktionen zu senden und Netzwerkdaten abzurufen ausschliesslich diesen Server verwenden. Prüfen sie vorher, dass der Server vertrauenswürdig ist.",
"electrum_preferred_server_description": "Den Server eingeben, der die Wallet für alle Bitcoin-Aktivitäten verwenden soll. Sobald festgelegt, wird die Wallet ausschließlich diesen Server verwenden, um Salden abzufragen, Transaktionen zu senden und Netzwerkdaten abzurufen. Prüfe vorher, dass der Server vertrauenswürdig ist.",
"electrum_unable_to_connect": "Verbindung zu {server} kann nicht hergestellt werden.",
"electrum_history": "Historie",
"electrum_reset_to_default": "Dies lässt BlueWallet zufällig einen Server aus der Liste der Server auswählen.",
"electrum_reset": "Zurücksetzten",
"electrum_reset": "Zurücksetzen",
"electrum_reset_to_default_and_clear_history": "Auf die Standardeinstellungen zurücksetzen und den Verlauf löschen.",
"encrypt_decrypt": "Speicher entschlüsseln",
"encrypt_decrypt_q": "Die Speicherverschlüsselung wirklich aufheben? Hiermit werden die Wallet ohne Passwortschutz direkt benutzbar. ",
"encrypt_decrypt_q": "Die Speicherverschlüsselung wirklich aufheben? Hiermit werden die Wallets ohne Passwortschutz direkt benutzbar.",
"encrypt_enc_and_pass": "Passwortgeschützt",
"encrypt_storage_explanation_headline": "Speicherverschlüsselung aktivieren",
"encrypt_storage_explanation_description_line1": "Die Aktivierung der Speicherverschlüsselung fügt Ihrer App ein zusätzlicher Schutz hinzu. Die Art und Weise, wie die Daten auf Ihrem Gerät gespeichert werden, macht es anderen damit schwieriger, ohne Erlaubnis darauf zuzugreifen.",
"encrypt_storage_explanation_description_line2": "Diese Verschlüsselung betrifft den Zugriff auf die im Gerät gespeicherten Schlüssel, schützt also die Wallets. Die Wallet selbst werden dabei nicht mit einem Passwort oder einem anderen zusätzlichen Schutz versehen.",
"encrypt_storage_explanation_description_line1": "Die Aktivierung der Speicherverschlüsselung fügt deiner App eine zusätzliche Schutzschicht hinzu. Die Art und Weise, wie die Daten auf deinem Gerät gespeichert werden, macht es anderen damit schwieriger, ohne Erlaubnis darauf zuzugreifen.",
"encrypt_storage_explanation_description_line2": "Diese Verschlüsselung betrifft den Zugriff auf die im Gerät gespeicherten Schlüssel, schützt also die Wallets. Die Wallets selbst werden dabei nicht mit einem Passwort oder einem anderen zusätzlichen Schutz versehen.",
"i_understand": "Ich habe verstanden",
"block_explorer": "Block-Explorer",
"block_explorer_preferred": "Bevorzugten Block-Explorer verwenden",
"block_explorer_error_saving_custom": "Fehler beim Speichern des bevorzugten Block-Explorers.",
"block_explorer": "Block Explorer",
"block_explorer_preferred": "Bevorzugten Block Explorer verwenden",
"block_explorer_error_saving_custom": "Fehler beim Speichern des bevorzugten Block Explorers.",
"encrypt_title": "Sicherheit",
"encrypt_tstorage": "Speicher",
"encrypt_use": "Benutze {type}",
"set_as_preferred": "Als bevorzugt festlegen",
"set_as_preferred_electrum": "Mit der Wahl von {host}:{port} als präferierten Server wird die zufällige Verbindung zu einem der vorgeschlagenen Servern abgeschaltet.",
"encrypted_feature_disabled": "Diese Funktion kann bei verschlüsseltem Speicher nicht genutzt werden.",
"biometrics_fail": "Wenn {type} nicht aktiviert ist oder entsperrt werden kann, alternativ Ihren Gerätepasscode verwenden.",
"encrypt_use_expl": "{type} wird zur Identitätsbestätigung verwendet, bevor eine Transaktion gesendet, ein Wallet entsperrt, exportiert oder gelöscht wird.",
"biometrics_fail": "Wenn {type} nicht aktiviert ist oder entsperrt werden kann, alternativ den Gerätepasscode verwenden.",
"general": "Allgemein",
"general_continuity": "Kontinuität",
"general_continuity_e": "Wenn aktiviert werden ausgewählte Wallets und deren Transaktionen auf deinen anderen Apple iCloud Geräten angezeigt.",
@ -287,10 +291,11 @@
"lightning_error_lndhub_uri_tor": "Ungültige LNDhub-URI. Orbot-App verbinden und es erneut versuchen.",
"lightning_saved": "Deine Änderungen wurden gespeichert.",
"lightning_settings": "Lightning-Einstellungen",
"lightning_settings_explain": "Um sich mit Ihrem eigenen LND-Knoten zu verbinden, LNDhub installieren und dessen URL hier in den Einstellungen eintragen. Achtung. Nur Geldbörsen, die nach dem Speichern der Änderungen erstellt werden, verbinden sich mit dem angegebenen LNDhub.",
"lightning_settings_explain": "Um sich mit dem eigenen LND-Knoten zu verbinden, LNDhub installieren und dessen URL hier in den Einstellungen eintragen. Achtung: Nur Wallets, die nach dem Speichern der Änderungen erstellt werden, verbinden sich mit dem angegebenen LNDhub.",
"lndhub_github": "GitHub-Repository",
"network": "Netzwerk",
"network_broadcast": "Transaktion publizieren",
"network_electrum": "Electrum Server",
"network_electrum": "Electrum-Server",
"electrum_suggested_description": "Ist kein Bevorzugter festgelegt, wird zufällig einer der vorgeschlagenen Server genutzt.",
"not_a_valid_uri": "Keine gültige URI",
"notifications": "Benachrichtigungen",
@ -307,13 +312,13 @@
"privacy_do_not_track": "Diagnosedaten ausschalten",
"privacy_do_not_track_explanation": "Leistungs- und Zuverlässigkeitsinformationen nicht zur Analyse einreichen.",
"rate": "Kurs",
"push_notifications_explanation": "Durch das Aktivieren von Benachrichtigungen wird das Gerätetoken zusammen mit den Wallet-Adressen inkl. künftigen Transaktions-IDs, an den Benachrichtigungsdienst gesendet. Das Gerätetoken erlaubt Benachrichtigungen an das Gerät zu adressieren, die Wallet-Informationen ermöglichen, eingehende Transaktionen und Bestätigungen zu notifizieren.\n\nNach der Aktivierung werden nur künftige, nicht aber vergangene Transaktions-IDs übertragen.\n\nMit der Deaktivierung, werden alle diese Informationen wieder vom Server entfernt. Das Gleiche passiert beim löschen der Wallet-App.",
"push_notifications_explanation": "Durch das Aktivieren von Benachrichtigungen wird das Gerätetoken zusammen mit den Wallet-Adressen inkl. künftigen Transaktions-IDs an den Benachrichtigungsdienst gesendet. Das Gerätetoken erlaubt es, Benachrichtigungen an das Gerät zu adressieren; die Wallet-Informationen ermöglichen, über eingehende Transaktionen und Bestätigungen zu informieren.\n\nNach der Aktivierung werden nur künftige, nicht aber vergangene Transaktions-IDs übertragen.\n\nMit der Deaktivierung werden alle diese Informationen wieder vom Server entfernt. Das Gleiche passiert beim Löschen einer Wallet aus der App.",
"selfTest": "Selbsttest",
"save": "Speichern",
"saved": "Gespeichert",
"success_transaction_broadcasted": "Erfolg! Diene Transaktion wurde übertragen.",
"success_transaction_broadcasted": "Erfolg! Deine Transaktion wurde übertragen.",
"total_balance": "Gesamtes Guthaben",
"total_balance_explanation": "Zeigt das Wallet Guthaben auf dem Widget deiner Homepage",
"total_balance_explanation": "Zeigt das Gesamtguthaben aller Wallets auf dem Widget deines Startbildschirms an.",
"widgets": "Widgets",
"tools": "Werkzeuge"
},
@ -330,7 +335,6 @@
"transaction_loading_error": "Es gab ein Problem beim Laden der Transaktion. Bitte später erneut versuchen.",
"transaction_not_available": "Transaktion ist nicht verfügbar",
"confirmations_lowercase": "{confirmations} Bestätigungen",
"copy_link": "Link kopieren",
"expand_note": "Bezeichnung erweitern",
"cpfp_create": "Erstellen",
"cpfp_exp": "BlueWallet erzeugt eine weitere Transaktion, welche die unbestätigte Transaktion ausgibt. Das höhere Gebührentotal beider Transaktionen führt zu einer schnelleren Verarbeitung (Child Pays for Parent).",
@ -339,10 +343,9 @@
"details_balance_hide": "Guthaben verbergen",
"details_balance_show": "Guthaben zeigen",
"details_copy": "Kopieren",
"details_copy_block_explorer_link": "Block-Explorer Link kopieren",
"details_copy_block_explorer_link": "Block Explorer Link kopieren",
"details_copy_note": "Beschreibung kopieren",
"details_copy_txid": "Transaktions-ID kopieren",
"details_from": "Eingang",
"details_inputs": "Eingänge",
"details_outputs": "Ausgänge",
"date": "Datum",
@ -364,8 +367,8 @@
"eta_10m": "In ca. 10 Min. verbucht.",
"eta_3h": "In ca. 3 Std. verbucht.",
"eta_1d": "In ca. 1 Tag verbucht.",
"view_wallet": "{walletLabel} anzeigen",
"list_title": "Transaktionen",
"list_title_sent": "Gesendet",
"list_title_received": "Empfangen",
"transaction": "Transaktion",
"open_url_error": "Der Standardbrowser kann die URL nicht öffnen. Bitte diesen ggf. ändern, um es erneut zu versuchen.",
@ -375,32 +378,46 @@
"status_cancel": "Transaktion abbrechen",
"transactions_count": "Anzahl Transaktionen",
"txid": "Transaktions-ID",
"from": "Von: {counterparty}",
"to": "Zu: {counterparty}",
"updating": "Aktualisiere....",
"watchOnlyWarningTitle": "Sicherheitswarnung",
"watchOnlyWarningDescription": "Achtung. Betrüger verwenden „Watch-only“-Wallets um Nutzern echte Wallet vorzutäsuchen. Sie können mit diesem Wallet keine Gelder kontrollieren oder senden, sondern nur den Kontostand einsehen.",
"watchOnlyWarningDescription": "Achtung: Betrüger verwenden „Watch-only\"-Wallets, um Nutzern echte Wallets vorzutäuschen. Mit dieser Wallet lassen sich keine Gelder kontrollieren oder senden, sondern nur der Kontostand einsehen.",
"custom_fee_warning_title": "Warnung",
"custom_fee_warning_description": "Gebühren unter 1 sat/vB sind gültig, aber werden ggf. nicht weitergeleitet."
"custom_fee_warning_description": "Gebühren unter 1 sat/vB sind gültig, werden aber ggf. nicht weitergeleitet.",
"details_eta_analyzing": "Analysiere...",
"details_sent": "Gesendet",
"details_section": "Details",
"details_explorer": "Explorer",
"details_network_fee": "Netzwerkgebühr",
"details_to_address": "An",
"details_id": "ID",
"details_note": "Notiz",
"details_add_note": "Hinzufügen",
"details_advanced": "Fortgeschritten",
"details_fee_rate": "Gebührenrate",
"details_size": "Größe",
"details_virtual_size": "Virtuelle Größe",
"details_tx_hex": "Tx Hex",
"details_inputs_count": "Eingänge ({count})",
"details_outputs_count": "Ausgänge ({count})"
},
"wallets": {
"add_bitcoin": "Bitcoin",
"add_bitcoin_explain": "Einfache und leistungsstarke Bitcoin Wallet",
"add_create": "Erstellen",
"total_balance": "Gesamtes Guthaben",
"add_entropy_reset_title": "Entropie zurücksetzten",
"add_entropy_reset_message": "Ein Wechsel des Wallet Typs wird die Entropie zurücksetzten. Wirklich weiterfahren? ",
"add_entropy_reset_title": "Entropie zurücksetzen",
"add_entropy_reset_message": "Ein Wechsel des Wallet-Typs wird die Entropie zurücksetzen. Wirklich fortfahren?",
"add_entropy": "Entropie",
"add_entropy_bytes": "{bytes} Bytes Entropie",
"add_entropy_generated": "{gen} Bytes an generierter Entropie ",
"add_entropy_generated": "{gen} Bytes an generierter Entropie",
"add_entropy_provide": "Entropie selbst erzeugen",
"add_entropy_remain": "{gen} Bytes an generierter Entropie. Die restlichen {rem} Bytes werden vom Zufallsgenerator des Systems ergänzt.",
"add_import_wallet": "Wallet importieren",
"add_lightning": "Lightning",
"add_lightning_explain": "Für Ausgaben mit sofortigen Transaktionen",
"add_lndhub": "Ihren LNDhub verbinden",
"add_lndhub": "Mit deinem LNDhub verbinden",
"add_lndhub_error": "Die Adresse verweist auf einen ungültigen LNDhub-Knoten.",
"add_lndhub_placeholder": "Bitcoin Knoten-Adresse",
"add_lndhub_placeholder": "Knoten-Adresse",
"add_placeholder": "Mein Wallet",
"add_title": "Wallet hinzufügen",
"add_wallet_name": "Wallet Name",
@ -408,42 +425,46 @@
"add_wallet_seed_length": "Seedlänge",
"add_wallet_seed_length_12": "12 Wörter",
"add_wallet_seed_length_24": "24 Wörter",
"clipboard_bitcoin": "In der Zwischenablage ist eine Bitcoin Adresse. Soll diese für eine Transaktion verwendet werden?",
"clipboard_bitcoin": "In der Zwischenablage ist eine Bitcoin-Adresse. Soll diese für eine Transaktion verwendet werden?",
"clipboard_lightning": "In der Zwischenablage ist eine Lightning-Rechnung. Soll diese für eine Transaktion verwendet werden?",
"clear_clipboard_on_import": "Zwischenablage beim Import löschen",
"details_address": "Adresse",
"details_advanced": "Fortgeschritten",
"details_are_you_sure": "Wirklich ok?",
"details_connected_to": "Verbunden mit",
"details_del_wb_err": "Das angegebene Guthaben deckt sich nicht mit dem Guthaben des Wallet. Bitte versuche es erneut.",
"details_del_wb_q": "Dieses Wallet enthält noch bitcoin. Ohne vorhandenes Backup der mnemonischen Phrase sind diese unwiederbringlich verloren. Um ein versehentliches Löschen zu vermeiden, gib bitte das Wallet-Guthaben von {balance} Satoshis ein.",
"details_del_wb_err": "Das angegebene Guthaben deckt sich nicht mit dem Guthaben der Wallet. Bitte versuche es erneut.",
"details_del_wb_q": "Dieses Wallet enthält noch Bitcoin. Ohne vorhandenes Backup des Seeds sind diese unwiederbringlich verloren. Um ein versehentliches Löschen zu vermeiden, gib bitte das Wallet-Guthaben von {balance} Satoshis ein.",
"details_delete": "Löschen",
"details_delete_wallet": "Wallet löschen",
"details_derivation_path": "Ableitungspfad",
"details_display": "Auf der Startseite anzeigen",
"details_export_backup": "Exportieren / Backup",
"details_export_history": "Verlauf als CSV exportieren",
"details_master_fingerprint": "Fingerabdruckkennung",
"details_multisig_type": "Mehrfachsignatur",
"details_master_fingerprint": "Master-Fingerabdruck",
"details_multisig_type": "Multisig",
"details_show_xpub": "Wallet xPub zeigen",
"details_show_addresses": "Adressen anzeigen",
"details_title": "Wallet",
"wallets": "Wallets",
"swipe_balance_hide": "Verbergen",
"swipe_balance_show": "Anzeigen",
"drag_to_reorder": "Ziehen zum Neuanordnen",
"clear_search": "Suche löschen",
"details_type": "Typ",
"details_use_with_hardware_wallet": "Hardware Wallet nutzen",
"details_yes_delete": "Ja, löschen",
"enter_bip38_password": "Passwort zur Entschlüssellung eingeben",
"enter_bip38_password": "Passwort zur Entschlüsselung eingeben",
"export_title": "Wallet exportieren",
"import_do_import": "Importieren",
"import_passphrase": "Passphrase",
"import_passphrase_title": "Passphrase",
"import_passphrase_message": "Wenn genutzt, die Passphrase eingeben",
"import_error": "Fehler beim Import. Ist die Eingabe korrekt?",
"import_explanation": "Gib hier die mnemonische Phrase, den privaten Schlüssel, WIF oder was immer du hast ein. BlueWallet wird bestmöglich das Format interpretieren und die Wallet importieren.",
"import_explanation": "Gib hier den Seed, den öffentlichen Schlüssel, WIF oder was immer du hast ein. BlueWallet wird bestmöglich das Format interpretieren und die Wallet importieren.",
"import_imported": "Importiert",
"import_scan_qr": "QR-Code scannen oder Datei importieren",
"import_success": "Wallet wurde erfolgreich importiert.",
"import_success_watchonly": "Deine Wallet wurde erfolgreich importiert. WARNUNG: Dies ist eine reine Wallet nur zum Anschauen, du kannst NICHT mit ihr ausgeben.",
"import_success_watchonly": "Deine Wallet wurde erfolgreich importiert. WARNUNG: Dies ist eine reine Watch-only-Wallet, du kannst von ihr NICHT ausgeben.",
"import_search_accounts": "Konten suchen",
"import_title": "Importieren",
"learn_more": "Mehr erfahren",
@ -463,7 +484,7 @@
"list_create_a_wallet": "Wallet hinzufügen",
"list_create_a_wallet_text": "Kostenlose Wallets, \nunbegrenzt erstellbar.",
"list_empty_txs1": "Deine Transaktionen erscheinen hier",
"list_empty_txs1_lightning": "Verwende das Lightning Wallet für Deine täglichen Bezahlungen. Lightning Transaktionen sind konkurrenzlos günstig und verblüffend schnell.",
"list_empty_txs1_lightning": "Verwende die Lightning-Wallet für deine täglichen Bezahlungen. Lightning-Transaktionen sind konkurrenzlos günstig und verblüffend schnell.",
"list_empty_txs2": "Beginne mit deinem Wallet.",
"list_empty_txs2_lightning": "\nDrücke zum Starten «Beträge verwalten», um das Wallet aufzuladen.",
"list_latest_transaction": "Letzte Transaktion",
@ -473,30 +494,29 @@
"list_long_scan": "QR Code scannen",
"list_title": "Wallets",
"list_tryagain": "Nochmal versuchen",
"no_ln_wallet_error": "Vor Bezahlung einer Lightning Rechnung zuerst ein Lightning Wallet eröffnen.",
"no_ln_wallet_error": "Vor Bezahlung einer Lightning-Rechnung zuerst eine Lightning-Wallet eröffnen.",
"looks_like_bip38": "Passwortgeschützter Privatschlüssel (BIP38) erkannt.",
"manage_title": "Wallets verwalten",
"no_results_found": "Keine Ergebnisse gefunden.",
"please_continue_scanning": "Bitte Scanvorgang fortsetzten",
"select_no_bitcoin": "Es sind momentan keine Bitcoin Wallets verfügbar.",
"select_no_bitcoin_exp": "Eine Bitcoin Wallet ist Voraussetzung dafür, um eine Lightning Wallet zu befüllen. Bitte erstelle oder importiere eines.",
"please_continue_scanning": "Bitte Scanvorgang fortsetzen",
"select_no_bitcoin": "Es sind momentan keine Bitcoin-Wallets verfügbar.",
"select_no_bitcoin_exp": "Eine Bitcoin-Wallet ist Voraussetzung dafür, um eine Lightning-Wallet zu befüllen. Bitte erstelle oder importiere eine.",
"select_wallet": "Wähle eine Wallet",
"xpub_copiedToClipboard": "In die Zwischenablage kopiert.",
"pull_to_refresh": "Zum Aktualisieren ziehen",
"warning_do_not_disclose": "Niemals die nachfolgenden Informationen teilen",
"scan_import": "Diesen QR-Code zum Import der Wallet in einer anderen App scannen.",
"write_down_header": "Manuelles Backup erstellen",
"write_down": "Diese Worte aufschreiben und sicher verwahren. Sie sind nötig um die Wallet später wiederherzustellen.",
"write_down": "Diese Worte aufschreiben und sicher verwahren. Sie sind nötig, um die Wallet später wiederherzustellen.",
"wallet_type_this": "Wallet vom Typ {type}.",
"share_number": "Teil {number}",
"copy_ln_url": "Diese URL kopieren und sicher speichern. Sie ist um nötig die Wallet später wiederherzustellen.",
"copy_ln_public": "Diese Information kopieren und sicher speichern. Sie ist nötig um die Wallet später wiederherzustellen.",
"copy_ln_url": "Diese URL kopieren und sicher speichern. Sie ist nötig, um die Wallet später wiederherzustellen.",
"copy_ln_public": "Diese Information kopieren und sicher speichern. Sie ist nötig, um die Wallet später wiederherzustellen.",
"add_ln_wallet_first": "Bitte zuerst ein Lightning-Wallet hinzufügen.",
"identity_pubkey": "Pubkey-Identität",
"xpub_title": "Wallet xPub",
"manage_wallets_search_placeholder": "Wallets, Adressen, Transaktionen und Memos suchen",
"more_info": "Mehr Infos",
"details_delete_wallet_error_message": "Problem beim Entfernen der Wallet aus Benachrichtigungen evtl. Netzwerkproblem oder schlechte Verbindung. Bei Fortfahren könnten Transaktions-Benachrichtigungen für diese Wallet weiterhin ankommen, selbst nach dessen Löschung.",
"details_delete_wallet_error_message": "Problem beim Entfernen der Wallet aus Benachrichtigungen evtl. Netzwerkproblem oder schlechte Verbindung. Bei Fortfahren könnten Transaktions-Benachrichtigungen für diese Wallet weiterhin ankommen, selbst nach deren Löschung.",
"details_delete_anyway": "Trotzdem löschen"
},
"total_balance_view": {
@ -512,20 +532,20 @@
"default_label": "Multisignatur Tresor",
"multisig_vault_explain": "Höchste Sicherheit für große Beträge",
"provide_signature": "Schlüssel eingeben",
"provide_signature_details": "Mit Ihrem Gerät und der Wallet, in der der Schlüssel ist, die Transaktion signieren.",
"provide_signature_details": "Mit dem Gerät und der Wallet, in der der Schlüssel ist, die Transaktion signieren.",
"provide_signature_details_bluewallet": "Zum Menü des Senden-Bildschirms gehen, dort auswählen",
"provide_signature_next_steps": "Signierte Transaktion scannen oder importieren",
"provide_signature_next_steps_details": "Sobald Ihre Wallet die Transaktion signiert hat, den bereitgestellten QR-Code scannen oder die Datei importieren. Alle Transaktionsdetails vor dem Übertragen prüfen.",
"provide_signature_next_steps_details": "Sobald die Wallet die Transaktion signiert hat, den bereitgestellten QR-Code scannen oder die Datei importieren. Alle Transaktionsdetails vor dem Übertragen prüfen.",
"vault_key": "Tresor-Schlüssel: {number}",
"required_keys_out_of_total": "Erforderliche Schlüssel aus dem Total",
"fee": "Gebhür: {number}",
"fee": "Gebühr: {number}",
"fee_btc": "{number} BTC",
"confirm": "Bestätigen",
"header": "Senden",
"share": "Teilen",
"view": "Anzeigen",
"shared_key_detected": "Geteilte Mitsignierer",
"shared_key_detected_question": "Ein Mitsignierer wurde mit Ihnen geteilt. Diesen jetzt importierten?",
"shared_key_detected_question": "Ein Mitsignierer wurde mit dir geteilt. Diesen jetzt importieren?",
"manage_keys": "Schlüssel verwalten",
"how_many_signatures_can_bluewallet_make": "Anzahl Signaturen durch BlueWallet",
"signatures_required_to_spend": "Benötigte Signaturen {number}",
@ -540,7 +560,7 @@
"legacy_title": "Altformat",
"co_sign_transaction": "Transaktion signieren",
"what_is_vault": "Ein Tresor ist ein ",
"what_is_vault_numberOfWallets": "{m}-von-{n} Multisignatur",
"what_is_vault_numberOfWallets": "{m}-von-{n} Multisig",
"what_is_vault_wallet": "wallet",
"vault_advanced_customize": "Tresor Einstellungen",
"needs": "Es braucht",
@ -551,39 +571,39 @@
"quorum_header": "Signaturfähigkeit",
"of": "von",
"wallet_type": "Typ des Wallets",
"invalid_mnemonics": "Ungültige mnemonische Phrase.",
"invalid_cosigner": "Die Mitsignierer Daten sind ungültig",
"not_a_multisignature_xpub": "Dies ist keine XPUB eines Multisignatur-Wallet!",
"invalid_mnemonics": "Ungültiger Seed.",
"invalid_cosigner": "Die Mitsignierer-Daten sind ungültig",
"not_a_multisignature_xpub": "Dies ist kein xPub einer Multisig-Wallet!",
"invalid_cosigner_format": "Falscher Mitsignierer: Dies ist kein Mitsignierer für das Format {format}.",
"create_new_key": "Neuerstellen",
"scan_or_open_file": "Datei scannen oder öffnen",
"i_have_mnemonics": "Seed des Schlüssels importieren",
"type_your_mnemonics": "Seed zum Import deines Tresorschlüssels eingeben",
"this_is_cosigners_xpub": "Dies ist der xPub für Mitsigierer zum Import in ein anderes Wallet. Er kann sicher mit anderen geteilt werden.",
"type_your_mnemonics": "Seed zum Import deines Tresor-Schlüssels eingeben",
"this_is_cosigners_xpub": "Dies ist der xPub für Mitsignierer zum Import in eine andere Wallet. Er kann sicher mit anderen geteilt werden.",
"this_is_cosigners_xpub_airdrop": "Zur AirDrop-Freigabe müssen alle Empfänger auf dem Koordinierungsbildschirm sein.",
"wallet_key_created": "Dein Tresorschlüssel wurde erstellt. Nimm dir Zeit ein sicheres Backup des mnemonischen Seeds herzustellen. ",
"are_you_sure_seed_will_be_lost": "Wirklich ok? Der mnemonischer Seed ist ohne Backup verloren!",
"wallet_key_created": "Dein Tresor-Schlüssel wurde erstellt. Nimm dir Zeit, ein sicheres Backup des Seeds herzustellen.",
"are_you_sure_seed_will_be_lost": "Wirklich? Der Seed ist ohne Backup verloren!",
"forget_this_seed": "Seed vergessen und xPub verwenden.",
"view_edit_cosigners": "Mitsignierer Anzeigen/Bearbeiten",
"view_edit_cosigners": "Mitsignierer anzeigen/bearbeiten",
"this_cosigner_is_already_imported": "Dieser Mitsignierer ist schon vorhanden.",
"export_signed_psbt": "Signierte PSBT exportieren",
"input_fp": "Fingerabdruckkennung eingeben",
"input_fp": "Fingerprint eingeben",
"input_fp_explain": "Überspringen, um den Standard zu verwenden (00000000)",
"input_path": "Ableitungspfad eingeben",
"input_path_explain": "Überspringen, um den Standard zu verwenden ({default})",
"ms_help": "Hilfe",
"ms_help_title": "Tipps und Tricks zur Funktionsweise von Multisig",
"ms_help_text": "Ein Wallet mit mehreren Schlüsseln zur gemeinsamen Verwahrung oder zur Erhöhung der Sicherheit.",
"ms_help_text": "Eine Wallet mit mehreren Schlüsseln zur gemeinsamen Verwahrung oder zur Erhöhung der Sicherheit.",
"ms_help_title1": "Dazu sind mehrere Geräte empfohlen.",
"ms_help_1": "Der Tresor funktioniert mit weiteren BlueWallet Apps und PSBT kompatiblen Wallets wie Electrum, Specter, Coldcard, Keystone, etc.",
"ms_help_1": "Der Tresor funktioniert mit weiteren BlueWallet-Apps und PSBT-kompatiblen Wallets wie Electrum, Specter, Coldcard, Keystone, etc.",
"ms_help_title2": "Schlüssel bearbeiten",
"ms_help_2": "Alle Tresor Schlüssel lassen sich auf diesem Geräts erstellen und später löschen. Dazu in den Wallet-Einstellungen die Mitsignierer bearbeiten. Sind alle Tresorschlüssel auf dem gleichen Gerät, ist die Sicherheit, die eines regulären Bitcoin Wallet.",
"ms_help_2": "Alle Tresor-Schlüssel lassen sich auf diesem Gerät erstellen und später löschen. Dazu in den Wallet-Einstellungen die Mitsignierer bearbeiten. Sind alle Tresor-Schlüssel auf dem gleichen Gerät, ist die Sicherheit die einer regulären Bitcoin-Wallet.",
"ms_help_title3": "Tresor-Sicherungen",
"ms_help_3": "Die Tresor Backup und Watch-only Export Funktion ist in den Wallet-Optionen. Geht ein Seed verloren, ist das Backup zur Wiederherstellung des Wallet essenziell. Es ist wie eine Karte zu Deinem Vermögen.",
"ms_help_3": "Die Tresor-Backup- und Watch-only-Export-Funktion ist in den Wallet-Optionen. Geht ein Seed verloren, ist das Backup zur Wiederherstellung der Wallet essenziell. Es ist wie eine Karte zu deinem Vermögen.",
"ms_help_title4": "Tresor importieren",
"ms_help_4": "Um ein Tresor zu importieren, die Multisignatur Backupdatei mittels Import-Funktion laden. Seeds der erweiterten Schlüssel während der Tresor-Erstellung hinzufügen.",
"ms_help_4": "Um einen Tresor zu importieren, die Multisig-Backupdatei mittels Import-Funktion laden. Wenn nur Seeds und xPubs vorhanden sind, können diese während der Tresor-Erstellung einzeln hinzugefügt werden.",
"ms_help_title5": "Erweiterte Optionen",
"ms_help_5": "Der geplante Tresor erfordert 2 von 3 Signaturen. Zum Ändern der Anzahl oder des Adresstyps unter Einstellungen > Allgemein den erweiterten Modus aktivieren."
"ms_help_5": "Standardmäßig erstellt BlueWallet einen 2-von-3-Tresor. Zum Ändern der Anzahl oder des Adresstyps unter Einstellungen > Allgemein den erweiterten Modus aktivieren."
},
"is_it_my_address": {
"title": "Ist dies meine Adresse?",
@ -594,21 +614,22 @@
"view_qrcode": "QR-Code anzeigen"
},
"autofill_word": {
"enter": "Die unvollendete mnemonische Phrase eingeben",
"generate_word": "Erzeuge das letzte Word",
"error": "Die Eingabe ist keine unvollendete 11- oder 23 Wort Phrase. Bitte erneut versuchen."
"enter": "Den unvollständigen Seed eingeben",
"generate_word": "Erzeuge das letzte Wort",
"error": "Die Eingabe ist keine unvollendete 11- oder 23-Wort-Phrase. Bitte erneut versuchen.",
"title": "Letztes Seed-Wort"
},
"cc": {
"change": "Ändern",
"coins_selected": "Anz. gewählte Münzen ({number})",
"selected_summ": "{value} ausgewählt",
"empty": "Dieses Wallet hat aktuell keine Münzen.",
"empty": "Diese Wallet hat aktuell keine Münzen.",
"freeze": "einfrieren",
"freezeLabel": "Einfrieren",
"freezeLabel_un": "Entblocken",
"freezeLabel_un": "Auftauen",
"header": "Münzkontrolle",
"use_coin": "Münzen benutzen",
"use_coins": "Benutze Münzen",
"use_coins": "Münzen benutzen",
"tip": "Wallet-Verwaltung zum Anzeigen, Beschriften, Einfrieren oder Auswählen von Münzen. Zur Mehrfachselektion auf die Farbkreise tippen.",
"sort_asc": "Aufsteigend",
"sort_desc": "Absteigend",
@ -626,15 +647,15 @@
},
"addresses": {
"copy_private_key": "Privaten Schlüssel kopieren",
"sensitive_private_key": "Warnung: Private Schlüssel sind gefahrvoll. Weiterfahren?",
"sign_title": "Meldung signieren/verifizieren",
"sensitive_private_key": "Warnung: Private Schlüssel sind hochsensibel. Fortfahren?",
"sign_title": "Nachricht signieren/verifizieren",
"sign_help": "Auf einer Bitcoin-Adresse basierende, kryptografische Signatur erstellen oder verifizieren.",
"sign_sign": "Signieren",
"sign_verify": "Verifizieren",
"sign_signature_correct": "Verifizierung erfolgreich!",
"sign_signature_incorrect": "Verifizierung fehlgeschlagen!",
"sign_placeholder_address": "Adresse",
"sign_placeholder_message": "Meldung",
"sign_placeholder_message": "Nachricht",
"sign_placeholder_signature": "Signatur",
"addresses_title": "Adressen",
"type_change": "Wechsel",
@ -669,13 +690,13 @@
"copy_payment_code": "Zahlungscode kopieren",
"hide_contact": "Kontakt ausblenden",
"rename": "Umbenennen",
"provide_name": "Neuer Kontaktnahme eingeben",
"provide_name": "Neuen Kontaktnamen eingeben",
"add_contact": "Kontakt hinzufügen",
"provide_payment_code": "Zahlungscode eingeben",
"invalid_pc": "Ungültiger Zahlungscode",
"notification_tx_unconfirmed": "Benachrichtigungstransaktion noch unbestätigt. Bitte warten",
"failed_create_notif_tx": "On-Chain Transaktion konnte nicht in erstellt werden",
"onchain_tx_needed": "On-Chain Transaktion benötigt.",
"failed_create_notif_tx": "On-Chain-Transaktion konnte nicht erstellt werden",
"onchain_tx_needed": "On-Chain-Transaktion benötigt.",
"notif_tx_sent": "Benachrichtigungstransaktion ist gesendet. Auf Bestätigung warten.",
"notif_tx": "Benachrichtigungstransaktion",
"not_found": "Zahlungscode nicht gefunden"

View File

@ -14,17 +14,38 @@
"success": "Επιτυχία",
"close": "Κλείσιμο",
"refresh": "Ανανέωση",
"enter_amount": "Εισαγωγή ενός ποσού"
"enter_amount": "Εισαγωγή ενός ποσού",
"copied": "Αντιγράφηκε!",
"discard_changes": "Απόρριψη αλλαγών;",
"discard_changes_explain": "Έχετε μη αποθηκευμένες αλλαγές. Είστε σίγουροι ότι θέλετε να τις απορρίψετε και να φύγετε από την οθόνη;",
"enter_url": "Εισαγωγή URL",
"save": "Αποθήκευση...",
"seed": "Μνημονική φράση",
"wallet_key": "Κλειδί πορτοφολιού",
"change_input_currency": "Αλλαγή νομίσματος εισαγωγής",
"pick_image": "Επιλογή από βιβλιοθήκη",
"pick_file": "Επιλογή αρχείου",
"qr_custom_input_button": "Πατήστε 10 φορές για προσαρμοσμένη εισαγωγή",
"unlock": "Ξεκλείδωμα",
"port": "Θύρα",
"ssl_port": "Θύρα SSL",
"suggested": "Προτεινόμενο"
},
"azteco": {
"codeIs": "Ο κωδικός κουπονιού είναι",
"redeemButton": "Εξαργύρωση",
"success": "Επιτυχία"
"success": "Επιτυχία",
"errorBeforeRefeem": "Πριν την εξαργύρωση, πρέπει πρώτα να προσθέσετε ένα πορτοφόλι Bitcoin.",
"errorSomething": "Κάτι πήγε στραβά. Είναι ακόμα έγκυρο αυτό το κουπόνι;",
"redeem": "Εξαργύρωση στο πορτοφόλι",
"successMessage": "Το κουπόνι εξαργυρώθηκε με επιτυχία! Τα κεφάλαιά σας θα φτάσουν σύντομα στο Bitcoin πορτοφόλι σας.",
"title": "Εξαργύρωση κουπονιού Azte.co"
},
"entropy": {
"save": "Αποθήκευση",
"title": "Εντροπία",
"undo": "Αναίρεση"
"undo": "Αναίρεση",
"amountOfEntropy": "{bits} από {limit} bits"
},
"errors": {
"broadcast": "Η μετάδοση απέτυχε.",
@ -41,15 +62,21 @@
"refill": "Γέμισμα πορτοφολιού",
"refill_lnd_balance": "Γέμισε το πορτοφόλι Lightning",
"sameWalletAsInvoiceError": "Δεν μπορείς να εξοφλήσεις ένα τιμολόγιο από το ίδιο πορτοφόλι με το οποίο δημιουργήθηκε.",
"title": "Διαχείριση χρημάτων"
"title": "Διαχείριση χρημάτων",
"potentialFee": "Πιθανή προμήθεια: {fee}",
"refill_create": "Για να συνεχίσετε, παρακαλώ δημιουργήστε ένα Bitcoin πορτοφόλι για να γεμίσετε.",
"refill_external": "Γέμισμα με Εξωτερικό Πορτοφόλι"
},
"lndViewInvoice": {
"additional_info": "Επιπρόσθετη πληροφορία",
"for": "Για:",
"lightning_invoice": "Τιμολόγιο Lightning",
"lightning_invoice": "Τιμολόγιο Lightning",
"please_pay": "Παρακαλώ πληρώστε",
"wasnt_paid_and_expired": "Το τιμολόγιο δεν πληρώθηκε και έχει λήξει.",
"please_pay_between_and": "Παρακαλώ πληρώστε μεταξύ {min} και {max}",
"preimage": "Προεικόνα",
"sats": "sats.",
"wasnt_paid_and_expired": "Το τιμολόγιο δεν πληρώθηκε και έχει λήξει."
"date_time": "Ημερομηνία και Ώρα"
},
"plausibledeniability": {
"create_fake_storage": "Δημιούργησε ένα ψεύτικο κρυπτογραφημένο αρχείο",
@ -66,7 +93,8 @@
"ok": "Εντάξει, το έγραψα.",
"ok_lnd": "Εντάξει, το αποθήκευσα.",
"text": "Παρακαλώ αφιερώστε λίγο χρόνο να γράψετε σε ένα κομμάτι χαρτί την φράση απομνημόνευσης.\nΕίναι το αντίγραφο ασφαλείας σας και μπορείτε να την χρησιμοποιήσετε για να ανακτήσετε το πορτοφόλι σας.",
"title": "Το πορτοφόλι σας δημιουργήθηκε."
"title": "Το πορτοφόλι σας δημιουργήθηκε.",
"text_lnd": "Παρακαλώ αποθηκεύστε αυτό το αντίγραφο ασφαλείας του πορτοφολιού. Σας επιτρέπει να επαναφέρετε το πορτοφόλι σε περίπτωση απώλειας."
},
"receive": {
"details_create": "Δημιουργία",
@ -76,7 +104,12 @@
"maxSats": "Το μέγιστο ποσό είναι {max} sats",
"maxSatsFull": "Το μέγιστο ποσό είναι {max} sats ή {currency}",
"minSats": "Το ελάχιστο ποσό είναι {min} sats",
"minSatsFull": "Το ελάχιστο ποσό είναι {min} sats ή {currency}"
"minSatsFull": "Το ελάχιστο ποσό είναι {min} sats ή {currency}",
"details_share": "Κοινοποίηση...",
"address_not_found": "Αδυναμία δημιουργίας διεύθυνσης λήψης.",
"reset": "Επαναφορά",
"qrcode_for_the_address": "Κωδικός QR για τη διεύθυνση",
"bip47_explanation": "Οι κωδικοί πληρωμής είναι μια καθολική διεύθυνση που αποφεύγει την αποκάλυψη των διευθύνσεων του πορτοφολιού σας. Δεν θα τους υποστηρίζουν όλες οι υπηρεσίες."
},
"send": {
"broadcastButton": "Μετάδοση",
@ -89,7 +122,7 @@
"create_broadcast": "Μετάδοση",
"create_copy": "Αντιγραφή και μετάδοση αργότερα",
"create_details": "Λεπτομέρειες",
"create_fee": "Κόστος",
"create_fee": "Προμήθεια",
"create_memo": "Σημείωση",
"create_satoshi_per_vbyte": "Satoshi ανά vByte",
"create_this_is_hex": "Αυτή είναι η υπογεγραμμένη συναλλαγή σε μορφή hex και είναι έτοιμη για αποστολή στο δίκτυο.",
@ -135,11 +168,45 @@
"psbt_sign": "Υπογραφή μιας συναλλαγής",
"open_settings": "Άνοιγμα ρυθμίσεων",
"permission_storage_denied_message": "Το BlueWallet δεν μπορεί να αποθηκεύσει αυτό το αρχείο. Παρακαλώ ανοίξτε τις ρυθμίσεις της συσκευής σας και ενεργοποιήστε την πρόσβαση στον αποθηκευτικό χώρο.",
"permission_storage_title": "Άδεια πρόσβαση στον αποθηκευτικό χώρο",
"permission_storage_title": "Άδεια πρόσβασης στον αποθηκευτικό χώρο",
"psbt_clipboard": "Αντιγραφή στο πρόχειρο",
"psbt_tx_export": "Εξαγωγή σε αρχείο",
"success_done": "Ολοκληρώθηκε",
"problem_with_psbt": "Πρόβλημα με PSBT"
"problem_with_psbt": "Πρόβλημα με PSBT",
"provided_address_is_invoice": "Αυτή η διεύθυνση φαίνεται να είναι για ένα τιμολόγιο Lightning. Παρακαλώ μεταβείτε στο πορτοφόλι Lightning για να πραγματοποιήσετε πληρωμή για αυτό το τιμολόγιο.",
"broadcastNone": "Εισαγωγή hex συναλλαγής",
"details_insert_contact": "Εισαγωγή επαφής",
"details_add_recc_rem_all_alert_description": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε όλους τους παραλήπτες;",
"details_add_rec_rem_all": "Αφαίρεση όλων των παραληπτών",
"details_recipients_title": "Παραλήπτες",
"details_recipient_title": "Παραλήπτης #{number} από #{total}",
"please_complete_recipient_title": "Μη ολοκληρωμένος παραλήπτης",
"please_complete_recipient_details": "Παρακαλώ συμπληρώστε τα στοιχεία του παραλήπτη #{number} πριν προσθέσετε νέο παραλήπτη.",
"details_adv_fee_bump": "Επίτρεψε αύξηση προμήθειας",
"details_adv_full_sure": "Είστε σίγουροι ότι θέλετε να χρησιμοποιήσετε όλο το υπόλοιπο του πορτοφολιού σας για αυτή τη συναλλαγή;",
"details_adv_full_sure_frozen": "Είστε σίγουροι ότι θέλετε να χρησιμοποιήσετε όλο το υπόλοιπο του πορτοφολιού σας για αυτή τη συναλλαγή; Σημειώστε ότι τα παγωμένα νομίσματα εξαιρούνται.",
"details_frozen": "{amount} BTC είναι παγωμένα.",
"details_no_signed_tx": "Το επιλεγμένο αρχείο δεν περιέχει συναλλαγή που μπορεί να εισαχθεί.",
"details_scan_hint": "Διπλό πάτημα για σάρωση ή εισαγωγή προορισμού",
"details_scan_error": "Σφάλμα σάρωσης",
"details_total_exceeds_balance_frozen": "Το ποσό αποστολής υπερβαίνει το διαθέσιμο υπόλοιπο. Σημειώστε ότι τα παγωμένα νομίσματα εξαιρούνται.",
"dynamic_init": "Αρχικοποίηση",
"insert_custom_fee": "Εισαγωγή προμήθειας",
"fee_replace_minvb": "Ο συνολικός ρυθμός προμήθειας (satoshi ανά vByte) που θέλετε να πληρώσετε πρέπει να είναι υψηλότερος από {min} sat/vByte.",
"invalid_psbt": "Μη έγκυρο PSBT.",
"psbt_this_is_psbt": "Αυτή είναι μια Μερικώς Υπογεγραμμένη Συναλλαγή Bitcoin (PSBT). Παρακαλώ ολοκληρώστε την υπογραφή με το hardware πορτοφόλι σας.",
"no_tx_signing_in_progress": "Δεν υπάρχει συναλλαγή σε διαδικασία υπογραφής.",
"outdated_rate": "Η τιμή ενημερώθηκε τελευταία φορά: {date}",
"psbt_tx_open": "Άνοιγμα υπογεγραμμένης συναλλαγής",
"psbt_tx_scan": "Σάρωση υπογεγραμμένης συναλλαγής",
"qr_error_no_qrcode": "Δεν μπορέσαμε να βρούμε έναν έγκυρο κωδικό QR στην επιλεγμένη εικόνα. Βεβαιωθείτε ότι η εικόνα περιέχει μόνο έναν κωδικό QR και όχι επιπλέον περιεχόμενο όπως κείμενο ή κουμπιά.",
"reset_amount": "Επαναφορά ποσού",
"reset_amount_confirm": "Θέλετε να επαναφέρετε το ποσό;",
"txSaved": "Το αρχείο συναλλαγής ({filePath}) έχει αποθηκευτεί.",
"file_saved_at_path": "Το αρχείο ({filePath}) έχει αποθηκευτεί.",
"cant_send_to_silentpayment_adress": "Αυτό το πορτοφόλι δεν μπορεί να στείλει σε διευθύνσεις SilentPayment",
"cant_send_to_bip47": "Αυτό το πορτοφόλι δεν μπορεί να στείλει σε κωδικούς πληρωμής BIP47",
"cant_find_bip47_notification": "Προσθέστε πρώτα αυτόν τον κωδικό πληρωμής στις επαφές"
},
"settings": {
"about": "Σχετικά",
@ -152,7 +219,7 @@
"about_sm_github": "GitHub",
"about_sm_telegram": "Κανάλι Telegram",
"biometrics": "Βιομετρικά",
"biom_conf_identity": "Παρακαλώ επιβεβαιώστε την ταυτότητα σας.",
"biom_conf_identity": "Παρακαλώ επιβεβαιώστε την ταυτότητά σας.",
"currency": "Νόμισμα",
"default_title": "Στην έναρξη",
"electrum_connected": "Σε σύνδεση",
@ -174,7 +241,7 @@
"language": "Γλώσσα",
"last_updated": "Τελευταία ενημέρωση",
"license": "Άδεια χρήσης",
"lightning_saved": "Η αλλαγές σας αποθηκεύτηκαν με επιτυχία.",
"lightning_saved": "Οι αλλαγές σας αποθηκεύτηκαν με επιτυχία.",
"lightning_settings": "Ρυθμίσεις Lightning",
"network": "Δίκτυο",
"network_broadcast": "Μετάδοση συναλλαγής",
@ -186,36 +253,152 @@
"privacy": "Ιδιωτικότητα",
"privacy_read_clipboard": "Ανάγνωση προχείρου",
"privacy_system_settings": "Ρυθμίσεις συστήματος",
"privacy_do_not_track": "Απενεργοποίηση ανάλυσης ",
"privacy_do_not_track": "Απενεργοποίηση ανάλυσης",
"selfTest": "Διαγνωστικός έλεγχος",
"save": "Σώσε",
"saved": "Αποθηκεύτηκε",
"total_balance": "Συνολικό υπόλοιπο",
"tools": "Εργαλεία"
"tools": "Εργαλεία",
"about_awesome": "Φτιαγμένο με το εξαιρετικό",
"about_backup": "Πάντα να κρατάτε αντίγραφο ασφαλείας των κλειδιών σας!",
"about_free": "Το BlueWallet είναι ένα ελεύθερο και ανοιχτού κώδικα έργο. Φτιαγμένο από χρήστες Bitcoin.",
"block_explorer_invalid_custom_url": "Η παρεχόμενη διεύθυνση URL δεν είναι έγκυρη. Παρακαλώ εισάγετε μια έγκυρη διεύθυνση URL που να ξεκινά με http:// ή https://.",
"about_selftest_electrum_disabled": "Ο διαγνωστικός έλεγχος δεν είναι διαθέσιμος με την κατάσταση εκτός σύνδεσης Electrum. Παρακαλώ απενεργοποιήστε την κατάσταση εκτός σύνδεσης και δοκιμάστε ξανά.",
"about_selftest_ok": "Όλοι οι εσωτερικοί έλεγχοι ολοκληρώθηκαν με επιτυχία. Το πορτοφόλι λειτουργεί καλά.",
"privacy_temporary_screenshots": "Επιτρέψτε την λήψη οθόνης",
"privacy_temporary_screenshots_instructions": "Η προστασία λήψης οθόνης θα απενεργοποιηθεί προσωρινά, επιτρέποντας στιγμιότυπα οθόνης και εγγραφές οθόνης. Η προστασία θα ενεργοποιηθεί ξανά αυτόματα όταν κλείσετε και ανοίξετε ξανά το BlueWallet.",
"biometrics_no_longer_available": "Οι ρυθμίσεις της συσκευής σας έχουν αλλάξει και δεν ταιριάζουν πλέον με τις επιλεγμένες ρυθμίσεις ασφαλείας της εφαρμογής. Παρακαλώ ενεργοποιήστε ξανά τα βιομετρικά ή τον κωδικό πρόσβασης και επανεκκινήστε την εφαρμογή για να εφαρμοστούν οι αλλαγές.",
"biom_10times": "Έχετε προσπαθήσει να εισάγετε τον κωδικό σας 10 φορές. Θέλετε να επαναφέρετε τον αποθηκευτικό σας χώρο; Αυτό θα αφαιρέσει όλα τα πορτοφόλια και θα αποκρυπτογραφήσει τον αποθηκευτικό σας χώρο.",
"biom_no_passcode": "Η συσκευή σας δεν έχει ενεργοποιημένο κωδικό πρόσβασης ή βιομετρικά. Για να συνεχίσετε, παρακαλώ ρυθμίστε έναν κωδικό πρόσβασης ή βιομετρικά στην εφαρμογή Ρυθμίσεις.",
"biom_remove_decrypt": "Όλα τα πορτοφόλια σας θα αφαιρεθούν και ο αποθηκευτικός σας χώρος θα αποκρυπτογραφηθεί. Είστε σίγουροι ότι θέλετε να προχωρήσετε;",
"currency_source": "Η τιμή λαμβάνεται από",
"currency_fetch_error": "Παρουσιάστηκε σφάλμα κατά τη λήψη της τιμής για το επιλεγμένο νόμισμα.",
"donate": "Δωρεά",
"donate_description": "Βοηθήστε μας να κρατήσουμε το Blue δωρεάν!",
"electrum_error_connect": "Αδυναμία σύνδεσης με τον παρεχόμενο διακομιστή Electrum",
"electrum_error_connect_tor": "Αδυναμία σύνδεσης με τον παρεχόμενο διακομιστή Electrum. Παρακαλώ βεβαιωθείτε ότι η εφαρμογή Orbot είναι συνδεδεμένη και δοκιμάστε ξανά.",
"electrum_offline_description": "Όταν είναι ενεργοποιημένη, τα πορτοφόλια σας Bitcoin δεν θα προσπαθήσουν να ανακτήσουν υπόλοιπα ή συναλλαγές.",
"electrum_saved": "Οι αλλαγές σας αποθηκεύτηκαν με επιτυχία. Μπορεί να απαιτείται επανεκκίνηση του BlueWallet για να τεθούν σε ισχύ οι αλλαγές.",
"set_electrum_server_as_default": "Ορισμός του {server} ως προεπιλεγμένο διακομιστή Electrum;",
"set_lndhub_as_default": "Ορισμός του {url} ως προεπιλεγμένο διακομιστή LNDhub;",
"electrum_preferred_server": "Προτιμώμενος διακομιστής",
"electrum_preferred_server_description": "Εισάγετε τον διακομιστή που θέλετε να χρησιμοποιεί το πορτοφόλι σας για όλες τις δραστηριότητες Bitcoin. Μόλις οριστεί, το πορτοφόλι σας θα χρησιμοποιεί αποκλειστικά αυτόν τον διακομιστή για τον έλεγχο υπολοίπων, την αποστολή συναλλαγών και τη λήψη δεδομένων δικτύου. Βεβαιωθείτε ότι εμπιστεύεστε αυτόν τον διακομιστή πριν τον ορίσετε.",
"electrum_history": "Ιστορικό",
"electrum_reset_to_default": "Αυτό θα επιτρέψει στο BlueWallet να επιλέξει τυχαία έναν διακομιστή από τη λίστα διακομιστών.",
"electrum_reset_to_default_and_clear_history": "Επαναφορά προεπιλογής και εκκαθάριση ιστορικού",
"encrypt_decrypt_q": "Είστε σίγουροι ότι θέλετε να αποκρυπτογραφήσετε τον αποθηκευτικό σας χώρο; Αυτό θα επιτρέψει την πρόσβαση στα πορτοφόλια σας χωρίς κωδικό πρόσβασης.",
"encrypt_enc_and_pass": "Προστατευμένο με κωδικό πρόσβασης",
"encrypt_storage_explanation_headline": "Ενεργοποίηση κρυπτογραφημένης αποθήκευσης",
"encrypt_storage_explanation_description_line1": "Η ενεργοποίηση της κρυπτογραφημένης αποθήκευσης προσθέτει ένα επιπλέον επίπεδο προστασίας στην εφαρμογή σας ασφαλίζοντας τον τρόπο με τον οποίο αποθηκεύονται τα δεδομένα σας στη συσκευή σας. Αυτό κάνει πιο δύσκολο για οποιονδήποτε να αποκτήσει πρόσβαση στις πληροφορίες σας χωρίς άδεια.",
"encrypt_storage_explanation_description_line2": "Ωστόσο, είναι σημαντικό να γνωρίζετε ότι αυτή η κρυπτογράφηση προστατεύει μόνο την πρόσβαση στα πορτοφόλια σας που αποθηκεύονται στην keychain της συσκευής. Δεν βάζει κωδικό πρόσβασης ή κάποια επιπλέον προστασία στα ίδια τα πορτοφόλια.",
"i_understand": "Καταλαβαίνω",
"block_explorer": "Εξερευνητής μπλοκ",
"block_explorer_preferred": "Χρήση προτιμώμενου εξερευνητή μπλοκ",
"block_explorer_error_saving_custom": "Σφάλμα κατά την αποθήκευση προτιμώμενου εξερευνητή μπλοκ",
"encrypt_tstorage": "Αποθηκευτικός χώρος",
"set_as_preferred": "Ορισμός ως προτιμώμενο",
"set_as_preferred_electrum": "Ο ορισμός του {host}:{port} ως προτιμώμενου διακομιστή θα απενεργοποιήσει τη σύνδεση σε προτεινόμενο διακομιστή τυχαία.",
"encrypted_feature_disabled": "Αυτή η λειτουργία δεν μπορεί να χρησιμοποιηθεί με ενεργοποιημένη την κρυπτογραφημένη αποθήκευση.",
"encrypt_use_expl": "Το {type} θα χρησιμοποιηθεί για να επιβεβαιώσει την ταυτότητά σας πριν την πραγματοποίηση συναλλαγής, το ξεκλείδωμα, την εξαγωγή ή τη διαγραφή ενός πορτοφολιού.",
"biometrics_fail": "Εάν το {type} δεν είναι ενεργοποιημένο ή αποτύχει να ξεκλειδώσει, μπορείτε να χρησιμοποιήσετε τον κωδικό πρόσβασης της συσκευής σας ως εναλλακτική.",
"general_continuity": "Continuity",
"general_continuity_e": "Όταν είναι ενεργοποιημένο, θα μπορείτε να βλέπετε επιλεγμένα πορτοφόλια και συναλλαγές χρησιμοποιώντας τις άλλες συσκευές Apple iCloud που είναι συνδεδεμένες.",
"groundcontrol_explanation": "Το GroundControl είναι ένας δωρεάν, ανοιχτού κώδικα διακομιστής push notifications για πορτοφόλια Bitcoin. Μπορείτε να εγκαταστήσετε τον δικό σας διακομιστή GroundControl και να βάλετε τη διεύθυνση URL του εδώ ώστε να μην βασίζεστε στην υποδομή του BlueWallet. Αφήστε κενό για να χρησιμοποιήσετε τον προεπιλεγμένο διακομιστή του GroundControl.",
"language_isRTL": "Απαιτείται επανεκκίνηση του BlueWallet για να τεθεί σε ισχύ ο προσανατολισμός της γλώσσας.",
"lightning_error_lndhub_uri": "Μη έγκυρο LNDhub URI",
"lightning_error_lndhub_uri_tor": "Μη έγκυρο LNDhub URI. Παρακαλώ βεβαιωθείτε ότι η εφαρμογή Orbot είναι συνδεδεμένη και δοκιμάστε ξανά.",
"lightning_settings_explain": "Για να συνδεθείτε στον δικό σας LND κόμβο, παρακαλώ εγκαταστήστε το LNDhub και βάλτε τη διεύθυνση URL του εδώ στις ρυθμίσεις. Σημειώστε ότι μόνο τα πορτοφόλια που δημιουργούνται μετά την αποθήκευση των αλλαγών θα συνδέονται στο καθορισμένο LNDhub.",
"lndhub_github": "Αποθετήριο GitHub",
"electrum_suggested_description": "Όταν δεν έχει οριστεί προτιμώμενος διακομιστής, ένας προτεινόμενος διακομιστής θα επιλέγεται για χρήση τυχαία.",
"open_link_in_explorer": "Άνοιγμα συνδέσμου στον εξερευνητή",
"password_explain": "Εισάγετε τον κωδικό που θα χρησιμοποιείτε για να ξεκλειδώνετε τον αποθηκευτικό σας χώρο.",
"privacy_quickactions": "Συντομεύσεις πορτοφολιού",
"privacy_quickactions_explanation": "Αγγίξτε και κρατήστε το εικονίδιο της εφαρμογής BlueWallet για να δείτε γρήγορα το υπόλοιπο του πορτοφολιού σας.",
"privacy_clipboard_explanation": "Παρέχει συντομεύσεις εάν βρεθεί μια διεύθυνση ή ένα τιμολόγιο στο πρόχειρό σας.",
"privacy_do_not_track_explanation": "Πληροφορίες απόδοσης και αξιοπιστίας δεν θα υποβάλλονται για ανάλυση.",
"rate": "Τιμή",
"push_notifications_explanation": "Με την ενεργοποίηση των ειδοποιήσεων, το token της συσκευής σας θα σταλεί στον διακομιστή, μαζί με τις διευθύνσεις πορτοφολιών και τα IDs συναλλαγών για όλα τα πορτοφόλια και τις συναλλαγές που πραγματοποιούνται μετά την ενεργοποίηση των ειδοποιήσεων. Το token της συσκευής χρησιμοποιείται για την αποστολή ειδοποιήσεων, και οι πληροφορίες πορτοφολιού μας επιτρέπουν να σας ειδοποιούμε για εισερχόμενα Bitcoin ή επιβεβαιώσεις συναλλαγών.\n\nΜόνο πληροφορίες από τη στιγμή που ενεργοποιείτε τις ειδοποιήσεις μεταδίδονται—τίποτα πριν από αυτό δεν συλλέγεται.\n\nΗ απενεργοποίηση των ειδοποιήσεων θα αφαιρέσει όλες αυτές τις πληροφορίες από τον διακομιστή. Επιπλέον, η διαγραφή ενός πορτοφολιού από την εφαρμογή θα αφαιρέσει επίσης τις σχετικές πληροφορίες από τον διακομιστή.",
"success_transaction_broadcasted": "Η συναλλαγή σας μεταδόθηκε με επιτυχία!",
"total_balance_explanation": "Εμφάνιση του συνολικού υπολοίπου όλων των πορτοφολιών σας στα widgets της αρχικής οθόνης.",
"widgets": "Widgets"
},
"notifications": {
"would_you_like_to_receive_notifications": "Θέλετε να λαμβάνετε ειδοποιήσεις όταν έχετε εισερχόμενες πληρωμές;",
"notifications_subtitle": "Εισερχόμενες πληρωμές και επιβεβαιώσεις συναλλαγών",
"no_and_dont_ask": "Όχι, και μην με ξαναρωτήσεις.",
"permission_denied_message": "Έχετε αρνηθεί την άδεια αποστολής ειδοποιήσεων. Εάν θέλετε να λαμβάνετε ειδοποιήσεις, παρακαλώ ενεργοποιήστε τις στις ρυθμίσεις της συσκευής σας."
},
"transactions": {
"cancel_no": "Αυτή η συναλλαγή δεν μπορεί να αντικατασταθεί.",
"confirmations_lowercase": "{confirmations} επιβεβαιώσεις",
"copy_link": "Αντιγραφή συνδέσμου",
"expand_note": "Επέκταση σημείωσης",
"cpfp_create": "Δημιουργία",
"details_balance_hide": "Απόκρυψη υπολοίπου",
"details_balance_show": "Εμφάνιση υπολοίπου",
"details_copy": "Αντέγραψε",
"details_copy_note": "Αντιγραφή σημείωσης",
"details_from": "Εισερχόμενες διευθύνσεις",
"date": "Ημερομηνία",
"details_received": "Ελήφθη",
"details_title": "Συναλλαγή",
"details_to": "Εξερχόμενες διευθύνσεις",
"pending": "Σε επεξεργασία",
"received_with_amount": "+{amt1} ({amt2})",
"view_wallet": "Προβολή {walletLabel}",
"list_title": "Συναλλαγές",
"list_title_received": "Ελήφθη",
"transaction": "Συναλλαγή",
"status_cancel": "Ακύρωση συναλλαγής",
"txid": "ID συναλλαγής"
"txid": "ID συναλλαγής",
"cancel_explain": "Θα αντικαταστήσουμε αυτή τη συναλλαγή με μία που πληρώνει εσάς και έχει υψηλότερη προμήθεια. Αυτό ουσιαστικά ακυρώνει την τρέχουσα συναλλαγή. Αυτό λέγεται RBF—Replace by Fee.",
"cancel_title": "Ακύρωση αυτής της συναλλαγής (RBF)",
"transaction_loading_error": "Παρουσιάστηκε πρόβλημα κατά τη φόρτωση της συναλλαγής. Παρακαλώ δοκιμάστε ξανά αργότερα.",
"transaction_not_available": "Η συναλλαγή δεν είναι διαθέσιμη",
"cpfp_exp": "Θα δημιουργήσουμε μια άλλη συναλλαγή που ξοδεύει την ανεπιβεβαίωτη συναλλαγή σας. Η συνολική προμήθεια θα είναι υψηλότερη από την αρχική προμήθεια της συναλλαγής, οπότε θα πρέπει να εξορυχθεί γρηγορότερα. Αυτό λέγεται CPFP—Child Pays for Parent.",
"cpfp_no_bump": "Αυτή η συναλλαγή δεν μπορεί να αυξηθεί.",
"cpfp_title": "Αύξηση προμήθειας (CPFP)",
"details_copy_block_explorer_link": "Αντιγραφή συνδέσμου εξερευνητή μπλοκ",
"details_copy_txid": "Αντιγραφή ID συναλλαγής",
"details_inputs": "Είσοδοι",
"details_outputs": "Έξοδοι",
"details_view_in_browser": "Προβολή στον περιηγητή",
"incoming_transaction": "Εισερχόμενη συναλλαγή",
"outgoing_transaction": "Εξερχόμενη συναλλαγή",
"expired_transaction": "Ληγμένη συναλλαγή",
"pending_transaction": "Εκκρεμής συναλλαγή",
"offchain": "off-chain",
"onchain": "on-chain",
"enable_offline_signing": "Αυτό το πορτοφόλι δεν χρησιμοποιείται σε συνδυασμό με υπογραφή εκτός σύνδεσης. Θα θέλατε να την ενεργοποιήσετε τώρα;",
"list_conf": "Επιβ: {number}",
"pending_with_amount": "Σε εκκρεμότητα {amt1} ({amt2})",
"eta_10m": "ΕΧΩΑ: Σε ~10 λεπτά",
"eta_3h": "ΕΧΩΑ: Σε ~3 ώρες",
"eta_1d": "ΕΧΩΑ: Σε ~1 ημέρα",
"list_title_sent": "Στάλθηκε",
"open_url_error": "Αδυναμία ανοίγματος του συνδέσμου με τον προεπιλεγμένο περιηγητή. Παρακαλώ αλλάξτε τον προεπιλεγμένο περιηγητή σας και δοκιμάστε ξανά.",
"rbf_explain": "Θα αντικαταστήσουμε αυτή τη συναλλαγή με μία με υψηλότερη προμήθεια ώστε να εξορυχθεί γρηγορότερα. Αυτό λέγεται RBF—Replace by Fee.",
"rbf_title": "Επιτάχυνση (RBF)",
"status_bump": "Επιτάχυνση",
"transactions_count": "Πλήθος συναλλαγών",
"updating": "Ενημέρωση...",
"watchOnlyWarningTitle": "Προειδοποίηση ασφαλείας",
"watchOnlyWarningDescription": "Να είστε προσεκτικοί με τους απατεώνες που συχνά χρησιμοποιούν πορτοφόλια “μόνο για παρακολούθηση” για να εξαπατήσουν χρήστες. Αυτά τα πορτοφόλια δεν σας επιτρέπουν να ελέγχετε ή να στέλνετε κεφάλαια· σας επιτρέπουν μόνο να βλέπετε το υπόλοιπο.",
"custom_fee_warning_title": "Προειδοποίηση",
"custom_fee_warning_description": "Προμήθειες κάτω από 1 sat/vB είναι έγκυρες, αλλά μπορεί να μην μεταδοθούν λόγω πολιτικών των κόμβων.",
"details_eta_analyzing": "Ανάλυση...",
"details_sent": "Στάλθηκε",
"details_section": "Λεπτομέρειες",
"details_explorer": "εξερευνητής",
"details_network_fee": "Προμήθεια δικτύου",
"details_to_address": "Προς",
"details_id": "ID",
"details_note": "Σημείωση",
"details_add_note": "προσθήκη",
"details_advanced": "Για προχωρημένους",
"details_fee_rate": "Ρυθμός προμήθειας",
"details_size": "Μέγεθος",
"details_virtual_size": "Εικονικό μέγεθος",
"details_tx_hex": "Hex συναλλαγής",
"details_inputs_count": "Είσοδοι ({count})",
"details_outputs_count": "Έξοδοι ({count})"
},
"wallets": {
"add_bitcoin": "Bitcoin",
@ -225,7 +408,7 @@
"add_entropy": "Εντροπία",
"add_import_wallet": "Εισαγωγή πορτοφολιού",
"add_lightning": "Lightning",
"add_lndhub_placeholder": "Η διεύθυνση του κόμβου σας",
"add_lndhub_placeholder": "Η διεύθυνση του κόμβου σας",
"add_placeholder": "το πρώτο μου πορτοφόλι",
"add_title": "Προσθήκη πορτοφολιού",
"add_wallet_name": "Όνομα",
@ -269,11 +452,80 @@
"list_title": "Πορτοφόλια",
"list_tryagain": "Προσπαθήστε ξανά",
"select_wallet": "Επιλογή πορτοφολιού",
"xpub_copiedToClipboard": "Αντιγράφηκε στο πρόχειρο",
"xpub_title": "XPUB του πορτοφολιού"
"xpub_title": "XPUB του πορτοφολιού",
"add_entropy_reset_title": "Επαναφορά εντροπίας",
"add_entropy_reset_message": "Η αλλαγή του τύπου πορτοφολιού θα επαναφέρει την τρέχουσα εντροπία. Θέλετε να προχωρήσετε;",
"add_entropy_bytes": "{bytes} bytes εντροπίας",
"add_entropy_generated": "{gen} bytes παραγόμενης εντροπίας",
"add_entropy_provide": "Παροχή εντροπίας μέσω ζαριών",
"add_entropy_remain": "{gen} bytes παραγόμενης εντροπίας. Τα υπόλοιπα {rem} bytes θα ληφθούν από τη γεννήτρια τυχαίων αριθμών του συστήματος.",
"add_lightning_explain": "Για ξόδεμα με άμεσες συναλλαγές",
"add_lndhub": "Σύνδεση στο LNDhub σας",
"add_lndhub_error": "Η παρεχόμενη διεύθυνση κόμβου είναι μη έγκυρος κόμβος LNDhub.",
"add_wallet_seed_length": "Μήκος μνημονικής φράσης",
"add_wallet_seed_length_12": "12 λέξεις",
"add_wallet_seed_length_24": "24 λέξεις",
"clipboard_bitcoin": "Έχετε μια διεύθυνση Bitcoin στο πρόχειρό σας. Θέλετε να τη χρησιμοποιήσετε για μια συναλλαγή;",
"clipboard_lightning": "Έχετε ένα τιμολόγιο Lightning στο πρόχειρό σας. Θέλετε να το χρησιμοποιήσετε για μια συναλλαγή;",
"clear_clipboard_on_import": "Εκκαθάριση προχείρου κατά την εισαγωγή",
"details_del_wb_err": "Το παρεχόμενο ποσό υπολοίπου δεν ταιριάζει με το υπόλοιπο αυτού του πορτοφολιού. Παρακαλώ δοκιμάστε ξανά.",
"details_del_wb_q": "Αυτό το πορτοφόλι έχει υπόλοιπο. Πριν προχωρήσετε, παρακαλώ έχετε υπόψη ότι δεν θα μπορέσετε να ανακτήσετε τα κεφάλαια χωρίς τη μνημονική φράση αυτού του πορτοφολιού. Για να αποφύγετε την κατά λάθος αφαίρεση, παρακαλώ εισάγετε το υπόλοιπο του πορτοφολιού σας {balance} satoshis.",
"details_derivation_path": "μονοπάτι παραγωγής",
"details_display": "Εμφάνιση στην αρχική οθόνη",
"details_export_history": "Εξαγωγή ιστορικού σε CSV",
"details_master_fingerprint": "Αποτύπωμα κύριου κλειδιού",
"details_multisig_type": "multisig",
"swipe_balance_hide": "Απόκρυψη",
"swipe_balance_show": "Εμφάνιση",
"drag_to_reorder": "Σύρετε για αναδιάταξη",
"clear_search": "Εκκαθάριση αναζήτησης",
"enter_bip38_password": "Εισάγετε κωδικό για αποκρυπτογράφηση",
"import_passphrase_message": "Εισάγετε κωδική φράση εάν έχετε χρησιμοποιήσει κάποια",
"import_explanation": "Παρακαλώ εισάγετε τις λέξεις της μνημονικής φράσης σας, το δημόσιο κλειδί, το WIF ή οτιδήποτε έχετε. Το BlueWallet θα κάνει ό,τι μπορεί για να μαντέψει τη σωστή μορφή και να εισάγει το πορτοφόλι σας.",
"import_success_watchonly": "Το πορτοφόλι σας εισήχθη με επιτυχία. ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Αυτό είναι ένα πορτοφόλι μόνο για παρακολούθηση, ΔΕΝ μπορείτε να ξοδεύετε από αυτό.",
"learn_more": "Μάθετε περισσότερα",
"import_discovery_title": "Ανακάλυψη",
"import_discovery_subtitle": "Επιλέξτε ένα ανακαλυμμένο πορτοφόλι",
"import_discovery_derivation": "Χρήση προσαρμοσμένου μονοπατιού παραγωγής",
"import_discovery_offline": "Το BlueWallet βρίσκεται αυτή τη στιγμή σε κατάσταση εκτός σύνδεσης. Σε αυτή την κατάσταση, δεν μπορεί να επαληθεύσει την ύπαρξη του πορτοφολιού, οπότε θα πρέπει να επιλέξετε το σωστό χειροκίνητα",
"import_derivation_subtitle": "Εισάγετε προσαρμοσμένο μονοπάτι παραγωγής και θα προσπαθήσουμε να ανακαλύψουμε το πορτοφόλι σας.",
"import_derivation_title": "Μονοπάτι παραγωγής",
"import_wrong_path": "Λάθος μονοπάτι παραγωγής",
"list_create_a_wallet_text": "Είναι δωρεάν, και μπορείτε να δημιουργήσετε \nόσα θέλετε.",
"list_empty_txs1_lightning": "Το πορτοφόλι Lightning πρέπει να χρησιμοποιείται για τις καθημερινές σας συναλλαγές. Οι προμήθειες είναι αδίκως φθηνές και η ταχύτητα εξαιρετικά γρήγορη.",
"list_empty_txs2": "Ξεκινήστε με το πορτοφόλι σας.",
"list_empty_txs2_lightning": "\nΓια να ξεκινήσετε να το χρησιμοποιείτε, πατήστε στη Διαχείριση χρημάτων και γεμίστε το υπόλοιπό σας.",
"import_file": "Εισαγωγή αρχείου",
"no_ln_wallet_error": "Πριν πληρώσετε ένα τιμολόγιο Lightning, πρέπει πρώτα να προσθέσετε ένα πορτοφόλι Lightning.",
"looks_like_bip38": "Αυτό μοιάζει με προστατευμένο με κωδικό ιδιωτικό κλειδί (BIP38).",
"manage_title": "Διαχείριση πορτοφολιών",
"no_results_found": "Δεν βρέθηκαν αποτελέσματα.",
"please_continue_scanning": "Παρακαλώ συνεχίστε τη σάρωση.",
"select_no_bitcoin": "Δεν υπάρχουν διαθέσιμα Bitcoin πορτοφόλια αυτή τη στιγμή.",
"select_no_bitcoin_exp": "Απαιτείται ένα Bitcoin πορτοφόλι για να γεμίσετε πορτοφόλια Lightning. Παρακαλώ δημιουργήστε ή εισάγετε ένα.",
"pull_to_refresh": "Τραβήξτε για ανανέωση",
"warning_do_not_disclose": "Ποτέ μη μοιραστείτε τις παρακάτω πληροφορίες",
"scan_import": "Σαρώστε αυτόν τον κωδικό QR για να εισάγετε το πορτοφόλι σας σε άλλη εφαρμογή.",
"write_down_header": "Δημιουργήστε ένα χειροκίνητο αντίγραφο ασφαλείας",
"write_down": "Γράψτε και αποθηκεύστε με ασφάλεια αυτές τις λέξεις. Χρησιμοποιήστε τες για να επαναφέρετε το πορτοφόλι σας αργότερα.",
"wallet_type_this": "Αυτός ο τύπος πορτοφολιού είναι {type}.",
"share_number": "Κοινοποίηση {number}",
"copy_ln_url": "Αντιγράψτε και αποθηκεύστε με ασφάλεια αυτή τη διεύθυνση URL για να επαναφέρετε το πορτοφόλι σας αργότερα.",
"copy_ln_public": "Αντιγράψτε και αποθηκεύστε με ασφάλεια αυτές τις πληροφορίες για να επαναφέρετε το πορτοφόλι σας αργότερα.",
"add_ln_wallet_first": "Πρέπει πρώτα να προσθέσετε ένα πορτοφόλι Lightning.",
"identity_pubkey": "Identity Pubkey",
"manage_wallets_search_placeholder": "Αναζήτηση πορτοφολιών, διευθύνσεων, συναλλαγών και σημειώσεων",
"more_info": "Περισσότερες πληροφορίες",
"details_delete_wallet_error_message": "Παρουσιάστηκε πρόβλημα κατά την επιβεβαίωση εάν αυτό το πορτοφόλι αφαιρέθηκε από τις ειδοποιήσεις—αυτό μπορεί να οφείλεται σε πρόβλημα δικτύου ή κακή σύνδεση. Εάν συνεχίσετε, μπορεί να συνεχίσετε να λαμβάνετε ειδοποιήσεις για συναλλαγές που σχετίζονται με αυτό το πορτοφόλι, ακόμη και μετά τη διαγραφή του.",
"details_delete_anyway": "Διαγραφή ούτως ή άλλως"
},
"total_balance_view": {
"title": "Συνολικό υπόλοιπο"
"title": "Συνολικό υπόλοιπο",
"display_in_bitcoin": "Εμφάνιση σε Bitcoin",
"hide": "Απόκρυψη",
"display_in_sats": "Εμφάνιση σε sats",
"display_in_fiat": "Εμφάνιση σε {currency}",
"explanation": "Δείτε το συνολικό υπόλοιπο όλων των πορτοφολιών σας στην οθόνη επισκόπησης."
},
"multisig": {
"provide_signature": "Παροχή υπογραφής",
@ -288,22 +540,104 @@
"native_segwit_title": "Καλές πρακτικές",
"co_sign_transaction": "Υπογραφή μιας συναλλαγής",
"what_is_vault_wallet": "πορτοφόλι.",
"wallet_type": "Τύπος πορτοφολιου",
"wallet_type": "Τύπος πορτοφολιού",
"create_new_key": "Δημιουργία νέου",
"scan_or_open_file": "Σάρωση ή άνοιγμα αρχείου",
"ms_help": "Βοήθεια",
"ms_help_title5": "Enable advanced mode"
"ms_help_title5": "Enable advanced mode",
"multisig_vault": "Χρηματοκιβώτιο Multisig",
"default_label": "Χρηματοκιβώτιο Multisig",
"multisig_vault_explain": "Καλύτερη ασφάλεια για μεγάλα ποσά",
"provide_signature_details": "Χρησιμοποιήστε τη συσκευή και το πορτοφόλι σας όπου βρίσκεται το κλειδί για να υπογράψετε αυτή τη συναλλαγή",
"provide_signature_details_bluewallet": "Στο BlueWallet, πηγαίνετε στο μενού της οθόνης Αποστολής και επιλέξτε ",
"provide_signature_next_steps": "Σάρωση ή εισαγωγή υπογεγραμμένης συναλλαγής",
"provide_signature_next_steps_details": "Μόλις το πορτοφόλι σας υπογράψει επιτυχώς τη συναλλαγή, σαρώστε τον παρεχόμενο κωδικό QR ή εισάγετε το συνοδευτικό αρχείο και στη συνέχεια ελέγξτε όλες τις λεπτομέρειες της συναλλαγής πριν τη μεταδώσετε.",
"vault_key": "Κλειδί χρηματοκιβωτίου {number}",
"required_keys_out_of_total": "Απαιτούμενα κλειδιά από το σύνολο",
"fee": "Προμήθεια: {number}",
"share": "Κοινοποίηση...",
"shared_key_detected": "Κοινόχρηστος συν-υπογράφων",
"shared_key_detected_question": "Σας μοιράστηκε ένας συν-υπογράφων, θέλετε να τον εισάγετε;",
"how_many_signatures_can_bluewallet_make": "πόσες υπογραφές μπορεί να κάνει το BlueWallet",
"signatures_required_to_spend": "Απαιτούμενες υπογραφές {number}",
"signatures_we_can_make": "μπορεί να κάνει {number}",
"export_coordination_setup": "Εξαγωγή Ρύθμισης Συντονισμού",
"cosign_this_transaction": "Συν-υπογραφή αυτής της συναλλαγής;",
"wrapped_segwit_title": "Καλύτερη συμβατότητα",
"legacy_title": "Legacy",
"what_is_vault": "Ένα Χρηματοκιβώτιο είναι ένα",
"what_is_vault_numberOfWallets": " {m}-από-{n} multisig ",
"vault_advanced_customize": "Ρυθμίσεις χρηματοκιβωτίου",
"needs": "Χρειάζεται",
"what_is_vault_description_number_of_vault_keys": " {m} κλειδιά χρηματοκιβωτίου ",
"what_is_vault_description_to_spend": "για να ξοδέψει και ένα τρίτο που \nμπορείτε να χρησιμοποιήσετε ως αντίγραφο ασφαλείας.",
"what_is_vault_description_to_spend_other": "για να ξοδέψει.",
"quorum": "{m} από {n} απαρτία",
"quorum_header": "Απαρτία",
"of": "από",
"invalid_mnemonics": "Αυτή η μνημονική φράση δεν φαίνεται να είναι έγκυρη.",
"invalid_cosigner": "Μη έγκυρα δεδομένα συν-υπογράφοντος",
"not_a_multisignature_xpub": "Αυτό δεν είναι XPUB από πορτοφόλι multisig!",
"invalid_cosigner_format": "Λανθασμένος συν-υπογράφων: Αυτός δεν είναι συν-υπογράφων για τη μορφή {format}.",
"i_have_mnemonics": "Έχω μνημονική φράση για αυτό το κλειδί.",
"type_your_mnemonics": "Εισάγετε μνημονική φράση για να εισάγετε το υπάρχον κλειδί χρηματοκιβωτίου σας.",
"this_is_cosigners_xpub": "Αυτό είναι το XPUB του συν-υπογράφοντος—έτοιμο να εισαχθεί σε άλλο πορτοφόλι. Είναι ασφαλές να μοιραστεί.",
"this_is_cosigners_xpub_airdrop": "Εάν μοιραστείτε μέσω AirDrop οι παραλήπτες πρέπει να βρίσκονται στην οθόνη συντονισμού.",
"wallet_key_created": "Το κλειδί χρηματοκιβωτίου σας δημιουργήθηκε. Αφιερώστε λίγο χρόνο για να κρατήσετε ασφαλές αντίγραφο της μνημονικής φράσης σας.",
"are_you_sure_seed_will_be_lost": "Είστε σίγουροι; Η μνημονική φράση σας θα χαθεί εάν δεν έχετε αντίγραφο ασφαλείας.",
"forget_this_seed": "Ξεχάστε αυτή τη μνημονική φράση και χρησιμοποιήστε αντ' αυτής το XPUB.",
"view_edit_cosigners": "Προβολή/Επεξεργασία συν-υπογραφόντων",
"this_cosigner_is_already_imported": "Αυτός ο συν-υπογράφων έχει ήδη εισαχθεί.",
"export_signed_psbt": "Εξαγωγή υπογεγραμμένου PSBT",
"input_fp": "Εισαγωγή αποτυπώματος",
"input_fp_explain": "Παραλείψτε για να χρησιμοποιήσετε το προεπιλεγμένο (00000000)",
"input_path": "Εισαγωγή μονοπατιού παραγωγής",
"input_path_explain": "Παραλείψτε για να χρησιμοποιήσετε το προεπιλεγμένο ({default})",
"ms_help_title": "Πώς λειτουργούν τα Χρηματοκιβώτια Multisig: Συμβουλές και κόλπα",
"ms_help_text": "Ένα πορτοφόλι με πολλαπλά κλειδιά, για αυξημένη ασφάλεια ή κοινή φύλαξη",
"ms_help_title1": "Συνιστώνται πολλαπλές συσκευές.",
"ms_help_1": "Το Χρηματοκιβώτιο θα λειτουργεί με άλλες εφαρμογές BlueWallet και πορτοφόλια συμβατά με PSBT, όπως Electrum, Specter, Coldcard, Cobo Vault κ.λπ.",
"ms_help_title2": "Επεξεργασία κλειδιών",
"ms_help_2": "Μπορείτε να δημιουργήσετε όλα τα κλειδιά Χρηματοκιβωτίου σε αυτή τη συσκευή και να τα αφαιρέσετε ή να τα επεξεργαστείτε αργότερα. Έχοντας όλα τα κλειδιά στην ίδια συσκευή έχει την ισοδύναμη ασφάλεια ενός κανονικού πορτοφολιού Bitcoin.",
"ms_help_title3": "Αντίγραφα ασφαλείας Χρηματοκιβωτίου",
"ms_help_3": "Στις επιλογές του πορτοφολιού, θα βρείτε το αντίγραφο ασφαλείας του Χρηματοκιβωτίου σας και το αντίγραφο ασφαλείας μόνο για παρακολούθηση. Αυτό το αντίγραφο ασφαλείας είναι σαν χάρτης για το πορτοφόλι σας. Είναι απαραίτητο για την ανάκτηση του πορτοφολιού σε περίπτωση που χάσετε μία από τις μνημονικές φράσεις σας.",
"ms_help_title4": "Εισαγωγή Χρηματοκιβωτίων",
"ms_help_4": "Για να εισάγετε ένα multisig, χρησιμοποιήστε το αρχείο αντιγράφου ασφαλείας και τη λειτουργία εισαγωγής. Εάν έχετε μόνο μνημονικές φράσεις και XPUBs, μπορείτε να χρησιμοποιήσετε το κουμπί ατομικής εισαγωγής κατά τη δημιουργία κλειδιών Χρηματοκιβωτίου.",
"ms_help_5": "Από προεπιλογή, το BlueWallet θα δημιουργήσει ένα 2-από-3 Χρηματοκιβώτιο. Για να δημιουργήσετε διαφορετική απαρτία ή να αλλάξετε τον τύπο διεύθυνσης, ενεργοποιήστε την κατάσταση για προχωρημένους στις Ρυθμίσεις."
},
"is_it_my_address": {
"title": "Είναι δική μου διεύθυνση;",
"enter_address": "Εισαγωγή διεύθυνσης",
"check_address": "Έλεγχος διεύθυνσης",
"view_qrcode": "Προβολή κωδικού QR"
"view_qrcode": "Προβολή κωδικού QR",
"owns": "{label} κατέχει {address}",
"no_wallet_owns_address": "Κανένα από τα διαθέσιμα πορτοφόλια δεν κατέχει την παρεχόμενη διεύθυνση."
},
"autofill_word": {
"title": "Τελική λέξη μνημονικής φράσης",
"enter": "Εισάγετε τη μερική μνημονική σας φράση",
"generate_word": "Δημιουργία της τελικής λέξης",
"error": "Η εισαγωγή δεν είναι μερική μνημονική φράση 11 ή 23 λέξεων. Παρακαλώ δοκιμάστε ξανά."
},
"cc": {
"change": "Αλλαγή",
"sort_label": "Ετικέτα",
"sort_status": "Κατάσταση"
"sort_status": "Κατάσταση",
"coins_selected": "Επιλεγμένα νομίσματα ({number})",
"selected_summ": "{value} επιλεγμένα",
"empty": "Αυτό το πορτοφόλι δεν έχει νομίσματα αυτή τη στιγμή.",
"freeze": "Πάγωμα",
"freezeLabel": "Πάγωμα",
"freezeLabel_un": "Ξεπάγωμα",
"header": "Διαχείριση UTXO",
"use_coin": "Χρήση νομίσματος",
"use_coins": "Χρήση νομισμάτων",
"tip": "Αυτή η λειτουργία σας επιτρέπει να βλέπετε, να επισημαίνετε, να παγώνετε ή να επιλέγετε νομίσματα για βελτιωμένη διαχείριση πορτοφολιού. Μπορείτε να επιλέξετε πολλαπλά νομίσματα πατώντας στους χρωματιστούς κύκλους.",
"sort_asc": "Αύξουσα",
"sort_desc": "Φθίνουσα",
"sort_height": "Ύψος",
"sort_value": "Αξία",
"sort_by": "Ταξινόμηση κατά"
},
"units": {
"BTC": "BTC",
@ -324,10 +658,47 @@
"type_change": "Αλλαγή",
"type_receive": "Λήψη",
"type_used": "Έχει γίνει χρήση",
"transactions": "Συναλλαγές"
"transactions": "Συναλλαγές",
"sensitive_private_key": "Προειδοποίηση: τα ιδιωτικά κλειδιά είναι εξαιρετικά ευαίσθητα. Συνέχεια;",
"sign_title": "Υπογραφή/Επαλήθευση μηνύματος",
"sign_help": "Εδώ μπορείτε να δημιουργήσετε ή να επαληθεύσετε μια κρυπτογραφική υπογραφή βασισμένη σε μια διεύθυνση Bitcoin."
},
"lnurl_auth": {
"register_question_part_1": "Θέλετε να εγγραφείτε για λογαριασμό στο",
"register_question_part_2": "χρησιμοποιώντας το πορτοφόλι Lightning σας;",
"register_answer": "Εγγραφήκατε επιτυχώς για λογαριασμό στο {hostname}!",
"login_question_part_1": "Θέλετε να συνδεθείτε στο",
"login_question_part_2": "χρησιμοποιώντας το πορτοφόλι Lightning σας;",
"login_answer": "Συνδεθήκατε επιτυχώς στο {hostname}!",
"link_question_part_1": "Θέλετε να συνδέσετε τον λογαριασμό σας στο",
"link_question_part_2": "με το πορτοφόλι Lightning σας;",
"link_answer": "Το πορτοφόλι Lightning σας συνδέθηκε επιτυχώς με τον λογαριασμό σας στο {hostname}!",
"auth_question_part_1": "Θέλετε να πιστοποιηθείτε στο",
"auth_question_part_2": "χρησιμοποιώντας το πορτοφόλι Lightning σας;",
"auth_answer": "Πιστοποιηθήκατε επιτυχώς στο {hostname}!",
"could_not_auth": "Δεν μπορέσαμε να σας πιστοποιήσουμε στο {hostname}.",
"authenticate": "Πιστοποίηση"
},
"bip47": {
"payment_code": "Κωδικός πληρωμής",
"not_found": "Ο κωδικός πληρωμής δεν βρέθηκε"
"not_found": "Ο κωδικός πληρωμής δεν βρέθηκε",
"contacts": "Επαφές",
"bip47_explain": "Επαναχρησιμοποιήσιμος και διαμοιραζόμενος κωδικός",
"bip47_explain_subtitle": "BIP47",
"purpose": "Επαναχρησιμοποιήσιμος και διαμοιραζόμενος κωδικός (BIP47)",
"pay_this_contact": "Πλήρωσε αυτή την επαφή",
"rename_contact": "Μετονομασία επαφής",
"copy_payment_code": "Αντιγραφή κωδικού πληρωμής",
"hide_contact": "Απόκρυψη επαφής",
"rename": "Μετονομασία",
"provide_name": "Δώστε νέο όνομα για αυτή την επαφή",
"add_contact": "Προσθήκη επαφής",
"provide_payment_code": "Δώστε κωδικό πληρωμής",
"invalid_pc": "Μη έγκυρος κωδικός πληρωμής",
"notification_tx_unconfirmed": "Η συναλλαγή ειδοποίησης δεν έχει επιβεβαιωθεί ακόμη, παρακαλώ περιμένετε",
"failed_create_notif_tx": "Αποτυχία δημιουργίας on-chain συναλλαγής",
"onchain_tx_needed": "Απαιτείται on-chain συναλλαγή",
"notif_tx_sent": "Η συναλλαγή ειδοποίησης στάλθηκε. Παρακαλώ περιμένετε να επιβεβαιωθεί",
"notif_tx": "Συναλλαγή ειδοποίησης"
}
}

View File

@ -56,6 +56,7 @@
"errorInvoiceExpired": "Invoice expired.",
"expired": "Expired",
"expiresIn": "Expires in {time} minutes",
"network_fee": "Network fee: {fee}",
"payButton": "Pay",
"payment": "Payment",
"placeholder": "Invoice or address",
@ -76,7 +77,13 @@
"preimage": "Pre-image",
"sats": "sats.",
"date_time": "Date and Time",
"wasnt_paid_and_expired": "This invoice was not paid and has expired."
"wasnt_paid_and_expired": "This invoice was not paid and has expired.",
"receiving_payment": "Receiving payment…",
"refund_funds": "Refund funds",
"refund_deferred": "Funds aren't refundable yet. Try again after the swap timelock expires.",
"notification_action_title": "Action needed",
"notification_claim_body": "{walletLabel}: tap to claim your incoming Lightning payment.",
"notification_refund_body": "{walletLabel}: tap to refund your stuck Lightning payment."
},
"plausibledeniability": {
"create_fake_storage": "Create Encrypted Storage",
@ -281,7 +288,6 @@
"general": "General",
"general_continuity": "Continuity",
"general_continuity_e": "When enabled, you will be able to view selected wallets, and transactions, using your other Apple iCloud connected devices.",
"groundcontrol_explanation": "GroundControl is a free, open-source push notifications server for Bitcoin wallets. You can install your own GroundControl server and put its URL here to not rely on BlueWallets infrastructure. Leave blank to use GroundControls default server.",
"header": "Settings",
"language": "Language",
"last_updated": "Last Updated",
@ -297,7 +303,6 @@
"network_broadcast": "Broadcast Transaction",
"network_electrum": "Electrum Server",
"electrum_suggested_description": "When a preferred server is not set, a suggested server will be selected for use at random.",
"not_a_valid_uri": "Invalid URI",
"notifications": "Notifications",
"open_link_in_explorer": "Open link in explorer",
"password": "Password",
@ -315,7 +320,6 @@
"push_notifications_explanation": "By enabling notifications, your device token will be sent to the server, along with wallet addresses and transaction IDs for all wallets and transactions made after enabling notifications. The device token is used to send notifications, and the wallet information allows us to notify you about incoming Bitcoin or transaction confirmations.\n\nOnly information from after you enable notifications is transmitted—nothing from before is collected.\n\nDisabling notifications will remove all of this information from the server. Additionally, deleting a wallet from the app will also remove its associated information from the server.",
"selfTest": "Self-Test",
"save": "Save",
"saved": "Saved",
"success_transaction_broadcasted": "Your transaction has been successfully broadcasted!",
"total_balance": "Total Balance",
"total_balance_explanation": "Display the total balance of all your wallets on your home screen widgets.",
@ -376,7 +380,6 @@
"rbf_title": "Speed Up (RBF)",
"status_bump": "Speed Up",
"status_cancel": "Cancel",
"transactions_count": "Transactions Count",
"txid": "Transaction ID",
"updating": "Updating...",
"watchOnlyWarningTitle": "Security warning",
@ -438,13 +441,18 @@
"details_delete_wallet": "Delete Wallet",
"details_derivation_path": "derivation path",
"details_display": "Display in Home Screen",
"details_edit": "edit",
"details_export_backup": "Export/Backup",
"details_export_history": "Export History to CSV",
"details_master_fingerprint": "Master Fingerprint",
"details_multisig_type": "multisig",
"details_options": "Options",
"details_show_xpub": "Show Wallet XPUB",
"details_show_addresses": "Show addresses",
"details_stats_coins": "Coins",
"details_title": "Wallet",
"restore_swap_activity": "Restore swap activity",
"restore_swap_activity_done": "Swap activity restored.",
"wallets": "Wallets",
"swipe_balance_hide": "Hide",
"swipe_balance_show": "Show",

View File

@ -2,10 +2,25 @@
"_": {
"bad_password": "Contraseña incorrecta. Por favor, inténtalo de nuevo.",
"cancel": "Cancelar",
"continue": "Continua",
"continue": "Continuar",
"clipboard": "Portapapeles",
"discard_changes": "¿Descartar cambios? ",
"copied": "¡Copiado!",
"discard_changes": "¿Descartar cambios?",
"discard_changes_explain": "Tienes cambios sin guardar. ¿Seguro que quieres descartarlos y salir de la pantalla?",
"enter_password": "Introduce la contraseña",
"enter_url": "Introduce la URL",
"save": "Guardar...",
"close": "Cerrar",
"change_input_currency": "Cambiar divisa de entrada",
"refresh": "Actualizar",
"pick_image": "Elegir de la biblioteca",
"pick_file": "Elegir archivo",
"enter_amount": "Introduce la cantidad",
"qr_custom_input_button": "Toca 10 veces para introducir entrada personalizada",
"unlock": "Desbloquear",
"port": "Puerto",
"ssl_port": "Puerto SSL",
"suggested": "Sugerido",
"never": "Nunca",
"of": "{number} de {total}",
"ok": "OK",
@ -23,22 +38,27 @@
"redeem": "Canjear y mover a la cartera",
"redeemButton": "Canjear",
"success": "Completado",
"successMessage": "¡Cupón canjeado correctamente! Tus fondos llegarán pronto a tu cartera de Bitcoin.",
"title": "Canjear cupón Azte.co"
},
"entropy": {
"save": "Guardar",
"title": "Entropía ",
"undo": "Deshacer"
"title": "Entropía",
"undo": "Deshacer",
"amountOfEntropy": "{bits} de {limit} bits"
},
"errors": {
"broadcast": "Emisión fallida",
"error": "Error",
"network": "Error de red"
"network": "Error de red",
"error": "Error"
},
"lnd": {
"errorInvoiceExpired": "Factura caducada.",
"expired": "Expirado",
"expiresIn": "Expira en {time} minutos",
"payButton": "Pagar",
"payment": "Pago",
"placeholder": "Factura o dirección",
"potentialFee": "Comisión estimada: {fee}",
"refill": "Recargar",
"refill_create": "Para continuar, por favor crea una cartera de Bitcoin con la que recargar.",
@ -50,25 +70,29 @@
"lndViewInvoice": {
"additional_info": "Información adicional",
"for": "Para:",
"lightning_invoice": "Factura Lighting",
"lightning_invoice": "Factura Lightning",
"please_pay_between_and": "Paga entre {min} y {max}",
"please_pay": "Por favor, pague",
"sats": "sats.",
"wasnt_paid_and_expired": "Esta factura no fue pagada y ha expirado."
"please_pay": "Por favor, paga",
"preimage": "Preimagen",
"date_time": "Fecha y hora",
"wasnt_paid_and_expired": "Esta factura no fue pagada y ha expirado.",
"sats": "sats"
},
"plausibledeniability": {
"create_fake_storage": "Crear almacenamiento cifrado",
"create_password_explanation": "La contraseña para el almacenamiento falso no puede ser igual que la del almacenamiento principal.",
"help": "Bajo ciertas circunstancias, podrías verte forzado a revelar tu contraseña. Para proteger tus fondos, BlueWallet puede crear otro almacenamiento cifrado con una contraseña diferente. Proporciona esta otra contraseña a quien te esté obligando a hacerlo y BlueWallet mostrará un almacenamiento \"falso\" que parecerá legítimo. Así mantendrás a buen recaudo el almacenamiento con tus fondos.",
"help2": "El nuevo almacen sera completamente funcional, y puedes almacenar cantidades minimas para que sea mas creible.",
"help2": "El nuevo almacén será completamente funcional, y puedes almacenar cantidades mínimas para que sea más creíble.",
"password_should_not_match": "Esta contraseña ya está en uso. Por favor, introduce una diferente.",
"title": "Negación plausible"
},
"pleasebackup": {
"ask": "¿Has guardado la frase de respaldo de tu cartera? Esta frase de respaldo es necesaria para acceder a tus fondos si pierdes este dispositivo. Sin la frase de respaldo, tus fondos se perderán permanentemente.",
"ask_no": "No, no la he guardado.",
"ask_yes": "Sí, la he guardado.",
"ok": "OK, ya la he anotado.",
"ok_lnd": "OK, lo he guardado.",
"text": "Por favor, apunta esta frase mnemotécnica en un papel. Será tu copia de seguridad y te permitirá restaurar la cartera en otro dispositivo.",
"text": "Por favor, apunta esta frase mnemotécnica en un papel.\nSerá tu copia de seguridad y te permitirá restaurar la cartera en otro dispositivo.",
"text_lnd": "Por favor guarda la copia de seguridad de esta cartera. Te permitirá restaurarla en caso de pérdida.",
"title": "Tu cartera ha sido creada"
},
@ -76,11 +100,16 @@
"details_create": "Crear",
"details_label": "Descripción",
"details_setAmount": "Recibir con monto",
"details_share": "Compartir...",
"address_not_found": "No se ha podido generar la dirección de recepción.",
"header": "Recibir",
"reset": "Restablecer",
"maxSats": "La cantidad máxima es {max} sats",
"maxSatsFull": "La cantidad máxima es {max} sats o {currency}",
"minSats": "La cantidad mínima es {min} sats",
"minSatsFull": "La cantidad mínima es {min} sats o {currency}"
"minSatsFull": "La cantidad mínima es {min} sats o {currency}",
"qrcode_for_the_address": "Código QR de la dirección",
"bip47_explanation": "Los códigos de pago son una dirección universal que evita revelar las direcciones de tu cartera. No todos los servicios los admiten."
},
"send": {
"provided_address_is_invoice": "Esta dirección parece ser para una factura Lightning. Por favor, ve a tu cartera Lightning para realizar el pago de esta factura.",
@ -93,37 +122,37 @@
"confirm_sendNow": "Enviar ahora",
"create_amount": "Cantidad",
"create_broadcast": "Emitir",
"create_copy": "Escanear código QR",
"create_copy": "Copiar y emitir más tarde",
"create_details": "Detalles",
"create_fee": "Comisión",
"create_memo": "Comentario",
"create_satoshi_per_vbyte": "Satoshis por vByte",
"create_this_is_hex": "Esta es tu transacción en formato hexadecimal—firmada y lista para ser emitido a través de la red.",
"create_this_is_hex": "Esta es tu transacción en formato hexadecimal—firmada y lista para ser emitida a través de la red.",
"create_to": "Dirección de destino",
"create_tx_size": "Tamaño de la transacción",
"create_verify": "Verificar en coinb.in",
"details_add_rec_add": "Añadir destinatario",
"details_add_rec_rem": "Borrar destinatario",
"details_address": "Dirección",
"details_address_field_is_not_valid": "La dirección no es válida",
"details_address_field_is_not_valid": "La dirección no es válida.",
"details_adv_fee_bump": "Permitir aumentar la comisión",
"details_adv_full": "Usar todo el balance",
"details_adv_full_sure": "¿Estás seguro de querer utilizar todo el saldo de tu cartera en esta transacción?",
"details_adv_full_sure_frozen": "¿Estás seguro de que deseas utilizar todo el balance de tu wallet para esta transacción?",
"details_adv_full_sure_frozen": "¿Estás seguro de que deseas utilizar todo el balance de tu cartera para esta transacción? Ten en cuenta que las monedas congeladas están excluidas.",
"details_adv_import": "Importar transacción",
"details_adv_import_qr": "Importar transacción (QR)",
"details_amount_field_is_not_valid": "La cantidad no es válida",
"details_amount_field_is_less_than_minimum_amount_sat": "La cantidad especificada es muy pequeña. Por favor, introduzca una cantidad mayor a 500 sats. ",
"details_amount_field_is_not_valid": "La cantidad no es válida.",
"details_amount_field_is_less_than_minimum_amount_sat": "La cantidad especificada es muy pequeña. Por favor, introduce una cantidad mayor a 500 sats.",
"details_create": "Crear factura",
"details_error_decode": "No se ha podido decodificar la dirección de Bitcoin",
"details_fee_field_is_not_valid": "La comisión introducida no es válida",
"details_fee_field_is_not_valid": "La comisión introducida no es válida.",
"details_next": "Siguiente",
"details_no_signed_tx": "El archivo seleccionado no contiene una transacción que se pueda importar.",
"details_note_placeholder": "Nota personal",
"details_scan": "Escanear",
"details_scan_hint": "Toca dos veces para escanear o importar un destino",
"details_total_exceeds_balance": "El monto excede el balance disponible.",
"details_total_exceeds_balance_frozen": "La cantidad a enviar excede el balance disponible. Tenga en cuenta que las monedas congeladas están excluidas",
"details_total_exceeds_balance_frozen": "La cantidad a enviar excede el balance disponible. Ten en cuenta que las monedas congeladas están excluidas.",
"details_unrecognized_file_format": "Formato no reconocido",
"details_wallet_before_tx": "Antes de crear una transacción debes añadir una cartera de Bitcoin.",
"dynamic_init": "Iniciando",
@ -154,25 +183,42 @@
"psbt_this_is_psbt": "Esta transacción está parcialmente firmada (PSBT). Por favor, termina de firmarla con tu cartera de hardware.",
"psbt_tx_export": "Exportar a archivo",
"no_tx_signing_in_progress": "No hay ninguna transacción siendo firmada en estos momentos.",
"outdated_rate": "Fecha de la última actualización de la tarifa de cambio: {date}",
"outdated_rate": "Fecha de la última actualización del tipo de cambio: {date}",
"psbt_tx_open": "Abrir transacción firmada",
"psbt_tx_scan": "Escanear transacción firmada",
"reset_amount": "Cantidad predeterminada",
"reset_amount_confirm": "¿Quieres volver a la cantidad predeterminada?",
"success_done": "Completado",
"details_insert_contact": "Insertar contacto",
"details_add_recc_rem_all_alert_description": "¿Seguro que quieres eliminar a todos los destinatarios?",
"details_add_rec_rem_all": "Eliminar todos los destinatarios",
"details_recipients_title": "Destinatarios",
"details_recipient_title": "Destinatario #{number} de #{total}",
"please_complete_recipient_title": "Destinatario incompleto",
"please_complete_recipient_details": "Por favor, completa los datos del destinatario #{number} antes de añadir un nuevo destinatario.",
"details_frozen": "{amount} BTC está congelado.",
"details_scan_error": "Error al escanear",
"insert_custom_fee": "Introducir comisión",
"invalid_psbt": "PSBT inválido.",
"qr_error_no_qrcode": "No hemos podido encontrar un código QR válido en la imagen seleccionada. Asegúrate de que la imagen contiene únicamente un código QR y nada más, como texto o botones.",
"txSaved": "El archivo de la transacción ({filePath}) se ha guardado.",
"file_saved_at_path": "El archivo ({filePath}) se ha guardado.",
"cant_send_to_silentpayment_adress": "Esta cartera no puede enviar a direcciones Silent Payments",
"cant_send_to_bip47": "Esta cartera no puede enviar a códigos de pago BIP47",
"cant_find_bip47_notification": "Añade primero este código de pago a contactos",
"problem_with_psbt": "Problema con PSBT"
},
"settings": {
"about": "Sobre nosotros",
"about_awesome": "Built with the awesome",
"about_awesome": "Construido con el increíble",
"about_backup": "¡Guarda siempre una copia de seguridad de tus llaves!",
"about_free": "BlueWallet es un proyecto de código abierto y gratuito. Elaborado por usuarios de Bitcoin.",
"about_license": "Licencia MIT",
"about_release_notes": "Notas de la versión",
"about_review": "Escribe una reseña",
"about_selftest": "Iniciar test local",
"about_selftest_electrum_disabled": "La autocomprobación no está disponible en el modo sin conexión de Electrum. Desactiva el modo sin conexión y vuelve a intentarlo. ",
"about_selftest_ok": "Todas las pruebas internas han concluido satisfactoriamente. La billetera funciona bien. ",
"about_selftest_electrum_disabled": "La autocomprobación no está disponible en el modo sin conexión de Electrum. Desactiva el modo sin conexión y vuelve a intentarlo.",
"about_selftest_ok": "Todas las pruebas internas han concluido satisfactoriamente. La cartera funciona bien.",
"about_sm_github": "GitHub",
"about_sm_telegram": "Canal de Telegram",
"biometrics": "Biometría",
@ -187,14 +233,14 @@
"lndhub_uri": "Ej.: {example}",
"electrum_host": "Ej.: {example}",
"electrum_offline_mode": "Modo offline",
"electrum_offline_description": "Al habilitarlo, tus carteras de Bitcoin no intentaran actualizar balances ni transacciones.",
"electrum_offline_description": "Al habilitarlo, tus carteras de Bitcoin no intentarán actualizar balances ni transacciones.",
"electrum_port": "Puerto, generalmente {example}",
"use_ssl": "Utiliza SSL",
"electrum_saved": "Los cambios se han guardado. Puede que se requiera reiniciar la aplicación para que tomen efecto.",
"set_electrum_server_as_default": "¿Establecer {server} como servidor Electrum por defecto?",
"electrum_settings_server": "Servidor Electrum",
"electrum_status": "Estado",
"electrum_unable_to_connect": "Imposible conectar a {server}. ",
"electrum_unable_to_connect": "Imposible conectar a {server}.",
"electrum_reset": "Restablecer valores predeterminados",
"encrypt_decrypt": "Desencriptar almacenamiento",
"encrypt_decrypt_q": "¿Seguro que quieres desencriptar tu almacenamiento? Al hacerlo, se podrá acceder a tus carteras sin contraseña.",
@ -203,7 +249,7 @@
"encrypt_use": "Usar {type}",
"general": "General",
"general_continuity": "Continuidad",
"general_continuity_e": "Al activarlo, podrá ver las transacciones y carteras seleccionadas usando cualquiera de sus dispositivos Apple conectados a iCloud.",
"general_continuity_e": "Al activarlo, podrás ver las transacciones y carteras seleccionadas usando cualquiera de tus dispositivos Apple conectados a iCloud.",
"groundcontrol_explanation": "GroundControl es un servidor gratuito y de código abierto de notificaciones push para carteras Bitcoin. Puedes instalar tu propio servidor de GroundControl y poner su URL aquí para no depender del de BlueWallet. Déjalo en blanco para usar el predeterminado.",
"header": "Ajustes",
"language": "Idioma",
@ -224,26 +270,69 @@
"privacy_system_settings": "Configuración del sistema",
"privacy_quickactions": "Atajos para tus carteras",
"privacy_clipboard_explanation": "Muestra atajos si encuentra direcciones o facturas en tu portapapeles.",
"privacy_do_not_track": "Desabilitar Analytics",
"privacy_do_not_track": "Deshabilitar analíticas",
"privacy_do_not_track_explanation": "Los datos sobre funcionamiento y fiabilidad no serán enviados para ser analizados.",
"rate": "Tasa",
"selfTest": "Self-Test",
"selfTest": "Autodiagnóstico",
"save": "Guardar",
"saved": "Guardado",
"total_balance": "Balance total",
"total_balance_explanation": "Muestra el balance total de todas tus carteras en los widgets de tu pantalla principal.",
"widgets": "Widgets",
"tools": "Herramientas"
"tools": "Herramientas",
"performance_score": "Puntuación de rendimiento: {num}",
"run_performance_test": "Probar rendimiento",
"block_explorer_invalid_custom_url": "La URL proporcionada no es válida. Por favor, introduce una URL válida que empiece por http:// o https://.",
"privacy_temporary_screenshots": "Permitir captura de pantalla",
"privacy_temporary_screenshots_instructions": "La protección contra captura de pantalla se desactivará temporalmente, permitiendo realizar capturas y grabaciones de pantalla. La protección se reactivará automáticamente cuando cierres y vuelvas a abrir BlueWallet.",
"biometrics_no_longer_available": "Los ajustes de tu dispositivo han cambiado y ya no coinciden con los ajustes de seguridad seleccionados en la aplicación. Por favor, vuelve a habilitar la biometría o el código de acceso y reinicia la aplicación para aplicar estos cambios.",
"biom_no_passcode": "Tu dispositivo no tiene un código de acceso ni biometría habilitados. Para continuar, por favor configura un código de acceso o biometría en la aplicación Ajustes.",
"currency_source": "La tasa se obtiene de",
"donate": "Donar",
"donate_description": "¡Ayúdanos a mantener Blue gratis!",
"electrum_error_connect": "No se puede conectar al servidor Electrum proporcionado",
"electrum_error_connect_tor": "No se puede conectar al servidor Electrum proporcionado. Por favor, asegúrate de que la aplicación Orbot está conectada y vuelve a intentarlo.",
"set_lndhub_as_default": "¿Establecer {url} como servidor LNDhub por defecto?",
"electrum_preferred_server": "Servidor preferido",
"electrum_preferred_server_description": "Introduce el servidor que quieres que tu cartera utilice para todas las actividades de Bitcoin. Una vez establecido, tu cartera usará exclusivamente este servidor para comprobar balances, enviar transacciones y obtener datos de la red. Asegúrate de confiar en este servidor antes de configurarlo.",
"electrum_history": "Historial",
"electrum_reset_to_default": "Esto permitirá que BlueWallet elija aleatoriamente un servidor de la lista de servidores.",
"electrum_reset_to_default_and_clear_history": "Restablecer valores predeterminados y borrar historial",
"encrypt_enc_and_pass": "Protegido con contraseña",
"encrypt_storage_explanation_headline": "Habilitar cifrado del almacenamiento",
"encrypt_storage_explanation_description_line1": "Habilitar el cifrado del almacenamiento añade una capa adicional de protección a tu aplicación al asegurar la forma en que tus datos se almacenan en el dispositivo. Esto dificulta que cualquiera acceda a tu información sin permiso.",
"encrypt_storage_explanation_description_line2": "Sin embargo, es importante saber que este cifrado solo protege el acceso a tus carteras almacenadas en el keychain del dispositivo. No pone una contraseña ni ninguna protección adicional a las carteras en sí.",
"i_understand": "Entiendo",
"block_explorer": "Explorador de bloques",
"block_explorer_preferred": "Usar el explorador de bloques preferido",
"block_explorer_error_saving_custom": "Error al guardar el explorador de bloques preferido",
"set_as_preferred": "Establecer como preferido",
"set_as_preferred_electrum": "Establecer {host}:{port} como servidor preferido deshabilitará la conexión aleatoria a un servidor sugerido.",
"encrypted_feature_disabled": "Esta función no puede usarse con el almacenamiento cifrado habilitado.",
"encrypt_use_expl": "Se usará {type} para confirmar tu identidad antes de realizar una transacción, desbloquear, exportar o eliminar una cartera.",
"biometrics_fail": "Si {type} no está habilitado, o no consigue desbloquear, puedes usar el código de acceso de tu dispositivo como alternativa.",
"license": "Licencia",
"lightning_error_lndhub_uri": "URI de LNDhub no válida",
"lightning_error_lndhub_uri_tor": "URI de LNDhub no válida. Por favor, asegúrate de que la aplicación Orbot está conectada y vuelve a intentarlo.",
"lightning_settings_explain": "Para conectarte a tu propio nodo LND, por favor instala LNDhub e introduce su URL aquí en los ajustes. Ten en cuenta que solo las carteras creadas después de guardar los cambios se conectarán al LNDhub especificado.",
"lndhub_github": "Repositorio de GitHub",
"electrum_suggested_description": "Cuando no hay un servidor preferido configurado, se seleccionará aleatoriamente un servidor sugerido para usar.",
"password_explain": "Introduce la contraseña que usarás para desbloquear tu almacenamiento.",
"privacy_quickactions_explanation": "Mantén pulsado el icono de la aplicación BlueWallet para ver rápidamente el balance de tu cartera.",
"push_notifications_explanation": "Al habilitar las notificaciones, el token de tu dispositivo se enviará al servidor, junto con las direcciones de las carteras y los IDs de transacción de todas las carteras y transacciones realizadas después de habilitar las notificaciones. El token del dispositivo se usa para enviar notificaciones, y la información de la cartera nos permite avisarte sobre Bitcoin entrante o confirmaciones de transacciones.\n\nSolo se transmite información posterior a la habilitación de las notificaciones—no se recopila nada anterior.\n\nDeshabilitar las notificaciones eliminará toda esta información del servidor. Además, eliminar una cartera de la aplicación también eliminará su información asociada del servidor.",
"success_transaction_broadcasted": "¡Tu transacción se ha emitido correctamente!"
},
"notifications": {
"would_you_like_to_receive_notifications": "¿Quires recibir notificaciones cuando detectemos transferencias entrantes?"
"would_you_like_to_receive_notifications": "¿Quieres recibir notificaciones cuando detectemos transferencias entrantes?",
"notifications_subtitle": "Pagos entrantes y confirmaciones de transacciones",
"no_and_dont_ask": "No, y no me lo vuelvas a preguntar.",
"permission_denied_message": "Has denegado el permiso para enviarte notificaciones. Si quieres recibir notificaciones, por favor habilítalas en los ajustes de tu dispositivo."
},
"transactions": {
"cancel_explain": "Reemplazaremos esta transacción con una que te pague y tenga tarifas más altas. Esto cancela efectivamente la transacción actual. Esto se llama RBF—Reemplazo por comisión.",
"cancel_no": "Esta transacción no se puede reemplazar.",
"cancel_title": "Cancelar esta transacción (RBF)",
"confirmations_lowercase": "{confirmations} confirmaciones",
"copy_link": "Copiar enlace",
"expand_note": "Expandir Nota",
"cpfp_create": "Crear",
"cpfp_exp": "Crearemos una nueva transacción que gastará tu transacción aún no confirmada. La comisión total será mayor que la comisión original, lo cual debería hacer que sea minada en menos tiempo. Esto se denomina CPFP—Child Pays For Parent.",
@ -255,43 +344,71 @@
"details_copy_block_explorer_link": "Copiar el enlace del explorador de bloques",
"details_copy_note": "Copiar nota",
"details_copy_txid": "Copiar el ID de la transacción",
"details_from": "Origen",
"details_inputs": "Inputs",
"details_outputs": "Outputs",
"details_inputs": "Entradas",
"details_outputs": "Salidas",
"date": "Fecha",
"details_received": "Recibido",
"details_title": "Transaccion",
"details_title": "Transacción",
"details_to": "Destino",
"enable_offline_signing": "Esta billetera no se está usando en conjunción con una firma offline. ¿Quieres activarlo ahora? ",
"list_conf": "Conf: {number}",
"enable_offline_signing": "Esta cartera no se está usando en conjunción con una firma offline. ¿Quieres activarlo ahora?",
"pending": "En espera",
"pending_with_amount": "En espera {amt1} ({amt2})",
"received_with_amount": "+{amt1} ({amt2})",
"eta_10m": "Tiempo estimado: En ~10 minutos",
"eta_3h": "Tiempo estimado: En ~3 horas",
"eta_1d": "Tiempo estimado: En ~1 día",
"view_wallet": "Ver {walletLabel}",
"list_conf": "Conf: {number}",
"list_title": "Transacciones",
"list_title_received": "Recibido",
"transaction": "Transaccion",
"transaction": "Transacción",
"open_url_error": "No se puede abrir el enlace con el navegador predeterminado. Cambia tu navegador predeterminado y vuelve a intentarlo.",
"rbf_explain": "Reemplazaremos esta transacción con una tarifa más alta para que se ejecute más rápido. Esto se llama RBF—Reemplazo por comisión.",
"rbf_title": "Incrementar comisión (RBF)",
"status_bump": "Aumentar comisón",
"status_bump": "Aumentar comisión",
"status_cancel": "Cancelar transacción",
"transactions_count": "Número de transacciones",
"txid": "ID de transacción ",
"updating": "Actualizando... "
"txid": "ID de transacción",
"updating": "Actualizando...",
"transaction_loading_error": "Ha habido un problema al cargar la transacción. Por favor, inténtalo de nuevo más tarde.",
"transaction_not_available": "Transacción no disponible",
"details_view_in_browser": "Ver en el navegador",
"incoming_transaction": "Transacción entrante",
"outgoing_transaction": "Transacción saliente",
"expired_transaction": "Transacción caducada",
"pending_transaction": "Transacción pendiente",
"offchain": "off-chain",
"onchain": "on-chain",
"list_title_sent": "Enviado",
"watchOnlyWarningTitle": "Aviso de seguridad",
"watchOnlyWarningDescription": "Ten cuidado con los estafadores que suelen usar carteras de solo lectura para engañar a los usuarios. Estas carteras no te permiten controlar ni enviar fondos; solo te dejan ver el balance.",
"custom_fee_warning_title": "Aviso",
"custom_fee_warning_description": "Las comisiones por debajo de 1 sat/vB son válidas, pero pueden no ser retransmitidas debido a las políticas de los nodos.",
"details_eta_analyzing": "Analizando...",
"details_sent": "Enviado",
"details_section": "Detalles",
"details_explorer": "explorador",
"details_network_fee": "Comisión de red",
"details_to_address": "Para",
"details_note": "Nota",
"details_add_note": "añadir",
"details_advanced": "Avanzado",
"details_fee_rate": "Tasa de comisión",
"details_size": "Tamaño",
"details_virtual_size": "Tamaño virtual",
"details_tx_hex": "Hex de la tx",
"details_inputs_count": "Entradas ({count})",
"details_outputs_count": "Salidas ({count})",
"details_id": "ID"
},
"wallets": {
"add_bitcoin": "Bitcoin",
"add_bitcoin_explain": "Una cartera de Bitcoin útil y facil de usar",
"add_bitcoin_explain": "Una cartera de Bitcoin útil y fácil de usar",
"add_create": "Crear",
"total_balance": "Balance total",
"add_entropy": "Entropía ",
"add_entropy": "Entropía",
"add_entropy_generated": "{gen} bytes de entropía generada",
"add_entropy_provide": "Entropía lanzando dados",
"add_entropy_remain": "{gen} bytes of entropía generada. Los {rem} bytes restantes serán obtenidos del generador de números aleatorios.",
"add_entropy_remain": "{gen} bytes de entropía generada. Los {rem} bytes restantes serán obtenidos del generador de números aleatorios.",
"add_import_wallet": "Importar cartera",
"add_lightning": "Lightning",
"add_lightning_explain": "Para pagos con transferencias instantáneas",
@ -320,15 +437,15 @@
"wallets": "Carteras",
"details_type": "Tipo",
"details_use_with_hardware_wallet": "Usar con cartera de hardware",
"details_yes_delete": "Si, eliminar",
"enter_bip38_password": "Introduce el password para descifrar",
"details_yes_delete": "Sí, eliminar",
"enter_bip38_password": "Introduce la contraseña para descifrar",
"export_title": "Exportación de cartera",
"import_do_import": "Importar",
"import_passphrase": "Passphrase",
"import_passphrase_title": "Passphrase",
"import_passphrase": "Frase de contraseña",
"import_passphrase_title": "Frase de contraseña",
"import_passphrase_message": "Introduce la passphrase si has usado una",
"import_error": "Error al importar. Por favor, asegúrate de que los datos introducidos son correctos.",
"import_explanation": "Introduce las palabras de tu semilla, llave pública, WIF, o cualquier otra cosa que tengas. BlueWallet hará lo posible para descifrar el formato correcto e importar tu cartera. ",
"import_explanation": "Introduce las palabras de tu semilla, llave pública, WIF, o cualquier otra cosa que tengas. BlueWallet hará lo posible para descifrar el formato correcto e importar tu cartera.",
"import_imported": "Importado",
"import_scan_qr": "Escanear o importar un archivo",
"import_success": "Tu cartera ha sido importada.",
@ -352,20 +469,63 @@
"list_long_scan": "Escanear código QR",
"list_title": "Carteras",
"list_tryagain": "Inténtalo otra vez",
"no_ln_wallet_error": "Antes de pagar una factura Lightning, primero debe agregar una cartera Lightning.",
"no_ln_wallet_error": "Antes de pagar una factura Lightning, primero debes agregar una cartera Lightning.",
"looks_like_bip38": "Parece que esto es una llave privada protegida con contraseña (BIP38).",
"please_continue_scanning": "Por favor, continúa escaneando.",
"select_no_bitcoin": "No hay carteras de Bitcoin disponibles.",
"select_no_bitcoin_exp": "Una cartera de Bitcoin es necesaria para recargar una cartera Lightning. Por favor, cree o importe una.",
"select_no_bitcoin_exp": "Una cartera de Bitcoin es necesaria para recargar una cartera Lightning. Por favor, crea o importa una.",
"select_wallet": "Selecciona una cartera",
"xpub_copiedToClipboard": "Copiado a portapapeles.",
"pull_to_refresh": "Desliza el dedo de arriba a abajo para actualizar",
"add_ln_wallet_first": "Primero tienes que agregar una cartera Lightning.",
"identity_pubkey": "Identity Pubkey",
"xpub_title": "XPUB de la cartera"
"identity_pubkey": "Clave pública de identidad",
"xpub_title": "XPUB de la cartera",
"add_entropy_reset_title": "Restablecer entropía",
"add_entropy_reset_message": "Cambiar el tipo de cartera restablecerá la entropía actual. ¿Quieres continuar?",
"add_entropy_bytes": "{bytes} bytes de entropía",
"add_lndhub": "Conectar a tu LNDhub",
"add_lndhub_error": "La dirección del nodo proporcionada no es un nodo LNDhub válido.",
"add_wallet_seed_length": "Longitud de la semilla",
"add_wallet_seed_length_12": "12 palabras",
"add_wallet_seed_length_24": "24 palabras",
"clear_clipboard_on_import": "Borrar portapapeles al importar",
"details_del_wb_err": "La cantidad de balance proporcionada no coincide con el balance de esta cartera. Por favor, inténtalo de nuevo.",
"details_display": "Mostrar en la pantalla de inicio",
"swipe_balance_hide": "Ocultar",
"swipe_balance_show": "Mostrar",
"drag_to_reorder": "Arrastra para reordenar",
"clear_search": "Borrar búsqueda",
"import_success_watchonly": "Tu cartera ha sido importada correctamente. ADVERTENCIA: esta es una cartera de solo lectura, NO puedes gastar desde ella.",
"learn_more": "Más información",
"import_discovery_offline": "BlueWallet está actualmente en modo sin conexión. En este modo, no puede verificar la existencia de la cartera, por lo que tendrás que seleccionar la correcta manualmente",
"import_derivation_found": "Encontrada",
"import_derivation_found_not": "No encontrada",
"import_derivation_loading": "Cargando...",
"import_derivation_subtitle": "Introduce una ruta de derivación personalizada e intentaremos descubrir tu cartera.",
"import_derivation_unknown": "Desconocido",
"import_wrong_path": "Ruta de derivación incorrecta",
"list_create_a_wallet_text": "Es gratis, y puedes crear \ntantas como quieras.",
"manage_title": "Administrar carteras",
"no_results_found": "No se han encontrado resultados.",
"warning_do_not_disclose": "Nunca compartas la información de abajo",
"scan_import": "Escanea este código QR para importar tu cartera en otra aplicación.",
"write_down_header": "Crear una copia de seguridad manual",
"write_down": "Apunta y guarda de forma segura estas palabras. Úsalas para restaurar tu cartera más tarde.",
"wallet_type_this": "El tipo de esta cartera es {type}.",
"share_number": "Compartir {number}",
"copy_ln_url": "Copia y guarda de forma segura esta URL para restaurar tu cartera más tarde.",
"copy_ln_public": "Copia y guarda de forma segura esta información para restaurar tu cartera más tarde.",
"manage_wallets_search_placeholder": "Buscar carteras, direcciones, transacciones y comentarios",
"more_info": "Más información",
"details_delete_wallet_error_message": "Ha habido un problema al confirmar si esta cartera fue eliminada de las notificaciones—esto podría deberse a un problema de red o una conexión deficiente. Si continúas, podrías seguir recibiendo notificaciones de transacciones relacionadas con esta cartera, incluso después de eliminarla.",
"details_delete_anyway": "Eliminar de todos modos"
},
"total_balance_view": {
"title": "Balance total"
"title": "Balance total",
"display_in_bitcoin": "Mostrar en Bitcoin",
"hide": "Ocultar",
"display_in_sats": "Mostrar en sats",
"display_in_fiat": "Mostrar en {currency}",
"explanation": "Visualiza el balance total de todas tus carteras en la pantalla de resumen."
},
"multisig": {
"multisig_vault": "Vault multifirma",
@ -384,8 +544,8 @@
"signatures_required_to_spend": "{number} firmas requeridas",
"signatures_we_can_make": "puede hacer {number}",
"scan_or_import_file": "Escanear o importar archivo",
"export_coordination_setup": "exportar coordinacion",
"cosign_this_transaction": "Co-firmar esta transacción?",
"export_coordination_setup": "Exportar coordinación",
"cosign_this_transaction": "¿Co-firmar esta transacción?",
"lets_start": "Comencemos",
"create": "Crear",
"native_segwit_title": "La mejor opción para la mayoría de usuarios",
@ -420,23 +580,38 @@
"ms_help": "Ayuda",
"ms_help_title": "Cómo funcionan las Vaults multifirma: Consejos y trucos",
"ms_help_text": "Una cartera con múltiples claves, para aumentar exponencialmente la seguridad o para custodia compartida.",
"ms_help_title1": "Se recomienda usar multiples dispositivos.",
"ms_help_title1": "Se recomienda usar múltiples dispositivos.",
"ms_help_1": "La Vault funcionará con otras aplicaciones de BlueWallet y carteras compatibles con PSBT como Electrum, Spectre, Coldcard, Cobo Vault, etc.",
"ms_help_title2": "Editar claves",
"ms_help_2": "Puedes crear todas las claves de la Vault en este dispositivo y eliminarlas o editarlas más tarde. Tener todas las claves en el mismo dispositivo tiene la misma seguridad que una cartera de Bitcoin convencional.",
"ms_help_title3": "Copias de seguridad de la Vault",
"ms_help_3": "En las opciones de la cartera, encontrarás la copia de seguridad de tu Vault y de tu cartera de solo-ver. Esta copia de seguridad es como un mapa de tu cartera. Es esencial para recuperar tu cartera si pierdes una de tus semillas. ",
"ms_help_3": "En las opciones de la cartera, encontrarás la copia de seguridad de tu Vault y de tu cartera de solo-ver. Esta copia de seguridad es como un mapa de tu cartera. Es esencial para recuperar tu cartera si pierdes una de tus semillas.",
"ms_help_title4": "Importando Vaults",
"ms_help_4": "Para importar una Vault multifirma, selecciona la opción de importar y usa la copia de seguridad. Si solo tienes claves extendidas y semillas, puedes usar los campos de importación individuales durante el proceso de crear una Vault.",
"ms_help_title5": "Opciones avanzadas",
"ms_help_5": "Por defecto, BlueWallet creará una Vault 2-de-3. Para crear una con diferente quórum o para cambiar el tipo de dirección, activa las opciones avanzadas en Ajustes - General."
"ms_help_5": "Por defecto, BlueWallet creará una Vault 2-de-3. Para crear una con diferente quórum o para cambiar el tipo de dirección, activa las opciones avanzadas en Ajustes - General.",
"provide_signature_details": "Usa tu dispositivo y la cartera donde reside la clave para firmar esta transacción",
"provide_signature_details_bluewallet": "En BlueWallet, ve al menú de la pantalla Enviar y selecciona ",
"provide_signature_next_steps": "Escanea o importa la transacción firmada",
"provide_signature_next_steps_details": "Una vez que tu cartera haya firmado correctamente la transacción, escanea el código QR proporcionado o importa el archivo correspondiente y, a continuación, revisa todos los detalles de la transacción antes de emitirla.",
"share": "Compartir...",
"shared_key_detected": "Cofirmante compartido",
"shared_key_detected_question": "Se ha compartido un cofirmante contigo, ¿quieres importarlo?",
"invalid_mnemonics": "Esta frase mnemónica no parece ser válida.",
"invalid_cosigner": "Datos de cofirmante no válidos",
"invalid_cosigner_format": "Cofirmante incorrecto: este no es un cofirmante para el formato {format}.",
"this_is_cosigners_xpub": "Este es el XPUB del cofirmante—listo para ser importado en otra cartera. Es seguro compartirlo.",
"this_is_cosigners_xpub_airdrop": "Si compartes vía AirDrop, los receptores deben estar en la pantalla de coordinación.",
"view_edit_cosigners": "Ver/editar cofirmantes",
"this_cosigner_is_already_imported": "Este cofirmante ya está importado."
},
"is_it_my_address": {
"title": "¿Es esta mi dirección?",
"owns": "{address} pertenece a {label}",
"enter_address": "Introduce la dirección",
"check_address": "Comprobar dirección",
"no_wallet_owns_address": "Ninguna de las carteras disponibles posee la dirección proporcionada."
"no_wallet_owns_address": "Ninguna de las carteras disponibles posee la dirección proporcionada.",
"view_qrcode": "Ver código QR"
},
"cc": {
"change": "Cambio",
@ -450,7 +625,13 @@
"use_coins": "Usar monedas",
"tip": "Te permite ver, etiquetar, congelar o seleccionar monedas para mejorar la organización de las carteras.",
"sort_label": "Etiqueta",
"sort_status": "Estado"
"sort_status": "Estado",
"empty": "Esta cartera no tiene monedas en este momento.",
"sort_asc": "Ascendente",
"sort_desc": "Descendente",
"sort_height": "Altura",
"sort_value": "Valor",
"sort_by": "Ordenar por"
},
"units": {
"BTC": "BTC",
@ -459,6 +640,8 @@
"sats": "sats"
},
"addresses": {
"copy_private_key": "Copiar llave privada",
"sensitive_private_key": "Advertencia: las llaves privadas son extremadamente sensibles. ¿Continuar?",
"sign_title": "Firmar/Verificar mensaje",
"sign_help": "Aquí puedes crear o verificar una firma criptográfica basada en una dirección de Bitcoin.",
"sign_sign": "Firmar",
@ -476,18 +659,46 @@
},
"lnurl_auth": {
"register_question_part_1": "¿Te gustaría registrar una cuenta en",
"register_question_part_2": "usando tu billetera Lightning?",
"register_question_part_2": "usando tu cartera Lightning?",
"register_answer": "¡Has registrado con éxito una cuenta en {hostname}!",
"login_question_part_1": "¿Te gustaría iniciar sesión en",
"login_question_part_2": "usando tu billetera Lightning?",
"login_question_part_2": "usando tu cartera Lightning?",
"login_answer": "¡Has iniciado sesión correctamente en {hostname}!",
"link_question_part_1": "¿Te gustaría vincular tu cuenta en",
"link_question_part_2": "a tu cartera Lightning?",
"link_answer": "¡Tu cartera Lightning se vinculó con éxito a tu cuenta en {hostname}!",
"auth_question_part_1": "¿Te gustaría ser autenticado en",
"auth_question_part_2": "usando tu billetera Lightning?",
"auth_question_part_2": "usando tu cartera Lightning?",
"auth_answer": "¡Te has autenticado con éxito en {hostname}!",
"could_not_auth": "No pudimos autenticarte en {hostname}.",
"authenticate": "Autenticar"
},
"autofill_word": {
"title": "Última palabra de la semilla",
"enter": "Introduce tu frase mnemónica parcial",
"generate_word": "Generar la última palabra",
"error": "La entrada no es una frase mnemónica parcial de 11 o 23 palabras. Por favor, inténtalo de nuevo."
},
"bip47": {
"payment_code": "Código de pago",
"contacts": "Contactos",
"bip47_explain": "Código reutilizable y compartible",
"bip47_explain_subtitle": "BIP47",
"purpose": "Código reutilizable y compartible (BIP47)",
"pay_this_contact": "Pagar a este contacto",
"rename_contact": "Renombrar contacto",
"copy_payment_code": "Copiar código de pago",
"hide_contact": "Ocultar contacto",
"rename": "Renombrar",
"provide_name": "Proporciona un nuevo nombre para este contacto",
"add_contact": "Añadir contacto",
"provide_payment_code": "Proporciona el código de pago",
"invalid_pc": "Código de pago no válido",
"notification_tx_unconfirmed": "La transacción de notificación aún no está confirmada, por favor espera",
"failed_create_notif_tx": "Error al crear la transacción on-chain",
"onchain_tx_needed": "Se necesita una transacción on-chain",
"notif_tx_sent": "Transacción de notificación enviada. Por favor, espera a que se confirme",
"notif_tx": "Transacción de notificación",
"not_found": "Código de pago no encontrado"
}
}

View File

@ -2,18 +2,19 @@
"_": {
"bad_password": "Contraseña incorrecta. Intenta nuevamente.",
"cancel": "Cancelar",
"continue": "Continúa",
"continue": "Continuar",
"clipboard": "Portapapeles",
"copied": "¡Copiado!",
"discard_changes": "¿Descartar cambios?",
"discard_changes_explain": "Tienes cambios sin guardar. ¿Estás seguro de que quieres descartarlos y salir de la pantalla?",
"enter_password": "Ingresar contraseña",
"no": "No",
"never": "Nunca",
"of": "{number} de {total}",
"ok": "OK",
"enter_url": "Introducir URL",
"storage_is_encrypted": "Tu almacenamiento está encriptado. Se requiere contraseña para descifrarlo.",
"yes": "Sí",
"no": "No",
"save": "Guardar",
"seed": "Semilla",
"success": "Éxito",
@ -42,7 +43,7 @@
},
"entropy": {
"save": "Guardar",
"title": "Entropía ",
"title": "Entropía",
"undo": "Deshacer",
"amountOfEntropy": "{bits} de {limit} bits"
},
@ -58,7 +59,7 @@
"payButton": "Pagar",
"payment": "Pago",
"placeholder": "Factura o dirección",
"potentialFee": "Tasas potenciales: {fee}",
"potentialFee": "Comisión potencial: {fee}",
"refill": "Recarga",
"refill_create": "Para continuar, crea una billetera Bitcoin para recargar.",
"refill_external": "Recarga con billetera externa",
@ -71,8 +72,8 @@
"for": "Para:",
"lightning_invoice": "Factura Lightning",
"please_pay_between_and": "Paga entre {min} y {max}",
"please_pay": "Pagar por favor",
"preimage": "Imagen previa",
"please_pay": "Por favor paga",
"preimage": "Preimagen",
"sats": "sats.",
"date_time": "Fecha y hora",
"wasnt_paid_and_expired": "Esta factura no se pagó y ha caducado."
@ -81,7 +82,7 @@
"create_fake_storage": "Crear almacenamiento encriptado",
"create_password_explanation": "La contraseña del almacenamiento falso no debe coincidir con la contraseña de tu almacenamiento principal.",
"help": "Bajo ciertas circunstancias, podrías verte obligado a revelar una contraseña. Para mantener tus monedas seguras, BlueWallet puede crear otro almacenamiento encriptado, con una contraseña diferente. Bajo presión puedes revelar esta contraseña a un tercero. Si se ingresa en BlueWallet, desbloqueará un nuevo almacenamiento \"falso\". Esto parecerá legítimo para un tercero, pero en secreto mantendrá tu almacenamiento principal con monedas seguras.",
"help2": "El nuevo almacén será completamente funcional, y puedes almacenar cantidades mínimas para que sea mas creíble.",
"help2": "El nuevo almacén será completamente funcional, y puedes almacenar cantidades mínimas para que sea más creíble.",
"password_should_not_match": "La contraseña está actualmente en uso. Intenta con una contraseña diferente.",
"title": "Negación plausible"
},
@ -112,7 +113,7 @@
},
"send": {
"provided_address_is_invoice": "Esta dirección parece ser para una factura Lightning. Por favor, ve a tu billetera Lightning para realizar el pago de esta factura.",
"broadcastButton": "Transmitiendo",
"broadcastButton": "Transmitir",
"broadcastError": "Error",
"broadcastNone": "Introducir hex de transacción",
"broadcastPending": "Pendiente",
@ -123,7 +124,7 @@
"create_broadcast": "Transmitir",
"create_copy": "Copiar y transmitir más tarde",
"create_details": "Detalles",
"create_fee": "Tasa",
"create_fee": "Comisión",
"create_memo": "Nota",
"create_satoshi_per_vbyte": "Satoshi por vByte",
"create_this_is_hex": "Este es el hex de tu transacción, firmado y listo para ser transmitido a la red.",
@ -151,12 +152,11 @@
"details_amount_field_is_less_than_minimum_amount_sat": "La cantidad especificada es demasiado pequeña. Introduce una cantidad superior a 500 sats.",
"details_create": "Crear Factura",
"details_error_decode": "No se puede decodificar la dirección de Bitcoin",
"details_fee_field_is_not_valid": "La tasa no es válida.",
"details_fee_field_is_not_valid": "La comisión no es válida.",
"details_frozen": "{amount} BTC está congelado.",
"details_next": "Siguiente",
"details_no_signed_tx": "El archivo seleccionado no contiene una transacción que se pueda importar.",
"details_note_placeholder": "Nota personal",
"counterparty_label_placeholder": "Editar nombre de contacto",
"details_scan": "Escanear",
"details_scan_hint": "Toca dos veces para escanear o importar un destino",
"details_scan_error": "Error de escaneo",
@ -173,10 +173,10 @@
"fee_1d": "1d",
"fee_3h": "3h",
"fee_custom": "Personalizado",
"insert_custom_fee": "Insertar tasa",
"insert_custom_fee": "Insertar comisión",
"fee_fast": "Rápido",
"fee_medium": "Medio",
"fee_replace_minvb": "La tasa de tarifa total (satoshi por vByte) que deseas pagar debe ser superior a {min} sat/vByte.",
"fee_replace_minvb": "La comisión total (satoshi por vByte) que deseas pagar debe ser superior a {min} sat/vByte.",
"fee_satvbyte": "en sat/vByte",
"fee_slow": "Lento",
"header": "Enviar",
@ -191,10 +191,10 @@
"permission_storage_denied_message": "BlueWallet no puede guardar este archivo. Por favor, abre la configuración de tu dispositivo y activa el permiso de almacenamiento.",
"permission_storage_title": "Permiso de acceso de almacenamiento",
"psbt_clipboard": "Copiar al portapapeles",
"psbt_this_is_psbt": "Esta es una Transacción Bitcoin Parcialmente Firmada (PSBT). Para finalizar por favor fírmala con tu hardware wallet.",
"psbt_this_is_psbt": "Esta es una Transacción Bitcoin Parcialmente Firmada (PSBT). Para finalizar, por favor fírmala con tu billetera de hardware.",
"psbt_tx_export": "Exportar a archivo",
"no_tx_signing_in_progress": "No hay ninguna transacción en curso.",
"outdated_rate": "La tarifa se actualizó por última vez: {date}",
"outdated_rate": "La cotización se actualizó por última vez: {date}",
"psbt_tx_open": "Abrir transacción firmada",
"psbt_tx_scan": "Escanear transacción firmada",
"qr_error_no_qrcode": "No pudimos encontrar un código QR válido en la imagen seleccionada. Asegúrate de que la imagen contenga solo un código QR y ningún contenido adicional, como texto o botones.",
@ -205,7 +205,7 @@
"file_saved_at_path": "El archivo ({filePath}) se ha guardado.",
"cant_send_to_silentpayment_adress": "Esta billetera no puede enviar a direcciones de SilentPayment",
"cant_send_to_bip47": "Esta billetera no puede enviar códigos de pago BIP47",
"cant_find_bip47_notification": "Agrega este código de pago primero a tus contactos ",
"cant_find_bip47_notification": "Agrega este código de pago primero a tus contactos",
"problem_with_psbt": "Problema con PSBT"
},
"settings": {
@ -220,22 +220,23 @@
"run_performance_test": "Prueba de rendimiento",
"about_selftest": "Ejecutar auto-prueba",
"block_explorer_invalid_custom_url": "La URL proporcionada no es válida. Ingresa una URL válida que comience con http:// o https://.",
"about_selftest_electrum_disabled": "La autocomprobación no está disponible con el modo sin conexión de Electrum. Desactiva el modo sin conexión y vuelve a intentarlo. ",
"about_selftest_electrum_disabled": "La autocomprobación no está disponible con el modo sin conexión de Electrum. Desactiva el modo sin conexión y vuelve a intentarlo.",
"about_selftest_ok": "Todas las pruebas internas han pasado satisfactoriamente. La billetera funciona bien.",
"about_sm_github": "GitHub",
"about_sm_telegram": "Chat de Telegram ",
"about_sm_telegram": "Chat de Telegram",
"privacy_temporary_screenshots": "Permitir captura de pantalla",
"privacy_temporary_screenshots_instructions": "La protección contra capturas de pantalla se desactivará temporalmente, lo que permitirá realizar capturas y grabaciones de pantalla. La protección se reactivará automáticamente cuando cierre y vuelva a abrir BlueWallet.",
"privacy_temporary_screenshots_instructions": "La protección contra capturas de pantalla se desactivará temporalmente, lo que permitirá realizar capturas y grabaciones de pantalla. La protección se reactivará automáticamente cuando cierres y vuelvas a abrir BlueWallet.",
"biometrics": "Biometría",
"biometrics_no_longer_available": "La configuración de tu dispositivo cambió y ya no coincide con la configuración de seguridad seleccionada en la aplicación. Vuelve a habilitar los datos biométricos o el código de acceso, luego reinicia la aplicación para aplicar estos cambios.",
"biom_10times": "Has intentado ingresar tu contraseña 10 veces. ¿Te gustaría restablecer tu almacenamiento? Esto eliminará todas las billeteras y descifrará tu almacenamiento.",
"biom_conf_identity": "Por favor confirma tu identidad.",
"biom_no_passcode": "tu dispositivo no tiene un código de acceso ni datos biométricos habilitados. Para continuar, configura un código de acceso o datos biométricos en la aplicación Configuración.",
"biom_no_passcode": "Tu dispositivo no tiene un código de acceso ni datos biométricos habilitados. Para continuar, configura un código de acceso o datos biométricos en la aplicación Configuración.",
"biom_remove_decrypt": "Se eliminarán todas tus billeteras y se descifrará tu almacenamiento. ¿Estás seguro que deseas continuar?",
"currency": "Divisa",
"currency_source": "La tarifa se obtiene de",
"currency_source": "La cotización se obtiene de",
"currency_fetch_error": "Se produjo un error al obtener el tipo de cambio de la divisa seleccionada.",
"default_title": "Al inicio",
"general": "General",
"donate": "Donar",
"donate_description": "¡Ayúdanos a mantener Blue libre!",
"electrum_connected": "Conectado",
@ -249,7 +250,7 @@
"electrum_port": "Puerto, generalmente {example}",
"use_ssl": "Utiliza SSL",
"electrum_saved": "Tus cambios se han guardado correctamente. Es necesario reiniciar para que los cambios surtan efecto.",
"set_electrum_server_as_default": "Establecer {server} como el servidor Electrum predeterminado?",
"set_electrum_server_as_default": "¿Establecer {server} como el servidor Electrum predeterminado?",
"set_lndhub_as_default": "¿Establecer {url} como servidor LNDhub predeterminado?",
"electrum_settings_server": "Servidor Electrum",
"electrum_status": "Estado",
@ -278,9 +279,8 @@
"encrypted_feature_disabled": "Esta función no se puede utilizar con el almacenamiento cifrado habilitado.",
"encrypt_use_expl": "{type} se utilizará para confirmar tu identidad antes de realizar una transacción, desbloquear, exportar o eliminar una billetera.",
"biometrics_fail": "Si {type} no está activado o no se desbloquea, puedes utilizar el código de acceso de tu dispositivo como alternativa.",
"general": "General",
"general_continuity": "Continuidad",
"general_continuity_e": "Cuando esté habilitado, podrás ver carteras seleccionadas y transacciones utilizando tus otros dispositivos conectados a Apple iCloud.",
"general_continuity_e": "Cuando esté habilitado, podrás ver billeteras seleccionadas y transacciones utilizando tus otros dispositivos conectados a Apple iCloud.",
"groundcontrol_explanation": "GroundControl es un servidor de notificaciones push de código abierto gratuito para billeteras Bitcoin. Puedes instalar tu propio servidor GroundControl y poner tu URL aquí para no depender de la infraestructura de BlueWallet. Déjalo en blanco para usar el predeterminado.",
"header": "Ajustes",
"language": "Idioma",
@ -292,7 +292,7 @@
"lightning_saved": "Tus cambios han sido guardados correctamente.",
"lightning_settings": "Configuración de Lightning",
"lightning_settings_explain": "Para conectarte a tu propio nodo LND, instala LNDhub y coloca su URL aquí en la configuración. Ten en cuenta que solo las billeteras creadas después de guardar los cambios se conectarán al LNDhub especificado.",
"lndhub_github": "GitHub Repository",
"lndhub_github": "Repositorio de GitHub",
"network": "Red",
"network_broadcast": "Publicar transacción",
"network_electrum": "Servidor Electrum",
@ -307,7 +307,7 @@
"privacy_read_clipboard": "Leer portapapeles",
"privacy_system_settings": "Configuración de sistema",
"privacy_quickactions": "Atajos de la Billetera",
"privacy_quickactions_explanation": "Mantén pulsado el icono de la aplicación BlueWallet para ver rápidamente el saldo de tu cartera.",
"privacy_quickactions_explanation": "Mantén pulsado el icono de la aplicación BlueWallet para ver rápidamente el saldo de tu billetera.",
"privacy_clipboard_explanation": "Proporciona atajos si encuentras una dirección o factura en tu portapapeles.",
"privacy_do_not_track": "Desactivar análisis",
"privacy_do_not_track_explanation": "La información de rendimiento y confiabilidad no se enviará para su análisis.",
@ -319,8 +319,8 @@
"success_transaction_broadcasted": "¡Tu transacción ha sido transmitida exitosamente!",
"total_balance": "Balance Total",
"total_balance_explanation": "Muestra el saldo total de todas tus billeteras en los widgets de tu pantalla de inicio.",
"widgets": "Widgets",
"tools": "Herramientas"
"tools": "Herramientas",
"widgets": "Widgets"
},
"notifications": {
"would_you_like_to_receive_notifications": "¿Te gustaría recibir notificaciones cuando recibas pagos entrantes?",
@ -331,11 +331,10 @@
"transactions": {
"cancel_explain": "Reemplazaremos esta transacción con una que te pague y tenga tarifas más altas. Esto cancela efectivamente la transacción actual. Esto se llama RBF (Replace by Fee).",
"cancel_no": "Esta transacción no es reemplazable.",
"cancel_title": "Cancelar ésta transacción (RBF)",
"cancel_title": "Cancelar esta transacción (RBF)",
"transaction_loading_error": "Se ha producido un problema al cargar la transacción. Vuelve a intentarlo más tarde.",
"transaction_not_available": "Transacción no disponible",
"confirmations_lowercase": "{confirmations} confirmaciones",
"copy_link": "Copiar enlace",
"expand_note": "Expandir Nota",
"cpfp_create": "Crear",
"cpfp_exp": "Crearemos otra transacción que gaste tu transacción no confirmada. La tarifa total será más alta que la tarifa de la transacción original, por lo que debería extraerse más rápido. Esto se llama CPFP (Child Pays for Parent).",
@ -347,7 +346,7 @@
"details_copy_block_explorer_link": "Copiar el enlace del explorador de bloques",
"details_copy_note": "Copiar nota",
"details_copy_txid": "Copiar ID de transacción",
"details_from": "Entrada",
"details_id": "ID",
"details_inputs": "Entradas",
"details_outputs": "Salidas",
"date": "Fecha",
@ -362,14 +361,13 @@
"onchain": "En cadena",
"details_to": "Salida",
"enable_offline_signing": "Esta billetera no se usa junto con una firma fuera de línea. ¿Deseas habilitarlo ahora?",
"list_conf": "Conf: {number}",
"pending": "Pendiente",
"pending_with_amount": "Pendiente {amt1} ({amt2})",
"received_with_amount": "+{amt1} ({amt2})",
"eta_10m": "TEA: en ~ 10 minutos",
"eta_3h": "TEA: en ~ 3 horas",
"eta_1d": "TEA: en ~ 1 día",
"view_wallet": "Ver {walletLabel}",
"list_conf": "Conf: {number}",
"list_title": "Transacciones",
"list_title_sent": "Enviado",
"list_title_received": "Recibido",
@ -381,13 +379,26 @@
"status_cancel": "Cancelar Transacción",
"transactions_count": "Número de Transacciones",
"txid": "ID de Transacción",
"from": "De: {counterparty}",
"to": "A: {counterparty}",
"updating": "Actualizando...",
"watchOnlyWarningTitle": "Advertencia de seguridad",
"watchOnlyWarningDescription": "Ten cuidado con los estafadores que suelen utilizar billeteras de \"sólo ver\" para engañar a los usuarios. Estas billeteras no permiten controlar ni enviar fondos; solo permiten ver el saldo.",
"custom_fee_warning_title": "Advertencia",
"custom_fee_warning_description": "Las tarifas inferiores a 1 sat/vB son válidas, pero puede que no se retransmitan debido a las políticas de los nodos."
"custom_fee_warning_description": "Las tarifas inferiores a 1 sat/vB son válidas, pero puede que no se retransmitan debido a las políticas de los nodos.",
"details_eta_analyzing": "Analizando...",
"details_sent": "Enviado",
"details_section": "Detalles",
"details_explorer": "explorador",
"details_network_fee": "Comisión de red",
"details_to_address": "A",
"details_note": "Nota",
"details_add_note": "agregar",
"details_advanced": "Avanzado",
"details_fee_rate": "Tasa de comisión",
"details_size": "Tamaño",
"details_virtual_size": "Tamaño virtual",
"details_tx_hex": "Hex de transacción",
"details_inputs_count": "Entradas ({count})",
"details_outputs_count": "Salidas ({count})"
},
"wallets": {
"add_bitcoin": "Bitcoin",
@ -396,7 +407,7 @@
"total_balance": "Balance Total",
"add_entropy_reset_title": "Restablecer la entropía",
"add_entropy_reset_message": "Al cambiar el tipo de billetera se restablecerá la entropía actual. ¿Quieres continuar?",
"add_entropy": "Entropía ",
"add_entropy": "Entropía",
"add_entropy_bytes": "{bytes} bytes de entropía",
"add_entropy_generated": "{gen} bytes de entropía generada",
"add_entropy_provide": "Entropía mediante el lanzamiento de dados",
@ -414,8 +425,8 @@
"add_wallet_seed_length": "Longitud de la semilla",
"add_wallet_seed_length_12": "12 palabras",
"add_wallet_seed_length_24": "24 palabras",
"clipboard_bitcoin": "Tienes una dirección de Bitcoin en tu portapapeles. ¿te gustaría usarlo para una transacción?",
"clipboard_lightning": "Tienes una factura Lightning en tu portapapeles. ¿Te gustaría usarlo para una transacción?",
"clipboard_bitcoin": "Tienes una dirección de Bitcoin en tu portapapeles. ¿Te gustaría usarla para una transacción?",
"clipboard_lightning": "Tienes una factura Lightning en tu portapapeles. ¿Te gustaría usarla para una transacción?",
"clear_clipboard_on_import": "Limpiar el portapapeles al importar",
"details_address": "Dirección",
"details_advanced": "Avanzado",
@ -435,9 +446,13 @@
"details_show_addresses": "Mostrar direcciones",
"details_title": "Billetera",
"wallets": "Billeteras",
"swipe_balance_hide": "Ocultar",
"swipe_balance_show": "Mostrar",
"drag_to_reorder": "Arrastra para reordenar",
"clear_search": "Limpiar búsqueda",
"details_type": "Tipo",
"details_use_with_hardware_wallet": "Usar con Billetera de Hardware",
"details_yes_delete": "Si, eliminar",
"details_yes_delete": "Sí, eliminar",
"enter_bip38_password": "Ingresa la contraseña para descifrar",
"export_title": "Exportación de Billetera",
"import_do_import": "Importar",
@ -449,7 +464,7 @@
"import_imported": "Importado",
"import_scan_qr": "Escanear o importar un archivo",
"import_success": "Tu billetera se ha importado correctamente.",
"import_success_watchonly": "Tu billetera se ha importado correctamente. ADVERTENCIA: Esta es una billetera de \"solo ver\", NO puedes gastar desde él.",
"import_success_watchonly": "Tu billetera se ha importado correctamente. ADVERTENCIA: Esta es una billetera de \"solo ver\", NO puedes gastar desde ella.",
"import_search_accounts": "Buscar cuentas",
"import_title": "Importar",
"learn_more": "Saber más",
@ -461,7 +476,7 @@
"import_derivation_found": "Encontrado",
"import_derivation_found_not": "No se ha encontrado",
"import_derivation_loading": "Cargando...",
"import_derivation_subtitle": "Introduce la ruta de derivación personalizada e intentaremos descubrir tu cartera.",
"import_derivation_subtitle": "Introduce la ruta de derivación personalizada e intentaremos descubrir tu billetera.",
"import_derivation_title": "Ruta de derivación",
"import_derivation_unknown": "Desconocido",
"import_wrong_path": "Ruta de derivación incorrecta",
@ -487,7 +502,6 @@
"select_no_bitcoin": "Actualmente no hay billeteras Bitcoin disponibles.",
"select_no_bitcoin_exp": "Se requiere una billetera Bitcoin para recargar las billeteras Lightning. Por favor, crea o importa una.",
"select_wallet": "Selecciona Billetera",
"xpub_copiedToClipboard": "Copiado al portapapeles.",
"pull_to_refresh": "Tira para actualizar",
"warning_do_not_disclose": "Nunca compartas la siguiente información",
"scan_import": "Escanea este código QR para importar tu billetera en otra aplicación.",
@ -534,7 +548,7 @@
"shared_key_detected_question": "Se compartió un cofirmante contigo, ¿quieres importarlo?",
"manage_keys": "Administrar Claves",
"how_many_signatures_can_bluewallet_make": "cuántas firmas puede hacer BlueWallet",
"signatures_required_to_spend": "Se requieren firmas {number}",
"signatures_required_to_spend": "Se requieren {number} firmas",
"signatures_we_can_make": "puede hacer {number}",
"scan_or_import_file": "Escanear o importar archivo",
"export_coordination_setup": "Exportar Configuración de Coordinación",
@ -553,8 +567,8 @@
"what_is_vault_description_number_of_vault_keys": "{m} claves de la bóveda",
"what_is_vault_description_to_spend": " gastar y un tercero que puede\nutilizar como respaldo.",
"what_is_vault_description_to_spend_other": "gastar.",
"quorum": "{m} of {n} quorum",
"quorum_header": "Quorum",
"quorum": "Quórum de {m} de {n}",
"quorum_header": "Quórum",
"of": "de",
"wallet_type": "Tipo de Billetera",
"invalid_mnemonics": "Esta frase mnemotécnica no parece válida.",
@ -568,7 +582,7 @@
"this_is_cosigners_xpub": "Este es el XPUB del cofirmante, listo para importarse a otra billetera. Es seguro compartirlo.",
"this_is_cosigners_xpub_airdrop": "Si compartes vía AirDrop los receptores tienen que estar en la pantalla de coordinación.",
"wallet_key_created": "Se creó tu clave de Bóveda. Tómate un momento para hacer una copia de seguridad segura de tu semilla mnemotécnica.",
"are_you_sure_seed_will_be_lost": "¿Estás segur@? Tu semilla mnemotécnica se perderá si no tienes una copia de seguridad.",
"are_you_sure_seed_will_be_lost": "¿Estás seguro? Tu semilla mnemotécnica se perderá si no tienes una copia de seguridad.",
"forget_this_seed": "Olvídate de esta semilla y usa XPUB en su lugar.",
"view_edit_cosigners": "Ver/editar cofirmantes",
"this_cosigner_is_already_imported": "Este cofirmante ya está importado.",
@ -585,7 +599,7 @@
"ms_help_title2": "Editar Claves",
"ms_help_2": "Puedes crear todas las claves de la Bóveda en este dispositivo y eliminarlas o editarlas después. Tener todas las claves en el mismo dispositivo tiene la seguridad equivalente a la de un monedero de Bitcoin normal.",
"ms_help_title3": "Copias de seguridad de la Bóveda",
"ms_help_3": "En las opciones de la billetera, encontrarás la copia de seguridad de la bóveda y la copia de seguridad de la billetera de \"solo ver\". Esta copia de seguridad es como un mapa de tu billetera. Es esencial para la recuperación de la billetera en caso de que pierdas una de tus semillas. ",
"ms_help_3": "En las opciones de la billetera, encontrarás la copia de seguridad de la bóveda y la copia de seguridad de la billetera de \"solo ver\". Esta copia de seguridad es como un mapa de tu billetera. Es esencial para la recuperación de la billetera en caso de que pierdas una de tus semillas.",
"ms_help_title4": "Importando Bóvedas",
"ms_help_4": "Para importar una multifirma, usa tu archivo de respaldo y la función Importar. Si solo tienes semillas y XPUB, puedes utilizar el botón de importación individual al crear claves de Bóveda.",
"ms_help_title5": "Modo Avanzado",
@ -596,7 +610,7 @@
"owns": "{label} posee {address}",
"enter_address": "Ingresar dirección",
"check_address": "Verificar dirección",
"no_wallet_owns_address": "Ninguna de las carteras disponibles posee la dirección proporcionada.",
"no_wallet_owns_address": "Ninguna de las billeteras disponibles posee la dirección proporcionada.",
"view_qrcode": "Ver código QR"
},
"autofill_word": {
@ -616,7 +630,7 @@
"header": "Control de Monedas",
"use_coin": "Usar Moneda",
"use_coins": "Usar Monedas",
"tip": "Esta función te permite ver, etiquetar, congelar o seleccionar monedas para una mejor gestión de la cartera. Puedes seleccionar varias monedas tocando los círculos de colores.",
"tip": "Esta función te permite ver, etiquetar, congelar o seleccionar monedas para una mejor gestión de la billetera. Puedes seleccionar varias monedas tocando los círculos de colores.",
"sort_asc": "Ascendente",
"sort_desc": "Descendente",
"sort_height": "Altura",

View File

@ -3,46 +3,702 @@
"bad_password": "Vale parool. Palun proovi uuesti.",
"cancel": "Katkesta",
"continue": "Jätka",
"clipboard": "Lõikelaud",
"copied": "Kopeeritud!",
"discard_changes": "Loobu muudatustest?",
"discard_changes_explain": "Sul on salvestamata muudatusi. Kas oled kindel, et soovid neist loobuda ja ekraanilt lahkuda?",
"enter_password": "Sisesta parool",
"never": "Mitte kunagi",
"of": "{number} {total}-st",
"ok": "OK",
"enter_url": "Sisesta URL",
"storage_is_encrypted": "Sinu hoidla on krüpteeritud. Dekrüpteerimiseks on vajalik sisestada parool.",
"yes": "Jah",
"no": "Ei",
"save": "Salvesta...",
"seed": "Seeme",
"success": "Toiming õnnestus",
"wallet_key": "Rahakoti võti"
"wallet_key": "Rahakoti võti",
"close": "Sulge",
"change_input_currency": "Muuda sisestusvaluutat",
"refresh": "Värskenda",
"pick_image": "Vali galeriist",
"pick_file": "Vali fail",
"enter_amount": "Sisesta summa",
"qr_custom_input_button": "Koputa 10 korda kohandatud sisendi sisestamiseks",
"unlock": "Ava lukk",
"port": "Port",
"ssl_port": "SSL port",
"suggested": "Soovitatud"
},
"azteco": {
"codeIs": "Sinu vautšeri kood on",
"errorBeforeRefeem": "Enne lunastamist on vajalik lisada uus Bitcoini rahakott.",
"errorSomething": "Midagi läks valesti. Kas see vautšer on endiselt kehtiv?",
"redeem": "Lunasta rahakotti.",
"redeem": "Lunasta rahakotti",
"redeemButton": "Lunasta",
"success": "Toiming õnnestus",
"successMessage": "Vautšer edukalt lunastatud! Vahendid peaksid varsti sinu Bitcoini rahakotti saabuma.",
"title": "Lunasta Azte.co vautšer"
},
"entropy": {
"save": "Salvesta",
"title": "Entroopia",
"undo": "Tühista muudatus"
"undo": "Tühista muudatus",
"amountOfEntropy": "{bits} {limit} bitist"
},
"errors": {
"broadcast": "Ülekanne nurjus.",
"broadcast": "Leviedastus nurjus.",
"error": "Viga",
"network": "Võrgu viga"
},
"lnd": {
"errorInvoiceExpired": "Arve on aegunud.",
"expired": "Aegunud",
"expiresIn": "Aegub {time} minuti pärast",
"payButton": "Maksa",
"payment": "Makse",
"placeholder": "Arve või aadress",
"potentialFee": "Võimalik tasu: {fee}",
"refill": "Täienda",
"refill_create": "Jätkamiseks loo palun Bitcoini rahakott, millega täiendada.",
"refill_external": "Täienda välisest rahakotist",
"refill_lnd_balance": "Täienda Lightningi rahakoti saldot",
"sameWalletAsInvoiceError": "Sa ei saa arvet maksta sama rahakotiga, millega see loodi.",
"title": "Halda vahendeid"
},
"lndViewInvoice": {
"additional_info": "Lisateave",
"for": "Kellele:",
"lightning_invoice": "Lightning arve",
"please_pay_between_and": "Palun maksa {min} ja {max} vahel",
"please_pay": "Palun maksa",
"preimage": "Eelpilt",
"sats": "satid.",
"date_time": "Kuupäev ja kellaaeg",
"wasnt_paid_and_expired": "Seda arvet ei makstud ja see on aegunud."
},
"plausibledeniability": {
"create_fake_storage": "Loo krüpteeritud hoidla",
"create_password_explanation": "Võltshoidla parool ei tohi kattuda sinu peamise hoidla parooliga.",
"help": "Teatud asjaoludel võidakse sind sundida parooli avalikustama. Sinu müntide kaitseks saab BlueWallet luua veel ühe krüpteeritud hoidla teise parooliga. Surve all võid avalikustada selle parooli kolmandale isikule. Kui see sisestatakse BlueWallet'i, avab see uue „võlts“ hoidla. See tundub kolmandale isikule ehtne, kuid hoiab salaja sinu peamise müntidega hoidla turvaliselt.",
"help2": "Uus hoidla on täielikult kasutatav ja sinna võid hoida väikseid summasid, et see näeks usutavam välja.",
"password_should_not_match": "Parool on juba kasutusel. Palun proovi teist parooli.",
"title": "Usutav eitatavus"
},
"pleasebackup": {
"ask": "Kas oled salvestanud oma rahakoti taastefraasi? See taastefraas on vajalik sinu vahenditele juurdepääsuks, kui kaotad selle seadme. Ilma taastefraasita kaovad sinu vahendid jäädavalt.",
"ask_no": "Ei, ei ole.",
"ask_yes": "Jah, olen.",
"ok": "OK, ma kirjutasin selle üles.",
"ok_lnd": "OK, olen selle salvestanud.",
"text": "Palun võta hetk aega ja kirjuta see mnemooniline fraas paberile üles.\nSee on sinu varundus ja saad seda kasutada rahakoti taastamiseks.",
"text_lnd": "Palun salvesta see rahakoti varundus. See võimaldab sul rahakott kaotuse korral taastada.",
"title": "Sinu rahakott on loodud."
},
"receive": {
"details_create": "Loo",
"details_label": "Kirjeldus",
"details_setAmount": "Võta vastu summaga",
"details_share": "Jaga...",
"address_not_found": "Vastuvõtuaadressi loomine ebaõnnestus.",
"header": "Võta vastu",
"reset": "Lähtesta",
"maxSats": "Maksimaalne summa on {max} sats",
"maxSatsFull": "Maksimaalne summa on {max} sats või {currency}",
"minSats": "Minimaalne summa on {min} sats",
"minSatsFull": "Minimaalne summa on {min} sats või {currency}",
"qrcode_for_the_address": "Aadressi QR-kood",
"bip47_explanation": "Maksekoodid on universaalne aadress, mis ei avalda sinu rahakoti aadresse. Mitte kõik teenused ei toeta neid."
},
"send": {
"provided_address_is_invoice": "See aadress näib olevat Lightning arve. Palun mine oma Lightningi rahakotti, et seda arvet maksta.",
"broadcastButton": "Leviedasta",
"broadcastError": "Viga",
"broadcastNone": "Sisesta tehingu hex",
"broadcastPending": "Ootel",
"broadcastSuccess": "Toiming õnnestus",
"create_to": "Sihtkoht"
"confirm_header": "Kinnita",
"confirm_sendNow": "Saada kohe",
"create_amount": "Summa",
"create_broadcast": "Leviedasta",
"create_copy": "Kopeeri ja leviedasta hiljem",
"create_details": "Üksikasjad",
"create_fee": "Tasu",
"create_memo": "Märkus",
"create_satoshi_per_vbyte": "Satoshit vByte kohta",
"create_this_is_hex": "See on sinu tehingu hex—allkirjastatud ja valmis võrku leviedastamiseks.",
"create_to": "Sihtkoht",
"create_tx_size": "Tehingu suurus",
"create_verify": "Kontrolli coinb.in-is",
"details_insert_contact": "Sisesta kontakt",
"details_add_rec_add": "Lisa saaja",
"details_add_rec_rem": "Eemalda saaja",
"details_add_recc_rem_all_alert_description": "Kas oled kindel, et soovid kõik saajad eemaldada?",
"details_add_rec_rem_all": "Eemalda kõik saajad",
"details_recipients_title": "Saajad",
"details_recipient_title": "Saaja #{number} #{total}-st",
"please_complete_recipient_title": "Mittetäielik saaja",
"please_complete_recipient_details": "Palun täida saaja #{number} andmed enne uue saaja lisamist.",
"details_address": "Aadress",
"details_address_field_is_not_valid": "Aadress ei ole kehtiv.",
"details_adv_fee_bump": "Luba tasu suurendamine",
"details_adv_full": "Kasuta kogu saldot",
"details_adv_full_sure": "Kas oled kindel, et soovid kasutada selle tehingu jaoks rahakoti kogu saldot?",
"details_adv_full_sure_frozen": "Kas oled kindel, et soovid kasutada selle tehingu jaoks rahakoti kogu saldot? Pane tähele, et külmutatud mündid on välja jäetud.",
"details_adv_import": "Impordi tehing",
"details_adv_import_qr": "Impordi tehing (QR)",
"details_amount_field_is_not_valid": "Summa ei ole kehtiv.",
"details_amount_field_is_less_than_minimum_amount_sat": "Määratud summa on liiga väike. Palun sisesta summa, mis on suurem kui 500 sats.",
"details_create": "Loo arve",
"details_error_decode": "Bitcoini aadressi dekodeerimine ebaõnnestus",
"details_fee_field_is_not_valid": "Tasu ei ole kehtiv.",
"details_frozen": "{amount} BTC on külmutatud.",
"details_next": "Edasi",
"details_no_signed_tx": "Valitud fail ei sisalda imporditavat tehingut.",
"details_note_placeholder": "Märkus endale",
"details_scan": "Skanni",
"details_scan_hint": "Topeltkoputa skannimiseks või sihtkoha importimiseks",
"details_scan_error": "Skannimise viga",
"details_total_exceeds_balance": "Saatmissumma ületab saadaoleva saldo.",
"details_total_exceeds_balance_frozen": "Saatmissumma ületab saadaoleva saldo. Pane tähele, et külmutatud mündid on välja jäetud.",
"details_unrecognized_file_format": "Tundmatu failivorming",
"details_wallet_before_tx": "Enne tehingu loomist tuleb esmalt lisada Bitcoini rahakott.",
"dynamic_init": "Käivitamine",
"dynamic_next": "Edasi",
"dynamic_prev": "Eelmine",
"dynamic_start": "Alusta",
"dynamic_stop": "Peata",
"fee_10m": "10min",
"fee_1d": "1p",
"fee_3h": "3t",
"fee_custom": "Kohandatud",
"insert_custom_fee": "Sisesta tasu",
"fee_fast": "Kiire",
"fee_medium": "Keskmine",
"fee_replace_minvb": "Kogu tasumäär (satoshit vByte kohta), mida soovid maksta, peab olema suurem kui {min} sat/vByte.",
"fee_satvbyte": "sat/vByte",
"fee_slow": "Aeglane",
"header": "Saada",
"input_clear": "Tühjenda",
"input_done": "Valmis",
"input_paste": "Kleebi",
"input_total": "Kokku:",
"permission_camera_message": "Vajame sinu luba kaamera kasutamiseks.",
"psbt_sign": "Allkirjasta tehing",
"invalid_psbt": "Esitatud PSBT on kehtetu.",
"open_settings": "Ava seaded",
"permission_storage_denied_message": "BlueWallet ei saa seda faili salvestada. Palun ava seadme seaded ja luba salvestusõigus.",
"permission_storage_title": "Salvestusruumi juurdepääsuluba",
"psbt_clipboard": "Kopeeri lõikelauale",
"psbt_this_is_psbt": "See on osaliselt allkirjastatud Bitcoini tehing (PSBT). Palun lõpeta selle allkirjastamine oma riistvaralise rahakotiga.",
"psbt_tx_export": "Ekspordi faili",
"no_tx_signing_in_progress": "Käimasolevat tehingu allkirjastamist ei ole.",
"outdated_rate": "Kurssi uuendati viimati: {date}",
"psbt_tx_open": "Ava allkirjastatud tehing",
"psbt_tx_scan": "Skanni allkirjastatud tehing",
"qr_error_no_qrcode": "Valitud pildilt ei leitud kehtivat QR-koodi. Veendu, et pilt sisaldab ainult QR-koodi, mitte muud sisu, nt teksti või nuppe.",
"reset_amount": "Lähtesta summa",
"reset_amount_confirm": "Kas soovid summa lähtestada?",
"success_done": "Valmis",
"txSaved": "Tehingu fail ({filePath}) on salvestatud.",
"file_saved_at_path": "Fail ({filePath}) on salvestatud.",
"cant_send_to_silentpayment_adress": "See rahakott ei saa saata SilentPayment aadressidele",
"cant_send_to_bip47": "See rahakott ei saa saata BIP47 maksekoodidele",
"cant_find_bip47_notification": "Lisa see maksekood esmalt kontaktidesse",
"problem_with_psbt": "Probleem PSBT-ga"
},
"settings": {
"save": "Salvesta"
"about": "Teave",
"about_awesome": "Ehitatud suurepärase",
"about_backup": "Varunda alati oma võtmed!",
"about_free": "BlueWallet on tasuta ja avatud lähtekoodiga projekt. Loodud Bitcoini kasutajate poolt.",
"about_license": "MIT litsents",
"about_release_notes": "Versiooni märkmed",
"about_review": "Jäta meile arvustus",
"performance_score": "Jõudluse hinne: {num}",
"run_performance_test": "Testi jõudlust",
"about_selftest": "Käivita enesetest",
"block_explorer_invalid_custom_url": "Esitatud URL on kehtetu. Palun sisesta kehtiv URL, mis algab http:// või https:// -ga.",
"about_selftest_electrum_disabled": "Enesetestimine ei ole Electrumi võrguta režiimis saadaval. Palun keela võrguta režiim ja proovi uuesti.",
"about_selftest_ok": "Kõik sisemised testid läbisid edukalt. Rahakott töötab hästi.",
"about_sm_github": "GitHub",
"about_sm_telegram": "Telegrami kanal",
"privacy_temporary_screenshots": "Luba ekraani jäädvustamine",
"privacy_temporary_screenshots_instructions": "Ekraani jäädvustamise kaitse lülitatakse ajutiselt välja, võimaldades kuvatõmmiseid ja ekraanisalvestusi. Kaitse aktiveerub automaatselt uuesti, kui sulged ja avad BlueWallet'i.",
"biometrics": "Biomeetria",
"biometrics_no_longer_available": "Sinu seadme seaded on muutunud ega vasta enam rakenduses valitud turvaseadetele. Palun luba biomeetria või pääsukood uuesti, seejärel taaskäivita rakendus, et muudatused jõustuksid.",
"biom_10times": "Oled proovinud parooli sisestada 10 korda. Kas soovid oma hoidla lähtestada? See eemaldab kõik rahakotid ja dekrüpteerib hoidla.",
"biom_conf_identity": "Palun kinnita oma isikusamasus.",
"biom_no_passcode": "Sinu seadmel ei ole pääsukoodi ega biomeetriat lubatud. Jätkamiseks seadista palun pääsukood või biomeetria seadme seadetes.",
"biom_remove_decrypt": "Kõik sinu rahakotid eemaldatakse ja hoidla dekrüpteeritakse. Kas oled kindel, et soovid jätkata?",
"currency": "Valuuta",
"currency_source": "Kurss saadakse",
"currency_fetch_error": "Valitud valuuta kursi hankimisel tekkis viga.",
"default_title": "Käivitamisel",
"donate": "Anneta",
"donate_description": "Aita meil Blue tasuta hoida!",
"electrum_connected": "Ühendatud",
"electrum_connected_not": "Pole ühendatud",
"electrum_error_connect": "Ei saa määratud Electrumi serveriga ühendust",
"electrum_error_connect_tor": "Ei saa määratud Electrumi serveriga ühendust. Palun veendu, et Orboti rakendus on ühendatud, ja proovi uuesti.",
"lndhub_uri": "Nt {example}",
"electrum_host": "Nt {example}",
"electrum_offline_mode": "Võrguta režiim",
"electrum_offline_description": "Kui see on lubatud, ei proovi sinu Bitcoini rahakotid saldosid ega tehinguid hankida.",
"electrum_port": "Port, tavaliselt {example}",
"use_ssl": "Kasuta SSL-i",
"electrum_saved": "Sinu muudatused on edukalt salvestatud. Muudatuste jõustumiseks võib olla vajalik BlueWallet'i taaskäivitamine.",
"set_electrum_server_as_default": "Määra {server} vaikimisi Electrumi serveriks?",
"set_lndhub_as_default": "Määra {url} vaikimisi LNDhubi serveriks?",
"electrum_settings_server": "Electrumi server",
"electrum_status": "Olek",
"electrum_preferred_server": "Eelistatud server",
"electrum_preferred_server_description": "Sisesta server, mida soovid, et sinu rahakott kasutaks kõigi Bitcoini toimingute jaoks. Pärast määramist kasutab rahakott eranditult seda serverit saldode kontrollimiseks, tehingute saatmiseks ja võrguandmete hankimiseks. Veendu, et usaldad seda serverit enne määramist.",
"electrum_unable_to_connect": "Ei saa ühendust serveriga {server}.",
"electrum_history": "Ajalugu",
"electrum_reset_to_default": "See laseb BlueWallet'il juhuslikult valida serveri serverite loendist.",
"electrum_reset": "Lähtesta vaikeväärtustele",
"electrum_reset_to_default_and_clear_history": "Lähtesta vaikeväärtustele ja kustuta ajalugu",
"encrypt_decrypt": "Dekrüpteeri hoidla",
"encrypt_decrypt_q": "Kas oled kindel, et soovid oma hoidla dekrüpteerida? See võimaldab rahakottidele juurde pääseda ilma paroolita.",
"encrypt_enc_and_pass": "Parooliga kaitstud",
"encrypt_storage_explanation_headline": "Luba hoidla krüpteerimine",
"encrypt_storage_explanation_description_line1": "Hoidla krüpteerimise lubamine lisab rakendusele täiendava kaitsekihi, turvates seadmesse salvestatud andmete viisi. See teeb teistel raskemaks sinu teabele loata juurdepääsu.",
"encrypt_storage_explanation_description_line2": "Siiski on oluline teada, et see krüpteerimine kaitseb ainult seadme võtmehoidlas hoitavate rahakottide juurdepääsu. See ei pane parooli ega täiendavat kaitset rahakottidele endile.",
"i_understand": "Saan aru",
"block_explorer": "Plokiuurija",
"block_explorer_preferred": "Kasuta eelistatud plokiuurijat",
"block_explorer_error_saving_custom": "Eelistatud plokiuurija salvestamisel tekkis viga",
"encrypt_title": "Turvalisus",
"encrypt_tstorage": "Hoidla",
"encrypt_use": "Kasuta {type}",
"set_as_preferred": "Määra eelistatuks",
"set_as_preferred_electrum": "{host}:{port} määramine eelistatud serveriks keelab juhusliku ühenduse soovitatud serveritega.",
"encrypted_feature_disabled": "Seda funktsiooni ei saa kasutada, kui krüpteeritud hoidla on lubatud.",
"encrypt_use_expl": "{type} kasutatakse sinu isikusamasuse kinnitamiseks enne tehingu tegemist, lukust avamist, eksportimist või rahakoti kustutamist.",
"biometrics_fail": "Kui {type} ei ole lubatud või lukust avamine ebaõnnestub, võid alternatiivina kasutada seadme pääsukoodi.",
"general": "Üldine",
"general_continuity": "Pidevus",
"general_continuity_e": "Kui see on lubatud, saad valitud rahakotte ja tehinguid vaadata oma teistest Apple iCloud-iga ühendatud seadmetest.",
"groundcontrol_explanation": "GroundControl on tasuta avatud lähtekoodiga tõuketeavituste server Bitcoini rahakottidele. Sa võid paigaldada oma GroundControl serveri ja sisestada selle URL-i siia, et mitte sõltuda BlueWallet'i infrastruktuurist. Jäta tühjaks, et kasutada GroundControli vaikeserverit.",
"header": "Seaded",
"language": "Keel",
"last_updated": "Viimati uuendatud",
"language_isRTL": "Keele suuna jõustumiseks on vajalik BlueWallet'i taaskäivitamine.",
"license": "Litsents",
"lightning_error_lndhub_uri": "Kehtetu LNDhubi URI",
"lightning_error_lndhub_uri_tor": "Kehtetu LNDhubi URI. Palun veendu, et Orboti rakendus on ühendatud, ja proovi uuesti.",
"lightning_saved": "Sinu muudatused on edukalt salvestatud.",
"lightning_settings": "Lightningi seaded",
"lightning_settings_explain": "Et ühenduda oma LND sõlmega, paigalda palun LNDhub ja sisesta selle URL siia seadetesse. Pane tähele, et ainult pärast muudatuste salvestamist loodud rahakotid ühenduvad määratud LNDhubiga.",
"lndhub_github": "GitHubi hoidla",
"network": "Võrk",
"network_broadcast": "Leviedasta tehing",
"network_electrum": "Electrumi server",
"electrum_suggested_description": "Kui eelistatud server ei ole määratud, valitakse juhuslikult soovitatud server.",
"not_a_valid_uri": "Kehtetu URI",
"notifications": "Teavitused",
"open_link_in_explorer": "Ava link uurijas",
"password": "Parool",
"password_explain": "Sisesta parool, mida kasutad oma hoidla lukust avamiseks.",
"plausible_deniability": "Usutav eitatavus",
"privacy": "Privaatsus",
"privacy_read_clipboard": "Loe lõikelauda",
"privacy_system_settings": "Süsteemi seaded",
"privacy_quickactions": "Rahakoti otseteed",
"privacy_quickactions_explanation": "Puuduta ja hoia BlueWallet'i ikooni, et kiiresti vaadata oma rahakoti saldot.",
"privacy_clipboard_explanation": "Paku otseteid, kui lõikelaualt leitakse aadress või arve.",
"privacy_do_not_track": "Keela analüütika",
"privacy_do_not_track_explanation": "Jõudluse ja töökindluse teavet ei esitata analüüsiks.",
"rate": "Kurss",
"push_notifications_explanation": "Teavituste lubamisel saadetakse sinu seadme luba serverisse koos rahakoti aadresside ja tehingu ID-dega kõigi rahakottide ja teavituste lubamise järel tehtud tehingute kohta. Seadme luba kasutatakse teavituste saatmiseks ja rahakoti teabe abil saame sind teavitada saabuvast Bitcoinist või tehingu kinnitustest.\n\nEdastatakse ainult teave alates teavituste lubamisest—midagi enne seda ei koguta.\n\nTeavituste keelamine eemaldab kogu selle teabe serverist. Lisaks eemaldab rahakoti kustutamine rakendusest ka sellega seotud teabe serverist.",
"selfTest": "Enesetest",
"save": "Salvesta",
"saved": "Salvestatud",
"success_transaction_broadcasted": "Sinu tehing on edukalt leviedastatud!",
"total_balance": "Kogusaldo",
"total_balance_explanation": "Kuva kõigi rahakottide kogusaldo avakuva vidinatel.",
"widgets": "Vidinad",
"tools": "Tööriistad"
},
"notifications": {
"would_you_like_to_receive_notifications": "Kas soovid saada teavitusi, kui saabuvad maksed?",
"notifications_subtitle": "Saabuvad maksed ja tehingu kinnitused",
"no_and_dont_ask": "Ei, ja ära küsi seda enam.",
"permission_denied_message": "Sa oled teavituste saatmiseks loa keelanud. Kui soovid teavitusi saada, luba need palun oma seadme seadetes."
},
"transactions": {
"cancel_explain": "Asendame selle tehingu sellisega, mis maksab sulle ja millel on suuremad tasud. See tühistab tegelikult praeguse tehingu. Seda kutsutakse RBF—Replace by Fee.",
"cancel_no": "See tehing ei ole asendatav.",
"cancel_title": "Tühista see tehing (RBF)",
"transaction_loading_error": "Tehingu laadimisel tekkis probleem. Palun proovi hiljem uuesti.",
"transaction_not_available": "Tehing ei ole saadaval",
"confirmations_lowercase": "{confirmations} kinnitust",
"expand_note": "Laienda märkust",
"cpfp_create": "Loo",
"cpfp_exp": "Loome teise tehingu, mis kulutab sinu kinnitamata tehingu. Kogutasu on suurem kui algse tehingu tasu, seega peaks see kiiremini kaevandatama. Seda kutsutakse CPFP—Child Pays for Parent.",
"cpfp_no_bump": "Selle tehingu tasu ei saa suurendada.",
"cpfp_title": "Suurenda tasu (CPFP)",
"details_balance_hide": "Peida saldo",
"details_balance_show": "Näita saldot",
"details_copy": "Kopeeri",
"details_copy_block_explorer_link": "Kopeeri plokiuurija link",
"details_copy_note": "Kopeeri märkus",
"details_copy_txid": "Kopeeri tehingu ID",
"details_id": "ID",
"details_inputs": "Sisendid",
"details_outputs": "Väljundid",
"date": "Kuupäev",
"details_received": "Vastu võetud",
"details_view_in_browser": "Vaata brauseris",
"details_title": "Tehing",
"incoming_transaction": "Saabuv tehing",
"outgoing_transaction": "Väljuv tehing",
"expired_transaction": "Aegunud tehing",
"pending_transaction": "Ootel tehing",
"offchain": "Off-chain",
"onchain": "On-chain",
"details_to": "Väljund",
"enable_offline_signing": "Seda rahakotti ei kasutata koos võrguta allkirjastamisega. Kas soovid selle nüüd lubada?",
"list_conf": "Kinn: {number}",
"pending": "Ootel",
"pending_with_amount": "Ootel {amt1} ({amt2})",
"received_with_amount": "+{amt1} ({amt2})",
"eta_10m": "ETA: ~10 minuti pärast",
"eta_3h": "ETA: ~3 tunni pärast",
"eta_1d": "ETA: ~1 päeva pärast",
"list_title": "Tehingud",
"list_title_sent": "Saadetud",
"list_title_received": "Vastu võetud",
"transaction": "Tehing",
"open_url_error": "Linki ei saa vaikebrauseriga avada. Palun muuda oma vaikebrauserit ja proovi uuesti.",
"rbf_explain": "Asendame selle tehingu sellisega, millel on suurem tasu, et see kaevandataks kiiremini. Seda kutsutakse RBF—Replace by Fee.",
"rbf_title": "Kiirenda (RBF)",
"status_bump": "Kiirenda",
"status_cancel": "Tühista",
"transactions_count": "Tehingute arv",
"txid": "Tehingu ID",
"updating": "Uuendamine...",
"watchOnlyWarningTitle": "Turvahoiatus",
"watchOnlyWarningDescription": "Ole ettevaatlik petturite suhtes, kes sageli kasutavad „ainult vaatamiseks“ rahakotte kasutajate petmiseks. Need rahakotid ei võimalda sul vahendeid kontrollida ega saata; nad lasevad sul ainult saldot vaadata.",
"custom_fee_warning_title": "Hoiatus",
"custom_fee_warning_description": "Tasud alla 1 sat/vB on kehtivad, kuid sõlmede reeglite tõttu ei pruugita neid edastada.",
"details_eta_analyzing": "Analüüsimine...",
"details_sent": "Saadetud",
"details_section": "Üksikasjad",
"details_explorer": "uurija",
"details_network_fee": "Võrgutasu",
"details_to_address": "Kellele",
"details_note": "Märkus",
"details_add_note": "lisa",
"details_advanced": "Täpsem",
"details_fee_rate": "Tasumäär",
"details_size": "Suurus",
"details_virtual_size": "Virtuaalne suurus",
"details_tx_hex": "Tehingu hex",
"details_inputs_count": "Sisendid ({count})",
"details_outputs_count": "Väljundid ({count})"
},
"wallets": {
"add_entropy": "Entroopia"
"add_bitcoin": "Bitcoin",
"add_bitcoin_explain": "Lihtne ja võimas Bitcoini rahakott",
"add_create": "Loo",
"total_balance": "Kogusaldo",
"add_entropy_reset_title": "Lähtesta entroopia",
"add_entropy_reset_message": "Rahakoti tüübi muutmine lähtestab praeguse entroopia. Kas soovid jätkata?",
"add_entropy": "Entroopia",
"add_entropy_bytes": "{bytes} baiti entroopiat",
"add_entropy_generated": "{gen} baiti loodud entroopiat",
"add_entropy_provide": "Esita entroopia täringuviskega",
"add_entropy_remain": "{gen} baiti loodud entroopiat. Ülejäänud {rem} baiti hangitakse süsteemi juhuarvugeneraatorist.",
"add_import_wallet": "Impordi rahakott",
"add_lightning": "Lightning",
"add_lightning_explain": "Kohese tehinguga kulutamiseks",
"add_lndhub": "Ühenda oma LNDhubiga",
"add_lndhub_error": "Esitatud sõlme aadress ei ole kehtiv LNDhubi sõlm.",
"add_lndhub_placeholder": "Sinu sõlme aadress",
"add_placeholder": "minu esimene rahakott",
"add_title": "Lisa rahakott",
"add_wallet_name": "Nimi",
"add_wallet_type": "Tüüp",
"add_wallet_seed_length": "Seemne pikkus",
"add_wallet_seed_length_12": "12 sõna",
"add_wallet_seed_length_24": "24 sõna",
"clipboard_bitcoin": "Sul on lõikelaual Bitcoini aadress. Kas soovid seda tehinguks kasutada?",
"clipboard_lightning": "Sul on lõikelaual Lightning arve. Kas soovid seda tehinguks kasutada?",
"clear_clipboard_on_import": "Tühjenda lõikelaud impordil",
"details_address": "Aadress",
"details_advanced": "Täpsem",
"details_are_you_sure": "Kas oled kindel?",
"details_connected_to": "Ühendatud",
"details_del_wb_err": "Esitatud saldo summa ei ühti selle rahakoti saldoga. Palun proovi uuesti.",
"details_del_wb_q": "Sellel rahakotil on saldo. Enne jätkamist pane tähele, et ilma selle rahakoti seemnefraasita ei saa vahendeid taastada. Juhusliku eemaldamise vältimiseks sisesta palun rahakoti saldo {balance} satoshit.",
"details_delete": "Kustuta",
"details_delete_wallet": "Kustuta rahakott",
"details_derivation_path": "tuletustee",
"details_display": "Kuva avakuval",
"details_export_backup": "Ekspordi/varunda",
"details_export_history": "Ekspordi ajalugu CSV-na",
"details_master_fingerprint": "Põhivõtme sõrmejälg",
"details_multisig_type": "multisig",
"details_show_xpub": "Näita rahakoti xpub-i",
"details_show_addresses": "Näita aadresse",
"details_title": "Rahakott",
"wallets": "Rahakotid",
"swipe_balance_hide": "Peida",
"swipe_balance_show": "Näita",
"drag_to_reorder": "Lohista ümberjärjestamiseks",
"clear_search": "Tühjenda otsing",
"details_type": "Tüüp",
"details_use_with_hardware_wallet": "Kasuta riistvaralise rahakotiga",
"details_yes_delete": "Jah, kustuta",
"enter_bip38_password": "Sisesta dekrüpteerimiseks parool",
"export_title": "Rahakoti eksport",
"import_do_import": "Impordi",
"import_passphrase": "Salafraas",
"import_passphrase_title": "Salafraas",
"import_passphrase_message": "Sisesta salafraas, kui oled seda kasutanud",
"import_error": "Importimine ebaõnnestus. Palun veendu, et esitatud andmed on kehtivad.",
"import_explanation": "Palun sisesta oma seemnesõnad, avalik võti, WIF või mis iganes sul on. BlueWallet teeb oma parima, et õige formaat ära arvata ja rahakott importida.",
"import_imported": "Imporditud",
"import_scan_qr": "Skanni või impordi fail",
"import_success": "Sinu rahakott on edukalt imporditud.",
"import_success_watchonly": "Sinu rahakott on edukalt imporditud. HOIATUS: see on ainult vaatamiseks rahakott, sa EI saa sellest kulutada.",
"import_search_accounts": "Otsi kontosid",
"import_title": "Impordi",
"learn_more": "Lisateave",
"import_discovery_title": "Avastamine",
"import_discovery_subtitle": "Vali avastatud rahakott",
"import_discovery_derivation": "Kasuta kohandatud tuletusteed",
"import_discovery_no_wallets": "Rahakotte ei leitud.",
"import_discovery_offline": "BlueWallet on praegu võrguta režiimis. Selles režiimis ei saa ta rahakoti olemasolu kontrollida, seega pead käsitsi valima õige.",
"import_derivation_found": "Leitud",
"import_derivation_found_not": "Ei leitud",
"import_derivation_loading": "Laadimine...",
"import_derivation_subtitle": "Sisesta kohandatud tuletustee ja me proovime su rahakoti avastada.",
"import_derivation_title": "Tuletustee",
"import_derivation_unknown": "Tundmatu",
"import_wrong_path": "Vale tuletustee",
"list_create_a_button": "Lisa kohe",
"list_create_a_wallet": "Lisa rahakott",
"list_create_a_wallet_text": "See on tasuta ja saad luua \nnii palju kui soovid.",
"list_empty_txs1": "Sinu tehingud ilmuvad siia.",
"list_empty_txs1_lightning": "Lightningi rahakotti tuleks kasutada igapäevasteks tehinguteks. Tasud on ebaausalt odavad ja kiirus välkkiire.",
"list_empty_txs2": "Alusta oma rahakotiga.",
"list_empty_txs2_lightning": "\nKasutamise alustamiseks koputa Halda vahendeid ja täienda oma saldot.",
"list_latest_transaction": "Viimane tehing",
"list_long_choose": "Vali foto",
"paste_from_clipboard": "Kleebi",
"import_file": "Impordi fail",
"list_long_scan": "Skanni QR-kood",
"list_title": "Rahakotid",
"list_tryagain": "Proovi uuesti",
"no_ln_wallet_error": "Enne Lightning arve maksmist tuleb esmalt lisada Lightningi rahakott.",
"looks_like_bip38": "See näeb välja kui parooliga kaitstud privaatvõti (BIP38).",
"manage_title": "Halda rahakotte",
"no_results_found": "Tulemusi ei leitud.",
"please_continue_scanning": "Palun jätka skannimist.",
"select_no_bitcoin": "Praegu pole saadaval ühtegi Bitcoini rahakotti.",
"select_no_bitcoin_exp": "Lightningi rahakottide täiendamiseks on vajalik Bitcoini rahakott. Palun loo või impordi see.",
"select_wallet": "Vali rahakott",
"pull_to_refresh": "Tõmba värskendamiseks",
"warning_do_not_disclose": "Ära kunagi jaga alltoodud teavet",
"scan_import": "Skanni see QR-kood, et importida oma rahakott teise rakendusse.",
"write_down_header": "Loo käsitsi varundus",
"write_down": "Kirjuta need sõnad üles ja hoia turvaliselt. Kasuta neid oma rahakoti hilisemaks taastamiseks.",
"wallet_type_this": "Selle rahakoti tüüp on {type}.",
"share_number": "Jaga {number}",
"copy_ln_url": "Kopeeri ja hoia see URL turvaliselt, et hiljem rahakott taastada.",
"copy_ln_public": "Kopeeri ja hoia see teave turvaliselt, et hiljem rahakott taastada.",
"add_ln_wallet_first": "Sa pead esmalt lisama Lightningi rahakoti.",
"identity_pubkey": "Identiteedi avalik võti",
"xpub_title": "Rahakoti xpub",
"manage_wallets_search_placeholder": "Otsi rahakotte, aadresse, tehinguid ja märkusi",
"more_info": "Lisateave",
"details_delete_wallet_error_message": "Selle rahakoti teavitustest eemaldamise kinnitamisel tekkis probleem—see võib olla tingitud võrguprobleemist või halvast ühendusest. Kui jätkad, võid endiselt saada teavitusi selle rahakotiga seotud tehingute kohta ka pärast selle kustutamist.",
"details_delete_anyway": "Kustuta ikkagi"
},
"total_balance_view": {
"display_in_bitcoin": "Kuva Bitcoinis",
"hide": "Peida",
"display_in_sats": "Kuva satides",
"display_in_fiat": "Kuva {currency}",
"title": "Kogusaldo",
"explanation": "Vaata kõigi oma rahakottide kogusaldot ülevaate ekraanil."
},
"multisig": {
"multisig_vault": "Multisig seif",
"default_label": "Multisig seif",
"multisig_vault_explain": "Parim turvalisus suurte summade jaoks",
"provide_signature": "Anna allkiri",
"provide_signature_details": "Kasuta seadet ja rahakotti, kus võti asub, et see tehing allkirjastada",
"provide_signature_details_bluewallet": "BlueWallet'is mine Saada ekraani menüüsse ja vali ",
"provide_signature_next_steps": "Skanni või impordi allkirjastatud tehing",
"provide_signature_next_steps_details": "Kui sinu rahakott on tehingu edukalt allkirjastanud, skanni esitatud QR-kood või impordi kaasasolev fail ja vaata enne leviedastamist üle kõik tehingu üksikasjad.",
"vault_key": "Seifi võti {number}",
"required_keys_out_of_total": "Vajalikud võtmed koguarvust",
"fee": "Tasu: {number}",
"fee_btc": "{number} BTC",
"confirm": "Kinnita",
"header": "Saada",
"share": "Jaga...",
"view": "Vaata",
"shared_key_detected": "Jagatud kaasallkirjastaja",
"shared_key_detected_question": "Sinuga on jagatud kaasallkirjastaja, kas soovid selle importida?",
"manage_keys": "Halda võtmeid",
"how_many_signatures_can_bluewallet_make": "mitu allkirja saab BlueWallet luua",
"signatures_required_to_spend": "Vajalikke allkirju {number}",
"signatures_we_can_make": "saab luua {number}",
"scan_or_import_file": "Skanni või impordi fail",
"export_coordination_setup": "Ekspordi koordineerimise seadistus",
"cosign_this_transaction": "Allkirjasta see tehing koos?",
"lets_start": "Alustame",
"create": "Loo",
"native_segwit_title": "Parim tava",
"wrapped_segwit_title": "Parim ühilduvus",
"legacy_title": "Pärand",
"co_sign_transaction": "Allkirjasta tehing",
"what_is_vault": "Seif on",
"what_is_vault_numberOfWallets": " {m}-{n}-st multisig ",
"what_is_vault_wallet": "rahakott.",
"vault_advanced_customize": "Seifi seaded",
"needs": "See vajab",
"what_is_vault_description_number_of_vault_keys": " {m} seifivõtit ",
"what_is_vault_description_to_spend": "kulutamiseks ja kolmandat võid \nkasutada varundusena.",
"what_is_vault_description_to_spend_other": "kulutamiseks.",
"quorum": "{m} {n}-st kvoorum",
"quorum_header": "Kvoorum",
"of": "/",
"wallet_type": "Rahakoti tüüp",
"invalid_mnemonics": "See mnemooniline fraas ei tundu kehtiv.",
"invalid_cosigner": "Kehtetud kaasallkirjastaja andmed",
"not_a_multisignature_xpub": "See ei ole xpub multisig rahakotist!",
"invalid_cosigner_format": "Vale kaasallkirjastaja: see ei ole {format} formaadi kaasallkirjastaja.",
"create_new_key": "Loo uus",
"scan_or_open_file": "Skanni või ava fail",
"i_have_mnemonics": "Mul on selle võtme jaoks seeme.",
"type_your_mnemonics": "Sisesta seeme oma olemasoleva seifivõtme importimiseks.",
"this_is_cosigners_xpub": "See on kaasallkirjastaja xpub—valmis teise rahakotti importimiseks. Seda on turvaline jagada.",
"this_is_cosigners_xpub_airdrop": "Kui jagad AirDropi kaudu, peavad vastuvõtjad olema koordineerimise ekraanil.",
"wallet_key_created": "Sinu seifivõti on loodud. Võta hetk aega, et oma mnemooniline seeme turvaliselt varundada.",
"are_you_sure_seed_will_be_lost": "Kas oled kindel? Sinu mnemooniline seeme läheb kaotsi, kui sul pole varundust.",
"forget_this_seed": "Unusta see seeme ja kasuta selle asemel xpub-i.",
"view_edit_cosigners": "Vaata/muuda kaasallkirjastajaid",
"this_cosigner_is_already_imported": "See kaasallkirjastaja on juba imporditud.",
"export_signed_psbt": "Ekspordi allkirjastatud PSBT",
"input_fp": "Sisesta sõrmejälg",
"input_fp_explain": "Vahele jätmisel kasutatakse vaikeväärtust (00000000)",
"input_path": "Sisesta tuletustee",
"input_path_explain": "Vahele jätmisel kasutatakse vaikeväärtust ({default})",
"ms_help": "Abi",
"ms_help_title": "Kuidas multisig seifid töötavad: nõuanded ja nipid",
"ms_help_text": "Mitme võtmega rahakott, suurema turvalisuse või jagatud hoolduse jaoks",
"ms_help_title1": "Soovitatav on kasutada mitut seadet.",
"ms_help_1": "Seif töötab teiste BlueWallet'i rakenduste ja PSBT-ga ühilduvate rahakottidega, nagu Electrum, Specter, Coldcard, Cobo Vault jne.",
"ms_help_title2": "Võtmete muutmine",
"ms_help_2": "Saad luua kõik seifi võtmed sellel seadmel ja need hiljem eemaldada või muuta. Kõikide võtmete hoidmine samal seadmel on samaväärse turvalisusega tavalise Bitcoini rahakotiga.",
"ms_help_title3": "Seifi varundused",
"ms_help_3": "Rahakoti valikutest leiad oma seifi varunduse ja ainult vaatamiseks varunduse. See varundus on nagu kaart sinu rahakotini. See on hädavajalik rahakoti taastamiseks, kui kaotad mõne seemne.",
"ms_help_title4": "Seifide importimine",
"ms_help_4": "Multisigi importimiseks kasuta oma varundusfaili ja impordi funktsiooni. Kui sul on ainult seemned ja xpub-id, saad seifivõtmete loomisel kasutada üksikut Impordi nuppu.",
"ms_help_title5": "Täpsem režiim",
"ms_help_5": "Vaikimisi genereerib BlueWallet 2-3-st seifi. Erineva kvoorumi loomiseks või aadressitüübi muutmiseks aktiveeri seadetes täpsem režiim."
},
"is_it_my_address": {
"title": "Kas see on minu aadress?",
"owns": "{label} omab {address}",
"enter_address": "Sisesta aadress",
"check_address": "Kontrolli aadressi",
"no_wallet_owns_address": "Ükski saadaolev rahakott ei oma esitatud aadressi.",
"view_qrcode": "Vaata QR-koodi"
},
"autofill_word": {
"title": "Seemne lõppsõna",
"enter": "Sisesta oma osaline mnemooniline fraas",
"generate_word": "Genereeri lõppsõna",
"error": "Sisend ei ole 11- või 23-sõnaline osaline mnemoonik. Palun proovi uuesti."
},
"cc": {
"change": "Vahetusraha",
"coins_selected": "Valitud münte ({number})",
"selected_summ": "{value} valitud",
"empty": "Selles rahakotis ei ole hetkel ühtegi münti.",
"freeze": "Külmuta",
"freezeLabel": "Külmuta",
"freezeLabel_un": "Sulata",
"header": "UTXO haldus",
"use_coin": "Kasuta münti",
"use_coins": "Kasuta münte",
"tip": "See funktsioon võimaldab näha, sildistada, külmutada või valida münte parema rahakoti haldamise jaoks. Saad valida mitu münti, koputades värvilistele ringidele.",
"sort_asc": "Kasvavalt",
"sort_desc": "Kahanevalt",
"sort_height": "Kõrgus",
"sort_value": "Väärtus",
"sort_label": "Silt",
"sort_status": "Olek",
"sort_by": "Sorteeri"
},
"units": {
"BTC": "BTC",
"MAX": "Max",
"sat_vbyte": "sat/vByte",
"sats": "satid"
},
"addresses": {
"copy_private_key": "Kopeeri privaatvõti",
"sensitive_private_key": "Hoiatus: privaatvõtmed on äärmiselt tundlikud. Kas jätkata?",
"sign_title": "Allkirjasta/kontrolli sõnumit",
"sign_help": "Siin saad luua või kontrollida krüptograafilist allkirja Bitcoini aadressi põhjal.",
"sign_sign": "Allkirjasta",
"sign_verify": "Kontrolli",
"sign_signature_correct": "Kontroll õnnestus!",
"sign_signature_incorrect": "Kontroll ebaõnnestus!",
"sign_placeholder_address": "Aadress",
"sign_placeholder_message": "Sõnum",
"sign_placeholder_signature": "Allkiri",
"addresses_title": "Aadressid",
"type_change": "Vahetusraha",
"type_receive": "Vastuvõtt",
"type_used": "Kasutatud",
"transactions": "Tehingud"
},
"lnurl_auth": {
"register_question_part_1": "Kas soovid registreerida konto saidil",
"register_question_part_2": "kasutades oma Lightningi rahakotti?",
"register_answer": "Oled edukalt registreerinud konto saidil {hostname}!",
"login_question_part_1": "Kas soovid sisse logida saidil",
"login_question_part_2": "kasutades oma Lightningi rahakotti?",
"login_answer": "Oled edukalt sisse logitud saidil {hostname}!",
"link_question_part_1": "Kas soovid siduda oma konto saidil",
"link_question_part_2": "oma Lightningi rahakotiga?",
"link_answer": "Sinu Lightningi rahakott on edukalt seotud sinu kontoga saidil {hostname}!",
"auth_question_part_1": "Kas soovid autentida saidil",
"auth_question_part_2": "kasutades oma Lightningi rahakotti?",
"auth_answer": "Oled edukalt autenditud saidil {hostname}!",
"could_not_auth": "Me ei suutnud sind autentida saidil {hostname}.",
"authenticate": "Autendi"
},
"bip47": {
"payment_code": "Maksekood",
"contacts": "Kontaktid",
"bip47_explain": "Korduvkasutatav ja jagatav kood",
"bip47_explain_subtitle": "BIP47",
"purpose": "Korduvkasutatav ja jagatav kood (BIP47)",
"pay_this_contact": "Maksa sellele kontaktile",
"rename_contact": "Nimeta kontakt ümber",
"copy_payment_code": "Kopeeri maksekood",
"hide_contact": "Peida kontakt",
"rename": "Nimeta ümber",
"provide_name": "Anna sellele kontaktile uus nimi",
"add_contact": "Lisa kontakt",
"provide_payment_code": "Esita maksekood",
"invalid_pc": "Kehtetu maksekood",
"notification_tx_unconfirmed": "Teavitustehing ei ole veel kinnitatud, palun oota",
"failed_create_notif_tx": "Ahelas tehingu loomine ebaõnnestus",
"onchain_tx_needed": "Vajalik on ahelas tehing",
"notif_tx_sent": "Teavitustehing saadetud. Palun oota selle kinnitamist",
"notif_tx": "Teavitustehing",
"not_found": "Maksekoodi ei leitud"
}
}

View File

@ -4,22 +4,32 @@
"cancel": "لغو",
"continue": "ادامه",
"clipboard": "کلیپ‌بورد",
"copied": "کپی شد!",
"discard_changes": "نادیده‌گرفتن تغییرات",
"discard_changes_explain": "تغییرات ذخیره‌نشده‌ای دارید. آیا مطمئن هستید که می‌خواهید آن‌ها را نادیده بگیرید و از این صفحه خارج شوید؟",
"enter_password": "گذرواژه را وارد کنید",
"never": "هرگز",
"of": "{number} از {total}",
"ok": "بله",
"ok": "تأیید",
"enter_url": "آدرس را وارد کنید",
"storage_is_encrypted": "فضای ذخیره‌سازی شما رمزگذاری شده است. برای رمزگشایی آن به گذرواژه نیاز است.",
"yes": "بله",
"no": "خیر",
"save": "ذخیره...",
"seed": "سید",
"success": "موفقیت‌آمیز بود",
"wallet_key": "کلید کیف پول",
"close": "بستن",
"change_input_currency": "ویرایش ارز ورودی",
"refresh": "تازه‌سازی",
"pick_image": "انتخاب از کتابخانه",
"pick_file": "انتخاب فایل",
"enter_amount": "مقدار را وارد کنید",
"qr_custom_input_button": "برای وارد کردن ورودی دلبخواه، 10 بار ضربه بزنید"
"qr_custom_input_button": "برای وارد کردن ورودی دلبخواه، 10 بار ضربه بزنید",
"unlock": "بازکردن قفل",
"port": "درگاه",
"ssl_port": "درگاه SSL",
"suggested": "پیشنهادشده"
},
"azteco": {
"codeIs": "کد تخفیف شما عبارت است از",
@ -28,12 +38,14 @@
"redeem": "افزودن به کیف پول",
"redeemButton": "فعال‌سازی",
"success": "موفقیت‌آمیز بود",
"successMessage": "کد تخفیف با موفقیت فعال شد! دارایی شما به‌زودی به کیف پول بیت‌کوین شما خواهد رسید.",
"title": "فعال‌سازی کد تخفیف Azte.co"
},
"entropy": {
"save": "ذخیره",
"title": "آنتروپی",
"undo": "بازگشت به حالت قبل"
"undo": "بازگشت به حالت قبل",
"amountOfEntropy": "{bits} از {limit} بیت"
},
"errors": {
"broadcast": "انتشار ناموفق بود.",
@ -41,6 +53,7 @@
"network": "خطای شبکه"
},
"lnd": {
"errorInvoiceExpired": "صورت‌حساب منقضی شده است.",
"expired": "منقضی‌شده",
"expiresIn": "تا {time} دقیقهٔ دیگر منقضی می‌شود",
"payButton": "پرداخت",
@ -56,11 +69,13 @@
},
"lndViewInvoice": {
"additional_info": "اطلاعات بیشتر",
"for": "برای: ",
"for": "برای:",
"lightning_invoice": "صورت‌حساب لایتنینگ",
"please_pay_between_and": "لطفاً بین {min} و {max} بپردازید",
"please_pay": "لطفاً",
"preimage": "پیش‌تصویر",
"sats": "ساتوشی بپردازید.",
"date_time": "تاریخ و زمان",
"wasnt_paid_and_expired": "این صورت‌حساب پرداخت نشده و منقضی شده است."
},
"plausibledeniability": {
@ -73,9 +88,11 @@
},
"pleasebackup": {
"ask": "آیا کلمه‌های پشتیبان کیف پول خود را ذخیره کرده‌اید؟ درصورت ازدست‌دادن این دستگاه، این کلمه‌های پشتیبان برای دسترسی به دارایی شما لازم هستند. بدون کلمه‌های پشتیبان، دارایی شما برای همیشه ازدست خواهد رفت.",
"ask_no": "خیر، ذخیره نکرده‌ام.",
"ask_yes": "بله، ذخیره کرده‌ام.",
"ok": "خب، آن را نوشتم.",
"ok_lnd": "خب، آن را ذخیره کردم.",
"text": "لطفاً درنگ کرده و این عبارت یادیار (mnemonic phrase) را روی یک تکه کاغذ یادداشت کنید. این کلمه‌ها نسخهٔ پشتیبان شما هستند، و می‌توانید از آن‌ها برای بازیابی کیف پول در دستگاه دیگری استفاده کنید.",
"text": "لطفاً درنگ کرده و این عبارت یادیار (mnemonic phrase) را روی یک تکه کاغذ یادداشت کنید.\nاین کلمه‌ها نسخهٔ پشتیبان شما هستند، و می‌توانید از آن‌ها برای بازیابی کیف پول در دستگاه دیگری استفاده کنید.",
"text_lnd": "لطفاً این نسخهٔ پشتیبان کیف پول را ذخیره کنید. با داشتن آن قادر خواهید بود درصورت ازدست‌رفتن کیف پول آن را بازیابی کنید.",
"title": "کیف پول شما ایجاد شد."
},
@ -83,11 +100,16 @@
"details_create": "ایجاد",
"details_label": "شرح",
"details_setAmount": "دریافت با مقدار",
"details_share": "هم‌رسانی...",
"address_not_found": "ایجاد آدرس دریافت ممکن نیست.",
"header": "دریافت",
"reset": "بازنشانی",
"maxSats": "بیشترین مقدار {max} ساتوشی است.",
"maxSatsFull": "بیشترین مقدار {max} ساتوشی یا {currency} است.",
"minSats": "کمترین مقدار {min} ساتوشی است.",
"minSatsFull": "کمترین مقدار {min} ساتوشی یا {currency} است."
"minSatsFull": "کمترین مقدار {min} ساتوشی یا {currency} است.",
"qrcode_for_the_address": "کد QR برای آدرس",
"bip47_explanation": "کدهای پرداخت یک آدرس همگانی هستند که از افشای آدرس‌های کیف پول شما جلوگیری می‌کنند. همهٔ سرویس‌ها از آن‌ها پشتیبانی نخواهند کرد."
},
"send": {
"provided_address_is_invoice": "به‌نظر می‌آید این آدرس یک صورت‌حساب لایتنینگ است. جهت پرداخت این صورت‌حساب لطفاً به کیف پول لایتنینگ خود بروید.",
@ -109,8 +131,15 @@
"create_to": "به",
"create_tx_size": "سایز تراکنش",
"create_verify": "تأیید در coinb.in",
"details_insert_contact": "افزودن مخاطب",
"details_add_rec_add": "افزودن گیرنده",
"details_add_rec_rem": "حذف گیرنده",
"details_add_recc_rem_all_alert_description": "آیا مطمئن هستید که می‌خواهید همهٔ گیرندگان را حذف کنید؟",
"details_add_rec_rem_all": "حذف همهٔ گیرندگان",
"details_recipients_title": "گیرندگان",
"details_recipient_title": "گیرندهٔ شمارهٔ {number} از #{total}",
"please_complete_recipient_title": "گیرندهٔ ناقص",
"please_complete_recipient_details": "لطفاً قبل از افزودن گیرندهٔ جدید، جزئیات گیرندهٔ شمارهٔ {number} را تکمیل کنید.",
"details_address": "آدرس",
"details_address_field_is_not_valid": "آدرس معتبر نیست.",
"details_adv_fee_bump": "امکان افزایش کارمزد",
@ -124,11 +153,13 @@
"details_create": "ایجاد صورت‌حساب",
"details_error_decode": "ناموفق در رمزگشایی آدرس بیت‌کوین",
"details_fee_field_is_not_valid": "کارمزد معتبر نیست.",
"details_frozen": "{amount} BTC مسدودشده است.",
"details_next": "بعدی",
"details_no_signed_tx": "فایل انتخاب‌شده حاوی تراکنشی نیست که بتوان آن را وارد کرد.",
"details_note_placeholder": "یادداشت به خود",
"details_scan": "اسکن",
"details_scan_hint": "جهت اسکن یا واردکردن مقصد دو بار ضربه بزنید",
"details_scan_error": "خطای اسکن",
"details_total_exceeds_balance": "مقدار ارسالی بیش از ماندهٔ موجود است.",
"details_total_exceeds_balance_frozen": "مقدار ارسالی از موجودی حاضر بیشتر است. لطفاً توجه داشته باشید که کوین‌های مسدودشده لحاظ نشده‌اند.",
"details_unrecognized_file_format": "قالب فایل ناشناخته",
@ -142,6 +173,7 @@
"fee_1d": "۱ روز",
"fee_3h": "۳ ساعت",
"fee_custom": "دستی",
"insert_custom_fee": "کارمزد را وارد کنید",
"fee_fast": "سریع",
"fee_medium": "متوسط",
"fee_replace_minvb": "نرخ کل کارمزد (ساتوشی به‌ازای هر بایت مجازی) که قصد پرداخت آن را دارید باید بیشتر از {min} ساتوشی/بایت مجازی باشد.",
@ -154,6 +186,7 @@
"input_total": "مجموع:",
"permission_camera_message": "برای استفاده از دوربین به اجازهٔ شما نیاز داریم.",
"psbt_sign": "امضاکردن تراکنش",
"invalid_psbt": "PSBT ارائه‌شده نامعتبر است.",
"open_settings": "بازکردن تنظیمات",
"permission_storage_denied_message": "برنامهٔ BlueWallet قادر به ذخیرهٔ این فایل نیست. لطفاً تنظیمات دستگاه خود را باز کرده و «اجازهٔ ذخیره‌سازی» (Storage Permission) را فعال کنید.",
"permission_storage_title": "مجوز دسترسی به فضای ذخیره‌سازی",
@ -164,9 +197,15 @@
"outdated_rate": "آخرین به‌روزرسانی نرخ: {date}",
"psbt_tx_open": "بازکردن تراکنش امضاشده",
"psbt_tx_scan": "اسکن تراکنش امضاشده",
"qr_error_no_qrcode": "نتوانستیم کد QR معتبری در تصویر انتخاب‌شده پیدا کنیم. مطمئن شوید تصویر فقط شامل کد QR است و محتوای اضافی مانند متن یا دکمه ندارد.",
"reset_amount": "بازنشانی مقدار",
"reset_amount_confirm": "آیا می‌خواهید مقدار را بازنشانی کنید؟",
"success_done": "انجام شد",
"txSaved": "فایل تراکنش ({filePath}) ذخیره شد.",
"file_saved_at_path": "فایل ({filePath}) ذخیره شد.",
"cant_send_to_silentpayment_adress": "این کیف پول نمی‌تواند به آدرس‌های Silent Payments ارسال کند",
"cant_send_to_bip47": "این کیف پول نمی‌تواند به کدهای پرداخت BIP47 ارسال کند",
"cant_find_bip47_notification": "ابتدا این کد پرداخت را به مخاطبان اضافه کنید",
"problem_with_psbt": "مشکل با تراکنش ناقص‌امضاشده (PSBT)"
},
"settings": {
@ -180,19 +219,29 @@
"performance_score": "امتیاز کارکرد: {num}",
"run_performance_test": "بررسی کارکرد",
"about_selftest": "اجرای خودآزمایی",
"block_explorer_invalid_custom_url": "آدرس ارائه‌شده نامعتبر است. لطفاً آدرسی معتبر را وارد کنید که با http:// یا https:// آغاز شود.",
"about_selftest_electrum_disabled": "خودآزمایی در حالت آفلاین در دسترس نیست. لطفاً حالت آفلاین را غیرفعال کرده و مجدد تلاش کنید.",
"about_selftest_ok": "تمام بررسی‌های داخلی با موفقیت انجام شدند. کیف پول به‌درستی کار می‌کند.",
"about_sm_github": "گیت‌هاب",
"about_sm_telegram": "کانال تلگرام",
"privacy_temporary_screenshots": "اجازهٔ ضبط صفحه",
"privacy_temporary_screenshots_instructions": "محافظت در برابر ضبط صفحه به‌طور موقت غیرفعال می‌شود تا گرفتن عکس از صفحه و ضبط صفحه ممکن شود. پس از بستن و بازکردن مجدد BlueWallet، محافظت به‌طور خودکار دوباره فعال خواهد شد.",
"biometrics": "بیومتریک",
"biometrics_no_longer_available": "تنظیمات دستگاه شما تغییر کرده و دیگر با تنظیمات امنیتی انتخاب‌شده در برنامه مطابقت ندارد. لطفاً بیومتریک یا رمز دستگاه را دوباره فعال کرده، سپس برنامه را برای اعمال این تغییرات راه‌اندازی مجدد کنید.",
"biom_10times": "شما برای واردکردن گذرواژهٔ خود ۱۰ بار تلاش کرده‌اید. آیا می‌خواهید فضای ذخیره‌سازی خود را بازنشانی کنید؟ این کار تمام کیف پول‌ها را حذف و فضای ذخیره‌سازی شما را رمزگشایی خواهد کرد.",
"biom_conf_identity": "لطفاً هویت خود را تأیید کنید.",
"biom_no_passcode": "دستگاه شما رمز دستگاه یا بیومتریک فعالی ندارد. برای ادامه، لطفاً در برنامهٔ تنظیمات یک رمز دستگاه یا بیومتریک پیکربندی کنید.",
"biom_remove_decrypt": "تمام کیف پول‌ها حذف و فضای ذخیره‌سازی شما رمزگشایی خواهد شد. آیا مطمئن هستید که می‌خواهید ادامه دهید؟",
"currency": "واحد پول",
"currency_source": "نرخ از این منبع به‌دست می‌آید",
"currency_fetch_error": "حین دریافت نرخ برای واحد پول انتخاب‌شده خطایی رخ داد.",
"default_title": "هنگام راه‌اندازی",
"donate": "اهدای کمک مالی",
"donate_description": "به ما کمک کنید تا Blue را رایگان نگه داریم!",
"electrum_connected": "متصل",
"electrum_connected_not": "عدم اتصال",
"electrum_error_connect": "اتصال به سرور Electrum ارائه‌شده ممکن نیست",
"electrum_error_connect_tor": "اتصال به سرور الکترام ارائه‌شده ممکن نیست. لطفاً مطمئن شوید که برنامهٔ Orbot متصل است و دوباره تلاش کنید.",
"lndhub_uri": "به‌عنوان مثال، {example}",
"electrum_host": "به‌عنوان مثال، {example}",
"electrum_offline_mode": "حالت آفلاین",
@ -201,15 +250,34 @@
"use_ssl": "از SSL استفاده کن",
"electrum_saved": "تغییرات شما با موفقیت ذخیره شدند. ممکن است برای اعمال تغییرات به راه‌اندازی مجدد برنامه نیاز داشته باشید.",
"set_electrum_server_as_default": "آیا {server} به‌عنوان سرور پیش‌فرض الکترام تعیین شود؟",
"set_lndhub_as_default": "آیا {url} به‌عنوان سرور پیش‌فرض LNDhub تعیین شود؟",
"electrum_settings_server": "سرور الکترام",
"electrum_status": "وضعیت",
"electrum_preferred_server": "سرور ترجیحی",
"electrum_preferred_server_description": "سروری را که می‌خواهید کیف پول شما برای همهٔ فعالیت‌های بیت‌کوین استفاده کند وارد کنید. پس از تنظیم، کیف پول شما به‌طور انحصاری از این سرور برای بررسی موجودی‌ها، ارسال تراکنش‌ها و دریافت داده‌های شبکه استفاده خواهد کرد. قبل از تنظیم، از قابل‌اعتماد بودن این سرور اطمینان حاصل کنید.",
"electrum_unable_to_connect": "ناموفق در اتصال به {server}",
"electrum_history": "تاریخچه",
"electrum_reset_to_default": "این کار به BlueWallet اجازه می‌دهد به‌صورت تصادفی سروری را از فهرست سرورها انتخاب کند.",
"electrum_reset": "بازنشانی به پیش‌فرض",
"electrum_reset_to_default_and_clear_history": "بازنشانی به پیش‌فرض و پاک‌کردن تاریخچه",
"encrypt_decrypt": "رمزگشایی فضای ذخیره‌سازی",
"encrypt_decrypt_q": "آیا از رمزگشایی فضای ذخیره‌سازی خود اطمینان دارید؟ این کار اجازه می‌دهد تا کیف پول‌های شما بدون گذرواژه قابل‌دسترسی باشند.",
"encrypt_enc_and_pass": "محافظت‌شده با گذرواژه",
"encrypt_storage_explanation_headline": "فعال‌کردن رمزگذاری فضای ذخیره‌سازی",
"encrypt_storage_explanation_description_line1": "فعال‌کردن رمزگذاری فضای ذخیره‌سازی لایهٔ محافظتی اضافه‌ای به برنامهٔ شما می‌افزاید و شیوهٔ ذخیره‌سازی داده‌های شما در دستگاه را امن می‌کند. این کار دسترسی دیگران به اطلاعات شما را بدون اجازه دشوارتر می‌سازد.",
"encrypt_storage_explanation_description_line2": "بااین‌حال، مهم است بدانید که این رمزگذاری فقط از دسترسی به کیف پول‌های ذخیره‌شده در زنجیرکلید دستگاه محافظت می‌کند. این کار گذرواژه یا محافظت اضافی روی خود کیف پول‌ها قرار نمی‌دهد.",
"i_understand": "متوجه شدم",
"block_explorer": "مرورگر بلاک",
"block_explorer_preferred": "استفاده از مرورگر بلاک ترجیحی",
"block_explorer_error_saving_custom": "خطا در ذخیرهٔ مرورگر بلاک ترجیحی",
"encrypt_title": "امنیت",
"encrypt_tstorage": "فضای ذخیره‌سازی",
"encrypt_use": "از {type} استفاده کنید",
"set_as_preferred": "تنظیم به‌عنوان ترجیحی",
"set_as_preferred_electrum": "تنظیم {host}:{port} به‌عنوان سرور ترجیحی، اتصال تصادفی به سرور پیشنهادی را غیرفعال خواهد کرد.",
"encrypted_feature_disabled": "این قابلیت با رمزگذاری فضای ذخیره‌سازی فعال قابل استفاده نیست.",
"encrypt_use_expl": "{type} برای تأیید هویت شما قبل از انجام تراکنش، بازکردن قفل، صادرکردن یا حذف کیف پول استفاده خواهد شد.",
"biometrics_fail": "اگر {type} فعال نباشد یا در بازکردن قفل موفق نشود، می‌توانید از رمز دستگاه به‌عنوان جایگزین استفاده کنید.",
"general": "عمومی",
"general_continuity": "پیوستگی",
"general_continuity_e": "درصورت فعال‌بودن، می‌توانید کیف پول‌های انتخاب‌شده و تراکنش‌ها را با استفاده از سایر دستگاه‌های متصل به Apple iCloud خود مشاهده کنید.",
@ -219,15 +287,21 @@
"last_updated": "آخرین به‌روزرسانی",
"language_isRTL": "راه‌اندازی مجدد BlueWallet جهت اعمال تغییرات چینش زبان ضروری است.",
"license": "پروانه",
"lightning_error_lndhub_uri": "آدرس LNDhub نامعتبر است",
"lightning_error_lndhub_uri_tor": "آدرس LNDhub نامعتبر است. لطفاً مطمئن شوید که برنامهٔ Orbot متصل است و دوباره تلاش کنید.",
"lightning_saved": "تغییرات شما با موفقیت ذخیره شدند.",
"lightning_settings": "تنظیمات لایتنینگ",
"lightning_settings_explain": "برای اتصال به گرهٔ LND خود، لطفاً LNDhub را نصب کرده و آدرس آن را اینجا در تنظیمات قرار دهید. لطفاً توجه داشته باشید که فقط کیف پول‌های ساخته‌شده پس از ذخیرهٔ تغییرات به LNDhub تعیین‌شده متصل خواهند شد.",
"lndhub_github": "مخزن GitHub",
"network": "شبکه",
"network_broadcast": "انتشار تراکنش",
"network_electrum": "سرور الکترام",
"electrum_suggested_description": "زمانی‌که سرور ترجیحی تنظیم نشده باشد، سرور پیشنهادی به‌صورت تصادفی برای استفاده انتخاب می‌شود.",
"not_a_valid_uri": "یوآرآی غیرمعتبر",
"notifications": "اعلانات",
"open_link_in_explorer": "بازکردن پیوند در مرورگر",
"password": "گذرواژه",
"password_explain": "گذرواژه‌ای را که برای بازکردن قفل فضای ذخیره‌سازی خود استفاده خواهید کرد وارد کنید.",
"plausible_deniability": "انکار موجه",
"privacy": "حریم خصوصی",
"privacy_read_clipboard": "خواندن کلیپ‌بورد",
@ -238,23 +312,29 @@
"privacy_do_not_track": "غیرفعال‌کردن تحلیل",
"privacy_do_not_track_explanation": "اطلاعات کارایی و پایداری جهت تحلیل ارسال نخواهد شد.",
"rate": "نرخ",
"push_notifications_explanation": "با فعال‌کردن اعلانات، توکن دستگاه شما به‌همراه آدرس‌های کیف پول و شناسه‌های تراکنش برای همهٔ کیف پول‌ها و تراکنش‌های انجام‌شده پس از فعال‌کردن اعلانات به سرور ارسال خواهد شد. توکن دستگاه برای ارسال اعلانات استفاده می‌شود و اطلاعات کیف پول به ما اجازه می‌دهد دربارهٔ بیت‌کوین ورودی یا تأییدیه‌های تراکنش به شما اطلاع دهیم.\n\nفقط اطلاعات پس از فعال‌کردن اعلانات منتقل می‌شود—هیچ‌چیزی از قبل جمع‌آوری نمی‌شود.\n\nغیرفعالکردن اعلانات تمام این اطلاعات را از سرور حذف خواهد کرد. علاوه‌براین، حذف کیف پول از برنامه نیز اطلاعات مرتبط با آن را از سرور حذف می‌کند.",
"selfTest": "خودآزمایی",
"save": "ذخیره",
"saved": "ذخیره شد",
"success_transaction_broadcasted": "تراکنش شما با موفقیت منتشر شد!",
"total_balance": "موجودی کل",
"total_balance_explanation": "نمایش موجودی کل تمام کیف پول‌های شما در ابزارک‌های صفحهٔ اصلی",
"widgets": "ابزارک‌ها",
"tools": "ابزارها"
},
"notifications": {
"would_you_like_to_receive_notifications": "آیا می‌خواهید هنگام دریافت وجه اعلان دریافت کنید؟"
"would_you_like_to_receive_notifications": "آیا می‌خواهید هنگام دریافت وجه اعلان دریافت کنید؟",
"notifications_subtitle": "پرداخت‌های ورودی و تأییدیه‌های تراکنش",
"no_and_dont_ask": "خیر، و دیگر از من نپرس.",
"permission_denied_message": "شما اجازهٔ ارسال اعلانات را رد کرده‌اید. اگر می‌خواهید اعلانات دریافت کنید، لطفاً آن‌ها را در تنظیمات دستگاه خود فعال کنید."
},
"transactions": {
"cancel_explain": "ما این تراکنش را با تراکنشی که گیرندهٔ آن شما هستید و کارمزد بیشتری دارد جایگزین خواهیم کرد. این درعمل تراکنش کنونی را لغو می‌کند. این کار Replace by Fee (به‌اختصار RBF) نام دارد—جایگزینی با کارمزد.",
"cancel_no": "این تراکنش قابل‌جایگزینی نیست.",
"cancel_title": "این تراکنش را لغو کن (RBF)",
"transaction_loading_error": "در بارگذاری تراکنش مشکلی پیش آمد. لطفاً بعداً دوباره تلاش کنید.",
"transaction_not_available": "تراکنش در دسترس نیست",
"confirmations_lowercase": "{confirmations} تأیید",
"copy_link": "کپی لینک",
"expand_note": "نمایش کامل یادداشت",
"cpfp_create": "ایجاد",
"cpfp_exp": "ما تراکنش دیگری را ایجاد خواهیم کرد که تراکنش تأییدنشدهٔ شما را خرج می‌کند. کارمزد کل بیشتر از کارمزد تراکنش اولیه خواهد بود، بنابراین سریع‌تر تأیید می‌شود. این کار Child Pays for Parent (به‌اختصار CPFP) نام دارد—فرزند به‌جای والدین می‌پردازد.",
@ -266,12 +346,18 @@
"details_copy_block_explorer_link": "کپی لینک مرورگر بلاک",
"details_copy_note": "کپی یادداشت",
"details_copy_txid": "کپی شناسهٔ تراکنش",
"details_from": "ورودی",
"details_inputs": "ورودی‌ها",
"details_outputs": "خروجی‌ها",
"date": "تاریخ",
"details_received": "دریافت‌شده",
"details_view_in_browser": "مشاهده در مرورگر",
"details_title": "تراکنش",
"incoming_transaction": "تراکنش ورودی",
"outgoing_transaction": "تراکنش خروجی",
"expired_transaction": "تراکنش منقضی‌شده",
"pending_transaction": "تراکنش در انتظار ثبت",
"offchain": "خارج از زنجیره",
"onchain": "روی زنجیره",
"details_to": "خروجی",
"enable_offline_signing": "این کیف پول در کنار امضای آفلاین استفاده نمی‌شود. آیا مایل به فعال‌کردن این امکان هستید؟",
"list_conf": "تأییدها: {number}",
@ -281,46 +367,77 @@
"eta_10m": "زمان تقریبی رسیدن: حدود ده دقیقه",
"eta_3h": "زمان تقریبی رسیدن: حدود سه ساعت",
"eta_1d": "زمان تقریبی رسیدن: حدود یک روز",
"view_wallet": "مشاهدهٔ {walletLabel}",
"list_title": "تراکنش‌ها",
"list_title_sent": "ارسال‌شده",
"list_title_received": "دریافت‌شده",
"transaction": "تراکنش",
"open_url_error": "ناموفق در بازکردن لینک با مرورگر پیش‌فرض. لطفاً مرورگر پیش‌فرض خود را تغییر داده و مجدد تلاش کنید.",
"rbf_explain": "ما این تراکنش را با تراکنشی با کارمزد بالاتر جایگزین خواهیم کرد تا سریع‌تر تأیید شود. این کار Replace by Fee (به‌اختصار RBF) نام دارد—جایگزینی با کارمزد.",
"rbf_title": "افزایش کارمزد (RBF)",
"status_bump": "افزایش کارمزد",
"rbf_title": "تسریع (RBF)",
"status_bump": "تسریع",
"status_cancel": "لغو تراکنش",
"transactions_count": "تعداد تراکنش‌ها",
"txid": "شناسهٔ تراکنش",
"updating": "درحال به‌روزرسانی…"
"updating": "درحال به‌روزرسانی…",
"watchOnlyWarningTitle": "هشدار امنیتی",
"watchOnlyWarningDescription": "مراقب کلاهبردارانی باشید که اغلب از کیف پول‌های «فقط‌خواندنی» برای فریب کاربران استفاده می‌کنند. این کیف پول‌ها به شما اجازهٔ کنترل یا ارسال وجه را نمی‌دهند؛ تنها امکان مشاهدهٔ موجودی را فراهم می‌کنند.",
"custom_fee_warning_title": "هشدار",
"custom_fee_warning_description": "کارمزدهای کمتر از ۱ sat/vB معتبر هستند، اما ممکن است به‌دلیل سیاست‌های گره‌ها بازپخش نشوند.",
"details_eta_analyzing": "درحال تحلیل...",
"details_sent": "ارسال‌شده",
"details_section": "جزئیات",
"details_explorer": "مرورگر",
"details_network_fee": "کارمزد شبکه",
"details_to_address": "به",
"details_id": "شناسه",
"details_note": "یادداشت",
"details_add_note": "افزودن",
"details_advanced": "پیشرفته",
"details_fee_rate": "نرخ کارمزد",
"details_size": "اندازه",
"details_virtual_size": "اندازهٔ مجازی",
"details_tx_hex": "هگزادسیمال تراکنش",
"details_inputs_count": "ورودی‌ها ({count})",
"details_outputs_count": "خروجی‌ها ({count})"
},
"wallets": {
"add_bitcoin": "بیت‌کوین",
"add_bitcoin_explain": "کیف پول ساده و قدرتمند بیت‌کوین",
"add_create": "ایجاد",
"total_balance": "موجودی کل",
"add_entropy_reset_title": "بازنشانی آنتروپی",
"add_entropy_reset_message": "تغییر نوع کیف پول، آنتروپی فعلی را بازنشانی خواهد کرد. آیا می‌خواهید ادامه دهید؟",
"add_entropy": "آنتروپی",
"add_entropy_bytes": "{bytes} بایت آنتروپی",
"add_entropy_generated": "{gen} بایت از آنتروپی تولیدشده",
"add_entropy_provide": "فراهم‌کردن آنتروپی از طریق انداختن تاس",
"add_entropy_remain": "{gen} بایت از آنتروپی تولیدشده. {rem} بایت باقی‌مانده از تولیدکنندهٔ اعداد تصادفی سیستم گرفته خواهد شد.",
"add_import_wallet": "واردکردن کیف پول",
"add_lightning": "لایتنینگ",
"add_lightning_explain": "برای خرج‌کردن با تراکنش‌های آنی",
"add_lndhub": "اتصال به LNDhub خود",
"add_lndhub_error": "آدرس گرهٔ ارائه‌شده یک گرهٔ LNDhub نامعتبر است.",
"add_lndhub_placeholder": "آدرس گره شما",
"add_placeholder": "کیف پول اول من",
"add_title": "افزودن کیف پول",
"add_wallet_name": "نام",
"add_wallet_type": "نوع",
"add_wallet_seed_length": "طول سید",
"add_wallet_seed_length_12": "۱۲ کلمه",
"add_wallet_seed_length_24": "۲۴ کلمه",
"clipboard_bitcoin": "شما یک آدرس بیت‌کوین در کلیپ‌بورد خود دارید. آیا می‌خواهید برای تراکنش از آن استفاده کنید؟",
"clipboard_lightning": "شما در کلیپ‌بورد خود یک صورت‌حساب لایتنینگ دارید. آیا می‌خواهید برای تراکنش از آن استفاده کنید؟",
"clear_clipboard_on_import": "پاک‌کردن کلیپ‌بورد هنگام واردکردن",
"details_address": "آدرس",
"details_advanced": "پیشرفته",
"details_are_you_sure": "مطمئن هستید؟",
"details_connected_to": "متصل به",
"details_del_wb_err": "مقدار موجودی ارائه‌شده با موجودی این کیف پول مطابقت ندارد. لطفاً دوباره تلاش کنید.",
"details_del_wb_q": "این کیف پول دارای موجودی است. قبل از ادامه، لطفاً توجه داشته باشید که بدون عبارت سید این کیف پول، قادر به بازیابی دارایی آن نخواهید بود. به‌منظور جلوگیری از حذف تصادفی این کیف پول، لطفاً موجودی کیف پول خود معادل {balance} ساتوشی را وارد کنید.",
"details_delete": "حذف",
"details_delete_wallet": "حذف کیف پول",
"details_derivation_path": "مسیر اشتقاق",
"details_display": "نمایش در صفحهٔ اصلی",
"details_export_backup": "صادرکردن/نسخهٔ پشتیبان",
"details_export_history": "گرفتن خروجی تاریخچه به فرمت CSV",
"details_master_fingerprint": "اثر انگشت اصلی",
@ -329,6 +446,10 @@
"details_show_addresses": "نمایش آدرس‌ها",
"details_title": "کیف پول",
"wallets": "کیف پول‌ها",
"swipe_balance_hide": "پنهان‌کردن",
"swipe_balance_show": "نمایش",
"drag_to_reorder": "برای ترتیب‌بندی بکشید",
"clear_search": "پاک‌کردن جستجو",
"details_type": "نوع",
"details_use_with_hardware_wallet": "استفاده همراه با کیف پول سخت‌افزاری",
"details_yes_delete": "بله، حذف کن",
@ -346,17 +467,22 @@
"import_success_watchonly": "کیف پول شما با موفقیت وارد شد. هشدار: این یک کیف پول ناظر است، نمی‌توانید از آن خرج کنید",
"import_search_accounts": "جستجوی حساب‌ها",
"import_title": "واردکردن",
"learn_more": "اطلاعات بیشتر",
"import_discovery_title": "کشف",
"import_discovery_subtitle": "کیف پول پیداشده را انتخاب کنید",
"import_discovery_derivation": "استفاده از مسیر اشتقاق دلخواه",
"import_discovery_no_wallets": "کیف پولی یافت نشد.",
"import_discovery_offline": "BlueWallet در حال حاضر در حالت آفلاین است. در این حالت نمی‌تواند وجود کیف پول را تأیید کند، بنابراین باید کیف پول صحیح را به‌صورت دستی انتخاب کنید",
"import_derivation_found": "پیدا شد",
"import_derivation_found_not": "پیدا نشد",
"import_derivation_loading": "درحال‌بارگذاری…",
"import_derivation_subtitle": "مسیر اشتقاق دلخواه را وارد کنید و ما تلاش می‌کنیم کیف پول شما را کشف کنیم.",
"import_derivation_title": "مسیر اشتقاق",
"import_derivation_unknown": "نامشخص",
"import_wrong_path": "مسیر اشتقاق اشتباه",
"list_create_a_button": "هم‌اکنون اضافه کن",
"list_create_a_wallet": "افزودن کیف پول",
"list_create_a_wallet_text": "رایگان است، و می‌توانید \nبه هر تعداد که خواستید بسازید.",
"list_empty_txs1": "تراکنش‌های شما در اینجا نمایش داده خواهند شد.",
"list_empty_txs1_lightning": "برای تراکنش‌های روزمره بهتر است از کیف پول لایتنینگ استفاده شود. کارمزدها به‌طرز غیرمنصفانه‌ای ارزان و سرعت فوق‌العاده بالاست.",
"list_empty_txs2": "با کیف پول خود شروع کنید.",
@ -370,31 +496,56 @@
"list_tryagain": "دوباره امتحان کنید",
"no_ln_wallet_error": "قبل از پرداخت یک صورت‌حساب لایتنینگ، ابتدا باید یک کیف پول لایتنینگ اضافه کنید.",
"looks_like_bip38": "این به کلید خصوصی محافظت‌شده با گذرواژه (BIP38) شباهت دارد.",
"manage_title": "مدیریت کیف پول‌ها",
"no_results_found": "نتیجه‌ای یافت نشد.",
"please_continue_scanning": "لطفاً به اسکن‌کردن ادامه دهید.",
"select_no_bitcoin": "هیچ کیف پول بیت‌کوینی درحال‌حاضر دردسترس نیست.",
"select_no_bitcoin_exp": "یک کیف پول بیت‌کوین برای پرکردن کیف پول‌های لایتنینگ نیاز است. لطفاً یکی بسازید یا وارد کنید.",
"select_wallet": "انتخاب کیف پول",
"xpub_copiedToClipboard": "در کلیپ‌بورد کپی شد.",
"pull_to_refresh": "برای به‌روزسانی به پایین بکشید",
"warning_do_not_disclose": "هرگز اطلاعات زیر را به اشتراک نگذارید",
"scan_import": "این کد QR را اسکن کنید تا کیف پول خود را در برنامهٔ دیگری وارد کنید.",
"write_down_header": "ایجاد نسخهٔ پشتیبان دستی",
"write_down": "این کلمات را یادداشت و به‌طور امن نگهداری کنید. از آن‌ها برای بازیابی کیف پول خود در زمان دیگری استفاده کنید.",
"wallet_type_this": "نوع این کیف پول {type} است.",
"share_number": "هم‌رسانی {number}",
"copy_ln_url": "این آدرس را کپی و به‌طور امن نگهداری کنید تا بعداً کیف پول خود را بازیابی کنید.",
"copy_ln_public": "این اطلاعات را کپی و به‌طور امن نگهداری کنید تا بعداً کیف پول خود را بازیابی کنید.",
"add_ln_wallet_first": "ابتدا باید یک کیف پول لایتنینگ اضافه کنید.",
"identity_pubkey": "هویت/کلید عمومی",
"xpub_title": "کلید XPUB کیف پول"
"xpub_title": "کلید XPUB کیف پول",
"manage_wallets_search_placeholder": "جستجوی کیف پول‌ها، آدرس‌ها، تراکنش‌ها و یادداشت‌ها",
"more_info": "اطلاعات بیشتر",
"details_delete_wallet_error_message": "در تأیید حذف این کیف پول از اعلانات مشکلی پیش آمد—این می‌تواند به‌دلیل مشکل شبکه یا اتصال ضعیف باشد. اگر ادامه دهید، ممکن است حتی پس از حذف کیف پول، همچنان برای تراکنش‌های مرتبط با این کیف پول اعلانات دریافت کنید.",
"details_delete_anyway": "به‌هرحال حذف کن"
},
"total_balance_view": {
"title": "موجودی کل"
"display_in_bitcoin": "نمایش به بیت‌کوین",
"hide": "پنهان‌کردن",
"display_in_sats": "نمایش به ساتوشی",
"display_in_fiat": "نمایش به {currency}",
"title": "موجودی کل",
"explanation": "موجودی کل تمام کیف پول‌های خود را در صفحهٔ مرور مشاهده کنید."
},
"multisig": {
"multisig_vault": "گاوصندوق چندامضایی",
"default_label": "گاوصندوق چندامضایی",
"multisig_vault_explain": "بالاترین امنیت برای مقادیر زیاد",
"provide_signature": "ارائهٔ امضا",
"provide_signature_details": "از دستگاه و کیف پولی که کلید در آن قرار دارد برای امضای این تراکنش استفاده کنید",
"provide_signature_details_bluewallet": "در BlueWallet، به منوی صفحهٔ ارسال بروید و گزینهٔ زیر را انتخاب کنید ",
"provide_signature_next_steps": "اسکن یا واردکردن تراکنش امضاشده",
"provide_signature_next_steps_details": "پس از آنکه کیف پول شما تراکنش را با موفقیت امضا کرد، کد QR ارائه‌شده را اسکن کنید یا فایل همراه را وارد کنید، سپس قبل از انتشار، همهٔ جزئیات تراکنش را بررسی کنید.",
"vault_key": "کلید گاوصندوق {number}",
"required_keys_out_of_total": "کلیدهای موردنیاز از کل",
"fee": "کارمزد: {number}",
"fee_btc": "{number} بیت‌کوین",
"confirm": "تأیید",
"header": "ارسال",
"share": "هم‌رسانی...",
"view": "مشاهده",
"shared_key_detected": "هم‌امضاکنندهٔ به‌اشتراک‌گذاشته‌شده",
"shared_key_detected_question": "یک هم‌امضاکننده با شما به اشتراک گذاشته شده است، آیا می‌خواهید آن را وارد کنید؟",
"manage_keys": "مدیریت کلیدها",
"how_many_signatures_can_bluewallet_make": "امضاهایی که BlueWallet می‌تواند ایجاد کند",
"signatures_required_to_spend": "امضاهای موردنیاز: {number}",
@ -420,14 +571,21 @@
"quorum_header": "حد نصاب",
"of": "از",
"wallet_type": "نوع کیف پول",
"invalid_mnemonics": "به‌نظر می‌رسد این عبارت یادیار معتبر نیست.",
"invalid_cosigner": "دادهٔ هم‌امضاکننده نامعتبر است",
"not_a_multisignature_xpub": "این XPUB از یک کیف پول چندامضایی نیست!",
"invalid_cosigner_format": "هم‌امضاکنندهٔ نادرست: این یک هم‌امضاکننده برای قالب {format} نیست.",
"create_new_key": "جدید بسازید",
"scan_or_open_file": "اسکن یا بازکردن فایل",
"i_have_mnemonics": "من سید این کلید را دارم.",
"type_your_mnemonics": "سید را بنویسید تا کلید گاوصندوق فعلی خود را وارد کنید.",
"this_is_cosigners_xpub": "این XPUB هم‌امضاکننده است—آمادهٔ واردکردن در کیف پول دیگری. به‌اشتراک‌گذاری آن ایمن است.",
"this_is_cosigners_xpub_airdrop": "اگر از طریق AirDrop به اشتراک می‌گذارید، گیرندگان باید در صفحهٔ هماهنگی باشند.",
"wallet_key_created": "کلید گاوصندوق شما ایجاد شد. لحظه‌ای درنگ کرده تا با خیال راحت از سید خود نسخهٔ پشتیبان تهیه کنید.",
"are_you_sure_seed_will_be_lost": "مطمئن هستید؟ درصورتی‌که نسخهٔ پشتیبان نداشته باشید، سید شما ازبین خواهد رفت.",
"forget_this_seed": "این سید را فراموش و به‌جای آن از XPUB استفاده کن.",
"view_edit_cosigners": "مشاهده/ویرایش هم‌امضاکنندگان",
"this_cosigner_is_already_imported": "این هم‌امضاکننده قبلاً وارد شده است.",
"export_signed_psbt": "صادرکردن PSBT امضاشده",
"input_fp": "اثر انگشت را وارد کنید",
"input_fp_explain": "جهت استفاده از تنظیمات پیش‌فرض (۰۰۰۰۰۰۰۰) رد کنید",
@ -452,12 +610,20 @@
"owns": "آدرس {address} متعلق به «{label}» است.",
"enter_address": "آدرس را وارد کنید",
"check_address": "بررسی آدرس",
"no_wallet_owns_address": "آدرس ارائه‌شده متعلق به هیچ‌کدام از کیف پول‌های موجود نیست."
"no_wallet_owns_address": "آدرس ارائه‌شده متعلق به هیچ‌کدام از کیف پول‌های موجود نیست.",
"view_qrcode": "مشاهدهٔ کد QR"
},
"autofill_word": {
"title": "کلمهٔ نهایی سید",
"enter": "عبارت یادیار ناقص خود را وارد کنید",
"generate_word": "تولید کلمهٔ نهایی",
"error": "ورودی، عبارت یادیار ناقص ۱۱ یا ۲۳ کلمه‌ای نیست. لطفاً دوباره تلاش کنید."
},
"cc": {
"change": "باقی‌مانده (change)",
"coins_selected": "کوین‌های انتخاب‌شده ({number})",
"selected_summ": "انتخاب‌شده: {value}",
"empty": "این کیف پول در حال حاضر کوینی ندارد.",
"freeze": "مسدود",
"freezeLabel": "مسدودکردن",
"freezeLabel_un": "عدم مسدودسازی",
@ -465,7 +631,13 @@
"use_coin": "استفاده از کوین",
"use_coins": "استفاده از کوین‌ها",
"tip": "به شما اجازه می‌دهد برای مدیریت بهتر کیف پول، کوین‌ها را مشاهده، برچسب‌گذاری، مسدود، یا انتخاب کنید. شما می‌توانید با زدن روی دایره‌های رنگی بیش از یک کوین را انتخاب کنید.",
"sort_status": "وضعیت"
"sort_asc": "صعودی",
"sort_desc": "نزولی",
"sort_height": "ارتفاع",
"sort_value": "ارزش",
"sort_label": "برچسب",
"sort_status": "وضعیت",
"sort_by": "مرتب‌سازی بر اساس"
},
"units": {
"BTC": "بیت‌کوین",
@ -474,6 +646,8 @@
"sats": "ساتوشی"
},
"addresses": {
"copy_private_key": "کپی کلید خصوصی",
"sensitive_private_key": "هشدار: کلیدهای خصوصی بسیار حساس هستند. ادامه می‌دهید؟",
"sign_title": "امضا/صحت‌سنجی پیام",
"sign_help": "اینجا شما می‌توانید امضای رمزنگارانه‌ای را از روی یک آدرس بیت‌کوین تولید یا صحت‌سنجی کنید.",
"sign_sign": "امضاکردن",
@ -508,11 +682,23 @@
"bip47": {
"payment_code": "کد پرداخت",
"contacts": "مخاطبان",
"purpose": "کد بازکاربردپذیر و قابل همرسانی (بیپ47)",
"bip47_explain": "کد بازکاربردپذیر و قابل هم‌رسانی",
"bip47_explain_subtitle": "BIP47",
"purpose": "کد بازکاربردپذیر و قابل همرسانی (BIP47)",
"pay_this_contact": "پرداخت به این مخاطب",
"copy_payment_code": "رونویسی کد پرداخت",
"rename_contact": "ویرایش نام مخاطب",
"copy_payment_code": "کپی کد پرداخت",
"hide_contact": "پنهان‌کردن مخاطب",
"rename": "ویرایش نام",
"provide_name": "نام جدیدی برای این مخاطب ارائه دهید",
"add_contact": "افزودن مخاطب",
"provide_payment_code": "کد پرداخت را ارائه دهید",
"invalid_pc": "کد پرداخت نامعتبر",
"notification_tx_unconfirmed": "تراکنش اعلان هنوز تأیید نشده است، لطفاً صبر کنید",
"failed_create_notif_tx": "ایجاد تراکنش روی زنجیره ناموفق بود",
"onchain_tx_needed": "به تراکنش روی زنجیره نیاز است",
"notif_tx_sent": "تراکنش اعلان ارسال شد. لطفاً منتظر تأیید آن باشید",
"notif_tx": "تراکنش اعلان",
"not_found": "کد پرداخت یافت نشد"
}
}

Some files were not shown because too many files have changed in this diff Show More