diff --git a/babel/messages.pot b/babel/messages.pot index 8dbd041e..93f78dcc 100644 --- a/babel/messages.pot +++ b/babel/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-05-10 17:32-0500\n" +"POT-Creation-Date: 2022-05-17 19:36-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -42,7 +42,7 @@ msgid "Please wait about 30 seconds before disconnecting power." msgstr "" #: src/seedsigner/gui/screens/psbt_screens.py:29 -#: src/seedsigner/views/seed_views.py:352 +#: src/seedsigner/views/seed_views.py:385 msgid "Review PSBT" msgstr "" @@ -172,29 +172,29 @@ msgstr "" msgid "Settings imported successfully!" msgstr "" -#: src/seedsigner/gui/screens/screen.py:731 -#: src/seedsigner/views/seed_views.py:954 -#: src/seedsigner/views/seed_views.py:1201 +#: src/seedsigner/gui/screens/screen.py:734 +#: src/seedsigner/views/seed_views.py:986 +#: src/seedsigner/views/seed_views.py:1235 msgid "Success!" msgstr "" -#: src/seedsigner/gui/screens/screen.py:735 -#: src/seedsigner/views/seed_views.py:956 -#: src/seedsigner/views/seed_views.py:1204 -#: src/seedsigner/views/seed_views.py:1647 src/seedsigner/views/view.py:145 +#: src/seedsigner/gui/screens/screen.py:738 +#: src/seedsigner/views/seed_views.py:988 +#: src/seedsigner/views/seed_views.py:1238 +#: src/seedsigner/views/seed_views.py:1681 src/seedsigner/views/view.py:145 msgid "OK" msgstr "" -#: src/seedsigner/gui/screens/screen.py:852 +#: src/seedsigner/gui/screens/screen.py:853 #: src/seedsigner/views/psbt_views.py:430 msgid "Caution" msgstr "" -#: src/seedsigner/gui/screens/screen.py:855 +#: src/seedsigner/gui/screens/screen.py:856 msgid "I Understand" msgstr "" -#: src/seedsigner/gui/screens/screen.py:867 +#: src/seedsigner/gui/screens/screen.py:868 msgid "Classified Info!" msgstr "" @@ -207,134 +207,145 @@ msgstr "" msgid "fingerprint" msgstr "" +#: src/seedsigner/gui/screens/seed_screens.py:455 +#: src/seedsigner/views/seed_views.py:388 +msgid "Backup Seed" +msgstr "" + +#. Additional explainer for the two seed backup options (mnemonic phrase and +#. SeedQR). +#: src/seedsigner/gui/screens/seed_screens.py:462 +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:461 +#: src/seedsigner/gui/screens/seed_screens.py:479 msgid "Seed Words: {}/{}" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py:541 +#: src/seedsigner/gui/screens/seed_screens.py:559 msgid "Verify Backup?" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py:547 +#: src/seedsigner/gui/screens/seed_screens.py:565 msgid "Optionally verify that your mnemonic backup is correct." msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py:556 +#: src/seedsigner/gui/screens/seed_screens.py:574 msgid "Derivation Path" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py:703 +#: src/seedsigner/gui/screens/seed_screens.py:721 msgid "Xpub Details" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py:709 -#: src/seedsigner/gui/screens/seed_screens.py:713 -#: src/seedsigner/views/seed_views.py:354 -#: src/seedsigner/views/seed_views.py:471 -#: src/seedsigner/views/seed_views.py:504 -#: src/seedsigner/views/seed_views.py:578 +#: src/seedsigner/gui/screens/seed_screens.py:727 +#: src/seedsigner/gui/screens/seed_screens.py:731 +#: src/seedsigner/views/seed_views.py:387 +#: src/seedsigner/views/seed_views.py:503 +#: src/seedsigner/views/seed_views.py:536 +#: src/seedsigner/views/seed_views.py:610 msgid "Export Xpub" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py:722 +#: src/seedsigner/gui/screens/seed_screens.py:740 msgid "Fingerprint" msgstr "" #. Short for "Derivation Path" -#: src/seedsigner/gui/screens/seed_screens.py:732 +#: src/seedsigner/gui/screens/seed_screens.py:750 msgid "Derivation" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py:741 +#: src/seedsigner/gui/screens/seed_screens.py:759 msgid "Xpub" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py:754 -#: src/seedsigner/views/seed_views.py:217 +#: src/seedsigner/gui/screens/seed_screens.py:772 +#: src/seedsigner/views/seed_views.py:230 msgid "Add Passphrase" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py:1106 +#: src/seedsigner/gui/screens/seed_screens.py:1124 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:1115 -msgid "changes fingerprint" +#: src/seedsigner/gui/screens/seed_screens.py:1133 +msgid "changes seed:" msgstr "" #. Refers to the SeedQR type: Standard or Compact -#: src/seedsigner/gui/screens/seed_screens.py:1170 +#: src/seedsigner/gui/screens/seed_screens.py:1190 msgid "Standard" msgstr "" #. Briefly explains the Standard SeedQR data format -#: src/seedsigner/gui/screens/seed_screens.py:1172 +#: src/seedsigner/gui/screens/seed_screens.py:1192 msgid "BIP-39 wordlist indices" msgstr "" #. Refers to the SeedQR type: Standard or Compact -#: src/seedsigner/gui/screens/seed_screens.py:1180 +#: src/seedsigner/gui/screens/seed_screens.py:1200 msgid "Compact" msgstr "" #. Briefly explains the Compact SeedQR data format -#: src/seedsigner/gui/screens/seed_screens.py:1182 +#: src/seedsigner/gui/screens/seed_screens.py:1202 msgid "Raw entropy bits" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py:1196 +#: src/seedsigner/gui/screens/seed_screens.py:1216 msgid "Transcribe SeedQR" msgstr "" #. Refers to the QR code size: 21x21, 25x25, or 29x29 -#: src/seedsigner/gui/screens/seed_screens.py:1198 +#: src/seedsigner/gui/screens/seed_screens.py:1218 msgid "Begin {}x{}" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py:1275 +#: src/seedsigner/gui/screens/seed_screens.py:1295 msgid "click to exit" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py:1411 +#: src/seedsigner/gui/screens/seed_screens.py:1431 msgid "" "Optionally scan your transcribed SeedQR to confirm that it reads back " "correctly." msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py:1468 -#: src/seedsigner/views/seed_views.py:1284 -#: src/seedsigner/views/seed_views.py:1342 +#: src/seedsigner/gui/screens/seed_screens.py:1488 +#: src/seedsigner/views/seed_views.py:1318 +#: src/seedsigner/views/seed_views.py:1376 msgid "Verify Address" msgstr "" #. Inserts the nth address number (e.g. "Checking address 7") -#: src/seedsigner/gui/screens/seed_screens.py:1527 +#: src/seedsigner/gui/screens/seed_screens.py:1547 msgid "Checking address {}" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py:1544 +#: src/seedsigner/gui/screens/seed_screens.py:1564 msgid "Multisig Verification" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py:1549 +#: src/seedsigner/gui/screens/seed_screens.py:1569 msgid "" "Load your multisig wallet descriptor to verify your receive/self-transfer" " or change address." msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py:1562 +#: src/seedsigner/gui/screens/seed_screens.py:1582 msgid "Descriptor Loaded" msgstr "" #. Label for the multisig wallet's signing policy (e.g. 2-of-3) -#: src/seedsigner/gui/screens/seed_screens.py:1568 +#: src/seedsigner/gui/screens/seed_screens.py:1588 msgid "Policy" msgstr "" -#: src/seedsigner/gui/screens/seed_screens.py:1576 +#: src/seedsigner/gui/screens/seed_screens.py:1596 msgid "Signing Keys" msgstr "" @@ -485,84 +496,88 @@ msgid "Regtest" msgstr "" #: src/seedsigner/models/settings_definition.py:122 -#: src/seedsigner/views/seed_views.py:466 +#: src/seedsigner/views/seed_views.py:498 msgid "Single Sig" msgstr "" #: src/seedsigner/models/settings_definition.py:123 -#: src/seedsigner/views/seed_views.py:467 +#: src/seedsigner/views/seed_views.py:499 msgid "Multisig" msgstr "" -#: src/seedsigner/models/settings_definition.py:354 +#: src/seedsigner/models/settings_definition.py:355 msgid "Language" msgstr "" -#: src/seedsigner/models/settings_definition.py:362 +#: src/seedsigner/models/settings_definition.py:363 msgid "Mnemonic language" msgstr "" -#: src/seedsigner/models/settings_definition.py:370 +#: src/seedsigner/models/settings_definition.py:371 msgid "Persistent settings" msgstr "" -#: src/seedsigner/models/settings_definition.py:376 +#: src/seedsigner/models/settings_definition.py:377 msgid "Coordinator software" msgstr "" -#: src/seedsigner/models/settings_definition.py:383 +#: src/seedsigner/models/settings_definition.py:384 msgid "Denomination display" msgstr "" -#: src/seedsigner/models/settings_definition.py:392 +#: src/seedsigner/models/settings_definition.py:393 msgid "Bitcoin network" msgstr "" -#: src/seedsigner/models/settings_definition.py:400 +#: src/seedsigner/models/settings_definition.py:401 msgid "QR code density" msgstr "" -#: src/seedsigner/models/settings_definition.py:408 +#: src/seedsigner/models/settings_definition.py:409 msgid "Xpub export" msgstr "" -#: src/seedsigner/models/settings_definition.py:414 +#: src/seedsigner/models/settings_definition.py:415 msgid "Sig types" msgstr "" -#: src/seedsigner/models/settings_definition.py:422 +#: src/seedsigner/models/settings_definition.py:423 msgid "Script types" msgstr "" -#: src/seedsigner/models/settings_definition.py:430 +#: src/seedsigner/models/settings_definition.py:431 msgid "Show xpub details" msgstr "" -#: src/seedsigner/models/settings_definition.py:436 +#: src/seedsigner/models/settings_definition.py:437 msgid "BIP-39 passphrase" msgstr "" -#: src/seedsigner/models/settings_definition.py:444 +#: src/seedsigner/models/settings_definition.py:445 msgid "Camera rotation" msgstr "" -#: src/seedsigner/models/settings_definition.py:452 +#: src/seedsigner/models/settings_definition.py:453 msgid "Compact SeedQR" msgstr "" -#: src/seedsigner/models/settings_definition.py:458 +#: src/seedsigner/models/settings_definition.py:459 msgid "Show privacy warnings" msgstr "" -#: src/seedsigner/models/settings_definition.py:464 +#: src/seedsigner/models/settings_definition.py:465 msgid "Show dire warnings" msgstr "" -#: src/seedsigner/models/settings_definition.py:470 +#: src/seedsigner/models/settings_definition.py:471 +msgid "Show passphrase warning" +msgstr "" + +#: src/seedsigner/models/settings_definition.py:477 msgid "Show partner logos" msgstr "" -#: src/seedsigner/models/settings_definition.py:485 +#: src/seedsigner/models/settings_definition.py:492 msgid "QR background color" msgstr "" @@ -592,12 +607,12 @@ msgid "Reset / Power" msgstr "" #: src/seedsigner/views/psbt_views.py:36 -#: src/seedsigner/views/seed_views.py:1322 +#: src/seedsigner/views/seed_views.py:1356 msgid "Scan a seed" msgstr "" #: src/seedsigner/views/psbt_views.py:37 -#: src/seedsigner/views/seed_views.py:1323 +#: src/seedsigner/views/seed_views.py:1357 msgid "Enter 12/24 words" msgstr "" @@ -650,7 +665,7 @@ msgstr "" #. Short for "Next step" #: src/seedsigner/views/psbt_views.py:251 #: src/seedsigner/views/psbt_views.py:320 -#: src/seedsigner/views/seed_views.py:796 +#: src/seedsigner/views/seed_views.py:828 msgid "Next" msgstr "" @@ -768,7 +783,7 @@ msgid "Review & Edit" msgstr "" #: src/seedsigner/views/seed_views.py:188 -#: src/seedsigner/views/seed_views.py:310 +#: src/seedsigner/views/seed_views.py:343 #: src/seedsigner/views/tools_views.py:259 msgid "Discard" msgstr "" @@ -781,228 +796,230 @@ msgstr "" msgid "Checksum failure; not a valid seed phrase." msgstr "" -#: src/seedsigner/views/seed_views.py:216 -#: src/seedsigner/views/seed_views.py:268 -#: src/seedsigner/views/seed_views.py:797 -#: src/seedsigner/views/seed_views.py:1146 +#: src/seedsigner/views/seed_views.py:229 +#: src/seedsigner/views/seed_views.py:301 +#: src/seedsigner/views/seed_views.py:829 +#: src/seedsigner/views/seed_views.py:1180 msgid "Done" msgstr "" -#: src/seedsigner/views/seed_views.py:267 +#: src/seedsigner/views/seed_views.py:260 +msgid "" +"BIP-39 passphrase changes your seed, resulting in new xpubs, wallets, " +"etc.\n" +"Be sure you know what you're doing!" +msgstr "" + +#: src/seedsigner/views/seed_views.py:300 msgid "Edit passphrase" msgstr "" -#: src/seedsigner/views/seed_views.py:309 +#: src/seedsigner/views/seed_views.py:342 msgid "Keep Seed" msgstr "" -#: src/seedsigner/views/seed_views.py:315 +#: src/seedsigner/views/seed_views.py:348 msgid "Discard Seed?" msgstr "" -#: src/seedsigner/views/seed_views.py:317 +#: src/seedsigner/views/seed_views.py:350 msgid "Wipe seed {} from the device?" msgstr "" -#: src/seedsigner/views/seed_views.py:351 +#: src/seedsigner/views/seed_views.py:384 msgid "Scan PSBT" msgstr "" -#: src/seedsigner/views/seed_views.py:353 -#: src/seedsigner/views/seed_views.py:1646 +#: src/seedsigner/views/seed_views.py:386 +#: src/seedsigner/views/seed_views.py:1680 msgid "Verify Addr" msgstr "" -#: src/seedsigner/views/seed_views.py:355 -#: src/seedsigner/views/seed_views.py:436 -msgid "Backup Seed" -msgstr "" - -#: src/seedsigner/views/seed_views.py:356 +#: src/seedsigner/views/seed_views.py:389 msgid "Discard Seed" msgstr "" -#: src/seedsigner/views/seed_views.py:431 +#: src/seedsigner/views/seed_views.py:464 msgid "View Seed Words" msgstr "" -#: src/seedsigner/views/seed_views.py:432 +#: src/seedsigner/views/seed_views.py:465 msgid "Export as SeedQR" msgstr "" -#: src/seedsigner/views/seed_views.py:620 +#: src/seedsigner/views/seed_views.py:652 msgid "Privacy Leak!" msgstr "" -#: src/seedsigner/views/seed_views.py:621 +#: src/seedsigner/views/seed_views.py:653 msgid "Xpub can be used to view all future transactions." msgstr "" -#: src/seedsigner/views/seed_views.py:651 +#: src/seedsigner/views/seed_views.py:683 msgid "Generating xpub..." msgstr "" -#: src/seedsigner/views/seed_views.py:771 +#: src/seedsigner/views/seed_views.py:803 msgid "You must keep your seed words private & away from all online devices." msgstr "" -#: src/seedsigner/views/seed_views.py:836 +#: src/seedsigner/views/seed_views.py:868 msgid "Verify" msgstr "" -#: src/seedsigner/views/seed_views.py:837 +#: src/seedsigner/views/seed_views.py:869 msgid "Skip" msgstr "" -#: src/seedsigner/views/seed_views.py:886 +#: src/seedsigner/views/seed_views.py:918 msgid "Verify Word #{}" msgstr "" -#: src/seedsigner/views/seed_views.py:926 +#: src/seedsigner/views/seed_views.py:958 msgid "Review Seed Words" msgstr "" -#: src/seedsigner/views/seed_views.py:927 +#: src/seedsigner/views/seed_views.py:959 msgid "Try Again" msgstr "" -#: src/seedsigner/views/seed_views.py:931 +#: src/seedsigner/views/seed_views.py:963 msgid "Verification Error" msgstr "" -#: src/seedsigner/views/seed_views.py:933 +#: src/seedsigner/views/seed_views.py:965 msgid "Wrong Word!" msgstr "" -#: src/seedsigner/views/seed_views.py:934 +#: src/seedsigner/views/seed_views.py:966 msgid "Word #{} is not \"{}\"!" msgstr "" -#: src/seedsigner/views/seed_views.py:952 +#: src/seedsigner/views/seed_views.py:984 msgid "Backup Verified" msgstr "" -#: src/seedsigner/views/seed_views.py:955 +#: src/seedsigner/views/seed_views.py:987 msgid "All mnemonic backup words were successfully verified!" msgstr "" -#: src/seedsigner/views/seed_views.py:978 +#: src/seedsigner/views/seed_views.py:1010 msgid "Standard: 25x25" msgstr "" -#: src/seedsigner/views/seed_views.py:979 +#: src/seedsigner/views/seed_views.py:1011 msgid "Compact: 21x21" msgstr "" -#: src/seedsigner/views/seed_views.py:983 +#: src/seedsigner/views/seed_views.py:1015 msgid "Standard: 29x29" msgstr "" -#: src/seedsigner/views/seed_views.py:984 +#: src/seedsigner/views/seed_views.py:1016 msgid "Compact: 25x25" msgstr "" -#: src/seedsigner/views/seed_views.py:1003 +#: src/seedsigner/views/seed_views.py:1037 msgid "SeedQR Format" msgstr "" -#: src/seedsigner/views/seed_views.py:1052 +#: src/seedsigner/views/seed_views.py:1086 msgid "SeedQR is your private key!" msgstr "" -#: src/seedsigner/views/seed_views.py:1053 +#: src/seedsigner/views/seed_views.py:1087 msgid "Never photograph it or scan it into an online device." msgstr "" -#: src/seedsigner/views/seed_views.py:1145 -#: src/seedsigner/views/seed_views.py:1189 -#: src/seedsigner/views/seed_views.py:1200 -#: src/seedsigner/views/seed_views.py:1212 +#: src/seedsigner/views/seed_views.py:1179 +#: src/seedsigner/views/seed_views.py:1223 +#: src/seedsigner/views/seed_views.py:1234 +#: src/seedsigner/views/seed_views.py:1246 msgid "Confirm SeedQR" msgstr "" -#: src/seedsigner/views/seed_views.py:1150 +#: src/seedsigner/views/seed_views.py:1184 msgid "Confirm SeedQR?" msgstr "" -#: src/seedsigner/views/seed_views.py:1180 +#: src/seedsigner/views/seed_views.py:1214 msgid "Scan your SeedQR" msgstr "" -#: src/seedsigner/views/seed_views.py:1190 -#: src/seedsigner/views/seed_views.py:1213 +#: src/seedsigner/views/seed_views.py:1224 +#: src/seedsigner/views/seed_views.py:1247 msgid "Error!" msgstr "" -#: src/seedsigner/views/seed_views.py:1191 +#: src/seedsigner/views/seed_views.py:1225 msgid "Your transcribed SeedQR does not match your original seed!" msgstr "" -#: src/seedsigner/views/seed_views.py:1193 -#: src/seedsigner/views/seed_views.py:1216 +#: src/seedsigner/views/seed_views.py:1227 +#: src/seedsigner/views/seed_views.py:1250 msgid "Review SeedQR" msgstr "" -#: src/seedsigner/views/seed_views.py:1202 +#: src/seedsigner/views/seed_views.py:1236 msgid "Your transcribed SeedQR successfully scanned and yielded the same seed." msgstr "" -#: src/seedsigner/views/seed_views.py:1214 +#: src/seedsigner/views/seed_views.py:1248 msgid "Your transcribed SeedQR could not be read!" msgstr "" -#: src/seedsigner/views/seed_views.py:1285 +#: src/seedsigner/views/seed_views.py:1319 msgid "Sig type can't be auto-detected from this address. Please specify:" msgstr "" -#: src/seedsigner/views/seed_views.py:1326 +#: src/seedsigner/views/seed_views.py:1360 msgid "Load the seed to verify" msgstr "" -#: src/seedsigner/views/seed_views.py:1336 +#: src/seedsigner/views/seed_views.py:1370 msgid "Select seed to verify" msgstr "" -#: src/seedsigner/views/seed_views.py:1388 +#: src/seedsigner/views/seed_views.py:1422 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:1434 +#: src/seedsigner/views/seed_views.py:1468 msgid "Skip 10" msgstr "" -#: src/seedsigner/views/seed_views.py:1435 -#: src/seedsigner/views/seed_views.py:1616 +#: src/seedsigner/views/seed_views.py:1469 +#: src/seedsigner/views/seed_views.py:1650 msgid "Cancel" msgstr "" -#: src/seedsigner/views/seed_views.py:1563 -#: src/seedsigner/views/seed_views.py:1579 +#: src/seedsigner/views/seed_views.py:1597 +#: src/seedsigner/views/seed_views.py:1613 msgid "Taproot verification not yet implemented!" msgstr "" -#: src/seedsigner/views/seed_views.py:1575 +#: src/seedsigner/views/seed_views.py:1609 msgid "Legacy P2PKH verification not implemented!" msgstr "" -#: src/seedsigner/views/seed_views.py:1600 +#: src/seedsigner/views/seed_views.py:1634 msgid "multisig" msgstr "" -#: src/seedsigner/views/seed_views.py:1602 +#: src/seedsigner/views/seed_views.py:1636 msgid "seed {}" msgstr "" -#: src/seedsigner/views/seed_views.py:1605 +#: src/seedsigner/views/seed_views.py:1639 msgid "Address Verified" msgstr "" -#: src/seedsigner/views/seed_views.py:1615 +#: src/seedsigner/views/seed_views.py:1649 msgid "Scan Descriptor" msgstr "" -#: src/seedsigner/views/seed_views.py:1645 +#: src/seedsigner/views/seed_views.py:1679 msgid "Return to PSBT" msgstr "" diff --git a/src/seedsigner/gui/components.py b/src/seedsigner/gui/components.py index 15944365..ea7c1540 100644 --- a/src/seedsigner/gui/components.py +++ b/src/seedsigner/gui/components.py @@ -27,6 +27,7 @@ class GUIConstants: ACCENT_COLOR = "orange" TESTNET_COLOR = "#00f100" REGTEST_COLOR = "#00caf1" + LIGHT_BLUE = "#0084ff" ICON_FONT_NAME__FONT_AWESOME = "Font_Awesome_6_Free-Solid-900.otf" ICON_FONT_NAME__SEEDSIGNER = "seedsigner-glyphs.otf" @@ -163,6 +164,7 @@ class FontAwesomeIconConstants: DICE_FOUR = "\uf524" DICE_FIVE = "\uf523" DICE_SIX = "\uf526" + FILE_SIGNATURE = "\uf573" GEAR = "\uf013" KEY = "\uf084" KEYBOARD = "\uf11c" @@ -348,7 +350,7 @@ class TextArea(BaseComponent): is_text_centered: bool = True supersampling_factor: int = 1 auto_line_break: bool = True - allow_text_overflow: bool = False + allow_text_overflow: bool = True def __post_init__(self): @@ -390,8 +392,9 @@ class TextArea(BaseComponent): text_x = int((self.supersampled_width - width) / 2) else: text_x = self.supersampling_factor * self.edge_padding - if self.min_text_x is not None and text_x < self.min_text_x: - text_x = self.min_text_x + + if self.min_text_x is not None and text_x < self.supersampling_factor * self.min_text_x: + text_x = self.supersampling_factor * self.min_text_x self.text_lines.append({"text": text, "text_x": text_x}) if width > self.text_width: @@ -563,12 +566,12 @@ class IconTextLine(BaseComponent): icon_size: int = GUIConstants.ICON_FONT_SIZE icon_color: str = GUIConstants.BODY_FONT_COLOR label_text: str = None - value_text: str = "73c5da0a" + value_text: str = "" font_name: str = None font_size: int = None is_text_centered: bool = False auto_line_break: bool = False - allow_text_overflow: bool = False + allow_text_overflow: bool = True screen_x: int = 0 screen_y: int = 0 @@ -610,8 +613,7 @@ class IconTextLine(BaseComponent): is_text_centered=self.is_text_centered if not self.icon_name else False, auto_line_break=False, screen_x=text_screen_x, - screen_y=self.screen_y, - allow_text_overflow=False + screen_y=self.screen_y ) else: self.label_textarea = None @@ -1351,6 +1353,35 @@ class TopNav(BaseComponent): if self.show_back_button: # Don't let the title intrude on the BACK button min_x = self.left_button.screen_x + self.left_button.width + GUIConstants.COMPONENT_PADDING + + # TODO: Account for the icon's width if there is one + max_width = self.width - min_x + if self.show_power_button: + max_width -= (self.width - self.right_button.screen_x) + GUIConstants.COMPONENT_PADDING + else: + max_width -= GUIConstants.EDGE_PADDING + + # print(f"width: {self.width}") + # print(f"min_x: {min_x}") + # print(f"max_width: {max_width}") + # print(f"self.font_size: {self.font_size}") + + # Dynamically size the title font size as needed + title_font_size = self.font_size + min_title_font_size = GUIConstants.get_body_font_size() + while title_font_size >= min_title_font_size: + font = Fonts.get_font(self.font_name, title_font_size) + (left, top, text_width, bottom) = font.getbbox(self.text, anchor="ls") + # print(f"text_width: {text_width}") + if text_width > max_width: + title_font_size -= 1 + # print(f"title_font_size: {title_font_size}") + else: + # It fits! + break + + if title_font_size < min_title_font_size: + title_font_size = min_title_font_size if self.icon_name: self.title = IconTextLine( @@ -1363,7 +1394,7 @@ class TopNav(BaseComponent): value_text=self.text, is_text_centered=True, font_name=self.font_name, - font_size=self.font_size, + font_size=title_font_size, ) else: self.title = TextArea( @@ -1374,7 +1405,7 @@ class TopNav(BaseComponent): text=self.text, is_text_centered=True, font_name=self.font_name, - font_size=self.font_size, + font_size=title_font_size, ) diff --git a/src/seedsigner/gui/screens/psbt_screens.py b/src/seedsigner/gui/screens/psbt_screens.py index 7fdf739d..1e5c5ad4 100644 --- a/src/seedsigner/gui/screens/psbt_screens.py +++ b/src/seedsigner/gui/screens/psbt_screens.py @@ -344,7 +344,7 @@ class PSBTOverviewScreen(ButtonListScreen): destination_y += destination_y_spacing # Resize to target and sharpen final image - image = image.resize((self.canvas_width, chart_height), Image.LANCZOS) + image = image.resize((self.canvas_width, chart_height), Image.Resampling.LANCZOS) self.paste_images.append((image.filter(ImageFilter.SHARPEN), (self.chart_x, self.chart_y))) # Pass input and output curves to the animation thread @@ -568,7 +568,7 @@ class PSBTMathScreen(ButtonListScreen): ) # Resize to target and sharpen final image - image = image.resize((body_width, body_height), Image.LANCZOS) + image = image.resize((body_width, body_height), Image.Resampling.LANCZOS) self.paste_images.append((image.filter(ImageFilter.SHARPEN), (GUIConstants.EDGE_PADDING, self.top_nav.height + GUIConstants.COMPONENT_PADDING))) @@ -685,8 +685,8 @@ class PSBTFinalizeScreen(ButtonListScreen): super().__post_init__() icon = Icon( - icon_name=FontAwesomeIconConstants.PAPER_PLANE, - icon_color=GUIConstants.SUCCESS_COLOR, + icon_name=FontAwesomeIconConstants.FILE_SIGNATURE, + icon_color=GUIConstants.LIGHT_BLUE, icon_size=GUIConstants.ICON_LARGE_BUTTON_SIZE, screen_y=self.top_nav.height + GUIConstants.COMPONENT_PADDING ) @@ -694,8 +694,8 @@ class PSBTFinalizeScreen(ButtonListScreen): self.components.append(icon) self.components.append(TextArea( - text=_("Click to authorize this transaction"), - screen_y=icon.screen_y + icon.height + GUIConstants.COMPONENT_PADDING + text=_("Click to approve this transaction"), + screen_y=icon.screen_y + icon.height + 2*GUIConstants.COMPONENT_PADDING )) diff --git a/src/seedsigner/gui/screens/screen.py b/src/seedsigner/gui/screens/screen.py index b129fe62..2d4999f5 100644 --- a/src/seedsigner/gui/screens/screen.py +++ b/src/seedsigner/gui/screens/screen.py @@ -368,6 +368,9 @@ class ButtonListScreen(BaseTopNavScreen): super()._render() self._render_visible_buttons() + # Write the screen updates + self.renderer.show_image() + def _render_visible_buttons(self): if self.has_scroll_arrows: @@ -723,7 +726,6 @@ class LargeIconStatusScreen(ButtonListScreen): status_color: str = GUIConstants.SUCCESS_COLOR text: str = "" # The body text of the screen button_data: list = None - allow_text_overflow: bool = False def __post_init__(self): @@ -751,7 +753,6 @@ class LargeIconStatusScreen(ButtonListScreen): width=self.canvas_width, screen_y=next_y, font_color=self.status_color, - allow_text_overflow=self.allow_text_overflow, ) self.components.append(self.warning_headline_textarea) next_y = next_y + self.warning_headline_textarea.height @@ -761,7 +762,6 @@ class LargeIconStatusScreen(ButtonListScreen): text=self.text, width=self.canvas_width, screen_y=next_y, - allow_text_overflow=self.allow_text_overflow, )) diff --git a/src/seedsigner/gui/screens/seed_screens.py b/src/seedsigner/gui/screens/seed_screens.py index 56d25a46..017c672f 100644 --- a/src/seedsigner/gui/screens/seed_screens.py +++ b/src/seedsigner/gui/screens/seed_screens.py @@ -13,7 +13,7 @@ from seedsigner.models.threads import BaseThread, ThreadsafeCounter from seedsigner.models.seed import Seed from .screen import RET_CODE__BACK_BUTTON, BaseScreen, BaseTopNavScreen, ButtonListScreen, WarningEdgesMixin -from ..components import (Button, FontAwesomeIconConstants, Fonts, FormattedAddress, IconButton, +from ..components import (Button, FontAwesomeIconConstants, Fonts, FormattedAddress, Icon, IconButton, IconTextLine, SeedSignerCustomIconConstants, TextArea, GUIConstants) from seedsigner.gui.keyboard import Keyboard, TextEntryDisplay @@ -447,6 +447,24 @@ class SeedOptionsScreen(ButtonListScreen): +@dataclass +class SeedBackupScreen(ButtonListScreen): + has_passphrase: bool = False + + def __post_init__(self): + self.title = _("Backup Seed") + self.is_bottom_list = True + super().__post_init__() + + if self.has_passphrase: + self.components.append(TextArea( + # TRANSLATOR_NOTE: Additional explainer for the two seed backup options (mnemonic phrase and SeedQR). + text=_("Backups do not include your passphrase."), + screen_y=self.top_nav.height + GUIConstants.COMPONENT_PADDING, + )) + + + @dataclass class SeedWordsScreen(WarningEdgesMixin, ButtonListScreen): seed: Seed = None @@ -529,7 +547,7 @@ class SeedWordsScreen(WarningEdgesMixin, ButtonListScreen): number_box_y += number_box_height + (int(1.5*GUIConstants.COMPONENT_PADDING) * supersampling_factor) # Resize to target and sharpen final image - self.body_img = self.body_img.resize((self.canvas_width, self.body_height), Image.LANCZOS) + self.body_img = self.body_img.resize((self.canvas_width, self.body_height), Image.Resampling.LANCZOS) self.body_img = self.body_img.filter(ImageFilter.SHARPEN) self.paste_images.append((self.body_img, (self.body_x, self.body_y))) @@ -1108,17 +1126,57 @@ class SeedReviewPassphraseScreen(ButtonListScreen): super().__post_init__() - self.components.append(IconTextLine( - icon_name=SeedSignerCustomIconConstants.FINGERPRINT, - icon_color="blue", + # self.components.append(IconTextLine( + # icon_name=SeedSignerCustomIconConstants.FINGERPRINT, + # icon_color="blue", + # # TRANSLATOR_NOTE: Describes the effect of applying a BIP-39 passphrase; it changes the seed's fingerprint + # label_text=_("changes seed:"), + # value_text=f"{self.fingerprint_without} > {self.fingerprint_with}", + # font_name=GUIConstants.FIXED_WIDTH_EMPHASIS_FONT_NAME, + # font_size=GUIConstants.get_body_font_size() + 4, + # is_text_centered=False, + # screen_x=GUIConstants.EDGE_PADDING, + # screen_y=self.buttons[0].screen_y - GUIConstants.COMPONENT_PADDING - int(GUIConstants.get_body_font_size()*2.5) + # )) + + fingerprint_change_label = TextArea( # TRANSLATOR_NOTE: Describes the effect of applying a BIP-39 passphrase; it changes the seed's fingerprint - label_text=_("changes fingerprint"), - value_text=f"{self.fingerprint_without} >> {self.fingerprint_with}", - is_text_centered=True, - screen_y = self.buttons[0].screen_y - GUIConstants.COMPONENT_PADDING - int(GUIConstants.get_body_font_size()*2.5) + text=_("changes seed:"), + font_size=GUIConstants.LABEL_FONT_SIZE, + font_color=GUIConstants.LABEL_FONT_COLOR, + is_text_centered=False, + screen_x=int(1.25*GUIConstants.EDGE_PADDING), + screen_y=self.buttons[0].screen_y - GUIConstants.COMPONENT_PADDING - int(GUIConstants.get_body_font_size()*2.25) + ) + self.components.append(fingerprint_change_label) + + screen_y = fingerprint_change_label.screen_y + fingerprint_change_label.height + int(GUIConstants.COMPONENT_PADDING/2) + self.components.append(TextArea( + text=self.fingerprint_without, + font_name=GUIConstants.FIXED_WIDTH_EMPHASIS_FONT_NAME, + font_size=GUIConstants.get_body_font_size() + 4, + font_color=GUIConstants.LABEL_FONT_COLOR, + is_text_centered=False, + screen_x=int(1.25*GUIConstants.EDGE_PADDING), + screen_y=screen_y, + )) + self.components.append(Icon( + icon_name=FontAwesomeIconConstants.CARET_RIGHT, + icon_size=GUIConstants.get_body_font_size() + 4, + icon_color=GUIConstants.LIGHT_BLUE, + screen_x=self.components[-1].screen_x + self.components[-1].width + 2*GUIConstants.COMPONENT_PADDING, + screen_y=screen_y, + )) + self.components.append(TextArea( + text=self.fingerprint_with, + font_name=GUIConstants.FIXED_WIDTH_EMPHASIS_FONT_NAME, + font_size=GUIConstants.get_body_font_size() + 4, + is_text_centered=False, + screen_x=self.components[-1].screen_x + self.components[-1].width, + screen_y=screen_y, )) - available_height = self.components[-1].screen_y - self.top_nav.height + GUIConstants.COMPONENT_PADDING + available_height = fingerprint_change_label.screen_y - self.top_nav.height max_font_size = 28 min_font_size = 16 font_size = max_font_size @@ -1152,6 +1210,7 @@ class SeedReviewPassphraseScreen(ButtonListScreen): text=line, font_name=GUIConstants.FIXED_WIDTH_FONT_NAME, font_size=font_size, + font_color="orange", is_text_centered=True, screen_y=screen_y, )) @@ -1165,6 +1224,8 @@ class SeedTranscribeSeedQRFormatScreen(ButtonListScreen): self.is_bottom_list = True super().__post_init__() + print(self) + self.components.append(IconTextLine( # TRANSLATOR_NOTE: Refers to the SeedQR type: Standard or Compact label_text=_("Standard"), @@ -1580,5 +1641,4 @@ class MultisigWalletDescriptorScreen(ButtonListScreen): screen_y=self.components[-1].screen_y + self.components[-1].height + 2*GUIConstants.COMPONENT_PADDING, is_text_centered=True, auto_line_break=True, - allow_text_overflow=True, )) diff --git a/src/seedsigner/gui/screens/settings_screens.py b/src/seedsigner/gui/screens/settings_screens.py index 3ed74ef7..e9a661dd 100644 --- a/src/seedsigner/gui/screens/settings_screens.py +++ b/src/seedsigner/gui/screens/settings_screens.py @@ -36,7 +36,7 @@ class SettingsEntryUpdateSelectionScreen(ButtonListScreen): text=_(self.display_name), font_size=GUIConstants.BODY_FONT_MAX_SIZE, is_text_centered=True, - auto_line_break=False, + auto_line_break=True, screen_y=self.top_nav.height + GUIConstants.COMPONENT_PADDING )) @@ -47,6 +47,7 @@ class SettingsEntryUpdateSelectionScreen(ButtonListScreen): font_color=GUIConstants.LABEL_FONT_COLOR, is_text_centered=True, screen_y=prev_component_bottom + GUIConstants.COMPONENT_PADDING, + auto_line_break=True, )) diff --git a/src/seedsigner/models/seed.py b/src/seedsigner/models/seed.py index 43a2f4d8..dbbb52a1 100644 --- a/src/seedsigner/models/seed.py +++ b/src/seedsigner/models/seed.py @@ -69,6 +69,11 @@ class Seed: return unicodedata.normalize("NFC", " ".join(self._mnemonic)).split() + @property + def has_passphrase(self): + return self._passphrase != "" + + @property def passphrase(self): return self._passphrase diff --git a/src/seedsigner/models/settings_definition.py b/src/seedsigner/models/settings_definition.py index cf56e789..81317ddd 100644 --- a/src/seedsigner/models/settings_definition.py +++ b/src/seedsigner/models/settings_definition.py @@ -59,7 +59,7 @@ class SettingsConstants: (LOCALE__GERMAN, "German"), (LOCALE__HEBREW, "Hebrew"), (LOCALE__JAPANESE, "Japanese"), - # (LOCALE__PORTUGUESE, "Portuguese"), + (LOCALE__PORTUGUESE, "Portuguese"), (LOCALE__RUSSIAN, "Russian"), (LOCALE__SPANISH, "Spanish"), ] @@ -173,6 +173,7 @@ class SettingsConstants: SETTING__COMPACT_SEEDQR = "compact_seedqr" SETTING__PRIVACY_WARNINGS = "privacy_warnings" SETTING__DIRE_WARNINGS = "dire_warnings" + SETTING__PASSPHRASE_WARNING = "passphrase_warning" SETTING__PARTNER_LOGOS = "partner_logos" SETTING__DEBUG = "debug" @@ -465,6 +466,12 @@ class SettingsDefinition: visibility=SettingsConstants.VISIBILITY__ADVANCED, default_value=SettingsConstants.OPTION__ENABLED), + SettingsEntry(category=SettingsConstants.CATEGORY__FEATURES, + attr_name=SettingsConstants.SETTING__PASSPHRASE_WARNING, + display_name=_("Show passphrase warning"), + visibility=SettingsConstants.VISIBILITY__ADVANCED, + default_value=SettingsConstants.OPTION__ENABLED), + SettingsEntry(category=SettingsConstants.CATEGORY__FEATURES, attr_name=SettingsConstants.SETTING__PARTNER_LOGOS, display_name=_("Show partner logos"), diff --git a/src/seedsigner/resources/babel/de/LC_MESSAGES/messages.po b/src/seedsigner/resources/babel/de/LC_MESSAGES/messages.po index 8b1507f6..58e21daa 100644 --- a/src/seedsigner/resources/babel/de/LC_MESSAGES/messages.po +++ b/src/seedsigner/resources/babel/de/LC_MESSAGES/messages.po @@ -1,39 +1,1112 @@ -# German translations for PROJECT. +# Translations template for PROJECT. # Copyright (C) 2022 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # FIRST AUTHOR , 2022. -# +# +# Translators: +# Keith Mukai, 2022 +# SeedMint, 2022 +# +#, fuzzy msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-04-29 08:48-0500\n" -"PO-Revision-Date: 2022-04-29 13:49-0500\n" -"Last-Translator: FULL NAME \n" -"Language: de\n" -"Language-Team: de \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"POT-Creation-Date: 2022-05-10 17:32-0500\n" +"PO-Revision-Date: 2022-04-29 13:50+0000\n" +"Last-Translator: SeedMint, 2022\n" +"Language-Team: German (https://www.transifex.com/seedsigner/teams/135832/de/)\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.10.1\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: src/seedsigner/views/view.py:132 -msgid "Scan" -msgstr "Scan" +#: src/seedsigner/gui/screens/main_menu_screens.py:12 +#: src/seedsigner/gui/screens/scan_screens.py:140 +msgid "Home" +msgstr "Start" -#: src/seedsigner/views/view.py:133 -msgid "Seeds" -msgstr "Seeds" +#: src/seedsigner/gui/screens/main_menu_screens.py:24 +msgid "Restarting" +msgstr "Neustart" -#: src/seedsigner/views/view.py:134 -msgid "Tools" -msgstr "Tools" +#: src/seedsigner/gui/screens/main_menu_screens.py:29 +msgid "" +"SeedSigner is restarting.\n" +"\n" +"All in-memory data will be wiped." +msgstr "" +"SeedSigner startet neu.\n" +"Alle Daten aus dem internen Speicher werden gelöscht." -#: src/seedsigner/views/view.py:135 +#: src/seedsigner/gui/screens/main_menu_screens.py:39 +msgid "Powering Off" +msgstr "Ausschalten.." + +#: src/seedsigner/gui/screens/main_menu_screens.py:44 +msgid "Please wait about 30 seconds before disconnecting power." +msgstr "Vor dem Entfernen des Stromkabels, bitte ca. 30 Sekunden warten." + +#: src/seedsigner/gui/screens/psbt_screens.py:29 +#: src/seedsigner/views/seed_views.py:352 +msgid "Review PSBT" +msgstr "Kontrolle PSBT" + +#: src/seedsigner/gui/screens/psbt_screens.py:31 +msgid "Review Details" +msgstr "Kontrolle Details" + +#: src/seedsigner/gui/screens/psbt_screens.py:88 +msgid "1 input" +msgstr "1 Input" + +#: src/seedsigner/gui/screens/psbt_screens.py:90 +msgid "input 1" +msgstr "Input 1" + +#: src/seedsigner/gui/screens/psbt_screens.py:91 +msgid "input 2" +msgstr "Input 2" + +#. Indicates that items have been omitted from a series: e.g. "1, 2, 3, [...], +#. 8" +#: src/seedsigner/gui/screens/psbt_screens.py:93 +#: src/seedsigner/gui/screens/psbt_screens.py:141 +msgid "[ ... ]" +msgstr "[ ... ]" + +#. Input number will be inserted (e.g. "input 3") +#: src/seedsigner/gui/screens/psbt_screens.py:95 +#: src/seedsigner/gui/screens/psbt_screens.py:96 +#: src/seedsigner/gui/screens/psbt_screens.py:99 +msgid "input {}" +msgstr "input {}" + +#. Display a truncated address (e.g. "bc1qabc...") +#: src/seedsigner/gui/screens/psbt_screens.py:127 +msgid "{}..." +msgstr "{}..." + +#: src/seedsigner/gui/screens/psbt_screens.py:136 +msgid "self-transfer" +msgstr "selbst zahlung" + +#: src/seedsigner/gui/screens/psbt_screens.py:139 +msgid "recipient 1" +msgstr "Empfänger 1" + +#. Inserts the recipient number (e.g. the fifth one is: "recipient 5") +#: src/seedsigner/gui/screens/psbt_screens.py:143 +msgid "recipient {}" +msgstr "Empfänger {}" + +#: src/seedsigner/gui/screens/psbt_screens.py:145 +#: src/seedsigner/gui/screens/psbt_screens.py:555 +msgid "fee" +msgstr "Gebühr" + +#. Label for a change output in the PSBT Overview flow diagram +#: src/seedsigner/gui/screens/psbt_screens.py:150 +msgid "change" +msgstr "Wechselgeld" + +#: src/seedsigner/gui/screens/psbt_screens.py:461 +msgid "PSBT Math" +msgstr "PSBT Math" + +#: src/seedsigner/gui/screens/psbt_screens.py:462 +msgid "Review Recipients" +msgstr "Kontrolle Empfänger" + +#: src/seedsigner/gui/screens/psbt_screens.py:468 +#: src/seedsigner/gui/screens/psbt_screens.py:521 +msgid "btc" +msgstr "btc" + +#: src/seedsigner/gui/screens/psbt_screens.py:480 +msgid "sats" +msgstr "sats" + +#: src/seedsigner/gui/screens/psbt_screens.py:538 +msgid "input" +msgid_plural "inputs" +msgstr[0] "input" +msgstr[1] "inputs" + +#: src/seedsigner/gui/screens/psbt_screens.py:548 +msgid "recipient" +msgid_plural "recipients" +msgstr[0] "recipient" +msgstr[1] "Empfänger" + +#. Denonination is inserted (e.g. your "btc change" or "sats change") +#: src/seedsigner/gui/screens/psbt_screens.py:566 +msgid "{} change" +msgstr "{} change" + +#: src/seedsigner/gui/screens/psbt_screens.py:671 +msgid "Address verified!" +msgstr "Adresse verifiziert!" + +#: src/seedsigner/gui/screens/psbt_screens.py:683 +msgid "Sign PSBT" +msgstr "PSBT signieren" + +#: src/seedsigner/gui/screens/psbt_screens.py:697 +msgid "Click to authorize this transaction" +msgstr "Click um diese Transaktion zu genehmigen" + +#: src/seedsigner/gui/screens/psbt_screens.py:707 +msgid "Signed PSBT" +msgstr "Signierte PSBT" + +#. Prompt to specify which coordinator software to use (e.g. Specter, Sparrow, +#. etc) +#: src/seedsigner/gui/screens/psbt_screens.py:713 +msgid "Export as a QR code for:" +msgstr "Als QR Code exportieren, für::" + +#: src/seedsigner/gui/screens/scan_screens.py:22 +msgid "Scan a QR code" +msgstr "Scanne einen QR Code" + +#: src/seedsigner/gui/screens/scan_screens.py:138 +msgid "Settings QR" +msgstr "Einstellungs QR" + +#: src/seedsigner/gui/screens/scan_screens.py:156 +msgid "Settings imported successfully!" +msgstr "Einstellungen erfolgreich importiert!" + +#: src/seedsigner/gui/screens/screen.py:731 +#: src/seedsigner/views/seed_views.py:954 +#: src/seedsigner/views/seed_views.py:1201 +msgid "Success!" +msgstr "Erfolg!" + +#: src/seedsigner/gui/screens/screen.py:735 +#: src/seedsigner/views/seed_views.py:956 +#: src/seedsigner/views/seed_views.py:1204 +#: src/seedsigner/views/seed_views.py:1647 src/seedsigner/views/view.py:145 +msgid "OK" +msgstr "OK" + +#: src/seedsigner/gui/screens/screen.py:852 +#: src/seedsigner/views/psbt_views.py:430 +msgid "Caution" +msgstr "Achtung" + +#: src/seedsigner/gui/screens/screen.py:855 +msgid "I Understand" +msgstr "Verstanden" + +#: src/seedsigner/gui/screens/screen.py:867 +msgid "Classified Info!" +msgstr "Geheime Info!" + +#: src/seedsigner/gui/screens/seed_screens.py:411 +msgid "Finalize Seed" +msgstr "Seed finalisieren" + +#: src/seedsigner/gui/screens/seed_screens.py:424 +#: src/seedsigner/gui/screens/tools_screens.py:291 +msgid "fingerprint" +msgstr "Fingerabruck" + +#. Displays the page number and total: (e.g. page 1 of 6) +#: src/seedsigner/gui/screens/seed_screens.py:461 +msgid "Seed Words: {}/{}" +msgstr "Seed-Phrase: {}/{}" + +#: src/seedsigner/gui/screens/seed_screens.py:541 +msgid "Verify Backup?" +msgstr "Backup verifizieren?" + +#: src/seedsigner/gui/screens/seed_screens.py:547 +msgid "Optionally verify that your mnemonic backup is correct." +msgstr "Optional können Sie verifizieren das Ihr Seed Backup korrekt ist." + +#: src/seedsigner/gui/screens/seed_screens.py:556 +msgid "Derivation Path" +msgstr "Ableitungspfad" + +#: src/seedsigner/gui/screens/seed_screens.py:703 +msgid "Xpub Details" +msgstr "Xpub Details" + +#: src/seedsigner/gui/screens/seed_screens.py:709 +#: src/seedsigner/gui/screens/seed_screens.py:713 +#: src/seedsigner/views/seed_views.py:354 +#: src/seedsigner/views/seed_views.py:471 +#: src/seedsigner/views/seed_views.py:504 +#: src/seedsigner/views/seed_views.py:578 +msgid "Export Xpub" +msgstr "Export Xpub" + +#: src/seedsigner/gui/screens/seed_screens.py:722 +msgid "Fingerprint" +msgstr "Fingerabdruck" + +#. Short for "Derivation Path" +#: src/seedsigner/gui/screens/seed_screens.py:732 +msgid "Derivation" +msgstr "Ableitung" + +#: src/seedsigner/gui/screens/seed_screens.py:741 +msgid "Xpub" +msgstr "Xpub" + +#: src/seedsigner/gui/screens/seed_screens.py:754 +#: src/seedsigner/views/seed_views.py:217 +msgid "Add Passphrase" +msgstr "Passphrase hinzufügen" + +#: src/seedsigner/gui/screens/seed_screens.py:1106 +msgid "Verify Passphrase" +msgstr "Passphrase verifizieren" + +#. Describes the effect of applying a BIP-39 passphrase; it changes the seed's +#. fingerprint +#: src/seedsigner/gui/screens/seed_screens.py:1115 +msgid "changes fingerprint" +msgstr "ändert Fingerabduck" + +#. Refers to the SeedQR type: Standard or Compact +#: src/seedsigner/gui/screens/seed_screens.py:1170 +msgid "Standard" +msgstr "Standart" + +#. Briefly explains the Standard SeedQR data format +#: src/seedsigner/gui/screens/seed_screens.py:1172 +msgid "BIP-39 wordlist indices" +msgstr "BIP-39 Wortlisten Indexe" + +#. Refers to the SeedQR type: Standard or Compact +#: src/seedsigner/gui/screens/seed_screens.py:1180 +msgid "Compact" +msgstr "Kompakt" + +#. Briefly explains the Compact SeedQR data format +#: src/seedsigner/gui/screens/seed_screens.py:1182 +msgid "Raw entropy bits" +msgstr "Rohe Entropie Bits" + +#: src/seedsigner/gui/screens/seed_screens.py:1196 +msgid "Transcribe SeedQR" +msgstr "SeedQR übersetz." + +#. Refers to the QR code size: 21x21, 25x25, or 29x29 +#: src/seedsigner/gui/screens/seed_screens.py:1198 +msgid "Begin {}x{}" +msgstr "Start {}x{}" + +#: src/seedsigner/gui/screens/seed_screens.py:1275 +msgid "click to exit" +msgstr "zum verlassen, klicken" + +#: src/seedsigner/gui/screens/seed_screens.py:1411 +msgid "" +"Optionally scan your transcribed SeedQR to confirm that it reads back " +"correctly." +msgstr "" +"Optional können Sie Ihren übersetzten SeedQR scannen um zu verifizieren, " +"dass er korrekt gelesen wird." + +#: src/seedsigner/gui/screens/seed_screens.py:1468 +#: src/seedsigner/views/seed_views.py:1284 +#: src/seedsigner/views/seed_views.py:1342 +msgid "Verify Address" +msgstr "Adresse verifizieren" + +#. Inserts the nth address number (e.g. "Checking address 7") +#: src/seedsigner/gui/screens/seed_screens.py:1527 +msgid "Checking address {}" +msgstr "Überprüfe Adresse {}" + +#: src/seedsigner/gui/screens/seed_screens.py:1544 +msgid "Multisig Verification" +msgstr "Multisig Verifikation" + +#: src/seedsigner/gui/screens/seed_screens.py:1549 +msgid "" +"Load your multisig wallet descriptor to verify your receive/self-transfer or" +" change address." +msgstr "" +"Laden Sie Ihren Multisig Deskriptor um Ihre Empfangs-/ Wechsel und " +"Selbstzahlungsadressen zu verifizieren." + +#: src/seedsigner/gui/screens/seed_screens.py:1562 +msgid "Descriptor Loaded" +msgstr "Deskriptor geladen" + +#. Label for the multisig wallet's signing policy (e.g. 2-of-3) +#: src/seedsigner/gui/screens/seed_screens.py:1568 +msgid "Policy" +msgstr "Richtlinie" + +#: src/seedsigner/gui/screens/seed_screens.py:1576 +msgid "Signing Keys" +msgstr "Singnier Schlüssel" + +#: src/seedsigner/gui/screens/settings_screens.py:26 +#: src/seedsigner/views/main_menu_views.py:21 +#: src/seedsigner/views/settings_views.py:36 msgid "Settings" msgstr "Einst." -#: src/seedsigner/views/view.py:139 -msgid "Home" -msgstr "Start" \ No newline at end of file +#. Short for "Input/Output"; screen to make sure the buttons and camera are +#. working properly +#: src/seedsigner/gui/screens/settings_screens.py:58 +msgid "I/O Test" +msgstr "E/A Test" + +#. Blank the screen +#: src/seedsigner/gui/screens/settings_screens.py:129 +#: src/seedsigner/gui/screens/settings_screens.py:140 +#: src/seedsigner/gui/screens/settings_screens.py:221 +msgid "Clear" +msgstr "löschen" + +#: src/seedsigner/gui/screens/settings_screens.py:161 +msgid "Exit" +msgstr "zurück" + +#: src/seedsigner/gui/screens/settings_screens.py:175 +#: src/seedsigner/gui/screens/tools_screens.py:71 +msgid "Capturing image..." +msgstr "Bild aufnehmen..." + +#: src/seedsigner/gui/screens/settings_screens.py:288 +#: src/seedsigner/views/settings_views.py:21 +msgid "Donate" +msgstr "Spenden" + +#. 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:293 +#, python-format +msgid "" +"SeedSigner is 100%% free & open source, funded solely by the Bitcoin community.\n" +"\n" +"Donate onchain or LN at:" +msgstr "" +"SeedSigner ist 100%% frei & quelloffen, sowie einzig durch die Bitcoin community finanziert.\n" +"Spende onchain bzw. via LN:" + +#. Instructions when taking a picture; "back" should point left. +#: src/seedsigner/gui/screens/tools_screens.py:40 +msgid "< back | click joystick" +msgstr "< zurück | klick Joystick" + +#. Instructions when reviewing an image; "reshoot" must point left, "accept" +#. must point right +#: src/seedsigner/gui/screens/tools_screens.py:98 +msgid " < reshoot | accept > " +msgstr " < wiederholen | akzeptieren > " + +#. current roll number vs total rolls (e.g. roll 7 of 50) +#: src/seedsigner/gui/screens/tools_screens.py:120 +#: src/seedsigner/gui/screens/tools_screens.py:245 +msgid "Dice Roll {}/{}" +msgstr "Würfeln {}/{}" + +#: src/seedsigner/gui/screens/tools_screens.py:274 +msgid "12th Word" +msgstr "12. Wort" + +#: src/seedsigner/gui/screens/tools_screens.py:276 +msgid "24th Word" +msgstr "24. Wort" + +#: src/seedsigner/models/settings_definition.py:14 +msgid "Enabled" +msgstr "Aktiviert" + +#: src/seedsigner/models/settings_definition.py:15 +#: src/seedsigner/models/settings_definition.py:20 +msgid "Disabled" +msgstr "Deaktiviert" + +#: src/seedsigner/models/settings_definition.py:18 +#: src/seedsigner/models/settings_definition.py:26 +msgid "Prompt" +msgstr "Aufforderung" + +#: src/seedsigner/models/settings_definition.py:19 +#: src/seedsigner/models/settings_definition.py:23 +#: src/seedsigner/models/settings_definition.py:29 +msgid "Required" +msgstr "Erforderlich" + +#: src/seedsigner/models/settings_definition.py:72 +msgid "Btc-only" +msgstr "Nur in Btc" + +#: src/seedsigner/models/settings_definition.py:73 +msgid "Sats-only" +msgstr "Nur in Sats" + +#: src/seedsigner/models/settings_definition.py:74 +msgid "Threshold at 0.01" +msgstr "Grenzwert bei 0.01" + +#: src/seedsigner/models/settings_definition.py:75 +msgid "Btc | Sats hybrid" +msgstr "Btc | Sats Hybrid" + +#: src/seedsigner/models/settings_definition.py:83 +msgid "0°" +msgstr "0°" + +#: src/seedsigner/models/settings_definition.py:84 +msgid "90°" +msgstr "90°" + +#: src/seedsigner/models/settings_definition.py:85 +msgid "180°" +msgstr "180°" + +#: src/seedsigner/models/settings_definition.py:86 +msgid "270°" +msgstr "270°" + +#: src/seedsigner/models/settings_definition.py:94 +msgid "Low" +msgstr "Gering" + +#: src/seedsigner/models/settings_definition.py:95 +msgid "Medium" +msgstr "Mittel" + +#: src/seedsigner/models/settings_definition.py:96 +msgid "High" +msgstr "Hoch" + +#: src/seedsigner/models/settings_definition.py:104 +msgid "Mainnet" +msgstr "Mainnet" + +#: src/seedsigner/models/settings_definition.py:105 +msgid "Testnet" +msgstr "Testnet" + +#: src/seedsigner/models/settings_definition.py:106 +msgid "Regtest" +msgstr "Regtest" + +#: src/seedsigner/models/settings_definition.py:122 +#: src/seedsigner/views/seed_views.py:466 +msgid "Single Sig" +msgstr "Single Sig" + +#: src/seedsigner/models/settings_definition.py:123 +#: src/seedsigner/views/seed_views.py:467 +msgid "Multisig" +msgstr "Multisig" + +#: src/seedsigner/models/settings_definition.py:354 +msgid "Language" +msgstr "Sprache" + +#: src/seedsigner/models/settings_definition.py:362 +msgid "Mnemonic language" +msgstr "Seedphrasen Sprache" + +#: src/seedsigner/models/settings_definition.py:370 +msgid "Persistent settings" +msgstr "dauerhafte Einstellungen" + +#: src/seedsigner/models/settings_definition.py:376 +msgid "Coordinator software" +msgstr "Koordinator Software" + +#: src/seedsigner/models/settings_definition.py:383 +msgid "Denomination display" +msgstr "Nennwertanzeige" + +#: src/seedsigner/models/settings_definition.py:392 +msgid "Bitcoin network" +msgstr "Bitcoin Netzwerk" + +#: src/seedsigner/models/settings_definition.py:400 +msgid "QR code density" +msgstr "QR Code Dichte" + +#: src/seedsigner/models/settings_definition.py:408 +msgid "Xpub export" +msgstr "Xpub export" + +#: src/seedsigner/models/settings_definition.py:414 +msgid "Sig types" +msgstr "Signatur Arten" + +#: src/seedsigner/models/settings_definition.py:422 +msgid "Script types" +msgstr "Skript Typen" + +#: src/seedsigner/models/settings_definition.py:430 +msgid "Show xpub details" +msgstr "Zeige xpub Details" + +#: src/seedsigner/models/settings_definition.py:436 +msgid "BIP-39 passphrase" +msgstr "BIP-39 Passphrase" + +#: src/seedsigner/models/settings_definition.py:444 +msgid "Camera rotation" +msgstr "Kamera rotation" + +#: src/seedsigner/models/settings_definition.py:452 +msgid "Compact SeedQR" +msgstr "Kompakt SeedQR" + +#: src/seedsigner/models/settings_definition.py:458 +msgid "Show privacy warnings" +msgstr "Zeige Privatsphäre Warnungen" + +#: src/seedsigner/models/settings_definition.py:464 +msgid "Show dire warnings" +msgstr "Zeige dringliche Warnungen" + +#: src/seedsigner/models/settings_definition.py:470 +msgid "Show partner logos" +msgstr "Zeige Partnerlogos" + +#: src/seedsigner/models/settings_definition.py:485 +msgid "QR background color" +msgstr "QR Hintergrundfarbe" + +#: src/seedsigner/views/main_menu_views.py:18 +msgid "Scan" +msgstr "Scan" + +#: src/seedsigner/views/main_menu_views.py:19 +msgid "Seeds" +msgstr "Seeds" + +#: src/seedsigner/views/main_menu_views.py:20 +#: src/seedsigner/views/tools_views.py:29 +msgid "Tools" +msgstr "Tools" + +#: src/seedsigner/views/main_menu_views.py:38 +msgid "Restart" +msgstr "Neustart" + +#: src/seedsigner/views/main_menu_views.py:39 +msgid "Power Off" +msgstr "Ausschalten" + +#: src/seedsigner/views/main_menu_views.py:42 +msgid "Reset / Power" +msgstr "Reset / Power" + +#: src/seedsigner/views/psbt_views.py:36 +#: src/seedsigner/views/seed_views.py:1322 +msgid "Scan a seed" +msgstr "Scanne einen Seed" + +#: src/seedsigner/views/psbt_views.py:37 +#: src/seedsigner/views/seed_views.py:1323 +msgid "Enter 12/24 words" +msgstr "12/24 Wort Eingabe" + +#: src/seedsigner/views/psbt_views.py:53 +msgid "Select Signer" +msgstr "Auswahl Signer" + +#: src/seedsigner/views/psbt_views.py:85 +msgid "Parsing PSBT..." +msgstr "Analysiert PSBT... " + +#: src/seedsigner/views/psbt_views.py:155 +msgid "Unsupported Script Type!" +msgstr "Nicht unterstützter Skipt Typ!" + +#: src/seedsigner/views/psbt_views.py:156 +msgid "" +"PSBT has unsupported input script type, please verify your change addresses." +msgstr "" +"Bitte verifizieren Sie Ihre Wechselgeld Adressen, da die PSBT nicht " +"unterstützte Input Skript Typen enthält." + +#: src/seedsigner/views/psbt_views.py:157 +#: src/seedsigner/views/psbt_views.py:176 +msgid "Continue" +msgstr "Weiter" + +#. User will receive no change back; the inputs to this transaction are fully +#. spent +#: src/seedsigner/views/psbt_views.py:174 +msgid "Full Spend!" +msgstr "komplett ausgegeben!" + +#: src/seedsigner/views/psbt_views.py:175 +msgid "" +"This PSBT spends its entire input value. No change is coming back to your " +"wallet." +msgstr "" +"Diese PSBT zahlt den kompletten Eingabebetrag. Es wird kein Wechselgeld an " +"Ihre Wallet zurück gezahlt." + +#. 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:242 +msgid "Will Send" +msgstr "wird senden" + +#: src/seedsigner/views/psbt_views.py:248 +msgid "Next Recipient" +msgstr "nächster Empfänger" + +#. Short for "Next step" +#: src/seedsigner/views/psbt_views.py:251 +#: src/seedsigner/views/psbt_views.py:320 +#: src/seedsigner/views/seed_views.py:796 +msgid "Next" +msgstr "weiter" + +#. The amount you're receiving back from the transaction +#: src/seedsigner/views/psbt_views.py:324 +msgid "Your Change" +msgstr "Ihr Wechselgeld" + +#: src/seedsigner/views/psbt_views.py:325 +msgid "Verify Multisig Change" +msgstr "Verifiziere Multisig Wechselgeld" + +#: src/seedsigner/views/psbt_views.py:327 +msgid "Self-Transfer" +msgstr "Selbst-Transfer" + +#: src/seedsigner/views/psbt_views.py:328 +msgid "Verify Multisig Addr" +msgstr "Verifiziere Multisig Addr" + +#: src/seedsigner/views/psbt_views.py:347 +msgid "Verifying Change..." +msgstr "Verifiziere Wechselgeld..." + +#: src/seedsigner/views/psbt_views.py:349 +msgid "Verifying Self-Transfer..." +msgstr "Verifiziere Selbstzahlung..." + +#: src/seedsigner/views/psbt_views.py:431 +msgid "" +"PSBT's {} address could not be verified with your multisig wallet " +"descriptor." +msgstr "" +"PSBT Adresse {} konnte mit Ihrem Multisig-Wallet Deskriptor nicht " +"verifiziert werden." + +#: src/seedsigner/views/psbt_views.py:433 +msgid "Suspicious PSBT" +msgstr "Verdächtige PSBT" + +#: src/seedsigner/views/psbt_views.py:434 +msgid "PSBT's {} address could not be generated from your seed." +msgstr "PSBT's {} Adresse konnte von Ihrem Seed nicht generiert werden." + +#: src/seedsigner/views/psbt_views.py:438 +msgid "Address Verification Failed" +msgstr "Adressen Verifikation gescheitert" + +#: src/seedsigner/views/psbt_views.py:440 +msgid "Discard PSBT" +msgstr "PSBT verwerfen" + +#: src/seedsigner/views/psbt_views.py:465 +msgid "Approve PSBT" +msgstr "PSBT bestätigen" + +#: src/seedsigner/views/psbt_views.py:470 +msgid "Signing PSBT..." +msgstr "Signiere PSBT..." + +#: src/seedsigner/views/psbt_views.py:548 +msgid "PSBT Error" +msgstr "PSBT Fehler" + +#: src/seedsigner/views/psbt_views.py:550 +msgid "Signing Failed" +msgstr "Fehler beim signieren" + +#: src/seedsigner/views/psbt_views.py:551 +msgid "Signing with this seed did not add a valid signature." +msgstr "Die Signatur mit diesem Seed ergab keine gültige Signatur" + +#: src/seedsigner/views/psbt_views.py:552 +msgid "Select Diff Seed" +msgstr "Wähle anderen Seed" + +#. This is on the opening splash screen, displayed above the HRF logo +#: src/seedsigner/views/screensaver.py:74 +msgid "With support from:" +msgstr "Mit Unterstützung von:" + +#: src/seedsigner/views/seed_views.py:53 +msgid "Load a seed" +msgstr "Seed Eingabe" + +#: src/seedsigner/views/seed_views.py:56 +msgid "In-Memory Seeds" +msgstr "gespeicherte Seeds" + +#: src/seedsigner/views/seed_views.py:77 +msgid "Scan a SeedQR" +msgstr "Scanne einen SeedQR" + +#: src/seedsigner/views/seed_views.py:78 +msgid "Enter 24-word seed" +msgstr "24-Wort Seed Eingabe" + +#: src/seedsigner/views/seed_views.py:79 +msgid "Enter 12-word seed" +msgstr "12-Wort Seed Eingabe" + +#: src/seedsigner/views/seed_views.py:80 +msgid "Create a seed" +msgstr "Seed erzeugen" + +#: src/seedsigner/views/seed_views.py:89 +msgid "Load A Seed" +msgstr "Seed Eingabe" + +#. Inserts the word number (e.g. "Seed Word #6") +#: src/seedsigner/views/seed_views.py:126 +msgid "Seed Word #{}" +msgstr "Seed Wort #{}" + +#: src/seedsigner/views/seed_views.py:187 +msgid "Review & Edit" +msgstr "Prüfen & bearbeiten" + +#: src/seedsigner/views/seed_views.py:188 +#: src/seedsigner/views/seed_views.py:310 +#: src/seedsigner/views/tools_views.py:259 +msgid "Discard" +msgstr "Verwerfen" + +#: src/seedsigner/views/seed_views.py:192 +msgid "Invalid Mnemonic!" +msgstr "Ungültiger Seed!" + +#: src/seedsigner/views/seed_views.py:194 +msgid "Checksum failure; not a valid seed phrase." +msgstr "Prüfsumme fehlerhaft, keine valide Seedphrase." + +#: src/seedsigner/views/seed_views.py:216 +#: src/seedsigner/views/seed_views.py:268 +#: src/seedsigner/views/seed_views.py:797 +#: src/seedsigner/views/seed_views.py:1146 +msgid "Done" +msgstr "Fertig" + +#: src/seedsigner/views/seed_views.py:267 +msgid "Edit passphrase" +msgstr "Passphrase bearbeiten" + +#: src/seedsigner/views/seed_views.py:309 +msgid "Keep Seed" +msgstr "Seed behalten" + +#: src/seedsigner/views/seed_views.py:315 +msgid "Discard Seed?" +msgstr "Seed verwerfen?" + +#: src/seedsigner/views/seed_views.py:317 +msgid "Wipe seed {} from the device?" +msgstr "Seed {} vom Gerät löschen?" + +#: src/seedsigner/views/seed_views.py:351 +msgid "Scan PSBT" +msgstr "PSBT scannen" + +#: src/seedsigner/views/seed_views.py:353 +#: src/seedsigner/views/seed_views.py:1646 +msgid "Verify Addr" +msgstr "Verifiziere Addr" + +#: src/seedsigner/views/seed_views.py:355 +#: src/seedsigner/views/seed_views.py:436 +msgid "Backup Seed" +msgstr "Seed Backup" + +#: src/seedsigner/views/seed_views.py:356 +msgid "Discard Seed" +msgstr "Seed verwerfen" + +#: src/seedsigner/views/seed_views.py:431 +msgid "View Seed Words" +msgstr "Seed-Phrase zeigen" + +#: src/seedsigner/views/seed_views.py:432 +msgid "Export as SeedQR" +msgstr "Als SeedQR exportieren" + +#: src/seedsigner/views/seed_views.py:620 +msgid "Privacy Leak!" +msgstr "Privatsphäreleck!" + +#: src/seedsigner/views/seed_views.py:621 +msgid "Xpub can be used to view all future transactions." +msgstr "" +"Der Xpub kann verwendet werden um alle künftigen Transaktionen einzusehen." + +#: src/seedsigner/views/seed_views.py:651 +msgid "Generating xpub..." +msgstr "Generiere xpub..." + +#: src/seedsigner/views/seed_views.py:771 +msgid "You must keep your seed words private & away from all online devices." +msgstr "" +"Halten Sie Ihre Seed-Phrase privat & geben sie diese NIE in ein Gerät mit " +"Internetzugang ein." + +#: src/seedsigner/views/seed_views.py:836 +msgid "Verify" +msgstr "Verifizieren" + +#: src/seedsigner/views/seed_views.py:837 +msgid "Skip" +msgstr "Überspringen" + +#: src/seedsigner/views/seed_views.py:886 +msgid "Verify Word #{}" +msgstr "Verifiziere Wort #{}" + +#: src/seedsigner/views/seed_views.py:926 +msgid "Review Seed Words" +msgstr "Seed Phrase überprüfen" + +#: src/seedsigner/views/seed_views.py:927 +msgid "Try Again" +msgstr "Erneut versuchen" + +#: src/seedsigner/views/seed_views.py:931 +msgid "Verification Error" +msgstr "Verifikationsfehler" + +#: src/seedsigner/views/seed_views.py:933 +msgid "Wrong Word!" +msgstr "Falsches Wort!" + +#: src/seedsigner/views/seed_views.py:934 +msgid "Word #{} is not \"{}\"!" +msgstr "Wort #{} ist nicht \"{}\"!" + +#: src/seedsigner/views/seed_views.py:952 +msgid "Backup Verified" +msgstr "Backup überprüft" + +#: src/seedsigner/views/seed_views.py:955 +msgid "All mnemonic backup words were successfully verified!" +msgstr "Alle Seed Wörter wurden erfolgreich überprüft" + +#: src/seedsigner/views/seed_views.py:978 +msgid "Standard: 25x25" +msgstr "Standart: 25x25" + +#: src/seedsigner/views/seed_views.py:979 +msgid "Compact: 21x21" +msgstr "Kompakt: 21x21" + +#: src/seedsigner/views/seed_views.py:983 +msgid "Standard: 29x29" +msgstr "Standart: 29x29" + +#: src/seedsigner/views/seed_views.py:984 +msgid "Compact: 25x25" +msgstr "Kompakt: 25x25" + +#: src/seedsigner/views/seed_views.py:1003 +msgid "SeedQR Format" +msgstr "SeedQR Format" + +#: src/seedsigner/views/seed_views.py:1052 +msgid "SeedQR is your private key!" +msgstr "SeedQR ist Ihr privater Schlüssel!" + +#: src/seedsigner/views/seed_views.py:1053 +msgid "Never photograph it or scan it into an online device." +msgstr "" +"Fotografieren Sie diesen niemals und scannen Sie Ihn auch niemals mit einem " +"Online-Gerät." + +#: src/seedsigner/views/seed_views.py:1145 +#: src/seedsigner/views/seed_views.py:1189 +#: src/seedsigner/views/seed_views.py:1200 +#: src/seedsigner/views/seed_views.py:1212 +msgid "Confirm SeedQR" +msgstr "SeedQR bestätigen" + +#: src/seedsigner/views/seed_views.py:1150 +msgid "Confirm SeedQR?" +msgstr "SeedQR bestätigen?" + +#: src/seedsigner/views/seed_views.py:1180 +msgid "Scan your SeedQR" +msgstr "Scannen Sie Ihren SeedQR" + +#: src/seedsigner/views/seed_views.py:1190 +#: src/seedsigner/views/seed_views.py:1213 +msgid "Error!" +msgstr "Fehler!" + +#: src/seedsigner/views/seed_views.py:1191 +msgid "Your transcribed SeedQR does not match your original seed!" +msgstr "Ihr übersetzer SeedQR stimmt nicht mit dem originalen Seed überein!" + +#: src/seedsigner/views/seed_views.py:1193 +#: src/seedsigner/views/seed_views.py:1216 +msgid "Review SeedQR" +msgstr "SeedQR überprüfen" + +#: src/seedsigner/views/seed_views.py:1202 +msgid "" +"Your transcribed SeedQR successfully scanned and yielded the same seed." +msgstr "" +"Ihr übersetzter SeedQR wurde erfolgreich gescannt und ergab den selben Seed." + +#: src/seedsigner/views/seed_views.py:1214 +msgid "Your transcribed SeedQR could not be read!" +msgstr "Ihr übersetzter SeedQR konnte nicht gelesen werden!" + +#: src/seedsigner/views/seed_views.py:1285 +msgid "Sig type can't be auto-detected from this address. Please specify:" +msgstr "Sig Typ konnte nicht automatisch erkannt werden. Bitte spezifizieren:" + +#: src/seedsigner/views/seed_views.py:1326 +msgid "Load the seed to verify" +msgstr "Laden Sie den Seed zum verifizieren" + +#: src/seedsigner/views/seed_views.py:1336 +msgid "Select seed to verify" +msgstr "Zu verifizierenden Seed wählen" + +#: src/seedsigner/views/seed_views.py:1388 +msgid "Can't validate a single sig addr without specifying a seed" +msgstr "" +"Sie müssen einen Seed spezifizieren um eine \"single sig\" Adresse zu " +"verifizieren" + +#. Option when scanning for a matching address; skips ten addresses ahead +#: src/seedsigner/views/seed_views.py:1434 +msgid "Skip 10" +msgstr "Springe 10" + +#: src/seedsigner/views/seed_views.py:1435 +#: src/seedsigner/views/seed_views.py:1616 +msgid "Cancel" +msgstr "Abbruch" + +#: src/seedsigner/views/seed_views.py:1563 +#: src/seedsigner/views/seed_views.py:1579 +msgid "Taproot verification not yet implemented!" +msgstr "Taproot Überprüfung noch nicht implementiert!" + +#: src/seedsigner/views/seed_views.py:1575 +msgid "Legacy P2PKH verification not implemented!" +msgstr "Legacy P2PKH Überprüfung nicht implementiert!" + +#: src/seedsigner/views/seed_views.py:1600 +msgid "multisig" +msgstr "Multisig" + +#: src/seedsigner/views/seed_views.py:1602 +msgid "seed {}" +msgstr "Seed {}" + +#: src/seedsigner/views/seed_views.py:1605 +msgid "Address Verified" +msgstr "Addresse verifiziert" + +#: src/seedsigner/views/seed_views.py:1615 +msgid "Scan Descriptor" +msgstr "Deskriptor scannen" + +#: src/seedsigner/views/seed_views.py:1645 +msgid "Return to PSBT" +msgstr "Zurück zur PSBT" + +#: src/seedsigner/views/settings_views.py:20 +msgid "I/O test" +msgstr "E/A Test" + +#: src/seedsigner/views/settings_views.py:39 +#: src/seedsigner/views/settings_views.py:46 +msgid "Advanced" +msgstr "Fortgeschritten" + +#: src/seedsigner/views/settings_views.py:54 +msgid "Dev Options" +msgstr "Entwickler Optionen" + +#: src/seedsigner/views/tools_views.py:24 +msgid " New seed" +msgstr "Neuer Seed" + +#: src/seedsigner/views/tools_views.py:25 +msgid "New seed" +msgstr "Neuer Seed" + +#: src/seedsigner/views/tools_views.py:26 +msgid "Calc 12th/24th word" +msgstr "Berechne 12./24. Wort" + +#: src/seedsigner/views/tools_views.py:102 +#: src/seedsigner/views/tools_views.py:228 +msgid "12 words" +msgstr "12 Wörter" + +#: src/seedsigner/views/tools_views.py:103 +#: src/seedsigner/views/tools_views.py:229 +msgid "24 words" +msgstr "24 Wörter" + +#: src/seedsigner/views/tools_views.py:107 +msgid "Mnemonic Length?" +msgstr "Seedphrasen Länge?" + +#: src/seedsigner/views/tools_views.py:174 +msgid "12 words (50 rolls)" +msgstr "12 Wörter (50 würfe)" + +#: src/seedsigner/views/tools_views.py:175 +msgid "24 words (99 rolls)" +msgstr "24 Wörter (99 würfe)" + +#: src/seedsigner/views/tools_views.py:179 +#: src/seedsigner/views/tools_views.py:233 +msgid "Mnemonic Length" +msgstr "Seedphrasen länge" + +#: src/seedsigner/views/tools_views.py:258 +msgid "Load seed" +msgstr "Lade Seed" + +#: src/seedsigner/views/view.py:124 +msgid "Work In Progress" +msgstr "in Arbeit" + +#: src/seedsigner/views/view.py:125 +msgid "Not Yet Implemented" +msgstr "Noch nicht implementiert" + +#: src/seedsigner/views/view.py:126 +msgid "This is still on our to-do list!" +msgstr "Dies ist noch auf unserer To-Do Liste!" + +#: src/seedsigner/views/view.py:127 +msgid "Back to Main Menu" +msgstr "Zurück zum Hauptmenü" + +#: src/seedsigner/views/view.py:142 +msgid "System Error" +msgstr "Systemfehler" diff --git a/src/seedsigner/resources/babel/es/LC_MESSAGES/messages.po b/src/seedsigner/resources/babel/es/LC_MESSAGES/messages.po index 299098d8..eb32c5e8 100644 --- a/src/seedsigner/resources/babel/es/LC_MESSAGES/messages.po +++ b/src/seedsigner/resources/babel/es/LC_MESSAGES/messages.po @@ -5,8 +5,8 @@ # # Translators: # Cabildo BTC, 2022 -# Bitcoin Hornet, 2022 # Keith Mukai, 2022 +# Bitcoin Hornet, 2022 # #, fuzzy msgid "" @@ -15,7 +15,7 @@ msgstr "" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2022-05-10 17:32-0500\n" "PO-Revision-Date: 2022-04-29 13:50+0000\n" -"Last-Translator: Keith Mukai, 2022\n" +"Last-Translator: Bitcoin Hornet, 2022\n" "Language-Team: Spanish (https://www.transifex.com/seedsigner/teams/135832/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -354,7 +354,7 @@ msgstr "Normas" #: src/seedsigner/gui/screens/seed_screens.py:1576 msgid "Signing Keys" -msgstr "Claves para firmar" +msgstr "Llaves de firmado" #: src/seedsigner/gui/screens/settings_screens.py:26 #: src/seedsigner/views/main_menu_views.py:21 @@ -366,7 +366,7 @@ msgstr "Ajustes" #. working properly #: src/seedsigner/gui/screens/settings_screens.py:58 msgid "I/O Test" -msgstr "Test de hardware" +msgstr "Examen de Hardware" #. Blank the screen #: src/seedsigner/gui/screens/settings_screens.py:129 @@ -455,7 +455,7 @@ msgstr "Btc-Solamente" #: src/seedsigner/models/settings_definition.py:73 msgid "Sats-only" -msgstr "Sats-solamente" +msgstr "Sats-Solamente" #: src/seedsigner/models/settings_definition.py:74 msgid "Threshold at 0.01" @@ -463,7 +463,7 @@ msgstr "Límite a 0.01" #: src/seedsigner/models/settings_definition.py:75 msgid "Btc | Sats hybrid" -msgstr "Btc | Sats híbrido" +msgstr "Btc | Sats Híbrido" #: src/seedsigner/models/settings_definition.py:83 msgid "0°" @@ -517,11 +517,11 @@ msgstr "Multifirma" #: src/seedsigner/models/settings_definition.py:354 msgid "Language" -msgstr "Lengua" +msgstr "Idioma" #: src/seedsigner/models/settings_definition.py:362 msgid "Mnemonic language" -msgstr "Lenguaje frase mnemónica" +msgstr "Idioma de frase mnemónica" #: src/seedsigner/models/settings_definition.py:370 msgid "Persistent settings" @@ -533,7 +533,7 @@ msgstr "Software coordinador" #: src/seedsigner/models/settings_definition.py:383 msgid "Denomination display" -msgstr "Pantalla denominaciones" +msgstr "Pantalla de Denominaciones" #: src/seedsigner/models/settings_definition.py:392 msgid "Bitcoin network" @@ -771,19 +771,19 @@ msgstr "Escanear SeedQR" #: src/seedsigner/views/seed_views.py:78 msgid "Enter 24-word seed" -msgstr "" +msgstr "Entrar llave de 24 palabras" #: src/seedsigner/views/seed_views.py:79 msgid "Enter 12-word seed" -msgstr "" +msgstr "Entrar llave de 12 palabras" #: src/seedsigner/views/seed_views.py:80 msgid "Create a seed" -msgstr "" +msgstr "Crear una llave" #: src/seedsigner/views/seed_views.py:89 msgid "Load A Seed" -msgstr "" +msgstr "Carga una Llave" #. Inserts the word number (e.g. "Seed Word #6") #: src/seedsigner/views/seed_views.py:126 @@ -817,7 +817,7 @@ msgstr "Finalizado" #: src/seedsigner/views/seed_views.py:267 msgid "Edit passphrase" -msgstr "Editar contraseña" +msgstr "Editar frase de contraseña" #: src/seedsigner/views/seed_views.py:309 msgid "Keep Seed" @@ -939,7 +939,7 @@ msgstr "Formato SeedQR" #: src/seedsigner/views/seed_views.py:1052 msgid "SeedQR is your private key!" -msgstr "¡SeedQR es tu clave privada!" +msgstr "¡SeedQR es tu clave privada/semilla!" #: src/seedsigner/views/seed_views.py:1053 msgid "Never photograph it or scan it into an online device." @@ -1044,7 +1044,7 @@ msgstr "Regresar al PSBT" #: src/seedsigner/views/settings_views.py:20 msgid "I/O test" -msgstr "Test de hardware" +msgstr "Examen de hardware" #: src/seedsigner/views/settings_views.py:39 #: src/seedsigner/views/settings_views.py:46 diff --git a/src/seedsigner/resources/babel/fr/LC_MESSAGES/messages.po b/src/seedsigner/resources/babel/fr/LC_MESSAGES/messages.po index a2699c4a..0b5d5ab4 100644 --- a/src/seedsigner/resources/babel/fr/LC_MESSAGES/messages.po +++ b/src/seedsigner/resources/babel/fr/LC_MESSAGES/messages.po @@ -4,8 +4,8 @@ # FIRST AUTHOR , 2022. # # Translators: -# Jp Prudhomme , 2022 # Keith Mukai, 2022 +# Jp Prudhomme , 2022 # #, fuzzy msgid "" @@ -14,7 +14,7 @@ msgstr "" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2022-05-10 17:32-0500\n" "PO-Revision-Date: 2022-04-29 13:50+0000\n" -"Last-Translator: Keith Mukai, 2022\n" +"Last-Translator: Jp Prudhomme , 2022\n" "Language-Team: French (https://www.transifex.com/seedsigner/teams/135832/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -176,7 +176,7 @@ msgstr "Scan d'un QRcode" #: src/seedsigner/gui/screens/scan_screens.py:138 msgid "Settings QR" -msgstr "Paramètres QRcode" +msgstr "QRcode Paramètres" #: src/seedsigner/gui/screens/scan_screens.py:156 msgid "Settings imported successfully!" diff --git a/src/seedsigner/resources/babel/pt/LC_MESSAGES/messages.po b/src/seedsigner/resources/babel/pt/LC_MESSAGES/messages.po new file mode 100644 index 00000000..2893d0d2 --- /dev/null +++ b/src/seedsigner/resources/babel/pt/LC_MESSAGES/messages.po @@ -0,0 +1,1107 @@ +# Translations template for PROJECT. +# Copyright (C) 2022 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR , 2022. +# +# Translators: +# Dom Azeredo, 2022 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2022-05-10 17:32-0500\n" +"PO-Revision-Date: 2022-04-29 13:50+0000\n" +"Last-Translator: Dom Azeredo, 2022\n" +"Language-Team: Portuguese (https://www.transifex.com/seedsigner/teams/135832/pt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.10.1\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/seedsigner/gui/screens/main_menu_screens.py:12 +#: src/seedsigner/gui/screens/scan_screens.py:140 +msgid "Home" +msgstr "Início" + +#: src/seedsigner/gui/screens/main_menu_screens.py:24 +msgid "Restarting" +msgstr "Reiniciando" + +#: src/seedsigner/gui/screens/main_menu_screens.py:29 +msgid "" +"SeedSigner is restarting.\n" +"\n" +"All in-memory data will be wiped." +msgstr "" +"SeedSigner está reiniciando\n" +"\n" +"Todos os dados serão apagados. " + +#: src/seedsigner/gui/screens/main_menu_screens.py:39 +msgid "Powering Off" +msgstr "Desligando" + +#: src/seedsigner/gui/screens/main_menu_screens.py:44 +msgid "Please wait about 30 seconds before disconnecting power." +msgstr "Aguarde cerca de 30 segundos antes de desconectar a energia." + +#: src/seedsigner/gui/screens/psbt_screens.py:29 +#: src/seedsigner/views/seed_views.py:352 +msgid "Review PSBT" +msgstr "Revise PSBT" + +#: src/seedsigner/gui/screens/psbt_screens.py:31 +msgid "Review Details" +msgstr "Revise Detalhes" + +#: src/seedsigner/gui/screens/psbt_screens.py:88 +msgid "1 input" +msgstr "1 entrada" + +#: src/seedsigner/gui/screens/psbt_screens.py:90 +msgid "input 1" +msgstr "entrada 1" + +#: src/seedsigner/gui/screens/psbt_screens.py:91 +msgid "input 2" +msgstr "entrada 2" + +#. Indicates that items have been omitted from a series: e.g. "1, 2, 3, [...], +#. 8" +#: src/seedsigner/gui/screens/psbt_screens.py:93 +#: src/seedsigner/gui/screens/psbt_screens.py:141 +msgid "[ ... ]" +msgstr "[ ... ]" + +#. Input number will be inserted (e.g. "input 3") +#: src/seedsigner/gui/screens/psbt_screens.py:95 +#: src/seedsigner/gui/screens/psbt_screens.py:96 +#: src/seedsigner/gui/screens/psbt_screens.py:99 +msgid "input {}" +msgstr "entrada {}" + +#. Display a truncated address (e.g. "bc1qabc...") +#: src/seedsigner/gui/screens/psbt_screens.py:127 +msgid "{}..." +msgstr "{}..." + +#: src/seedsigner/gui/screens/psbt_screens.py:136 +msgid "self-transfer" +msgstr "transferir para si" + +#: src/seedsigner/gui/screens/psbt_screens.py:139 +msgid "recipient 1" +msgstr "destinatário 1" + +#. Inserts the recipient number (e.g. the fifth one is: "recipient 5") +#: src/seedsigner/gui/screens/psbt_screens.py:143 +msgid "recipient {}" +msgstr "destinatário {}" + +#: src/seedsigner/gui/screens/psbt_screens.py:145 +#: src/seedsigner/gui/screens/psbt_screens.py:555 +msgid "fee" +msgstr "taxa" + +#. Label for a change output in the PSBT Overview flow diagram +#: src/seedsigner/gui/screens/psbt_screens.py:150 +msgid "change" +msgstr "troco" + +#: src/seedsigner/gui/screens/psbt_screens.py:461 +msgid "PSBT Math" +msgstr "Cálculo do PSBT" + +#: src/seedsigner/gui/screens/psbt_screens.py:462 +msgid "Review Recipients" +msgstr "Rever destinatários" + +#: src/seedsigner/gui/screens/psbt_screens.py:468 +#: src/seedsigner/gui/screens/psbt_screens.py:521 +msgid "btc" +msgstr "btc" + +#: src/seedsigner/gui/screens/psbt_screens.py:480 +msgid "sats" +msgstr "sats" + +#: src/seedsigner/gui/screens/psbt_screens.py:538 +msgid "input" +msgid_plural "inputs" +msgstr[0] "entradas" +msgstr[1] "entradas" + +#: src/seedsigner/gui/screens/psbt_screens.py:548 +msgid "recipient" +msgid_plural "recipients" +msgstr[0] "destinatário" +msgstr[1] "destinatários" + +#. Denonination is inserted (e.g. your "btc change" or "sats change") +#: src/seedsigner/gui/screens/psbt_screens.py:566 +msgid "{} change" +msgstr "{} troco" + +#: src/seedsigner/gui/screens/psbt_screens.py:671 +msgid "Address verified!" +msgstr "Endereço verificado!" + +#: src/seedsigner/gui/screens/psbt_screens.py:683 +msgid "Sign PSBT" +msgstr "Assinar PSBT" + +#: src/seedsigner/gui/screens/psbt_screens.py:697 +msgid "Click to authorize this transaction" +msgstr "Clique para autorizar esta transação" + +#: src/seedsigner/gui/screens/psbt_screens.py:707 +msgid "Signed PSBT" +msgstr "PSBT assinado" + +#. Prompt to specify which coordinator software to use (e.g. Specter, Sparrow, +#. etc) +#: src/seedsigner/gui/screens/psbt_screens.py:713 +msgid "Export as a QR code for:" +msgstr "Exportar como QR code para:" + +#: src/seedsigner/gui/screens/scan_screens.py:22 +msgid "Scan a QR code" +msgstr "Escanear QR code" + +#: src/seedsigner/gui/screens/scan_screens.py:138 +msgid "Settings QR" +msgstr "Ajustes QR" + +#: src/seedsigner/gui/screens/scan_screens.py:156 +msgid "Settings imported successfully!" +msgstr "Ajustes importados com sucesso!" + +#: src/seedsigner/gui/screens/screen.py:731 +#: src/seedsigner/views/seed_views.py:954 +#: src/seedsigner/views/seed_views.py:1201 +msgid "Success!" +msgstr "Sucesso!" + +#: src/seedsigner/gui/screens/screen.py:735 +#: src/seedsigner/views/seed_views.py:956 +#: src/seedsigner/views/seed_views.py:1204 +#: src/seedsigner/views/seed_views.py:1647 src/seedsigner/views/view.py:145 +msgid "OK" +msgstr "OK" + +#: src/seedsigner/gui/screens/screen.py:852 +#: src/seedsigner/views/psbt_views.py:430 +msgid "Caution" +msgstr "Cuidado" + +#: src/seedsigner/gui/screens/screen.py:855 +msgid "I Understand" +msgstr "Eu Entendo" + +#: src/seedsigner/gui/screens/screen.py:867 +msgid "Classified Info!" +msgstr "Informação Sigilosa!" + +#: src/seedsigner/gui/screens/seed_screens.py:411 +msgid "Finalize Seed" +msgstr "Finalizar Chave" + +#: src/seedsigner/gui/screens/seed_screens.py:424 +#: src/seedsigner/gui/screens/tools_screens.py:291 +msgid "fingerprint" +msgstr "Identificação" + +#. Displays the page number and total: (e.g. page 1 of 6) +#: src/seedsigner/gui/screens/seed_screens.py:461 +msgid "Seed Words: {}/{}" +msgstr "Palavras-Chave: {}/{}" + +#: src/seedsigner/gui/screens/seed_screens.py:541 +msgid "Verify Backup?" +msgstr "Verificar Backup?" + +#: src/seedsigner/gui/screens/seed_screens.py:547 +msgid "Optionally verify that your mnemonic backup is correct." +msgstr "Opcionalmente verifique se sua cópia das Palavras-Chave está correta" + +#: src/seedsigner/gui/screens/seed_screens.py:556 +msgid "Derivation Path" +msgstr "Caminho de Derivação" + +#: src/seedsigner/gui/screens/seed_screens.py:703 +msgid "Xpub Details" +msgstr "Xpub Detalhado" + +#: src/seedsigner/gui/screens/seed_screens.py:709 +#: src/seedsigner/gui/screens/seed_screens.py:713 +#: src/seedsigner/views/seed_views.py:354 +#: src/seedsigner/views/seed_views.py:471 +#: src/seedsigner/views/seed_views.py:504 +#: src/seedsigner/views/seed_views.py:578 +msgid "Export Xpub" +msgstr "Exportar Xpub" + +#: src/seedsigner/gui/screens/seed_screens.py:722 +msgid "Fingerprint" +msgstr "Identificador" + +#. Short for "Derivation Path" +#: src/seedsigner/gui/screens/seed_screens.py:732 +msgid "Derivation" +msgstr "Derivação" + +#: src/seedsigner/gui/screens/seed_screens.py:741 +msgid "Xpub" +msgstr "Xpub" + +#: src/seedsigner/gui/screens/seed_screens.py:754 +#: src/seedsigner/views/seed_views.py:217 +msgid "Add Passphrase" +msgstr "" + +#: src/seedsigner/gui/screens/seed_screens.py:1106 +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:1115 +msgid "changes fingerprint" +msgstr "muda a identidade" + +#. Refers to the SeedQR type: Standard or Compact +#: src/seedsigner/gui/screens/seed_screens.py:1170 +msgid "Standard" +msgstr "Padrão" + +#. Briefly explains the Standard SeedQR data format +#: src/seedsigner/gui/screens/seed_screens.py:1172 +msgid "BIP-39 wordlist indices" +msgstr "Índice da lista de palavras BIP-39" + +#. Refers to the SeedQR type: Standard or Compact +#: src/seedsigner/gui/screens/seed_screens.py:1180 +msgid "Compact" +msgstr "Compacto" + +#. Briefly explains the Compact SeedQR data format +#: src/seedsigner/gui/screens/seed_screens.py:1182 +msgid "Raw entropy bits" +msgstr "Bits de entropia crua" + +#: src/seedsigner/gui/screens/seed_screens.py:1196 +msgid "Transcribe SeedQR" +msgstr "Desenhar SeedQR" + +#. Refers to the QR code size: 21x21, 25x25, or 29x29 +#: src/seedsigner/gui/screens/seed_screens.py:1198 +msgid "Begin {}x{}" +msgstr "Iniciar {}x{}" + +#: src/seedsigner/gui/screens/seed_screens.py:1275 +msgid "click to exit" +msgstr "clique para sair" + +#: src/seedsigner/gui/screens/seed_screens.py:1411 +msgid "" +"Optionally scan your transcribed SeedQR to confirm that it reads back " +"correctly." +msgstr "" +"Opcionalmente, escaneie seu SeedQR desenhado e confirme se ele é lido " +"corretamente." + +#: src/seedsigner/gui/screens/seed_screens.py:1468 +#: src/seedsigner/views/seed_views.py:1284 +#: src/seedsigner/views/seed_views.py:1342 +msgid "Verify Address" +msgstr "Verificar Endereço" + +#. Inserts the nth address number (e.g. "Checking address 7") +#: src/seedsigner/gui/screens/seed_screens.py:1527 +msgid "Checking address {}" +msgstr "Checando endereço {}" + +#: src/seedsigner/gui/screens/seed_screens.py:1544 +msgid "Multisig Verification" +msgstr "Verificação Multisig" + +#: src/seedsigner/gui/screens/seed_screens.py:1549 +msgid "" +"Load your multisig wallet descriptor to verify your receive/self-transfer or" +" change address." +msgstr "" +"Carregue seu descriptor de carteira multisig para verificar seu endereço de " +"recebimento/autotransferência ou troco." + +#: src/seedsigner/gui/screens/seed_screens.py:1562 +msgid "Descriptor Loaded" +msgstr "Descriptor Carregado" + +#. Label for the multisig wallet's signing policy (e.g. 2-of-3) +#: src/seedsigner/gui/screens/seed_screens.py:1568 +msgid "Policy" +msgstr "Configuração" + +#: src/seedsigner/gui/screens/seed_screens.py:1576 +msgid "Signing Keys" +msgstr "Chaves de Assinaturas" + +#: src/seedsigner/gui/screens/settings_screens.py:26 +#: src/seedsigner/views/main_menu_views.py:21 +#: src/seedsigner/views/settings_views.py:36 +msgid "Settings" +msgstr "Ajustes" + +#. Short for "Input/Output"; screen to make sure the buttons and camera are +#. working properly +#: src/seedsigner/gui/screens/settings_screens.py:58 +msgid "I/O Test" +msgstr "Testar Botões/Câmera" + +#. Blank the screen +#: src/seedsigner/gui/screens/settings_screens.py:129 +#: src/seedsigner/gui/screens/settings_screens.py:140 +#: src/seedsigner/gui/screens/settings_screens.py:221 +msgid "Clear" +msgstr "Limpar" + +#: src/seedsigner/gui/screens/settings_screens.py:161 +msgid "Exit" +msgstr "Sair" + +#: src/seedsigner/gui/screens/settings_screens.py:175 +#: src/seedsigner/gui/screens/tools_screens.py:71 +msgid "Capturing image..." +msgstr "Capturando imagem..." + +#: src/seedsigner/gui/screens/settings_screens.py:288 +#: src/seedsigner/views/settings_views.py:21 +msgid "Donate" +msgstr "Doar" + +#. 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:293 +#, python-format +msgid "" +"SeedSigner is 100%% free & open source, funded solely by the Bitcoin community.\n" +"\n" +"Donate onchain or LN at:" +msgstr "" +"SeedSigner é 100%% gratuito e de código aberto, financiado exclusivamente pela comunidade Bitcoin.\n" +"Doe onchain ou LN em:" + +#. Instructions when taking a picture; "back" should point left. +#: src/seedsigner/gui/screens/tools_screens.py:40 +msgid "< back | click joystick" +msgstr "< voltar | clicar" + +#. Instructions when reviewing an image; "reshoot" must point left, "accept" +#. must point right +#: src/seedsigner/gui/screens/tools_screens.py:98 +msgid " < reshoot | accept > " +msgstr "< tirar outra | bom! >" + +#. current roll number vs total rolls (e.g. roll 7 of 50) +#: src/seedsigner/gui/screens/tools_screens.py:120 +#: src/seedsigner/gui/screens/tools_screens.py:245 +msgid "Dice Roll {}/{}" +msgstr "Jogar Dados {}/{}" + +#: src/seedsigner/gui/screens/tools_screens.py:274 +msgid "12th Word" +msgstr "12ª Palavra" + +#: src/seedsigner/gui/screens/tools_screens.py:276 +msgid "24th Word" +msgstr "24ª Palavra" + +#: src/seedsigner/models/settings_definition.py:14 +msgid "Enabled" +msgstr "Habilitado" + +#: src/seedsigner/models/settings_definition.py:15 +#: src/seedsigner/models/settings_definition.py:20 +msgid "Disabled" +msgstr "Desabilitado" + +#: src/seedsigner/models/settings_definition.py:18 +#: src/seedsigner/models/settings_definition.py:26 +msgid "Prompt" +msgstr "Solicitar / Induzir" + +#: src/seedsigner/models/settings_definition.py:19 +#: src/seedsigner/models/settings_definition.py:23 +#: src/seedsigner/models/settings_definition.py:29 +msgid "Required" +msgstr "Obrigatório" + +#: src/seedsigner/models/settings_definition.py:72 +msgid "Btc-only" +msgstr "Somente Btc" + +#: src/seedsigner/models/settings_definition.py:73 +msgid "Sats-only" +msgstr "Somente sats" + +#: src/seedsigner/models/settings_definition.py:74 +msgid "Threshold at 0.01" +msgstr "Limiar de 0,01" + +#: src/seedsigner/models/settings_definition.py:75 +msgid "Btc | Sats hybrid" +msgstr "Btc | Sats híbrido" + +#: src/seedsigner/models/settings_definition.py:83 +msgid "0°" +msgstr "0°" + +#: src/seedsigner/models/settings_definition.py:84 +msgid "90°" +msgstr "90°" + +#: src/seedsigner/models/settings_definition.py:85 +msgid "180°" +msgstr "180°" + +#: src/seedsigner/models/settings_definition.py:86 +msgid "270°" +msgstr "270°" + +#: src/seedsigner/models/settings_definition.py:94 +msgid "Low" +msgstr "Baixa" + +#: src/seedsigner/models/settings_definition.py:95 +msgid "Medium" +msgstr "Média" + +#: src/seedsigner/models/settings_definition.py:96 +msgid "High" +msgstr "Alta" + +#: src/seedsigner/models/settings_definition.py:104 +msgid "Mainnet" +msgstr "Rede Principal" + +#: src/seedsigner/models/settings_definition.py:105 +msgid "Testnet" +msgstr "Rede Teste" + +#: src/seedsigner/models/settings_definition.py:106 +msgid "Regtest" +msgstr "Regtest" + +#: src/seedsigner/models/settings_definition.py:122 +#: src/seedsigner/views/seed_views.py:466 +msgid "Single Sig" +msgstr "Single Sig" + +#: src/seedsigner/models/settings_definition.py:123 +#: src/seedsigner/views/seed_views.py:467 +msgid "Multisig" +msgstr "Multisig" + +#: src/seedsigner/models/settings_definition.py:354 +msgid "Language" +msgstr "Idioma" + +#: src/seedsigner/models/settings_definition.py:362 +msgid "Mnemonic language" +msgstr "Idioma do Mnemônico" + +#: src/seedsigner/models/settings_definition.py:370 +msgid "Persistent settings" +msgstr "Ajustes Permanentes" + +#: src/seedsigner/models/settings_definition.py:376 +msgid "Coordinator software" +msgstr "Software de coordenação" + +#: src/seedsigner/models/settings_definition.py:383 +msgid "Denomination display" +msgstr "Unidade de medida" + +#: src/seedsigner/models/settings_definition.py:392 +msgid "Bitcoin network" +msgstr "Rede Bitcoin" + +#: src/seedsigner/models/settings_definition.py:400 +msgid "QR code density" +msgstr "Densidade do QR code" + +#: src/seedsigner/models/settings_definition.py:408 +msgid "Xpub export" +msgstr "Exportar Xpub" + +#: src/seedsigner/models/settings_definition.py:414 +msgid "Sig types" +msgstr "Tipos de Assinaturas" + +#: src/seedsigner/models/settings_definition.py:422 +msgid "Script types" +msgstr "Tipos de script" + +#: src/seedsigner/models/settings_definition.py:430 +msgid "Show xpub details" +msgstr "Detalhes da xpub" + +#: src/seedsigner/models/settings_definition.py:436 +msgid "BIP-39 passphrase" +msgstr "" + +#: src/seedsigner/models/settings_definition.py:444 +msgid "Camera rotation" +msgstr "Rotação da Camera" + +#: src/seedsigner/models/settings_definition.py:452 +msgid "Compact SeedQR" +msgstr "SeedQR Compacto" + +#: src/seedsigner/models/settings_definition.py:458 +msgid "Show privacy warnings" +msgstr "Mostrar avisos de privacidade" + +#: src/seedsigner/models/settings_definition.py:464 +msgid "Show dire warnings" +msgstr "Mostrar avisos assustadores" + +#: src/seedsigner/models/settings_definition.py:470 +msgid "Show partner logos" +msgstr "Mostrar logos dos parceiros" + +#: src/seedsigner/models/settings_definition.py:485 +msgid "QR background color" +msgstr "Cor de fundo do QR " + +#: src/seedsigner/views/main_menu_views.py:18 +msgid "Scan" +msgstr "Escanear" + +#: src/seedsigner/views/main_menu_views.py:19 +msgid "Seeds" +msgstr "Chaves" + +#: src/seedsigner/views/main_menu_views.py:20 +#: src/seedsigner/views/tools_views.py:29 +msgid "Tools" +msgstr "Ferramentas" + +#: src/seedsigner/views/main_menu_views.py:38 +msgid "Restart" +msgstr "Reiniciar" + +#: src/seedsigner/views/main_menu_views.py:39 +msgid "Power Off" +msgstr "Desligar" + +#: src/seedsigner/views/main_menu_views.py:42 +msgid "Reset / Power" +msgstr "Reiniciar / Desligar" + +#: src/seedsigner/views/psbt_views.py:36 +#: src/seedsigner/views/seed_views.py:1322 +msgid "Scan a seed" +msgstr "Escanear Chave" + +#: src/seedsigner/views/psbt_views.py:37 +#: src/seedsigner/views/seed_views.py:1323 +msgid "Enter 12/24 words" +msgstr "Digitar 12/24 palavras" + +#: src/seedsigner/views/psbt_views.py:53 +msgid "Select Signer" +msgstr "Selecione um Assinador" + +#: src/seedsigner/views/psbt_views.py:85 +msgid "Parsing PSBT..." +msgstr "Analizando PSBT..." + +#: src/seedsigner/views/psbt_views.py:155 +msgid "Unsupported Script Type!" +msgstr "Tipo de script não suportado!" + +#: src/seedsigner/views/psbt_views.py:156 +msgid "" +"PSBT has unsupported input script type, please verify your change addresses." +msgstr "" +"O PSBT tem um script de entrada sem suporte, favor verificar seus endereços " +"de troco." + +#: src/seedsigner/views/psbt_views.py:157 +#: src/seedsigner/views/psbt_views.py:176 +msgid "Continue" +msgstr "Continuar" + +#. User will receive no change back; the inputs to this transaction are fully +#. spent +#: src/seedsigner/views/psbt_views.py:174 +msgid "Full Spend!" +msgstr "Gastar Tudo!" + +#: src/seedsigner/views/psbt_views.py:175 +msgid "" +"This PSBT spends its entire input value. No change is coming back to your " +"wallet." +msgstr "" +"Este PSBT gasta todo o seu valor de entrada. Nenhum troco está voltando para" +" sua carteira." + +#. 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:242 +msgid "Will Send" +msgstr "Enviará" + +#: src/seedsigner/views/psbt_views.py:248 +msgid "Next Recipient" +msgstr "Próximo Destinatário" + +#. Short for "Next step" +#: src/seedsigner/views/psbt_views.py:251 +#: src/seedsigner/views/psbt_views.py:320 +#: src/seedsigner/views/seed_views.py:796 +msgid "Next" +msgstr "Próximo" + +#. The amount you're receiving back from the transaction +#: src/seedsigner/views/psbt_views.py:324 +msgid "Your Change" +msgstr "Seu Troco" + +#: src/seedsigner/views/psbt_views.py:325 +msgid "Verify Multisig Change" +msgstr "Verificar Troco Multisig" + +#: src/seedsigner/views/psbt_views.py:327 +msgid "Self-Transfer" +msgstr "Transferir para si" + +#: src/seedsigner/views/psbt_views.py:328 +msgid "Verify Multisig Addr" +msgstr "Verificar End. Mutisig" + +#: src/seedsigner/views/psbt_views.py:347 +msgid "Verifying Change..." +msgstr "Verificando Troco..." + +#: src/seedsigner/views/psbt_views.py:349 +msgid "Verifying Self-Transfer..." +msgstr "Verificando Auto-Transferência" + +#: src/seedsigner/views/psbt_views.py:431 +msgid "" +"PSBT's {} address could not be verified with your multisig wallet " +"descriptor." +msgstr "" +"O endereço {} do PSBT não pôde ser verificado com seu descriptor de carteira" +" multisig." + +#: src/seedsigner/views/psbt_views.py:433 +msgid "Suspicious PSBT" +msgstr "PSBT Suspeito" + +#: src/seedsigner/views/psbt_views.py:434 +msgid "PSBT's {} address could not be generated from your seed." +msgstr "O endereço {} do PSBT não pôde ser gerado a partir de sua chave." + +#: src/seedsigner/views/psbt_views.py:438 +msgid "Address Verification Failed" +msgstr "Verificação de Endereço Falhou" + +#: src/seedsigner/views/psbt_views.py:440 +msgid "Discard PSBT" +msgstr "Descartar PSBT" + +#: src/seedsigner/views/psbt_views.py:465 +msgid "Approve PSBT" +msgstr "Aprovar PSBT" + +#: src/seedsigner/views/psbt_views.py:470 +msgid "Signing PSBT..." +msgstr "Assinar PSBT" + +#: src/seedsigner/views/psbt_views.py:548 +msgid "PSBT Error" +msgstr "Erro no PSBT" + +#: src/seedsigner/views/psbt_views.py:550 +msgid "Signing Failed" +msgstr "Assinatura Falhou" + +#: src/seedsigner/views/psbt_views.py:551 +msgid "Signing with this seed did not add a valid signature." +msgstr "Assinar com esta chave não adicionou uma assinatura válida." + +#: src/seedsigner/views/psbt_views.py:552 +msgid "Select Diff Seed" +msgstr "Selecione uma Chave Diferente" + +#. This is on the opening splash screen, displayed above the HRF logo +#: src/seedsigner/views/screensaver.py:74 +msgid "With support from:" +msgstr "Com apoio de:" + +#: src/seedsigner/views/seed_views.py:53 +msgid "Load a seed" +msgstr "Carregar uma chave" + +#: src/seedsigner/views/seed_views.py:56 +msgid "In-Memory Seeds" +msgstr "Chaves na memória" + +#: src/seedsigner/views/seed_views.py:77 +msgid "Scan a SeedQR" +msgstr "Escanear SeedQR" + +#: src/seedsigner/views/seed_views.py:78 +msgid "Enter 24-word seed" +msgstr "Digitar chave de 24 palavras" + +#: src/seedsigner/views/seed_views.py:79 +msgid "Enter 12-word seed" +msgstr "Digitar chave de 12 palavras" + +#: src/seedsigner/views/seed_views.py:80 +msgid "Create a seed" +msgstr "Criar uma Chave" + +#: src/seedsigner/views/seed_views.py:89 +msgid "Load A Seed" +msgstr "Carregar uma Chave" + +#. Inserts the word number (e.g. "Seed Word #6") +#: src/seedsigner/views/seed_views.py:126 +msgid "Seed Word #{}" +msgstr "Palavra-Chave #{}" + +#: src/seedsigner/views/seed_views.py:187 +msgid "Review & Edit" +msgstr "Revisar e Editar" + +#: src/seedsigner/views/seed_views.py:188 +#: src/seedsigner/views/seed_views.py:310 +#: src/seedsigner/views/tools_views.py:259 +msgid "Discard" +msgstr "Descartar" + +#: src/seedsigner/views/seed_views.py:192 +msgid "Invalid Mnemonic!" +msgstr "Mnemônico Inválido!" + +#: src/seedsigner/views/seed_views.py:194 +msgid "Checksum failure; not a valid seed phrase." +msgstr "Falha no Checksum; palavras-chave inválidas." + +#: src/seedsigner/views/seed_views.py:216 +#: src/seedsigner/views/seed_views.py:268 +#: src/seedsigner/views/seed_views.py:797 +#: src/seedsigner/views/seed_views.py:1146 +msgid "Done" +msgstr "Feito" + +#: src/seedsigner/views/seed_views.py:267 +msgid "Edit passphrase" +msgstr "" + +#: src/seedsigner/views/seed_views.py:309 +msgid "Keep Seed" +msgstr "Manter Chave" + +#: src/seedsigner/views/seed_views.py:315 +msgid "Discard Seed?" +msgstr "Descartar Chave?" + +#: src/seedsigner/views/seed_views.py:317 +msgid "Wipe seed {} from the device?" +msgstr "Limpar chave {} do dispositivo?" + +#: src/seedsigner/views/seed_views.py:351 +msgid "Scan PSBT" +msgstr "Escanear PSBT" + +#: src/seedsigner/views/seed_views.py:353 +#: src/seedsigner/views/seed_views.py:1646 +msgid "Verify Addr" +msgstr "Verificar Endereço" + +#: src/seedsigner/views/seed_views.py:355 +#: src/seedsigner/views/seed_views.py:436 +msgid "Backup Seed" +msgstr "Backup da Chave" + +#: src/seedsigner/views/seed_views.py:356 +msgid "Discard Seed" +msgstr "Descartar Chave" + +#: src/seedsigner/views/seed_views.py:431 +msgid "View Seed Words" +msgstr "Ver Palavras-Chave" + +#: src/seedsigner/views/seed_views.py:432 +msgid "Export as SeedQR" +msgstr "Exportar como SeedQR" + +#: src/seedsigner/views/seed_views.py:620 +msgid "Privacy Leak!" +msgstr "Vazamento de privacidade!" + +#: src/seedsigner/views/seed_views.py:621 +msgid "Xpub can be used to view all future transactions." +msgstr "O Xpub pode ser usado para visualizar todas as transações futuras." + +#: src/seedsigner/views/seed_views.py:651 +msgid "Generating xpub..." +msgstr "Gerando xpub..." + +#: src/seedsigner/views/seed_views.py:771 +msgid "You must keep your seed words private & away from all online devices." +msgstr "" +"Você deve manter suas palavras-chave em sigilo e longe de todos os " +"dispositivos online." + +#: src/seedsigner/views/seed_views.py:836 +msgid "Verify" +msgstr "Verificar" + +#: src/seedsigner/views/seed_views.py:837 +msgid "Skip" +msgstr "Pular" + +#: src/seedsigner/views/seed_views.py:886 +msgid "Verify Word #{}" +msgstr "Verificar Palavra nº {}" + +#: src/seedsigner/views/seed_views.py:926 +msgid "Review Seed Words" +msgstr "Revisar Palavras-Chave" + +#: src/seedsigner/views/seed_views.py:927 +msgid "Try Again" +msgstr "Tente de novo / Tentar de novo" + +#: src/seedsigner/views/seed_views.py:931 +msgid "Verification Error" +msgstr "Erro na Verificação" + +#: src/seedsigner/views/seed_views.py:933 +msgid "Wrong Word!" +msgstr "Palavra Errada!" + +#: src/seedsigner/views/seed_views.py:934 +msgid "Word #{} is not \"{}\"!" +msgstr "Palavra nº{} não é \"{}\"!" + +#: src/seedsigner/views/seed_views.py:952 +msgid "Backup Verified" +msgstr "Backup Verificado" + +#: src/seedsigner/views/seed_views.py:955 +msgid "All mnemonic backup words were successfully verified!" +msgstr "Todas as palavras de backup mnemônicas foram verificadas com sucesso!" + +#: src/seedsigner/views/seed_views.py:978 +msgid "Standard: 25x25" +msgstr "Padrão: 25x25" + +#: src/seedsigner/views/seed_views.py:979 +msgid "Compact: 21x21" +msgstr "Compacto: 21x21" + +#: src/seedsigner/views/seed_views.py:983 +msgid "Standard: 29x29" +msgstr "Padrão: 29x29" + +#: src/seedsigner/views/seed_views.py:984 +msgid "Compact: 25x25" +msgstr "Compacto: 25x25" + +#: src/seedsigner/views/seed_views.py:1003 +msgid "SeedQR Format" +msgstr "Formato do SeedQR" + +#: src/seedsigner/views/seed_views.py:1052 +msgid "SeedQR is your private key!" +msgstr "O SeedQR é sua chave privada!" + +#: src/seedsigner/views/seed_views.py:1053 +msgid "Never photograph it or scan it into an online device." +msgstr "Nunca fotografe ou digitalize em um dispositivo online." + +#: src/seedsigner/views/seed_views.py:1145 +#: src/seedsigner/views/seed_views.py:1189 +#: src/seedsigner/views/seed_views.py:1200 +#: src/seedsigner/views/seed_views.py:1212 +msgid "Confirm SeedQR" +msgstr "Escanear SeedQR" + +#: src/seedsigner/views/seed_views.py:1150 +msgid "Confirm SeedQR?" +msgstr "Confirmar SeedQR?" + +#: src/seedsigner/views/seed_views.py:1180 +msgid "Scan your SeedQR" +msgstr "Escaneie seu SeedQR" + +#: src/seedsigner/views/seed_views.py:1190 +#: src/seedsigner/views/seed_views.py:1213 +msgid "Error!" +msgstr "Erro!" + +#: src/seedsigner/views/seed_views.py:1191 +msgid "Your transcribed SeedQR does not match your original seed!" +msgstr "Seu SeedQR desenhado não corresponde à sua chave original!" + +#: src/seedsigner/views/seed_views.py:1193 +#: src/seedsigner/views/seed_views.py:1216 +msgid "Review SeedQR" +msgstr "Revisar SeedQR" + +#: src/seedsigner/views/seed_views.py:1202 +msgid "" +"Your transcribed SeedQR successfully scanned and yielded the same seed." +msgstr "Seu SeedQR desenhado foi lido com sucesso e produziu a mesma chave." + +#: src/seedsigner/views/seed_views.py:1214 +msgid "Your transcribed SeedQR could not be read!" +msgstr "Seu SeedQR desenhado não pôde ser lido!" + +#: src/seedsigner/views/seed_views.py:1285 +msgid "Sig type can't be auto-detected from this address. Please specify:" +msgstr "" +"Tipo de Sig não detectado a partir deste endereço. Por favor, especifique:" + +#: src/seedsigner/views/seed_views.py:1326 +msgid "Load the seed to verify" +msgstr "Carregue a chave que verificará" + +#: src/seedsigner/views/seed_views.py:1336 +msgid "Select seed to verify" +msgstr "Selecione a chave que verificará" + +#: src/seedsigner/views/seed_views.py:1388 +msgid "Can't validate a single sig addr without specifying a seed" +msgstr "Impossível validar um end. de ass. único sem especificar uma chave" + +#. Option when scanning for a matching address; skips ten addresses ahead +#: src/seedsigner/views/seed_views.py:1434 +msgid "Skip 10" +msgstr "Pular 10" + +#: src/seedsigner/views/seed_views.py:1435 +#: src/seedsigner/views/seed_views.py:1616 +msgid "Cancel" +msgstr "Cancelar" + +#: src/seedsigner/views/seed_views.py:1563 +#: src/seedsigner/views/seed_views.py:1579 +msgid "Taproot verification not yet implemented!" +msgstr "Verificação Taproot ainda não implementada!" + +#: src/seedsigner/views/seed_views.py:1575 +msgid "Legacy P2PKH verification not implemented!" +msgstr "Verificação P2PKH Legacy não implementada!" + +#: src/seedsigner/views/seed_views.py:1600 +msgid "multisig" +msgstr "multisig" + +#: src/seedsigner/views/seed_views.py:1602 +msgid "seed {}" +msgstr "chave {}" + +#: src/seedsigner/views/seed_views.py:1605 +msgid "Address Verified" +msgstr "Endereço Verificado" + +#: src/seedsigner/views/seed_views.py:1615 +msgid "Scan Descriptor" +msgstr "Escanear Descriptor" + +#: src/seedsigner/views/seed_views.py:1645 +msgid "Return to PSBT" +msgstr "Retornar à PSBT" + +#: src/seedsigner/views/settings_views.py:20 +msgid "I/O test" +msgstr "Testar Botões/Câmera" + +#: src/seedsigner/views/settings_views.py:39 +#: src/seedsigner/views/settings_views.py:46 +msgid "Advanced" +msgstr "Avançado" + +#: src/seedsigner/views/settings_views.py:54 +msgid "Dev Options" +msgstr "Opções de Desenvolvedor" + +#: src/seedsigner/views/tools_views.py:24 +msgid " New seed" +msgstr "Nova chave" + +#: src/seedsigner/views/tools_views.py:25 +msgid "New seed" +msgstr "Nova chave" + +#: src/seedsigner/views/tools_views.py:26 +msgid "Calc 12th/24th word" +msgstr "Calc 12ª/24ª palavra" + +#: src/seedsigner/views/tools_views.py:102 +#: src/seedsigner/views/tools_views.py:228 +msgid "12 words" +msgstr "12 palavras" + +#: src/seedsigner/views/tools_views.py:103 +#: src/seedsigner/views/tools_views.py:229 +msgid "24 words" +msgstr "24 palavras" + +#: src/seedsigner/views/tools_views.py:107 +msgid "Mnemonic Length?" +msgstr "Tamanho do Mnemônico?" + +#: src/seedsigner/views/tools_views.py:174 +msgid "12 words (50 rolls)" +msgstr "12 palavras (50 jogadas)" + +#: src/seedsigner/views/tools_views.py:175 +msgid "24 words (99 rolls)" +msgstr "24 palavras (99 jogadas)" + +#: src/seedsigner/views/tools_views.py:179 +#: src/seedsigner/views/tools_views.py:233 +msgid "Mnemonic Length" +msgstr "Tamanho do Mnemônico" + +#: src/seedsigner/views/tools_views.py:258 +msgid "Load seed" +msgstr "Carregar chave" + +#: src/seedsigner/views/view.py:124 +msgid "Work In Progress" +msgstr "Trabalhando Nisso" + +#: src/seedsigner/views/view.py:125 +msgid "Not Yet Implemented" +msgstr "Ainda Não Implementado" + +#: src/seedsigner/views/view.py:126 +msgid "This is still on our to-do list!" +msgstr "Isto está na nossa lista de tarefas!" + +#: src/seedsigner/views/view.py:127 +msgid "Back to Main Menu" +msgstr "Voltar ao Menu Principal" + +#: src/seedsigner/views/view.py:142 +msgid "System Error" +msgstr "Erro no Sistema" diff --git a/src/seedsigner/views/psbt_views.py b/src/seedsigner/views/psbt_views.py index 27ed6f18..2df4c820 100644 --- a/src/seedsigner/views/psbt_views.py +++ b/src/seedsigner/views/psbt_views.py @@ -226,7 +226,7 @@ class PSBTAddressDetailsView(View): """ Shows the recipient's address and amount they will receive """ - def __init__(self, address_num, is_change=False): + def __init__(self, address_num): super().__init__() self.address_num = address_num diff --git a/src/seedsigner/views/seed_views.py b/src/seedsigner/views/seed_views.py index 097a22ab..320f39b1 100644 --- a/src/seedsigner/views/seed_views.py +++ b/src/seedsigner/views/seed_views.py @@ -209,7 +209,20 @@ class SeedFinalizeView(View): def __init__(self): super().__init__() self.seed = self.controller.storage.get_pending_seed() - self.fingerprint = self.seed.get_fingerprint(network=self.settings.get_value(SettingsConstants.SETTING__NETWORK)) + + if self.seed.get_fingerprint == "": + # Expected normal user flow + self.fingerprint = self.seed.get_fingerprint(network=self.settings.get_value(SettingsConstants.SETTING__NETWORK)) + + else: + # This view should display the "naked" seed's fingerprint. Normally the + # just-loaded seed would be naked, but this is special handling for the + # screenshot generator which creates a pending seed w/a passphrase already + # set. + passphrase = self.seed.passphrase + self.seed.set_passphrase("") + self.fingerprint = self.seed.get_fingerprint(network=self.settings.get_value(SettingsConstants.SETTING__NETWORK)) + self.seed.set_passphrase(passphrase) def run(self): @@ -232,8 +245,28 @@ class SeedFinalizeView(View): return Destination(SeedOptionsView, view_args={"seed_num": seed_num}, clear_history=True) elif button_data[selected_menu_num] == PASSPHRASE: + if self.settings.get_value(attr_name=SettingsConstants.SETTING__PASSPHRASE_WARNING) == SettingsConstants.OPTION__ENABLED: + return Destination(SeedPassphraseWarningView) + + else: + return Destination(SeedAddPassphraseView) + + + +class SeedPassphraseWarningView(View): + def run(self): + selected_menu_num = WarningScreen( + status_headline=None, + text=_("""BIP-39 passphrase changes your seed, resulting in new xpubs, wallets, etc.\nBe sure you know what you're doing!""") + ).display() + + if selected_menu_num == 0: + # User clicked "I Understand" return Destination(SeedAddPassphraseView) + elif selected_menu_num == RET_CODE__BACK_BUTTON: + return Destination(BackStackView) + class SeedAddPassphraseView(View): @@ -432,10 +465,9 @@ class SeedBackupView(View): EXPORT_SEEDQR = _("Export as SeedQR") button_data = [VIEW_WORDS, EXPORT_SEEDQR] - selected_menu_num = ButtonListScreen( - title=_("Backup Seed"), + selected_menu_num = seed_screens.SeedBackupScreen( button_data=button_data, - is_bottom_list=True, + has_passphrase=self.seed.has_passphrase, ).display() if selected_menu_num == RET_CODE__BACK_BUTTON: @@ -999,6 +1031,8 @@ class SeedTranscribeSeedQRFormatView(View): button_data = [STANDARD, COMPACT] + print(f"button_data: {button_data}") + selected_menu_num = seed_screens.SeedTranscribeSeedQRFormatScreen( title=_("SeedQR Format"), button_data=button_data, diff --git a/src/seedsigner/views/view.py b/src/seedsigner/views/view.py index dcc3f4b5..d89c1c03 100644 --- a/src/seedsigner/views/view.py +++ b/src/seedsigner/views/view.py @@ -144,7 +144,6 @@ class UnhandledExceptionView(View): text=self.error[1] + "\n" + self.error[2], button_data=[_("OK")], show_back_button=False, - allow_text_overflow=True, # Fit what we can, let the rest go off the edges ).display() return Destination(MainMenuView, clear_history=True) diff --git a/tests/screenshot_generator/generator.py b/tests/screenshot_generator/generator.py index 786c05ab..4fe8653c 100644 --- a/tests/screenshot_generator/generator.py +++ b/tests/screenshot_generator/generator.py @@ -1,3 +1,4 @@ +import embit import os import pathlib import pytest @@ -7,9 +8,13 @@ from seedsigner.controller import Controller from seedsigner.gui.renderer import Renderer from seedsigner.hardware.buttons import HardwareButtons from seedsigner.hardware.camera import Camera +from seedsigner.models.decode_qr import DecodeQR +from seedsigner.models.qr_type import QRType +from seedsigner.models.seed import Seed from seedsigner.models.settings import Settings -from seedsigner.models.settings_definition import SettingsConstants -from seedsigner.views import main_menu_views, scan_views, seed_views, settings_views, tools_views +from seedsigner.models.settings_definition import SettingsConstants, SettingsDefinition +from seedsigner.views import (main_menu_views, psbt_views, scan_views, seed_views, + settings_views, tools_views) from seedsigner.views.view import View from .utils import ScreenshotComplete, ScreenshotRenderer @@ -28,7 +33,7 @@ def test_generate_screenshots(): Camera.get_instance = Mock() # Prep the ScreenshotRenderer that will be patched over the normal Renderer - screenshot_root = "/Users/kdmukai/dev/seedsigner_screenshots" + screenshot_root = "/Users/kdmukai/dev/seedsigner-screenshots" ScreenshotRenderer.configure_instance() screenshot_renderer: ScreenshotRenderer = ScreenshotRenderer.get_instance() @@ -36,37 +41,121 @@ def test_generate_screenshots(): Renderer.configure_instance = Mock() Renderer.get_instance = Mock(return_value=screenshot_renderer) + controller = Controller.get_instance() + + # Set up some test data that we'll need in the `Controller` for certain Views + mnemonic_12 = "forum undo fragile fade shy sign arrest garment culture tube off merit".split() + mnemonic_24 = "attack pizza motion avocado network gather crop fresh patrol unusual wild holiday candy pony ranch winter theme error hybrid van cereal salon goddess expire".split() + mnemonic_12b = ["abandon"] * 11 + ["about"] + seed_12 = Seed(mnemonic=mnemonic_12, passphrase="cap*BRACKET3stove", wordlist_language_code=SettingsConstants.WORDLIST_LANGUAGE__ENGLISH) + seed_12b = Seed(mnemonic=mnemonic_12b, wordlist_language_code=SettingsConstants.WORDLIST_LANGUAGE__ENGLISH) + seed_24 = Seed(mnemonic=mnemonic_24, passphrase="some-PASS*phrase9", wordlist_language_code=SettingsConstants.WORDLIST_LANGUAGE__ENGLISH) + controller.storage.seeds.append(seed_12) + controller.storage.seeds.append(seed_12b) + controller.storage.set_pending_seed(seed_24) + + # Load a PSBT into memory + BASE64_PSBT_1 = """cHNidP8BAP06AQIAAAAC5l4E3oEjI+H0im8t/K2nLmF5iJFdKEiuQs8ESveWJKcAAAAAAP3///8iBZMRhYIq4s/LmnTmKBi79M8ITirmsbO++63evK4utwAAAAAA/f///wZYQuoDAAAAACIAIAW5jm3UnC5fyjKCUZ8LTzjENtb/ioRTaBMXeSXsB3n+bK2fCgAAAAAWABReJY7akT1+d+jx475yBRWORdBd7VxbUgUAAAAAFgAU4wj9I/jB3GjNQudNZAca+7g9R16iWtYOAAAAABYAFIotPApLZlfscg8f3ppKqO3qA5nv7BnMFAAAAAAiACAs6SGc8qv4FwuNl0G0SpMZG8ODUEk5RXiWUcuzzw5iaRSfAhMAAAAAIgAgW0f5QxQIgVCGQqKzsvfkXZjUxdFop5sfez6Pt8mUbmZ1AgAAAAEAkgIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////BQIRAgEB/////wJAvkAlAAAAACIAIIRPoo2LvkrwrhrYFhLhlP43izxbA4Eo6Y6iFFiQYdXRAAAAAAAAAAAmaiSqIant4vYcP3HR3v0/qZnfo2lTdVxpBol5mWK0i+vYNpdOjPkAAAAAAQErQL5AJQAAAAAiACCET6KNi75K8K4a2BYS4ZT+N4s8WwOBKOmOohRYkGHV0QEFR1EhArGhNdUqlR4BAOLGTMrY2ZJYTQNRudp7fU7i8crRJqgEIQNDxn7PjUzvsP6KYw4s7dmoZE0qO1K6MaM+2ScRZ7hyxFKuIgYCsaE11SqVHgEA4sZMytjZklhNA1G52nt9TuLxytEmqAQcc8XaCjAAAIABAACAAAAAgAIAAIAAAAAAAwAAACIGA0PGfs+NTO+w/opjDizt2ahkTSo7Uroxoz7ZJxFnuHLEHCK94akwAACAAQAAgAAAAIACAACAAAAAAAMAAAAAAQCSAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8FAhACAQH/////AkC+QCUAAAAAIgAghE+ijYu+SvCuGtgWEuGU/jeLPFsDgSjpjqIUWJBh1dEAAAAAAAAAACZqJKohqe3i9hw/cdHe/T+pmd+jaVN1XGkGiXmZYrSL69g2l06M+QAAAAABAStAvkAlAAAAACIAIIRPoo2LvkrwrhrYFhLhlP43izxbA4Eo6Y6iFFiQYdXRAQVHUSECsaE11SqVHgEA4sZMytjZklhNA1G52nt9TuLxytEmqAQhA0PGfs+NTO+w/opjDizt2ahkTSo7Uroxoz7ZJxFnuHLEUq4iBgKxoTXVKpUeAQDixkzK2NmSWE0DUbnae31O4vHK0SaoBBxzxdoKMAAAgAEAAIAAAACAAgAAgAAAAAADAAAAIgYDQ8Z+z41M77D+imMOLO3ZqGRNKjtSujGjPtknEWe4csQcIr3hqTAAAIABAACAAAAAgAIAAIAAAAAAAwAAAAABAUdRIQJ5XLCBS0hdo4NANq4lNhimzhyHj7dvObmPAwNj8L2xASEC9mwwoH28/WHnxbb6z05sJ/lHuvrLs/wOooHgFn5ulI1SriICAnlcsIFLSF2jg0A2riU2GKbOHIePt285uY8DA2PwvbEBHCK94akwAACAAQAAgAAAAIACAACAAQAAAAEAAAAiAgL2bDCgfbz9YefFtvrPTmwn+Ue6+suz/A6igeAWfm6UjRxzxdoKMAAAgAEAAIAAAACAAgAAgAEAAAABAAAAAAAAAAEBR1EhAgpbWcEh7rgvRE5UaCcqzWL/TR1B/DS8UeZsKVEvuKLrIQOwLg0emiQbbxafIh69Xjtpj4eclsMhKq1y/7vYDdE7LVKuIgICCltZwSHuuC9ETlRoJyrNYv9NHUH8NLxR5mwpUS+4ouscc8XaCjAAAIABAACAAAAAgAIAAIAAAAAABQAAACICA7AuDR6aJBtvFp8iHr1eO2mPh5yWwyEqrXL/u9gN0TstHCK94akwAACAAQAAgAAAAIACAACAAAAAAAUAAAAAAQFHUSECk50GLh/YhZaLJkDq/dugU3H/WvE6rTgQuY6N57pI4ykhA/H8MdLVP9SA/Hg8l3hvibSaC1bCBzwz7kTW+rsEZ8uFUq4iAgKTnQYuH9iFlosmQOr926BTcf9a8TqtOBC5jo3nukjjKRxzxdoKMAAAgAEAAIAAAACAAgAAgAAAAAAGAAAAIgID8fwx0tU/1ID8eDyXeG+JtJoLVsIHPDPuRNb6uwRny4UcIr3hqTAAAIABAACAAAAAgAIAAIAAAAAABgAAAAA=""" + decoder = DecodeQR() + decoder.add_data(BASE64_PSBT_1) + controller.psbt = decoder.get_psbt() + controller.psbt_seed = seed_12b + + # Multisig wallet descriptor for the multisig in the above PSBT + MULTISIG_WALLET_DESCRIPTOR = """wsh(sortedmulti(1,[22bde1a9/48h/1h/0h/2h]tpubDFfsBrmpj226ZYiRszYi2qK6iGvh2vkkghfGB2YiRUVY4rqqedHCFEgw12FwDkm7rUoVtq9wLTKc6BN2sxswvQeQgp7m8st4FP8WtP8go76/{0,1}/*,[73c5da0a/48h/1h/0h/2h]tpubDFH9dgzveyD8zTbPUFuLrGmCydNvxehyNdUXKJAQN8x4aZ4j6UZqGfnqFrD4NqyaTVGKbvEW54tsvPTK2UoSbCC1PJY8iCNiwTL3RWZEheQ/{0,1}/*))#3jhtf6yx""" + controller.multisig_wallet_descriptor = embit.descriptor.Descriptor.from_string(MULTISIG_WALLET_DESCRIPTOR) + # Parse the main `babel/messages.pot` for overall stats messages_source_path = os.path.join(pathlib.Path(__file__).parent.resolve().parent.resolve().parent.resolve(), "babel", "messages.pot") with open(messages_source_path, 'r') as messages_source_file: num_source_messages = messages_source_file.read().count("msgid \"") - 1 - def screencap_view(view_cls: View, view_args: dict={}): - screenshot_renderer.set_screenshot_filename(view_cls.__name__ + ".png") - - with pytest.raises(ScreenshotComplete): + def screencap_view(view_cls: View, view_name: str, view_args: dict={}): + screenshot_renderer.set_screenshot_filename(f"{view_name}.png") + try: + print(f"Running {view_name}") view_cls(**view_args).run() + except ScreenshotComplete: + # Slightly hacky way to exit ScreenshotRenderer as expected + pass + print(f"Completed {view_name}") + except Exception as e: + # Something else went wrong + print(repr(e)) + raise e + + # Automatically populate all Settings options Views + settings_views_list = [] + settings_views_list.append(settings_views.SettingsMenuView) + for settings_entry in SettingsDefinition.settings_entries: + if settings_entry.visibility == SettingsConstants.VISIBILITY__HIDDEN: + continue + settings_views_list.append((settings_views.SettingsEntryUpdateSelectionView, dict(attr_name=settings_entry.attr_name), f"SettingsEntryUpdateSelectionView_{settings_entry.attr_name}")) + settings_views_list.append(settings_views.IOTestView) + settings_views_list.append(settings_views.DonateView) + - screenshot_list = [ - main_menu_views.MainMenuView, - main_menu_views.PowerOffView, + screenshot_sections = { + "Main Menu Views": [ + main_menu_views.MainMenuView, + main_menu_views.PowerOffView, + (scan_views.SettingsUpdatedView, dict(config_name="Keith's Settings")), + ], + "Seed Views": [ + seed_views.SeedsMenuView, + seed_views.LoadSeedView, + seed_views.SeedMnemonicEntryView, + seed_views.SeedMnemonicInvalidView, + seed_views.SeedFinalizeView, + seed_views.SeedPassphraseWarningView, + seed_views.SeedAddPassphraseView, + seed_views.SeedReviewPassphraseView, + (seed_views.SeedOptionsView, dict(seed_num=0)), + (seed_views.SeedBackupView, dict(seed_num=0)), + (seed_views.SeedWordsWarningView, dict(seed_num=0)), + (seed_views.SeedWordsView, dict(seed_num=0)), + (seed_views.SeedWordsView, dict(seed_num=0, page_index=2), "SeedWordsView_2"), + (seed_views.SeedTranscribeSeedQRFormatView, dict(seed_num=0)), + (seed_views.SeedTranscribeSeedQRWarningView, dict(seed_num=0)), + (seed_views.SeedTranscribeSeedQRWholeQRView, dict(seed_num=0, seedqr_format=QRType.SEED__SEEDQR, num_modules=25), "SeedTranscribeSeedQRWholeQRView_12_Standard"), + (seed_views.SeedTranscribeSeedQRWholeQRView, dict(seed_num=0, seedqr_format=QRType.SEED__COMPACTSEEDQR, num_modules=21), "SeedTranscribeSeedQRWholeQRView_12_Compact"), - (scan_views.SettingsUpdatedView, dict(config_name="Keith's Settings")), + # Screenshot doesn't render properly due to how the transparency mask is pre-rendered + # (seed_views.SeedTranscribeSeedQRZoomedInView, dict(seed_num=0, seedqr_format=QRType.SEED__SEEDQR)), - seed_views.LoadSeedView, - seed_views.SeedMnemonicEntryView, - seed_views.SeedMnemonicInvalidView, - (seed_views.SeedWordsWarningView, dict(seed_num=0)), + (seed_views.SeedTranscribeSeedQRConfirmQRPromptView, dict(seed_num=0)), - settings_views.SettingsMenuView, - (settings_views.SettingsEntryUpdateSelectionView, dict(attr_name=SettingsConstants.SETTING__BTC_DENOMINATION)), - settings_views.IOTestView, - settings_views.DonateView, + # Screenshot can't render live preview screens + # (seed_views.SeedTranscribeSeedQRConfirmScanView, dict(seed_num=0)), - tools_views.ToolsMenuView, - tools_views.ToolsDiceEntropyMnemonicLengthView, - (tools_views.ToolsDiceEntropyEntryView, dict(total_rolls=50)), - ] + seed_views.LoadMultisigWalletDescriptorView, + seed_views.MultisigWalletDescriptorView, + ], + "PSBT Views": [ + psbt_views.PSBTSelectSeedView, + psbt_views.PSBTOverviewView, + psbt_views.PSBTUnsupportedScriptTypeWarningView, + psbt_views.PSBTNoChangeWarningView, + psbt_views.PSBTMathView, + (psbt_views.PSBTAddressDetailsView, dict(address_num=0)), + + # TODO: Render Multisig change w/ and w/out the multisig wallet descriptor onboard + (psbt_views.PSBTChangeDetailsView, dict(change_address_num=0)), + (psbt_views.PSBTAddressVerificationFailedView, dict(is_change=True, is_multisig=False), "PSBTAddressVerificationFailedView_singlesig_change"), + (psbt_views.PSBTAddressVerificationFailedView, dict(is_change=False, is_multisig=False), "PSBTAddressVerificationFailedView_singlesig_selftransfer"), + (psbt_views.PSBTAddressVerificationFailedView, dict(is_change=True, is_multisig=True), "PSBTAddressVerificationFailedView_multisig_change"), + (psbt_views.PSBTAddressVerificationFailedView, dict(is_change=False, is_multisig=True), "PSBTAddressVerificationFailedView_multisig_selftransfer"), + psbt_views.PSBTFinalizeView, + psbt_views.PSBTSelectCoordinatorView, + psbt_views.PSBTSigningErrorView, + ], + "Tools Views": [ + tools_views.ToolsMenuView, + tools_views.ToolsDiceEntropyMnemonicLengthView, + (tools_views.ToolsDiceEntropyEntryView, dict(total_rolls=50)), + ], + "Settings Views": settings_views_list, + } main_readme = """# SeedSigner Screenshots \n\n""" @@ -79,24 +168,42 @@ def test_generate_screenshots(): # Report the translation progress if locale != SettingsConstants.LOCALE__ENGLISH: + + # DEBUGGING + continue + # /DEBUGGING + translated_messages_path = os.path.join(pathlib.Path(__file__).parent.resolve().parent.resolve().parent.resolve(), "src", "seedsigner", "resources", "babel", locale, "LC_MESSAGES", "messages.po") with open(translated_messages_path, 'r') as translation_file: locale_translations = translation_file.read() num_locale_translations = locale_translations.count("msgid \"") - locale_translations.count("""msgstr ""\n\n""") - 1 - locale_readme += f"Translation progress: {num_locale_translations / num_source_messages:.1%}\n\n" + locale_readme += f"## Translation progress: {num_locale_translations / num_source_messages:.1%}\n\n" locale_readme += "---\n\n" - for screenshot in screenshot_list: - if type(screenshot) == tuple: - view_cls, view_args = screenshot - else: - view_cls = screenshot - view_args = {} - screencap_view(view_cls, view_args) - locale_readme += f"{view_cls.__name__}:\n\n" - locale_readme += f"""\n\n""" - locale_readme += "---\n\n" + for section_name, screenshot_list in screenshot_sections.items(): + locale_readme += "\n\n---\n\n" + locale_readme += f"## {section_name}\n\n" + locale_readme += """""" + locale_readme += f"""
""" + for screenshot in screenshot_list: + if type(screenshot) == tuple: + if len(screenshot) == 2: + view_cls, view_args = screenshot + view_name = view_cls.__name__ + elif len(screenshot) == 3: + view_cls, view_args, view_name = screenshot + else: + view_cls = screenshot + view_args = {} + view_name = view_cls.__name__ + + screencap_view(view_cls, view_name, view_args) + locale_readme += """""" + locale_readme += f"""""" + locale_readme += """
{view_name}

""" + + locale_readme += "
" with open(os.path.join(screenshot_renderer.screenshot_path, "README.md"), 'w') as readme_file: readme_file.write(locale_readme)