diff --git a/babel/messages.pot b/babel/messages.pot index 457ce7cf..739947f2 100644 --- a/babel/messages.pot +++ b/babel/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: seedsigner 0.7.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-09-27 19:42-0500\n" +"POT-Creation-Date: 2024-10-08 09:43-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,414 +17,472 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.16.0\n" +#. Testnet bitcoin +#: src/seedsigner/gui/components.py:870 +msgid "tBtc" +msgstr "" + +#. Testnet sats +#: src/seedsigner/gui/components.py:873 +msgid "tSats" +msgstr "" + +#: src/seedsigner/gui/components.py:875 +#: src/seedsigner/gui/screens/psbt_screens.py:473 +#: src/seedsigner/gui/screens/psbt_screens.py:526 +msgid "btc" +msgstr "" + +#: src/seedsigner/gui/components.py:876 +#: src/seedsigner/gui/screens/psbt_screens.py:485 +msgid "sats" +msgstr "" + #. The abbreviated label for the special key on a standard keyboard. -#: src/seedsigner/gui/keyboard.py +#: src/seedsigner/gui/keyboard.py:32 msgid "del" msgstr "" #. The abbreviated label for the special key on a standard keyboard. -#: src/seedsigner/gui/keyboard.py +#: src/seedsigner/gui/keyboard.py:40 msgid "space" msgstr "" -#: src/seedsigner/gui/toast.py +#: src/seedsigner/gui/toast.py:202 msgid "" "You can remove\n" "the SD card now" msgstr "" -#: src/seedsigner/gui/toast.py +#: src/seedsigner/gui/toast.py:222 msgid "SD card removed" msgstr "" -#: src/seedsigner/gui/toast.py +#: src/seedsigner/gui/toast.py:222 msgid "SD card inserted" msgstr "" -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:30 msgid "Review PSBT" msgstr "" -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:32 msgid "Review Details" msgstr "" -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:89 msgid "1 input" msgstr "" -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:91 msgid "input 1" msgstr "" -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:92 msgid "input 2" msgstr "" #. Indicates that items have been omitted from a series: e.g. "1, 2, 3, [...], #. 8" -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:94 +#: src/seedsigner/gui/screens/psbt_screens.py:146 msgid "[ ... ]" msgstr "" #. Input number will be inserted (e.g. "input 3") -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:96 +#: src/seedsigner/gui/screens/psbt_screens.py:97 +#: src/seedsigner/gui/screens/psbt_screens.py:100 msgid "input {}" msgstr "" #. Ellipsis ("...") characters used to truncate an address (e.g. "bc1qabc...") -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:128 +#: src/seedsigner/gui/screens/psbt_screens.py:132 msgid "..." msgstr "" -#: src/seedsigner/gui/screens/psbt_screens.py -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/gui/screens/psbt_screens.py:141 +#: src/seedsigner/views/psbt_views.py:453 +#: src/seedsigner/views/psbt_views.py:457 msgid "self-transfer" msgstr "" -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:144 msgid "recipient 1" msgstr "" #. Inserts the recipient number (e.g. the fifth one is: "recipient 5") -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:148 msgid "recipient {}" msgstr "" -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:150 +#: src/seedsigner/gui/screens/psbt_screens.py:560 msgid "fee" msgstr "" #. Label for a change output in the PSBT Overview flow diagram -#: src/seedsigner/gui/screens/psbt_screens.py -#: src/seedsigner/views/psbt_views.py +#. Used in a sentence describing the address type (change or receive) +#: src/seedsigner/gui/screens/psbt_screens.py:155 +#: src/seedsigner/views/psbt_views.py:453 +#: src/seedsigner/views/psbt_views.py:457 +#: src/seedsigner/views/seed_views.py:1884 msgid "change" msgstr "" -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:466 msgid "PSBT Math" msgstr "" -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:467 msgid "Review Recipients" msgstr "" -#: src/seedsigner/gui/screens/psbt_screens.py -msgid "btc" -msgstr "" - -#: src/seedsigner/gui/screens/psbt_screens.py -msgid "sats" -msgstr "" - -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:543 msgid "input" msgid_plural "inputs" msgstr[0] "" msgstr[1] "" -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:553 msgid "recipient" msgid_plural "recipients" msgstr[0] "" msgstr[1] "" #. Denonination is inserted (e.g. your "btc change" or "sats change") -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:571 msgid "{} change" msgstr "" #. First variable is either "Multisig" or the fingerprint for single sig; #. Second is "Change" or "Addr" (change vs receive addr); Third is the address #. index number (e.g. your #4 receive addr). -#: src/seedsigner/gui/screens/psbt_screens.py -#: src/seedsigner/models/settings_definition.py -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/gui/screens/psbt_screens.py:665 +#: src/seedsigner/models/settings_definition.py:132 +#: src/seedsigner/views/seed_views.py:634 msgid "Multisig" msgstr "" -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:665 msgid "Change" msgstr "" -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:665 msgid "Addr" msgstr "" -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:677 msgid "Address verified!" msgstr "" -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:689 msgid "Sign PSBT" msgstr "" -#: src/seedsigner/gui/screens/psbt_screens.py +#: src/seedsigner/gui/screens/psbt_screens.py:703 msgid "Click to approve this transaction" msgstr "" -#: src/seedsigner/gui/screens/scan_screens.py +#: src/seedsigner/gui/screens/scan_screens.py:57 msgid "< back | " msgstr "" -#: src/seedsigner/gui/screens/screen.py src/seedsigner/views/seed_views.py +#: src/seedsigner/gui/screens/scan_screens.py:102 +msgid "{}% Complete" +msgstr "" + +#. Increase QR code screen brightness +#: src/seedsigner/gui/screens/screen.py:728 +msgid "Brighter" +msgstr "" + +#. Decrease QR code screen brightness +#: src/seedsigner/gui/screens/screen.py:746 +msgid "Darker" +msgstr "" + +#: src/seedsigner/gui/screens/screen.py:860 +#: src/seedsigner/views/seed_views.py:1321 +#: src/seedsigner/views/seed_views.py:1570 msgid "Success!" msgstr "" -#: src/seedsigner/gui/screens/screen.py src/seedsigner/views/seed_views.py +#: src/seedsigner/gui/screens/screen.py:864 +#: src/seedsigner/views/seed_views.py:1323 +#: src/seedsigner/views/seed_views.py:1573 +#: src/seedsigner/views/seed_views.py:1943 msgid "OK" msgstr "" -#: src/seedsigner/gui/screens/screen.py src/seedsigner/views/psbt_views.py +#: src/seedsigner/gui/screens/screen.py:982 +#: src/seedsigner/views/psbt_views.py:451 msgid "Caution" msgstr "" -#: src/seedsigner/gui/screens/screen.py src/seedsigner/views/seed_views.py +#: src/seedsigner/gui/screens/screen.py:985 +#: src/seedsigner/views/seed_views.py:814 msgid "Privacy Leak!" msgstr "" -#: src/seedsigner/gui/screens/screen.py +#: src/seedsigner/gui/screens/screen.py:988 msgid "I Understand" msgstr "" -#: src/seedsigner/gui/screens/screen.py +#: src/seedsigner/gui/screens/screen.py:1001 msgid "Classified Info!" msgstr "" -#: src/seedsigner/gui/screens/screen.py +#: src/seedsigner/gui/screens/screen.py:1010 msgid "Restarting" msgstr "" -#: src/seedsigner/gui/screens/screen.py +#: src/seedsigner/gui/screens/screen.py:1015 msgid "" "SeedSigner is restarting.\n" "\n" "All in-memory data will be wiped." msgstr "" -#: src/seedsigner/gui/screens/screen.py +#: src/seedsigner/gui/screens/screen.py:1025 msgid "Powering Off" msgstr "" -#: src/seedsigner/gui/screens/screen.py +#: src/seedsigner/gui/screens/screen.py:1030 msgid "Please wait about 30 seconds before disconnecting power." msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/screen.py:1044 +msgid "It is safe to disconnect power at any time." +msgstr "" + +#: src/seedsigner/gui/screens/seed_screens.py:415 msgid "Finalize Seed" msgstr "" #. a label for the shortened Key-id of a BIP-32 master HD wallet -#: src/seedsigner/gui/screens/seed_screens.py -#: src/seedsigner/gui/screens/tools_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:422 +#: src/seedsigner/gui/screens/tools_screens.py:393 msgid "fingerprint" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/gui/screens/seed_screens.py:454 +#: src/seedsigner/views/seed_views.py:490 +#: src/seedsigner/views/seed_views.py:600 msgid "Backup Seed" msgstr "" #. Additional explainer for the two seed backup options (mnemonic phrase and #. SeedQR). -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:461 msgid "Backups do not include your passphrase." msgstr "" #. Displays the page number and total: (e.g. page 1 of 6) -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:478 msgid "Seed Words: {}/{}" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:553 msgid "BIP-85 Index" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:569 msgid "Verify Backup?" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:575 msgid "Optionally verify that your mnemonic backup is correct." msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:585 msgid "Derivation Path" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/gui/screens/seed_screens.py:609 +#: src/seedsigner/views/seed_views.py:488 +#: src/seedsigner/views/seed_views.py:639 +#: src/seedsigner/views/seed_views.py:674 +#: src/seedsigner/views/seed_views.py:771 msgid "Export Xpub" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:610 msgid "Xpub Details" msgstr "" #. Short for "BIP32 Master Fingerprint" #. a label for the shortened Key-id of a BIP-32 master HD wallet -#: src/seedsigner/gui/screens/seed_screens.py -#: src/seedsigner/gui/screens/tools_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:620 +#: src/seedsigner/gui/screens/tools_screens.py:419 msgid "Fingerprint" msgstr "" #. Short for "Derivation Path" #. a label for the derivation-path into a BIP-32 HD wallet -#: src/seedsigner/gui/screens/seed_screens.py -#: src/seedsigner/gui/screens/tools_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:631 +#: src/seedsigner/gui/screens/tools_screens.py:429 +#: src/seedsigner/gui/screens/tools_screens.py:438 msgid "Derivation" msgstr "" #. Short for "BIP32 Extended Public Key" -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:642 msgid "Xpub" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/gui/screens/seed_screens.py:664 +#: src/seedsigner/views/seed_views.py:325 msgid "BIP-39 Passphrase" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:1040 msgid "Verify Passphrase" msgstr "" #. Describes the effect of applying a BIP-39 passphrase; it changes the seed's #. fingerprint -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:1049 msgid "changes fingerprint" msgstr "" #. Refers to the SeedQR type: Standard or Compact -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:1110 msgid "Standard" msgstr "" #. Briefly explains the Standard SeedQR data format -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:1112 msgid "BIP-39 wordlist indices" msgstr "" #. Refers to the SeedQR type: Standard or Compact -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:1120 msgid "Compact" msgstr "" #. Briefly explains the Compact SeedQR data format -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:1122 msgid "Raw entropy bits" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:1136 msgid "Transcribe SeedQR" msgstr "" #. Refers to the QR code size: 21x21, 25x25, or 29x29 -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:1138 msgid "Begin {}x{}" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:1215 msgid "click to exit" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:1351 msgid "" "Optionally scan your transcribed SeedQR to confirm that it reads back " "correctly." msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py -#: src/seedsigner/views/seed_views.py src/seedsigner/views/tools_views.py +#: src/seedsigner/gui/screens/seed_screens.py:1408 +#: src/seedsigner/views/seed_views.py:97 +#: src/seedsigner/views/seed_views.py:1654 +#: src/seedsigner/views/tools_views.py:40 msgid "Verify Address" msgstr "" #. Inserts the nth address number (e.g. "Checking address 7") -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:1472 msgid "Checking address {}" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:1489 msgid "Multisig Verification" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:1494 msgid "" "Load your multisig wallet descriptor to verify your receive/self-transfer" " or change address." msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:1507 msgid "Descriptor Loaded" msgstr "" #. Label for the multisig wallet's signing policy (e.g. 2-of-3) -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:1513 msgid "Policy" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:1521 msgid "Signing Keys" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:1556 msgid "Review Message" msgstr "" #. Short for "Next step" -#: src/seedsigner/gui/screens/seed_screens.py -#: src/seedsigner/views/psbt_views.py src/seedsigner/views/seed_views.py -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/gui/screens/seed_screens.py:1561 +#: src/seedsigner/views/psbt_views.py:268 +#: src/seedsigner/views/psbt_views.py:339 +#: src/seedsigner/views/seed_views.py:1000 +#: src/seedsigner/views/tools_views.py:400 msgid "Next" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:1580 msgid "Confirm Address" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/gui/screens/seed_screens.py:1583 +#: src/seedsigner/views/seed_views.py:104 msgid "Sign Message" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py +#: src/seedsigner/gui/screens/seed_screens.py:1589 msgid "derivation path" msgstr "" -#: src/seedsigner/gui/screens/settings_screens.py -#: src/seedsigner/views/settings_views.py src/seedsigner/views/view.py +#: src/seedsigner/gui/screens/settings_screens.py:26 +#: src/seedsigner/views/settings_views.py:48 src/seedsigner/views/view.py:194 msgid "Settings" msgstr "" #. Short for "Input/Output"; screen to make sure the buttons and camera are #. working properly -#: src/seedsigner/gui/screens/settings_screens.py +#: src/seedsigner/gui/screens/settings_screens.py:59 msgid "I/O Test" msgstr "" #. Blank the screen -#: src/seedsigner/gui/screens/settings_screens.py +#: src/seedsigner/gui/screens/settings_screens.py:130 +#: src/seedsigner/gui/screens/settings_screens.py:141 +#: src/seedsigner/gui/screens/settings_screens.py:222 msgid "Clear" msgstr "" -#: src/seedsigner/gui/screens/settings_screens.py +#: src/seedsigner/gui/screens/settings_screens.py:162 msgid "Exit" msgstr "" -#: src/seedsigner/gui/screens/settings_screens.py -#: src/seedsigner/gui/screens/tools_screens.py +#: src/seedsigner/gui/screens/settings_screens.py:176 +#: src/seedsigner/gui/screens/tools_screens.py:59 msgid "Capturing image..." msgstr "" -#: src/seedsigner/gui/screens/settings_screens.py -#: src/seedsigner/views/settings_views.py +#: src/seedsigner/gui/screens/settings_screens.py:289 +#: src/seedsigner/views/settings_views.py:33 msgid "Donate" msgstr "" #. If your language uses the percent sign ("%"), your translation must also use #. two percent signs ("%%") due to python formatting oddities. "100%%" will be #. rendered as "100%". -#: src/seedsigner/gui/screens/settings_screens.py +#: src/seedsigner/gui/screens/settings_screens.py:294 #, python-format msgid "" "SeedSigner is 100%% free & open source, funded solely by the Bitcoin " @@ -433,303 +491,317 @@ msgid "" "Donate onchain or LN at:" msgstr "" -#: src/seedsigner/gui/screens/settings_screens.py -#: src/seedsigner/views/settings_views.py +#: src/seedsigner/gui/screens/settings_screens.py:317 +#: src/seedsigner/views/settings_views.py:218 msgid "Settings QR" msgstr "" -#: src/seedsigner/gui/screens/settings_screens.py -#: src/seedsigner/views/settings_views.py src/seedsigner/views/view.py +#: src/seedsigner/gui/screens/settings_screens.py:319 +#: src/seedsigner/views/settings_views.py:220 src/seedsigner/views/view.py:199 msgid "Home" msgstr "" #. Instructions when reviewing an image; "reshoot" must point left, "accept" #. must point right -#: src/seedsigner/gui/screens/tools_screens.py +#: src/seedsigner/gui/screens/tools_screens.py:109 msgid " < reshoot | accept > " msgstr "" #. current roll number vs total rolls (e.g. roll 7 of 50) -#: src/seedsigner/gui/screens/tools_screens.py +#: src/seedsigner/gui/screens/tools_screens.py:129 +#: src/seedsigner/gui/screens/tools_screens.py:160 msgid "Dice Roll {}/{}" msgstr "" #. Build the last word in a 12 or 24 word BIP-39 mnemonic seed phrase. -#: src/seedsigner/gui/screens/tools_screens.py +#: src/seedsigner/gui/screens/tools_screens.py:172 msgid "Build Final Word" msgstr "" #. Number of BIP-39 seed words, and the entropy -- in bits, contained within. -#: src/seedsigner/gui/screens/tools_screens.py +#: src/seedsigner/gui/screens/tools_screens.py:179 msgid "" "The {}th word is built from {} more entropy bits plus auto-calculated " "checksum." msgstr "" #. current coin-flip number vs total flips (e.g. flip 3 of 4) -#: src/seedsigner/gui/screens/tools_screens.py +#: src/seedsigner/gui/screens/tools_screens.py:190 +#: src/seedsigner/gui/screens/tools_screens.py:215 msgid "Coin Flip {}/{}" msgstr "" #. How we call the "front" side result during a coin toss. -#: src/seedsigner/gui/screens/tools_screens.py +#: src/seedsigner/gui/screens/tools_screens.py:203 msgid "Heads = 1" msgstr "" #. How we call the "back" side result during a coin toss. -#: src/seedsigner/gui/screens/tools_screens.py +#: src/seedsigner/gui/screens/tools_screens.py:208 msgid "Tails = 0" msgstr "" #. A labeled presentation of a user-supplied value -#: src/seedsigner/gui/screens/tools_screens.py +#: src/seedsigner/gui/screens/tools_screens.py:258 msgid "Your input: \"{}\"" msgstr "" #. A function of "x" to be used for detecting errors in "x" -#: src/seedsigner/gui/screens/tools_screens.py +#: src/seedsigner/gui/screens/tools_screens.py:294 msgid "Checksum" msgstr "" #. labeled presentation of the last word in a BIP-39 mnemonic seed phrase. -#: src/seedsigner/gui/screens/tools_screens.py +#: src/seedsigner/gui/screens/tools_screens.py:331 msgid "Final Word: \"{}\"" msgstr "" #. a label for the last word of a 12-word BIP-39 mnemonic seed phrase -#: src/seedsigner/gui/screens/tools_screens.py +#: src/seedsigner/gui/screens/tools_screens.py:374 msgid "12th Word" msgstr "" #. a label for the last word of a 24-word BIP-39 mnemonic seed phrase -#: src/seedsigner/gui/screens/tools_screens.py +#: src/seedsigner/gui/screens/tools_screens.py:377 msgid "24th Word" msgstr "" #. a label for the tool to explore public addresses for this seed. -#: src/seedsigner/gui/screens/tools_screens.py -#: src/seedsigner/views/seed_views.py src/seedsigner/views/tools_views.py +#: src/seedsigner/gui/screens/tools_screens.py:410 +#: src/seedsigner/views/seed_views.py:489 +#: src/seedsigner/views/seed_views.py:676 +#: src/seedsigner/views/seed_views.py:1942 +#: src/seedsigner/views/tools_views.py:39 +#: src/seedsigner/views/tools_views.py:474 msgid "Address Explorer" msgstr "" #. a label for a BIP-380-ish Output Descriptor -#: src/seedsigner/gui/screens/tools_screens.py +#: src/seedsigner/gui/screens/tools_screens.py:447 msgid "Wallet descriptor" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:14 msgid "Enabled" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:15 +#: src/seedsigner/models/settings_definition.py:18 +#: src/seedsigner/models/settings_definition.py:23 msgid "Disabled" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:21 +#: src/seedsigner/models/settings_definition.py:29 msgid "Prompt" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:22 +#: src/seedsigner/models/settings_definition.py:26 +#: src/seedsigner/models/settings_definition.py:32 msgid "Required" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:90 msgid "0°" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:91 msgid "90°" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:92 msgid "180°" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:93 msgid "270°" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:101 msgid "Low" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:102 msgid "Medium" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:103 msgid "High" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:111 msgid "Mainnet" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:112 msgid "Testnet" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:113 msgid "Regtest" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:125 msgid "Store Settings on SD card" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:126 msgid "Insert SD card to enable" msgstr "" -#: src/seedsigner/models/settings_definition.py -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/models/settings_definition.py:131 +#: src/seedsigner/views/seed_views.py:633 msgid "Single Sig" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:141 msgid "Native Segwit" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:142 msgid "Nested Segwit (legacy)" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:143 msgid "Taproot" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:144 msgid "Custom Derivation" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:358 msgid "Language" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:368 msgid "Mnemonic language" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:377 msgid "Persistent settings" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:384 msgid "Coordinator software" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:397 msgid "Denomination display" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:406 msgid "Bitcoin network" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:414 msgid "QR code density" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:422 msgid "Xpub export" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:429 msgid "Sig types" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:438 msgid "Script types" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:446 msgid "Show xpub details" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:452 msgid "BIP-39 passphrase" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:461 msgid "Camera rotation" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:469 msgid "Compact SeedQR" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:476 msgid "BIP-85 child seeds" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:482 msgid "Message signing" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:489 msgid "Show privacy warnings" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:496 msgid "Show dire warnings" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:502 msgid "Show QR brightness tips" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:509 msgid "Show partner logos" msgstr "" -#: src/seedsigner/models/settings_definition.py +#: src/seedsigner/models/settings_definition.py:525 msgid "QR background color" msgstr "" -#: src/seedsigner/views/psbt_views.py src/seedsigner/views/seed_views.py -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/psbt_views.py:32 src/seedsigner/views/seed_views.py:91 +#: src/seedsigner/views/tools_views.py:462 msgid "Scan a seed" msgstr "" -#: src/seedsigner/views/psbt_views.py src/seedsigner/views/seed_views.py -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/psbt_views.py:33 src/seedsigner/views/seed_views.py:92 +#: src/seedsigner/views/seed_views.py:174 +#: src/seedsigner/views/tools_views.py:464 msgid "Enter 12-word seed" msgstr "" -#: src/seedsigner/views/psbt_views.py src/seedsigner/views/seed_views.py -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/psbt_views.py:34 src/seedsigner/views/seed_views.py:93 +#: src/seedsigner/views/seed_views.py:175 +#: src/seedsigner/views/tools_views.py:465 msgid "Enter 24-word seed" msgstr "" -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:56 msgid "Select Signer" msgstr "" -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:96 msgid "Parsing PSBT..." msgstr "" -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:169 msgid "Unsupported Script Type!" msgstr "" -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:170 msgid "" "PSBT has unsupported input script type, please verify your change " "addresses." msgstr "" -#: src/seedsigner/views/psbt_views.py src/seedsigner/views/view.py +#: src/seedsigner/views/psbt_views.py:171 +#: src/seedsigner/views/psbt_views.py:192 src/seedsigner/views/view.py:431 msgid "Continue" msgstr "" #. User will receive no change back; the inputs to this transaction are fully #. spent -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:190 msgid "Full Spend!" msgstr "" -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:191 msgid "" "This PSBT spends its entire input value. No change is coming back to your" " wallet." @@ -738,546 +810,661 @@ msgstr "" #. Future-tense used to indicate that this transaction will send this amount, #. as opposed to "Send" on its own which could be misread as an instant command #. (e.g. "Send Now"). -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:259 msgid "Will Send" msgstr "" -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:265 msgid "Next Recipient" msgstr "" #. The amount you're receiving back from the transaction -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:343 msgid "Your Change" msgstr "" -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:344 msgid "Verify Multisig Change" msgstr "" -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:346 msgid "Self-Transfer" msgstr "" -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:347 msgid "Verify Multisig Addr" msgstr "" -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:366 msgid "Verifying Change..." msgstr "" -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:368 msgid "Verifying Self-Transfer..." msgstr "" #. Variable is either "change" or "self-transfer". -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:453 msgid "" "PSBT's {} address could not be verified with your multisig wallet " "descriptor." msgstr "" -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:455 msgid "Suspicious PSBT" msgstr "" #. Variable is either "change" or "self-transfer". -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:457 msgid "PSBT's {} address could not be generated from your seed." msgstr "" -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:461 msgid "Address Verification Failed" msgstr "" -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:463 msgid "Discard PSBT" msgstr "" -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:482 msgid "Approve PSBT" msgstr "" -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:535 msgid "Select Diff Seed" msgstr "" -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:543 msgid "PSBT Error" msgstr "" -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:545 msgid "Signing Failed" msgstr "" -#: src/seedsigner/views/psbt_views.py +#: src/seedsigner/views/psbt_views.py:546 msgid "Signing with this seed did not add a valid signature." msgstr "" +#: src/seedsigner/views/scan_views.py:25 +msgid "Scan a QR code" +msgstr "" + +#: src/seedsigner/views/scan_views.py:26 +msgid "QRCode not recognized or not yet supported." +msgstr "" + +#: src/seedsigner/views/scan_views.py:61 +msgid "Wrong QR Type" +msgstr "" + +#: src/seedsigner/views/scan_views.py:160 src/seedsigner/views/view.py:323 +msgid "Error" +msgstr "" + +#: src/seedsigner/views/scan_views.py:161 +msgid "Unknown QR Type" +msgstr "" + +#: src/seedsigner/views/scan_views.py:162 +msgid "QRCode is invalid or is a data format not yet supported." +msgstr "" + +#: src/seedsigner/views/scan_views.py:163 +#: src/seedsigner/views/seed_views.py:324 +#: src/seedsigner/views/seed_views.py:384 +#: src/seedsigner/views/seed_views.py:1001 +#: src/seedsigner/views/seed_views.py:1515 src/seedsigner/views/view.py:386 +msgid "Done" +msgstr "" + +#: src/seedsigner/views/scan_views.py:172 +#: src/seedsigner/views/seed_views.py:486 +msgid "Scan PSBT" +msgstr "" + +#: src/seedsigner/views/scan_views.py:173 +msgid "Expected a PSBT" +msgstr "" + +#: src/seedsigner/views/scan_views.py:182 +msgid "Scan SeedQR" +msgstr "" + +#: src/seedsigner/views/scan_views.py:183 +msgid "Expected a SeedQR" +msgstr "" + +#: src/seedsigner/views/scan_views.py:192 +msgid "Scan descriptor" +msgstr "" + +#: src/seedsigner/views/scan_views.py:193 +msgid "Expected a wallet descriptor QR" +msgstr "" + +#: src/seedsigner/views/scan_views.py:202 +msgid "Scan address QR" +msgstr "" + +#: src/seedsigner/views/scan_views.py:203 +msgid "Expected an address QR" +msgstr "" + #. This is on the opening splash screen, displayed above the HRF logo -#: src/seedsigner/views/screensaver.py +#: src/seedsigner/views/screensaver.py:74 msgid "With support from:" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:52 msgid "Load a seed" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:56 msgid "In-Memory Seeds" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:99 msgid "Load the seed to verify" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:101 msgid "Select seed to verify" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:106 msgid "Load the seed to sign with" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:108 msgid "Select seed to sign with" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:173 msgid "Scan a SeedQR" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:176 msgid "Create a seed" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:185 msgid "Load A Seed" msgstr "" #. Inserts the word number (e.g. "Seed Word #6") -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:223 msgid "Seed Word #{}" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:279 msgid "Review & Edit" msgstr "" -#: src/seedsigner/views/seed_views.py src/seedsigner/views/tools_views.py +#: src/seedsigner/views/seed_views.py:280 +#: src/seedsigner/views/seed_views.py:431 +#: src/seedsigner/views/tools_views.py:428 msgid "Discard" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:284 msgid "Invalid Mnemonic!" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:286 msgid "Checksum failure; not a valid seed phrase." msgstr "" -#: src/seedsigner/views/seed_views.py src/seedsigner/views/view.py -msgid "Done" -msgstr "" - -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:383 msgid "Edit passphrase" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:430 msgid "Keep Seed" msgstr "" -#: src/seedsigner/views/seed_views.py -msgid "Discard Seed?" -msgstr "" - -#: src/seedsigner/views/seed_views.py +#. Inserts the seed fingerprint +#: src/seedsigner/views/seed_views.py:437 msgid "Wipe seed {} from the device?" msgstr "" -#: src/seedsigner/views/seed_views.py -msgid "Scan PSBT" +#: src/seedsigner/views/seed_views.py:440 +msgid "Discard Seed?" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:487 +#: src/seedsigner/views/seed_views.py:1941 msgid "Verify Addr" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:491 msgid "BIP-85 Child Seed" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:492 msgid "Discard Seed" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:594 msgid "View Seed Words" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:595 msgid "Export as SeedQR" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:815 msgid "Xpub can be used to view all future transactions." msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:860 msgid "Generating xpub..." msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:975 msgid "You must keep your seed words private & away from all online devices." msgstr "" -#: src/seedsigner/views/seed_views.py +#. Inserts the child index (e.g. "Child #0") +#: src/seedsigner/views/seed_views.py:1009 msgid "Child #{}" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1012 msgid "Seed Words" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1074 msgid "12 Words" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1075 msgid "24 Words" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1080 msgid "BIP-85 Num Words" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1142 msgid "BIP-85 Index Error" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1144 msgid "Invalid Child Index" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1145 msgid "BIP-85 Child Index must be between 0 and 2^31-1." msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1146 +#: src/seedsigner/views/seed_views.py:1280 msgid "Try Again" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1171 msgid "Verify" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1172 msgid "Skip" msgstr "" -#: src/seedsigner/views/seed_views.py +#. Inserts the word number (e.g. "Verify Word #1") +#: src/seedsigner/views/seed_views.py:1229 msgid "Verify Word #{}" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1279 msgid "Review Seed Words" msgstr "" -#: src/seedsigner/views/seed_views.py -msgid "Verification Error" -msgstr "" - -#: src/seedsigner/views/seed_views.py -msgid "Wrong Word!" -msgstr "" - -#: src/seedsigner/views/seed_views.py +#. Inserts the word number and the word (e.g. "Word #1 is not "apple"!") +#: src/seedsigner/views/seed_views.py:1284 msgid "Word #{} is not \"{}\"!" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1286 +msgid "Verification Error" +msgstr "" + +#: src/seedsigner/views/seed_views.py:1288 +msgid "Wrong Word!" +msgstr "" + +#: src/seedsigner/views/seed_views.py:1319 msgid "Backup Verified" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1322 msgid "All mnemonic backup words were successfully verified!" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1345 msgid "Standard: 25x25" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1346 msgid "Compact: 21x21" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1350 msgid "Standard: 29x29" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1351 msgid "Compact: 25x25" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1372 msgid "SeedQR Format" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1421 msgid "SeedQR is your private key!" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1422 msgid "Never photograph or scan it into a device that connects to the internet." msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1514 +#: src/seedsigner/views/seed_views.py:1558 +#: src/seedsigner/views/seed_views.py:1569 +#: src/seedsigner/views/seed_views.py:1581 msgid "Confirm SeedQR" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1519 msgid "Confirm SeedQR?" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1549 msgid "Scan your SeedQR" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1559 +#: src/seedsigner/views/seed_views.py:1582 msgid "Error!" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1560 msgid "Your transcribed SeedQR does not match your original seed!" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1562 +#: src/seedsigner/views/seed_views.py:1585 msgid "Review SeedQR" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1571 msgid "Your transcribed SeedQR successfully scanned and yielded the same seed." msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1583 msgid "Your transcribed SeedQR could not be read!" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1655 msgid "Sig type can't be auto-detected from this address. Please specify:" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1705 msgid "Can't validate a single sig addr without specifying a seed" msgstr "" #. Option when scanning for a matching address; skips ten addresses ahead -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1751 msgid "Skip 10" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1752 +#: src/seedsigner/views/seed_views.py:1909 msgid "Cancel" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1878 msgid "multisig" msgstr "" -#: src/seedsigner/views/seed_views.py +#. Inserts the seed fingerprint +#: src/seedsigner/views/seed_views.py:1881 msgid "seed {}" msgstr "" -#: src/seedsigner/views/seed_views.py +#. Used in a sentence describing the address type (change or receive) +#: src/seedsigner/views/seed_views.py:1887 +msgid "receive" +msgstr "" + +#. Address verification success message (e.g. "bc1qabc = seed 12345678's +#. receive address #0.") +#: src/seedsigner/views/seed_views.py:1890 +msgid "{} = {}'s {} address #{}." +msgstr "" + +#: src/seedsigner/views/seed_views.py:1897 msgid "Address Verified" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1908 msgid "Scan Descriptor" msgstr "" -#: src/seedsigner/views/seed_views.py +#: src/seedsigner/views/seed_views.py:1940 msgid "Return to PSBT" msgstr "" -#: src/seedsigner/views/settings_views.py +#: src/seedsigner/views/seed_views.py:2005 +#: src/seedsigner/views/seed_views.py:2092 +msgid "Signing messages for custom derivation paths not supported" +msgstr "" + +#. Inserts mainnet/testnet/regtest and derivation path +#: src/seedsigner/views/seed_views.py:2011 +#: src/seedsigner/views/seed_views.py:2100 +msgid "Current network setting ({}) doesn't match {}" +msgstr "" + +#: src/seedsigner/views/settings_views.py:32 msgid "I/O test" msgstr "" -#: src/seedsigner/views/settings_views.py +#: src/seedsigner/views/settings_views.py:51 +#: src/seedsigner/views/settings_views.py:58 msgid "Advanced" msgstr "" -#: src/seedsigner/views/settings_views.py +#: src/seedsigner/views/settings_views.py:66 msgid "Dev Options" msgstr "" -#: src/seedsigner/views/settings_views.py +#: src/seedsigner/views/settings_views.py:209 msgid "Persistent Settings enabled. Settings saved to SD card." msgstr "" -#: src/seedsigner/views/settings_views.py +#: src/seedsigner/views/settings_views.py:211 msgid "Settings updated in temporary memory" msgstr "" -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:36 +#: src/seedsigner/views/tools_views.py:37 msgid "New seed" msgstr "" -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:38 msgid "Calc 12th/24th word" msgstr "" -#: src/seedsigner/views/tools_views.py src/seedsigner/views/view.py +#: src/seedsigner/views/tools_views.py:45 src/seedsigner/views/view.py:193 msgid "Tools" msgstr "" -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:125 +#: src/seedsigner/views/tools_views.py:252 msgid "12 words" msgstr "" -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:126 +#: src/seedsigner/views/tools_views.py:253 msgid "24 words" msgstr "" -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:130 msgid "Mnemonic Length?" msgstr "" -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:197 msgid "12 words (50 rolls)" msgstr "" -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:198 msgid "24 words (99 rolls)" msgstr "" -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:202 +#: src/seedsigner/views/tools_views.py:259 msgid "Mnemonic Length" msgstr "" #. Label to gather entropy through coin tosses -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:292 msgid "Coin flip entropy" msgstr "" #. Label to gather entropy through user specified BIP-39 word -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:294 msgid "Word selection entropy" msgstr "" #. Label to allow user to default entropy as all-zeros -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:296 msgid "Finalize with zeros" msgstr "" #. label to calculate the last word of a BIP-39 mnemonic seed phrase -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:405 msgid "Final Word Calc" msgstr "" -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:427 msgid "Load seed" msgstr "" -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:463 msgid "Scan wallet descriptor" msgstr "" #. label for addresses where others send us incoming payments -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:570 msgid "Receive Addresses" msgstr "" #. label for addresses that collect the change from our own outgoing payments -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:572 msgid "Change Addresses" msgstr "" #. a status message that our payment addresses are being calculated -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:637 msgid "Calculating addrs..." msgstr "" -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:653 +msgid "Custom Derivation address explorer not yet implemented" +msgstr "" + +#: src/seedsigner/views/tools_views.py:664 +msgid "Single sig descriptors not yet supported" +msgstr "" + +#. Insert the number of addrs displayed per screen (e.g. "Next 10") +#: src/seedsigner/views/tools_views.py:683 msgid "Next {}" msgstr "" -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:687 msgid "Receive Addrs" msgstr "" -#: src/seedsigner/views/tools_views.py +#: src/seedsigner/views/tools_views.py:687 msgid "Change Addrs" msgstr "" -#: src/seedsigner/views/view.py +#: src/seedsigner/views/view.py:191 msgid "Scan" msgstr "" -#: src/seedsigner/views/view.py +#: src/seedsigner/views/view.py:192 msgid "Seeds" msgstr "" -#: src/seedsigner/views/view.py +#: src/seedsigner/views/view.py:229 msgid "Restart" msgstr "" -#: src/seedsigner/views/view.py +#: src/seedsigner/views/view.py:230 msgid "Power Off" msgstr "" -#: src/seedsigner/views/view.py +#: src/seedsigner/views/view.py:234 msgid "Reset / Power" msgstr "" -#: src/seedsigner/views/view.py +#: src/seedsigner/views/view.py:302 msgid "Work In Progress" msgstr "" -#: src/seedsigner/views/view.py +#: src/seedsigner/views/view.py:303 msgid "Not Yet Implemented" msgstr "" -#: src/seedsigner/views/view.py +#: src/seedsigner/views/view.py:304 msgid "This is still on our to-do list!" msgstr "" -#: src/seedsigner/views/view.py +#: src/seedsigner/views/view.py:305 msgid "Back to Main Menu" msgstr "" -#: src/seedsigner/views/view.py -msgid "Error" -msgstr "" - -#: src/seedsigner/views/view.py +#: src/seedsigner/views/view.py:347 msgid "Network Mismatch" msgstr "" -#: src/seedsigner/views/view.py +#: src/seedsigner/views/view.py:348 msgid "Change Setting" msgstr "" -#: src/seedsigner/views/view.py +#. Inserts mainnet/testnet/regtest +#: src/seedsigner/views/view.py:351 +msgid "Current network setting ({}) doesn't match current action." +msgstr "" + +#: src/seedsigner/views/view.py:369 msgid "System Error" msgstr "" -#: src/seedsigner/views/view.py +#: src/seedsigner/views/view.py:385 msgid "Update Setting" msgstr "" -#: src/seedsigner/views/view.py +#. Inserts the name of a settings option (e.g. "Persistent Settings" is +#. currently...) +#: src/seedsigner/views/view.py:390 +msgid "\"{}\" is currently disabled in Settings." +msgstr "" + +#: src/seedsigner/views/view.py:399 msgid "Option Disabled" msgstr "" -#: src/seedsigner/views/view.py +#: src/seedsigner/views/view.py:426 msgid "Security Tip" msgstr "" -#: src/seedsigner/views/view.py +#: src/seedsigner/views/view.py:429 msgid "" "For maximum security,\n" "remove the MicroSD card\n" diff --git a/babel/requirements-babel.txt b/babel/requirements-babel.txt new file mode 100644 index 00000000..b83c7a02 --- /dev/null +++ b/babel/requirements-babel.txt @@ -0,0 +1 @@ +Babel==2.16.0 diff --git a/requirements.txt b/requirements.txt index c3304dac..65c471ef 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ -Babel==2.16.0 embit==0.7.0 numpy==1.25.2 Pillow==9.4.0 diff --git a/setup.cfg b/setup.cfg index 825ad5f0..c7405f57 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,7 +1,7 @@ [extract_messages] add_comments = TRANSLATOR_NOTE: strip_comments = yes -add_location = file +add_location = full input_dirs = src output_file = babel/messages.pot diff --git a/src/seedsigner/gui/components.py b/src/seedsigner/gui/components.py index e6f41f9f..cd4eafe5 100644 --- a/src/seedsigner/gui/components.py +++ b/src/seedsigner/gui/components.py @@ -866,11 +866,14 @@ class BtcAmount(BaseComponent): denomination = Settings.get_instance().get_value(SettingsConstants.SETTING__BTC_DENOMINATION) network = Settings.get_instance().get_value(SettingsConstants.SETTING__NETWORK) - btc_unit = "tBtc" - sats_unit = "tSats" + # TRANSLATOR_NOTE: Testnet bitcoin + btc_unit = _("tBtc") + + # TRANSLATOR_NOTE: Testnet sats + sats_unit = _("tSats") if network == SettingsConstants.MAINNET: - btc_unit = "btc" - sats_unit = "sats" + btc_unit = _("btc") + sats_unit = _("sats") btc_color = GUIConstants.ACCENT_COLOR elif network == SettingsConstants.TESTNET: diff --git a/src/seedsigner/gui/screens/scan_screens.py b/src/seedsigner/gui/screens/scan_screens.py index d2613004..373819d9 100644 --- a/src/seedsigner/gui/screens/scan_screens.py +++ b/src/seedsigner/gui/screens/scan_screens.py @@ -99,7 +99,7 @@ class ScanScreen(BaseScreen): cur_time = time.time() cur_fps = num_frames / (cur_time - start_time) if self.decoder and self.decoder.get_percent_complete() > 0 and self.decoder.is_psbt: - scan_text = str(self.decoder.get_percent_complete()) + "% Complete" + scan_text = _("{}% Complete").format(str(self.decoder.get_percent_complete())) if show_framerate: scan_text += f" {cur_fps:0.2f} | {self.decoder_fps}" else: diff --git a/src/seedsigner/gui/screens/screen.py b/src/seedsigner/gui/screens/screen.py index f39e90f6..53e849cd 100644 --- a/src/seedsigner/gui/screens/screen.py +++ b/src/seedsigner/gui/screens/screen.py @@ -724,10 +724,12 @@ class QRDisplayScreen(BaseScreen): ) chevron_down_icon.render() + # TRANSLATOR_NOTE: Increase QR code screen brightness + text = _("Brighter") TextArea( image_draw=img_draw, canvas=rectangle, - text="Brighter", + text=text, font_size=GUIConstants.get_body_font_size(), font_name=GUIConstants.get_button_font_name(), background_color=(0, 0, 0, overlay_opacity), @@ -740,10 +742,12 @@ class QRDisplayScreen(BaseScreen): allow_text_overflow=False ).render() + # TRANSLATOR_NOTE: Decrease QR code screen brightness + text = _("Darker") TextArea( image_draw=img_draw, canvas=rectangle, - text="Darker", + text=text, font_size=GUIConstants.get_body_font_size(), font_name=GUIConstants.get_button_font_name(), background_color=(0, 0, 0, overlay_opacity), @@ -1037,8 +1041,9 @@ class PowerOffNotRequiredScreen(BaseTopNavScreen): self.show_back_button = True super().__post_init__() + text = _("It is safe to disconnect power at any time.") self.components.append(TextArea( - text="It is safe to disconnect power at any time.", + text=text, screen_y=self.top_nav.height, height=self.canvas_height - self.top_nav.height, )) diff --git a/src/seedsigner/views/psbt_views.py b/src/seedsigner/views/psbt_views.py index 80251901..56aa6be9 100644 --- a/src/seedsigner/views/psbt_views.py +++ b/src/seedsigner/views/psbt_views.py @@ -16,6 +16,7 @@ from seedsigner.views.view import BackStackView, MainMenuView, NotYetImplemented class PSBTSelectSeedView(View): + # TODO: Class-level attrs vs dynamic gettext calls SCAN_SEED = ("Scan a seed", SeedSignerIconConstants.QRCODE) TYPE_12WORD = ("Enter 12-word seed", FontAwesomeIconConstants.KEYBOARD) TYPE_24WORD = ("Enter 24-word seed", FontAwesomeIconConstants.KEYBOARD) diff --git a/src/seedsigner/views/scan_views.py b/src/seedsigner/views/scan_views.py index ef6476f2..24000665 100644 --- a/src/seedsigner/views/scan_views.py +++ b/src/seedsigner/views/scan_views.py @@ -1,5 +1,7 @@ import re +from gettext import gettext as _ + from embit.descriptor import Descriptor from seedsigner.gui.screens.screen import RET_CODE__BACK_BUTTON @@ -20,8 +22,8 @@ class ScanView(View): dedicated errors when an unexpected QR type is scanned (e.g. Scan PSBT was selected but a SeedQR was scanned). """ - instructions_text = "Scan a QR code" - invalid_qr_type_message = "QRCode not recognized or not yet supported." + instructions_text = _("Scan a QR code") + invalid_qr_type_message = _("QRCode not recognized or not yet supported.") def __init__(self): @@ -56,7 +58,7 @@ class ScanView(View): # `seed__compactseedqr` as "seed: compactseedqr"). return Destination(ErrorView, view_args=dict( title="Error", - status_headline="Wrong QR Type", + status_headline=_("Wrong QR Type"), text=self.invalid_qr_type_message + f""", received "{self.decoder.qr_type.replace("__", ": ").replace("_", " ")}\" format""", button_text="Back", next_destination=Destination(BackStackView, skip_current_view=True), @@ -155,10 +157,10 @@ class ScanView(View): # start everything over. self.controller.resume_main_flow = None return Destination(ErrorView, view_args=dict( - title="Error", - status_headline="Unknown QR Type", - text="QRCode is invalid or is a data format not yet supported.", - button_text="Done", + title=_("Error"), + status_headline=_("Unknown QR Type"), + text=_("QRCode is invalid or is a data format not yet supported."), + button_text=_("Done"), next_destination=Destination(MainMenuView, clear_history=True), )) @@ -167,8 +169,8 @@ class ScanView(View): class ScanPSBTView(ScanView): - instructions_text = "Scan PSBT" - invalid_qr_type_message = "Expected a PSBT" + instructions_text = _("Scan PSBT") + invalid_qr_type_message = _("Expected a PSBT") @property def is_valid_qr_type(self): @@ -177,8 +179,8 @@ class ScanPSBTView(ScanView): class ScanSeedQRView(ScanView): - instructions_text = "Scan SeedQR" - invalid_qr_type_message = f"Expected a SeedQR" + instructions_text = _("Scan SeedQR") + invalid_qr_type_message = _("Expected a SeedQR") @property def is_valid_qr_type(self): @@ -187,8 +189,8 @@ class ScanSeedQRView(ScanView): class ScanWalletDescriptorView(ScanView): - instructions_text = "Scan descriptor" - invalid_qr_type_message = "Expected a wallet descriptor QR" + instructions_text = _("Scan descriptor") + invalid_qr_type_message = _("Expected a wallet descriptor QR") @property def is_valid_qr_type(self): @@ -197,8 +199,8 @@ class ScanWalletDescriptorView(ScanView): class ScanAddressView(ScanView): - instructions_text = "Scan address QR" - invalid_qr_type_message = "Expected an address QR" + instructions_text = _("Scan address QR") + invalid_qr_type_message = _("Expected an address QR") @property def is_valid_qr_type(self): diff --git a/src/seedsigner/views/seed_views.py b/src/seedsigner/views/seed_views.py index bbbfb168..d85f41b9 100644 --- a/src/seedsigner/views/seed_views.py +++ b/src/seedsigner/views/seed_views.py @@ -94,7 +94,7 @@ class SeedSelectSeedView(View): seeds = self.controller.storage.seeds if self.flow == Controller.FLOW__VERIFY_SINGLESIG_ADDR: - title = "Verify Address" + title = _("Verify Address") if not seeds: text = _("Load the seed to verify") else: @@ -433,11 +433,13 @@ class SeedDiscardView(View): button_data = [self.KEEP, self.DISCARD] fingerprint = self.seed.get_fingerprint(self.settings.get_value(SettingsConstants.SETTING__NETWORK)) + # TRANSLATOR_NOTE: Inserts the seed fingerprint + text = _("Wipe seed {} from the device?").format(fingerprint) selected_menu_num = self.run_screen( WarningScreen, title=_("Discard Seed?"), status_headline=None, - text=_("Wipe seed {} from the device?").format(fingerprint), + text=text, show_back_button=False, button_data=button_data, ) @@ -1003,6 +1005,7 @@ class SeedWordsView(View): if self.bip85_data is not None: mnemonic = self.seed.get_bip85_child_mnemonic(self.bip85_data["child_index"], self.bip85_data["num_words"]).split() + # TRANSLATOR_NOTE: Inserts the child index (e.g. "Child #0") title = _("Child #{}").format(self.bip85_data["child_index"]) else: mnemonic = self.seed.mnemonic_display_list @@ -1222,8 +1225,10 @@ class SeedWordsBackupTestView(View): button_data = [real_word, fake_word1, fake_word2, fake_word3] random.shuffle(button_data) + # TRANSLATOR_NOTE: Inserts the word number (e.g. "Verify Word #1") + title = _("Verify Word #{}").format(self.cur_index + 1) selected_menu_num = ButtonListScreen( - title=_("Verify Word #{}").format(self.cur_index + 1), + title=title, show_back_button=False, button_data=button_data, is_bottom_list=True, @@ -1275,12 +1280,18 @@ class SeedWordsBackupTestMistakeView(View): RETRY = _("Try Again") button_data = [REVIEW, RETRY] + # TRANSLATOR_NOTE: Inserts the word number and the word (e.g. "Word #1 is not "apple"!") + text = _("Word #{} is not \"{}\"!").format(self.cur_index + 1, self.wrong_word) + + # TRANSLATOR_NOTE: User selected the wrong word during the mnemonic backup test (e.g. incorrectly said the 5th word was "zoo") + status_headline = _("Wrong Word!") + selected_menu_num = DireWarningScreen( title=_("Verification Error"), show_back_button=False, - status_headline=_("Wrong Word!"), - text=_("Word #{} is not \"{}\"!").format(self.cur_index + 1, self.wrong_word), + status_headline=status_headline, button_data=button_data, + text=text, ).display() if button_data[selected_menu_num] == REVIEW: @@ -1870,11 +1881,25 @@ class AddressVerificationSuccessView(View): if sig_type == SettingsConstants.MULTISIG: source = _("multisig") else: + # TRANSLATOR_NOTE: Inserts the seed fingerprint source = _("seed {}").format(self.seed.get_fingerprint()) + # TRANSLATOR_NOTE: Used in a sentence describing the address type (change or receive) + change_text = _("change") + + # TRANSLATOR_NOTE: Used in a sentence describing the address type (change or receive) + receive_text = _("receive") + + # TRANSLATOR_NOTE: Address verification success message (e.g. "bc1qabc = seed 12345678's receive address #0.") + text = _("{} = {}'s {} address #{}.""").format( + address[:7], + source, + change_text if verified_index_is_change else receive_text, + verified_index + ) LargeIconStatusScreen( status_headline=_("Address Verified"), - text=f"""{address[:7]} = {source}'s {"change" if verified_index_is_change else "receive"} address #{verified_index}.""", + text=text, show_back_button=False, ).display() @@ -1981,12 +2006,17 @@ class SeedSignMessageStartView(View): # calculate the actual receive address addr_format = embit_utils.parse_derivation_path(derivation_path) if not addr_format["clean_match"]: - raise NotYetImplementedView("Signing messages for custom derivation paths not supported") + raise NotYetImplementedView(_("Signing messages for custom derivation paths not supported")) # Note: addr_format["network"] can be MAINNET or [TESTNET, REGTEST] if self.settings.get_value(SettingsConstants.SETTING__NETWORK) not in addr_format["network"]: from seedsigner.views.view import NetworkMismatchErrorView - self.set_redirect(Destination(NetworkMismatchErrorView, view_args=dict(text=f"Current network setting ({self.settings.get_value_display_name(SettingsConstants.SETTING__NETWORK)}) doesn't match {self.derivation_path}"))) + # TRANSLATOR_NOTE: Inserts mainnet/testnet/regtest and derivation path + text = _("Current network setting ({}) doesn't match {}").format( + self.settings.get_value_display_name(SettingsConstants.SETTING__NETWORK), + self.derivation_path, + ) + self.set_redirect(Destination(NetworkMismatchErrorView, view_args=dict(text=text))) # cleanup. Note: We could leave this in place so the user can resume the # flow, but for now we avoid complications and keep things simple. @@ -2063,7 +2093,7 @@ class SeedSignMessageConfirmAddressView(View): seed = self.controller.storage.seeds[seed_num] addr_format = embit_utils.parse_derivation_path(self.derivation_path) if not addr_format["clean_match"] or addr_format["script_type"] == SettingsConstants.CUSTOM_DERIVATION: - raise Exception("Signing messages for custom derivation paths not supported") + raise Exception(_("Signing messages for custom derivation paths not supported")) if addr_format["network"] != SettingsConstants.MAINNET: # We're in either Testnet or Regtest or...? @@ -2071,7 +2101,11 @@ class SeedSignMessageConfirmAddressView(View): addr_format["network"] = self.settings.get_value(SettingsConstants.SETTING__NETWORK) else: from seedsigner.views.view import NetworkMismatchErrorView - self.set_redirect(Destination(NetworkMismatchErrorView, view_args=dict(text=f"Current network setting ({self.settings.get_value_display_name(SettingsConstants.SETTING__NETWORK)}) doesn't match {self.derivation_path}"))) + text = _("Current network setting ({}) doesn't match {}").format( + self.settings.get_value_display_name(SettingsConstants.SETTING__NETWORK), + self.derivation_path, + ) + self.set_redirect(Destination(NetworkMismatchErrorView, view_args=dict(text=text))) # cleanup. Note: We could leave this in place so the user can resume the # flow, but for now we avoid complications and keep things simple. diff --git a/src/seedsigner/views/tools_views.py b/src/seedsigner/views/tools_views.py index 69a90600..5cd6cdf3 100644 --- a/src/seedsigner/views/tools_views.py +++ b/src/seedsigner/views/tools_views.py @@ -650,8 +650,8 @@ class ToolsAddressExplorerAddressListView(View): data[addr_storage_key].append(address) else: # TODO: Custom derivation path - raise Exception("Custom Derivation address explorer not yet implemented") - + raise Exception(_("Custom Derivation address explorer not yet implemented")) + elif "wallet_descriptor" in data: descriptor: Descriptor = data["wallet_descriptor"] if descriptor.is_basic_multisig: @@ -661,7 +661,7 @@ class ToolsAddressExplorerAddressListView(View): data[addr_storage_key].append(address) else: - raise Exception("Single sig descriptors not yet supported") + raise Exception(_("Single sig descriptors not yet supported")) finally: # Everything is set. Stop the loading screen self.loading_screen.stop() @@ -679,6 +679,7 @@ class ToolsAddressExplorerAddressListView(View): end_digits = -4 button_data.append(f"{cur_index}:{address[:8]}...{address[end_digits:]}") + # TRANSLATOR_NOTE: Insert the number of addrs displayed per screen (e.g. "Next 10") button_data.append((_("Next {}").format(addrs_per_screen), None, None, None, SeedSignerIconConstants.CHEVRON_RIGHT)) selected_menu_num = self.run_screen( diff --git a/src/seedsigner/views/view.py b/src/seedsigner/views/view.py index 2869baa2..9deb561f 100644 --- a/src/seedsigner/views/view.py +++ b/src/seedsigner/views/view.py @@ -347,7 +347,10 @@ class NetworkMismatchErrorView(ErrorView): self.title = _("Network Mismatch") self.button_text = _("Change Setting") if not self.text: - self.text = f"Current network setting ({self.settings.get_value_display_name(SettingsConstants.SETTING__NETWORK)}) doesn't match current action." + # TRANSLATOR_NOTE: Inserts mainnet/testnet/regtest + self.text = _("Current network setting ({}) doesn't match current action.").format( + self.settings.get_value_display_name(SettingsConstants.SETTING__NETWORK), + ) if not self.next_destination: from seedsigner.views.settings_views import SettingsEntryUpdateSelectionView @@ -382,7 +385,11 @@ class OptionDisabledView(View): self.UPDATE_SETTING = _("Update Setting") self.DONE = _("Done") self.settings_entry = SettingsDefinition.get_settings_entry(self.settings_attr) - self.error_msg = f"\"{self.settings_entry.display_name}\" is currently disabled in Settings." + + # TRANSLATOR_NOTE: Inserts the name of a settings option (e.g. "Persistent Settings" is currently...) + self.error_msg = _("\"{}\" is currently disabled in Settings.").format( + self.settings_entry.display_name, + ) def run(self):