From 06d7056b26f5f662670e189e5b3e01f5d4fdd437 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Wed, 27 Nov 2024 00:27:32 -0300 Subject: [PATCH 01/86] initial version of tools > krux apps --- src/krux/encryption.py | 4 +- src/krux/krux_settings.py | 4 +- src/krux/pages/tools.py | 78 ++++++++++++++++++++++++++++++++++++++- src/krux/sd_card.py | 1 + 4 files changed, 83 insertions(+), 4 deletions(-) diff --git a/src/krux/encryption.py b/src/krux/encryption.py index 5599548d4..d8003c7ec 100644 --- a/src/krux/encryption.py +++ b/src/krux/encryption.py @@ -28,12 +28,12 @@ import ucryptolib from .baseconv import base_encode, base_decode from .sd_card import SDHandler -from .krux_settings import Settings, PBKDF2_HMAC_ECB, PBKDF2_HMAC_CBC +from .krux_settings import Settings, PBKDF2_HMAC_ECB, PBKDF2_HMAC_CBC, FLASH_PATH from embit.wordlists.bip39 import WORDLIST MNEMONICS_FILE = "seeds.json" -FLASH_PATH = "/flash/" +FLASH_PATH = "/" + FLASH_PATH + "/" VERSION_MODE = { "AES-ECB": ucryptolib.MODE_ECB, diff --git a/src/krux/krux_settings.py b/src/krux/krux_settings.py index bb5638445..f532eef46 100644 --- a/src/krux/krux_settings.py +++ b/src/krux/krux_settings.py @@ -34,7 +34,7 @@ BAUDRATES = [1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200] -TC_CODE_PATH = "/flash/tcc" +TC_CODE_PATH = "/" + FLASH_PATH + "/tcc" TC_CODE_PBKDF2_ITERATIONS = 100000 DEFAULT_LOCALE = "en-US" @@ -421,6 +421,7 @@ class SecuritySettings(SettingsNamespace): auto_shutdown = NumberSetting(int, "auto_shutdown", 10, [0, 60]) hide_mnemonic = CategorySetting("hide_mnemonic", False, [False, True]) boot_flash_hash = CategorySetting("boot_flash_hash", False, [False, True]) + allow_kapp = CategorySetting("allow_kapp", False, [False, True]) def label(self, attr): """Returns a label for UI when given a setting name or namespace""" @@ -428,6 +429,7 @@ def label(self, attr): "auto_shutdown": t("Shutdown Time"), "hide_mnemonic": t("Hide Mnemonics"), "boot_flash_hash": t("TC Flash Hash at Boot"), + "allow_kapp": t("Enable Krux apps"), }[attr] diff --git a/src/krux/pages/tools.py b/src/krux/pages/tools.py index 54f86f17b..3b9ae6ab5 100644 --- a/src/krux/pages/tools.py +++ b/src/krux/pages/tools.py @@ -43,12 +43,15 @@ class Tools(Page): """Krux generic tools""" def __init__(self, ctx): + self.ctx = ctx + super().__init__( ctx, Menu( ctx, [ (t("Check SD Card"), self.sd_check), + (t("Load Krux app"), self.sd_load_app), (t("Print Test QR"), self.print_test), (t("Create QR Code"), self.create_qr), (t("Descriptor Addresses"), self.descriptor_addresses), @@ -57,7 +60,80 @@ def __init__(self, ctx): ], ), ) - self.ctx = ctx + + def sd_load_app(self): + """Handler for the 'Load Krux app' menu item""" + text = t("Execute a signed Krux app?") + if not self.prompt(text, self.ctx.display.height() // 2): + return MENU_CONTINUE + + # Check if Krux app is enabled + from krux.krux_settings import Settings + if not Settings().security.allow_kapp: + self.flash_error(t("Allow in settings first!")) + return MENU_CONTINUE + + if not self.has_sd_card(): + self.flash_error(t("SD card not detected.")) + return MENU_CONTINUE + + # Prompt user for .mpy file + from krux.pages.utils import Utils + from krux.sd_card import SD_PATH + from krux.sd_card import MPY_FILE_EXTENSION + + utils = Utils(self.ctx) + filename, data = utils.load_file( + MPY_FILE_EXTENSION, prompt=False + ) + del utils + + if not filename: + return MENU_CONTINUE + + + # Check signature of the file from SD... + # TODO: check sign, if ok continue + + + # Delete any .mpy files from flash VFS to avoid any malicious code import/execution + import os + from krux.settings import FLASH_PATH + + path_prefix = "/" + FLASH_PATH + "/" + for file in os.listdir(path_prefix): + if file.endswith(MPY_FILE_EXTENSION): + os.remove(path_prefix + file) + + # Copy kapp from SD to flash VFS + kapp_filename = "kapp" + with open(path_prefix + kapp_filename + MPY_FILE_EXTENSION, 'wb') as kapp_file: + kapp_file.write(data) + + # Check signature of the file from flash VFS... + # TODO: check sign, if ok continue + + + # Allows import of files in flash VFS + # TODO: Also dinamically enable vsf->execution + os.chdir("/" + FLASH_PATH) + + # Import and exec the kapp + print(path_prefix + kapp_filename) + i_kapp = None + try: + i_kapp = __import__(kapp_filename) + print(i_kapp) + i_kapp.run() + except Exception as e: + print(e) + self.flash_error(t("Could not execute") + " " + kapp_filename) + return MENU_CONTINUE + + + # After execution restart Krux for security + from ..power import power_manager + power_manager.shutdown() def flash_tools(self): """Handler for the 'Flash Tools' menu item""" diff --git a/src/krux/sd_card.py b/src/krux/sd_card.py index 5aa71271a..11ee8a3da 100644 --- a/src/krux/sd_card.py +++ b/src/krux/sd_card.py @@ -32,6 +32,7 @@ PUBKEY_FILE_EXTENSION = ".pub" BMP_IMAGE_EXTENSION = ".bmp" PBM_IMAGE_EXTENSION = ".pbm" +MPY_FILE_EXTENSION = ".mpy" class SDHandler: From afb42c994fe8b0f6fa701bf6235b4465f4c479f4 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sat, 30 Nov 2024 00:04:57 -0300 Subject: [PATCH 02/86] Working Krux apps with simulator --- simulator/kapp.py | 3 ++ simulator/kruxsim/mocks/uopen.py | 5 +- simulator/kruxsim/mocks/uos.py | 16 +++++- src/krux/pages/tools.py | 83 ++++++++++++++++++++++---------- 4 files changed, 79 insertions(+), 28 deletions(-) create mode 100644 simulator/kapp.py diff --git a/simulator/kapp.py b/simulator/kapp.py new file mode 100644 index 000000000..223ae6939 --- /dev/null +++ b/simulator/kapp.py @@ -0,0 +1,3 @@ +print("Print inside kapp.py") +def run(): + print("run func kapp.py") diff --git a/simulator/kruxsim/mocks/uopen.py b/simulator/kruxsim/mocks/uopen.py index b718ccb8c..372b2cf15 100644 --- a/simulator/kruxsim/mocks/uopen.py +++ b/simulator/kruxsim/mocks/uopen.py @@ -25,7 +25,10 @@ def new_open(path, *args, **kwargs): - path = path.lstrip("/") if path.startswith("/sd") else path + if path.startswith("/sd"): + path = path.lstrip("/") + elif path.startswith("/flash"): + path = path.replace("/flash", "sd") return old_open(path, *args, **kwargs) diff --git a/simulator/kruxsim/mocks/uos.py b/simulator/kruxsim/mocks/uos.py index f3da26a89..beca270d6 100644 --- a/simulator/kruxsim/mocks/uos.py +++ b/simulator/kruxsim/mocks/uos.py @@ -23,17 +23,29 @@ old_listdir = os.listdir old_remove = os.remove +old_chdir = os.chdir def new_listdir(path, *args, **kwargs): - path = path.lstrip("/") if path.startswith("/sd") else path + if path.startswith("/sd"): + path = path.lstrip("/") + elif path.startswith("/flash"): + path = path.replace("/flash", "sd") return old_listdir(path, *args, **kwargs) def new_remove(path, *args, **kwargs): - path = path.lstrip("/") if path.startswith("/sd") else path + if path.startswith("/sd"): + path = path.lstrip("/") + elif path.startswith("/flash"): + return return old_remove(path, *args, **kwargs) +# Avoid Krux code to change simulator execution dir +def new_chdir(path): + return + setattr(os, "listdir", new_listdir) setattr(os, "remove", new_remove) +setattr(os, "chdir", new_chdir) diff --git a/src/krux/pages/tools.py b/src/krux/pages/tools.py index 3b9ae6ab5..aff842760 100644 --- a/src/krux/pages/tools.py +++ b/src/krux/pages/tools.py @@ -51,7 +51,7 @@ def __init__(self, ctx): ctx, [ (t("Check SD Card"), self.sd_check), - (t("Load Krux app"), self.sd_load_app), + (t("Load Krux app"), self.sd_load_app), (t("Print Test QR"), self.print_test), (t("Create QR Code"), self.create_qr), (t("Descriptor Addresses"), self.descriptor_addresses), @@ -61,17 +61,52 @@ def __init__(self, ctx): ), ) - def sd_load_app(self): + def _check_signature(self, path_prefix, filename, data): + from embit import ec + from ..metadata import SIGNER_PUBKEY + from krux.sd_card import SIGNATURE_FILE_EXTENSION + + pubkey = None + try: + pubkey = ec.PublicKey.from_string(SIGNER_PUBKEY) + except: + self.flash_error(t("Invalid public key")) + return MENU_CONTINUE + + sig = None + try: + sig = open(path_prefix + filename + SIGNATURE_FILE_EXTENSION, "rb").read() + except: + self.flash_error(t("Missing signature file")) + return MENU_CONTINUE + + try: + # Parse, serialize, and reparse to ensure signature is compact prior to verification + sig = ec.Signature.parse(ec.Signature.parse(sig).serialize()) + + import hashlib + + if not pubkey.verify(sig, hashlib.sha256(data).digest()): + self.flash_error(t("Bad signature")) + return MENU_CONTINUE + except: + self.flash_error(t("Bad signature")) + return MENU_CONTINUE + + return None + + def sd_load_app(self): # pylint: disable=R1710 """Handler for the 'Load Krux app' menu item""" text = t("Execute a signed Krux app?") if not self.prompt(text, self.ctx.display.height() // 2): return MENU_CONTINUE - + # Check if Krux app is enabled from krux.krux_settings import Settings + if not Settings().security.allow_kapp: self.flash_error(t("Allow in settings first!")) - return MENU_CONTINUE + return MENU_CONTINUE if not self.has_sd_card(): self.flash_error(t("SD card not detected.")) @@ -79,60 +114,58 @@ def sd_load_app(self): # Prompt user for .mpy file from krux.pages.utils import Utils - from krux.sd_card import SD_PATH - from krux.sd_card import MPY_FILE_EXTENSION + from krux.sd_card import MPY_FILE_EXTENSION, SIGNATURE_FILE_EXTENSION, SD_PATH utils = Utils(self.ctx) - filename, data = utils.load_file( - MPY_FILE_EXTENSION, prompt=False - ) + filename, data = utils.load_file(MPY_FILE_EXTENSION, prompt=False) del utils if not filename: return MENU_CONTINUE - - - # Check signature of the file from SD... - # TODO: check sign, if ok continue + # Check signature of .mpy file in SD + path_prefix = "/%s/" % SD_PATH + if self._check_signature(path_prefix, filename, data) == MENU_CONTINUE: + return MENU_CONTINUE + sig_data = open(path_prefix + filename + SIGNATURE_FILE_EXTENSION, "rb").read() # Delete any .mpy files from flash VFS to avoid any malicious code import/execution import os from krux.settings import FLASH_PATH - path_prefix = "/" + FLASH_PATH + "/" + path_prefix = "/%s/" % FLASH_PATH for file in os.listdir(path_prefix): if file.endswith(MPY_FILE_EXTENSION): os.remove(path_prefix + file) - - # Copy kapp from SD to flash VFS + + # Copy kapp + sig from SD to flash VFS kapp_filename = "kapp" - with open(path_prefix + kapp_filename + MPY_FILE_EXTENSION, 'wb') as kapp_file: + with open(path_prefix + kapp_filename + MPY_FILE_EXTENSION, "wb") as kapp_file: kapp_file.write(data) - # Check signature of the file from flash VFS... - # TODO: check sign, if ok continue - + with open( + path_prefix + kapp_filename + MPY_FILE_EXTENSION + SIGNATURE_FILE_EXTENSION, + "wb", + ) as kapp_sig_file: + kapp_sig_file.write(sig_data) # Allows import of files in flash VFS # TODO: Also dinamically enable vsf->execution os.chdir("/" + FLASH_PATH) # Import and exec the kapp - print(path_prefix + kapp_filename) i_kapp = None try: i_kapp = __import__(kapp_filename) - print(i_kapp) i_kapp.run() except Exception as e: print(e) - self.flash_error(t("Could not execute") + " " + kapp_filename) + self.flash_error(t("Could not execute %s") % filename) return MENU_CONTINUE - - # After execution restart Krux for security + # After execution restart Krux (better safe than sorry) from ..power import power_manager + power_manager.shutdown() def flash_tools(self): From 933e26e3afb01bad9f575713e8316ba6e49be5ed Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sat, 30 Nov 2024 00:26:43 -0300 Subject: [PATCH 03/86] translations --- i18n/translations/de-DE.json | 5 +++++ i18n/translations/es-MX.json | 5 +++++ i18n/translations/fr-FR.json | 5 +++++ i18n/translations/ja-JP.json | 5 +++++ i18n/translations/ko-KR.json | 5 +++++ i18n/translations/nl-NL.json | 5 +++++ i18n/translations/pt-BR.json | 5 +++++ i18n/translations/ru-RU.json | 5 +++++ i18n/translations/tr-TR.json | 5 +++++ i18n/translations/vi-VN.json | 5 +++++ i18n/translations/zh-CN.json | 5 +++++ src/krux/translations/__init__.py | 5 +++++ src/krux/translations/de.py | 5 +++++ src/krux/translations/es.py | 5 +++++ src/krux/translations/fr.py | 5 +++++ src/krux/translations/ja.py | 5 +++++ src/krux/translations/ko.py | 5 +++++ src/krux/translations/nl.py | 5 +++++ src/krux/translations/pt.py | 5 +++++ src/krux/translations/ru.py | 5 +++++ src/krux/translations/tr.py | 5 +++++ src/krux/translations/vi.py | 5 +++++ src/krux/translations/zh.py | 5 +++++ 23 files changed, 115 insertions(+) diff --git a/i18n/translations/de-DE.json b/i18n/translations/de-DE.json index f01f7d9d2..c11c71a40 100644 --- a/i18n/translations/de-DE.json +++ b/i18n/translations/de-DE.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "Zusätzliche Entropie von der Kamera für den AES-CBC-Modus erforderlich", "Address": "Adresse", "Align camera and backup plate properly.": "Richte Kamera und Sicherungsplatte richtig aus.", + "Allow in settings first!": "Erlaube zuerst Einstellungen!", "Anti-glare disabled": "Blendschutz deaktiviert", "Anti-glare enabled": "Blendschutz aktiviert", "Appearance": "Aussehen", @@ -45,6 +46,7 @@ "Checked %d addresses with no matches.": "Überprüfte %d Adresse ohne Übereinstimmungen.", "Checking for SD card..": "Suche nach SD-Karte..", "Confirm Tamper Check Code": "Bestätigen Sie den Tamper Check Code", + "Could not execute %s": "Ausführung nicht möglich.", "Create QR Code": "Erstelle QR-Code", "Create QR code from text?": "QR-Code aus Text erzeugen?", "Created:": "Erstellt:", @@ -66,6 +68,7 @@ "Double mnemonic": "Doppelte Gedächtnisstütze", "Driver": "Driver", "Empty": "Leer", + "Enable Krux apps": "Krux-Apps aktivieren", "Encrypted": "Verschlüsselt", "Encrypted QR Code": "Verschlüsselter QR-Code", "Encrypted mnemonic was not stored": "Verschlüsselte Mnemonic wurde nicht gespeichert", @@ -82,6 +85,7 @@ "Erasing user's data..": "Benutzerdaten werden gelöscht..", "Error:": "Fehler:", "Esc": "Esc", + "Execute a signed Krux app?": "Eine signierte Krux-App ausführen?", "Explore files?": "Dateien durchsuchen?", "Exporting to SD card..": "Auf SD-Karte exportieren..", "Extended Public Key": "Öffentlicher Schlüssel", @@ -145,6 +149,7 @@ "Length: %s": "Länge: %s", "Line Delay": "Leitungsverzögerung", "Line:": "Linie:", + "Load Krux app": "Krux-App laden", "Load Mnemonic": "Mnemonic laden", "Load Wallet": "Wallet laden", "Load a trusted wallet descriptor to view addresses?": "Einen vertrauenswürdigen Wallet-Deskriptor laden, um Adressen anzuzeigen?", diff --git a/i18n/translations/es-MX.json b/i18n/translations/es-MX.json index 48c3a5fac..abdfe17cb 100644 --- a/i18n/translations/es-MX.json +++ b/i18n/translations/es-MX.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "Se requiere entropía adicional de la cámara para el modo AES-CBC", "Address": "Dirección", "Align camera and backup plate properly.": "Alinea la cámara y la placa de respaldo correctamente.", + "Allow in settings first!": "¡Permitir en la configuración primero!", "Anti-glare disabled": "Anti-reflejo desactivado", "Anti-glare enabled": "Anti-reflejo habilitado", "Appearance": "Apariencia", @@ -45,6 +46,7 @@ "Checked %d addresses with no matches.": "Comprobado %d direcciones sin coincidencias.", "Checking for SD card..": "Comprobación de la tarjeta SD..", "Confirm Tamper Check Code": "Confirmar el código de verificación", + "Could not execute %s": "no se pudo ejecutar [%1]", "Create QR Code": "Crear Código QR", "Create QR code from text?": "¿Crear código QR desde texto?", "Created:": "Creado:", @@ -66,6 +68,7 @@ "Double mnemonic": "Doble mnemónico", "Driver": "Operador", "Empty": "Vacío", + "Enable Krux apps": "Habilitar aplicaciones Krux", "Encrypted": "Cifrado", "Encrypted QR Code": "Código QR Cifrado", "Encrypted mnemonic was not stored": "Mnemónico cifrado no se almacenó", @@ -82,6 +85,7 @@ "Erasing user's data..": "Borrando los datos del usuario..", "Error:": "Error:", "Esc": "Esc", + "Execute a signed Krux app?": "¿Ejecutar una aplicación Krux firmada?", "Explore files?": "¿Explorar archivos?", "Exporting to SD card..": "Exportando a la tarjeta SD..", "Extended Public Key": "Clave Pública Extendida", @@ -145,6 +149,7 @@ "Length: %s": "Longitud: %s", "Line Delay": "Retraso de Línea", "Line:": "Línea:", + "Load Krux app": "Cargar aplicación Krux", "Load Mnemonic": "Importar Mnemónico", "Load Wallet": "Cargar Cartera", "Load a trusted wallet descriptor to view addresses?": "¿Cargar un descriptor de monedero de confianza para ver las direcciones?", diff --git a/i18n/translations/fr-FR.json b/i18n/translations/fr-FR.json index ff1232d4e..ee64ab919 100644 --- a/i18n/translations/fr-FR.json +++ b/i18n/translations/fr-FR.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "Entropie supplémentaire de la caméra requise pour le mode AES-CBC", "Address": "Adresse", "Align camera and backup plate properly.": "Alignez correctement la caméra et plaque de sauvegarde.", + "Allow in settings first!": "Autoriser d'abord dans les paramètres !", "Anti-glare disabled": "Anti-éblouissement désactivé", "Anti-glare enabled": "Anti-éblouissement activé", "Appearance": "Apparence", @@ -45,6 +46,7 @@ "Checked %d addresses with no matches.": "%d adresses vérifiées sans correspondance.", "Checking for SD card..": "Vérification de la carte SD..", "Confirm Tamper Check Code": "Confirmer le code de non compromis", + "Could not execute %s": "Impossible d'exécuter [%1]", "Create QR Code": "Créer un code QR", "Create QR code from text?": "Créer un code QR à partir d'un texte ?", "Created:": "Créé :", @@ -66,6 +68,7 @@ "Double mnemonic": "Double mnémonique", "Driver": "Pilote", "Empty": "Vide", + "Enable Krux apps": "Activer les applications Krux", "Encrypted": "Chiffré", "Encrypted QR Code": "Code QR chiffré", "Encrypted mnemonic was not stored": "Le mnémonique chiffré n'a pas été stocké", @@ -82,6 +85,7 @@ "Erasing user's data..": "Effacement des données de l'utilisateur...", "Error:": "Erreur :", "Esc": "Esc", + "Execute a signed Krux app?": "Exécuter une application Krux signée ?", "Explore files?": "Explorer des fichiers ?", "Exporting to SD card..": "Exportation vers la carte SD..", "Extended Public Key": "Clé publique", @@ -145,6 +149,7 @@ "Length: %s": "Longueur : %s", "Line Delay": "Délai de Ligne", "Line:": "Ligne :", + "Load Krux app": "Charger l'application Krux", "Load Mnemonic": "Charger Mnémonique", "Load Wallet": "Charger le portefeuille", "Load a trusted wallet descriptor to view addresses?": "Charger un descripteur de portefeuille de confiance pour afficher les adresses ?", diff --git a/i18n/translations/ja-JP.json b/i18n/translations/ja-JP.json index 51c5dc5dc..5bb21b9f5 100644 --- a/i18n/translations/ja-JP.json +++ b/i18n/translations/ja-JP.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "AES-CBCモードにはカメラからの追加エントロピーが必要です", "Address": "アドレス", "Align camera and backup plate properly.": "カメラとバックプレートを正しく整列させてください.", + "Allow in settings first!": "最初に設定で許可してください!", "Anti-glare disabled": "アンチグレアが無効", "Anti-glare enabled": "アンチグレアが有効", "Appearance": "外観", @@ -45,6 +46,7 @@ "Checked %d addresses with no matches.": "%d のアドレスを確認しましたが、一致するものはありませんでした.", "Checking for SD card..": "SDカードを確認中..", "Confirm Tamper Check Code": "改ざんチェックコードの確認", + "Could not execute %s": "%sを実行できませんでした", "Create QR Code": "QRコードを生成する", "Create QR code from text?": "テキストからQRコードを作成しますか?", "Created:": "作成されました:", @@ -66,6 +68,7 @@ "Double mnemonic": "ダブルニーモニック", "Driver": "ドライバー", "Empty": "空", + "Enable Krux apps": "Kruxアプリを有効にする", "Encrypted": "暗号化されました", "Encrypted QR Code": "暗号化されたQRコード", "Encrypted mnemonic was not stored": "暗号化されたニーモニックが保存されませんでした", @@ -82,6 +85,7 @@ "Erasing user's data..": "ユーザーのデータを消去しています..", "Error:": "エラー:", "Esc": "エスク", + "Execute a signed Krux app?": "署名入りのKruxアプリを実行しますか?", "Explore files?": "アーカイブ探索?", "Exporting to SD card..": "SDカードへのエクスポート..", "Extended Public Key": "拡張公開キー", @@ -145,6 +149,7 @@ "Length: %s": "長さ:%s", "Line Delay": "ライン遅延", "Line:": "ライン:", + "Load Krux app": "Kruxアプリを読み込む", "Load Mnemonic": "ニーモニックをロード", "Load Wallet": "ウォレットをロード", "Load a trusted wallet descriptor to view addresses?": "信頼できるウォレット記述子をロードしてアドレスを表示しますか?", diff --git a/i18n/translations/ko-KR.json b/i18n/translations/ko-KR.json index 39073943d..9718b6650 100644 --- a/i18n/translations/ko-KR.json +++ b/i18n/translations/ko-KR.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "AES-CBC 모드를 위해 카메라의 추가 엔트로피가 필요합니다", "Address": "주소", "Align camera and backup plate properly.": "카메라와 보조 플레이트를 올바르게 정렬하십시오.", + "Allow in settings first!": "먼저 설정에서 허용하세요!", "Anti-glare disabled": "눈부심방지 비활성화", "Anti-glare enabled": "눈부심방지 활성화", "Appearance": "디스플레이", @@ -45,6 +46,7 @@ "Checked %d addresses with no matches.": "일치하는 주소가 없는 %d 개를 확인했습니다.", "Checking for SD card..": "SD카드 확인 중..", "Confirm Tamper Check Code": "탬퍼 체크 코드 확인", + "Could not execute %s": "%s 을 (를) 실행할 수 없습니다", "Create QR Code": "QR 코드 생성", "Create QR code from text?": "텍스트로부터 QR코드를 생성하시겠습니까?", "Created:": "생성됨:", @@ -66,6 +68,7 @@ "Double mnemonic": "이중 니모닉", "Driver": "드라이버", "Empty": "비어 있음", + "Enable Krux apps": "Krux 앱 활성화", "Encrypted": "암호화 후 저장", "Encrypted QR Code": "암호화된 QR 코드", "Encrypted mnemonic was not stored": "암호화된 니모닉을 저장하지 못했습니다", @@ -82,6 +85,7 @@ "Erasing user's data..": "사용자의 데이터를 지우는 중...", "Error:": "오류:", "Esc": "Esc", + "Execute a signed Krux app?": "서명된 Krux 앱을 실행하시겠습니까?", "Explore files?": "파일을 탐색하시겠습니까?", "Exporting to SD card..": "SD카드로 내보내는 중..", "Extended Public Key": "XPUB 내보내기", @@ -145,6 +149,7 @@ "Length: %s": "길이: %s", "Line Delay": "줄 지연", "Line:": "줄:", + "Load Krux app": "Krux 앱 로드", "Load Mnemonic": "니모닉 불러오기", "Load Wallet": "이대로 불러오기", "Load a trusted wallet descriptor to view addresses?": "주소를 보기위해 신뢰할 수 있는 월렛 디스크립터를 불러오시겠습니까?", diff --git a/i18n/translations/nl-NL.json b/i18n/translations/nl-NL.json index c8f87eaee..4116d1d87 100644 --- a/i18n/translations/nl-NL.json +++ b/i18n/translations/nl-NL.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "Extra entropie van de camera vereist voor AES-CBC-modus", "Address": "Adres", "Align camera and backup plate properly.": "Richt de camera en back-upplaat op de juiste manier.", + "Allow in settings first!": "Sta eerst instellingen toe!", "Anti-glare disabled": "Anti reflecterend uitgeschakeld", "Anti-glare enabled": "Anti reflecterend ingeschakeld", "Appearance": "Uiterlijk", @@ -45,6 +46,7 @@ "Checked %d addresses with no matches.": "%d adressen gecontroleerd zonder overeenkomsten.", "Checking for SD card..": "SD kaart controleren..", "Confirm Tamper Check Code": "Bevestig de sabotagecontrolecode", + "Could not execute %s": "Kon ‘%s’ niet uitvoeren", "Create QR Code": "QR code maken", "Create QR code from text?": "QR code maken van tekst?", "Created:": "Aangemaakt:", @@ -66,6 +68,7 @@ "Double mnemonic": "Dubbel geheugensteuntje", "Driver": "Driver", "Empty": "Leeg", + "Enable Krux apps": "Krux-apps inschakelen", "Encrypted": "Versleuteld", "Encrypted QR Code": "Versleutelde QR code", "Encrypted mnemonic was not stored": "Versleutelde geheugensteun was niet opgeslagen", @@ -82,6 +85,7 @@ "Erasing user's data..": "Gegevens van gebruiker wissen..", "Error:": "Fout:", "Esc": "Esc", + "Execute a signed Krux app?": "Een ondertekende Krux-app uitvoeren?", "Explore files?": "Bestanden verkennen?", "Exporting to SD card..": "Exporteren naar SD kaart..", "Extended Public Key": "Uitgebreide publieke sleutel", @@ -145,6 +149,7 @@ "Length: %s": "Lengte: %s", "Line Delay": "Lijn vertraging", "Line:": "Lijn:", + "Load Krux app": "Krux-app laden", "Load Mnemonic": "Geheugensteun laden", "Load Wallet": "Portemonnee laden", "Load a trusted wallet descriptor to view addresses?": "Een vertrouwde portemonnee descriptor laden om adressen te bekijken?", diff --git a/i18n/translations/pt-BR.json b/i18n/translations/pt-BR.json index 7eb4dc1f7..5e2552af4 100644 --- a/i18n/translations/pt-BR.json +++ b/i18n/translations/pt-BR.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "Entropia adicional da câmera necessária para o modo AES-CBC", "Address": "Endereço", "Align camera and backup plate properly.": "Alinhe a câmera e a placa de backup corretamente.", + "Allow in settings first!": "Permita nas configurações primeiro!", "Anti-glare disabled": "Antirreflexo desativado", "Anti-glare enabled": "Antirreflexo ativado", "Appearance": "Aparência", @@ -45,6 +46,7 @@ "Checked %d addresses with no matches.": "Verificado %d endereços sem correspondências.", "Checking for SD card..": "Verificando o cartão SD..", "Confirm Tamper Check Code": "Confirmar Código", + "Could not execute %s": "Não foi possível executar %s", "Create QR Code": "Gerar Código QR", "Create QR code from text?": "Gerar código QR do texto?", "Created:": "Criado:", @@ -66,6 +68,7 @@ "Double mnemonic": "Duplo mnemônico", "Driver": "Driver", "Empty": "Vazio", + "Enable Krux apps": "Ativar Krux app", "Encrypted": "Criptografado", "Encrypted QR Code": "Código QR Criptografado", "Encrypted mnemonic was not stored": "Mnemonic criptografado não foi armazenado", @@ -82,6 +85,7 @@ "Erasing user's data..": "Apagando os dados do usuário..", "Error:": "Erro:", "Esc": "Esc", + "Execute a signed Krux app?": "Executar um Krux app assinado?", "Explore files?": "Explorar arquivos?", "Exporting to SD card..": "Exportando para o cartão SD..", "Extended Public Key": "Chave Pública Estendida", @@ -145,6 +149,7 @@ "Length: %s": "Comprimento: %s", "Line Delay": "Atraso de Linha", "Line:": "Linha:", + "Load Krux app": "Carregar Krux app", "Load Mnemonic": "Carregar Mnemônico", "Load Wallet": "Carregar Carteira", "Load a trusted wallet descriptor to view addresses?": "Carregar um descritor de carteira confiável para visualizar endereços?", diff --git a/i18n/translations/ru-RU.json b/i18n/translations/ru-RU.json index 5e25e708f..b51a791a2 100644 --- a/i18n/translations/ru-RU.json +++ b/i18n/translations/ru-RU.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "Для режима AES-CBC требуется дополнительная энтропия от камеры", "Address": "Адрес", "Align camera and backup plate properly.": "Правильно совместите камеру и резервную пластину.", + "Allow in settings first!": "Сначала разрешите в настройках!", "Anti-glare disabled": "Антиблик отключен", "Anti-glare enabled": "Антиблик включен", "Appearance": "Внешний Вид", @@ -45,6 +46,7 @@ "Checked %d addresses with no matches.": "Проверено %d адресов без совпадений.", "Checking for SD card..": "Проверка SD карты..", "Confirm Tamper Check Code": "Подтвердите код проверки вскрытия", + "Could not execute %s": "Не удалось выполнить %s", "Create QR Code": "Создать QR Код", "Create QR code from text?": "Создать QR код из текста?", "Created:": "Создано:", @@ -66,6 +68,7 @@ "Double mnemonic": "Двойная мнемоника", "Driver": "Драйвер", "Empty": "Пустой", + "Enable Krux apps": "Включить приложения Krux", "Encrypted": "Зашифровано", "Encrypted QR Code": "Зашифрованный QR Код", "Encrypted mnemonic was not stored": "Зашифрованная мнемоника не была сохранена", @@ -82,6 +85,7 @@ "Erasing user's data..": "Удаление данных пользователя..", "Error:": "Ошибка:", "Esc": "Выйти", + "Execute a signed Krux app?": "Выполнить подписанное приложение Krux?", "Explore files?": "Исследовать файлы?", "Exporting to SD card..": "Экспортирование на SD карту..", "Extended Public Key": "Расширенный Публичный Ключ", @@ -145,6 +149,7 @@ "Length: %s": "Длина: %s", "Line Delay": "Задержка Линии", "Line:": "Линия:", + "Load Krux app": "Загрузить приложение Krux", "Load Mnemonic": "Загрузить Мнемонику", "Load Wallet": "Загрузить кошелек", "Load a trusted wallet descriptor to view addresses?": "Загрузить дескриптор доверенного кошелька для просмотра адресов?", diff --git a/i18n/translations/tr-TR.json b/i18n/translations/tr-TR.json index 12071ba7b..304fb6c5e 100644 --- a/i18n/translations/tr-TR.json +++ b/i18n/translations/tr-TR.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "AES-CBC modu için kameradan ek entropi gereklidir", "Address": "Adres", "Align camera and backup plate properly.": "Kamerayı ve yedek plakay'ı düzgün bir şekilde hizalayın.", + "Allow in settings first!": "Önce ayarlarda izin ver!", "Anti-glare disabled": "Parlama önleyici devre dışı", "Anti-glare enabled": "Parlama önleyici etkin", "Appearance": "Görünüm", @@ -45,6 +46,7 @@ "Checked %d addresses with no matches.": "Eşleşmeyen %d adres kontrol edildi.", "Checking for SD card..": "SD kart kontrol ediliyor..", "Confirm Tamper Check Code": "Kurcalama Kontrol Kodunu Onayla", + "Could not execute %s": "%s yürütülemedi", "Create QR Code": "QR Kodu Oluştur", "Create QR code from text?": "Metinden QR kodu oluşturulsun mu?", "Created:": "Oluşturuldu:", @@ -66,6 +68,7 @@ "Double mnemonic": "Çifte anımsatıcı", "Driver": "Sürücü", "Empty": "Boş", + "Enable Krux apps": "Krux uygulamalarını etkinleştir", "Encrypted": "Şifrelenmiş", "Encrypted QR Code": "Şifrelenmiş QR Kodu", "Encrypted mnemonic was not stored": "Şifrelenmiş mnemonic depolanmadı", @@ -82,6 +85,7 @@ "Erasing user's data..": "Kullanıcının verileri siliniyor..", "Error:": "Hata:", "Esc": "Çıkış", + "Execute a signed Krux app?": "İmzalı bir Krux uygulaması çalıştırılsın mı?", "Explore files?": "Dosyaları ara?", "Exporting to SD card..": "SD karta aktarılıyor..", "Extended Public Key": "Genişletilmiş Public Key", @@ -145,6 +149,7 @@ "Length: %s": "Uzunluk: %s", "Line Delay": "Satır Gecikmesi", "Line:": "Satır:", + "Load Krux app": "Krux uygulamasını yükle", "Load Mnemonic": "Mnemonic Yükle", "Load Wallet": "Cüzdan Yükle", "Load a trusted wallet descriptor to view addresses?": "Adresleri görüntülemek için güvenilir bir cüzdan tanımlayıcısı yüklensin mi?", diff --git a/i18n/translations/vi-VN.json b/i18n/translations/vi-VN.json index a4b2dfaa8..556ff0db7 100644 --- a/i18n/translations/vi-VN.json +++ b/i18n/translations/vi-VN.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "Cần thêm entropy từ camera cho chế độ AES-CBC", "Address": "Địa chỉ", "Align camera and backup plate properly.": "Căn chỉnh camera và tấm dự phòng đúng cách.", + "Allow in settings first!": "Cho phép cài đặt trước!", "Anti-glare disabled": "Chống lóa bị vô hiệu hóa", "Anti-glare enabled": "Đã bật chống lóa", "Appearance": "Giao diện", @@ -45,6 +46,7 @@ "Checked %d addresses with no matches.": "Đã kiểm tra %d địa chỉ không khớp.", "Checking for SD card..": "Kiểm tra thẻ SD..", "Confirm Tamper Check Code": "Xác nhận mã kiểm tra giả mạo", + "Could not execute %s": "Không thể thực thi %s", "Create QR Code": "Tạo mã QR", "Create QR code from text?": "Tạo mã QR từ văn bản?", "Created:": "Tạo:", @@ -66,6 +68,7 @@ "Double mnemonic": "Từ gợi nhớ kép", "Driver": "Driver", "Empty": "Trống", + "Enable Krux apps": "Bật ứng dụng Krux", "Encrypted": "Đã mã hóa", "Encrypted QR Code": "Mã QR được mã hóa", "Encrypted mnemonic was not stored": "Mnemonic được mã hóa không được lưu trữ", @@ -82,6 +85,7 @@ "Erasing user's data..": "Đang xóa dữ liệu của người dùng..", "Error:": "Lỗi:", "Esc": "Esc", + "Execute a signed Krux app?": "Thực thi một ứng dụng Krux đã ký?", "Explore files?": "Khám phá các tập tin?", "Exporting to SD card..": "Xuất vào thẻ SD ..", "Extended Public Key": "Khóa công cộng", @@ -145,6 +149,7 @@ "Length: %s": "Độ dài: %s", "Line Delay": "Độ trễ Dòng", "Line:": "Đường kẻ:", + "Load Krux app": "Tải ứng dụng Krux", "Load Mnemonic": "Tải mã mnemonic", "Load Wallet": "Nạp Ví", "Load a trusted wallet descriptor to view addresses?": "Tải mô tả ví đáng tin cậy để xem địa chỉ?", diff --git a/i18n/translations/zh-CN.json b/i18n/translations/zh-CN.json index acbf94cc3..d678cd38b 100644 --- a/i18n/translations/zh-CN.json +++ b/i18n/translations/zh-CN.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "AES-CBC 模式需要相机的额外熵", "Address": "地址", "Align camera and backup plate properly.": "正确对齐摄像头和背板。", + "Allow in settings first!": "首先在设置中允许!", "Anti-glare disabled": "防眩光已禁用", "Anti-glare enabled": "防眩光已启用", "Appearance": "界面", @@ -45,6 +46,7 @@ "Checked %d addresses with no matches.": "已检查 %d 个不匹配的地址。", "Checking for SD card..": "检查 SD 卡..", "Confirm Tamper Check Code": "确认防篡改检查码", + "Could not execute %s": "无法执行 ", "Create QR Code": "创建二维码", "Create QR code from text?": "从文本创建二维码?", "Created:": "已创建:", @@ -66,6 +68,7 @@ "Double mnemonic": "双重助记词", "Driver": "驱动程序", "Empty": "为空", + "Enable Krux apps": "启用Krux应用程序", "Encrypted": "已加密", "Encrypted QR Code": "加密二维码", "Encrypted mnemonic was not stored": "加密助记词未存储", @@ -82,6 +85,7 @@ "Erasing user's data..": "正在擦除用户数据..", "Error:": "错误:", "Esc": "退出", + "Execute a signed Krux app?": "是否执行签名的Krux应用程序?", "Explore files?": "浏览文件?", "Exporting to SD card..": "导出到 SD 卡..", "Extended Public Key": "扩展公钥", @@ -145,6 +149,7 @@ "Length: %s": "长度: %s", "Line Delay": "行延迟", "Line:": "行:", + "Load Krux app": "加载Krux应用", "Load Mnemonic": "加载助记词", "Load Wallet": "加载钱包", "Load a trusted wallet descriptor to view addresses?": "加载受信任的钱包描述符以查看地址?", diff --git a/src/krux/translations/__init__.py b/src/krux/translations/__init__.py index d7f3a0690..878265c15 100644 --- a/src/krux/translations/__init__.py +++ b/src/krux/translations/__init__.py @@ -51,6 +51,7 @@ 2143824150, 3270727197, 900375497, + 276039542, 88746165, 1521033296, 3857613120, @@ -79,6 +80,7 @@ 1187826970, 2470115694, 422237057, + 3226440384, 4094072796, 167798282, 678449760, @@ -100,6 +102,7 @@ 690625786, 382368239, 2835747520, + 807457043, 3582575312, 1244124409, 2968548114, @@ -116,6 +119,7 @@ 3706575164, 889040671, 1505332462, + 2731446492, 3838465623, 4170881190, 1711312434, @@ -179,6 +183,7 @@ 1163744846, 972436696, 2176866982, + 2993872092, 2820726296, 2369474953, 2256441194, diff --git a/src/krux/translations/de.py b/src/krux/translations/de.py index e29ac9b36..980bc1758 100644 --- a/src/krux/translations/de.py +++ b/src/krux/translations/de.py @@ -39,6 +39,7 @@ "Zusätzliche Entropie von der Kamera für den AES-CBC-Modus erforderlich", "Adresse", "Richte Kamera und Sicherungsplatte richtig aus.", + "Erlaube zuerst Einstellungen!", "Blendschutz deaktiviert", "Blendschutz aktiviert", "Aussehen", @@ -67,6 +68,7 @@ "Überprüfte %d Adresse ohne Übereinstimmungen.", "Suche nach SD-Karte..", "Bestätigen Sie den Tamper Check Code", + "Ausführung nicht möglich.", "Erstelle QR-Code", "QR-Code aus Text erzeugen?", "Erstellt:", @@ -88,6 +90,7 @@ "Doppelte Gedächtnisstütze", "Driver", "Leer", + "Krux-Apps aktivieren", "Verschlüsselt", "Verschlüsselter QR-Code", "Verschlüsselte Mnemonic wurde nicht gespeichert", @@ -104,6 +107,7 @@ "Benutzerdaten werden gelöscht..", "Fehler:", "Esc", + "Eine signierte Krux-App ausführen?", "Dateien durchsuchen?", "Auf SD-Karte exportieren..", "Öffentlicher Schlüssel", @@ -167,6 +171,7 @@ "Länge: %s", "Leitungsverzögerung", "Linie:", + "Krux-App laden", "Mnemonic laden", "Wallet laden", "Einen vertrauenswürdigen Wallet-Deskriptor laden, um Adressen anzuzeigen?", diff --git a/src/krux/translations/es.py b/src/krux/translations/es.py index a4ccb4636..9cfc533e9 100644 --- a/src/krux/translations/es.py +++ b/src/krux/translations/es.py @@ -39,6 +39,7 @@ "Se requiere entropía adicional de la cámara para el modo AES-CBC", "Dirección", "Alinea la cámara y la placa de respaldo correctamente.", + "¡Permitir en la configuración primero!", "Anti-reflejo desactivado", "Anti-reflejo habilitado", "Apariencia", @@ -67,6 +68,7 @@ "Comprobado %d direcciones sin coincidencias.", "Comprobación de la tarjeta SD..", "Confirmar el código de verificación", + "no se pudo ejecutar [%1]", "Crear Código QR", "¿Crear código QR desde texto?", "Creado:", @@ -88,6 +90,7 @@ "Doble mnemónico", "Operador", "Vacío", + "Habilitar aplicaciones Krux", "Cifrado", "Código QR Cifrado", "Mnemónico cifrado no se almacenó", @@ -104,6 +107,7 @@ "Borrando los datos del usuario..", "Error:", "Esc", + "¿Ejecutar una aplicación Krux firmada?", "¿Explorar archivos?", "Exportando a la tarjeta SD..", "Clave Pública Extendida", @@ -167,6 +171,7 @@ "Longitud: %s", "Retraso de Línea", "Línea:", + "Cargar aplicación Krux", "Importar Mnemónico", "Cargar Cartera", "¿Cargar un descriptor de monedero de confianza para ver las direcciones?", diff --git a/src/krux/translations/fr.py b/src/krux/translations/fr.py index 56953458a..ccf57bd38 100644 --- a/src/krux/translations/fr.py +++ b/src/krux/translations/fr.py @@ -39,6 +39,7 @@ "Entropie supplémentaire de la caméra requise pour le mode AES-CBC", "Adresse", "Alignez correctement la caméra et plaque de sauvegarde.", + "Autoriser d'abord dans les paramètres !", "Anti-éblouissement désactivé", "Anti-éblouissement activé", "Apparence", @@ -67,6 +68,7 @@ "%d adresses vérifiées sans correspondance.", "Vérification de la carte SD..", "Confirmer le code de non compromis", + "Impossible d'exécuter [%1]", "Créer un code QR", "Créer un code QR à partir d'un texte\u2009?", "Créé\u2009:", @@ -88,6 +90,7 @@ "Double mnémonique", "Pilote", "Vide", + "Activer les applications Krux", "Chiffré", "Code QR chiffré", "Le mnémonique chiffré n'a pas été stocké", @@ -104,6 +107,7 @@ "Effacement des données de l'utilisateur...", "Erreur\u2009:", "Esc", + "Exécuter une application Krux signée ?", "Explorer des fichiers\u2009?", "Exportation vers la carte SD..", "Clé publique", @@ -167,6 +171,7 @@ "Longueur : %s", "Délai de Ligne", "Ligne\u2009:", + "Charger l'application Krux", "Charger Mnémonique", "Charger le portefeuille", "Charger un descripteur de portefeuille de confiance pour afficher les adresses\u2009?", diff --git a/src/krux/translations/ja.py b/src/krux/translations/ja.py index f576a5ea8..543e1d96b 100644 --- a/src/krux/translations/ja.py +++ b/src/krux/translations/ja.py @@ -39,6 +39,7 @@ "AES-CBCモードにはカメラからの追加エントロピーが必要です", "アドレス", "カメラとバックプレートを正しく整列させてください.", + "最初に設定で許可してください!", "アンチグレアが無効", "アンチグレアが有効", "外観", @@ -67,6 +68,7 @@ "%d のアドレスを確認しましたが、一致するものはありませんでした.", "SDカードを確認中..", "改ざんチェックコードの確認", + "%sを実行できませんでした", "QRコードを生成する", "テキストからQRコードを作成しますか?", "作成されました:", @@ -88,6 +90,7 @@ "ダブルニーモニック", "ドライバー", "空", + "Kruxアプリを有効にする", "暗号化されました", "暗号化されたQRコード", "暗号化されたニーモニックが保存されませんでした", @@ -104,6 +107,7 @@ "ユーザーのデータを消去しています..", "エラー:", "エスク", + "署名入りのKruxアプリを実行しますか?", "アーカイブ探索?", "SDカードへのエクスポート..", "拡張公開キー", @@ -167,6 +171,7 @@ "長さ:%s", "ライン遅延", "ライン:", + "Kruxアプリを読み込む", "ニーモニックをロード", "ウォレットをロード", "信頼できるウォレット記述子をロードしてアドレスを表示しますか?", diff --git a/src/krux/translations/ko.py b/src/krux/translations/ko.py index c7a31e139..c70e7c4a5 100644 --- a/src/krux/translations/ko.py +++ b/src/krux/translations/ko.py @@ -39,6 +39,7 @@ "AES-CBC 모드를 위해 카메라의 추가 엔트로피가 필요합니다", "주소", "카메라와 보조 플레이트를 올바르게 정렬하십시오.", + "먼저 설정에서 허용하세요!", "눈부심방지 비활성화", "눈부심방지 활성화", "디스플레이", @@ -67,6 +68,7 @@ "일치하는 주소가 없는 %d 개를 확인했습니다.", "SD카드 확인 중..", "탬퍼 체크 코드 확인", + "%s 을 (를) 실행할 수 없습니다", "QR 코드 생성", "텍스트로부터 QR코드를 생성하시겠습니까?", "생성됨:", @@ -88,6 +90,7 @@ "이중 니모닉", "드라이버", "비어 있음", + "Krux 앱 활성화", "암호화 후 저장", "암호화된 QR 코드", "암호화된 니모닉을 저장하지 못했습니다", @@ -104,6 +107,7 @@ "사용자의 데이터를 지우는 중...", "오류:", "Esc", + "서명된 Krux 앱을 실행하시겠습니까?", "파일을 탐색하시겠습니까?", "SD카드로 내보내는 중..", "XPUB 내보내기", @@ -167,6 +171,7 @@ "길이: %s", "줄 지연", "줄:", + "Krux 앱 로드", "니모닉 불러오기", "이대로 불러오기", "주소를 보기위해 신뢰할 수 있는 월렛 디스크립터를 불러오시겠습니까?", diff --git a/src/krux/translations/nl.py b/src/krux/translations/nl.py index 53f748381..7d65ef3e7 100644 --- a/src/krux/translations/nl.py +++ b/src/krux/translations/nl.py @@ -39,6 +39,7 @@ "Extra entropie van de camera vereist voor AES-CBC-modus", "Adres", "Richt de camera en back-upplaat op de juiste manier.", + "Sta eerst instellingen toe!", "Anti reflecterend uitgeschakeld", "Anti reflecterend ingeschakeld", "Uiterlijk", @@ -67,6 +68,7 @@ "%d adressen gecontroleerd zonder overeenkomsten.", "SD kaart controleren..", "Bevestig de sabotagecontrolecode", + "Kon ‘%s’ niet uitvoeren", "QR code maken", "QR code maken van tekst?", "Aangemaakt:", @@ -88,6 +90,7 @@ "Dubbel geheugensteuntje", "Driver", "Leeg", + "Krux-apps inschakelen", "Versleuteld", "Versleutelde QR code", "Versleutelde geheugensteun was niet opgeslagen", @@ -104,6 +107,7 @@ "Gegevens van gebruiker wissen..", "Fout:", "Esc", + "Een ondertekende Krux-app uitvoeren?", "Bestanden verkennen?", "Exporteren naar SD kaart..", "Uitgebreide publieke sleutel", @@ -167,6 +171,7 @@ "Lengte: %s", "Lijn vertraging", "Lijn:", + "Krux-app laden", "Geheugensteun laden", "Portemonnee laden", "Een vertrouwde portemonnee descriptor laden om adressen te bekijken?", diff --git a/src/krux/translations/pt.py b/src/krux/translations/pt.py index fb5011046..4b3e74b09 100644 --- a/src/krux/translations/pt.py +++ b/src/krux/translations/pt.py @@ -39,6 +39,7 @@ "Entropia adicional da câmera necessária para o modo AES-CBC", "Endereço", "Alinhe a câmera e a placa de backup corretamente.", + "Permita nas configurações primeiro!", "Antirreflexo desativado", "Antirreflexo ativado", "Aparência", @@ -67,6 +68,7 @@ "Verificado %d endereços sem correspondências.", "Verificando o cartão SD..", "Confirmar Código", + "Não foi possível executar %s", "Gerar Código QR", "Gerar código QR do texto?", "Criado:", @@ -88,6 +90,7 @@ "Duplo mnemônico", "Driver", "Vazio", + "Ativar Krux app", "Criptografado", "Código QR Criptografado", "Mnemonic criptografado não foi armazenado", @@ -104,6 +107,7 @@ "Apagando os dados do usuário..", "Erro:", "Esc", + "Executar um Krux app assinado?", "Explorar arquivos?", "Exportando para o cartão SD..", "Chave Pública Estendida", @@ -167,6 +171,7 @@ "Comprimento: %s", "Atraso de Linha", "Linha:", + "Carregar Krux app", "Carregar Mnemônico", "Carregar Carteira", "Carregar um descritor de carteira confiável para visualizar endereços?", diff --git a/src/krux/translations/ru.py b/src/krux/translations/ru.py index 92acc829c..ef4f136b5 100644 --- a/src/krux/translations/ru.py +++ b/src/krux/translations/ru.py @@ -39,6 +39,7 @@ "Для режима AES-CBC требуется дополнительная энтропия от камеры", "Адрес", "Правильно совместите камеру и резервную пластину.", + "Сначала разрешите в настройках!", "Антиблик отключен", "Антиблик включен", "Внешний Вид", @@ -67,6 +68,7 @@ "Проверено %d адресов без совпадений.", "Проверка SD карты..", "Подтвердите код проверки вскрытия", + "Не удалось выполнить %s", "Создать QR Код", "Создать QR код из текста?", "Создано:", @@ -88,6 +90,7 @@ "Двойная мнемоника", "Драйвер", "Пустой", + "Включить приложения Krux", "Зашифровано", "Зашифрованный QR Код", "Зашифрованная мнемоника не была сохранена", @@ -104,6 +107,7 @@ "Удаление данных пользователя..", "Ошибка:", "Выйти", + "Выполнить подписанное приложение Krux?", "Исследовать файлы?", "Экспортирование на SD карту..", "Расширенный Публичный Ключ", @@ -167,6 +171,7 @@ "Длина: %s", "Задержка Линии", "Линия:", + "Загрузить приложение Krux", "Загрузить Мнемонику", "Загрузить кошелек", "Загрузить дескриптор доверенного кошелька для просмотра адресов?", diff --git a/src/krux/translations/tr.py b/src/krux/translations/tr.py index 31c35bbe2..50f2cbcac 100644 --- a/src/krux/translations/tr.py +++ b/src/krux/translations/tr.py @@ -39,6 +39,7 @@ "AES-CBC modu için kameradan ek entropi gereklidir", "Adres", "Kamerayı ve yedek plakay'ı düzgün bir şekilde hizalayın.", + "Önce ayarlarda izin ver!", "Parlama önleyici devre dışı", "Parlama önleyici etkin", "Görünüm", @@ -67,6 +68,7 @@ "Eşleşmeyen %d adres kontrol edildi.", "SD kart kontrol ediliyor..", "Kurcalama Kontrol Kodunu Onayla", + "%s yürütülemedi", "QR Kodu Oluştur", "Metinden QR kodu oluşturulsun mu?", "Oluşturuldu:", @@ -88,6 +90,7 @@ "Çifte anımsatıcı", "Sürücü", "Boş", + "Krux uygulamalarını etkinleştir", "Şifrelenmiş", "Şifrelenmiş QR Kodu", "Şifrelenmiş mnemonic depolanmadı", @@ -104,6 +107,7 @@ "Kullanıcının verileri siliniyor..", "Hata:", "Çıkış", + "İmzalı bir Krux uygulaması çalıştırılsın mı?", "Dosyaları ara?", "SD karta aktarılıyor..", "Genişletilmiş Public Key", @@ -167,6 +171,7 @@ "Uzunluk: %s", "Satır Gecikmesi", "Satır:", + "Krux uygulamasını yükle", "Mnemonic Yükle", "Cüzdan Yükle", "Adresleri görüntülemek için güvenilir bir cüzdan tanımlayıcısı yüklensin mi?", diff --git a/src/krux/translations/vi.py b/src/krux/translations/vi.py index c345a77fc..e4a4d1710 100644 --- a/src/krux/translations/vi.py +++ b/src/krux/translations/vi.py @@ -39,6 +39,7 @@ "Cần thêm entropy từ camera cho chế độ AES-CBC", "Địa chỉ", "Căn chỉnh camera và tấm dự phòng đúng cách.", + "Cho phép cài đặt trước!", "Chống lóa bị vô hiệu hóa", "Đã bật chống lóa", "Giao diện", @@ -67,6 +68,7 @@ "Đã kiểm tra %d địa chỉ không khớp.", "Kiểm tra thẻ SD..", "Xác nhận mã kiểm tra giả mạo", + "Không thể thực thi %s", "Tạo mã QR", "Tạo mã QR từ văn bản?", "Tạo:", @@ -88,6 +90,7 @@ "Từ gợi nhớ kép", "Driver", "Trống", + "Bật ứng dụng Krux", "Đã mã hóa", "Mã QR được mã hóa", "Mnemonic được mã hóa không được lưu trữ", @@ -104,6 +107,7 @@ "Đang xóa dữ liệu của người dùng..", "Lỗi:", "Esc", + "Thực thi một ứng dụng Krux đã ký?", "Khám phá các tập tin?", "Xuất vào thẻ SD ..", "Khóa công cộng", @@ -167,6 +171,7 @@ "Độ dài: %s", "Độ trễ Dòng", "Đường kẻ:", + "Tải ứng dụng Krux", "Tải mã mnemonic", "Nạp Ví", "Tải mô tả ví đáng tin cậy để xem địa chỉ?", diff --git a/src/krux/translations/zh.py b/src/krux/translations/zh.py index 726e32cf1..be90fefe9 100644 --- a/src/krux/translations/zh.py +++ b/src/krux/translations/zh.py @@ -39,6 +39,7 @@ "AES-CBC 模式需要相机的额外熵", "地址", "正确对齐摄像头和背板。", + "首先在设置中允许!", "防眩光已禁用", "防眩光已启用", "界面", @@ -67,6 +68,7 @@ "已检查 %d 个不匹配的地址。", "检查 SD 卡..", "确认防篡改检查码", + "无法执行 ", "创建二维码", "从文本创建二维码?", "已创建:", @@ -88,6 +90,7 @@ "双重助记词", "驱动程序", "为空", + "启用Krux应用程序", "已加密", "加密二维码", "加密助记词未存储", @@ -104,6 +107,7 @@ "正在擦除用户数据..", "错误:", "退出", + "是否执行签名的Krux应用程序?", "浏览文件?", "导出到 SD 卡..", "扩展公钥", @@ -167,6 +171,7 @@ "长度: %s", "行延迟", "行:", + "加载Krux应用", "加载助记词", "加载钱包", "加载受信任的钱包描述符以查看地址?", From 2aec24df8adbe8b238a765d79394b5d15c867bfd Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sat, 30 Nov 2024 00:27:21 -0300 Subject: [PATCH 04/86] fix tests --- tests/pages/test_login.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/pages/test_login.py b/tests/pages/test_login.py index f96aacc0a..712008bc3 100644 --- a/tests/pages/test_login.py +++ b/tests/pages/test_login.py @@ -103,7 +103,7 @@ def test_tools_menu(m5stickv, mocker): BTN_SEQUENCE = ( # Back - [BUTTON_PAGE] * 6 + [BUTTON_PAGE] * 7 + [BUTTON_ENTER] ) From 30f9b973135f8736c4e1b939796205f776fa60df Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sat, 30 Nov 2024 02:23:59 -0300 Subject: [PATCH 05/86] comments --- src/krux/pages/tools.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/krux/pages/tools.py b/src/krux/pages/tools.py index aff842760..077985a8d 100644 --- a/src/krux/pages/tools.py +++ b/src/krux/pages/tools.py @@ -139,6 +139,7 @@ def sd_load_app(self): # pylint: disable=R1710 os.remove(path_prefix + file) # Copy kapp + sig from SD to flash VFS + # sig file allows the check and execution of the kapp at startup for opsec kapp_filename = "kapp" with open(path_prefix + kapp_filename + MPY_FILE_EXTENSION, "wb") as kapp_file: kapp_file.write(data) @@ -150,7 +151,7 @@ def sd_load_app(self): # pylint: disable=R1710 kapp_sig_file.write(sig_data) # Allows import of files in flash VFS - # TODO: Also dinamically enable vsf->execution + # TODO: Dinamically enable vsf->execution os.chdir("/" + FLASH_PATH) # Import and exec the kapp From eaa0920ec5176693b6e325b2a6bda6e52e30f68c Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sun, 1 Dec 2024 13:21:13 -0300 Subject: [PATCH 06/86] kapps folder and poetry taks --- kapps/kapp.mpy | Bin 0 -> 156 bytes kapps/kapp.mpy.sig | Bin 0 -> 72 bytes kapps/kapp.py | 32 ++++++++++++++++++++++++++++++++ pyproject.toml | 8 ++++++-- simulator/kapp.py | 33 +++++++++++++++++++++++++++++++-- 5 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 kapps/kapp.mpy create mode 100644 kapps/kapp.mpy.sig create mode 100644 kapps/kapp.py diff --git a/kapps/kapp.mpy b/kapps/kapp.mpy new file mode 100644 index 0000000000000000000000000000000000000000..435993e2f735d6fefd928384b24b0d9e737048fe GIT binary patch literal 156 zcmeZeVUky9j9_LkU|?Y2VP^ Date: Sun, 1 Dec 2024 13:25:27 -0300 Subject: [PATCH 07/86] ensure correct chdir after kapp execution --- src/krux/pages/tools.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/krux/pages/tools.py b/src/krux/pages/tools.py index 077985a8d..1639372d9 100644 --- a/src/krux/pages/tools.py +++ b/src/krux/pages/tools.py @@ -159,7 +159,13 @@ def sd_load_app(self): # pylint: disable=R1710 try: i_kapp = __import__(kapp_filename) i_kapp.run() + + # avoids importing from flash VSF + os.chdir("/") except Exception as e: + # avoids importing from flash VSF + os.chdir("/") + print(e) self.flash_error(t("Could not execute %s") % filename) return MENU_CONTINUE From 95ed80e3fe5d1d47ca17b7cdb9a8e4ed85bc1bc7 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sun, 1 Dec 2024 17:45:36 -0300 Subject: [PATCH 08/86] example Kapp with display --- kapps/kapp.py | 67 ++++++++++++++++++++++++++++++++++++++++- simulator/kapp.py | 67 ++++++++++++++++++++++++++++++++++++++++- src/krux/pages/tools.py | 27 ++++++++++++----- 3 files changed, 151 insertions(+), 10 deletions(-) diff --git a/kapps/kapp.py b/kapps/kapp.py index cfbd7a231..25891506b 100644 --- a/kapps/kapp.py +++ b/kapps/kapp.py @@ -24,9 +24,74 @@ # avoids importing from flash VSF os.chdir("/") +VERSION = "1.0" +NAME = "Test app" + print("Print executed inside kapp.py") +from krux.pages import Page, Menu, MENU_CONTINUE +from krux.krux_settings import t +from krux.display import NARROW_SCREEN_WITH, STATUS_BAR_HEIGHT, FONT_HEIGHT +from krux.themes import theme + + +class KMenu(Menu): + """Customizes the page's menu""" + + def draw_wallet_indicator(self): + """Customize the top bar""" + if self.ctx.display.width() > NARROW_SCREEN_WITH: + self.ctx.display.draw_hcentered_text( + NAME, + STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, + theme.highlight_color, + theme.info_bg_color, + ) + else: + self.ctx.display.draw_string( + 24, + STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, + NAME, + theme.highlight_color, + theme.info_bg_color, + ) + + +class Kapp(Page): + """Represents the page of the kapp""" -def run(): + # Used on boot.py when changing the locale on Settings + SETTINGS_MENU_INDEX = 2 + + def __init__(self, ctx): + shtn_reboot_label = ( + t("Shutdown") if ctx.power_manager.has_battery() else t("Reboot") + ) + super().__init__( + ctx, + KMenu( + ctx, + [ + (t("About"), self.about), + (shtn_reboot_label, self.shutdown), + ], + back_label=None, + ), + ) + + def about(self): + """Handler for the 'about' menu item""" + + self.ctx.display.clear() + self.ctx.display.draw_centered_text( + "Krux app\n" + NAME + "\n\n" + t("Version") + "\n%s" % VERSION + ) + self.ctx.input.wait_for_button() + return MENU_CONTINUE + + +def run(ctx): """Runs this kapp""" print("run() func executed on kapp.py") + + Kapp(ctx).run() diff --git a/simulator/kapp.py b/simulator/kapp.py index cfbd7a231..25891506b 100644 --- a/simulator/kapp.py +++ b/simulator/kapp.py @@ -24,9 +24,74 @@ # avoids importing from flash VSF os.chdir("/") +VERSION = "1.0" +NAME = "Test app" + print("Print executed inside kapp.py") +from krux.pages import Page, Menu, MENU_CONTINUE +from krux.krux_settings import t +from krux.display import NARROW_SCREEN_WITH, STATUS_BAR_HEIGHT, FONT_HEIGHT +from krux.themes import theme + + +class KMenu(Menu): + """Customizes the page's menu""" + + def draw_wallet_indicator(self): + """Customize the top bar""" + if self.ctx.display.width() > NARROW_SCREEN_WITH: + self.ctx.display.draw_hcentered_text( + NAME, + STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, + theme.highlight_color, + theme.info_bg_color, + ) + else: + self.ctx.display.draw_string( + 24, + STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, + NAME, + theme.highlight_color, + theme.info_bg_color, + ) + + +class Kapp(Page): + """Represents the page of the kapp""" -def run(): + # Used on boot.py when changing the locale on Settings + SETTINGS_MENU_INDEX = 2 + + def __init__(self, ctx): + shtn_reboot_label = ( + t("Shutdown") if ctx.power_manager.has_battery() else t("Reboot") + ) + super().__init__( + ctx, + KMenu( + ctx, + [ + (t("About"), self.about), + (shtn_reboot_label, self.shutdown), + ], + back_label=None, + ), + ) + + def about(self): + """Handler for the 'about' menu item""" + + self.ctx.display.clear() + self.ctx.display.draw_centered_text( + "Krux app\n" + NAME + "\n\n" + t("Version") + "\n%s" % VERSION + ) + self.ctx.input.wait_for_button() + return MENU_CONTINUE + + +def run(ctx): """Runs this kapp""" print("run() func executed on kapp.py") + + Kapp(ctx).run() diff --git a/src/krux/pages/tools.py b/src/krux/pages/tools.py index 1639372d9..0ea6aa768 100644 --- a/src/krux/pages/tools.py +++ b/src/krux/pages/tools.py @@ -61,7 +61,7 @@ def __init__(self, ctx): ), ) - def _check_signature(self, path_prefix, filename, data): + def _check_signature(self, path_prefix, filename, data_hash): from embit import ec from ..metadata import SIGNER_PUBKEY from krux.sd_card import SIGNATURE_FILE_EXTENSION @@ -84,9 +84,7 @@ def _check_signature(self, path_prefix, filename, data): # Parse, serialize, and reparse to ensure signature is compact prior to verification sig = ec.Signature.parse(ec.Signature.parse(sig).serialize()) - import hashlib - - if not pubkey.verify(sig, hashlib.sha256(data).digest()): + if not pubkey.verify(sig, data_hash): self.flash_error(t("Bad signature")) return MENU_CONTINUE except: @@ -123,13 +121,25 @@ def sd_load_app(self): # pylint: disable=R1710 if not filename: return MENU_CONTINUE + # Confirm hash string + import binascii + import hashlib + + data_hash = hashlib.sha256(data).digest() + self.ctx.display.clear() + self.ctx.display.draw_hcentered_text( + filename + "\n\n" + "SHA256:\n" + binascii.hexlify(data_hash).decode() + ) + if not self.prompt(t("Proceed?"), BOTTOM_PROMPT_LINE): + return MENU_CONTINUE + # Check signature of .mpy file in SD path_prefix = "/%s/" % SD_PATH - if self._check_signature(path_prefix, filename, data) == MENU_CONTINUE: + if self._check_signature(path_prefix, filename, data_hash) == MENU_CONTINUE: return MENU_CONTINUE sig_data = open(path_prefix + filename + SIGNATURE_FILE_EXTENSION, "rb").read() - # Delete any .mpy files from flash VFS to avoid any malicious code import/execution + # Delete any .mpy files from flash VFS to avoid malicious code import/execution import os from krux.settings import FLASH_PATH @@ -158,18 +168,19 @@ def sd_load_app(self): # pylint: disable=R1710 i_kapp = None try: i_kapp = __import__(kapp_filename) - i_kapp.run() + i_kapp.run(self.ctx) # avoids importing from flash VSF os.chdir("/") except Exception as e: # avoids importing from flash VSF os.chdir("/") - + print(e) self.flash_error(t("Could not execute %s") % filename) return MENU_CONTINUE + print("Exit kapp!") # After execution restart Krux (better safe than sorry) from ..power import power_manager From 262eb2ee2c61350c4ddb8a2bce7fb5be3ca93b3f Mon Sep 17 00:00:00 2001 From: tadeubas Date: Mon, 2 Dec 2024 01:20:10 -0300 Subject: [PATCH 09/86] delete .sig file --- kapps/kapp.mpy.sig | Bin 72 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 kapps/kapp.mpy.sig diff --git a/kapps/kapp.mpy.sig b/kapps/kapp.mpy.sig deleted file mode 100644 index 967044e8cbe3591680d2beefdf74af833d7b625c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72 zcmV-O0Jr}zMgk!KhtYKsufn=@TOCZaKZ$x&Jnk0M^6)+ffj$ZAPe%7F0wDmaj3yXF eM9mP8A5i2;@D-ER6uK?hRHdsGP=PM0EOSpKGaZNk From 4fdb4d7024404bec25a0783d44ca54ca5df3ebfb Mon Sep 17 00:00:00 2001 From: tadeubas Date: Mon, 2 Dec 2024 01:22:44 -0300 Subject: [PATCH 10/86] update gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index eae833bf5..30674682d 100644 --- a/.gitignore +++ b/.gitignore @@ -81,3 +81,4 @@ simulator/sd # ignore build-release files krux-*/ktool* +kapps/*.sig From 8c7779a859ac8684146ed7de90a8c0a92114bb07 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Mon, 2 Dec 2024 01:23:45 -0300 Subject: [PATCH 11/86] new poe task generate all mpy --- kapps/kapp.mpy | Bin 156 -> 1156 bytes pyproject.toml | 3 +++ 2 files changed, 3 insertions(+) diff --git a/kapps/kapp.mpy b/kapps/kapp.mpy index 435993e2f735d6fefd928384b24b0d9e737048fe..4b98c25a2b803050c73371fb1915f3d9a5a21a51 100644 GIT binary patch literal 1156 zcmY*YU31z-6y25hs*>6$iPtGeLNp2!CxdaxWYUK|gv2;d8;k)bnPECYNGqfoB#pEh z?CC?nnQ12v^>e4c0=qwn$ z!NrDkP}*x09_$nzco*oR2*AH{-b%QE0`pMfbjz@P1X3ofqSQCrJIdOddbig+Y@=)+ z2SnC9Psy}vt$H5(vexStUYM+O=-?@U7Z=)vedt>f2_&fxhnbYyIP%`m)wl z8};VvMjxR)TI*&*%iWLh3_I{9+S#gD^rna$vG5erq9_iEcb}@sLx{Njh(LbBU=>y# zGAOf8sph|mwnJ7)`JuxPK-#ZZ?i5!@XoQtrR}ZJyAwk9S-5;?|KZs`FaHIulRH1T0 z5rTN#_Rb(1h#lW{h>TCM9ujQGwiDO}mZLBlu*kw#CJw_R_*>}(6($ch6@bte3djwC z^4RdTnL5)Z6HHXwF>GBUuFntHB!KU|450boj!BajTk_M^R%x<-P@*79F{P7JaqZ?( zByMIK#4>>({{8&Xd?}{Iv{Z_rEuFH#J~mW>Pl@nEC%w}3!3*mmPt$laS>*>}p8D~_;(&=6 ze>tU1Uwk**{WVLESFDSa^|?~&)%(;-uX}3jtY&++{%$z}Pyzf9Dx5ZQL$Vws(|~y| z-v(J0fGi)`{H0u|eZMPjQ@krN=eaZNt5eOPKJ+DIQH4etpH6v@B*b-SDdF>J9Tde_6`74&y!CU`;tz6z_9xI`hjiG5%F=*RGz>JIAHXC8>w!eK RkG5npboBqd?K&%8{|67}J^=s# literal 156 zcmeZeVUky9j9_LkU|?Y2VP^ Date: Mon, 2 Dec 2024 02:06:42 -0300 Subject: [PATCH 12/86] Avoid changing flash to work better with tc-flash-hash --- src/krux/pages/tools.py | 66 +++++++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/src/krux/pages/tools.py b/src/krux/pages/tools.py index 0ea6aa768..048c79855 100644 --- a/src/krux/pages/tools.py +++ b/src/krux/pages/tools.py @@ -61,10 +61,9 @@ def __init__(self, ctx): ), ) - def _check_signature(self, path_prefix, filename, data_hash): + def _check_signature(self, sig, data_hash): from embit import ec from ..metadata import SIGNER_PUBKEY - from krux.sd_card import SIGNATURE_FILE_EXTENSION pubkey = None try: @@ -73,13 +72,6 @@ def _check_signature(self, path_prefix, filename, data_hash): self.flash_error(t("Invalid public key")) return MENU_CONTINUE - sig = None - try: - sig = open(path_prefix + filename + SIGNATURE_FILE_EXTENSION, "rb").read() - except: - self.flash_error(t("Missing signature file")) - return MENU_CONTINUE - try: # Parse, serialize, and reparse to ensure signature is compact prior to verification sig = ec.Signature.parse(ec.Signature.parse(sig).serialize()) @@ -135,30 +127,55 @@ def sd_load_app(self): # pylint: disable=R1710 # Check signature of .mpy file in SD path_prefix = "/%s/" % SD_PATH - if self._check_signature(path_prefix, filename, data_hash) == MENU_CONTINUE: + sig_data = None + try: + sig_data = open( + path_prefix + filename + SIGNATURE_FILE_EXTENSION, "rb" + ).read() + except: + self.flash_error(t("Missing signature file")) + return MENU_CONTINUE + + if self._check_signature(sig_data, data_hash) == MENU_CONTINUE: return MENU_CONTINUE - sig_data = open(path_prefix + filename + SIGNATURE_FILE_EXTENSION, "rb").read() # Delete any .mpy files from flash VFS to avoid malicious code import/execution import os from krux.settings import FLASH_PATH + found_in_flash_vfs = False path_prefix = "/%s/" % FLASH_PATH for file in os.listdir(path_prefix): if file.endswith(MPY_FILE_EXTENSION): - os.remove(path_prefix + file) + # Check if file is the same from SD + if ( + hashlib.sha256(open(path_prefix + file, "rb").read()).digest() + != data_hash + ): + os.remove(path_prefix + file) # Copy kapp + sig from SD to flash VFS # sig file allows the check and execution of the kapp at startup for opsec kapp_filename = "kapp" - with open(path_prefix + kapp_filename + MPY_FILE_EXTENSION, "wb") as kapp_file: - kapp_file.write(data) - - with open( - path_prefix + kapp_filename + MPY_FILE_EXTENSION + SIGNATURE_FILE_EXTENSION, - "wb", - ) as kapp_sig_file: - kapp_sig_file.write(sig_data) + if not found_in_flash_vfs: + with open( + path_prefix + kapp_filename + MPY_FILE_EXTENSION, "wb" + ) as kapp_file: + kapp_file.write(data) + + with open( + path_prefix + + kapp_filename + + MPY_FILE_EXTENSION + + SIGNATURE_FILE_EXTENSION, + "wb", + ) as kapp_sig_file: + kapp_sig_file.write(sig_data) + + del data, sig_data + import gc + + gc.collect() # Allows import of files in flash VFS # TODO: Dinamically enable vsf->execution @@ -169,17 +186,16 @@ def sd_load_app(self): # pylint: disable=R1710 try: i_kapp = __import__(kapp_filename) i_kapp.run(self.ctx) - - # avoids importing from flash VSF - os.chdir("/") - except Exception as e: + except: # avoids importing from flash VSF os.chdir("/") - print(e) self.flash_error(t("Could not execute %s") % filename) return MENU_CONTINUE + # avoids importing from flash VSF + os.chdir("/") + print("Exit kapp!") # After execution restart Krux (better safe than sorry) from ..power import power_manager From b7bafb1709bc5fa36b2e39471e2cb9fe3f69a1ab Mon Sep 17 00:00:00 2001 From: tadeubas Date: Tue, 3 Dec 2024 02:24:14 -0300 Subject: [PATCH 13/86] fix same kapp always overwriting in flash --- src/krux/pages/tools.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/krux/pages/tools.py b/src/krux/pages/tools.py index 048c79855..d160f2eba 100644 --- a/src/krux/pages/tools.py +++ b/src/krux/pages/tools.py @@ -143,21 +143,20 @@ def sd_load_app(self): # pylint: disable=R1710 import os from krux.settings import FLASH_PATH - found_in_flash_vfs = False path_prefix = "/%s/" % FLASH_PATH for file in os.listdir(path_prefix): if file.endswith(MPY_FILE_EXTENSION): - # Check if file is the same from SD + # Only remove .mpy different from what was loaded from SD if ( hashlib.sha256(open(path_prefix + file, "rb").read()).digest() != data_hash ): os.remove(path_prefix + file) - # Copy kapp + sig from SD to flash VFS + # Copy kapp + sig from SD to flash VFS if not found # sig file allows the check and execution of the kapp at startup for opsec kapp_filename = "kapp" - if not found_in_flash_vfs: + if not any(kapp_filename in file for file in os.listdir(path_prefix)): with open( path_prefix + kapp_filename + MPY_FILE_EXTENSION, "wb" ) as kapp_file: From 668facadb703389cd80af7d1cb82042f833e1f3d Mon Sep 17 00:00:00 2001 From: tadeubas Date: Tue, 3 Dec 2024 02:50:17 -0300 Subject: [PATCH 14/86] simplified same file check logic --- src/krux/pages/tools.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/krux/pages/tools.py b/src/krux/pages/tools.py index d160f2eba..ffd827842 100644 --- a/src/krux/pages/tools.py +++ b/src/krux/pages/tools.py @@ -143,6 +143,7 @@ def sd_load_app(self): # pylint: disable=R1710 import os from krux.settings import FLASH_PATH + found_in_flash_vfs = False path_prefix = "/%s/" % FLASH_PATH for file in os.listdir(path_prefix): if file.endswith(MPY_FILE_EXTENSION): @@ -152,11 +153,13 @@ def sd_load_app(self): # pylint: disable=R1710 != data_hash ): os.remove(path_prefix + file) + else: + found_in_flash_vfs = True # Copy kapp + sig from SD to flash VFS if not found # sig file allows the check and execution of the kapp at startup for opsec kapp_filename = "kapp" - if not any(kapp_filename in file for file in os.listdir(path_prefix)): + if not found_in_flash_vfs: with open( path_prefix + kapp_filename + MPY_FILE_EXTENSION, "wb" ) as kapp_file: From e8ae919d0211bcddb0e90605b99fc3962684acc6 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Wed, 4 Dec 2024 01:22:08 -0300 Subject: [PATCH 15/86] Using buffer to read and write kapp files --- src/krux/pages/tools.py | 56 +++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/src/krux/pages/tools.py b/src/krux/pages/tools.py index ffd827842..f81a6ad02 100644 --- a/src/krux/pages/tools.py +++ b/src/krux/pages/tools.py @@ -87,8 +87,9 @@ def _check_signature(self, sig, data_hash): def sd_load_app(self): # pylint: disable=R1710 """Handler for the 'Load Krux app' menu item""" - text = t("Execute a signed Krux app?") - if not self.prompt(text, self.ctx.display.height() // 2): + if not self.prompt( + t("Execute a signed Krux app?"), self.ctx.display.height() // 2 + ): return MENU_CONTINUE # Check if Krux app is enabled @@ -106,18 +107,21 @@ def sd_load_app(self): # pylint: disable=R1710 from krux.pages.utils import Utils from krux.sd_card import MPY_FILE_EXTENSION, SIGNATURE_FILE_EXTENSION, SD_PATH - utils = Utils(self.ctx) - filename, data = utils.load_file(MPY_FILE_EXTENSION, prompt=False) - del utils + filename, _ = Utils(self.ctx).load_file( + MPY_FILE_EXTENSION, prompt=False, only_get_filename=True + ) if not filename: return MENU_CONTINUE # Confirm hash string + sd_path_prefix = "/%s/" % SD_PATH + from krux.firmware import sha256 + + data_hash = sha256(sd_path_prefix + filename) + import binascii - import hashlib - data_hash = hashlib.sha256(data).digest() self.ctx.display.clear() self.ctx.display.draw_hcentered_text( filename + "\n\n" + "SHA256:\n" + binascii.hexlify(data_hash).decode() @@ -126,11 +130,10 @@ def sd_load_app(self): # pylint: disable=R1710 return MENU_CONTINUE # Check signature of .mpy file in SD - path_prefix = "/%s/" % SD_PATH sig_data = None try: sig_data = open( - path_prefix + filename + SIGNATURE_FILE_EXTENSION, "rb" + sd_path_prefix + filename + SIGNATURE_FILE_EXTENSION, "rb" ).read() except: self.flash_error(t("Missing signature file")) @@ -144,29 +147,33 @@ def sd_load_app(self): # pylint: disable=R1710 from krux.settings import FLASH_PATH found_in_flash_vfs = False - path_prefix = "/%s/" % FLASH_PATH - for file in os.listdir(path_prefix): + flash_path_prefix = "/%s/" % FLASH_PATH + for file in os.listdir(flash_path_prefix): if file.endswith(MPY_FILE_EXTENSION): # Only remove .mpy different from what was loaded from SD - if ( - hashlib.sha256(open(path_prefix + file, "rb").read()).digest() - != data_hash - ): - os.remove(path_prefix + file) + if sha256(flash_path_prefix + file) != data_hash: + os.remove(flash_path_prefix + file) else: found_in_flash_vfs = True # Copy kapp + sig from SD to flash VFS if not found - # sig file allows the check and execution of the kapp at startup for opsec + # sig file will allow the check and execution of the kapp at startup (opsec) kapp_filename = "kapp" if not found_in_flash_vfs: with open( - path_prefix + kapp_filename + MPY_FILE_EXTENSION, "wb" + flash_path_prefix + kapp_filename + MPY_FILE_EXTENSION, + "wb", + buffering=0, ) as kapp_file: - kapp_file.write(data) + with open(sd_path_prefix + filename, "rb", buffering=0) as file: + while True: + chunk = file.read(128) + if not chunk: + break + kapp_file.write(chunk) with open( - path_prefix + flash_path_prefix + kapp_filename + MPY_FILE_EXTENSION + SIGNATURE_FILE_EXTENSION, @@ -174,7 +181,7 @@ def sd_load_app(self): # pylint: disable=R1710 ) as kapp_sig_file: kapp_sig_file.write(sig_data) - del data, sig_data + del sig_data import gc gc.collect() @@ -192,13 +199,18 @@ def sd_load_app(self): # pylint: disable=R1710 # avoids importing from flash VSF os.chdir("/") + # unimport module + import sys + + del i_kapp + del sys.modules[kapp_filename] + self.flash_error(t("Could not execute %s") % filename) return MENU_CONTINUE # avoids importing from flash VSF os.chdir("/") - print("Exit kapp!") # After execution restart Krux (better safe than sorry) from ..power import power_manager From a3c54aaff1ea6f9fa5db1c5064ba467ac5dec846 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Fri, 6 Dec 2024 01:08:29 -0300 Subject: [PATCH 16/86] Changed one error message to ValueError and avoid one translation --- i18n/translations/de-DE.json | 324 +---------------------------------- i18n/translations/es-MX.json | 324 +---------------------------------- i18n/translations/fr-FR.json | 324 +---------------------------------- i18n/translations/ja-JP.json | 324 +---------------------------------- i18n/translations/ko-KR.json | 324 +---------------------------------- i18n/translations/nl-NL.json | 324 +---------------------------------- i18n/translations/pt-BR.json | 324 +---------------------------------- i18n/translations/ru-RU.json | 324 +---------------------------------- i18n/translations/tr-TR.json | 324 +---------------------------------- i18n/translations/vi-VN.json | 324 +---------------------------------- i18n/translations/zh-CN.json | 324 +---------------------------------- src/krux/pages/tools.py | 10 +- 12 files changed, 16 insertions(+), 3558 deletions(-) diff --git a/i18n/translations/de-DE.json b/i18n/translations/de-DE.json index c11c71a40..bc44d584e 100644 --- a/i18n/translations/de-DE.json +++ b/i18n/translations/de-DE.json @@ -1,323 +1 @@ -{ - "% of the amount.": "% des Betrags.", - "%d of %d multisig": "%d von %d Multisig", - "%d to %d": "%d bis %d ", - "%s removed.": "%s wurde entfernt.", - "(%d total)": "(%d insgesamt)", - "(Experimental)": "(Experimental)", - "(watch-only)": "(nur zur Betrachtung)", - "12 words": "12 Wörter", - "24 words": "24 Wörter", - "About": "Über", - "Accept assumption?": "Annahme akzeptieren?", - "Account": "Konto", - "Account #0 would be assumed": "Konto #0 würde angenommen", - "Account Index": "Kontoindex", - "Add or change wallet passphrase?": "Wallet-Passphrase hinzufügen oder ändern?", - "Additional entropy from camera required for AES-CBC mode": "Zusätzliche Entropie von der Kamera für den AES-CBC-Modus erforderlich", - "Address": "Adresse", - "Align camera and backup plate properly.": "Richte Kamera und Sicherungsplatte richtig aus.", - "Allow in settings first!": "Erlaube zuerst Einstellungen!", - "Anti-glare disabled": "Blendschutz deaktiviert", - "Anti-glare enabled": "Blendschutz aktiviert", - "Appearance": "Aussehen", - "Are you sure?": "Bist Du sicher?", - "BGR Colors": "BGR-Farben", - "BIP39 Mnemonic": "BIP39-Mnemonik", - "Back": "Zurück", - "Back to Menu": "Zurück zum Menü", - "Backup Mnemonic": "Mnemonik-Backup", - "Bad signature": "Ungültige Signatur", - "Base64 Password": "Base64-Passwort", - "Baudrate": "Baudrate", - "Binary Grid": "Binäres Gitter", - "Border Padding": "Randpolsterung", - "Brightness": "Helligkeit", - "Buttons": "Tasten", - "Buttons Debounce": "Entprellung der Tasten", - "Capture cancelled": "Aufnahme abgebrochen", - "Change": "Change Adresse", - "Change Addresses": "Change Adressen", - "Change theme and reboot?": "Thema ändern und neu starten?", - "Change:": "Change:", - "Changes will last until shutdown.": "Änderungen bleiben bis zum Herunterfahren bestehen.", - "Check SD Card": "Prüfe SD-Karte", - "Check that address belongs to this wallet?": "Überprüfen, ob diese Adresse zu dieser Wallet gehört?", - "Checked %d addresses with no matches.": "Überprüfte %d Adresse ohne Übereinstimmungen.", - "Checking for SD card..": "Suche nach SD-Karte..", - "Confirm Tamper Check Code": "Bestätigen Sie den Tamper Check Code", - "Could not execute %s": "Ausführung nicht möglich.", - "Create QR Code": "Erstelle QR-Code", - "Create QR code from text?": "QR-Code aus Text erzeugen?", - "Created:": "Erstellt:", - "Current Tamper Check Code": "Aktueller Tamper Check Code", - "Custom QR Code": "Benutzerdefinierte QR-Code", - "Customize": "Anpassen", - "Customizing your wallet will generate a new Key.": "Wenn Sie Ihr Wallet anpassen, wird ein neuer Schlüssel generiert.", - "Cut Depth": "Schnitttiefe", - "Cut Method": "Cut-Methode", - "Decimal": "Dezimal", - "Decrypt?": "Entschlüsseln?", - "Default Wallet": "Standard-Wallet", - "Depth Per Pass": "Tiefe pro Durchgang", - "Derive BIP85 entropy?": "BIP85-Entropie ableiten?", - "Descriptor Addresses": "Deskriptor-Adressen", - "Display": "Bildschirm", - "Do not power off, it may take a while to complete.": "Schalten Sie das Gerät nicht aus, es kann eine Weile dauern.", - "Done?": "Fertig?", - "Double mnemonic": "Doppelte Gedächtnisstütze", - "Driver": "Driver", - "Empty": "Leer", - "Enable Krux apps": "Krux-Apps aktivieren", - "Encrypted": "Verschlüsselt", - "Encrypted QR Code": "Verschlüsselter QR-Code", - "Encrypted mnemonic was not stored": "Verschlüsselte Mnemonic wurde nicht gespeichert", - "Encrypted mnemonic was stored with ID:": "Speicherung der verschlüsselten Mnemonic mit ID:", - "Encryption": "Verschlüsselung", - "Encryption Mode": "Verschlüsselungsmodus", - "Enter %d BIP-39 words.": "Geben Sie %d BIP-39 Wörter ein.", - "Enter a 6+ characters Tamper Check Code": "Geben Sie einen Tamper Check Code mit 6+ Zeichen ein", - "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Gib jedes Wort Deiner BIP-39 Mnemonic als Zahl von 1 bis 2048 ein.", - "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Gib jedes Wort Deiner BIP-39 Mnemonic als Hexadezimalzahl von 1 bis 800 ein.", - "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Gib jedes Wort Deiner BIP-39 Mnemonic als Oktalzahl von 1 bis 4000 ein.", - "Enter each word of your BIP-39 mnemonic.": "Gib jedes Wort Deiner BIP-39 Mnemonic ein.", - "Erase User's Data": "Benutzerdaten löschen", - "Erasing user's data..": "Benutzerdaten werden gelöscht..", - "Error:": "Fehler:", - "Esc": "Esc", - "Execute a signed Krux app?": "Eine signierte Krux-App ausführen?", - "Explore files?": "Dateien durchsuchen?", - "Exporting to SD card..": "Auf SD-Karte exportieren..", - "Extended Public Key": "Öffentlicher Schlüssel", - "Factory Settings": "Werkeinstellungen", - "Failed to decrypt": "Entschlüsselung fehlgeschlagen", - "Failed to load PSBT": "PSBT konnte nicht geladen werden", - "Failed to load address": "Adresse konnte nicht geladen werden", - "Failed to load key": "Schlüssel konnte nicht geladen werden", - "Failed to load message": "Nachricht konnte nicht geladen werden", - "Failed to load mnemonic": "Mnemonic konnte nicht geladen werden", - "Failed to load output descriptor": "Ausgabedeskriptor konnte nicht geladen werden", - "Failed to load passphrase": "Passphrase konnte nicht geladen werden", - "Failed to store mnemonic": "Mnemonic konnte nicht gespeichert werden", - "Fee:": "Gebühr:", - "Feed Rate": "Vorschubgeschwindigkeit", - "Filename": "Dateiname", - "Filename %s exists on SD card, overwrite?": "Dateiname %s existiert auf SD-Karte, überschreiben?", - "Fill the flash with entropy from camera?": "Den Flash mit Entropie von der Kamera füllen?", - "Filling Flash": "Flash wird gefüllt", - "Fingerprint unset in PSBT": "Fingerabdruck in PSBT deaktiviert", - "Firmware exceeds max size: %d": "Die Firmware übersteigt die maximale Größe: %d", - "Flash Map": "Flash-Karte", - "Flash Tools": "Flash-Tools", - "Flash filled with camera entropy": "Flash gefüllt mit Kameraentropie", - "Flipped X Coordinates": "Umgedrehte X-Koordinaten", - "Flute Diameter": "Flötendurchmesser", - "Free:": "Frei:", - "From Storage": "Vom Speicher", - "Fully erase your SD card in another device to ensure data is unrecoverable": "Löschen Sie Ihre SD-Karte vollständig in einem anderen Gerät, um sicherzustellen, dass die Daten nicht wiederhergestellt werden können", - "Generate Mnemonic": "Mnemonik erzeugen", - "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Dieser Mnemonic eine benutzerdefinierte ID zuteilen? Andernfalls wird der aktuelle Fingerabdruck verwendet", - "Go": "Go", - "Good entropy": "Gute Entropie", - "Hardware": "Hardware", - "Hex Public Key": "Hex öffentlicher Schlüssel", - "Hexadecimal": "Hexadezimal", - "Hide Mnemonics": "Mnemonics ausblenden", - "High fees!": "Hohe Gebühren!", - "ID already exists": "ID existiert bereits", - "Index": "Index", - "Index: %s": "Index: %s", - "Inputs (%d):": "Input (%d):", - "Install?": "Installieren?", - "Insufficient Entropy!": "Unzureichende Entropie!", - "Insufficient entropy": "Unzureichende Entropie", - "Invalid Tamper Check Code": "Ungültiger Tamper Check Code", - "Invalid address": "Ungültige Adresse", - "Invalid bootloader": "Ungültiger Bootloader", - "Invalid mnemonic length": "Ungültige mnemonische Lange", - "Invalid public key": "Ungültiger öffentlicher Schlüssel", - "Invalid wallet:": "Ungültige Wallet:", - "Invert": "Umkehren", - "Inverted Colors": "Invertierte Farben", - "Key": "Schlüssel", - "Key was not provided": "Schlüssel wurde nicht zur Verfügung gestellt", - "Krux Printer Test QR": "Krux Drucker Test-QR", - "LCD Type": "LCD-Typ", - "Language": "Sprache", - "Leave blank if you'd like Krux to pick a valid final word": "Lassen Sie das Feld leer, wenn Sie möchten, dass Krux ein gültiges letztes Wort auswählt", - "Left": "Links", - "Length: %s": "Länge: %s", - "Line Delay": "Leitungsverzögerung", - "Line:": "Linie:", - "Load Krux app": "Krux-App laden", - "Load Mnemonic": "Mnemonic laden", - "Load Wallet": "Wallet laden", - "Load a trusted wallet descriptor to view addresses?": "Einen vertrauenswürdigen Wallet-Deskriptor laden, um Adressen anzuzeigen?", - "Load from SD card": "Von SD-Karte laden", - "Load from SD card?": "Von SD-Karte laden?", - "Load from camera": "Von der Kamera laden", - "Load one?": "Eine laden?", - "Load?": "Laden?", - "Loading Camera..": "Lade Kamera..", - "Loading change addresses..": "Lade Change Adressen..", - "Loading printer..": "Drucker wird geladen..", - "Loading receive addresses..": "Lade Empfangsadressen..", - "Loading..": "Wird geladen..", - "Locale": "Spracheinstellung", - "Location": "Speicherort", - "Maximum length exceeded (%s)": "Maximale Länge überschritten (%s)", - "Message": "Nachricht", - "Message:": "Nachricht:", - "Missing signature file": "Fehlende Signaturdatei", - "Mnemonic": "Mnemonic", - "Mnemonic ID": "Mnemonische ID", - "Mnemonic and passphrase will be kept.": "Mnemotechnik und Passphrase werden beibehalten.", - "Mnemonic was not encrypted": "Mnemonic wurde nicht verschlüsselt", - "Modified:": "Geändert:", - "Multisig": "Multisig", - "Native Segwit - 84 would be assumed": "Native Segwit - 84 würde angenommen", - "Network": "Netzwerk", - "New Mnemonic": "Neue Mnemonic", - "New firmware detected.": "Neue Firmware erkannt.", - "No": "Nein", - "No Passphrase": "Keine Passphrase", - "Not enough rolls!": "Nicht genug Würfe!", - "Numbers": "Zahlen", - "Octal": "Oktal", - "Other Formats": "Andere Formate", - "PBKDF2 Iter.": "PBKDF2-Iter.", - "Paint punched dots black so they can be detected.": "Male gestanzte Punkte schwarz an, damit sie erkannt werden können.", - "Paper Width": "Papierbreite", - "Part": "Teil", - "Part Size": "Teilegröße", - "Passphrase": "Passphrase", - "Password Length": "Passwortlänge", - "Path mismatch": "Pfad stimmt nicht überein", - "Pattern detected!": "Muster erkannt!", - "Permanently remove all stored encrypted mnemonics and settings from flash?": "Alle gespeicherten verschlüsselten Mnemoniken und Einstellungen dauerhaft vom Flash-Speicher entfernen?", - "Persist": "Speicher", - "Pixels deviation index:": "Pixelabweichungsindex:", - "Plaintext QR": "Klartext-QR", - "Please load a wallet output descriptor": "Bitte lade einen Wallet Ausgabedeskriptor", - "Plunge Rate": "Tauchrate", - "Poor entropy": "Schlechte Entropie", - "Poor entropy detected!": "Schlechte Entropie erkannt!", - "Print Test QR": "Drucke Test-QR", - "Print Tiny Seed?": "Tiny Seed drucken?", - "Print to QR": "Als QR-Code drucken", - "Print to QR?": "Als QR-Code drucken?", - "Print?": "Drucken?", - "Printer": "Drucker", - "Printer Driver not set!": "Druckertreiber nicht gesetzt!", - "Printing..": "Wird gedruckt..", - "Proceed anyway?": "Trotzdem fortfahren?", - "Proceed?": "Weiter?", - "Processing..": "Wird bearbeitet..", - "QR Code": "QR-Code", - "RX Pin": "RX Pin", - "Reboot": "Neustart", - "Receive": "Empfangen", - "Receive Addresses": "Empfangsadresse", - "Region:": "Region:", - "Remove %s?": "Löschen %s?", - "Remove Mnemonic": "Mnemonic löschen", - "Remove firmware files from SD Card?": "Firmware-Dateien von der SD-Karte entfernen?", - "Res. - Format": "Res. - Format", - "Restore factory settings and reboot?": "Werkseinstellungen wiederherstellen und neu starten?", - "Return to QR Viewer": "Zurück zum QR-Viewer", - "Review scanned data, edit if necessary": "Überprüfe gescannte Daten und bearbeite sie bei Bedarf", - "Right": "Rechts", - "Roll dice at least %d times to generate a mnemonic.": "Würfel mindestens %d Mal, um eine Mnemonic zu erzeugen.", - "Rolls distribution:": "Rollenverteilung:", - "Rolls:": "Würfe:", - "SD card": "SD-Karte", - "SD card not detected.": "SD-Karte nicht erkannt.", - "SHA256 of rolls:": "SHA256 der Würfe:", - "SHA256 of snapshot:": "SHA256 des Snapshots:", - "Save QR Image to SD Card": "QR-Bild auf SD-Karte speichern", - "Save to SD card": "Auf SD-Karte speichern?", - "Save to SD card?": "Auf SD-Karte speichern?", - "Saved to SD card": "Auf SD-Karte gespeichert", - "Scale": "Skala", - "Scan Address": "Adresse\nscannen", - "Scan BIP39 Passphrase": "Scan BIP39 Passphrase", - "Scan Key QR Code": "Schlüssel QR-Code Scannen", - "Scanning words 1-12 again": "Wörter 1-12 erneut scannen", - "Scanning words 13-24": "Wörter 13-24 scannen", - "Screensaver Time": "Bildschirmschonerzeit", - "Script Type": "Script-Art", - "Security": "Sicherheit", - "Self-transfer or Change (%d):": "Selbstübertragung oder Change (%d):", - "Self-transfer:": "Selbstübertragung:", - "Set a tamper check code first": "Legen Sie zuerst einen Tamper Check Code fest", - "Settings": "Einstellungen", - "Settings stored internally on flash.": "Die Einstellungen werden intern auf Flash gespeichert.", - "Settings stored on SD card.": "Einstellungen auf SD-Karte gespeichert.", - "Shannon's Entropy:": "Shannons Entropie:", - "Shutdown": "Ausschalten", - "Shutdown Time": "Abschaltzeit:", - "Shutting down..": "Herunterfahren..", - "Sign": "Signieren", - "Sign to QR code": "Am QR-Code unterschreiben", - "Sign to SD card": "Auf SD-Karte signieren", - "Sign?": "Signieren?", - "Signature": "Signatur", - "Signed Message": "Signierte Nachricht", - "Signed PSBT": "Signierte PSBT", - "Signing..": "Unterschreiben..", - "Single-sig": "Single-Sig", - "Size:": "Größe:", - "Some checks cannot be performed.": "Einige Schecks können nicht durchgeführt werden.", - "Spend (%d):": "Ausgabe (%d):", - "Spend:": "Ausgaben:", - "Stats for Nerds": "Statistiken für Nerds", - "Store on Flash": "Auf Flash speichern", - "Store on SD Card": "Auf der SD-Karte speichern", - "Swipe to change mode": "Wischen um den Modus zu ändern", - "TC Flash Hash": "TC Flash-Hash", - "TC Flash Hash at Boot": "TC Flash-Hash beim Start", - "TOUCH or ENTER to capture": "TOUCH oder ENTER zum Erfassen", - "TX Pin": "TX Pin", - "Tamper Check Code": "Tamper Check Code", - "Tamper check code set successfully": "Tamper Check Code erfolgreich gesetzt", - "Tamper check codes do not match": "Tamper Check Codes stimmen nicht überein", - "Text": "Text", - "Theme": "Thema", - "Thermal": "Thermisch", - "To ensure data is unrecoverable use Wipe Device feature": "Um sicherzustellen, dass die Daten nicht wiederhergestellt werden können, verwenden Sie die Funktion 'Gerät löschen'", - "Toggle Brightness": "Helligkeit umschalten", - "Tools": "Werkzeuge", - "Touch Threshold": "Berühre Schwellenwert", - "Touchscreen": "Touchscreen", - "Try more?": "Weiter versuchen?", - "Type BIP39 Passphrase": "BIP39 Passphrase eingeben", - "Type Key": "Schlüssel eingeben", - "Unit": "Einheit", - "Upgrade complete.": "Upgrade abgeschlossen.", - "Use a black background surface.": "Verwende eine schwarze Hintergrundfläche.", - "Use camera's entropy to create a new mnemonic": "Verwende die Entropie der Kamera, um eine neue Mnemonic zu erstellen", - "Used:": "Belegt:", - "User's Data": "Benutzerdaten", - "Value %s out of range: [%s, %s]": "Wert %S außerhalb des Bereichs: [ %s, %s]", - "Value must be multiple of %s": "Der Wert muss ein Vielfaches von %s sein", - "Verifying..": "Überprüfung..", - "Version": "Version", - "Via Camera": "Via Kamera", - "Via D20": "Via D20", - "Via D6": "Via D6", - "Via Manual Input": "Via manueller Eingabe", - "Via Words": "Via Wörter", - "Wait for the capture": "Warte auf die Erfassung", - "Wallet": "Wallet", - "Wallet Descriptor": "Wallet-Deskriptor", - "Wallet output descriptor": "Wallet Ausgabedeskriptor", - "Wallet output descriptor loaded!": "Wallet Ausgabedeskriptor geladen!", - "Wallet output descriptor not found.": "Wallet Ausgabedeskriptor nicht gefunden.", - "Warning:": "Warnung:", - "Word %d": "Wort %d", - "Word Numbers": "Wortnummern", - "Words": "Wörter", - "Yes": "Ja", - "is a valid address!": "ist eine gültige Adresse!", - "was NOT FOUND in the first %d addresses": "wurde in den ersten %d Adressen nicht gefunden" -} \ No newline at end of file +{"% of the amount.": "% des Betrags.", "%d of %d multisig": "%d von %d Multisig", "%d to %d": "%d bis %d ", "%s removed.": "%s wurde entfernt.", "(%d total)": "(%d insgesamt)", "(Experimental)": "(Experimental)", "(watch-only)": "(nur zur Betrachtung)", "12 words": "12 Wörter", "24 words": "24 Wörter", "About": "Über", "Accept assumption?": "Annahme akzeptieren?", "Account": "Konto", "Account #0 would be assumed": "Konto #0 würde angenommen", "Account Index": "Kontoindex", "Add or change wallet passphrase?": "Wallet-Passphrase hinzufügen oder ändern?", "Additional entropy from camera required for AES-CBC mode": "Zusätzliche Entropie von der Kamera für den AES-CBC-Modus erforderlich", "Address": "Adresse", "Align camera and backup plate properly.": "Richte Kamera und Sicherungsplatte richtig aus.", "Allow in settings first!": "Erlaube zuerst Einstellungen!", "Anti-glare disabled": "Blendschutz deaktiviert", "Anti-glare enabled": "Blendschutz aktiviert", "Appearance": "Aussehen", "Are you sure?": "Bist Du sicher?", "BGR Colors": "BGR-Farben", "BIP39 Mnemonic": "BIP39-Mnemonik", "Back": "Zurück", "Back to Menu": "Zurück zum Menü", "Backup Mnemonic": "Mnemonik-Backup", "Bad signature": "Ungültige Signatur", "Base64 Password": "Base64-Passwort", "Baudrate": "Baudrate", "Binary Grid": "Binäres Gitter", "Border Padding": "Randpolsterung", "Brightness": "Helligkeit", "Buttons": "Tasten", "Buttons Debounce": "Entprellung der Tasten", "Capture cancelled": "Aufnahme abgebrochen", "Change": "Change Adresse", "Change Addresses": "Change Adressen", "Change theme and reboot?": "Thema ändern und neu starten?", "Change:": "Change:", "Changes will last until shutdown.": "Änderungen bleiben bis zum Herunterfahren bestehen.", "Check SD Card": "Prüfe SD-Karte", "Check that address belongs to this wallet?": "Überprüfen, ob diese Adresse zu dieser Wallet gehört?", "Checked %d addresses with no matches.": "Überprüfte %d Adresse ohne Übereinstimmungen.", "Checking for SD card..": "Suche nach SD-Karte..", "Confirm Tamper Check Code": "Bestätigen Sie den Tamper Check Code", "Create QR Code": "Erstelle QR-Code", "Create QR code from text?": "QR-Code aus Text erzeugen?", "Created:": "Erstellt:", "Current Tamper Check Code": "Aktueller Tamper Check Code", "Custom QR Code": "Benutzerdefinierte QR-Code", "Customize": "Anpassen", "Customizing your wallet will generate a new Key.": "Wenn Sie Ihr Wallet anpassen, wird ein neuer Schlüssel generiert.", "Cut Depth": "Schnitttiefe", "Cut Method": "Cut-Methode", "Decimal": "Dezimal", "Decrypt?": "Entschlüsseln?", "Default Wallet": "Standard-Wallet", "Depth Per Pass": "Tiefe pro Durchgang", "Derive BIP85 entropy?": "BIP85-Entropie ableiten?", "Descriptor Addresses": "Deskriptor-Adressen", "Display": "Bildschirm", "Do not power off, it may take a while to complete.": "Schalten Sie das Gerät nicht aus, es kann eine Weile dauern.", "Done?": "Fertig?", "Double mnemonic": "Doppelte Gedächtnisstütze", "Driver": "Driver", "Empty": "Leer", "Enable Krux apps": "Krux-Apps aktivieren", "Encrypted": "Verschlüsselt", "Encrypted QR Code": "Verschlüsselter QR-Code", "Encrypted mnemonic was not stored": "Verschlüsselte Mnemonic wurde nicht gespeichert", "Encrypted mnemonic was stored with ID:": "Speicherung der verschlüsselten Mnemonic mit ID:", "Encryption": "Verschlüsselung", "Encryption Mode": "Verschlüsselungsmodus", "Enter %d BIP-39 words.": "Geben Sie %d BIP-39 Wörter ein.", "Enter a 6+ characters Tamper Check Code": "Geben Sie einen Tamper Check Code mit 6+ Zeichen ein", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Gib jedes Wort Deiner BIP-39 Mnemonic als Zahl von 1 bis 2048 ein.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Gib jedes Wort Deiner BIP-39 Mnemonic als Hexadezimalzahl von 1 bis 800 ein.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Gib jedes Wort Deiner BIP-39 Mnemonic als Oktalzahl von 1 bis 4000 ein.", "Enter each word of your BIP-39 mnemonic.": "Gib jedes Wort Deiner BIP-39 Mnemonic ein.", "Erase User's Data": "Benutzerdaten löschen", "Erasing user's data..": "Benutzerdaten werden gelöscht..", "Error:": "Fehler:", "Esc": "Esc", "Execute a signed Krux app?": "Eine signierte Krux-App ausführen?", "Explore files?": "Dateien durchsuchen?", "Exporting to SD card..": "Auf SD-Karte exportieren..", "Extended Public Key": "Öffentlicher Schlüssel", "Factory Settings": "Werkeinstellungen", "Failed to decrypt": "Entschlüsselung fehlgeschlagen", "Failed to load PSBT": "PSBT konnte nicht geladen werden", "Failed to load address": "Adresse konnte nicht geladen werden", "Failed to load key": "Schlüssel konnte nicht geladen werden", "Failed to load message": "Nachricht konnte nicht geladen werden", "Failed to load mnemonic": "Mnemonic konnte nicht geladen werden", "Failed to load output descriptor": "Ausgabedeskriptor konnte nicht geladen werden", "Failed to load passphrase": "Passphrase konnte nicht geladen werden", "Failed to store mnemonic": "Mnemonic konnte nicht gespeichert werden", "Fee:": "Gebühr:", "Feed Rate": "Vorschubgeschwindigkeit", "Filename": "Dateiname", "Filename %s exists on SD card, overwrite?": "Dateiname %s existiert auf SD-Karte, überschreiben?", "Fill the flash with entropy from camera?": "Den Flash mit Entropie von der Kamera füllen?", "Filling Flash": "Flash wird gefüllt", "Fingerprint unset in PSBT": "Fingerabdruck in PSBT deaktiviert", "Firmware exceeds max size: %d": "Die Firmware übersteigt die maximale Größe: %d", "Flash Map": "Flash-Karte", "Flash Tools": "Flash-Tools", "Flash filled with camera entropy": "Flash gefüllt mit Kameraentropie", "Flipped X Coordinates": "Umgedrehte X-Koordinaten", "Flute Diameter": "Flötendurchmesser", "Free:": "Frei:", "From Storage": "Vom Speicher", "Fully erase your SD card in another device to ensure data is unrecoverable": "Löschen Sie Ihre SD-Karte vollständig in einem anderen Gerät, um sicherzustellen, dass die Daten nicht wiederhergestellt werden können", "Generate Mnemonic": "Mnemonik erzeugen", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Dieser Mnemonic eine benutzerdefinierte ID zuteilen? Andernfalls wird der aktuelle Fingerabdruck verwendet", "Go": "Go", "Good entropy": "Gute Entropie", "Hardware": "Hardware", "Hex Public Key": "Hex öffentlicher Schlüssel", "Hexadecimal": "Hexadezimal", "Hide Mnemonics": "Mnemonics ausblenden", "High fees!": "Hohe Gebühren!", "ID already exists": "ID existiert bereits", "Index": "Index", "Index: %s": "Index: %s", "Inputs (%d):": "Input (%d):", "Install?": "Installieren?", "Insufficient Entropy!": "Unzureichende Entropie!", "Insufficient entropy": "Unzureichende Entropie", "Invalid Tamper Check Code": "Ungültiger Tamper Check Code", "Invalid address": "Ungültige Adresse", "Invalid bootloader": "Ungültiger Bootloader", "Invalid mnemonic length": "Ungültige mnemonische Lange", "Invalid public key": "Ungültiger öffentlicher Schlüssel", "Invalid wallet:": "Ungültige Wallet:", "Invert": "Umkehren", "Inverted Colors": "Invertierte Farben", "Key": "Schlüssel", "Key was not provided": "Schlüssel wurde nicht zur Verfügung gestellt", "Krux Printer Test QR": "Krux Drucker Test-QR", "LCD Type": "LCD-Typ", "Language": "Sprache", "Leave blank if you'd like Krux to pick a valid final word": "Lassen Sie das Feld leer, wenn Sie möchten, dass Krux ein gültiges letztes Wort auswählt", "Left": "Links", "Length: %s": "Länge: %s", "Line Delay": "Leitungsverzögerung", "Line:": "Linie:", "Load Krux app": "Krux-App laden", "Load Mnemonic": "Mnemonic laden", "Load Wallet": "Wallet laden", "Load a trusted wallet descriptor to view addresses?": "Einen vertrauenswürdigen Wallet-Deskriptor laden, um Adressen anzuzeigen?", "Load from SD card": "Von SD-Karte laden", "Load from SD card?": "Von SD-Karte laden?", "Load from camera": "Von der Kamera laden", "Load one?": "Eine laden?", "Load?": "Laden?", "Loading Camera..": "Lade Kamera..", "Loading change addresses..": "Lade Change Adressen..", "Loading printer..": "Drucker wird geladen..", "Loading receive addresses..": "Lade Empfangsadressen..", "Loading..": "Wird geladen..", "Locale": "Spracheinstellung", "Location": "Speicherort", "Maximum length exceeded (%s)": "Maximale Länge überschritten (%s)", "Message": "Nachricht", "Message:": "Nachricht:", "Missing signature file": "Fehlende Signaturdatei", "Mnemonic": "Mnemonic", "Mnemonic ID": "Mnemonische ID", "Mnemonic and passphrase will be kept.": "Mnemotechnik und Passphrase werden beibehalten.", "Mnemonic was not encrypted": "Mnemonic wurde nicht verschlüsselt", "Modified:": "Geändert:", "Multisig": "Multisig", "Native Segwit - 84 would be assumed": "Native Segwit - 84 würde angenommen", "Network": "Netzwerk", "New Mnemonic": "Neue Mnemonic", "New firmware detected.": "Neue Firmware erkannt.", "No": "Nein", "No Passphrase": "Keine Passphrase", "Not enough rolls!": "Nicht genug Würfe!", "Numbers": "Zahlen", "Octal": "Oktal", "Other Formats": "Andere Formate", "PBKDF2 Iter.": "PBKDF2-Iter.", "Paint punched dots black so they can be detected.": "Male gestanzte Punkte schwarz an, damit sie erkannt werden können.", "Paper Width": "Papierbreite", "Part": "Teil", "Part Size": "Teilegröße", "Passphrase": "Passphrase", "Password Length": "Passwortlänge", "Path mismatch": "Pfad stimmt nicht überein", "Pattern detected!": "Muster erkannt!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "Alle gespeicherten verschlüsselten Mnemoniken und Einstellungen dauerhaft vom Flash-Speicher entfernen?", "Persist": "Speicher", "Pixels deviation index:": "Pixelabweichungsindex:", "Plaintext QR": "Klartext-QR", "Please load a wallet output descriptor": "Bitte lade einen Wallet Ausgabedeskriptor", "Plunge Rate": "Tauchrate", "Poor entropy": "Schlechte Entropie", "Poor entropy detected!": "Schlechte Entropie erkannt!", "Print Test QR": "Drucke Test-QR", "Print Tiny Seed?": "Tiny Seed drucken?", "Print to QR": "Als QR-Code drucken", "Print to QR?": "Als QR-Code drucken?", "Print?": "Drucken?", "Printer": "Drucker", "Printer Driver not set!": "Druckertreiber nicht gesetzt!", "Printing..": "Wird gedruckt..", "Proceed anyway?": "Trotzdem fortfahren?", "Proceed?": "Weiter?", "Processing..": "Wird bearbeitet..", "QR Code": "QR-Code", "RX Pin": "RX Pin", "Reboot": "Neustart", "Receive": "Empfangen", "Receive Addresses": "Empfangsadresse", "Region:": "Region:", "Remove %s?": "Löschen %s?", "Remove Mnemonic": "Mnemonic löschen", "Remove firmware files from SD Card?": "Firmware-Dateien von der SD-Karte entfernen?", "Res. - Format": "Res. - Format", "Restore factory settings and reboot?": "Werkseinstellungen wiederherstellen und neu starten?", "Return to QR Viewer": "Zurück zum QR-Viewer", "Review scanned data, edit if necessary": "Überprüfe gescannte Daten und bearbeite sie bei Bedarf", "Right": "Rechts", "Roll dice at least %d times to generate a mnemonic.": "Würfel mindestens %d Mal, um eine Mnemonic zu erzeugen.", "Rolls distribution:": "Rollenverteilung:", "Rolls:": "Würfe:", "SD card": "SD-Karte", "SD card not detected.": "SD-Karte nicht erkannt.", "SHA256 of rolls:": "SHA256 der Würfe:", "SHA256 of snapshot:": "SHA256 des Snapshots:", "Save QR Image to SD Card": "QR-Bild auf SD-Karte speichern", "Save to SD card": "Auf SD-Karte speichern?", "Save to SD card?": "Auf SD-Karte speichern?", "Saved to SD card": "Auf SD-Karte gespeichert", "Scale": "Skala", "Scan Address": "Adresse\nscannen", "Scan BIP39 Passphrase": "Scan BIP39 Passphrase", "Scan Key QR Code": "Schlüssel QR-Code Scannen", "Scanning words 1-12 again": "Wörter 1-12 erneut scannen", "Scanning words 13-24": "Wörter 13-24 scannen", "Screensaver Time": "Bildschirmschonerzeit", "Script Type": "Script-Art", "Security": "Sicherheit", "Self-transfer or Change (%d):": "Selbstübertragung oder Change (%d):", "Self-transfer:": "Selbstübertragung:", "Set a tamper check code first": "Legen Sie zuerst einen Tamper Check Code fest", "Settings": "Einstellungen", "Settings stored internally on flash.": "Die Einstellungen werden intern auf Flash gespeichert.", "Settings stored on SD card.": "Einstellungen auf SD-Karte gespeichert.", "Shannon's Entropy:": "Shannons Entropie:", "Shutdown": "Ausschalten", "Shutdown Time": "Abschaltzeit:", "Shutting down..": "Herunterfahren..", "Sign": "Signieren", "Sign to QR code": "Am QR-Code unterschreiben", "Sign to SD card": "Auf SD-Karte signieren", "Sign?": "Signieren?", "Signature": "Signatur", "Signed Message": "Signierte Nachricht", "Signed PSBT": "Signierte PSBT", "Signing..": "Unterschreiben..", "Single-sig": "Single-Sig", "Size:": "Größe:", "Some checks cannot be performed.": "Einige Schecks können nicht durchgeführt werden.", "Spend (%d):": "Ausgabe (%d):", "Spend:": "Ausgaben:", "Stats for Nerds": "Statistiken für Nerds", "Store on Flash": "Auf Flash speichern", "Store on SD Card": "Auf der SD-Karte speichern", "Swipe to change mode": "Wischen um den Modus zu ändern", "TC Flash Hash": "TC Flash-Hash", "TC Flash Hash at Boot": "TC Flash-Hash beim Start", "TOUCH or ENTER to capture": "TOUCH oder ENTER zum Erfassen", "TX Pin": "TX Pin", "Tamper Check Code": "Tamper Check Code", "Tamper check code set successfully": "Tamper Check Code erfolgreich gesetzt", "Tamper check codes do not match": "Tamper Check Codes stimmen nicht überein", "Text": "Text", "Theme": "Thema", "Thermal": "Thermisch", "To ensure data is unrecoverable use Wipe Device feature": "Um sicherzustellen, dass die Daten nicht wiederhergestellt werden können, verwenden Sie die Funktion 'Gerät löschen'", "Toggle Brightness": "Helligkeit umschalten", "Tools": "Werkzeuge", "Touch Threshold": "Berühre Schwellenwert", "Touchscreen": "Touchscreen", "Try more?": "Weiter versuchen?", "Type BIP39 Passphrase": "BIP39 Passphrase eingeben", "Type Key": "Schlüssel eingeben", "Unit": "Einheit", "Upgrade complete.": "Upgrade abgeschlossen.", "Use a black background surface.": "Verwende eine schwarze Hintergrundfläche.", "Use camera's entropy to create a new mnemonic": "Verwende die Entropie der Kamera, um eine neue Mnemonic zu erstellen", "Used:": "Belegt:", "User's Data": "Benutzerdaten", "Value %s out of range: [%s, %s]": "Wert %S außerhalb des Bereichs: [ %s, %s]", "Value must be multiple of %s": "Der Wert muss ein Vielfaches von %s sein", "Verifying..": "Überprüfung..", "Version": "Version", "Via Camera": "Via Kamera", "Via D20": "Via D20", "Via D6": "Via D6", "Via Manual Input": "Via manueller Eingabe", "Via Words": "Via Wörter", "Wait for the capture": "Warte auf die Erfassung", "Wallet": "Wallet", "Wallet Descriptor": "Wallet-Deskriptor", "Wallet output descriptor": "Wallet Ausgabedeskriptor", "Wallet output descriptor loaded!": "Wallet Ausgabedeskriptor geladen!", "Wallet output descriptor not found.": "Wallet Ausgabedeskriptor nicht gefunden.", "Warning:": "Warnung:", "Word %d": "Wort %d", "Word Numbers": "Wortnummern", "Words": "Wörter", "Yes": "Ja", "is a valid address!": "ist eine gültige Adresse!", "was NOT FOUND in the first %d addresses": "wurde in den ersten %d Adressen nicht gefunden"} \ No newline at end of file diff --git a/i18n/translations/es-MX.json b/i18n/translations/es-MX.json index abdfe17cb..a5383063d 100644 --- a/i18n/translations/es-MX.json +++ b/i18n/translations/es-MX.json @@ -1,323 +1 @@ -{ - "% of the amount.": "% del monto.", - "%d of %d multisig": "%d de %d multisig", - "%d to %d": "%d a %d", - "%s removed.": "%s eliminado.", - "(%d total)": "(%d total)", - "(Experimental)": "(Experimental)", - "(watch-only)": "(Solo para observación)", - "12 words": "12 palabras", - "24 words": "24 palabras", - "About": "Nosotros", - "Accept assumption?": "¿Aceptar la suposición?", - "Account": "Cuenta", - "Account #0 would be assumed": "Se supondría que la cuenta #0", - "Account Index": "Índice de la cuenta", - "Add or change wallet passphrase?": "¿Añadir o cambiar passphrase de la cartera?", - "Additional entropy from camera required for AES-CBC mode": "Se requiere entropía adicional de la cámara para el modo AES-CBC", - "Address": "Dirección", - "Align camera and backup plate properly.": "Alinea la cámara y la placa de respaldo correctamente.", - "Allow in settings first!": "¡Permitir en la configuración primero!", - "Anti-glare disabled": "Anti-reflejo desactivado", - "Anti-glare enabled": "Anti-reflejo habilitado", - "Appearance": "Apariencia", - "Are you sure?": "¿Estás seguro?", - "BGR Colors": "Colores BGR", - "BIP39 Mnemonic": "Mnemónico BIP39", - "Back": "Atrás", - "Back to Menu": "Volver al Menú", - "Backup Mnemonic": "Backup del Mnemónico", - "Bad signature": "Firma incorrecta", - "Base64 Password": "Contraseña Base64", - "Baudrate": "Baudrate", - "Binary Grid": "Cuadrícula binaria", - "Border Padding": "Grosor del Borde", - "Brightness": "Brillo", - "Buttons": "Botones", - "Buttons Debounce": "Rebote de Botones", - "Capture cancelled": "Captura cancelada", - "Change": "Cambio", - "Change Addresses": "Direcciones de Cambio", - "Change theme and reboot?": "¿Cambiar de tema y reiniciar?", - "Change:": "Cambio:", - "Changes will last until shutdown.": "Los cambios durarán hasta que el dispositivo se apague.", - "Check SD Card": "Verifica Tarjeta SD", - "Check that address belongs to this wallet?": "¿Verificar que la dirección pertenece a esta cartera?", - "Checked %d addresses with no matches.": "Comprobado %d direcciones sin coincidencias.", - "Checking for SD card..": "Comprobación de la tarjeta SD..", - "Confirm Tamper Check Code": "Confirmar el código de verificación", - "Could not execute %s": "no se pudo ejecutar [%1]", - "Create QR Code": "Crear Código QR", - "Create QR code from text?": "¿Crear código QR desde texto?", - "Created:": "Creado:", - "Current Tamper Check Code": "Código de verificación actual", - "Custom QR Code": "Código QR Personalizado", - "Customize": "Personalizar", - "Customizing your wallet will generate a new Key.": "Personalizar tu cartera generará una nueva clave", - "Cut Depth": "Profundidad de Corte", - "Cut Method": "Método de Corte", - "Decimal": "Decimal", - "Decrypt?": "¿Descifrar?", - "Default Wallet": "Cartera Predeterminada", - "Depth Per Pass": "Profundidad por Pasada", - "Derive BIP85 entropy?": "¿Derivar entropía BIP85?", - "Descriptor Addresses": "Direcciones del descriptor", - "Display": "Pantalla", - "Do not power off, it may take a while to complete.": "No apagues el dispositivo, puede tardar un tiempo en completarse.", - "Done?": "¿Listo?", - "Double mnemonic": "Doble mnemónico", - "Driver": "Operador", - "Empty": "Vacío", - "Enable Krux apps": "Habilitar aplicaciones Krux", - "Encrypted": "Cifrado", - "Encrypted QR Code": "Código QR Cifrado", - "Encrypted mnemonic was not stored": "Mnemónico cifrado no se almacenó", - "Encrypted mnemonic was stored with ID:": "Mnemónico cifrado fue almacenado con ID:", - "Encryption": "Cifrado", - "Encryption Mode": "Modo de Cifrado", - "Enter %d BIP-39 words.": "Ingrese %d palabras BIP-39.", - "Enter a 6+ characters Tamper Check Code": "Introduzca un código de verificación de más de 6 caracteres", - "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Ingresa cada palabra de tu mnemónico BIP-39 como un número del 1 al 2048.", - "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Ingresa cada palabra de tu mnemónico BIP-39 como un número en hexadecimal del 1 al 800.", - "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Ingresa cada palabra de tu mnemónico BIP-39 como un número en octal del 1 al 4000.", - "Enter each word of your BIP-39 mnemonic.": "Ingresa cada palabra de tu mnemónico BIP-39.", - "Erase User's Data": "Borrar datos de usuario", - "Erasing user's data..": "Borrando los datos del usuario..", - "Error:": "Error:", - "Esc": "Esc", - "Execute a signed Krux app?": "¿Ejecutar una aplicación Krux firmada?", - "Explore files?": "¿Explorar archivos?", - "Exporting to SD card..": "Exportando a la tarjeta SD..", - "Extended Public Key": "Clave Pública Extendida", - "Factory Settings": "Ajustes de Fábrica", - "Failed to decrypt": "Error al descifrar", - "Failed to load PSBT": "No se pudo cargar la PSBT", - "Failed to load address": "No se pudo cargar la dirección", - "Failed to load key": "No se pudo cargar la clave", - "Failed to load message": "No se pudo cargar el mensaje", - "Failed to load mnemonic": "No se pudo importar el mnemónico", - "Failed to load output descriptor": "No se pudo cargar el descriptor de salida", - "Failed to load passphrase": "No se pudo cargar el passphrase", - "Failed to store mnemonic": "No pudo almacenar mnemónico", - "Fee:": "Comisión:", - "Feed Rate": "Feed Rate", - "Filename": "Nombre del Archivo", - "Filename %s exists on SD card, overwrite?": "El nombre de archivo %s existe en la tarjeta SD, ¿sobrescribir?", - "Fill the flash with entropy from camera?": "¿Llenar el flash con entropía de la cámara?", - "Filling Flash": "Llenando Flash", - "Fingerprint unset in PSBT": "Huella dactilar no establecida en PSBT", - "Firmware exceeds max size: %d": "El firmware supera el tamaño máximo: %d", - "Flash Map": "Mapa Flash", - "Flash Tools": "Flash Tools", - "Flash filled with camera entropy": "Flash lleno de entropía de cámara", - "Flipped X Coordinates": "Coordenadas X Invertidas", - "Flute Diameter": "Diámetro de la Flauta", - "Free:": "Libre:", - "From Storage": "Desde el Almacenamiento", - "Fully erase your SD card in another device to ensure data is unrecoverable": "Borra completamente su tarjeta SD en otro dispositivo para asegurarse de que los datos sean irrecuperables", - "Generate Mnemonic": "Generar Mnemónico", - "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "¿Darle a este mnemónico una identificación personalizada? De lo contrario se utilizará el fingerprint actual", - "Go": "Ir", - "Good entropy": "Buena entropía", - "Hardware": "Hardware", - "Hex Public Key": "Clave Pública Hexadecimal", - "Hexadecimal": "Hexadecimal", - "Hide Mnemonics": "Ocultar Mnemónicos", - "High fees!": "¡Tarifas altas!", - "ID already exists": "ID ya existe", - "Index": "Índice", - "Index: %s": "Índice: %s", - "Inputs (%d):": "Entradas (%d):", - "Install?": "¿Instalar?", - "Insufficient Entropy!": "¡Entropía Insuficiente!", - "Insufficient entropy": "Entropía insuficiente", - "Invalid Tamper Check Code": "Código de verificación no válido", - "Invalid address": "Dirección inválida", - "Invalid bootloader": "Bootloader inválido", - "Invalid mnemonic length": "Longitud mnemónica no válida", - "Invalid public key": "Clave pública inválida", - "Invalid wallet:": "Cartera inválida:", - "Invert": "Invertir", - "Inverted Colors": "Colores Invertidos", - "Key": "Clave", - "Key was not provided": "No se proporcionó la clave", - "Krux Printer Test QR": "Test de impresión QR", - "LCD Type": "Tipo de LCD", - "Language": "Idioma", - "Leave blank if you'd like Krux to pick a valid final word": "Déjalo en blanco si quieres que Krux elija una última palabra válida", - "Left": "Izquierda", - "Length: %s": "Longitud: %s", - "Line Delay": "Retraso de Línea", - "Line:": "Línea:", - "Load Krux app": "Cargar aplicación Krux", - "Load Mnemonic": "Importar Mnemónico", - "Load Wallet": "Cargar Cartera", - "Load a trusted wallet descriptor to view addresses?": "¿Cargar un descriptor de monedero de confianza para ver las direcciones?", - "Load from SD card": "Cargar desde tarjeta SD", - "Load from SD card?": "¿Cargar desde la tarjeta SD?", - "Load from camera": "Cargar desde la cámara", - "Load one?": "¿Cargar algo?", - "Load?": "¿Cargar?", - "Loading Camera..": "Cargando Camara..", - "Loading change addresses..": "Cargando direcciones de cambio..", - "Loading printer..": "Cargando impresora..", - "Loading receive addresses..": "Cargando direcciones de recepción..", - "Loading..": "Cargando..", - "Locale": "Idioma", - "Location": "Ubicación", - "Maximum length exceeded (%s)": "Longitud máxima excedida (%s)", - "Message": "Mensaje", - "Message:": "Mensaje:", - "Missing signature file": "Falta archivo de firma", - "Mnemonic": "Mnemónico", - "Mnemonic ID": "Identificación del Mnemónico", - "Mnemonic and passphrase will be kept.": "Mnemónico y passphrase se mantendrán.", - "Mnemonic was not encrypted": "Mnemónico no fue descifrado", - "Modified:": "Modificado:", - "Multisig": "Multisig", - "Native Segwit - 84 would be assumed": "Segwit nativo - 84 se supondría", - "Network": "Red", - "New Mnemonic": "Nuevo Mnemónico", - "New firmware detected.": "Nuevo firmware detectado.", - "No": "No", - "No Passphrase": "Sin Passphrase", - "Not enough rolls!": "¡No hay suficientes tiradas!", - "Numbers": "Números", - "Octal": "Octales", - "Other Formats": "Otros Formatos", - "PBKDF2 Iter.": "Iter. PBKDF2", - "Paint punched dots black so they can be detected.": "Pinte los puntos perforados de negro para que puedan ser detectados.", - "Paper Width": "Ancho del Papel", - "Part": "Parte", - "Part Size": "Tamaño de la Pieza", - "Passphrase": "Passphrase", - "Password Length": "Longitud", - "Path mismatch": "La ruta no coincide", - "Pattern detected!": "¡Patrón detectado!", - "Permanently remove all stored encrypted mnemonics and settings from flash?": "¿Eliminar permanentemente todos los mnemónicos y configuraciones cifradas almacenadas del flash?", - "Persist": "Guardar", - "Pixels deviation index:": "Índice de desviación de píxeles:", - "Plaintext QR": "QR de Texto", - "Please load a wallet output descriptor": "Carga un descriptor de cartera", - "Plunge Rate": "Tasa de Caída", - "Poor entropy": "Baja entropía", - "Poor entropy detected!": "Mala entropía detectada!", - "Print Test QR": "Prueba de Impresión QR", - "Print Tiny Seed?": "¿Imprimir Tiny Seed?", - "Print to QR": "Imprimir como Código QR", - "Print to QR?": "¿Imprimir con Codigo QR?", - "Print?": "¿Impresión?", - "Printer": "Impresora", - "Printer Driver not set!": "¡El controlador de impresora no está configurado!", - "Printing..": "Imprimiendo..", - "Proceed anyway?": "¿Proceder de todas maneras?", - "Proceed?": "¿Continuar?", - "Processing..": "Procesando..", - "QR Code": "Código QR", - "RX Pin": "RX Pin", - "Reboot": "Reiniciar", - "Receive": "Recepción", - "Receive Addresses": "Direcciones de Recepción", - "Region:": "Región:", - "Remove %s?": "Eliminar %s?", - "Remove Mnemonic": "Eliminar Mnemónico", - "Remove firmware files from SD Card?": "¿Eliminar archivos de firmware de la tarjeta SD?", - "Res. - Format": "Res. - Formato", - "Restore factory settings and reboot?": "¿Restablecer a la configuración de fábrica y reiniciar?", - "Return to QR Viewer": "Volver al QR", - "Review scanned data, edit if necessary": "Revisa los datos escaneados, edítalos si es necesario", - "Right": "Derecha", - "Roll dice at least %d times to generate a mnemonic.": "Tira el dado al menos %d veces para generar un mnemónico.", - "Rolls distribution:": "Distribución de tiradas:", - "Rolls:": "Tiradas:", - "SD card": "Tarjeta SD", - "SD card not detected.": "Tarjeta SD no detectada.", - "SHA256 of rolls:": "SHA256 de las tiradas:", - "SHA256 of snapshot:": "SHA256 de la instantánea:", - "Save QR Image to SD Card": "Guardar Imagen QR en la Tarjeta SD", - "Save to SD card": "Guardar en tarjeta SD", - "Save to SD card?": "¿Guardar en la tarjeta SD?", - "Saved to SD card": "Guardado en la tarjeta SD", - "Scale": "Escala", - "Scan Address": "Escanear Dirección", - "Scan BIP39 Passphrase": "Escanear Passphrase BIP39", - "Scan Key QR Code": "Escanear el Código QR", - "Scanning words 1-12 again": "Escaneo de palabras 1-12 de nuevo", - "Scanning words 13-24": "Escaneo de palabras 13-24", - "Screensaver Time": "Tiempo de Espera del Protector de Pantalla", - "Script Type": "Tipo de Script", - "Security": "Seguridad", - "Self-transfer or Change (%d):": "Autotransferencia o Cambio (%d):", - "Self-transfer:": "Autotransferencia:", - "Set a tamper check code first": "Establezca primero un código de verificación", - "Settings": "Ajustes", - "Settings stored internally on flash.": "Ajustes almacenados internamente en flash.", - "Settings stored on SD card.": "Configuración almacenada en la tarjeta SD.", - "Shannon's Entropy:": "Entropía de Shannon:", - "Shutdown": "Apagar", - "Shutdown Time": "Tiempo de Apagado", - "Shutting down..": "Apagando..", - "Sign": "Firmar", - "Sign to QR code": "Firmar en Código QR", - "Sign to SD card": "Firmar en la Tarjeta SD", - "Sign?": "¿Firmar?", - "Signature": "Firma", - "Signed Message": "Mensaje Firmado", - "Signed PSBT": "PSBT Firmado", - "Signing..": "Firmando..", - "Single-sig": "Single-sig", - "Size:": "Tamaño:", - "Some checks cannot be performed.": "Algunas comprobaciones no se pueden realizar.", - "Spend (%d):": "Gastos (%d):", - "Spend:": "Gasto:", - "Stats for Nerds": "Estadísticas para Entendidos", - "Store on Flash": "Almacenar en Flash", - "Store on SD Card": "Almacenar en la Tarjeta SD", - "Swipe to change mode": "Deslizar para cambiar de modo", - "TC Flash Hash": "TC Hash Flash", - "TC Flash Hash at Boot": "TC Flash Hash al arranque", - "TOUCH or ENTER to capture": "TOCA o ENTER para capturar", - "TX Pin": "TX Pin", - "Tamper Check Code": "Código de verificación", - "Tamper check code set successfully": "Código de verificación establecido con éxito", - "Tamper check codes do not match": "Los códigos de verificación no coinciden", - "Text": "Texto", - "Theme": "Tema", - "Thermal": "Térmico", - "To ensure data is unrecoverable use Wipe Device feature": "Para garantizar que los datos no se puedan recuperar, utiliza la función de borrar dispositivo", - "Toggle Brightness": "Alternar Brillo", - "Tools": "Herramientas", - "Touch Threshold": "Umbral Táctil", - "Touchscreen": "Pantalla Táctil", - "Try more?": "¿Intentar con mas?", - "Type BIP39 Passphrase": "Escribe la Passphrase BIP39", - "Type Key": "Introduce la clave", - "Unit": "Unidad", - "Upgrade complete.": "Actualización completa.", - "Use a black background surface.": "Usa una superficie de fondo negra.", - "Use camera's entropy to create a new mnemonic": "Usa la entropía de la cámara para crear una nueva mnemónica", - "Used:": "Usado:", - "User's Data": "Usuario", - "Value %s out of range: [%s, %s]": "Valor %s fuera del rango: [ %s, %s]", - "Value must be multiple of %s": "El valor debe ser múltiple de %s", - "Verifying..": "Verificando..", - "Version": "Versión", - "Via Camera": "Desde Cámara", - "Via D20": "Vía D20", - "Via D6": "Vía D6", - "Via Manual Input": "Introducción Manual", - "Via Words": "A Través de Palabras", - "Wait for the capture": "Espera la captura", - "Wallet": "Cartera", - "Wallet Descriptor": "Descriptor de Cartera", - "Wallet output descriptor": "Descriptor de salida de cartera", - "Wallet output descriptor loaded!": "¡Se ha cargado el descriptor de salida de la cartera!", - "Wallet output descriptor not found.": "No se encontró el descriptor de salida de la cartera.", - "Warning:": "Advertencia:", - "Word %d": "Palabra %d", - "Word Numbers": "Números de Palabra", - "Words": "Palabras", - "Yes": "Sí", - "is a valid address!": "es una dirección válida!", - "was NOT FOUND in the first %d addresses": "NO FUE ENCONTRADO en las primeras %d direcciones" -} \ No newline at end of file +{"% of the amount.": "% del monto.", "%d of %d multisig": "%d de %d multisig", "%d to %d": "%d a %d", "%s removed.": "%s eliminado.", "(%d total)": "(%d total)", "(Experimental)": "(Experimental)", "(watch-only)": "(Solo para observación)", "12 words": "12 palabras", "24 words": "24 palabras", "About": "Nosotros", "Accept assumption?": "¿Aceptar la suposición?", "Account": "Cuenta", "Account #0 would be assumed": "Se supondría que la cuenta #0", "Account Index": "Índice de la cuenta", "Add or change wallet passphrase?": "¿Añadir o cambiar passphrase de la cartera?", "Additional entropy from camera required for AES-CBC mode": "Se requiere entropía adicional de la cámara para el modo AES-CBC", "Address": "Dirección", "Align camera and backup plate properly.": "Alinea la cámara y la placa de respaldo correctamente.", "Allow in settings first!": "¡Permitir en la configuración primero!", "Anti-glare disabled": "Anti-reflejo desactivado", "Anti-glare enabled": "Anti-reflejo habilitado", "Appearance": "Apariencia", "Are you sure?": "¿Estás seguro?", "BGR Colors": "Colores BGR", "BIP39 Mnemonic": "Mnemónico BIP39", "Back": "Atrás", "Back to Menu": "Volver al Menú", "Backup Mnemonic": "Backup del Mnemónico", "Bad signature": "Firma incorrecta", "Base64 Password": "Contraseña Base64", "Baudrate": "Baudrate", "Binary Grid": "Cuadrícula binaria", "Border Padding": "Grosor del Borde", "Brightness": "Brillo", "Buttons": "Botones", "Buttons Debounce": "Rebote de Botones", "Capture cancelled": "Captura cancelada", "Change": "Cambio", "Change Addresses": "Direcciones de Cambio", "Change theme and reboot?": "¿Cambiar de tema y reiniciar?", "Change:": "Cambio:", "Changes will last until shutdown.": "Los cambios durarán hasta que el dispositivo se apague.", "Check SD Card": "Verifica Tarjeta SD", "Check that address belongs to this wallet?": "¿Verificar que la dirección pertenece a esta cartera?", "Checked %d addresses with no matches.": "Comprobado %d direcciones sin coincidencias.", "Checking for SD card..": "Comprobación de la tarjeta SD..", "Confirm Tamper Check Code": "Confirmar el código de verificación", "Create QR Code": "Crear Código QR", "Create QR code from text?": "¿Crear código QR desde texto?", "Created:": "Creado:", "Current Tamper Check Code": "Código de verificación actual", "Custom QR Code": "Código QR Personalizado", "Customize": "Personalizar", "Customizing your wallet will generate a new Key.": "Personalizar tu cartera generará una nueva clave", "Cut Depth": "Profundidad de Corte", "Cut Method": "Método de Corte", "Decimal": "Decimal", "Decrypt?": "¿Descifrar?", "Default Wallet": "Cartera Predeterminada", "Depth Per Pass": "Profundidad por Pasada", "Derive BIP85 entropy?": "¿Derivar entropía BIP85?", "Descriptor Addresses": "Direcciones del descriptor", "Display": "Pantalla", "Do not power off, it may take a while to complete.": "No apagues el dispositivo, puede tardar un tiempo en completarse.", "Done?": "¿Listo?", "Double mnemonic": "Doble mnemónico", "Driver": "Operador", "Empty": "Vacío", "Enable Krux apps": "Habilitar aplicaciones Krux", "Encrypted": "Cifrado", "Encrypted QR Code": "Código QR Cifrado", "Encrypted mnemonic was not stored": "Mnemónico cifrado no se almacenó", "Encrypted mnemonic was stored with ID:": "Mnemónico cifrado fue almacenado con ID:", "Encryption": "Cifrado", "Encryption Mode": "Modo de Cifrado", "Enter %d BIP-39 words.": "Ingrese %d palabras BIP-39.", "Enter a 6+ characters Tamper Check Code": "Introduzca un código de verificación de más de 6 caracteres", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Ingresa cada palabra de tu mnemónico BIP-39 como un número del 1 al 2048.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Ingresa cada palabra de tu mnemónico BIP-39 como un número en hexadecimal del 1 al 800.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Ingresa cada palabra de tu mnemónico BIP-39 como un número en octal del 1 al 4000.", "Enter each word of your BIP-39 mnemonic.": "Ingresa cada palabra de tu mnemónico BIP-39.", "Erase User's Data": "Borrar datos de usuario", "Erasing user's data..": "Borrando los datos del usuario..", "Error:": "Error:", "Esc": "Esc", "Execute a signed Krux app?": "¿Ejecutar una aplicación Krux firmada?", "Explore files?": "¿Explorar archivos?", "Exporting to SD card..": "Exportando a la tarjeta SD..", "Extended Public Key": "Clave Pública Extendida", "Factory Settings": "Ajustes de Fábrica", "Failed to decrypt": "Error al descifrar", "Failed to load PSBT": "No se pudo cargar la PSBT", "Failed to load address": "No se pudo cargar la dirección", "Failed to load key": "No se pudo cargar la clave", "Failed to load message": "No se pudo cargar el mensaje", "Failed to load mnemonic": "No se pudo importar el mnemónico", "Failed to load output descriptor": "No se pudo cargar el descriptor de salida", "Failed to load passphrase": "No se pudo cargar el passphrase", "Failed to store mnemonic": "No pudo almacenar mnemónico", "Fee:": "Comisión:", "Feed Rate": "Feed Rate", "Filename": "Nombre del Archivo", "Filename %s exists on SD card, overwrite?": "El nombre de archivo %s existe en la tarjeta SD, ¿sobrescribir?", "Fill the flash with entropy from camera?": "¿Llenar el flash con entropía de la cámara?", "Filling Flash": "Llenando Flash", "Fingerprint unset in PSBT": "Huella dactilar no establecida en PSBT", "Firmware exceeds max size: %d": "El firmware supera el tamaño máximo: %d", "Flash Map": "Mapa Flash", "Flash Tools": "Flash Tools", "Flash filled with camera entropy": "Flash lleno de entropía de cámara", "Flipped X Coordinates": "Coordenadas X Invertidas", "Flute Diameter": "Diámetro de la Flauta", "Free:": "Libre:", "From Storage": "Desde el Almacenamiento", "Fully erase your SD card in another device to ensure data is unrecoverable": "Borra completamente su tarjeta SD en otro dispositivo para asegurarse de que los datos sean irrecuperables", "Generate Mnemonic": "Generar Mnemónico", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "¿Darle a este mnemónico una identificación personalizada? De lo contrario se utilizará el fingerprint actual", "Go": "Ir", "Good entropy": "Buena entropía", "Hardware": "Hardware", "Hex Public Key": "Clave Pública Hexadecimal", "Hexadecimal": "Hexadecimal", "Hide Mnemonics": "Ocultar Mnemónicos", "High fees!": "¡Tarifas altas!", "ID already exists": "ID ya existe", "Index": "Índice", "Index: %s": "Índice: %s", "Inputs (%d):": "Entradas (%d):", "Install?": "¿Instalar?", "Insufficient Entropy!": "¡Entropía Insuficiente!", "Insufficient entropy": "Entropía insuficiente", "Invalid Tamper Check Code": "Código de verificación no válido", "Invalid address": "Dirección inválida", "Invalid bootloader": "Bootloader inválido", "Invalid mnemonic length": "Longitud mnemónica no válida", "Invalid public key": "Clave pública inválida", "Invalid wallet:": "Cartera inválida:", "Invert": "Invertir", "Inverted Colors": "Colores Invertidos", "Key": "Clave", "Key was not provided": "No se proporcionó la clave", "Krux Printer Test QR": "Test de impresión QR", "LCD Type": "Tipo de LCD", "Language": "Idioma", "Leave blank if you'd like Krux to pick a valid final word": "Déjalo en blanco si quieres que Krux elija una última palabra válida", "Left": "Izquierda", "Length: %s": "Longitud: %s", "Line Delay": "Retraso de Línea", "Line:": "Línea:", "Load Krux app": "Cargar aplicación Krux", "Load Mnemonic": "Importar Mnemónico", "Load Wallet": "Cargar Cartera", "Load a trusted wallet descriptor to view addresses?": "¿Cargar un descriptor de monedero de confianza para ver las direcciones?", "Load from SD card": "Cargar desde tarjeta SD", "Load from SD card?": "¿Cargar desde la tarjeta SD?", "Load from camera": "Cargar desde la cámara", "Load one?": "¿Cargar algo?", "Load?": "¿Cargar?", "Loading Camera..": "Cargando Camara..", "Loading change addresses..": "Cargando direcciones de cambio..", "Loading printer..": "Cargando impresora..", "Loading receive addresses..": "Cargando direcciones de recepción..", "Loading..": "Cargando..", "Locale": "Idioma", "Location": "Ubicación", "Maximum length exceeded (%s)": "Longitud máxima excedida (%s)", "Message": "Mensaje", "Message:": "Mensaje:", "Missing signature file": "Falta archivo de firma", "Mnemonic": "Mnemónico", "Mnemonic ID": "Identificación del Mnemónico", "Mnemonic and passphrase will be kept.": "Mnemónico y passphrase se mantendrán.", "Mnemonic was not encrypted": "Mnemónico no fue descifrado", "Modified:": "Modificado:", "Multisig": "Multisig", "Native Segwit - 84 would be assumed": "Segwit nativo - 84 se supondría", "Network": "Red", "New Mnemonic": "Nuevo Mnemónico", "New firmware detected.": "Nuevo firmware detectado.", "No": "No", "No Passphrase": "Sin Passphrase", "Not enough rolls!": "¡No hay suficientes tiradas!", "Numbers": "Números", "Octal": "Octales", "Other Formats": "Otros Formatos", "PBKDF2 Iter.": "Iter. PBKDF2", "Paint punched dots black so they can be detected.": "Pinte los puntos perforados de negro para que puedan ser detectados.", "Paper Width": "Ancho del Papel", "Part": "Parte", "Part Size": "Tamaño de la Pieza", "Passphrase": "Passphrase", "Password Length": "Longitud", "Path mismatch": "La ruta no coincide", "Pattern detected!": "¡Patrón detectado!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "¿Eliminar permanentemente todos los mnemónicos y configuraciones cifradas almacenadas del flash?", "Persist": "Guardar", "Pixels deviation index:": "Índice de desviación de píxeles:", "Plaintext QR": "QR de Texto", "Please load a wallet output descriptor": "Carga un descriptor de cartera", "Plunge Rate": "Tasa de Caída", "Poor entropy": "Baja entropía", "Poor entropy detected!": "Mala entropía detectada!", "Print Test QR": "Prueba de Impresión QR", "Print Tiny Seed?": "¿Imprimir Tiny Seed?", "Print to QR": "Imprimir como Código QR", "Print to QR?": "¿Imprimir con Codigo QR?", "Print?": "¿Impresión?", "Printer": "Impresora", "Printer Driver not set!": "¡El controlador de impresora no está configurado!", "Printing..": "Imprimiendo..", "Proceed anyway?": "¿Proceder de todas maneras?", "Proceed?": "¿Continuar?", "Processing..": "Procesando..", "QR Code": "Código QR", "RX Pin": "RX Pin", "Reboot": "Reiniciar", "Receive": "Recepción", "Receive Addresses": "Direcciones de Recepción", "Region:": "Región:", "Remove %s?": "Eliminar %s?", "Remove Mnemonic": "Eliminar Mnemónico", "Remove firmware files from SD Card?": "¿Eliminar archivos de firmware de la tarjeta SD?", "Res. - Format": "Res. - Formato", "Restore factory settings and reboot?": "¿Restablecer a la configuración de fábrica y reiniciar?", "Return to QR Viewer": "Volver al QR", "Review scanned data, edit if necessary": "Revisa los datos escaneados, edítalos si es necesario", "Right": "Derecha", "Roll dice at least %d times to generate a mnemonic.": "Tira el dado al menos %d veces para generar un mnemónico.", "Rolls distribution:": "Distribución de tiradas:", "Rolls:": "Tiradas:", "SD card": "Tarjeta SD", "SD card not detected.": "Tarjeta SD no detectada.", "SHA256 of rolls:": "SHA256 de las tiradas:", "SHA256 of snapshot:": "SHA256 de la instantánea:", "Save QR Image to SD Card": "Guardar Imagen QR en la Tarjeta SD", "Save to SD card": "Guardar en tarjeta SD", "Save to SD card?": "¿Guardar en la tarjeta SD?", "Saved to SD card": "Guardado en la tarjeta SD", "Scale": "Escala", "Scan Address": "Escanear Dirección", "Scan BIP39 Passphrase": "Escanear Passphrase BIP39", "Scan Key QR Code": "Escanear el Código QR", "Scanning words 1-12 again": "Escaneo de palabras 1-12 de nuevo", "Scanning words 13-24": "Escaneo de palabras 13-24", "Screensaver Time": "Tiempo de Espera del Protector de Pantalla", "Script Type": "Tipo de Script", "Security": "Seguridad", "Self-transfer or Change (%d):": "Autotransferencia o Cambio (%d):", "Self-transfer:": "Autotransferencia:", "Set a tamper check code first": "Establezca primero un código de verificación", "Settings": "Ajustes", "Settings stored internally on flash.": "Ajustes almacenados internamente en flash.", "Settings stored on SD card.": "Configuración almacenada en la tarjeta SD.", "Shannon's Entropy:": "Entropía de Shannon:", "Shutdown": "Apagar", "Shutdown Time": "Tiempo de Apagado", "Shutting down..": "Apagando..", "Sign": "Firmar", "Sign to QR code": "Firmar en Código QR", "Sign to SD card": "Firmar en la Tarjeta SD", "Sign?": "¿Firmar?", "Signature": "Firma", "Signed Message": "Mensaje Firmado", "Signed PSBT": "PSBT Firmado", "Signing..": "Firmando..", "Single-sig": "Single-sig", "Size:": "Tamaño:", "Some checks cannot be performed.": "Algunas comprobaciones no se pueden realizar.", "Spend (%d):": "Gastos (%d):", "Spend:": "Gasto:", "Stats for Nerds": "Estadísticas para Entendidos", "Store on Flash": "Almacenar en Flash", "Store on SD Card": "Almacenar en la Tarjeta SD", "Swipe to change mode": "Deslizar para cambiar de modo", "TC Flash Hash": "TC Hash Flash", "TC Flash Hash at Boot": "TC Flash Hash al arranque", "TOUCH or ENTER to capture": "TOCA o ENTER para capturar", "TX Pin": "TX Pin", "Tamper Check Code": "Código de verificación", "Tamper check code set successfully": "Código de verificación establecido con éxito", "Tamper check codes do not match": "Los códigos de verificación no coinciden", "Text": "Texto", "Theme": "Tema", "Thermal": "Térmico", "To ensure data is unrecoverable use Wipe Device feature": "Para garantizar que los datos no se puedan recuperar, utiliza la función de borrar dispositivo", "Toggle Brightness": "Alternar Brillo", "Tools": "Herramientas", "Touch Threshold": "Umbral Táctil", "Touchscreen": "Pantalla Táctil", "Try more?": "¿Intentar con mas?", "Type BIP39 Passphrase": "Escribe la Passphrase BIP39", "Type Key": "Introduce la clave", "Unit": "Unidad", "Upgrade complete.": "Actualización completa.", "Use a black background surface.": "Usa una superficie de fondo negra.", "Use camera's entropy to create a new mnemonic": "Usa la entropía de la cámara para crear una nueva mnemónica", "Used:": "Usado:", "User's Data": "Usuario", "Value %s out of range: [%s, %s]": "Valor %s fuera del rango: [ %s, %s]", "Value must be multiple of %s": "El valor debe ser múltiple de %s", "Verifying..": "Verificando..", "Version": "Versión", "Via Camera": "Desde Cámara", "Via D20": "Vía D20", "Via D6": "Vía D6", "Via Manual Input": "Introducción Manual", "Via Words": "A Través de Palabras", "Wait for the capture": "Espera la captura", "Wallet": "Cartera", "Wallet Descriptor": "Descriptor de Cartera", "Wallet output descriptor": "Descriptor de salida de cartera", "Wallet output descriptor loaded!": "¡Se ha cargado el descriptor de salida de la cartera!", "Wallet output descriptor not found.": "No se encontró el descriptor de salida de la cartera.", "Warning:": "Advertencia:", "Word %d": "Palabra %d", "Word Numbers": "Números de Palabra", "Words": "Palabras", "Yes": "Sí", "is a valid address!": "es una dirección válida!", "was NOT FOUND in the first %d addresses": "NO FUE ENCONTRADO en las primeras %d direcciones"} \ No newline at end of file diff --git a/i18n/translations/fr-FR.json b/i18n/translations/fr-FR.json index ee64ab919..2e090fe9b 100644 --- a/i18n/translations/fr-FR.json +++ b/i18n/translations/fr-FR.json @@ -1,323 +1 @@ -{ - "% of the amount.": "% du montant.", - "%d of %d multisig": "%d de %d multisignature", - "%d to %d": "%d à %d", - "%s removed.": "%s supprimé.", - "(%d total)": "(%d au total)", - "(Experimental)": "(Expérimental)", - "(watch-only)": "(consultation)", - "12 words": "12 mots", - "24 words": "24 mots", - "About": "À propos", - "Accept assumption?": "Accepter supposition ?", - "Account": "Compte", - "Account #0 would be assumed": "Le compte n °0 serait supposé", - "Account Index": "Index du compte", - "Add or change wallet passphrase?": "Ajoutez ou modifiez la phrase secrète ?", - "Additional entropy from camera required for AES-CBC mode": "Entropie supplémentaire de la caméra requise pour le mode AES-CBC", - "Address": "Adresse", - "Align camera and backup plate properly.": "Alignez correctement la caméra et plaque de sauvegarde.", - "Allow in settings first!": "Autoriser d'abord dans les paramètres !", - "Anti-glare disabled": "Anti-éblouissement désactivé", - "Anti-glare enabled": "Anti-éblouissement activé", - "Appearance": "Apparence", - "Are you sure?": "Es-tu sûr ?", - "BGR Colors": "Couleurs BGR", - "BIP39 Mnemonic": "Mnémonique BIP39", - "Back": "Retour", - "Back to Menu": "Retour au menu", - "Backup Mnemonic": "Sauvegarde mnémonique", - "Bad signature": "Signature non valide", - "Base64 Password": "Mot de passe Base64", - "Baudrate": "Débit en bauds", - "Binary Grid": "Grille binaire", - "Border Padding": "Rembourrage de bordure", - "Brightness": "Luminosité", - "Buttons": "Boutons", - "Buttons Debounce": "Anti-rebond des boutons", - "Capture cancelled": "Capture annulée", - "Change": "Monnaie", - "Change Addresses": "Adresses de Monnaie", - "Change theme and reboot?": "Changer de thème et redémarrer ?", - "Change:": "La monnaie :", - "Changes will last until shutdown.": "Les modifications dureront jusqu'à l'arrêt.", - "Check SD Card": "Vérifiez la carte SD", - "Check that address belongs to this wallet?": "Vérifiez que l'adresse appartient à ce portefeuille ?", - "Checked %d addresses with no matches.": "%d adresses vérifiées sans correspondance.", - "Checking for SD card..": "Vérification de la carte SD..", - "Confirm Tamper Check Code": "Confirmer le code de non compromis", - "Could not execute %s": "Impossible d'exécuter [%1]", - "Create QR Code": "Créer un code QR", - "Create QR code from text?": "Créer un code QR à partir d'un texte ?", - "Created:": "Créé :", - "Current Tamper Check Code": "Code de non compromis actuel", - "Custom QR Code": "Code QR personnalisé", - "Customize": "Personnaliser", - "Customizing your wallet will generate a new Key.": "La personnalisation de votre portefeuille générera une nouvelle clé.", - "Cut Depth": "Profondeur de coupe", - "Cut Method": "Méthode de coupe", - "Decimal": "Décimal", - "Decrypt?": "Déchiffrer ?", - "Default Wallet": "Portefeuille par défaut", - "Depth Per Pass": "Profondeur par passage", - "Derive BIP85 entropy?": "Dériver l'entropie BIP85 ?", - "Descriptor Addresses": "Adresses du descripteur", - "Display": "Affichage", - "Do not power off, it may take a while to complete.": "Ne pas éteindre, cela peut prendre un certain temps.", - "Done?": "Terminé ?", - "Double mnemonic": "Double mnémonique", - "Driver": "Pilote", - "Empty": "Vide", - "Enable Krux apps": "Activer les applications Krux", - "Encrypted": "Chiffré", - "Encrypted QR Code": "Code QR chiffré", - "Encrypted mnemonic was not stored": "Le mnémonique chiffré n'a pas été stocké", - "Encrypted mnemonic was stored with ID:": "Mnémonique chiffré a été stocké avec ID :", - "Encryption": "Chiffrement", - "Encryption Mode": "Mode de chiffrement", - "Enter %d BIP-39 words.": "Entrez %d mots BIP-39.", - "Enter a 6+ characters Tamper Check Code": "Saisissez un code de non compromis de plus de 6 caractères", - "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre de 1 à 2048.", - "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en hexadécimal de 1 à 800.", - "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en octal de 1 à 4000.", - "Enter each word of your BIP-39 mnemonic.": "Entrez chaque mot de votre mnémonique BIP-39.", - "Erase User's Data": "Effacer les données de l'utilisateur", - "Erasing user's data..": "Effacement des données de l'utilisateur...", - "Error:": "Erreur :", - "Esc": "Esc", - "Execute a signed Krux app?": "Exécuter une application Krux signée ?", - "Explore files?": "Explorer des fichiers ?", - "Exporting to SD card..": "Exportation vers la carte SD..", - "Extended Public Key": "Clé publique", - "Factory Settings": "Paramètres d'usine", - "Failed to decrypt": "Échec du déchiffrement", - "Failed to load PSBT": "Échec du chargement PSBT", - "Failed to load address": "Échec du chargement d'adresse", - "Failed to load key": "Échec du chargement de la clé", - "Failed to load message": "Échec du chargement du message", - "Failed to load mnemonic": "Échec du chargement mnémonique", - "Failed to load output descriptor": "Échec du chargement du descripteur de sortie", - "Failed to load passphrase": "Échec du chargement de la phrase secrète", - "Failed to store mnemonic": "Échec du stockage mnémonique", - "Fee:": "Frais :", - "Feed Rate": "Taux d'alimentation", - "Filename": "Nom de fichier", - "Filename %s exists on SD card, overwrite?": "Le nom de fichier %s existe sur la carte SD, écraser ?", - "Fill the flash with entropy from camera?": "Remplir le flash avec l'entropie de la caméra ?", - "Filling Flash": "Remplissage du Flash", - "Fingerprint unset in PSBT": "Empreinte digitale manquante dans PSBT", - "Firmware exceeds max size: %d": "Le micrologiciel dépasse la taille maximale : %d", - "Flash Map": "Plan du Flash", - "Flash Tools": "Outils Flash", - "Flash filled with camera entropy": "Flash rempli par l'entropie de la caméra", - "Flipped X Coordinates": "Coordonnées X inversées", - "Flute Diameter": "Diamètre de flûte", - "Free:": "Libre :", - "From Storage": "Du stockage", - "Fully erase your SD card in another device to ensure data is unrecoverable": "Effacez complètement votre carte SD dans un autre appareil pour assurer que les données soient irrécupérables", - "Generate Mnemonic": "Générer un mnémonique", - "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Donnez à ce mnémonique un identifiant personnalisé ? Sinon l'empreinte actuelle sera utilisée", - "Go": "OK", - "Good entropy": "Bonne entropie", - "Hardware": "Matériel", - "Hex Public Key": "Clé publique hexadécimale", - "Hexadecimal": "Hexadécimal", - "Hide Mnemonics": "Masquer les mnémoniques", - "High fees!": "Frais élevés !", - "ID already exists": "Id existe déjà", - "Index": "Index", - "Index: %s": "Index : %s", - "Inputs (%d):": "Entrées (%d) :", - "Install?": "Installer ?", - "Insufficient Entropy!": "Entropie insuffisante !", - "Insufficient entropy": "Entropie insuffisante", - "Invalid Tamper Check Code": "Code de non compromis non valide", - "Invalid address": "Adresse invalide", - "Invalid bootloader": "Chargeur de démarrage invalide", - "Invalid mnemonic length": "Longueur mnémonique invalide", - "Invalid public key": "Clé publique non valide", - "Invalid wallet:": "Portefeuille invalide :", - "Invert": "Inverser", - "Inverted Colors": "Couleurs inversées", - "Key": "Clé", - "Key was not provided": "La clé n'a pas été fournie", - "Krux Printer Test QR": "Test de l'imprimante Krux QR", - "LCD Type": "Type d'écran LCD", - "Language": "Langue", - "Leave blank if you'd like Krux to pick a valid final word": "Laissez vide si vous souhaitez que Krux choisisse un dernier mot valide", - "Left": "Gauche", - "Length: %s": "Longueur : %s", - "Line Delay": "Délai de Ligne", - "Line:": "Ligne :", - "Load Krux app": "Charger l'application Krux", - "Load Mnemonic": "Charger Mnémonique", - "Load Wallet": "Charger le portefeuille", - "Load a trusted wallet descriptor to view addresses?": "Charger un descripteur de portefeuille de confiance pour afficher les adresses ?", - "Load from SD card": "Charger depuis la carte SD", - "Load from SD card?": "Charger depuis la carte SD ?", - "Load from camera": "Charger depuis la caméra", - "Load one?": "Charger ?", - "Load?": "Charger ?", - "Loading Camera..": "Activation de la Caméra..", - "Loading change addresses..": "Chargement des adresses de monnaie..", - "Loading printer..": "Activation de l'imprimante..", - "Loading receive addresses..": "Chargement des adresses de réception ..", - "Loading..": "Chargement..", - "Locale": "Paramètres régionaux", - "Location": "Emplacement", - "Maximum length exceeded (%s)": "Longueur maximale dépassée (%s)", - "Message": "Message", - "Message:": "Message :", - "Missing signature file": "Fichier de signature manquant", - "Mnemonic": "Mnémonique", - "Mnemonic ID": "ID Mnémonique", - "Mnemonic and passphrase will be kept.": "Mnémonique et phrase secrète seront conservés.", - "Mnemonic was not encrypted": "Mnémonique n'était pas chiffré", - "Modified:": "Modifié :", - "Multisig": "Multi\nsignature", - "Native Segwit - 84 would be assumed": "Native Segwit - 84 serait supposé", - "Network": "Réseau", - "New Mnemonic": "Nouveau Mnémonique", - "New firmware detected.": "Nouveau micrologiciel détecté.", - "No": "Non", - "No Passphrase": "Pas de phrase secrète", - "Not enough rolls!": "Pas assez de jets !", - "Numbers": "Nombres", - "Octal": "Octale", - "Other Formats": "Autres formats", - "PBKDF2 Iter.": "Itér. PBKDF2", - "Paint punched dots black so they can be detected.": "Noircissez les points perforés afin qu'ils puissent être détectés.", - "Paper Width": "Largeur du papier", - "Part": "Partie", - "Part Size": "Taille de la pièce", - "Passphrase": "Phrase secréte", - "Password Length": "Longueur du mot de passe", - "Path mismatch": "Inadéquation du chemin", - "Pattern detected!": "Pattern détecté !", - "Permanently remove all stored encrypted mnemonics and settings from flash?": "Supprimer définitivement tous les mnémoniques et paramètres chiffrés stockés dans le flash ?", - "Persist": "Persistance", - "Pixels deviation index:": "Indice de déviation des pixels :", - "Plaintext QR": "QR en Texte Brut", - "Please load a wallet output descriptor": "Veuillez charger un descripteur de sortie de portefeuille", - "Plunge Rate": "Taux de plongée", - "Poor entropy": "Entropie faible", - "Poor entropy detected!": "Entropie faible détectée !", - "Print Test QR": "Impression Test QR", - "Print Tiny Seed?": "Imprimer Tiny Seed ?", - "Print to QR": "Imprimer Code QR", - "Print to QR?": "Imprimer Code QR ?", - "Print?": "Imprimer ?", - "Printer": "Imprimante", - "Printer Driver not set!": "Le pilote d'imprimante n'est pas défini !", - "Printing..": "Impression..", - "Proceed anyway?": "Procéder quand même ?", - "Proceed?": "Procéder ?", - "Processing..": "Traitement..", - "QR Code": "Code QR", - "RX Pin": "RX Fiche", - "Reboot": "Redémarrer", - "Receive": "Recevoir", - "Receive Addresses": "Adresses de Réception", - "Region:": "Région :", - "Remove %s?": "Supprimer %s ?", - "Remove Mnemonic": "Supprimer mnémonique", - "Remove firmware files from SD Card?": "Supprimer les fichiers micrologiciel de la carte SD ?", - "Res. - Format": "Rés. - Format", - "Restore factory settings and reboot?": "Restaurer les paramètres d'usine et redémarrer ?", - "Return to QR Viewer": "Retour au visualiseur QR", - "Review scanned data, edit if necessary": "Examinez les données numérisées, modifiez-les si nécessaire", - "Right": "À droite", - "Roll dice at least %d times to generate a mnemonic.": "Lancez le dé au moins %d fois pour générer un mnémonique.", - "Rolls distribution:": "Distribution des jets :", - "Rolls:": "Jets :", - "SD card": "Carte SD", - "SD card not detected.": "Carte SD non détectée.", - "SHA256 of rolls:": "SHA256 de jets :", - "SHA256 of snapshot:": "SHA256 de snapshot :", - "Save QR Image to SD Card": "Enregistrer l'image QR sur la carte SD", - "Save to SD card": "Enregistrer sur la carte SD", - "Save to SD card?": "Enregistrer sur la carte SD ?", - "Saved to SD card": "Enregistré sur la carte SD", - "Scale": "L'échelle", - "Scan Address": "Scannez l'adresse", - "Scan BIP39 Passphrase": "Scannez la phrase secrète BIP-39", - "Scan Key QR Code": "Scannez le Code QR de la clé", - "Scanning words 1-12 again": "Analyser à nouveau les mots 1 à 12", - "Scanning words 13-24": "Analyser les mots 13 à 24", - "Screensaver Time": "Delai d'Inactivité", - "Script Type": "Type de Script", - "Security": "Sécurité", - "Self-transfer or Change (%d):": "Auto-transfert ou monnaie (%d) :", - "Self-transfer:": "Auto-transfert :", - "Set a tamper check code first": "Définissez d'abord un code de non compromis", - "Settings": "Paramètres", - "Settings stored internally on flash.": "Paramètres stockés en interne sur flash.", - "Settings stored on SD card.": "Paramètres stockés sur la carte SD.", - "Shannon's Entropy:": "Entropie de Shannon :", - "Shutdown": "Éteindre", - "Shutdown Time": "Delai d'Arrêt", - "Shutting down..": "Arrêt en cours..", - "Sign": "Signer", - "Sign to QR code": "Signer avec le code QR", - "Sign to SD card": "Signer sur la carte SD", - "Sign?": "Signer ?", - "Signature": "Signature", - "Signed Message": "Message signé", - "Signed PSBT": "PSBT signé", - "Signing..": "Signature..", - "Single-sig": "Clé unique", - "Size:": "Capacité :", - "Some checks cannot be performed.": "Certains vérifications ne peuvent pas être effectués.", - "Spend (%d):": "Dépense (%d) :", - "Spend:": "Dépense :", - "Stats for Nerds": "Statistiques pour les geeks", - "Store on Flash": "Stocker sur flash", - "Store on SD Card": "Stocker sur la carte SD", - "Swipe to change mode": "Faites glisser pour changer de mode", - "TC Flash Hash": "TC Flash Hash", - "TC Flash Hash at Boot": "TC Flash Hash au démarrage", - "TOUCH or ENTER to capture": "TOUCHEZ ou ENTRER pour capturer", - "TX Pin": "TX Fiche", - "Tamper Check Code": "Code de non compromis", - "Tamper check code set successfully": "Code de non compromis défini avec succès", - "Tamper check codes do not match": "Les codes de non compromis ne correspondent pas", - "Text": "Texte", - "Theme": "Thème", - "Thermal": "Thermique", - "To ensure data is unrecoverable use Wipe Device feature": "Pour assurer que les données soient irrécupérables, utilisez la fonctionnalité 'Effacer l'appareil'", - "Toggle Brightness": "Ajuster la luminosité", - "Tools": "Outils", - "Touch Threshold": "Sensibilité", - "Touchscreen": "Écran Tactile", - "Try more?": "Réessayer ?", - "Type BIP39 Passphrase": "Entrez la phrase secrète BIP-39", - "Type Key": "Taper clé", - "Unit": "Unité", - "Upgrade complete.": "Mise à jour complète.", - "Use a black background surface.": "Utilisez une surface de fond noire.", - "Use camera's entropy to create a new mnemonic": "Utilisez l'entropie de la caméra pour créer un nouveau mnémonique", - "Used:": "Utilisé :", - "User's Data": "Utilisateur", - "Value %s out of range: [%s, %s]": "Valeur %s hors de portée: [%s, %s]", - "Value must be multiple of %s": "La valeur doit être un multiple de %s", - "Verifying..": "Vérification..", - "Version": "Version", - "Via Camera": "Par caméra", - "Via D20": "Via D20", - "Via D6": "Via D6", - "Via Manual Input": "Par saisie manuelle", - "Via Words": "Via Mots", - "Wait for the capture": "Attendez la capture", - "Wallet": "Portefeuille", - "Wallet Descriptor": "Descripteur de Portefeuille", - "Wallet output descriptor": "Descripteur de sortie du portefeuille", - "Wallet output descriptor loaded!": "Descripteur de sortie du portefeuille chargé !", - "Wallet output descriptor not found.": "Descripteur de sortie du portefeuille introuvable.", - "Warning:": "Avertissement :", - "Word %d": "Mot %d", - "Word Numbers": "Numéros de mots", - "Words": "Mots", - "Yes": "Oui", - "is a valid address!": "Adresse non valide !", - "was NOT FOUND in the first %d addresses": "INTROUVABLE dans les %d premières adresses" -} \ No newline at end of file +{"% of the amount.": "% du montant.", "%d of %d multisig": "%d de %d multisignature", "%d to %d": "%d à %d", "%s removed.": "%s supprimé.", "(%d total)": "(%d au total)", "(Experimental)": "(Expérimental)", "(watch-only)": "(consultation)", "12 words": "12 mots", "24 words": "24 mots", "About": "À propos", "Accept assumption?": "Accepter supposition ?", "Account": "Compte", "Account #0 would be assumed": "Le compte n °0 serait supposé", "Account Index": "Index du compte", "Add or change wallet passphrase?": "Ajoutez ou modifiez la phrase secrète ?", "Additional entropy from camera required for AES-CBC mode": "Entropie supplémentaire de la caméra requise pour le mode AES-CBC", "Address": "Adresse", "Align camera and backup plate properly.": "Alignez correctement la caméra et plaque de sauvegarde.", "Allow in settings first!": "Autoriser d'abord dans les paramètres !", "Anti-glare disabled": "Anti-éblouissement désactivé", "Anti-glare enabled": "Anti-éblouissement activé", "Appearance": "Apparence", "Are you sure?": "Es-tu sûr ?", "BGR Colors": "Couleurs BGR", "BIP39 Mnemonic": "Mnémonique BIP39", "Back": "Retour", "Back to Menu": "Retour au menu", "Backup Mnemonic": "Sauvegarde mnémonique", "Bad signature": "Signature non valide", "Base64 Password": "Mot de passe Base64", "Baudrate": "Débit en bauds", "Binary Grid": "Grille binaire", "Border Padding": "Rembourrage de bordure", "Brightness": "Luminosité", "Buttons": "Boutons", "Buttons Debounce": "Anti-rebond des boutons", "Capture cancelled": "Capture annulée", "Change": "Monnaie", "Change Addresses": "Adresses de Monnaie", "Change theme and reboot?": "Changer de thème et redémarrer ?", "Change:": "La monnaie :", "Changes will last until shutdown.": "Les modifications dureront jusqu'à l'arrêt.", "Check SD Card": "Vérifiez la carte SD", "Check that address belongs to this wallet?": "Vérifiez que l'adresse appartient à ce portefeuille ?", "Checked %d addresses with no matches.": "%d adresses vérifiées sans correspondance.", "Checking for SD card..": "Vérification de la carte SD..", "Confirm Tamper Check Code": "Confirmer le code de non compromis", "Create QR Code": "Créer un code QR", "Create QR code from text?": "Créer un code QR à partir d'un texte ?", "Created:": "Créé :", "Current Tamper Check Code": "Code de non compromis actuel", "Custom QR Code": "Code QR personnalisé", "Customize": "Personnaliser", "Customizing your wallet will generate a new Key.": "La personnalisation de votre portefeuille générera une nouvelle clé.", "Cut Depth": "Profondeur de coupe", "Cut Method": "Méthode de coupe", "Decimal": "Décimal", "Decrypt?": "Déchiffrer ?", "Default Wallet": "Portefeuille par défaut", "Depth Per Pass": "Profondeur par passage", "Derive BIP85 entropy?": "Dériver l'entropie BIP85 ?", "Descriptor Addresses": "Adresses du descripteur", "Display": "Affichage", "Do not power off, it may take a while to complete.": "Ne pas éteindre, cela peut prendre un certain temps.", "Done?": "Terminé ?", "Double mnemonic": "Double mnémonique", "Driver": "Pilote", "Empty": "Vide", "Enable Krux apps": "Activer les applications Krux", "Encrypted": "Chiffré", "Encrypted QR Code": "Code QR chiffré", "Encrypted mnemonic was not stored": "Le mnémonique chiffré n'a pas été stocké", "Encrypted mnemonic was stored with ID:": "Mnémonique chiffré a été stocké avec ID :", "Encryption": "Chiffrement", "Encryption Mode": "Mode de chiffrement", "Enter %d BIP-39 words.": "Entrez %d mots BIP-39.", "Enter a 6+ characters Tamper Check Code": "Saisissez un code de non compromis de plus de 6 caractères", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre de 1 à 2048.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en hexadécimal de 1 à 800.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en octal de 1 à 4000.", "Enter each word of your BIP-39 mnemonic.": "Entrez chaque mot de votre mnémonique BIP-39.", "Erase User's Data": "Effacer les données de l'utilisateur", "Erasing user's data..": "Effacement des données de l'utilisateur...", "Error:": "Erreur :", "Esc": "Esc", "Execute a signed Krux app?": "Exécuter une application Krux signée ?", "Explore files?": "Explorer des fichiers ?", "Exporting to SD card..": "Exportation vers la carte SD..", "Extended Public Key": "Clé publique", "Factory Settings": "Paramètres d'usine", "Failed to decrypt": "Échec du déchiffrement", "Failed to load PSBT": "Échec du chargement PSBT", "Failed to load address": "Échec du chargement d'adresse", "Failed to load key": "Échec du chargement de la clé", "Failed to load message": "Échec du chargement du message", "Failed to load mnemonic": "Échec du chargement mnémonique", "Failed to load output descriptor": "Échec du chargement du descripteur de sortie", "Failed to load passphrase": "Échec du chargement de la phrase secrète", "Failed to store mnemonic": "Échec du stockage mnémonique", "Fee:": "Frais :", "Feed Rate": "Taux d'alimentation", "Filename": "Nom de fichier", "Filename %s exists on SD card, overwrite?": "Le nom de fichier %s existe sur la carte SD, écraser ?", "Fill the flash with entropy from camera?": "Remplir le flash avec l'entropie de la caméra ?", "Filling Flash": "Remplissage du Flash", "Fingerprint unset in PSBT": "Empreinte digitale manquante dans PSBT", "Firmware exceeds max size: %d": "Le micrologiciel dépasse la taille maximale : %d", "Flash Map": "Plan du Flash", "Flash Tools": "Outils Flash", "Flash filled with camera entropy": "Flash rempli par l'entropie de la caméra", "Flipped X Coordinates": "Coordonnées X inversées", "Flute Diameter": "Diamètre de flûte", "Free:": "Libre :", "From Storage": "Du stockage", "Fully erase your SD card in another device to ensure data is unrecoverable": "Effacez complètement votre carte SD dans un autre appareil pour assurer que les données soient irrécupérables", "Generate Mnemonic": "Générer un mnémonique", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Donnez à ce mnémonique un identifiant personnalisé ? Sinon l'empreinte actuelle sera utilisée", "Go": "OK", "Good entropy": "Bonne entropie", "Hardware": "Matériel", "Hex Public Key": "Clé publique hexadécimale", "Hexadecimal": "Hexadécimal", "Hide Mnemonics": "Masquer les mnémoniques", "High fees!": "Frais élevés !", "ID already exists": "Id existe déjà", "Index": "Index", "Index: %s": "Index : %s", "Inputs (%d):": "Entrées (%d) :", "Install?": "Installer ?", "Insufficient Entropy!": "Entropie insuffisante !", "Insufficient entropy": "Entropie insuffisante", "Invalid Tamper Check Code": "Code de non compromis non valide", "Invalid address": "Adresse invalide", "Invalid bootloader": "Chargeur de démarrage invalide", "Invalid mnemonic length": "Longueur mnémonique invalide", "Invalid public key": "Clé publique non valide", "Invalid wallet:": "Portefeuille invalide :", "Invert": "Inverser", "Inverted Colors": "Couleurs inversées", "Key": "Clé", "Key was not provided": "La clé n'a pas été fournie", "Krux Printer Test QR": "Test de l'imprimante Krux QR", "LCD Type": "Type d'écran LCD", "Language": "Langue", "Leave blank if you'd like Krux to pick a valid final word": "Laissez vide si vous souhaitez que Krux choisisse un dernier mot valide", "Left": "Gauche", "Length: %s": "Longueur : %s", "Line Delay": "Délai de Ligne", "Line:": "Ligne :", "Load Krux app": "Charger l'application Krux", "Load Mnemonic": "Charger Mnémonique", "Load Wallet": "Charger le portefeuille", "Load a trusted wallet descriptor to view addresses?": "Charger un descripteur de portefeuille de confiance pour afficher les adresses ?", "Load from SD card": "Charger depuis la carte SD", "Load from SD card?": "Charger depuis la carte SD ?", "Load from camera": "Charger depuis la caméra", "Load one?": "Charger ?", "Load?": "Charger ?", "Loading Camera..": "Activation de la Caméra..", "Loading change addresses..": "Chargement des adresses de monnaie..", "Loading printer..": "Activation de l'imprimante..", "Loading receive addresses..": "Chargement des adresses de réception ..", "Loading..": "Chargement..", "Locale": "Paramètres régionaux", "Location": "Emplacement", "Maximum length exceeded (%s)": "Longueur maximale dépassée (%s)", "Message": "Message", "Message:": "Message :", "Missing signature file": "Fichier de signature manquant", "Mnemonic": "Mnémonique", "Mnemonic ID": "ID Mnémonique", "Mnemonic and passphrase will be kept.": "Mnémonique et phrase secrète seront conservés.", "Mnemonic was not encrypted": "Mnémonique n'était pas chiffré", "Modified:": "Modifié :", "Multisig": "Multi\nsignature", "Native Segwit - 84 would be assumed": "Native Segwit - 84 serait supposé", "Network": "Réseau", "New Mnemonic": "Nouveau Mnémonique", "New firmware detected.": "Nouveau micrologiciel détecté.", "No": "Non", "No Passphrase": "Pas de phrase secrète", "Not enough rolls!": "Pas assez de jets !", "Numbers": "Nombres", "Octal": "Octale", "Other Formats": "Autres formats", "PBKDF2 Iter.": "Itér. PBKDF2", "Paint punched dots black so they can be detected.": "Noircissez les points perforés afin qu'ils puissent être détectés.", "Paper Width": "Largeur du papier", "Part": "Partie", "Part Size": "Taille de la pièce", "Passphrase": "Phrase secréte", "Password Length": "Longueur du mot de passe", "Path mismatch": "Inadéquation du chemin", "Pattern detected!": "Pattern détecté !", "Permanently remove all stored encrypted mnemonics and settings from flash?": "Supprimer définitivement tous les mnémoniques et paramètres chiffrés stockés dans le flash ?", "Persist": "Persistance", "Pixels deviation index:": "Indice de déviation des pixels :", "Plaintext QR": "QR en Texte Brut", "Please load a wallet output descriptor": "Veuillez charger un descripteur de sortie de portefeuille", "Plunge Rate": "Taux de plongée", "Poor entropy": "Entropie faible", "Poor entropy detected!": "Entropie faible détectée !", "Print Test QR": "Impression Test QR", "Print Tiny Seed?": "Imprimer Tiny Seed ?", "Print to QR": "Imprimer Code QR", "Print to QR?": "Imprimer Code QR ?", "Print?": "Imprimer ?", "Printer": "Imprimante", "Printer Driver not set!": "Le pilote d'imprimante n'est pas défini !", "Printing..": "Impression..", "Proceed anyway?": "Procéder quand même ?", "Proceed?": "Procéder ?", "Processing..": "Traitement..", "QR Code": "Code QR", "RX Pin": "RX Fiche", "Reboot": "Redémarrer", "Receive": "Recevoir", "Receive Addresses": "Adresses de Réception", "Region:": "Région :", "Remove %s?": "Supprimer %s ?", "Remove Mnemonic": "Supprimer mnémonique", "Remove firmware files from SD Card?": "Supprimer les fichiers micrologiciel de la carte SD ?", "Res. - Format": "Rés. - Format", "Restore factory settings and reboot?": "Restaurer les paramètres d'usine et redémarrer ?", "Return to QR Viewer": "Retour au visualiseur QR", "Review scanned data, edit if necessary": "Examinez les données numérisées, modifiez-les si nécessaire", "Right": "À droite", "Roll dice at least %d times to generate a mnemonic.": "Lancez le dé au moins %d fois pour générer un mnémonique.", "Rolls distribution:": "Distribution des jets :", "Rolls:": "Jets :", "SD card": "Carte SD", "SD card not detected.": "Carte SD non détectée.", "SHA256 of rolls:": "SHA256 de jets :", "SHA256 of snapshot:": "SHA256 de snapshot :", "Save QR Image to SD Card": "Enregistrer l'image QR sur la carte SD", "Save to SD card": "Enregistrer sur la carte SD", "Save to SD card?": "Enregistrer sur la carte SD ?", "Saved to SD card": "Enregistré sur la carte SD", "Scale": "L'échelle", "Scan Address": "Scannez l'adresse", "Scan BIP39 Passphrase": "Scannez la phrase secrète BIP-39", "Scan Key QR Code": "Scannez le Code QR de la clé", "Scanning words 1-12 again": "Analyser à nouveau les mots 1 à 12", "Scanning words 13-24": "Analyser les mots 13 à 24", "Screensaver Time": "Delai d'Inactivité", "Script Type": "Type de Script", "Security": "Sécurité", "Self-transfer or Change (%d):": "Auto-transfert ou monnaie (%d) :", "Self-transfer:": "Auto-transfert :", "Set a tamper check code first": "Définissez d'abord un code de non compromis", "Settings": "Paramètres", "Settings stored internally on flash.": "Paramètres stockés en interne sur flash.", "Settings stored on SD card.": "Paramètres stockés sur la carte SD.", "Shannon's Entropy:": "Entropie de Shannon :", "Shutdown": "Éteindre", "Shutdown Time": "Delai d'Arrêt", "Shutting down..": "Arrêt en cours..", "Sign": "Signer", "Sign to QR code": "Signer avec le code QR", "Sign to SD card": "Signer sur la carte SD", "Sign?": "Signer ?", "Signature": "Signature", "Signed Message": "Message signé", "Signed PSBT": "PSBT signé", "Signing..": "Signature..", "Single-sig": "Clé unique", "Size:": "Capacité :", "Some checks cannot be performed.": "Certains vérifications ne peuvent pas être effectués.", "Spend (%d):": "Dépense (%d) :", "Spend:": "Dépense :", "Stats for Nerds": "Statistiques pour les geeks", "Store on Flash": "Stocker sur flash", "Store on SD Card": "Stocker sur la carte SD", "Swipe to change mode": "Faites glisser pour changer de mode", "TC Flash Hash": "TC Flash Hash", "TC Flash Hash at Boot": "TC Flash Hash au démarrage", "TOUCH or ENTER to capture": "TOUCHEZ ou ENTRER pour capturer", "TX Pin": "TX Fiche", "Tamper Check Code": "Code de non compromis", "Tamper check code set successfully": "Code de non compromis défini avec succès", "Tamper check codes do not match": "Les codes de non compromis ne correspondent pas", "Text": "Texte", "Theme": "Thème", "Thermal": "Thermique", "To ensure data is unrecoverable use Wipe Device feature": "Pour assurer que les données soient irrécupérables, utilisez la fonctionnalité 'Effacer l'appareil'", "Toggle Brightness": "Ajuster la luminosité", "Tools": "Outils", "Touch Threshold": "Sensibilité", "Touchscreen": "Écran Tactile", "Try more?": "Réessayer ?", "Type BIP39 Passphrase": "Entrez la phrase secrète BIP-39", "Type Key": "Taper clé", "Unit": "Unité", "Upgrade complete.": "Mise à jour complète.", "Use a black background surface.": "Utilisez une surface de fond noire.", "Use camera's entropy to create a new mnemonic": "Utilisez l'entropie de la caméra pour créer un nouveau mnémonique", "Used:": "Utilisé :", "User's Data": "Utilisateur", "Value %s out of range: [%s, %s]": "Valeur %s hors de portée: [%s, %s]", "Value must be multiple of %s": "La valeur doit être un multiple de %s", "Verifying..": "Vérification..", "Version": "Version", "Via Camera": "Par caméra", "Via D20": "Via D20", "Via D6": "Via D6", "Via Manual Input": "Par saisie manuelle", "Via Words": "Via Mots", "Wait for the capture": "Attendez la capture", "Wallet": "Portefeuille", "Wallet Descriptor": "Descripteur de Portefeuille", "Wallet output descriptor": "Descripteur de sortie du portefeuille", "Wallet output descriptor loaded!": "Descripteur de sortie du portefeuille chargé !", "Wallet output descriptor not found.": "Descripteur de sortie du portefeuille introuvable.", "Warning:": "Avertissement :", "Word %d": "Mot %d", "Word Numbers": "Numéros de mots", "Words": "Mots", "Yes": "Oui", "is a valid address!": "Adresse non valide !", "was NOT FOUND in the first %d addresses": "INTROUVABLE dans les %d premières adresses"} \ No newline at end of file diff --git a/i18n/translations/ja-JP.json b/i18n/translations/ja-JP.json index 5bb21b9f5..57e09ae46 100644 --- a/i18n/translations/ja-JP.json +++ b/i18n/translations/ja-JP.json @@ -1,323 +1 @@ -{ - "% of the amount.": "% の金額.", - "%d of %d multisig": "%d の%d マルチシグネチャ", - "%d to %d": "%d へ %d", - "%s removed.": "%s 削除されました.", - "(%d total)": "(%d トータル)", - "(Experimental)": "(実験的)", - "(watch-only)": "(閲覧専用)", - "12 words": "12の単語", - "24 words": "24の単語", - "About": "概要", - "Accept assumption?": "仮定を受け入れますか?", - "Account": "アカウント", - "Account #0 would be assumed": "アカウント#0は仮定されます", - "Account Index": "アカウントインデックス", - "Add or change wallet passphrase?": "ウォレットのパスフレーズを追加または変更しますか?", - "Additional entropy from camera required for AES-CBC mode": "AES-CBCモードにはカメラからの追加エントロピーが必要です", - "Address": "アドレス", - "Align camera and backup plate properly.": "カメラとバックプレートを正しく整列させてください.", - "Allow in settings first!": "最初に設定で許可してください!", - "Anti-glare disabled": "アンチグレアが無効", - "Anti-glare enabled": "アンチグレアが有効", - "Appearance": "外観", - "Are you sure?": "よろしいですか?", - "BGR Colors": "BGRカラー", - "BIP39 Mnemonic": "BIP39 Mnemonic", - "Back": "戻る", - "Back to Menu": "メニューへ戻る", - "Backup Mnemonic": "ニーモニックのバックアップ", - "Bad signature": "無効なサイン", - "Base64 Password": "Base64パスワード", - "Baudrate": "Baudrate", - "Binary Grid": "バイナリグリッド", - "Border Padding": "ボーダーパディング", - "Brightness": "明るさ", - "Buttons": "ボタン", - "Buttons Debounce": "ボタンのデバウンス", - "Capture cancelled": "キャプチャがキャンセルされました", - "Change": "お釣り", - "Change Addresses": "アドレス変更", - "Change theme and reboot?": "テーマの変更と再起動しますか?", - "Change:": "お釣り:", - "Changes will last until shutdown.": "変更はシャットダウンするまで持続します.", - "Check SD Card": "SDカードを確認する", - "Check that address belongs to this wallet?": "このアドレスがこのウォレットに属しているか確認しますか?", - "Checked %d addresses with no matches.": "%d のアドレスを確認しましたが、一致するものはありませんでした.", - "Checking for SD card..": "SDカードを確認中..", - "Confirm Tamper Check Code": "改ざんチェックコードの確認", - "Could not execute %s": "%sを実行できませんでした", - "Create QR Code": "QRコードを生成する", - "Create QR code from text?": "テキストからQRコードを作成しますか?", - "Created:": "作成されました:", - "Current Tamper Check Code": "現在の改ざんチェックコード", - "Custom QR Code": "カスタムQRコード", - "Customize": "カスタマイズする", - "Customizing your wallet will generate a new Key.": "ウォレットをカスタマイズすると、新しいキーが生成されます.", - "Cut Depth": "カットの深さ", - "Cut Method": "カット方法", - "Decimal": "デシマル", - "Decrypt?": "デクリプト?", - "Default Wallet": "デフォルトの財布", - "Depth Per Pass": "パスごとの深さ", - "Derive BIP85 entropy?": "BIP85エントロピーを導出しますか?", - "Descriptor Addresses": "ディスクリプタアドレス", - "Display": "ディスプレイ", - "Do not power off, it may take a while to complete.": "完了するまで電源を切らないでください", - "Done?": "完了?", - "Double mnemonic": "ダブルニーモニック", - "Driver": "ドライバー", - "Empty": "空", - "Enable Krux apps": "Kruxアプリを有効にする", - "Encrypted": "暗号化されました", - "Encrypted QR Code": "暗号化されたQRコード", - "Encrypted mnemonic was not stored": "暗号化されたニーモニックが保存されませんでした", - "Encrypted mnemonic was stored with ID:": "暗号化されたニーモニックがIDとともに保存されました:", - "Encryption": "暗号化", - "Encryption Mode": "暗号化モード", - "Enter %d BIP-39 words.": "%d のBIP-39ワードを入力してください.", - "Enter a 6+ characters Tamper Check Code": "6文字以上の改ざんチェックコードを入力してください", - "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "あなたのBIP-39ニーモニックの各単語を1から2048の番号で入力してください.", - "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "あなたのBIP-39ニーモニックの各単語を1から800の16進数で入力してください.", - "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "あなたのBIP-39ニーモニックの各単語を1から4000の8進数で入力してください.", - "Enter each word of your BIP-39 mnemonic.": "あなたのBIP-39ニーモニックの各単語を入力してください.", - "Erase User's Data": "ユーザーのデータを消去する", - "Erasing user's data..": "ユーザーのデータを消去しています..", - "Error:": "エラー:", - "Esc": "エスク", - "Execute a signed Krux app?": "署名入りのKruxアプリを実行しますか?", - "Explore files?": "アーカイブ探索?", - "Exporting to SD card..": "SDカードへのエクスポート..", - "Extended Public Key": "拡張公開キー", - "Factory Settings": "初期設定", - "Failed to decrypt": "復号化に失敗しました", - "Failed to load PSBT": "PSBTのロードに失敗しました", - "Failed to load address": "アドレスの読み込みに失敗しました", - "Failed to load key": "キーのロードに失敗しました", - "Failed to load message": "メッセージの読み込みに失敗しました", - "Failed to load mnemonic": "mnemonicのロードに失敗しました", - "Failed to load output descriptor": "出力記述子のロードに失敗しました", - "Failed to load passphrase": "パスフレーズのロードに失敗しました", - "Failed to store mnemonic": "mnemonicの保存に失敗しました", - "Fee:": "手数料:", - "Feed Rate": "フィードレート", - "Filename": "ファイル名", - "Filename %s exists on SD card, overwrite?": "ファイル名 %s が SD カードに存在します、上書きしますか?", - "Fill the flash with entropy from camera?": "カメラからのエントロピーでフラッシュを埋めますか?", - "Filling Flash": "フラッシュを充填中", - "Fingerprint unset in PSBT": "PSBTでデジタル指紋が未設定", - "Firmware exceeds max size: %d": "ファームウェアが最大サイズを超えました: %d", - "Flash Map": "フラッシュマップ", - "Flash Tools": "Flashツール", - "Flash filled with camera entropy": "カメラエントロピーで満たされたフラッシュ", - "Flipped X Coordinates": "X座標が反転しました", - "Flute Diameter": "フルートディアメーター", - "Free:": "フリー:", - "From Storage": "ストレージから", - "Fully erase your SD card in another device to ensure data is unrecoverable": "データが復元できないように、他のデバイスでSDカードを完全に消去してください", - "Generate Mnemonic": "Mnemonicを生成する", - "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "このニーモニックにカスタムIDを付けますか?付けない場合は現在のフィンガープリントが使用されます", - "Go": "行く", - "Good entropy": "良いentropy", - "Hardware": "ハードウェア", - "Hex Public Key": "Hex公開キー", - "Hexadecimal": "エクサデシマル", - "Hide Mnemonics": "Mnemonicsを隠す", - "High fees!": "高い手数料!", - "ID already exists": "IDはすでに存在します", - "Index": "インデックス", - "Index: %s": "インデックス:%s", - "Inputs (%d):": "インプット(%d):", - "Install?": "インストールしますか?", - "Insufficient Entropy!": "不十分なエントロピー!", - "Insufficient entropy": "不十分なエントロピー", - "Invalid Tamper Check Code": "無効な改ざんチェックコード", - "Invalid address": "無効なアドレス", - "Invalid bootloader": "無効なブートローダー", - "Invalid mnemonic length": "無効なニーモニックの長さ", - "Invalid public key": "無効な公開キー", - "Invalid wallet:": "無効なウォレット:", - "Invert": "反転する", - "Inverted Colors": "反転した色", - "Key": "キー", - "Key was not provided": "キーが提供されていません", - "Krux Printer Test QR": "KruxプリンターテストQR", - "LCD Type": "LCDタイプ", - "Language": "言語 ", - "Leave blank if you'd like Krux to pick a valid final word": "有効な最終単語をKruxに選んでもらいたい場合は、空白のままにしてください", - "Left": "左", - "Length: %s": "長さ:%s", - "Line Delay": "ライン遅延", - "Line:": "ライン:", - "Load Krux app": "Kruxアプリを読み込む", - "Load Mnemonic": "ニーモニックをロード", - "Load Wallet": "ウォレットをロード", - "Load a trusted wallet descriptor to view addresses?": "信頼できるウォレット記述子をロードしてアドレスを表示しますか?", - "Load from SD card": "SDカードからロード ", - "Load from SD card?": "SDカードからロードしますか?", - "Load from camera": "カメラからロード", - "Load one?": "1つをロードしますか?", - "Load?": "ロードしますか?", - "Loading Camera..": "カメラを読み込み中..", - "Loading change addresses..": "変更アドレスを読み込み中..", - "Loading printer..": "プリンターを読み込み中..", - "Loading receive addresses..": "受信アドレスを読み込み中 ..", - "Loading..": "読み込み中..", - "Locale": "ロケール", - "Location": "場所", - "Maximum length exceeded (%s)": "最大長を超えました (%s)", - "Message": "メッセージ", - "Message:": "メッセージ:", - "Missing signature file": "署名ファイルが欠落しています", - "Mnemonic": "Mnemonic", - "Mnemonic ID": "Mnemonic ID", - "Mnemonic and passphrase will be kept.": "Mnemonicとパスフレーズは保持されます.", - "Mnemonic was not encrypted": "Mnemonicは暗号化されていませんでした", - "Modified:": "修正されました:", - "Multisig": "マルチシグ", - "Native Segwit - 84 would be assumed": "ネイティブSegwit - 84が仮定されます", - "Network": "ネットワーク", - "New Mnemonic": "新しい Mnemonic", - "New firmware detected.": "新しいファームウェアが検出されました.", - "No": "いいえ", - "No Passphrase": "パスフレーズなし", - "Not enough rolls!": "ロールが足りません!", - "Numbers": "数字", - "Octal": "Octal", - "Other Formats": "他のフォーマット", - "PBKDF2 Iter.": "PBKDF2イテレーション", - "Paint punched dots black so they can be detected.": "検出できるように、穴あけされた点を黒く塗ってください.", - "Paper Width": "用紙幅 ", - "Part": "パーツ", - "Part Size": "パーツサイズ", - "Passphrase": "パスワード", - "Password Length": "パスワードの長さ", - "Path mismatch": "パスの不一致", - "Pattern detected!": "パターンが検出されました!", - "Permanently remove all stored encrypted mnemonics and settings from flash?": "フラッシュからすべての保存された暗号化mnemonicsと設定を永久に削除しますか?", - "Persist": "永続させる", - "Pixels deviation index:": "ピクセル偏差指数:", - "Plaintext QR": "プレーンテキストQR", - "Please load a wallet output descriptor": "ウォレットの出力記述子をロードしてください", - "Plunge Rate": "沈下率", - "Poor entropy": "低品質なエントロピー", - "Poor entropy detected!": "低品質なエントロピーが検出されました!", - "Print Test QR": "テストQRを印刷", - "Print Tiny Seed?": "小さなシードを印刷しますか?", - "Print to QR": "QRを印刷", - "Print to QR?": "QRを印刷しますか?", - "Print?": "印刷?", - "Printer": "プリンター ", - "Printer Driver not set!": "プリンタードライバーが設定されていません!", - "Printing..": "印刷中..", - "Proceed anyway?": "そのまま進みますか?", - "Proceed?": "進みますか?", - "Processing..": "処理中..", - "QR Code": "QRコード", - "RX Pin": "RXピン", - "Reboot": "再起動", - "Receive": "受け取る", - "Receive Addresses": "受取アドレス", - "Region:": "地域:", - "Remove %s?": "%sを削除しますか?", - "Remove Mnemonic": "ニーモニックを削除", - "Remove firmware files from SD Card?": "SDカードからファームウェアファイルを削除しますか?", - "Res. - Format": "Res. - フォーマット", - "Restore factory settings and reboot?": "初期化を復元して再起動しますか?", - "Return to QR Viewer": "QRビューワーに戻る", - "Review scanned data, edit if necessary": "スキャンしたデータを確認し、必要に応じて編集します", - "Right": "右", - "Roll dice at least %d times to generate a mnemonic.": "mnemonicを生成するには、少なくとも%d回サイコロを振ってください.", - "Rolls distribution:": "ロールの分布:", - "Rolls:": "ロール:", - "SD card": "SDカード", - "SD card not detected.": "SDカードが検出されません.", - "SHA256 of rolls:": "ロールのSHA256:", - "SHA256 of snapshot:": "画像のSHA256:", - "Save QR Image to SD Card": "QR画像をSDカードに保存する", - "Save to SD card": "SDカードに保存する", - "Save to SD card?": "SDカードに保存しますか?", - "Saved to SD card": "SDカードに保存しました", - "Scale": "スケール", - "Scan Address": "アドレススキャン", - "Scan BIP39 Passphrase": "BIP39パスフレーズをスキャンする", - "Scan Key QR Code": "キーのQRコードをスキャンする", - "Scanning words 1-12 again": "単語1-12を再度スキャン中", - "Scanning words 13-24": "単語13-24をスキャン中", - "Screensaver Time": "スクリーンセーバーの時間", - "Script Type": "スクリプトタイプ", - "Security": "セキュリティa", - "Self-transfer or Change (%d):": "自己転送または変更(%d):", - "Self-transfer:": "自己転送:", - "Set a tamper check code first": "最初に改ざんチェックコードを設定する", - "Settings": "設定", - "Settings stored internally on flash.": "設定はフラッシュメモリに内部保存されています.", - "Settings stored on SD card.": "設定はSDカードに保存されています.", - "Shannon's Entropy:": "シャノンのエントロピー:", - "Shutdown": "シャットダウン", - "Shutdown Time": "シャットダウン時間", - "Shutting down..": "シャットダウン中..", - "Sign": "署名", - "Sign to QR code": "QRコードにサインする", - "Sign to SD card": "SDカードにサインする", - "Sign?": "サインしますか?", - "Signature": "サイン", - "Signed Message": "サイン付きメッセージ", - "Signed PSBT": "サインされたPSBT", - "Signing..": "サインしてます..", - "Single-sig": "シングルサイン", - "Size:": "サイズ:", - "Some checks cannot be performed.": "一部のチェックを実行できません.", - "Spend (%d):": "支出(%d):", - "Spend:": "支出:", - "Stats for Nerds": "オタクのための統計", - "Store on Flash": "フラッシュに保存する", - "Store on SD Card": "SDカードに保存する", - "Swipe to change mode": "スワイプしてモードを変更する", - "TC Flash Hash": "TCフラッシュハッシュ", - "TC Flash Hash at Boot": "起動時のTCフラッシュハッシュ", - "TOUCH or ENTER to capture": "タッチまたはENTERでキャプチャする", - "TX Pin": "TXピン", - "Tamper Check Code": "改ざんチェックコード", - "Tamper check code set successfully": "改ざんチェックコードが正常に設定されました", - "Tamper check codes do not match": "改ざんチェックコードが一致しません", - "Text": "テキスト", - "Theme": "テーマ", - "Thermal": "サーマル", - "To ensure data is unrecoverable use Wipe Device feature": "データが復元不可能であることを確実にするには、デバイス消去機能を使用してください", - "Toggle Brightness": "明るさを切り替える", - "Tools": "ツール", - "Touch Threshold": "タッチスレッショルド", - "Touchscreen": "タッチスクリーン", - "Try more?": "もっと試してみますか?", - "Type BIP39 Passphrase": "BIP39パスフレーズを入力してください", - "Type Key": "キーを入力する", - "Unit": "ユニット", - "Upgrade complete.": "アップグレードが完了しました.", - "Use a black background surface.": "黒い背景面を使用してください.", - "Use camera's entropy to create a new mnemonic": "カメラのエントロピーを使用して新しいmnemonicを作成してください", - "Used:": "使用済み:", - "User's Data": "ユーザーのデータ", - "Value %s out of range: [%s, %s]": "値%sが範囲外です: [ %s, %s]", - "Value must be multiple of %s": "値は%sの倍数でなければなりません", - "Verifying..": "確認中..", - "Version": "バージョン", - "Via Camera": "カメラ経由", - "Via D20": "D20経由", - "Via D6": "D6経由", - "Via Manual Input": "手動入力経由", - "Via Words": "言葉経由", - "Wait for the capture": "キャプチャを待ってください", - "Wallet": "ワレット", - "Wallet Descriptor": "ウォレットディスクリプター", - "Wallet output descriptor": "ウォレット出力ディスクリプター", - "Wallet output descriptor loaded!": "ウォレット出力ディスクリプターがロードされました!", - "Wallet output descriptor not found.": "ウォレット出力ディスクリプターが見つかりません.", - "Warning:": "警告:", - "Word %d": "単語 %d", - "Word Numbers": "単語番号", - "Words": "単語", - "Yes": "はい", - "is a valid address!": "有効なアドレスです!", - "was NOT FOUND in the first %d addresses": "最初の%dアドレスに見つかりませんでした" -} \ No newline at end of file +{"% of the amount.": "% の金額.", "%d of %d multisig": "%d の%d マルチシグネチャ", "%d to %d": "%d へ %d", "%s removed.": "%s 削除されました.", "(%d total)": "(%d トータル)", "(Experimental)": "(実験的)", "(watch-only)": "(閲覧専用)", "12 words": "12の単語", "24 words": "24の単語", "About": "概要", "Accept assumption?": "仮定を受け入れますか?", "Account": "アカウント", "Account #0 would be assumed": "アカウント#0は仮定されます", "Account Index": "アカウントインデックス", "Add or change wallet passphrase?": "ウォレットのパスフレーズを追加または変更しますか?", "Additional entropy from camera required for AES-CBC mode": "AES-CBCモードにはカメラからの追加エントロピーが必要です", "Address": "アドレス", "Align camera and backup plate properly.": "カメラとバックプレートを正しく整列させてください.", "Allow in settings first!": "最初に設定で許可してください!", "Anti-glare disabled": "アンチグレアが無効", "Anti-glare enabled": "アンチグレアが有効", "Appearance": "外観", "Are you sure?": "よろしいですか?", "BGR Colors": "BGRカラー", "BIP39 Mnemonic": "BIP39 Mnemonic", "Back": "戻る", "Back to Menu": "メニューへ戻る", "Backup Mnemonic": "ニーモニックのバックアップ", "Bad signature": "無効なサイン", "Base64 Password": "Base64パスワード", "Baudrate": "Baudrate", "Binary Grid": "バイナリグリッド", "Border Padding": "ボーダーパディング", "Brightness": "明るさ", "Buttons": "ボタン", "Buttons Debounce": "ボタンのデバウンス", "Capture cancelled": "キャプチャがキャンセルされました", "Change": "お釣り", "Change Addresses": "アドレス変更", "Change theme and reboot?": "テーマの変更と再起動しますか?", "Change:": "お釣り:", "Changes will last until shutdown.": "変更はシャットダウンするまで持続します.", "Check SD Card": "SDカードを確認する", "Check that address belongs to this wallet?": "このアドレスがこのウォレットに属しているか確認しますか?", "Checked %d addresses with no matches.": "%d のアドレスを確認しましたが、一致するものはありませんでした.", "Checking for SD card..": "SDカードを確認中..", "Confirm Tamper Check Code": "改ざんチェックコードの確認", "Create QR Code": "QRコードを生成する", "Create QR code from text?": "テキストからQRコードを作成しますか?", "Created:": "作成されました:", "Current Tamper Check Code": "現在の改ざんチェックコード", "Custom QR Code": "カスタムQRコード", "Customize": "カスタマイズする", "Customizing your wallet will generate a new Key.": "ウォレットをカスタマイズすると、新しいキーが生成されます.", "Cut Depth": "カットの深さ", "Cut Method": "カット方法", "Decimal": "デシマル", "Decrypt?": "デクリプト?", "Default Wallet": "デフォルトの財布", "Depth Per Pass": "パスごとの深さ", "Derive BIP85 entropy?": "BIP85エントロピーを導出しますか?", "Descriptor Addresses": "ディスクリプタアドレス", "Display": "ディスプレイ", "Do not power off, it may take a while to complete.": "完了するまで電源を切らないでください", "Done?": "完了?", "Double mnemonic": "ダブルニーモニック", "Driver": "ドライバー", "Empty": "空", "Enable Krux apps": "Kruxアプリを有効にする", "Encrypted": "暗号化されました", "Encrypted QR Code": "暗号化されたQRコード", "Encrypted mnemonic was not stored": "暗号化されたニーモニックが保存されませんでした", "Encrypted mnemonic was stored with ID:": "暗号化されたニーモニックがIDとともに保存されました:", "Encryption": "暗号化", "Encryption Mode": "暗号化モード", "Enter %d BIP-39 words.": "%d のBIP-39ワードを入力してください.", "Enter a 6+ characters Tamper Check Code": "6文字以上の改ざんチェックコードを入力してください", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "あなたのBIP-39ニーモニックの各単語を1から2048の番号で入力してください.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "あなたのBIP-39ニーモニックの各単語を1から800の16進数で入力してください.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "あなたのBIP-39ニーモニックの各単語を1から4000の8進数で入力してください.", "Enter each word of your BIP-39 mnemonic.": "あなたのBIP-39ニーモニックの各単語を入力してください.", "Erase User's Data": "ユーザーのデータを消去する", "Erasing user's data..": "ユーザーのデータを消去しています..", "Error:": "エラー:", "Esc": "エスク", "Execute a signed Krux app?": "署名入りのKruxアプリを実行しますか?", "Explore files?": "アーカイブ探索?", "Exporting to SD card..": "SDカードへのエクスポート..", "Extended Public Key": "拡張公開キー", "Factory Settings": "初期設定", "Failed to decrypt": "復号化に失敗しました", "Failed to load PSBT": "PSBTのロードに失敗しました", "Failed to load address": "アドレスの読み込みに失敗しました", "Failed to load key": "キーのロードに失敗しました", "Failed to load message": "メッセージの読み込みに失敗しました", "Failed to load mnemonic": "mnemonicのロードに失敗しました", "Failed to load output descriptor": "出力記述子のロードに失敗しました", "Failed to load passphrase": "パスフレーズのロードに失敗しました", "Failed to store mnemonic": "mnemonicの保存に失敗しました", "Fee:": "手数料:", "Feed Rate": "フィードレート", "Filename": "ファイル名", "Filename %s exists on SD card, overwrite?": "ファイル名 %s が SD カードに存在します、上書きしますか?", "Fill the flash with entropy from camera?": "カメラからのエントロピーでフラッシュを埋めますか?", "Filling Flash": "フラッシュを充填中", "Fingerprint unset in PSBT": "PSBTでデジタル指紋が未設定", "Firmware exceeds max size: %d": "ファームウェアが最大サイズを超えました: %d", "Flash Map": "フラッシュマップ", "Flash Tools": "Flashツール", "Flash filled with camera entropy": "カメラエントロピーで満たされたフラッシュ", "Flipped X Coordinates": "X座標が反転しました", "Flute Diameter": "フルートディアメーター", "Free:": "フリー:", "From Storage": "ストレージから", "Fully erase your SD card in another device to ensure data is unrecoverable": "データが復元できないように、他のデバイスでSDカードを完全に消去してください", "Generate Mnemonic": "Mnemonicを生成する", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "このニーモニックにカスタムIDを付けますか?付けない場合は現在のフィンガープリントが使用されます", "Go": "行く", "Good entropy": "良いentropy", "Hardware": "ハードウェア", "Hex Public Key": "Hex公開キー", "Hexadecimal": "エクサデシマル", "Hide Mnemonics": "Mnemonicsを隠す", "High fees!": "高い手数料!", "ID already exists": "IDはすでに存在します", "Index": "インデックス", "Index: %s": "インデックス:%s", "Inputs (%d):": "インプット(%d):", "Install?": "インストールしますか?", "Insufficient Entropy!": "不十分なエントロピー!", "Insufficient entropy": "不十分なエントロピー", "Invalid Tamper Check Code": "無効な改ざんチェックコード", "Invalid address": "無効なアドレス", "Invalid bootloader": "無効なブートローダー", "Invalid mnemonic length": "無効なニーモニックの長さ", "Invalid public key": "無効な公開キー", "Invalid wallet:": "無効なウォレット:", "Invert": "反転する", "Inverted Colors": "反転した色", "Key": "キー", "Key was not provided": "キーが提供されていません", "Krux Printer Test QR": "KruxプリンターテストQR", "LCD Type": "LCDタイプ", "Language": "言語 ", "Leave blank if you'd like Krux to pick a valid final word": "有効な最終単語をKruxに選んでもらいたい場合は、空白のままにしてください", "Left": "左", "Length: %s": "長さ:%s", "Line Delay": "ライン遅延", "Line:": "ライン:", "Load Krux app": "Kruxアプリを読み込む", "Load Mnemonic": "ニーモニックをロード", "Load Wallet": "ウォレットをロード", "Load a trusted wallet descriptor to view addresses?": "信頼できるウォレット記述子をロードしてアドレスを表示しますか?", "Load from SD card": "SDカードからロード ", "Load from SD card?": "SDカードからロードしますか?", "Load from camera": "カメラからロード", "Load one?": "1つをロードしますか?", "Load?": "ロードしますか?", "Loading Camera..": "カメラを読み込み中..", "Loading change addresses..": "変更アドレスを読み込み中..", "Loading printer..": "プリンターを読み込み中..", "Loading receive addresses..": "受信アドレスを読み込み中 ..", "Loading..": "読み込み中..", "Locale": "ロケール", "Location": "場所", "Maximum length exceeded (%s)": "最大長を超えました (%s)", "Message": "メッセージ", "Message:": "メッセージ:", "Missing signature file": "署名ファイルが欠落しています", "Mnemonic": "Mnemonic", "Mnemonic ID": "Mnemonic ID", "Mnemonic and passphrase will be kept.": "Mnemonicとパスフレーズは保持されます.", "Mnemonic was not encrypted": "Mnemonicは暗号化されていませんでした", "Modified:": "修正されました:", "Multisig": "マルチシグ", "Native Segwit - 84 would be assumed": "ネイティブSegwit - 84が仮定されます", "Network": "ネットワーク", "New Mnemonic": "新しい Mnemonic", "New firmware detected.": "新しいファームウェアが検出されました.", "No": "いいえ", "No Passphrase": "パスフレーズなし", "Not enough rolls!": "ロールが足りません!", "Numbers": "数字", "Octal": "Octal", "Other Formats": "他のフォーマット", "PBKDF2 Iter.": "PBKDF2イテレーション", "Paint punched dots black so they can be detected.": "検出できるように、穴あけされた点を黒く塗ってください.", "Paper Width": "用紙幅 ", "Part": "パーツ", "Part Size": "パーツサイズ", "Passphrase": "パスワード", "Password Length": "パスワードの長さ", "Path mismatch": "パスの不一致", "Pattern detected!": "パターンが検出されました!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "フラッシュからすべての保存された暗号化mnemonicsと設定を永久に削除しますか?", "Persist": "永続させる", "Pixels deviation index:": "ピクセル偏差指数:", "Plaintext QR": "プレーンテキストQR", "Please load a wallet output descriptor": "ウォレットの出力記述子をロードしてください", "Plunge Rate": "沈下率", "Poor entropy": "低品質なエントロピー", "Poor entropy detected!": "低品質なエントロピーが検出されました!", "Print Test QR": "テストQRを印刷", "Print Tiny Seed?": "小さなシードを印刷しますか?", "Print to QR": "QRを印刷", "Print to QR?": "QRを印刷しますか?", "Print?": "印刷?", "Printer": "プリンター ", "Printer Driver not set!": "プリンタードライバーが設定されていません!", "Printing..": "印刷中..", "Proceed anyway?": "そのまま進みますか?", "Proceed?": "進みますか?", "Processing..": "処理中..", "QR Code": "QRコード", "RX Pin": "RXピン", "Reboot": "再起動", "Receive": "受け取る", "Receive Addresses": "受取アドレス", "Region:": "地域:", "Remove %s?": "%sを削除しますか?", "Remove Mnemonic": "ニーモニックを削除", "Remove firmware files from SD Card?": "SDカードからファームウェアファイルを削除しますか?", "Res. - Format": "Res. - フォーマット", "Restore factory settings and reboot?": "初期化を復元して再起動しますか?", "Return to QR Viewer": "QRビューワーに戻る", "Review scanned data, edit if necessary": "スキャンしたデータを確認し、必要に応じて編集します", "Right": "右", "Roll dice at least %d times to generate a mnemonic.": "mnemonicを生成するには、少なくとも%d回サイコロを振ってください.", "Rolls distribution:": "ロールの分布:", "Rolls:": "ロール:", "SD card": "SDカード", "SD card not detected.": "SDカードが検出されません.", "SHA256 of rolls:": "ロールのSHA256:", "SHA256 of snapshot:": "画像のSHA256:", "Save QR Image to SD Card": "QR画像をSDカードに保存する", "Save to SD card": "SDカードに保存する", "Save to SD card?": "SDカードに保存しますか?", "Saved to SD card": "SDカードに保存しました", "Scale": "スケール", "Scan Address": "アドレススキャン", "Scan BIP39 Passphrase": "BIP39パスフレーズをスキャンする", "Scan Key QR Code": "キーのQRコードをスキャンする", "Scanning words 1-12 again": "単語1-12を再度スキャン中", "Scanning words 13-24": "単語13-24をスキャン中", "Screensaver Time": "スクリーンセーバーの時間", "Script Type": "スクリプトタイプ", "Security": "セキュリティa", "Self-transfer or Change (%d):": "自己転送または変更(%d):", "Self-transfer:": "自己転送:", "Set a tamper check code first": "最初に改ざんチェックコードを設定する", "Settings": "設定", "Settings stored internally on flash.": "設定はフラッシュメモリに内部保存されています.", "Settings stored on SD card.": "設定はSDカードに保存されています.", "Shannon's Entropy:": "シャノンのエントロピー:", "Shutdown": "シャットダウン", "Shutdown Time": "シャットダウン時間", "Shutting down..": "シャットダウン中..", "Sign": "署名", "Sign to QR code": "QRコードにサインする", "Sign to SD card": "SDカードにサインする", "Sign?": "サインしますか?", "Signature": "サイン", "Signed Message": "サイン付きメッセージ", "Signed PSBT": "サインされたPSBT", "Signing..": "サインしてます..", "Single-sig": "シングルサイン", "Size:": "サイズ:", "Some checks cannot be performed.": "一部のチェックを実行できません.", "Spend (%d):": "支出(%d):", "Spend:": "支出:", "Stats for Nerds": "オタクのための統計", "Store on Flash": "フラッシュに保存する", "Store on SD Card": "SDカードに保存する", "Swipe to change mode": "スワイプしてモードを変更する", "TC Flash Hash": "TCフラッシュハッシュ", "TC Flash Hash at Boot": "起動時のTCフラッシュハッシュ", "TOUCH or ENTER to capture": "タッチまたはENTERでキャプチャする", "TX Pin": "TXピン", "Tamper Check Code": "改ざんチェックコード", "Tamper check code set successfully": "改ざんチェックコードが正常に設定されました", "Tamper check codes do not match": "改ざんチェックコードが一致しません", "Text": "テキスト", "Theme": "テーマ", "Thermal": "サーマル", "To ensure data is unrecoverable use Wipe Device feature": "データが復元不可能であることを確実にするには、デバイス消去機能を使用してください", "Toggle Brightness": "明るさを切り替える", "Tools": "ツール", "Touch Threshold": "タッチスレッショルド", "Touchscreen": "タッチスクリーン", "Try more?": "もっと試してみますか?", "Type BIP39 Passphrase": "BIP39パスフレーズを入力してください", "Type Key": "キーを入力する", "Unit": "ユニット", "Upgrade complete.": "アップグレードが完了しました.", "Use a black background surface.": "黒い背景面を使用してください.", "Use camera's entropy to create a new mnemonic": "カメラのエントロピーを使用して新しいmnemonicを作成してください", "Used:": "使用済み:", "User's Data": "ユーザーのデータ", "Value %s out of range: [%s, %s]": "値%sが範囲外です: [ %s, %s]", "Value must be multiple of %s": "値は%sの倍数でなければなりません", "Verifying..": "確認中..", "Version": "バージョン", "Via Camera": "カメラ経由", "Via D20": "D20経由", "Via D6": "D6経由", "Via Manual Input": "手動入力経由", "Via Words": "言葉経由", "Wait for the capture": "キャプチャを待ってください", "Wallet": "ワレット", "Wallet Descriptor": "ウォレットディスクリプター", "Wallet output descriptor": "ウォレット出力ディスクリプター", "Wallet output descriptor loaded!": "ウォレット出力ディスクリプターがロードされました!", "Wallet output descriptor not found.": "ウォレット出力ディスクリプターが見つかりません.", "Warning:": "警告:", "Word %d": "単語 %d", "Word Numbers": "単語番号", "Words": "単語", "Yes": "はい", "is a valid address!": "有効なアドレスです!", "was NOT FOUND in the first %d addresses": "最初の%dアドレスに見つかりませんでした"} \ No newline at end of file diff --git a/i18n/translations/ko-KR.json b/i18n/translations/ko-KR.json index 9718b6650..29df19430 100644 --- a/i18n/translations/ko-KR.json +++ b/i18n/translations/ko-KR.json @@ -1,323 +1 @@ -{ - "% of the amount.": "수량: %", - "%d of %d multisig": "%d의 %d 멀티시그", - "%d to %d": "%d 부터 %d", - "%s removed.": "%s 제거되었습니다.", - "(%d total)": "(총 %d)", - "(Experimental)": "(실험적 기능)", - "(watch-only)": "(잔액조회 전용)", - "12 words": "12단어", - "24 words": "24단어", - "About": "기본 정보", - "Accept assumption?": "가정을 수락하시겠습니까?", - "Account": "계정", - "Account #0 would be assumed": "계정 #0이 가정됩니다", - "Account Index": "계정 인덱스", - "Add or change wallet passphrase?": "패스프레이즈를 추가하거나 변경하시겠습니까?", - "Additional entropy from camera required for AES-CBC mode": "AES-CBC 모드를 위해 카메라의 추가 엔트로피가 필요합니다", - "Address": "주소", - "Align camera and backup plate properly.": "카메라와 보조 플레이트를 올바르게 정렬하십시오.", - "Allow in settings first!": "먼저 설정에서 허용하세요!", - "Anti-glare disabled": "눈부심방지 비활성화", - "Anti-glare enabled": "눈부심방지 활성화", - "Appearance": "디스플레이", - "Are you sure?": "계속하시겠습니까?", - "BGR Colors": "BGR 색상", - "BIP39 Mnemonic": "BIP39 니뫠닉", - "Back": "뒤로", - "Back to Menu": "메뉴로 돌아가기", - "Backup Mnemonic": "니모닉 백업", - "Bad signature": "잘못된 서명", - "Base64 Password": "Base64 비밀번호", - "Baudrate": "Baudrate", - "Binary Grid": "이진수 그리드", - "Border Padding": "테두리 여백", - "Brightness": "밝기", - "Buttons": "버튼", - "Buttons Debounce": "버튼 바운스 방지", - "Capture cancelled": "캡처 취소됨", - "Change": "잔돈", - "Change Addresses": "잔돈 주소", - "Change theme and reboot?": "테마를 변경하고 재부팅하시겠습니까?", - "Change:": "변경", - "Changes will last until shutdown.": "변경 사항은 종료될때까지 유지됩니다.", - "Check SD Card": "SD카드 확인", - "Check that address belongs to this wallet?": "해당 주소가 이 지갑에 속하는지 확인하시겠습니까?", - "Checked %d addresses with no matches.": "일치하는 주소가 없는 %d 개를 확인했습니다.", - "Checking for SD card..": "SD카드 확인 중..", - "Confirm Tamper Check Code": "탬퍼 체크 코드 확인", - "Could not execute %s": "%s 을 (를) 실행할 수 없습니다", - "Create QR Code": "QR 코드 생성", - "Create QR code from text?": "텍스트로부터 QR코드를 생성하시겠습니까?", - "Created:": "생성됨:", - "Current Tamper Check Code": "현재 탬퍼 체크 코드", - "Custom QR Code": "사용자 정의 QR코드", - "Customize": "사용자 정의", - "Customizing your wallet will generate a new Key.": "지갑을 커스터마이징하면 새로운 비밀키가 생성됩니다.", - "Cut Depth": "Cut Depth", - "Cut Method": "Cut Method", - "Decimal": "10진수", - "Decrypt?": "복호화하시겠습니까?", - "Default Wallet": "지갑 기본설정", - "Depth Per Pass": "Depth Per Pass", - "Derive BIP85 entropy?": "BIP85 엔트로피를 유독하시겠습니까?", - "Descriptor Addresses": "디스크립터 주소", - "Display": "디스플레이", - "Do not power off, it may take a while to complete.": "전원을 끄지 마십시오. 완료하는 데 시간이 걸릴 수 있습니다.", - "Done?": "완료되었습니까?", - "Double mnemonic": "이중 니모닉", - "Driver": "드라이버", - "Empty": "비어 있음", - "Enable Krux apps": "Krux 앱 활성화", - "Encrypted": "암호화 후 저장", - "Encrypted QR Code": "암호화된 QR 코드", - "Encrypted mnemonic was not stored": "암호화된 니모닉을 저장하지 못했습니다", - "Encrypted mnemonic was stored with ID:": "암호화된 니모닉을 다음 아이디와 함께 저장했습니다:", - "Encryption": "암호화", - "Encryption Mode": "암호화 모드", - "Enter %d BIP-39 words.": "%d개의 BIP-39 단어를 입력하십시오.", - "Enter a 6+ characters Tamper Check Code": "6자 이상의 탬퍼 체크 코드를 입력하세요", - "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "BIP-39 니모닉의 각 단어를 1에서 2048 사이의 숫자로 입력하십시오.", - "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "BIP-39 니모닉의 각 단어를 1에서 800 사이의 16진수 숫자로 입력하십시오.", - "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "BIP-39 니모닉의 각 단어를 1에서 4000 사이의 8진수 숫자로 입력하십시오.", - "Enter each word of your BIP-39 mnemonic.": "BIP-39 니모닉의 각 단어를 입력하십시오.", - "Erase User's Data": "사용자 데이터 지우기", - "Erasing user's data..": "사용자의 데이터를 지우는 중...", - "Error:": "오류:", - "Esc": "Esc", - "Execute a signed Krux app?": "서명된 Krux 앱을 실행하시겠습니까?", - "Explore files?": "파일을 탐색하시겠습니까?", - "Exporting to SD card..": "SD카드로 내보내는 중..", - "Extended Public Key": "XPUB 내보내기", - "Factory Settings": "공장 초기 설정", - "Failed to decrypt": "복호화에 실패했습니다", - "Failed to load PSBT": "PSBT를 불러오지 못했습니다", - "Failed to load address": "주소를 불러오지 못했습니다", - "Failed to load key": "키 로드에 실패했습니다", - "Failed to load message": "메시지를 불러오지 못했습니다", - "Failed to load mnemonic": "니모닉을 불러오지 못했습니다", - "Failed to load output descriptor": "아웃풋 디스크립터를 불러오지 못했습니다", - "Failed to load passphrase": "패스프레이즈를 불러오지 못했습니다", - "Failed to store mnemonic": "니모닉을 저장하지 못했습니다", - "Fee:": "수수료:", - "Feed Rate": "Feed Rate", - "Filename": "파일명", - "Filename %s exists on SD card, overwrite?": "%s 파일명이 SD카드에 이미 존재합니다. 덮어쓰시겠습니까?", - "Fill the flash with entropy from camera?": "카메라의 엔트로피로 플래시를 채우시겠습니까?", - "Filling Flash": "플래시 채우기", - "Fingerprint unset in PSBT": "PSBT에서 지문이 설정되지 않았습니다", - "Firmware exceeds max size: %d": "펌웨어가 최대 크기를 초과했습니다: %d", - "Flash Map": "플래시 맵", - "Flash Tools": "플래시 도구", - "Flash filled with camera entropy": "카메라 엔트로피로 가득 찬 플래시", - "Flipped X Coordinates": "X 좌표 반전", - "Flute Diameter": "플루트 직경", - "Free:": "여유 공간:", - "From Storage": "저장공간에서 불러오기", - "Fully erase your SD card in another device to ensure data is unrecoverable": "다른 장치에서 데이터 복구가 불가능하도록 SD카드를 완전히 지우십시오", - "Generate Mnemonic": "니모닉 생성", - "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "이 니모닉에 별도 아이디를 지정하시겠습니까? 지정하지 않으면 현재 지문을 사용합니다", - "Go": "선택", - "Good entropy": "엔트로피가 충분합니다", - "Hardware": "하드웨어", - "Hex Public Key": "16진수 공개키", - "Hexadecimal": "16진수", - "Hide Mnemonics": "니모닉 숨기기", - "High fees!": "수수료가 높습니다!", - "ID already exists": "아이디가 이미 존재합니다", - "Index": "인덱스", - "Index: %s": "인덱스: %s", - "Inputs (%d):": "Input (%d):", - "Install?": "설치하시겠습니까?", - "Insufficient Entropy!": "엔트로피가 충분하지 않습니다!", - "Insufficient entropy": "엔트로피가 충분하지 않습니다", - "Invalid Tamper Check Code": "유효하지 않은 탬퍼 체크 코드", - "Invalid address": "주소가 잘못되었습니다", - "Invalid bootloader": "부트로더가 잘못되었습니다", - "Invalid mnemonic length": "니모닉 길이가 잘못되었습니다", - "Invalid public key": "공개키가 잘못되었습니다", - "Invalid wallet:": "지갑이 잘못되었습니다:", - "Invert": "반전", - "Inverted Colors": "반전된 색상", - "Key": "키", - "Key was not provided": "키가 제공되지 않았습니다", - "Krux Printer Test QR": "Krux 프린터 테스트 QR", - "LCD Type": "LCD 유형", - "Language": "언어", - "Leave blank if you'd like Krux to pick a valid final word": "마지막 단어를 Krux가 선택하도록 하려면 비워두십시오", - "Left": "왼쪽", - "Length: %s": "길이: %s", - "Line Delay": "줄 지연", - "Line:": "줄:", - "Load Krux app": "Krux 앱 로드", - "Load Mnemonic": "니모닉 불러오기", - "Load Wallet": "이대로 불러오기", - "Load a trusted wallet descriptor to view addresses?": "주소를 보기위해 신뢰할 수 있는 월렛 디스크립터를 불러오시겠습니까?", - "Load from SD card": "SD카드에서 불러오기", - "Load from SD card?": "SD카드에서 불러오시겠습니까?", - "Load from camera": "카메라로 불러오기", - "Load one?": "불러오시겠습니까?", - "Load?": "불러오시겠습니까?", - "Loading Camera..": "카메라를 구동 중입니다..", - "Loading change addresses..": "잔돈 주소를 불러옵니다..", - "Loading printer..": "프린터를 로딩 중입니다..", - "Loading receive addresses..": "수신 주소 불러옵니다..", - "Loading..": "로딩 중..", - "Locale": "언어 설정", - "Location": "기본 저장소", - "Maximum length exceeded (%s)": "최대 길이를 초과함 (%s)", - "Message": "메시지", - "Message:": "메시지:", - "Missing signature file": "서명 파일이 누락되었습니다", - "Mnemonic": "니모닉", - "Mnemonic ID": "니모닉 ID", - "Mnemonic and passphrase will be kept.": "니모닉과 암호는 유지됩니다.", - "Mnemonic was not encrypted": "니모닉이 암호화되지 않았습니다", - "Modified:": "수정되었습니다:", - "Multisig": "멀티시그", - "Native Segwit - 84 would be assumed": "네이티브 세그윗 - BIP84를 적용합니다", - "Network": "네트워크", - "New Mnemonic": "새로운 니모닉", - "New firmware detected.": "새로운 펌웨어가 감지되었습니다.", - "No": "아니요", - "No Passphrase": "패스프레이즈 없음", - "Not enough rolls!": "주사위 횟수가 충분하지 않습니다!", - "Numbers": "시드문구 순번", - "Octal": "8진수", - "Other Formats": "기타 형식", - "PBKDF2 Iter.": "PBKDF2 Iter.", - "Paint punched dots black so they can be detected.": "카메라가 감지할 수 있도록 펀치된 점을 검게 칠하십시오.", - "Paper Width": "종이 너비", - "Part": "파트", - "Part Size": "파트 사이즈", - "Passphrase": "패스프레이즈", - "Password Length": "비밀번호 길이", - "Path mismatch": "경로 불일치", - "Pattern detected!": "패턴이 감지되었습니다!", - "Permanently remove all stored encrypted mnemonics and settings from flash?": "저장된 모든 니모닉 및 설정값을 영구적으로 제거하시겠습니까?", - "Persist": "저장", - "Pixels deviation index:": "픽셀 편차 지수:", - "Plaintext QR": "일반텍스트 QR", - "Please load a wallet output descriptor": "지갑 출력 디스크립터를 불러오십시오", - "Plunge Rate": "침수율", - "Poor entropy": "엔트로피가 부족합니다", - "Poor entropy detected!": "엔트로피가 부족합니다!", - "Print Test QR": "QR 테스트 인쇄", - "Print Tiny Seed?": "Tiny Seed를 인쇄하시겠습니까?", - "Print to QR": "QR로 인쇄", - "Print to QR?": "QR로 인쇄하시겠습니까?", - "Print?": "인쇄하시겠습니까?", - "Printer": "프린터", - "Printer Driver not set!": "프린터 드라이버가 설정되지 않았습니다!", - "Printing..": "출력중", - "Proceed anyway?": "계속하시겠습니까?", - "Proceed?": "계속하시겠습니까?", - "Processing..": "처리...", - "QR Code": "QR 코드", - "RX Pin": "RX 핀", - "Reboot": "다시 반복", - "Receive": "받기", - "Receive Addresses": "주소", - "Region:": "지역:", - "Remove %s?": "%s을 제거하시겠습니까?", - "Remove Mnemonic": "니모닉 제거", - "Remove firmware files from SD Card?": "SD카드에서 펌웨어 파일을 제거하시겠습니까?", - "Res. - Format": "Res. - 형식", - "Restore factory settings and reboot?": "공장 설정을 복원하고 재부팅하시겠습니까?", - "Return to QR Viewer": "QR 뷰어로 돌아가기", - "Review scanned data, edit if necessary": "스캔된 데이터를 검토하고 필요한 경우 수정하십시오", - "Right": "오른쪽", - "Roll dice at least %d times to generate a mnemonic.": "니모닉을 생성하려면 주사위를 최소 %d번 굴리십시오.", - "Rolls distribution:": "주사위값 분포:", - "Rolls:": "주사위 횟수:", - "SD card": "SD카드", - "SD card not detected.": "SD카드가 감지되지 않았습니다.", - "SHA256 of rolls:": "주사위의 SHA256:", - "SHA256 of snapshot:": "SHA256 스냅샷:", - "Save QR Image to SD Card": "QR 이미지를 SD카드에 저장", - "Save to SD card": "SD카드에 저장", - "Save to SD card?": "SD카드에 저장하시겠습니까?", - "Saved to SD card": "SD카드에 저장됨", - "Scale": "스케일", - "Scan Address": "주소 스캔하기", - "Scan BIP39 Passphrase": "BIP39 패스프레이즈 스캔하기", - "Scan Key QR Code": "비밀번호 QR 스캔", - "Scanning words 1-12 again": "1번째부터 12번째 단어를 스캔 중입니다", - "Scanning words 13-24": "13번째부터 24번째 단어를 스캔 중입니다", - "Screensaver Time": "화면보호기 시간", - "Script Type": "지갑 형식", - "Security": "보안", - "Self-transfer or Change (%d):": "본인주소 전송 또는 잔돈 (%d):", - "Self-transfer:": "자가 이체:", - "Set a tamper check code first": "먼저 탬퍼 체크 코드를 설정하세요.", - "Settings": "설정", - "Settings stored internally on flash.": "설정은 플래시에서 내부적으로 저장됩니다.", - "Settings stored on SD card.": "SD 카드에 저장된 설정.", - "Shannon's Entropy:": "Shannon의 엔트로피:", - "Shutdown": "종료", - "Shutdown Time": "자동 종료시간", - "Shutting down..": "종료 중..", - "Sign": "서명하기", - "Sign to QR code": "QR코드로 내보내기", - "Sign to SD card": "SD카드로 내보내기", - "Sign?": "서명하시겠습니까?", - "Signature": "서명", - "Signed Message": "서명된 메시지", - "Signed PSBT": "서명된 PSBT", - "Signing..": "서명 중..", - "Single-sig": "단일서명", - "Size:": "크기:", - "Some checks cannot be performed.": "일부 검사를 수행할 수 없습니다.", - "Spend (%d):": "Spend (%d):", - "Spend:": "지출", - "Stats for Nerds": "전문가를 위한 통계", - "Store on Flash": "플래시 메모리에 저장", - "Store on SD Card": "SD카드에 저장", - "Swipe to change mode": "모드를 변경하려면 화면을 옆으로 쓸어내리세요", - "TC Flash Hash": "TC Flash Hash", - "TC Flash Hash at Boot": "부팅 시 플래시 탬퍼 확인 해시", - "TOUCH or ENTER to capture": "터치하거나 엔터를 눌러 캡처하십시오", - "TX Pin": "TX 핀", - "Tamper Check Code": "탬퍼 체크 코드", - "Tamper check code set successfully": "탬퍼 검사 코드가 성공적으로 설정되었습니다", - "Tamper check codes do not match": "탬퍼 검사 코드가 일치하지 않습니다", - "Text": "텍스트", - "Theme": "테마", - "Thermal": "Thermal", - "To ensure data is unrecoverable use Wipe Device feature": "데이터 복구가 불가능하도록 장치 전체지우기 기능을 사용하십시오", - "Toggle Brightness": "밝기 전환", - "Tools": "도구", - "Touch Threshold": "터치 민감도", - "Touchscreen": "터치스크린", - "Try more?": "더 하시겠습니까?", - "Type BIP39 Passphrase": "BIP39 패스프레이즈 입력", - "Type Key": "비밀번호 입력", - "Unit": "단위", - "Upgrade complete.": "업그레이드가 완료되었습니다", - "Use a black background surface.": "검은색 배경 화면을 사용하십시오.", - "Use camera's entropy to create a new mnemonic": "카메라의 엔트로피를 사용하여 새로운 니모닉을 생성하십시오", - "Used:": "이미 사용됨:", - "User's Data": "사용자 데이터", - "Value %s out of range: [%s, %s]": "%s는 [%s, %s] 범위를 벗어났습니다", - "Value must be multiple of %s": "값은 %s의 배수여야 합니다", - "Verifying..": "검증 중..", - "Version": "버전", - "Via Camera": "카메라", - "Via D20": "20면체 주사위", - "Via D6": "일반 주사위", - "Via Manual Input": "직접 입력", - "Via Words": "니모닉 단어 입력", - "Wait for the capture": "캡처될때까지 기다리십시오", - "Wallet": "지갑 설정", - "Wallet Descriptor": "지갑 디스크립터", - "Wallet output descriptor": "지갑 출력 디스크립터", - "Wallet output descriptor loaded!": "지갑 출력 디스크립터가 로드되었습니다!", - "Wallet output descriptor not found.": "지갑 출력 디스크립터를 찾을 수 없습니다.", - "Warning:": "경고:", - "Word %d": "%d 단어", - "Word Numbers": "단어 번호(1-2048)", - "Words": "시드문구", - "Yes": "예", - "is a valid address!": "는 유효한 주소입니다!", - "was NOT FOUND in the first %d addresses": "첫 번째 %d개의 주소에서 찾을 수 없습니다" -} \ No newline at end of file +{"% of the amount.": "수량: %", "%d of %d multisig": "%d의 %d 멀티시그", "%d to %d": "%d 부터 %d", "%s removed.": "%s 제거되었습니다.", "(%d total)": "(총 %d)", "(Experimental)": "(실험적 기능)", "(watch-only)": "(잔액조회 전용)", "12 words": "12단어", "24 words": "24단어", "About": "기본 정보", "Accept assumption?": "가정을 수락하시겠습니까?", "Account": "계정", "Account #0 would be assumed": "계정 #0이 가정됩니다", "Account Index": "계정 인덱스", "Add or change wallet passphrase?": "패스프레이즈를 추가하거나 변경하시겠습니까?", "Additional entropy from camera required for AES-CBC mode": "AES-CBC 모드를 위해 카메라의 추가 엔트로피가 필요합니다", "Address": "주소", "Align camera and backup plate properly.": "카메라와 보조 플레이트를 올바르게 정렬하십시오.", "Allow in settings first!": "먼저 설정에서 허용하세요!", "Anti-glare disabled": "눈부심방지 비활성화", "Anti-glare enabled": "눈부심방지 활성화", "Appearance": "디스플레이", "Are you sure?": "계속하시겠습니까?", "BGR Colors": "BGR 색상", "BIP39 Mnemonic": "BIP39 니뫠닉", "Back": "뒤로", "Back to Menu": "메뉴로 돌아가기", "Backup Mnemonic": "니모닉 백업", "Bad signature": "잘못된 서명", "Base64 Password": "Base64 비밀번호", "Baudrate": "Baudrate", "Binary Grid": "이진수 그리드", "Border Padding": "테두리 여백", "Brightness": "밝기", "Buttons": "버튼", "Buttons Debounce": "버튼 바운스 방지", "Capture cancelled": "캡처 취소됨", "Change": "잔돈", "Change Addresses": "잔돈 주소", "Change theme and reboot?": "테마를 변경하고 재부팅하시겠습니까?", "Change:": "변경", "Changes will last until shutdown.": "변경 사항은 종료될때까지 유지됩니다.", "Check SD Card": "SD카드 확인", "Check that address belongs to this wallet?": "해당 주소가 이 지갑에 속하는지 확인하시겠습니까?", "Checked %d addresses with no matches.": "일치하는 주소가 없는 %d 개를 확인했습니다.", "Checking for SD card..": "SD카드 확인 중..", "Confirm Tamper Check Code": "탬퍼 체크 코드 확인", "Create QR Code": "QR 코드 생성", "Create QR code from text?": "텍스트로부터 QR코드를 생성하시겠습니까?", "Created:": "생성됨:", "Current Tamper Check Code": "현재 탬퍼 체크 코드", "Custom QR Code": "사용자 정의 QR코드", "Customize": "사용자 정의", "Customizing your wallet will generate a new Key.": "지갑을 커스터마이징하면 새로운 비밀키가 생성됩니다.", "Cut Depth": "Cut Depth", "Cut Method": "Cut Method", "Decimal": "10진수", "Decrypt?": "복호화하시겠습니까?", "Default Wallet": "지갑 기본설정", "Depth Per Pass": "Depth Per Pass", "Derive BIP85 entropy?": "BIP85 엔트로피를 유독하시겠습니까?", "Descriptor Addresses": "디스크립터 주소", "Display": "디스플레이", "Do not power off, it may take a while to complete.": "전원을 끄지 마십시오. 완료하는 데 시간이 걸릴 수 있습니다.", "Done?": "완료되었습니까?", "Double mnemonic": "이중 니모닉", "Driver": "드라이버", "Empty": "비어 있음", "Enable Krux apps": "Krux 앱 활성화", "Encrypted": "암호화 후 저장", "Encrypted QR Code": "암호화된 QR 코드", "Encrypted mnemonic was not stored": "암호화된 니모닉을 저장하지 못했습니다", "Encrypted mnemonic was stored with ID:": "암호화된 니모닉을 다음 아이디와 함께 저장했습니다:", "Encryption": "암호화", "Encryption Mode": "암호화 모드", "Enter %d BIP-39 words.": "%d개의 BIP-39 단어를 입력하십시오.", "Enter a 6+ characters Tamper Check Code": "6자 이상의 탬퍼 체크 코드를 입력하세요", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "BIP-39 니모닉의 각 단어를 1에서 2048 사이의 숫자로 입력하십시오.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "BIP-39 니모닉의 각 단어를 1에서 800 사이의 16진수 숫자로 입력하십시오.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "BIP-39 니모닉의 각 단어를 1에서 4000 사이의 8진수 숫자로 입력하십시오.", "Enter each word of your BIP-39 mnemonic.": "BIP-39 니모닉의 각 단어를 입력하십시오.", "Erase User's Data": "사용자 데이터 지우기", "Erasing user's data..": "사용자의 데이터를 지우는 중...", "Error:": "오류:", "Esc": "Esc", "Execute a signed Krux app?": "서명된 Krux 앱을 실행하시겠습니까?", "Explore files?": "파일을 탐색하시겠습니까?", "Exporting to SD card..": "SD카드로 내보내는 중..", "Extended Public Key": "XPUB 내보내기", "Factory Settings": "공장 초기 설정", "Failed to decrypt": "복호화에 실패했습니다", "Failed to load PSBT": "PSBT를 불러오지 못했습니다", "Failed to load address": "주소를 불러오지 못했습니다", "Failed to load key": "키 로드에 실패했습니다", "Failed to load message": "메시지를 불러오지 못했습니다", "Failed to load mnemonic": "니모닉을 불러오지 못했습니다", "Failed to load output descriptor": "아웃풋 디스크립터를 불러오지 못했습니다", "Failed to load passphrase": "패스프레이즈를 불러오지 못했습니다", "Failed to store mnemonic": "니모닉을 저장하지 못했습니다", "Fee:": "수수료:", "Feed Rate": "Feed Rate", "Filename": "파일명", "Filename %s exists on SD card, overwrite?": "%s 파일명이 SD카드에 이미 존재합니다. 덮어쓰시겠습니까?", "Fill the flash with entropy from camera?": "카메라의 엔트로피로 플래시를 채우시겠습니까?", "Filling Flash": "플래시 채우기", "Fingerprint unset in PSBT": "PSBT에서 지문이 설정되지 않았습니다", "Firmware exceeds max size: %d": "펌웨어가 최대 크기를 초과했습니다: %d", "Flash Map": "플래시 맵", "Flash Tools": "플래시 도구", "Flash filled with camera entropy": "카메라 엔트로피로 가득 찬 플래시", "Flipped X Coordinates": "X 좌표 반전", "Flute Diameter": "플루트 직경", "Free:": "여유 공간:", "From Storage": "저장공간에서 불러오기", "Fully erase your SD card in another device to ensure data is unrecoverable": "다른 장치에서 데이터 복구가 불가능하도록 SD카드를 완전히 지우십시오", "Generate Mnemonic": "니모닉 생성", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "이 니모닉에 별도 아이디를 지정하시겠습니까? 지정하지 않으면 현재 지문을 사용합니다", "Go": "선택", "Good entropy": "엔트로피가 충분합니다", "Hardware": "하드웨어", "Hex Public Key": "16진수 공개키", "Hexadecimal": "16진수", "Hide Mnemonics": "니모닉 숨기기", "High fees!": "수수료가 높습니다!", "ID already exists": "아이디가 이미 존재합니다", "Index": "인덱스", "Index: %s": "인덱스: %s", "Inputs (%d):": "Input (%d):", "Install?": "설치하시겠습니까?", "Insufficient Entropy!": "엔트로피가 충분하지 않습니다!", "Insufficient entropy": "엔트로피가 충분하지 않습니다", "Invalid Tamper Check Code": "유효하지 않은 탬퍼 체크 코드", "Invalid address": "주소가 잘못되었습니다", "Invalid bootloader": "부트로더가 잘못되었습니다", "Invalid mnemonic length": "니모닉 길이가 잘못되었습니다", "Invalid public key": "공개키가 잘못되었습니다", "Invalid wallet:": "지갑이 잘못되었습니다:", "Invert": "반전", "Inverted Colors": "반전된 색상", "Key": "키", "Key was not provided": "키가 제공되지 않았습니다", "Krux Printer Test QR": "Krux 프린터 테스트 QR", "LCD Type": "LCD 유형", "Language": "언어", "Leave blank if you'd like Krux to pick a valid final word": "마지막 단어를 Krux가 선택하도록 하려면 비워두십시오", "Left": "왼쪽", "Length: %s": "길이: %s", "Line Delay": "줄 지연", "Line:": "줄:", "Load Krux app": "Krux 앱 로드", "Load Mnemonic": "니모닉 불러오기", "Load Wallet": "이대로 불러오기", "Load a trusted wallet descriptor to view addresses?": "주소를 보기위해 신뢰할 수 있는 월렛 디스크립터를 불러오시겠습니까?", "Load from SD card": "SD카드에서 불러오기", "Load from SD card?": "SD카드에서 불러오시겠습니까?", "Load from camera": "카메라로 불러오기", "Load one?": "불러오시겠습니까?", "Load?": "불러오시겠습니까?", "Loading Camera..": "카메라를 구동 중입니다..", "Loading change addresses..": "잔돈 주소를 불러옵니다..", "Loading printer..": "프린터를 로딩 중입니다..", "Loading receive addresses..": "수신 주소 불러옵니다..", "Loading..": "로딩 중..", "Locale": "언어 설정", "Location": "기본 저장소", "Maximum length exceeded (%s)": "최대 길이를 초과함 (%s)", "Message": "메시지", "Message:": "메시지:", "Missing signature file": "서명 파일이 누락되었습니다", "Mnemonic": "니모닉", "Mnemonic ID": "니모닉 ID", "Mnemonic and passphrase will be kept.": "니모닉과 암호는 유지됩니다.", "Mnemonic was not encrypted": "니모닉이 암호화되지 않았습니다", "Modified:": "수정되었습니다:", "Multisig": "멀티시그", "Native Segwit - 84 would be assumed": "네이티브 세그윗 - BIP84를 적용합니다", "Network": "네트워크", "New Mnemonic": "새로운 니모닉", "New firmware detected.": "새로운 펌웨어가 감지되었습니다.", "No": "아니요", "No Passphrase": "패스프레이즈 없음", "Not enough rolls!": "주사위 횟수가 충분하지 않습니다!", "Numbers": "시드문구 순번", "Octal": "8진수", "Other Formats": "기타 형식", "PBKDF2 Iter.": "PBKDF2 Iter.", "Paint punched dots black so they can be detected.": "카메라가 감지할 수 있도록 펀치된 점을 검게 칠하십시오.", "Paper Width": "종이 너비", "Part": "파트", "Part Size": "파트 사이즈", "Passphrase": "패스프레이즈", "Password Length": "비밀번호 길이", "Path mismatch": "경로 불일치", "Pattern detected!": "패턴이 감지되었습니다!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "저장된 모든 니모닉 및 설정값을 영구적으로 제거하시겠습니까?", "Persist": "저장", "Pixels deviation index:": "픽셀 편차 지수:", "Plaintext QR": "일반텍스트 QR", "Please load a wallet output descriptor": "지갑 출력 디스크립터를 불러오십시오", "Plunge Rate": "침수율", "Poor entropy": "엔트로피가 부족합니다", "Poor entropy detected!": "엔트로피가 부족합니다!", "Print Test QR": "QR 테스트 인쇄", "Print Tiny Seed?": "Tiny Seed를 인쇄하시겠습니까?", "Print to QR": "QR로 인쇄", "Print to QR?": "QR로 인쇄하시겠습니까?", "Print?": "인쇄하시겠습니까?", "Printer": "프린터", "Printer Driver not set!": "프린터 드라이버가 설정되지 않았습니다!", "Printing..": "출력중", "Proceed anyway?": "계속하시겠습니까?", "Proceed?": "계속하시겠습니까?", "Processing..": "처리...", "QR Code": "QR 코드", "RX Pin": "RX 핀", "Reboot": "다시 반복", "Receive": "받기", "Receive Addresses": "주소", "Region:": "지역:", "Remove %s?": "%s을 제거하시겠습니까?", "Remove Mnemonic": "니모닉 제거", "Remove firmware files from SD Card?": "SD카드에서 펌웨어 파일을 제거하시겠습니까?", "Res. - Format": "Res. - 형식", "Restore factory settings and reboot?": "공장 설정을 복원하고 재부팅하시겠습니까?", "Return to QR Viewer": "QR 뷰어로 돌아가기", "Review scanned data, edit if necessary": "스캔된 데이터를 검토하고 필요한 경우 수정하십시오", "Right": "오른쪽", "Roll dice at least %d times to generate a mnemonic.": "니모닉을 생성하려면 주사위를 최소 %d번 굴리십시오.", "Rolls distribution:": "주사위값 분포:", "Rolls:": "주사위 횟수:", "SD card": "SD카드", "SD card not detected.": "SD카드가 감지되지 않았습니다.", "SHA256 of rolls:": "주사위의 SHA256:", "SHA256 of snapshot:": "SHA256 스냅샷:", "Save QR Image to SD Card": "QR 이미지를 SD카드에 저장", "Save to SD card": "SD카드에 저장", "Save to SD card?": "SD카드에 저장하시겠습니까?", "Saved to SD card": "SD카드에 저장됨", "Scale": "스케일", "Scan Address": "주소 스캔하기", "Scan BIP39 Passphrase": "BIP39 패스프레이즈 스캔하기", "Scan Key QR Code": "비밀번호 QR 스캔", "Scanning words 1-12 again": "1번째부터 12번째 단어를 스캔 중입니다", "Scanning words 13-24": "13번째부터 24번째 단어를 스캔 중입니다", "Screensaver Time": "화면보호기 시간", "Script Type": "지갑 형식", "Security": "보안", "Self-transfer or Change (%d):": "본인주소 전송 또는 잔돈 (%d):", "Self-transfer:": "자가 이체:", "Set a tamper check code first": "먼저 탬퍼 체크 코드를 설정하세요.", "Settings": "설정", "Settings stored internally on flash.": "설정은 플래시에서 내부적으로 저장됩니다.", "Settings stored on SD card.": "SD 카드에 저장된 설정.", "Shannon's Entropy:": "Shannon의 엔트로피:", "Shutdown": "종료", "Shutdown Time": "자동 종료시간", "Shutting down..": "종료 중..", "Sign": "서명하기", "Sign to QR code": "QR코드로 내보내기", "Sign to SD card": "SD카드로 내보내기", "Sign?": "서명하시겠습니까?", "Signature": "서명", "Signed Message": "서명된 메시지", "Signed PSBT": "서명된 PSBT", "Signing..": "서명 중..", "Single-sig": "단일서명", "Size:": "크기:", "Some checks cannot be performed.": "일부 검사를 수행할 수 없습니다.", "Spend (%d):": "Spend (%d):", "Spend:": "지출", "Stats for Nerds": "전문가를 위한 통계", "Store on Flash": "플래시 메모리에 저장", "Store on SD Card": "SD카드에 저장", "Swipe to change mode": "모드를 변경하려면 화면을 옆으로 쓸어내리세요", "TC Flash Hash": "TC Flash Hash", "TC Flash Hash at Boot": "부팅 시 플래시 탬퍼 확인 해시", "TOUCH or ENTER to capture": "터치하거나 엔터를 눌러 캡처하십시오", "TX Pin": "TX 핀", "Tamper Check Code": "탬퍼 체크 코드", "Tamper check code set successfully": "탬퍼 검사 코드가 성공적으로 설정되었습니다", "Tamper check codes do not match": "탬퍼 검사 코드가 일치하지 않습니다", "Text": "텍스트", "Theme": "테마", "Thermal": "Thermal", "To ensure data is unrecoverable use Wipe Device feature": "데이터 복구가 불가능하도록 장치 전체지우기 기능을 사용하십시오", "Toggle Brightness": "밝기 전환", "Tools": "도구", "Touch Threshold": "터치 민감도", "Touchscreen": "터치스크린", "Try more?": "더 하시겠습니까?", "Type BIP39 Passphrase": "BIP39 패스프레이즈 입력", "Type Key": "비밀번호 입력", "Unit": "단위", "Upgrade complete.": "업그레이드가 완료되었습니다", "Use a black background surface.": "검은색 배경 화면을 사용하십시오.", "Use camera's entropy to create a new mnemonic": "카메라의 엔트로피를 사용하여 새로운 니모닉을 생성하십시오", "Used:": "이미 사용됨:", "User's Data": "사용자 데이터", "Value %s out of range: [%s, %s]": "%s는 [%s, %s] 범위를 벗어났습니다", "Value must be multiple of %s": "값은 %s의 배수여야 합니다", "Verifying..": "검증 중..", "Version": "버전", "Via Camera": "카메라", "Via D20": "20면체 주사위", "Via D6": "일반 주사위", "Via Manual Input": "직접 입력", "Via Words": "니모닉 단어 입력", "Wait for the capture": "캡처될때까지 기다리십시오", "Wallet": "지갑 설정", "Wallet Descriptor": "지갑 디스크립터", "Wallet output descriptor": "지갑 출력 디스크립터", "Wallet output descriptor loaded!": "지갑 출력 디스크립터가 로드되었습니다!", "Wallet output descriptor not found.": "지갑 출력 디스크립터를 찾을 수 없습니다.", "Warning:": "경고:", "Word %d": "%d 단어", "Word Numbers": "단어 번호(1-2048)", "Words": "시드문구", "Yes": "예", "is a valid address!": "는 유효한 주소입니다!", "was NOT FOUND in the first %d addresses": "첫 번째 %d개의 주소에서 찾을 수 없습니다"} \ No newline at end of file diff --git a/i18n/translations/nl-NL.json b/i18n/translations/nl-NL.json index 4116d1d87..9c458b7fd 100644 --- a/i18n/translations/nl-NL.json +++ b/i18n/translations/nl-NL.json @@ -1,323 +1 @@ -{ - "% of the amount.": "% van het bedrag.", - "%d of %d multisig": "%d van %d multisig", - "%d to %d": "%d tot %d", - "%s removed.": "%s verwijderd.", - "(%d total)": "(%d totaal)", - "(Experimental)": "(Experimenteel)", - "(watch-only)": "(alleen inzien)", - "12 words": "12 woorden", - "24 words": "24 woorden", - "About": "Over", - "Accept assumption?": "Aanname accepteren?", - "Account": "Account", - "Account #0 would be assumed": "Account #0 zou worden aangenomen", - "Account Index": "Accountindex", - "Add or change wallet passphrase?": "Wachtwoordzin voor portemonnee toevoegen of wijzigen?", - "Additional entropy from camera required for AES-CBC mode": "Extra entropie van de camera vereist voor AES-CBC-modus", - "Address": "Adres", - "Align camera and backup plate properly.": "Richt de camera en back-upplaat op de juiste manier.", - "Allow in settings first!": "Sta eerst instellingen toe!", - "Anti-glare disabled": "Anti reflecterend uitgeschakeld", - "Anti-glare enabled": "Anti reflecterend ingeschakeld", - "Appearance": "Uiterlijk", - "Are you sure?": "Weet je het zeker?", - "BGR Colors": "BGR-kleuren", - "BIP39 Mnemonic": "BIP39 Mnemonic", - "Back": "Terug", - "Back to Menu": "Terug naar menu", - "Backup Mnemonic": "Backup geheugensteun", - "Bad signature": "Ongeldige handtekening", - "Base64 Password": "Base64-wachtwoord", - "Baudrate": "Baudratio", - "Binary Grid": "Binair raster", - "Border Padding": "Rand opvulling", - "Brightness": "Helderheid", - "Buttons": "Knoppen", - "Buttons Debounce": "Debounce van knoppen", - "Capture cancelled": "Opname geannuleerd", - "Change": "Change", - "Change Addresses": "Wisselgeldadres", - "Change theme and reboot?": "Thema veranderen en opnieuw opstarten?", - "Change:": "Wisselgeld:", - "Changes will last until shutdown.": "Wijzigingen blijven van kracht tot afsluiten.", - "Check SD Card": "Controleer SD kaart", - "Check that address belongs to this wallet?": "Controleer of dit adres bij deze portemonnee hoort?", - "Checked %d addresses with no matches.": "%d adressen gecontroleerd zonder overeenkomsten.", - "Checking for SD card..": "SD kaart controleren..", - "Confirm Tamper Check Code": "Bevestig de sabotagecontrolecode", - "Could not execute %s": "Kon ‘%s’ niet uitvoeren", - "Create QR Code": "QR code maken", - "Create QR code from text?": "QR code maken van tekst?", - "Created:": "Aangemaakt:", - "Current Tamper Check Code": "Huidige sabotagecontrolecode", - "Custom QR Code": "Aangepaste QR code", - "Customize": "Aanpassen", - "Customizing your wallet will generate a new Key.": "Bij aanpassen van de portemonnee zal er een nieuwe sleutel gegenereerd worden.", - "Cut Depth": "Snijdiepte", - "Cut Method": "Snijmethode", - "Decimal": "Decimaal", - "Decrypt?": "Ontsleutelen?", - "Default Wallet": "Standaard portemonnee", - "Depth Per Pass": "Diepte per pas", - "Derive BIP85 entropy?": "BIP85-entropie afleiden?", - "Descriptor Addresses": "Descriptoradressen", - "Display": "Weergave", - "Do not power off, it may take a while to complete.": "Schakel het apparaat niet uit, het kan even duren voordat het klaar is.", - "Done?": "Klaar?", - "Double mnemonic": "Dubbel geheugensteuntje", - "Driver": "Driver", - "Empty": "Leeg", - "Enable Krux apps": "Krux-apps inschakelen", - "Encrypted": "Versleuteld", - "Encrypted QR Code": "Versleutelde QR code", - "Encrypted mnemonic was not stored": "Versleutelde geheugensteun was niet opgeslagen", - "Encrypted mnemonic was stored with ID:": "Versleutelde geheugensteun is opgeslagen met ID:", - "Encryption": "Versleutelen", - "Encryption Mode": "Versleutel modus", - "Enter %d BIP-39 words.": "Voer %d BIP-39 woorden in.", - "Enter a 6+ characters Tamper Check Code": "Voer een sabotagecontrolecode van 6 of meer tekens in", - "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Voer elk woord van jouw BIP-39 geheugensteun in als een nummer van 1 tot 2048.", - "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Voer elk woord van jouw BIP-39 geheugensteun in als een hexadecimaal van 1 tot 800.", - "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Voer elk woord van jouw BIP-39 geheugensteun in als een octaal van 1 tot 4000.", - "Enter each word of your BIP-39 mnemonic.": "Voer elk woord van jouw BIP-39 geheugensteun in.", - "Erase User's Data": "Gegevens van gebruiker wissen", - "Erasing user's data..": "Gegevens van gebruiker wissen..", - "Error:": "Fout:", - "Esc": "Esc", - "Execute a signed Krux app?": "Een ondertekende Krux-app uitvoeren?", - "Explore files?": "Bestanden verkennen?", - "Exporting to SD card..": "Exporteren naar SD kaart..", - "Extended Public Key": "Uitgebreide publieke sleutel", - "Factory Settings": "Fabrieksinstellingen", - "Failed to decrypt": "Ontsleutelen is niet gelukt", - "Failed to load PSBT": "PSBT laden is niet gelukt", - "Failed to load address": "Adres laden is niet gelukt", - "Failed to load key": "Sleutel laden is niet gelukt", - "Failed to load message": "Bericht laden is niet gelukt", - "Failed to load mnemonic": "Geheugensteun laden is niet gelukt", - "Failed to load output descriptor": "Descriptor laden is niet gelukt", - "Failed to load passphrase": "Wachtwoord laden is niet gelukt", - "Failed to store mnemonic": "Geheugensteun opslaan is niet gelukt", - "Fee:": "Tarief:", - "Feed Rate": "Voedingssnelheid", - "Filename": "Bestandsnaam", - "Filename %s exists on SD card, overwrite?": "Bestandsnaam %s OVERSCHRIJVEN op SD kaart?", - "Fill the flash with entropy from camera?": "De flash vullen met entropie van de camera?", - "Filling Flash": "Flash vullen", - "Fingerprint unset in PSBT": "Vingerafdruk niet ingesteld in PSBT", - "Firmware exceeds max size: %d": "Firmware overschrijdt de maximale grootte: %d", - "Flash Map": "Flash Map", - "Flash Tools": "Flash Tools", - "Flash filled with camera entropy": "Flash gevuld met camera-entropie", - "Flipped X Coordinates": "Geflipte X-coördinaten", - "Flute Diameter": "Fluit diameter", - "Free:": "Vrij:", - "From Storage": "Uit data-opslag", - "Fully erase your SD card in another device to ensure data is unrecoverable": "Wis uw SD kaart volledig in een ander apparaat om te zorgen dat de gegevens onherstelbaar zijn", - "Generate Mnemonic": "Geheugensteun genereren", - "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Eigen ID gebruiken voor geheugensteun? Anders vingerafdruk gebruiken", - "Go": "Ga", - "Good entropy": "Goede entropie", - "Hardware": "Hardware", - "Hex Public Key": "Hex publieke sleutel", - "Hexadecimal": "Hexadecimaal", - "Hide Mnemonics": "Verberg geheugensteunen", - "High fees!": "Hoge kosten!", - "ID already exists": "ID bestaat al", - "Index": "Index", - "Index: %s": "Index: %s", - "Inputs (%d):": "Invoer (%d):", - "Install?": "Installeren?", - "Insufficient Entropy!": "Onvoldoende Entropie!", - "Insufficient entropy": "Onvoldoende entropie", - "Invalid Tamper Check Code": "Ongeldige sabotagecontrolecode", - "Invalid address": "Ongeldig adres", - "Invalid bootloader": "Ongeldige bootloader", - "Invalid mnemonic length": "Ongeldige geheugensteun lengte", - "Invalid public key": "Ongeldige publieke sleutel", - "Invalid wallet:": "Ongeldige portemonnee:", - "Invert": "Omkeren", - "Inverted Colors": "Omgekeerde kleuren", - "Key": "Sleutel", - "Key was not provided": "Sleutel niet verstrekt", - "Krux Printer Test QR": "Krux printer test QR", - "LCD Type": "LCD-type", - "Language": "Taal", - "Leave blank if you'd like Krux to pick a valid final word": "Laat leeg als je wilt dat Krux een geldig laatste woord kiest", - "Left": "Links", - "Length: %s": "Lengte: %s", - "Line Delay": "Lijn vertraging", - "Line:": "Lijn:", - "Load Krux app": "Krux-app laden", - "Load Mnemonic": "Geheugensteun laden", - "Load Wallet": "Portemonnee laden", - "Load a trusted wallet descriptor to view addresses?": "Een vertrouwde portemonnee descriptor laden om adressen te bekijken?", - "Load from SD card": "Laden vanaf SD kaart", - "Load from SD card?": "Laden vanaf SD kaart?", - "Load from camera": "Laden van camera", - "Load one?": "Laden?", - "Load?": "Laden?", - "Loading Camera..": "Camera laden..", - "Loading change addresses..": "Wijzigingsadressen laden..", - "Loading printer..": "Laadprinter..", - "Loading receive addresses..": "Ontvangstadressen laden..", - "Loading..": "Laden..", - "Locale": "Taal", - "Location": "Opslaglocatie", - "Maximum length exceeded (%s)": "Maximale lengte overschreden (%s)", - "Message": "Bericht", - "Message:": "Bericht:", - "Missing signature file": "Handtekening bestand mist", - "Mnemonic": "Geheugensteun", - "Mnemonic ID": "Geheugensteun ID", - "Mnemonic and passphrase will be kept.": "Geheugensteun en wachtwoord worden bewaard.", - "Mnemonic was not encrypted": "Geheugensteun is niet versleuteld", - "Modified:": "Aangepast:", - "Multisig": "Multisig", - "Native Segwit - 84 would be assumed": "Native Segwit - 84 zal worden gebruikt", - "Network": "Netwerk", - "New Mnemonic": "Geheugensteun aanmaken", - "New firmware detected.": "Nieuwe firmware gevonden.", - "No": "Nee", - "No Passphrase": "Geen wachtwoordzin", - "Not enough rolls!": "Niet genoeg gedobbeld!", - "Numbers": "Nummers", - "Octal": "Octaal", - "Other Formats": "Andere indelingen", - "PBKDF2 Iter.": "PBKDF2 iter.", - "Paint punched dots black so they can be detected.": "Maak geperforeerde stippen zwart zodat ze worden gedetecteerd.", - "Paper Width": "Papier breedte", - "Part": "Deel", - "Part Size": "Deel grootte", - "Passphrase": "Wachtwoord", - "Password Length": "Wachtwoordlengte:", - "Path mismatch": "Pad komt niet overeen", - "Pattern detected!": "Patroon gevonden!", - "Permanently remove all stored encrypted mnemonics and settings from flash?": "Alle opgeslagen versleutelde mnemonics en instellingen permanent uit het flashgeheugen verwijderen?", - "Persist": "Opslag", - "Pixels deviation index:": "Pixelafwijkingsindex:", - "Plaintext QR": "Platte tekst QR", - "Please load a wallet output descriptor": "Laadt een portemonnee descriptor in", - "Plunge Rate": "Duik tarief", - "Poor entropy": "Slechte entropie", - "Poor entropy detected!": "Lage entropie gedetecteerd!", - "Print Test QR": "Test QR afdrukken", - "Print Tiny Seed?": "Tiny Seed afdrukken?", - "Print to QR": "Afdrukken naar QR", - "Print to QR?": "Afdrukken naar QR?", - "Print?": "Afdrukken?", - "Printer": "Printer", - "Printer Driver not set!": "Printer driver niet ingesteld!", - "Printing..": "Afdrukken..", - "Proceed anyway?": "Toch doorgaan?", - "Proceed?": "Doorgaan?", - "Processing..": "Verwerken..", - "QR Code": "QR code", - "RX Pin": "RX pin", - "Reboot": "Opnieuw opstarten", - "Receive": "Ontvangen", - "Receive Addresses": "Ontvangstadres", - "Region:": "Regio:", - "Remove %s?": "Verwijderen %s?", - "Remove Mnemonic": "Geheugensteun verwijderen", - "Remove firmware files from SD Card?": "Firmwarebestanden van SD kaart verwijderen?", - "Res. - Format": "Res. - Formaat", - "Restore factory settings and reboot?": "Fabrieksinstellingen herstellen en opnieuw opstarten?", - "Return to QR Viewer": "Terug naar QR-lezer", - "Review scanned data, edit if necessary": "Controleer gescande gegevens en bewerk indien nodig", - "Right": "Rechts", - "Roll dice at least %d times to generate a mnemonic.": "Dobbel een dobbelsteen minstens %d keer voor het genereren van een geheugensteun.", - "Rolls distribution:": "Roldistributie:", - "Rolls:": "Gedobbeld:", - "SD card": "SD kaart", - "SD card not detected.": "SD kaart niet gedetecteerd.", - "SHA256 of rolls:": "Gedobbelde SHA256:", - "SHA256 of snapshot:": "Momentopname van SHA256:", - "Save QR Image to SD Card": "QR-afbeelding opslaan op SD kaart", - "Save to SD card": "Opslaan op SD kaart", - "Save to SD card?": "Opslaan op SD kaart?", - "Saved to SD card": "Opgeslagen op SD kaart", - "Scale": "Schaal", - "Scan Address": "Adres scannen", - "Scan BIP39 Passphrase": "BIP-39 Wachtwoord Scannen", - "Scan Key QR Code": "QR Code Sleutel Scannen", - "Scanning words 1-12 again": "Woorden 1 t/m 12 opnieuw scannen", - "Scanning words 13-24": "Woorden 13 t/m 24 scannen", - "Screensaver Time": "Schermbeveiligingstijd", - "Script Type": "Scripttype", - "Security": "Beveiliging", - "Self-transfer or Change (%d):": "Overschrijving naar jezelf, of wisselgeld (%d):", - "Self-transfer:": "Zelf overschrijving:", - "Set a tamper check code first": "Stel eerst een sabotagecontrolecode in", - "Settings": "Instellingen", - "Settings stored internally on flash.": "Instellingen intern opgeslagen op flitser.", - "Settings stored on SD card.": "Instellingen opgeslagen op SD kaart.", - "Shannon's Entropy:": "Shannon's entropie:", - "Shutdown": "Afsluiten", - "Shutdown Time": "Uitschakelingstijd:", - "Shutting down..": "Bezig met afsluiten..", - "Sign": "Ondertekenen", - "Sign to QR code": "Teken op QR-code", - "Sign to SD card": "Teken op SD kaart", - "Sign?": "Ondertekenen?", - "Signature": "Handtekening", - "Signed Message": "Bericht ondertekend", - "Signed PSBT": "PSBT ondertekend", - "Signing..": "Ondertekenen..", - "Single-sig": "Enkele sleutel", - "Size:": "Grootte:", - "Some checks cannot be performed.": "Sommige controles kunnen niet worden uitgevoerd.", - "Spend (%d):": "Uitgaven (%d):", - "Spend:": "Uitgaven:", - "Stats for Nerds": "Statistieken voor nerds", - "Store on Flash": "Opslaan op apparaat", - "Store on SD Card": "Opslaan op SD kaart", - "Swipe to change mode": "Verander modus", - "TC Flash Hash": "TC Flash Hash", - "TC Flash Hash at Boot": "Hash Flash bij het opstarten", - "TOUCH or ENTER to capture": "TIK of ENTER voor opname", - "TX Pin": "TX pin", - "Tamper Check Code": "Sabotagecontrolecode", - "Tamper check code set successfully": "Sabotagecontrolecode succesvol ingesteld", - "Tamper check codes do not match": "Sabotagecontrolecodes komen niet overeen", - "Text": "Tekst", - "Theme": "Thema", - "Thermal": "Thermisch", - "To ensure data is unrecoverable use Wipe Device feature": "Gebruik de functie 'Apparaat wissen' om te zorgen dat de gegevens onherstelbaar zijn", - "Toggle Brightness": "Helderheid schakelen", - "Tools": "Hulpmiddelen", - "Touch Threshold": "Aanraak gevoeligheid", - "Touchscreen": "Aanraakscherm", - "Try more?": "Meer proberen?", - "Type BIP39 Passphrase": "Voer een BIP-39 wachtwoord in", - "Type Key": "Voer sleutel in", - "Unit": "Eenheid", - "Upgrade complete.": "Upgrade afgerond.", - "Use a black background surface.": "Gebruik een donker achergrond.", - "Use camera's entropy to create a new mnemonic": "Gebruik de camera als entropie voor het aanmaken van een nieuwe geheugensteun", - "Used:": "Gebruikt:", - "User's Data": "Gebruiker", - "Value %s out of range: [%s, %s]": "Waarde %s is buiten bereik: [%s, %s]", - "Value must be multiple of %s": "Waarde moet meerdere van %s zijn", - "Verifying..": "Bezig met verifiëren..", - "Version": "Versie", - "Via Camera": "Via camera", - "Via D20": "Via D20", - "Via D6": "Via D6", - "Via Manual Input": "Via handmatige invoer", - "Via Words": "Via woorden", - "Wait for the capture": "Wacht op opname", - "Wallet": "Portemonnee", - "Wallet Descriptor": "Descriptor", - "Wallet output descriptor": "Portemonnee descriptor", - "Wallet output descriptor loaded!": "Portemonnee descriptor geladen!", - "Wallet output descriptor not found.": "Portemonnee descriptor niet gevonden.", - "Warning:": "Waarschuwing:", - "Word %d": "Woord %d", - "Word Numbers": "Woord nummers", - "Words": "Woorden", - "Yes": "Yes", - "is a valid address!": "is geen geldig adres", - "was NOT FOUND in the first %d addresses": "werd NIET GEVONDEN in de eerste %d adressen" -} \ No newline at end of file +{"% of the amount.": "% van het bedrag.", "%d of %d multisig": "%d van %d multisig", "%d to %d": "%d tot %d", "%s removed.": "%s verwijderd.", "(%d total)": "(%d totaal)", "(Experimental)": "(Experimenteel)", "(watch-only)": "(alleen inzien)", "12 words": "12 woorden", "24 words": "24 woorden", "About": "Over", "Accept assumption?": "Aanname accepteren?", "Account": "Account", "Account #0 would be assumed": "Account #0 zou worden aangenomen", "Account Index": "Accountindex", "Add or change wallet passphrase?": "Wachtwoordzin voor portemonnee toevoegen of wijzigen?", "Additional entropy from camera required for AES-CBC mode": "Extra entropie van de camera vereist voor AES-CBC-modus", "Address": "Adres", "Align camera and backup plate properly.": "Richt de camera en back-upplaat op de juiste manier.", "Allow in settings first!": "Sta eerst instellingen toe!", "Anti-glare disabled": "Anti reflecterend uitgeschakeld", "Anti-glare enabled": "Anti reflecterend ingeschakeld", "Appearance": "Uiterlijk", "Are you sure?": "Weet je het zeker?", "BGR Colors": "BGR-kleuren", "BIP39 Mnemonic": "BIP39 Mnemonic", "Back": "Terug", "Back to Menu": "Terug naar menu", "Backup Mnemonic": "Backup geheugensteun", "Bad signature": "Ongeldige handtekening", "Base64 Password": "Base64-wachtwoord", "Baudrate": "Baudratio", "Binary Grid": "Binair raster", "Border Padding": "Rand opvulling", "Brightness": "Helderheid", "Buttons": "Knoppen", "Buttons Debounce": "Debounce van knoppen", "Capture cancelled": "Opname geannuleerd", "Change": "Change", "Change Addresses": "Wisselgeldadres", "Change theme and reboot?": "Thema veranderen en opnieuw opstarten?", "Change:": "Wisselgeld:", "Changes will last until shutdown.": "Wijzigingen blijven van kracht tot afsluiten.", "Check SD Card": "Controleer SD kaart", "Check that address belongs to this wallet?": "Controleer of dit adres bij deze portemonnee hoort?", "Checked %d addresses with no matches.": "%d adressen gecontroleerd zonder overeenkomsten.", "Checking for SD card..": "SD kaart controleren..", "Confirm Tamper Check Code": "Bevestig de sabotagecontrolecode", "Create QR Code": "QR code maken", "Create QR code from text?": "QR code maken van tekst?", "Created:": "Aangemaakt:", "Current Tamper Check Code": "Huidige sabotagecontrolecode", "Custom QR Code": "Aangepaste QR code", "Customize": "Aanpassen", "Customizing your wallet will generate a new Key.": "Bij aanpassen van de portemonnee zal er een nieuwe sleutel gegenereerd worden.", "Cut Depth": "Snijdiepte", "Cut Method": "Snijmethode", "Decimal": "Decimaal", "Decrypt?": "Ontsleutelen?", "Default Wallet": "Standaard portemonnee", "Depth Per Pass": "Diepte per pas", "Derive BIP85 entropy?": "BIP85-entropie afleiden?", "Descriptor Addresses": "Descriptoradressen", "Display": "Weergave", "Do not power off, it may take a while to complete.": "Schakel het apparaat niet uit, het kan even duren voordat het klaar is.", "Done?": "Klaar?", "Double mnemonic": "Dubbel geheugensteuntje", "Driver": "Driver", "Empty": "Leeg", "Enable Krux apps": "Krux-apps inschakelen", "Encrypted": "Versleuteld", "Encrypted QR Code": "Versleutelde QR code", "Encrypted mnemonic was not stored": "Versleutelde geheugensteun was niet opgeslagen", "Encrypted mnemonic was stored with ID:": "Versleutelde geheugensteun is opgeslagen met ID:", "Encryption": "Versleutelen", "Encryption Mode": "Versleutel modus", "Enter %d BIP-39 words.": "Voer %d BIP-39 woorden in.", "Enter a 6+ characters Tamper Check Code": "Voer een sabotagecontrolecode van 6 of meer tekens in", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Voer elk woord van jouw BIP-39 geheugensteun in als een nummer van 1 tot 2048.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Voer elk woord van jouw BIP-39 geheugensteun in als een hexadecimaal van 1 tot 800.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Voer elk woord van jouw BIP-39 geheugensteun in als een octaal van 1 tot 4000.", "Enter each word of your BIP-39 mnemonic.": "Voer elk woord van jouw BIP-39 geheugensteun in.", "Erase User's Data": "Gegevens van gebruiker wissen", "Erasing user's data..": "Gegevens van gebruiker wissen..", "Error:": "Fout:", "Esc": "Esc", "Execute a signed Krux app?": "Een ondertekende Krux-app uitvoeren?", "Explore files?": "Bestanden verkennen?", "Exporting to SD card..": "Exporteren naar SD kaart..", "Extended Public Key": "Uitgebreide publieke sleutel", "Factory Settings": "Fabrieksinstellingen", "Failed to decrypt": "Ontsleutelen is niet gelukt", "Failed to load PSBT": "PSBT laden is niet gelukt", "Failed to load address": "Adres laden is niet gelukt", "Failed to load key": "Sleutel laden is niet gelukt", "Failed to load message": "Bericht laden is niet gelukt", "Failed to load mnemonic": "Geheugensteun laden is niet gelukt", "Failed to load output descriptor": "Descriptor laden is niet gelukt", "Failed to load passphrase": "Wachtwoord laden is niet gelukt", "Failed to store mnemonic": "Geheugensteun opslaan is niet gelukt", "Fee:": "Tarief:", "Feed Rate": "Voedingssnelheid", "Filename": "Bestandsnaam", "Filename %s exists on SD card, overwrite?": "Bestandsnaam %s OVERSCHRIJVEN op SD kaart?", "Fill the flash with entropy from camera?": "De flash vullen met entropie van de camera?", "Filling Flash": "Flash vullen", "Fingerprint unset in PSBT": "Vingerafdruk niet ingesteld in PSBT", "Firmware exceeds max size: %d": "Firmware overschrijdt de maximale grootte: %d", "Flash Map": "Flash Map", "Flash Tools": "Flash Tools", "Flash filled with camera entropy": "Flash gevuld met camera-entropie", "Flipped X Coordinates": "Geflipte X-coördinaten", "Flute Diameter": "Fluit diameter", "Free:": "Vrij:", "From Storage": "Uit data-opslag", "Fully erase your SD card in another device to ensure data is unrecoverable": "Wis uw SD kaart volledig in een ander apparaat om te zorgen dat de gegevens onherstelbaar zijn", "Generate Mnemonic": "Geheugensteun genereren", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Eigen ID gebruiken voor geheugensteun? Anders vingerafdruk gebruiken", "Go": "Ga", "Good entropy": "Goede entropie", "Hardware": "Hardware", "Hex Public Key": "Hex publieke sleutel", "Hexadecimal": "Hexadecimaal", "Hide Mnemonics": "Verberg geheugensteunen", "High fees!": "Hoge kosten!", "ID already exists": "ID bestaat al", "Index": "Index", "Index: %s": "Index: %s", "Inputs (%d):": "Invoer (%d):", "Install?": "Installeren?", "Insufficient Entropy!": "Onvoldoende Entropie!", "Insufficient entropy": "Onvoldoende entropie", "Invalid Tamper Check Code": "Ongeldige sabotagecontrolecode", "Invalid address": "Ongeldig adres", "Invalid bootloader": "Ongeldige bootloader", "Invalid mnemonic length": "Ongeldige geheugensteun lengte", "Invalid public key": "Ongeldige publieke sleutel", "Invalid wallet:": "Ongeldige portemonnee:", "Invert": "Omkeren", "Inverted Colors": "Omgekeerde kleuren", "Key": "Sleutel", "Key was not provided": "Sleutel niet verstrekt", "Krux Printer Test QR": "Krux printer test QR", "LCD Type": "LCD-type", "Language": "Taal", "Leave blank if you'd like Krux to pick a valid final word": "Laat leeg als je wilt dat Krux een geldig laatste woord kiest", "Left": "Links", "Length: %s": "Lengte: %s", "Line Delay": "Lijn vertraging", "Line:": "Lijn:", "Load Krux app": "Krux-app laden", "Load Mnemonic": "Geheugensteun laden", "Load Wallet": "Portemonnee laden", "Load a trusted wallet descriptor to view addresses?": "Een vertrouwde portemonnee descriptor laden om adressen te bekijken?", "Load from SD card": "Laden vanaf SD kaart", "Load from SD card?": "Laden vanaf SD kaart?", "Load from camera": "Laden van camera", "Load one?": "Laden?", "Load?": "Laden?", "Loading Camera..": "Camera laden..", "Loading change addresses..": "Wijzigingsadressen laden..", "Loading printer..": "Laadprinter..", "Loading receive addresses..": "Ontvangstadressen laden..", "Loading..": "Laden..", "Locale": "Taal", "Location": "Opslaglocatie", "Maximum length exceeded (%s)": "Maximale lengte overschreden (%s)", "Message": "Bericht", "Message:": "Bericht:", "Missing signature file": "Handtekening bestand mist", "Mnemonic": "Geheugensteun", "Mnemonic ID": "Geheugensteun ID", "Mnemonic and passphrase will be kept.": "Geheugensteun en wachtwoord worden bewaard.", "Mnemonic was not encrypted": "Geheugensteun is niet versleuteld", "Modified:": "Aangepast:", "Multisig": "Multisig", "Native Segwit - 84 would be assumed": "Native Segwit - 84 zal worden gebruikt", "Network": "Netwerk", "New Mnemonic": "Geheugensteun aanmaken", "New firmware detected.": "Nieuwe firmware gevonden.", "No": "Nee", "No Passphrase": "Geen wachtwoordzin", "Not enough rolls!": "Niet genoeg gedobbeld!", "Numbers": "Nummers", "Octal": "Octaal", "Other Formats": "Andere indelingen", "PBKDF2 Iter.": "PBKDF2 iter.", "Paint punched dots black so they can be detected.": "Maak geperforeerde stippen zwart zodat ze worden gedetecteerd.", "Paper Width": "Papier breedte", "Part": "Deel", "Part Size": "Deel grootte", "Passphrase": "Wachtwoord", "Password Length": "Wachtwoordlengte:", "Path mismatch": "Pad komt niet overeen", "Pattern detected!": "Patroon gevonden!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "Alle opgeslagen versleutelde mnemonics en instellingen permanent uit het flashgeheugen verwijderen?", "Persist": "Opslag", "Pixels deviation index:": "Pixelafwijkingsindex:", "Plaintext QR": "Platte tekst QR", "Please load a wallet output descriptor": "Laadt een portemonnee descriptor in", "Plunge Rate": "Duik tarief", "Poor entropy": "Slechte entropie", "Poor entropy detected!": "Lage entropie gedetecteerd!", "Print Test QR": "Test QR afdrukken", "Print Tiny Seed?": "Tiny Seed afdrukken?", "Print to QR": "Afdrukken naar QR", "Print to QR?": "Afdrukken naar QR?", "Print?": "Afdrukken?", "Printer": "Printer", "Printer Driver not set!": "Printer driver niet ingesteld!", "Printing..": "Afdrukken..", "Proceed anyway?": "Toch doorgaan?", "Proceed?": "Doorgaan?", "Processing..": "Verwerken..", "QR Code": "QR code", "RX Pin": "RX pin", "Reboot": "Opnieuw opstarten", "Receive": "Ontvangen", "Receive Addresses": "Ontvangstadres", "Region:": "Regio:", "Remove %s?": "Verwijderen %s?", "Remove Mnemonic": "Geheugensteun verwijderen", "Remove firmware files from SD Card?": "Firmwarebestanden van SD kaart verwijderen?", "Res. - Format": "Res. - Formaat", "Restore factory settings and reboot?": "Fabrieksinstellingen herstellen en opnieuw opstarten?", "Return to QR Viewer": "Terug naar QR-lezer", "Review scanned data, edit if necessary": "Controleer gescande gegevens en bewerk indien nodig", "Right": "Rechts", "Roll dice at least %d times to generate a mnemonic.": "Dobbel een dobbelsteen minstens %d keer voor het genereren van een geheugensteun.", "Rolls distribution:": "Roldistributie:", "Rolls:": "Gedobbeld:", "SD card": "SD kaart", "SD card not detected.": "SD kaart niet gedetecteerd.", "SHA256 of rolls:": "Gedobbelde SHA256:", "SHA256 of snapshot:": "Momentopname van SHA256:", "Save QR Image to SD Card": "QR-afbeelding opslaan op SD kaart", "Save to SD card": "Opslaan op SD kaart", "Save to SD card?": "Opslaan op SD kaart?", "Saved to SD card": "Opgeslagen op SD kaart", "Scale": "Schaal", "Scan Address": "Adres scannen", "Scan BIP39 Passphrase": "BIP-39 Wachtwoord Scannen", "Scan Key QR Code": "QR Code Sleutel Scannen", "Scanning words 1-12 again": "Woorden 1 t/m 12 opnieuw scannen", "Scanning words 13-24": "Woorden 13 t/m 24 scannen", "Screensaver Time": "Schermbeveiligingstijd", "Script Type": "Scripttype", "Security": "Beveiliging", "Self-transfer or Change (%d):": "Overschrijving naar jezelf, of wisselgeld (%d):", "Self-transfer:": "Zelf overschrijving:", "Set a tamper check code first": "Stel eerst een sabotagecontrolecode in", "Settings": "Instellingen", "Settings stored internally on flash.": "Instellingen intern opgeslagen op flitser.", "Settings stored on SD card.": "Instellingen opgeslagen op SD kaart.", "Shannon's Entropy:": "Shannon's entropie:", "Shutdown": "Afsluiten", "Shutdown Time": "Uitschakelingstijd:", "Shutting down..": "Bezig met afsluiten..", "Sign": "Ondertekenen", "Sign to QR code": "Teken op QR-code", "Sign to SD card": "Teken op SD kaart", "Sign?": "Ondertekenen?", "Signature": "Handtekening", "Signed Message": "Bericht ondertekend", "Signed PSBT": "PSBT ondertekend", "Signing..": "Ondertekenen..", "Single-sig": "Enkele sleutel", "Size:": "Grootte:", "Some checks cannot be performed.": "Sommige controles kunnen niet worden uitgevoerd.", "Spend (%d):": "Uitgaven (%d):", "Spend:": "Uitgaven:", "Stats for Nerds": "Statistieken voor nerds", "Store on Flash": "Opslaan op apparaat", "Store on SD Card": "Opslaan op SD kaart", "Swipe to change mode": "Verander modus", "TC Flash Hash": "TC Flash Hash", "TC Flash Hash at Boot": "Hash Flash bij het opstarten", "TOUCH or ENTER to capture": "TIK of ENTER voor opname", "TX Pin": "TX pin", "Tamper Check Code": "Sabotagecontrolecode", "Tamper check code set successfully": "Sabotagecontrolecode succesvol ingesteld", "Tamper check codes do not match": "Sabotagecontrolecodes komen niet overeen", "Text": "Tekst", "Theme": "Thema", "Thermal": "Thermisch", "To ensure data is unrecoverable use Wipe Device feature": "Gebruik de functie 'Apparaat wissen' om te zorgen dat de gegevens onherstelbaar zijn", "Toggle Brightness": "Helderheid schakelen", "Tools": "Hulpmiddelen", "Touch Threshold": "Aanraak gevoeligheid", "Touchscreen": "Aanraakscherm", "Try more?": "Meer proberen?", "Type BIP39 Passphrase": "Voer een BIP-39 wachtwoord in", "Type Key": "Voer sleutel in", "Unit": "Eenheid", "Upgrade complete.": "Upgrade afgerond.", "Use a black background surface.": "Gebruik een donker achergrond.", "Use camera's entropy to create a new mnemonic": "Gebruik de camera als entropie voor het aanmaken van een nieuwe geheugensteun", "Used:": "Gebruikt:", "User's Data": "Gebruiker", "Value %s out of range: [%s, %s]": "Waarde %s is buiten bereik: [%s, %s]", "Value must be multiple of %s": "Waarde moet meerdere van %s zijn", "Verifying..": "Bezig met verifiëren..", "Version": "Versie", "Via Camera": "Via camera", "Via D20": "Via D20", "Via D6": "Via D6", "Via Manual Input": "Via handmatige invoer", "Via Words": "Via woorden", "Wait for the capture": "Wacht op opname", "Wallet": "Portemonnee", "Wallet Descriptor": "Descriptor", "Wallet output descriptor": "Portemonnee descriptor", "Wallet output descriptor loaded!": "Portemonnee descriptor geladen!", "Wallet output descriptor not found.": "Portemonnee descriptor niet gevonden.", "Warning:": "Waarschuwing:", "Word %d": "Woord %d", "Word Numbers": "Woord nummers", "Words": "Woorden", "Yes": "Yes", "is a valid address!": "is geen geldig adres", "was NOT FOUND in the first %d addresses": "werd NIET GEVONDEN in de eerste %d adressen"} \ No newline at end of file diff --git a/i18n/translations/pt-BR.json b/i18n/translations/pt-BR.json index 5e2552af4..37c656025 100644 --- a/i18n/translations/pt-BR.json +++ b/i18n/translations/pt-BR.json @@ -1,323 +1 @@ -{ - "% of the amount.": "% do valor.", - "%d of %d multisig": "%d da %d multisig", - "%d to %d": "%d a %d", - "%s removed.": "%s removido.", - "(%d total)": "(%d total)", - "(Experimental)": "(Experimental)", - "(watch-only)": "(Somente visualização)", - "12 words": "12 palavras", - "24 words": "24 palavras", - "About": "Sobre", - "Accept assumption?": "Aceitar suposições?", - "Account": "Conta", - "Account #0 would be assumed": "A conta #0 seria assumida", - "Account Index": "Índice da Conta", - "Add or change wallet passphrase?": "Adicionar ou alterar senha da carteira?", - "Additional entropy from camera required for AES-CBC mode": "Entropia adicional da câmera necessária para o modo AES-CBC", - "Address": "Endereço", - "Align camera and backup plate properly.": "Alinhe a câmera e a placa de backup corretamente.", - "Allow in settings first!": "Permita nas configurações primeiro!", - "Anti-glare disabled": "Antirreflexo desativado", - "Anti-glare enabled": "Antirreflexo ativado", - "Appearance": "Aparência", - "Are you sure?": "Tem certeza?", - "BGR Colors": "Cores BGR", - "BIP39 Mnemonic": "Mnemônico BIP39", - "Back": "Voltar", - "Back to Menu": "Voltar ao Menu", - "Backup Mnemonic": "Backup de Mnemônico", - "Bad signature": "Assinatura Inválida", - "Base64 Password": "Senha Base64", - "Baudrate": "Baudrate", - "Binary Grid": "Grade binária", - "Border Padding": "Borda", - "Brightness": "Brilho", - "Buttons": "Botões", - "Buttons Debounce": "Debounce dos Botões", - "Capture cancelled": "Captura cancelada", - "Change": "Troco", - "Change Addresses": "Endereços de Troco", - "Change theme and reboot?": "Mudar o tema e reiniciar?", - "Change:": "Troco:", - "Changes will last until shutdown.": "Alterações só durarão até o desligamento.", - "Check SD Card": "Verifique o cartão SD", - "Check that address belongs to this wallet?": "Verificar se este endereço pertence a carteira?", - "Checked %d addresses with no matches.": "Verificado %d endereços sem correspondências.", - "Checking for SD card..": "Verificando o cartão SD..", - "Confirm Tamper Check Code": "Confirmar Código", - "Could not execute %s": "Não foi possível executar %s", - "Create QR Code": "Gerar Código QR", - "Create QR code from text?": "Gerar código QR do texto?", - "Created:": "Criado:", - "Current Tamper Check Code": "Código Atual", - "Custom QR Code": "Código QR Customizado", - "Customize": "Customizar", - "Customizing your wallet will generate a new Key.": "Personalizar sua carteira gerará uma nova chave.", - "Cut Depth": "Profundidade de Corte", - "Cut Method": "Método de Corte", - "Decimal": "Decimal", - "Decrypt?": "Descriptografar?", - "Default Wallet": "Carteira Padrão", - "Depth Per Pass": "Profundidade da Passagem", - "Derive BIP85 entropy?": "Derivar entropia BIP85?", - "Descriptor Addresses": "Endereços do Descritor", - "Display": "Display", - "Do not power off, it may take a while to complete.": "Não desligue, pode demorar um pouco para concluir.", - "Done?": "Feito?", - "Double mnemonic": "Duplo mnemônico", - "Driver": "Driver", - "Empty": "Vazio", - "Enable Krux apps": "Ativar Krux app", - "Encrypted": "Criptografado", - "Encrypted QR Code": "Código QR Criptografado", - "Encrypted mnemonic was not stored": "Mnemonic criptografado não foi armazenado", - "Encrypted mnemonic was stored with ID:": "Mnemônico criptografado foi armazenado com ID:", - "Encryption": "Criptografia", - "Encryption Mode": "Modo de Criptografia", - "Enter %d BIP-39 words.": "Insira %d palavras BIP-39.", - "Enter a 6+ characters Tamper Check Code": "Insira um código de verificação com mais de 6 caracteres", - "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Digite o número de cada palavra do seu mnemônico BIP-39, de 1 a 2048.", - "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Digite o número de cada palavra do seu mnemônico BIP-39 como um número em hexadecimal, de 1 a 800.", - "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Digite o número de cada palavra do seu mnemônico BIP-39 como um número em octal, de 1 a 4000.", - "Enter each word of your BIP-39 mnemonic.": "Digite cada palavra do seu mnemônico BIP-39.", - "Erase User's Data": "Apagar Dados do Usuário", - "Erasing user's data..": "Apagando os dados do usuário..", - "Error:": "Erro:", - "Esc": "Esc", - "Execute a signed Krux app?": "Executar um Krux app assinado?", - "Explore files?": "Explorar arquivos?", - "Exporting to SD card..": "Exportando para o cartão SD..", - "Extended Public Key": "Chave Pública Estendida", - "Factory Settings": "Configurações de Fábrica", - "Failed to decrypt": "Falhou em descriptografar", - "Failed to load PSBT": "Falhou ao carregar PSBT", - "Failed to load address": "Falhou ao carregar endereço", - "Failed to load key": "Falha ao carregar a chave", - "Failed to load message": "Falhou ao carregar mensagem", - "Failed to load mnemonic": "Falhou ao carregar mnemônico", - "Failed to load output descriptor": "Falha ao carregar o descritor de saída", - "Failed to load passphrase": "Falha ao carregar a senha", - "Failed to store mnemonic": "Falhou ao armazenar mnemônico", - "Fee:": "Taxa:", - "Feed Rate": "Taxa de Alimentação", - "Filename": "Nome do arquivo", - "Filename %s exists on SD card, overwrite?": "O nome do arquivo %s existe no cartão SD, substituir?", - "Fill the flash with entropy from camera?": "Preencher a flash com entropia da câmera?", - "Filling Flash": "Preenchendo a Flash", - "Fingerprint unset in PSBT": "Impressão digital não definida no PSBT", - "Firmware exceeds max size: %d": "Firmware excede o tamanho máximo: %d", - "Flash Map": "Mapa da Flash", - "Flash Tools": "Ferramentas da Flash", - "Flash filled with camera entropy": "Flash preenchida com entropia da câmera", - "Flipped X Coordinates": "Coordenadas X invertidas", - "Flute Diameter": "Diâmetro da Fresa", - "Free:": "Livre:", - "From Storage": "Do Armazenamento", - "Fully erase your SD card in another device to ensure data is unrecoverable": "Apague totalmente seu cartão SD em outro dispositivo para garantir que os dados sejam irrecuperáveis", - "Generate Mnemonic": "Gerar Mnemônico", - "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Dê a este mnemônico um ID personalizado? Caso contrário, a impressão digital atual será usada", - "Go": "Ir", - "Good entropy": "Boa entropia", - "Hardware": "Hardware", - "Hex Public Key": "Chave pública hexadecimal", - "Hexadecimal": "Hexadecimal", - "Hide Mnemonics": "Ocultar Mnemônicos", - "High fees!": "Taxas altas!", - "ID already exists": "Id já existe", - "Index": "Índice", - "Index: %s": "Índice: %s", - "Inputs (%d):": "Entradas (%d):", - "Install?": "Instalar?", - "Insufficient Entropy!": "Entropia insuficiente!", - "Insufficient entropy": "Entropia insuficiente", - "Invalid Tamper Check Code": "Código de verificação inválido", - "Invalid address": "Endereço inválido", - "Invalid bootloader": "Bootloader inválido", - "Invalid mnemonic length": "Comprimento de mnemônico inválido", - "Invalid public key": "Chave pública inválida", - "Invalid wallet:": "Carteira inválida:", - "Invert": "Invertido", - "Inverted Colors": "Cores invertidas", - "Key": "Chave", - "Key was not provided": "A chave não foi fornecida", - "Krux Printer Test QR": "Teste de impressão de QR krux", - "LCD Type": "Tipo de LCD", - "Language": "Língua", - "Leave blank if you'd like Krux to pick a valid final word": "Deixe em branco se quiser que o Krux escolha uma palavra final válida", - "Left": "Esquerda", - "Length: %s": "Comprimento: %s", - "Line Delay": "Atraso de Linha", - "Line:": "Linha:", - "Load Krux app": "Carregar Krux app", - "Load Mnemonic": "Carregar Mnemônico", - "Load Wallet": "Carregar Carteira", - "Load a trusted wallet descriptor to view addresses?": "Carregar um descritor de carteira confiável para visualizar endereços?", - "Load from SD card": "Carregar do cartão SD", - "Load from SD card?": "Carregar do cartão SD?", - "Load from camera": "Carregar da câmera", - "Load one?": "Carregar um?", - "Load?": "Carregar?", - "Loading Camera..": "Carregando Câmera..", - "Loading change addresses..": "Carregando endereços de troco..", - "Loading printer..": "Carregando impressora..", - "Loading receive addresses..": "Carregando endereços de recebimento..", - "Loading..": "Carregando..", - "Locale": "Idioma", - "Location": "Local", - "Maximum length exceeded (%s)": "Comprimento máximo excedido (%s)", - "Message": "Mensagem", - "Message:": "Mensagem:", - "Missing signature file": "Arquivo de assinatura faltando", - "Mnemonic": "Mnemônico", - "Mnemonic ID": "ID do mnemônico", - "Mnemonic and passphrase will be kept.": "Mnemônico e senha serão mantidos.", - "Mnemonic was not encrypted": "Mnemônico não foi criptografado", - "Modified:": "Modificado:", - "Multisig": "Multisig", - "Native Segwit - 84 would be assumed": "Segwit nativo - 84 seria assumido", - "Network": "Rede", - "New Mnemonic": "Novo Mnemônico", - "New firmware detected.": "Novo firmware detectado.", - "No": "Não", - "No Passphrase": "Sem Senha", - "Not enough rolls!": "Jogadas insuficientes!", - "Numbers": "Números", - "Octal": "Octal", - "Other Formats": "Outros Formatos", - "PBKDF2 Iter.": "Iter. PBKDF2", - "Paint punched dots black so they can be detected.": "Pinte os pontos perfurados de preto para que possam ser detectados.", - "Paper Width": "Largura do papel", - "Part": "Parte", - "Part Size": "Tamanho da peça", - "Passphrase": "Senha", - "Password Length": "Comprimento da Senha", - "Path mismatch": "Incompatibilidade de caminho", - "Pattern detected!": "Padrão detectado!", - "Permanently remove all stored encrypted mnemonics and settings from flash?": "Remover permanentemente todos os mnemônicos criptografados e configurações armazenados da memória flash?", - "Persist": "Salvar", - "Pixels deviation index:": "Índice de desvio de pixels:", - "Plaintext QR": "QR em Texto", - "Please load a wallet output descriptor": "Carregue um descritor da carteira", - "Plunge Rate": "Taxa de Mergulho", - "Poor entropy": "Entropia fraca", - "Poor entropy detected!": "Baixa entropia detectada!", - "Print Test QR": "Imprimir QR de teste", - "Print Tiny Seed?": "Imprimir Tiny Seed?", - "Print to QR": "Imprimir QR", - "Print to QR?": "Imprimir QR?", - "Print?": "Imprimir?", - "Printer": "Impressora", - "Printer Driver not set!": "Driver de impressora não está definido!", - "Printing..": "Imprimindo..", - "Proceed anyway?": "Continuar mesmo assim?", - "Proceed?": "Seguir?", - "Processing..": "Processando..", - "QR Code": "Código QR", - "RX Pin": "Pino RX", - "Reboot": "Reiniciar", - "Receive": "Recebimento", - "Receive Addresses": "Endereços de Recebimento", - "Region:": "Região:", - "Remove %s?": "Excluir %s?", - "Remove Mnemonic": "Excluir Mnemônico", - "Remove firmware files from SD Card?": "Remover arquivos de firmware do cartão SD?", - "Res. - Format": "Res. - Formato", - "Restore factory settings and reboot?": "Restaurar as configurações de fábrica e reiniciar?", - "Return to QR Viewer": "Retornar ao Visualizador de QR", - "Review scanned data, edit if necessary": "Revise os dados, edite se necessário", - "Right": "Direita", - "Roll dice at least %d times to generate a mnemonic.": "Role o dado pelo menos %d vezes para gerar um mnemônico.", - "Rolls distribution:": "Distribuição de jogadas:", - "Rolls:": "Jogadas:", - "SD card": "Cartão SD", - "SD card not detected.": "Cartão SD não detectado.", - "SHA256 of rolls:": "SHA256 de jogadas:", - "SHA256 of snapshot:": "Sha256 da imagem:", - "Save QR Image to SD Card": "Salvar imagem do QR no cartão SD", - "Save to SD card": "Salvar no cartão SD", - "Save to SD card?": "Salvar no cartão SD?", - "Saved to SD card": "Salvo no cartão SD", - "Scale": "Escala", - "Scan Address": "Escanear Endereço", - "Scan BIP39 Passphrase": "Escanear a senha BIP39", - "Scan Key QR Code": "Escanear Código QR da Chave", - "Scanning words 1-12 again": "Escaneando as palavras 1-12 novamente", - "Scanning words 13-24": "Escaneando as palavras 13-24", - "Screensaver Time": "Tempo para protetor de tela", - "Script Type": "Tipo de Script", - "Security": "Segurança", - "Self-transfer or Change (%d):": "Autotransferência ou Troco (%d):", - "Self-transfer:": "Autotransferência:", - "Set a tamper check code first": "Defina um código de verificação primeiro", - "Settings": "Configurações", - "Settings stored internally on flash.": "Configurações armazenadas internamente no flash.", - "Settings stored on SD card.": "Configurações armazenadas no cartão SD.", - "Shannon's Entropy:": "Entropia de Shannon:", - "Shutdown": "Desligar", - "Shutdown Time": "Tempo de desligamento", - "Shutting down..": "Desligando..", - "Sign": "Assinar", - "Sign to QR code": "Assinar para código QR", - "Sign to SD card": "Assinar para cartão SD", - "Sign?": "Assinar?", - "Signature": "Assinatura", - "Signed Message": "Mensagem Assinada", - "Signed PSBT": "PSBT Assinada", - "Signing..": "Assinando..", - "Single-sig": "Single-sig", - "Size:": "Total:", - "Some checks cannot be performed.": "Algumas verificações não podem ser realizadas.", - "Spend (%d):": "Gastos (%d):", - "Spend:": "Gasto:", - "Stats for Nerds": "Estatísticas para Nerds", - "Store on Flash": "Armazene na Flash", - "Store on SD Card": "Armazene no Cartão SD", - "Swipe to change mode": "Deslize para mudar de modo", - "TC Flash Hash": "TC Flash Hash", - "TC Flash Hash at Boot": "TC Hash Flash na Inicialização", - "TOUCH or ENTER to capture": "TOQUE ou ENTER para capturar", - "TX Pin": "Pino TX", - "Tamper Check Code": "Código de Verificação", - "Tamper check code set successfully": "Código de verificação definido com sucesso", - "Tamper check codes do not match": "Os códigos de verificação não correspondem", - "Text": "Texto", - "Theme": "Tema", - "Thermal": "Térmica", - "To ensure data is unrecoverable use Wipe Device feature": "Para garantir que os dados sejam irrecuperáveis, use o recurso Limpar Dispositivo", - "Toggle Brightness": "Alternar brilho", - "Tools": "Ferramentas", - "Touch Threshold": "Limiar de Toque", - "Touchscreen": "Touchscreen", - "Try more?": "Tentar mais?", - "Type BIP39 Passphrase": "Digitar a senha BIP39", - "Type Key": "Digite a Chave", - "Unit": "Unidade", - "Upgrade complete.": "Atualização completa.", - "Use a black background surface.": "Use uma superfície de fundo preta.", - "Use camera's entropy to create a new mnemonic": "Use a entropia da câmera para criar um novo mnemônico", - "Used:": "Usado:", - "User's Data": "Usuário", - "Value %s out of range: [%s, %s]": "Valor %s fora do alcance: [ %s, %s]", - "Value must be multiple of %s": "O valor deve ser múltiplo de %s", - "Verifying..": "Verificando..", - "Version": "Versão", - "Via Camera": "Pela Câmera", - "Via D20": "Via D20", - "Via D6": "Via D6", - "Via Manual Input": "Por entrada manual", - "Via Words": "Via Palavras", - "Wait for the capture": "Aguarde a captura", - "Wallet": "Carteira", - "Wallet Descriptor": "Descritor de Carteira", - "Wallet output descriptor": "Descritor da carteira", - "Wallet output descriptor loaded!": "Descritor de saída da carteira carregado!", - "Wallet output descriptor not found.": "O descritor de saída da carteira não foi encontrado.", - "Warning:": "Aviso:", - "Word %d": "Palavra %d", - "Word Numbers": "Números das Palavras", - "Words": "Palavras", - "Yes": "Sim", - "is a valid address!": "é um endereço válido!", - "was NOT FOUND in the first %d addresses": "NÃO FOI ENCONTRADO nos primeiros %d endereços" -} \ No newline at end of file +{"% of the amount.": "% do valor.", "%d of %d multisig": "%d da %d multisig", "%d to %d": "%d a %d", "%s removed.": "%s removido.", "(%d total)": "(%d total)", "(Experimental)": "(Experimental)", "(watch-only)": "(Somente visualização)", "12 words": "12 palavras", "24 words": "24 palavras", "About": "Sobre", "Accept assumption?": "Aceitar suposições?", "Account": "Conta", "Account #0 would be assumed": "A conta #0 seria assumida", "Account Index": "Índice da Conta", "Add or change wallet passphrase?": "Adicionar ou alterar senha da carteira?", "Additional entropy from camera required for AES-CBC mode": "Entropia adicional da câmera necessária para o modo AES-CBC", "Address": "Endereço", "Align camera and backup plate properly.": "Alinhe a câmera e a placa de backup corretamente.", "Allow in settings first!": "Permita nas configurações primeiro!", "Anti-glare disabled": "Antirreflexo desativado", "Anti-glare enabled": "Antirreflexo ativado", "Appearance": "Aparência", "Are you sure?": "Tem certeza?", "BGR Colors": "Cores BGR", "BIP39 Mnemonic": "Mnemônico BIP39", "Back": "Voltar", "Back to Menu": "Voltar ao Menu", "Backup Mnemonic": "Backup de Mnemônico", "Bad signature": "Assinatura Inválida", "Base64 Password": "Senha Base64", "Baudrate": "Baudrate", "Binary Grid": "Grade binária", "Border Padding": "Borda", "Brightness": "Brilho", "Buttons": "Botões", "Buttons Debounce": "Debounce dos Botões", "Capture cancelled": "Captura cancelada", "Change": "Troco", "Change Addresses": "Endereços de Troco", "Change theme and reboot?": "Mudar o tema e reiniciar?", "Change:": "Troco:", "Changes will last until shutdown.": "Alterações só durarão até o desligamento.", "Check SD Card": "Verifique o cartão SD", "Check that address belongs to this wallet?": "Verificar se este endereço pertence a carteira?", "Checked %d addresses with no matches.": "Verificado %d endereços sem correspondências.", "Checking for SD card..": "Verificando o cartão SD..", "Confirm Tamper Check Code": "Confirmar Código", "Create QR Code": "Gerar Código QR", "Create QR code from text?": "Gerar código QR do texto?", "Created:": "Criado:", "Current Tamper Check Code": "Código Atual", "Custom QR Code": "Código QR Customizado", "Customize": "Customizar", "Customizing your wallet will generate a new Key.": "Personalizar sua carteira gerará uma nova chave.", "Cut Depth": "Profundidade de Corte", "Cut Method": "Método de Corte", "Decimal": "Decimal", "Decrypt?": "Descriptografar?", "Default Wallet": "Carteira Padrão", "Depth Per Pass": "Profundidade da Passagem", "Derive BIP85 entropy?": "Derivar entropia BIP85?", "Descriptor Addresses": "Endereços do Descritor", "Display": "Display", "Do not power off, it may take a while to complete.": "Não desligue, pode demorar um pouco para concluir.", "Done?": "Feito?", "Double mnemonic": "Duplo mnemônico", "Driver": "Driver", "Empty": "Vazio", "Enable Krux apps": "Ativar Krux app", "Encrypted": "Criptografado", "Encrypted QR Code": "Código QR Criptografado", "Encrypted mnemonic was not stored": "Mnemonic criptografado não foi armazenado", "Encrypted mnemonic was stored with ID:": "Mnemônico criptografado foi armazenado com ID:", "Encryption": "Criptografia", "Encryption Mode": "Modo de Criptografia", "Enter %d BIP-39 words.": "Insira %d palavras BIP-39.", "Enter a 6+ characters Tamper Check Code": "Insira um código de verificação com mais de 6 caracteres", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Digite o número de cada palavra do seu mnemônico BIP-39, de 1 a 2048.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Digite o número de cada palavra do seu mnemônico BIP-39 como um número em hexadecimal, de 1 a 800.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Digite o número de cada palavra do seu mnemônico BIP-39 como um número em octal, de 1 a 4000.", "Enter each word of your BIP-39 mnemonic.": "Digite cada palavra do seu mnemônico BIP-39.", "Erase User's Data": "Apagar Dados do Usuário", "Erasing user's data..": "Apagando os dados do usuário..", "Error:": "Erro:", "Esc": "Esc", "Execute a signed Krux app?": "Executar um Krux app assinado?", "Explore files?": "Explorar arquivos?", "Exporting to SD card..": "Exportando para o cartão SD..", "Extended Public Key": "Chave Pública Estendida", "Factory Settings": "Configurações de Fábrica", "Failed to decrypt": "Falhou em descriptografar", "Failed to load PSBT": "Falhou ao carregar PSBT", "Failed to load address": "Falhou ao carregar endereço", "Failed to load key": "Falha ao carregar a chave", "Failed to load message": "Falhou ao carregar mensagem", "Failed to load mnemonic": "Falhou ao carregar mnemônico", "Failed to load output descriptor": "Falha ao carregar o descritor de saída", "Failed to load passphrase": "Falha ao carregar a senha", "Failed to store mnemonic": "Falhou ao armazenar mnemônico", "Fee:": "Taxa:", "Feed Rate": "Taxa de Alimentação", "Filename": "Nome do arquivo", "Filename %s exists on SD card, overwrite?": "O nome do arquivo %s existe no cartão SD, substituir?", "Fill the flash with entropy from camera?": "Preencher a flash com entropia da câmera?", "Filling Flash": "Preenchendo a Flash", "Fingerprint unset in PSBT": "Impressão digital não definida no PSBT", "Firmware exceeds max size: %d": "Firmware excede o tamanho máximo: %d", "Flash Map": "Mapa da Flash", "Flash Tools": "Ferramentas da Flash", "Flash filled with camera entropy": "Flash preenchida com entropia da câmera", "Flipped X Coordinates": "Coordenadas X invertidas", "Flute Diameter": "Diâmetro da Fresa", "Free:": "Livre:", "From Storage": "Do Armazenamento", "Fully erase your SD card in another device to ensure data is unrecoverable": "Apague totalmente seu cartão SD em outro dispositivo para garantir que os dados sejam irrecuperáveis", "Generate Mnemonic": "Gerar Mnemônico", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Dê a este mnemônico um ID personalizado? Caso contrário, a impressão digital atual será usada", "Go": "Ir", "Good entropy": "Boa entropia", "Hardware": "Hardware", "Hex Public Key": "Chave pública hexadecimal", "Hexadecimal": "Hexadecimal", "Hide Mnemonics": "Ocultar Mnemônicos", "High fees!": "Taxas altas!", "ID already exists": "Id já existe", "Index": "Índice", "Index: %s": "Índice: %s", "Inputs (%d):": "Entradas (%d):", "Install?": "Instalar?", "Insufficient Entropy!": "Entropia insuficiente!", "Insufficient entropy": "Entropia insuficiente", "Invalid Tamper Check Code": "Código de verificação inválido", "Invalid address": "Endereço inválido", "Invalid bootloader": "Bootloader inválido", "Invalid mnemonic length": "Comprimento de mnemônico inválido", "Invalid public key": "Chave pública inválida", "Invalid wallet:": "Carteira inválida:", "Invert": "Invertido", "Inverted Colors": "Cores invertidas", "Key": "Chave", "Key was not provided": "A chave não foi fornecida", "Krux Printer Test QR": "Teste de impressão de QR krux", "LCD Type": "Tipo de LCD", "Language": "Língua", "Leave blank if you'd like Krux to pick a valid final word": "Deixe em branco se quiser que o Krux escolha uma palavra final válida", "Left": "Esquerda", "Length: %s": "Comprimento: %s", "Line Delay": "Atraso de Linha", "Line:": "Linha:", "Load Krux app": "Carregar Krux app", "Load Mnemonic": "Carregar Mnemônico", "Load Wallet": "Carregar Carteira", "Load a trusted wallet descriptor to view addresses?": "Carregar um descritor de carteira confiável para visualizar endereços?", "Load from SD card": "Carregar do cartão SD", "Load from SD card?": "Carregar do cartão SD?", "Load from camera": "Carregar da câmera", "Load one?": "Carregar um?", "Load?": "Carregar?", "Loading Camera..": "Carregando Câmera..", "Loading change addresses..": "Carregando endereços de troco..", "Loading printer..": "Carregando impressora..", "Loading receive addresses..": "Carregando endereços de recebimento..", "Loading..": "Carregando..", "Locale": "Idioma", "Location": "Local", "Maximum length exceeded (%s)": "Comprimento máximo excedido (%s)", "Message": "Mensagem", "Message:": "Mensagem:", "Missing signature file": "Arquivo de assinatura faltando", "Mnemonic": "Mnemônico", "Mnemonic ID": "ID do mnemônico", "Mnemonic and passphrase will be kept.": "Mnemônico e senha serão mantidos.", "Mnemonic was not encrypted": "Mnemônico não foi criptografado", "Modified:": "Modificado:", "Multisig": "Multisig", "Native Segwit - 84 would be assumed": "Segwit nativo - 84 seria assumido", "Network": "Rede", "New Mnemonic": "Novo Mnemônico", "New firmware detected.": "Novo firmware detectado.", "No": "Não", "No Passphrase": "Sem Senha", "Not enough rolls!": "Jogadas insuficientes!", "Numbers": "Números", "Octal": "Octal", "Other Formats": "Outros Formatos", "PBKDF2 Iter.": "Iter. PBKDF2", "Paint punched dots black so they can be detected.": "Pinte os pontos perfurados de preto para que possam ser detectados.", "Paper Width": "Largura do papel", "Part": "Parte", "Part Size": "Tamanho da peça", "Passphrase": "Senha", "Password Length": "Comprimento da Senha", "Path mismatch": "Incompatibilidade de caminho", "Pattern detected!": "Padrão detectado!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "Remover permanentemente todos os mnemônicos criptografados e configurações armazenados da memória flash?", "Persist": "Salvar", "Pixels deviation index:": "Índice de desvio de pixels:", "Plaintext QR": "QR em Texto", "Please load a wallet output descriptor": "Carregue um descritor da carteira", "Plunge Rate": "Taxa de Mergulho", "Poor entropy": "Entropia fraca", "Poor entropy detected!": "Baixa entropia detectada!", "Print Test QR": "Imprimir QR de teste", "Print Tiny Seed?": "Imprimir Tiny Seed?", "Print to QR": "Imprimir QR", "Print to QR?": "Imprimir QR?", "Print?": "Imprimir?", "Printer": "Impressora", "Printer Driver not set!": "Driver de impressora não está definido!", "Printing..": "Imprimindo..", "Proceed anyway?": "Continuar mesmo assim?", "Proceed?": "Seguir?", "Processing..": "Processando..", "QR Code": "Código QR", "RX Pin": "Pino RX", "Reboot": "Reiniciar", "Receive": "Recebimento", "Receive Addresses": "Endereços de Recebimento", "Region:": "Região:", "Remove %s?": "Excluir %s?", "Remove Mnemonic": "Excluir Mnemônico", "Remove firmware files from SD Card?": "Remover arquivos de firmware do cartão SD?", "Res. - Format": "Res. - Formato", "Restore factory settings and reboot?": "Restaurar as configurações de fábrica e reiniciar?", "Return to QR Viewer": "Retornar ao Visualizador de QR", "Review scanned data, edit if necessary": "Revise os dados, edite se necessário", "Right": "Direita", "Roll dice at least %d times to generate a mnemonic.": "Role o dado pelo menos %d vezes para gerar um mnemônico.", "Rolls distribution:": "Distribuição de jogadas:", "Rolls:": "Jogadas:", "SD card": "Cartão SD", "SD card not detected.": "Cartão SD não detectado.", "SHA256 of rolls:": "SHA256 de jogadas:", "SHA256 of snapshot:": "Sha256 da imagem:", "Save QR Image to SD Card": "Salvar imagem do QR no cartão SD", "Save to SD card": "Salvar no cartão SD", "Save to SD card?": "Salvar no cartão SD?", "Saved to SD card": "Salvo no cartão SD", "Scale": "Escala", "Scan Address": "Escanear Endereço", "Scan BIP39 Passphrase": "Escanear a senha BIP39", "Scan Key QR Code": "Escanear Código QR da Chave", "Scanning words 1-12 again": "Escaneando as palavras 1-12 novamente", "Scanning words 13-24": "Escaneando as palavras 13-24", "Screensaver Time": "Tempo para protetor de tela", "Script Type": "Tipo de Script", "Security": "Segurança", "Self-transfer or Change (%d):": "Autotransferência ou Troco (%d):", "Self-transfer:": "Autotransferência:", "Set a tamper check code first": "Defina um código de verificação primeiro", "Settings": "Configurações", "Settings stored internally on flash.": "Configurações armazenadas internamente no flash.", "Settings stored on SD card.": "Configurações armazenadas no cartão SD.", "Shannon's Entropy:": "Entropia de Shannon:", "Shutdown": "Desligar", "Shutdown Time": "Tempo de desligamento", "Shutting down..": "Desligando..", "Sign": "Assinar", "Sign to QR code": "Assinar para código QR", "Sign to SD card": "Assinar para cartão SD", "Sign?": "Assinar?", "Signature": "Assinatura", "Signed Message": "Mensagem Assinada", "Signed PSBT": "PSBT Assinada", "Signing..": "Assinando..", "Single-sig": "Single-sig", "Size:": "Total:", "Some checks cannot be performed.": "Algumas verificações não podem ser realizadas.", "Spend (%d):": "Gastos (%d):", "Spend:": "Gasto:", "Stats for Nerds": "Estatísticas para Nerds", "Store on Flash": "Armazene na Flash", "Store on SD Card": "Armazene no Cartão SD", "Swipe to change mode": "Deslize para mudar de modo", "TC Flash Hash": "TC Flash Hash", "TC Flash Hash at Boot": "TC Hash Flash na Inicialização", "TOUCH or ENTER to capture": "TOQUE ou ENTER para capturar", "TX Pin": "Pino TX", "Tamper Check Code": "Código de Verificação", "Tamper check code set successfully": "Código de verificação definido com sucesso", "Tamper check codes do not match": "Os códigos de verificação não correspondem", "Text": "Texto", "Theme": "Tema", "Thermal": "Térmica", "To ensure data is unrecoverable use Wipe Device feature": "Para garantir que os dados sejam irrecuperáveis, use o recurso Limpar Dispositivo", "Toggle Brightness": "Alternar brilho", "Tools": "Ferramentas", "Touch Threshold": "Limiar de Toque", "Touchscreen": "Touchscreen", "Try more?": "Tentar mais?", "Type BIP39 Passphrase": "Digitar a senha BIP39", "Type Key": "Digite a Chave", "Unit": "Unidade", "Upgrade complete.": "Atualização completa.", "Use a black background surface.": "Use uma superfície de fundo preta.", "Use camera's entropy to create a new mnemonic": "Use a entropia da câmera para criar um novo mnemônico", "Used:": "Usado:", "User's Data": "Usuário", "Value %s out of range: [%s, %s]": "Valor %s fora do alcance: [ %s, %s]", "Value must be multiple of %s": "O valor deve ser múltiplo de %s", "Verifying..": "Verificando..", "Version": "Versão", "Via Camera": "Pela Câmera", "Via D20": "Via D20", "Via D6": "Via D6", "Via Manual Input": "Por entrada manual", "Via Words": "Via Palavras", "Wait for the capture": "Aguarde a captura", "Wallet": "Carteira", "Wallet Descriptor": "Descritor de Carteira", "Wallet output descriptor": "Descritor da carteira", "Wallet output descriptor loaded!": "Descritor de saída da carteira carregado!", "Wallet output descriptor not found.": "O descritor de saída da carteira não foi encontrado.", "Warning:": "Aviso:", "Word %d": "Palavra %d", "Word Numbers": "Números das Palavras", "Words": "Palavras", "Yes": "Sim", "is a valid address!": "é um endereço válido!", "was NOT FOUND in the first %d addresses": "NÃO FOI ENCONTRADO nos primeiros %d endereços"} \ No newline at end of file diff --git a/i18n/translations/ru-RU.json b/i18n/translations/ru-RU.json index b51a791a2..30377fac5 100644 --- a/i18n/translations/ru-RU.json +++ b/i18n/translations/ru-RU.json @@ -1,323 +1 @@ -{ - "% of the amount.": "% от суммы.", - "%d of %d multisig": "%d из %d мультиподпись", - "%d to %d": "%d к %d", - "%s removed.": "%s удален.", - "(%d total)": "(%d всего)", - "(Experimental)": "(Эксперементальный)", - "(watch-only)": "(Только часы)", - "12 words": "12 слов", - "24 words": "24 слова", - "About": "О Программе", - "Accept assumption?": "Принять предположение?", - "Account": "Учетная запись", - "Account #0 would be assumed": "Будет принят счет №0", - "Account Index": "Индекс счета", - "Add or change wallet passphrase?": "Добавить или изменить пароль кошелька?", - "Additional entropy from camera required for AES-CBC mode": "Для режима AES-CBC требуется дополнительная энтропия от камеры", - "Address": "Адрес", - "Align camera and backup plate properly.": "Правильно совместите камеру и резервную пластину.", - "Allow in settings first!": "Сначала разрешите в настройках!", - "Anti-glare disabled": "Антиблик отключен", - "Anti-glare enabled": "Антиблик включен", - "Appearance": "Внешний Вид", - "Are you sure?": "Вы уверены?", - "BGR Colors": "Цвета BGR", - "BIP39 Mnemonic": "BIP39 Мнемоника", - "Back": "Назад", - "Back to Menu": "Назад в Mеню", - "Backup Mnemonic": "Резервная мнемоника", - "Bad signature": "Плохая подпись", - "Base64 Password": "Пароль Base64", - "Baudrate": "Скорость Передачи Данных", - "Binary Grid": "Двоичная сетка", - "Border Padding": "Заполнение Границ", - "Brightness": "Яркость", - "Buttons": "Кнопки", - "Buttons Debounce": "Антидребезг кнопок", - "Capture cancelled": "Захват отменен", - "Change": "Сдача", - "Change Addresses": "Адрес Сдачи", - "Change theme and reboot?": "Сменить тему и перезагрузить?", - "Change:": "Сдача:", - "Changes will last until shutdown.": "Изменения будут храниться до выключения.", - "Check SD Card": "Проверить SD Карту", - "Check that address belongs to this wallet?": "Проверить, что адрес принадлежит этому кошельку?", - "Checked %d addresses with no matches.": "Проверено %d адресов без совпадений.", - "Checking for SD card..": "Проверка SD карты..", - "Confirm Tamper Check Code": "Подтвердите код проверки вскрытия", - "Could not execute %s": "Не удалось выполнить %s", - "Create QR Code": "Создать QR Код", - "Create QR code from text?": "Создать QR код из текста?", - "Created:": "Создано:", - "Current Tamper Check Code": "Текущий код проверки вскрытия", - "Custom QR Code": "Пользовательский QR Код", - "Customize": "Настроить", - "Customizing your wallet will generate a new Key.": "Настройка вашего кошелька создаст новый ключ.", - "Cut Depth": "Глубина Резки", - "Cut Method": "Метод Резки", - "Decimal": "Десятичный", - "Decrypt?": "Расшифровать?", - "Default Wallet": "Кошелек по умолчанию", - "Depth Per Pass": "Глубина за Проход", - "Derive BIP85 entropy?": "Вывести энтропию BIP85?", - "Descriptor Addresses": "Адреса дескрипторов", - "Display": "Дисплеи", - "Do not power off, it may take a while to complete.": "Не выключайте питание, это может занять некоторое время.", - "Done?": "Готово?", - "Double mnemonic": "Двойная мнемоника", - "Driver": "Драйвер", - "Empty": "Пустой", - "Enable Krux apps": "Включить приложения Krux", - "Encrypted": "Зашифровано", - "Encrypted QR Code": "Зашифрованный QR Код", - "Encrypted mnemonic was not stored": "Зашифрованная мнемоника не была сохранена", - "Encrypted mnemonic was stored with ID:": "Зашифрованная мнемоника была сохранена с ID:", - "Encryption": "Шифрование", - "Encryption Mode": "Метод Шифрования", - "Enter %d BIP-39 words.": "Введите %d слов BIP-39.", - "Enter a 6+ characters Tamper Check Code": "Введите более 6 символов кода проверки вскрытия", - "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Введите каждое слово вашей мнемоники BIP-39 в виде числа от 1 до 2048.", - "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Введите каждое слово вашей мнемоники BIP-39 в виде шестнадцатеричного числа от 1 до 800.", - "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Введите каждое слово вашей мнемоники BIP-39 в виде восьмеричного числа от 1 до 4000.", - "Enter each word of your BIP-39 mnemonic.": "Введите каждое слово вашей BIP-39 мнемоники.", - "Erase User's Data": "Удалить данные пользователя", - "Erasing user's data..": "Удаление данных пользователя..", - "Error:": "Ошибка:", - "Esc": "Выйти", - "Execute a signed Krux app?": "Выполнить подписанное приложение Krux?", - "Explore files?": "Исследовать файлы?", - "Exporting to SD card..": "Экспортирование на SD карту..", - "Extended Public Key": "Расширенный Публичный Ключ", - "Factory Settings": "Заводские Настройки", - "Failed to decrypt": "Не удалось расшифровать", - "Failed to load PSBT": "Не удалось загрузить PSBT", - "Failed to load address": "Не удалось загрузить адрес", - "Failed to load key": "Не удалось загрузить ключ", - "Failed to load message": "Не удалось загрузить сообщение", - "Failed to load mnemonic": "Не удалось загрузить мнемонику", - "Failed to load output descriptor": "Не удалось загрузить выходной дескриптор", - "Failed to load passphrase": "Не удалось загрузить фразу-пароль", - "Failed to store mnemonic": "Не удалось сохранить мнемонику", - "Fee:": "Комиссия:", - "Feed Rate": "Скорость Подачи", - "Filename": "Имя файла", - "Filename %s exists on SD card, overwrite?": "Файл %s существует на SD карте, перезаписать?", - "Fill the flash with entropy from camera?": "Заполнить флэш энтропией с камеры?", - "Filling Flash": "Заполнение флэша", - "Fingerprint unset in PSBT": "Отпечаток пальца не установлен в PSBT", - "Firmware exceeds max size: %d": "Прошивка превышает максимальный размер: %d", - "Flash Map": "Карта флэша", - "Flash Tools": "Flash Tools", - "Flash filled with camera entropy": "Флэш заполнен энтропией камеры", - "Flipped X Coordinates": "Перевернутые координаты X", - "Flute Diameter": "Диаметр Флюта", - "Free:": "Свободно:", - "From Storage": "Из Памяти", - "Fully erase your SD card in another device to ensure data is unrecoverable": "Полностью стерите SD-карту в другом устройстве, чтобы убедиться, что данные не восстановимы", - "Generate Mnemonic": "Создать Мнемонику", - "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Назначить этой мнемоники кастомный ID? В ином случае будет использован текущий фингерпринт", - "Go": "OK", - "Good entropy": "Хорошая энтропия", - "Hardware": "Аппаратное Обеспечение", - "Hex Public Key": "Шестнадцатеричный Публичный Ключ", - "Hexadecimal": "Шестнадцатеричный", - "Hide Mnemonics": "Скрыть мнемоники", - "High fees!": "Высокие комиссии!", - "ID already exists": "ID уже существует", - "Index": "Индекс", - "Index: %s": "Индекс: %s", - "Inputs (%d):": "Входы (%d):", - "Install?": "Установить?", - "Insufficient Entropy!": "Недостаточная Энтропия!", - "Insufficient entropy": "Недостаточная энтропия", - "Invalid Tamper Check Code": "Недействительный код проверки вскрытия", - "Invalid address": "Неверный адрес", - "Invalid bootloader": "Неверный загрузчик", - "Invalid mnemonic length": "Неверная длина мнемоники", - "Invalid public key": "Неверный публичный ключ", - "Invalid wallet:": "Неверный кошелек:", - "Invert": "Инвертировать", - "Inverted Colors": "Перевернутые цвета", - "Key": "Ключ", - "Key was not provided": "Ключ не предоставлен", - "Krux Printer Test QR": "Тестовый QR Принтера Krux", - "LCD Type": "Тип ЖК-дисплея", - "Language": "Язык", - "Leave blank if you'd like Krux to pick a valid final word": "Оставьте пустым, если хотите, чтобы Krux выбрал подходящее последнее слово", - "Left": "Влево", - "Length: %s": "Длина: %s", - "Line Delay": "Задержка Линии", - "Line:": "Линия:", - "Load Krux app": "Загрузить приложение Krux", - "Load Mnemonic": "Загрузить Мнемонику", - "Load Wallet": "Загрузить кошелек", - "Load a trusted wallet descriptor to view addresses?": "Загрузить дескриптор доверенного кошелька для просмотра адресов?", - "Load from SD card": "Загрузка с SD-карты", - "Load from SD card?": "Загрузить с SD карты?", - "Load from camera": "Из камеры", - "Load one?": "Загрузить один?", - "Load?": "Загрузить?", - "Loading Camera..": "Загрузка Камеры..", - "Loading change addresses..": "Загрузка адресов изменения..", - "Loading printer..": "Загрузка принтера..", - "Loading receive addresses..": "Загрузка адресов получения..", - "Loading..": "Загрузка..", - "Locale": "Локаль", - "Location": "Расположение", - "Maximum length exceeded (%s)": "Максимальная длина превышена (%s)", - "Message": "Сообщение", - "Message:": "Сообщение:", - "Missing signature file": "Отсутствует файл подписи", - "Mnemonic": "Мнемоника", - "Mnemonic ID": "ID Мнемоники", - "Mnemonic and passphrase will be kept.": "Мнемоника и парольная фраза будут сохранены.", - "Mnemonic was not encrypted": "Мнемоника не была зашифрована", - "Modified:": "Изменено:", - "Multisig": "Мультиподпись", - "Native Segwit - 84 would be assumed": "Native Segwit - 84 будет принято", - "Network": "Сеть", - "New Mnemonic": "Новая Мнемоника", - "New firmware detected.": "Обнаружена новая прошивка.", - "No": "Нет", - "No Passphrase": "Нет Фраза-пароль", - "Not enough rolls!": "Недостаточно бросков!", - "Numbers": "Числа", - "Octal": "Восьмеричный", - "Other Formats": "Другие форматы", - "PBKDF2 Iter.": "PBKDF2 Итерации", - "Paint punched dots black so they can be detected.": "Закрасьте перфорированные точки черным цветом, чтобы их можно было обнаружить.", - "Paper Width": "Ширина Бумаги", - "Part": "Часть", - "Part Size": "Размер Части", - "Passphrase": "Фраза-пароль", - "Password Length": "Длина пароля", - "Path mismatch": "Несоответствие пути", - "Pattern detected!": "Образец обнаружен!", - "Permanently remove all stored encrypted mnemonics and settings from flash?": "Окончательно удалить все сохраненные зашифрованные мнемоники и настройки из флеш-памяти?", - "Persist": "Постоянная Память", - "Pixels deviation index:": "Индекс отклонения пикселей:", - "Plaintext QR": "QR Открытым Текстом", - "Please load a wallet output descriptor": "Пожалуйста загрузите выходной дескриптор кошелька", - "Plunge Rate": "Скорость Погружения", - "Poor entropy": "Плохая энтропия", - "Poor entropy detected!": "Обнаружена плохая энтропия!", - "Print Test QR": "Напечатать Тестовый QR", - "Print Tiny Seed?": "Распечатать Tiny Seed?", - "Print to QR": "Печать в QR", - "Print to QR?": "Напечатать в виде QR?", - "Print?": "Печатать?", - "Printer": "Принтер", - "Printer Driver not set!": "Драйвер Принтера не установлен!", - "Printing..": "Идет печать..", - "Proceed anyway?": "Все равно продолжить?", - "Proceed?": "Продолжить?", - "Processing..": "Обработка..", - "QR Code": "QR Код", - "RX Pin": "RX Пин", - "Reboot": "Перезагрузить", - "Receive": "Получить", - "Receive Addresses": "Адрес Получения", - "Region:": "Регион:", - "Remove %s?": "Удалить %s?", - "Remove Mnemonic": "Удалить Мнемонику", - "Remove firmware files from SD Card?": "Удалить файлы прошивки с SD-карты?", - "Res. - Format": "Разреш. - Формат", - "Restore factory settings and reboot?": "Восстановить заводские настройки и перезагрузить?", - "Return to QR Viewer": "Вернуться к QR-просмотрщику", - "Review scanned data, edit if necessary": "Просмотрите отсканированные данные, отредактируйте при необходимости", - "Right": "Вправо", - "Roll dice at least %d times to generate a mnemonic.": "Бросьте кубик не менее %d раз, чтобы сгенерировать мнемонику.", - "Rolls distribution:": "Распределение бросков:", - "Rolls:": "Броски:", - "SD card": "SD карта", - "SD card not detected.": "SD карта не обнаружена.", - "SHA256 of rolls:": "SHA256 бросков:", - "SHA256 of snapshot:": "SHA256 снэпшота:", - "Save QR Image to SD Card": "Сохранить QR-изображение на SD-карту", - "Save to SD card": "Сохранить на SD-карту", - "Save to SD card?": "Сохранить на SD карту?", - "Saved to SD card": "Сохранено на SD карту", - "Scale": "Шкала", - "Scan Address": "Отсканировать Адрес", - "Scan BIP39 Passphrase": "Отсканировать BIP39 фразу-пароль", - "Scan Key QR Code": "Отсканировать Ключ QR код", - "Scanning words 1-12 again": "Сканирование слов 1-12 снова", - "Scanning words 13-24": "Сканирование слов 13-24", - "Screensaver Time": "Время Экранной Заставки", - "Script Type": "Тип скрипта", - "Security": "Охрана", - "Self-transfer or Change (%d):": "Трансфер самому себе или Сдача (%d):", - "Self-transfer:": "Перевод самому себе:", - "Set a tamper check code first": "Сначала установите код проверки вскрытия", - "Settings": "Настройки", - "Settings stored internally on flash.": "Настройки хранятся во флэш-памяти.", - "Settings stored on SD card.": "Настройки сохранены на SD-карте.", - "Shannon's Entropy:": "Энтропия Шеннона:", - "Shutdown": "Выключить", - "Shutdown Time": "Время выключения", - "Shutting down..": "Выключение..", - "Sign": "Подписать", - "Sign to QR code": "Подписать QR-код", - "Sign to SD card": "Подписать на SD-карте", - "Sign?": "Подписать?", - "Signature": "Подпись", - "Signed Message": "Подписанное Сообщение", - "Signed PSBT": "Подписанное PSBT", - "Signing..": "Подписание..", - "Single-sig": "Одна подпись", - "Size:": "Размер:", - "Some checks cannot be performed.": "Некоторые проверки не могут быть выполнены.", - "Spend (%d):": "Расход (%d):", - "Spend:": "Расход:", - "Stats for Nerds": "Статистика для Гиков", - "Store on Flash": "Сохранить на Флэш Память", - "Store on SD Card": "Сохранить на SD Карту", - "Swipe to change mode": "Свайпните, чтобы сменить режим", - "TC Flash Hash": "TC Flash Hash", - "TC Flash Hash at Boot": "Проверка хэша Flash при загрузке", - "TOUCH or ENTER to capture": "ПРИКОСНИТЕСЬ или нажмите ВВОД, чтобы захватить", - "TX Pin": "TX Пин", - "Tamper Check Code": "Код проверки вскрытия", - "Tamper check code set successfully": "Код проверки вскрытия успешно установлен", - "Tamper check codes do not match": "Коды проверки вскрытия не совпадают", - "Text": "Текст", - "Theme": "Тема", - "Thermal": "Термальный", - "To ensure data is unrecoverable use Wipe Device feature": "Для гарантии невосстановления данных используйте функцию Очистки Устройства", - "Toggle Brightness": "Регулировка Яркости", - "Tools": "Инструменты", - "Touch Threshold": "Чувствительность", - "Touchscreen": "Тачскрин", - "Try more?": "Попробовать ещё?", - "Type BIP39 Passphrase": "Ввести BIP39 фразу-пароль", - "Type Key": "Ввести Ключ", - "Unit": "Единица Измерения", - "Upgrade complete.": "Обновление завершено.", - "Use a black background surface.": "Использовать черную фоновую поверхность.", - "Use camera's entropy to create a new mnemonic": "Использовать энтропию камеры, чтобы создать новую мнемонику", - "Used:": "Использовано:", - "User's Data": "Пользователь", - "Value %s out of range: [%s, %s]": "Значение %s вне диапозона: [%s, %s]", - "Value must be multiple of %s": "Значение должно быть кратным %s", - "Verifying..": "Проверка..", - "Version": "Версия", - "Via Camera": "С Помощью Камеры", - "Via D20": "С Помощью D20", - "Via D6": "С Помощью D6", - "Via Manual Input": "С Помощью Ручного Ввода", - "Via Words": "Через Слово", - "Wait for the capture": "Дождитесь Захвата", - "Wallet": "Кошелек", - "Wallet Descriptor": "Дескриптор Кошелька", - "Wallet output descriptor": "Выходной дескриптор кошелька", - "Wallet output descriptor loaded!": "Выходной дескриптор кошелька загружен!", - "Wallet output descriptor not found.": "Выходной дескриптор кошелька не найден.", - "Warning:": "Предупреждение:", - "Word %d": "Слово %d", - "Word Numbers": "Числа Слов", - "Words": "Слова", - "Yes": "Да", - "is a valid address!": "некорректный адрес", - "was NOT FOUND in the first %d addresses": "нЕ НАЙДЕНО в первых %d адресах" -} \ No newline at end of file +{"% of the amount.": "% от суммы.", "%d of %d multisig": "%d из %d мультиподпись", "%d to %d": "%d к %d", "%s removed.": "%s удален.", "(%d total)": "(%d всего)", "(Experimental)": "(Эксперементальный)", "(watch-only)": "(Только часы)", "12 words": "12 слов", "24 words": "24 слова", "About": "О Программе", "Accept assumption?": "Принять предположение?", "Account": "Учетная запись", "Account #0 would be assumed": "Будет принят счет №0", "Account Index": "Индекс счета", "Add or change wallet passphrase?": "Добавить или изменить пароль кошелька?", "Additional entropy from camera required for AES-CBC mode": "Для режима AES-CBC требуется дополнительная энтропия от камеры", "Address": "Адрес", "Align camera and backup plate properly.": "Правильно совместите камеру и резервную пластину.", "Allow in settings first!": "Сначала разрешите в настройках!", "Anti-glare disabled": "Антиблик отключен", "Anti-glare enabled": "Антиблик включен", "Appearance": "Внешний Вид", "Are you sure?": "Вы уверены?", "BGR Colors": "Цвета BGR", "BIP39 Mnemonic": "BIP39 Мнемоника", "Back": "Назад", "Back to Menu": "Назад в Mеню", "Backup Mnemonic": "Резервная мнемоника", "Bad signature": "Плохая подпись", "Base64 Password": "Пароль Base64", "Baudrate": "Скорость Передачи Данных", "Binary Grid": "Двоичная сетка", "Border Padding": "Заполнение Границ", "Brightness": "Яркость", "Buttons": "Кнопки", "Buttons Debounce": "Антидребезг кнопок", "Capture cancelled": "Захват отменен", "Change": "Сдача", "Change Addresses": "Адрес Сдачи", "Change theme and reboot?": "Сменить тему и перезагрузить?", "Change:": "Сдача:", "Changes will last until shutdown.": "Изменения будут храниться до выключения.", "Check SD Card": "Проверить SD Карту", "Check that address belongs to this wallet?": "Проверить, что адрес принадлежит этому кошельку?", "Checked %d addresses with no matches.": "Проверено %d адресов без совпадений.", "Checking for SD card..": "Проверка SD карты..", "Confirm Tamper Check Code": "Подтвердите код проверки вскрытия", "Create QR Code": "Создать QR Код", "Create QR code from text?": "Создать QR код из текста?", "Created:": "Создано:", "Current Tamper Check Code": "Текущий код проверки вскрытия", "Custom QR Code": "Пользовательский QR Код", "Customize": "Настроить", "Customizing your wallet will generate a new Key.": "Настройка вашего кошелька создаст новый ключ.", "Cut Depth": "Глубина Резки", "Cut Method": "Метод Резки", "Decimal": "Десятичный", "Decrypt?": "Расшифровать?", "Default Wallet": "Кошелек по умолчанию", "Depth Per Pass": "Глубина за Проход", "Derive BIP85 entropy?": "Вывести энтропию BIP85?", "Descriptor Addresses": "Адреса дескрипторов", "Display": "Дисплеи", "Do not power off, it may take a while to complete.": "Не выключайте питание, это может занять некоторое время.", "Done?": "Готово?", "Double mnemonic": "Двойная мнемоника", "Driver": "Драйвер", "Empty": "Пустой", "Enable Krux apps": "Включить приложения Krux", "Encrypted": "Зашифровано", "Encrypted QR Code": "Зашифрованный QR Код", "Encrypted mnemonic was not stored": "Зашифрованная мнемоника не была сохранена", "Encrypted mnemonic was stored with ID:": "Зашифрованная мнемоника была сохранена с ID:", "Encryption": "Шифрование", "Encryption Mode": "Метод Шифрования", "Enter %d BIP-39 words.": "Введите %d слов BIP-39.", "Enter a 6+ characters Tamper Check Code": "Введите более 6 символов кода проверки вскрытия", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Введите каждое слово вашей мнемоники BIP-39 в виде числа от 1 до 2048.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Введите каждое слово вашей мнемоники BIP-39 в виде шестнадцатеричного числа от 1 до 800.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Введите каждое слово вашей мнемоники BIP-39 в виде восьмеричного числа от 1 до 4000.", "Enter each word of your BIP-39 mnemonic.": "Введите каждое слово вашей BIP-39 мнемоники.", "Erase User's Data": "Удалить данные пользователя", "Erasing user's data..": "Удаление данных пользователя..", "Error:": "Ошибка:", "Esc": "Выйти", "Execute a signed Krux app?": "Выполнить подписанное приложение Krux?", "Explore files?": "Исследовать файлы?", "Exporting to SD card..": "Экспортирование на SD карту..", "Extended Public Key": "Расширенный Публичный Ключ", "Factory Settings": "Заводские Настройки", "Failed to decrypt": "Не удалось расшифровать", "Failed to load PSBT": "Не удалось загрузить PSBT", "Failed to load address": "Не удалось загрузить адрес", "Failed to load key": "Не удалось загрузить ключ", "Failed to load message": "Не удалось загрузить сообщение", "Failed to load mnemonic": "Не удалось загрузить мнемонику", "Failed to load output descriptor": "Не удалось загрузить выходной дескриптор", "Failed to load passphrase": "Не удалось загрузить фразу-пароль", "Failed to store mnemonic": "Не удалось сохранить мнемонику", "Fee:": "Комиссия:", "Feed Rate": "Скорость Подачи", "Filename": "Имя файла", "Filename %s exists on SD card, overwrite?": "Файл %s существует на SD карте, перезаписать?", "Fill the flash with entropy from camera?": "Заполнить флэш энтропией с камеры?", "Filling Flash": "Заполнение флэша", "Fingerprint unset in PSBT": "Отпечаток пальца не установлен в PSBT", "Firmware exceeds max size: %d": "Прошивка превышает максимальный размер: %d", "Flash Map": "Карта флэша", "Flash Tools": "Flash Tools", "Flash filled with camera entropy": "Флэш заполнен энтропией камеры", "Flipped X Coordinates": "Перевернутые координаты X", "Flute Diameter": "Диаметр Флюта", "Free:": "Свободно:", "From Storage": "Из Памяти", "Fully erase your SD card in another device to ensure data is unrecoverable": "Полностью стерите SD-карту в другом устройстве, чтобы убедиться, что данные не восстановимы", "Generate Mnemonic": "Создать Мнемонику", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Назначить этой мнемоники кастомный ID? В ином случае будет использован текущий фингерпринт", "Go": "OK", "Good entropy": "Хорошая энтропия", "Hardware": "Аппаратное Обеспечение", "Hex Public Key": "Шестнадцатеричный Публичный Ключ", "Hexadecimal": "Шестнадцатеричный", "Hide Mnemonics": "Скрыть мнемоники", "High fees!": "Высокие комиссии!", "ID already exists": "ID уже существует", "Index": "Индекс", "Index: %s": "Индекс: %s", "Inputs (%d):": "Входы (%d):", "Install?": "Установить?", "Insufficient Entropy!": "Недостаточная Энтропия!", "Insufficient entropy": "Недостаточная энтропия", "Invalid Tamper Check Code": "Недействительный код проверки вскрытия", "Invalid address": "Неверный адрес", "Invalid bootloader": "Неверный загрузчик", "Invalid mnemonic length": "Неверная длина мнемоники", "Invalid public key": "Неверный публичный ключ", "Invalid wallet:": "Неверный кошелек:", "Invert": "Инвертировать", "Inverted Colors": "Перевернутые цвета", "Key": "Ключ", "Key was not provided": "Ключ не предоставлен", "Krux Printer Test QR": "Тестовый QR Принтера Krux", "LCD Type": "Тип ЖК-дисплея", "Language": "Язык", "Leave blank if you'd like Krux to pick a valid final word": "Оставьте пустым, если хотите, чтобы Krux выбрал подходящее последнее слово", "Left": "Влево", "Length: %s": "Длина: %s", "Line Delay": "Задержка Линии", "Line:": "Линия:", "Load Krux app": "Загрузить приложение Krux", "Load Mnemonic": "Загрузить Мнемонику", "Load Wallet": "Загрузить кошелек", "Load a trusted wallet descriptor to view addresses?": "Загрузить дескриптор доверенного кошелька для просмотра адресов?", "Load from SD card": "Загрузка с SD-карты", "Load from SD card?": "Загрузить с SD карты?", "Load from camera": "Из камеры", "Load one?": "Загрузить один?", "Load?": "Загрузить?", "Loading Camera..": "Загрузка Камеры..", "Loading change addresses..": "Загрузка адресов изменения..", "Loading printer..": "Загрузка принтера..", "Loading receive addresses..": "Загрузка адресов получения..", "Loading..": "Загрузка..", "Locale": "Локаль", "Location": "Расположение", "Maximum length exceeded (%s)": "Максимальная длина превышена (%s)", "Message": "Сообщение", "Message:": "Сообщение:", "Missing signature file": "Отсутствует файл подписи", "Mnemonic": "Мнемоника", "Mnemonic ID": "ID Мнемоники", "Mnemonic and passphrase will be kept.": "Мнемоника и парольная фраза будут сохранены.", "Mnemonic was not encrypted": "Мнемоника не была зашифрована", "Modified:": "Изменено:", "Multisig": "Мультиподпись", "Native Segwit - 84 would be assumed": "Native Segwit - 84 будет принято", "Network": "Сеть", "New Mnemonic": "Новая Мнемоника", "New firmware detected.": "Обнаружена новая прошивка.", "No": "Нет", "No Passphrase": "Нет Фраза-пароль", "Not enough rolls!": "Недостаточно бросков!", "Numbers": "Числа", "Octal": "Восьмеричный", "Other Formats": "Другие форматы", "PBKDF2 Iter.": "PBKDF2 Итерации", "Paint punched dots black so they can be detected.": "Закрасьте перфорированные точки черным цветом, чтобы их можно было обнаружить.", "Paper Width": "Ширина Бумаги", "Part": "Часть", "Part Size": "Размер Части", "Passphrase": "Фраза-пароль", "Password Length": "Длина пароля", "Path mismatch": "Несоответствие пути", "Pattern detected!": "Образец обнаружен!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "Окончательно удалить все сохраненные зашифрованные мнемоники и настройки из флеш-памяти?", "Persist": "Постоянная Память", "Pixels deviation index:": "Индекс отклонения пикселей:", "Plaintext QR": "QR Открытым Текстом", "Please load a wallet output descriptor": "Пожалуйста загрузите выходной дескриптор кошелька", "Plunge Rate": "Скорость Погружения", "Poor entropy": "Плохая энтропия", "Poor entropy detected!": "Обнаружена плохая энтропия!", "Print Test QR": "Напечатать Тестовый QR", "Print Tiny Seed?": "Распечатать Tiny Seed?", "Print to QR": "Печать в QR", "Print to QR?": "Напечатать в виде QR?", "Print?": "Печатать?", "Printer": "Принтер", "Printer Driver not set!": "Драйвер Принтера не установлен!", "Printing..": "Идет печать..", "Proceed anyway?": "Все равно продолжить?", "Proceed?": "Продолжить?", "Processing..": "Обработка..", "QR Code": "QR Код", "RX Pin": "RX Пин", "Reboot": "Перезагрузить", "Receive": "Получить", "Receive Addresses": "Адрес Получения", "Region:": "Регион:", "Remove %s?": "Удалить %s?", "Remove Mnemonic": "Удалить Мнемонику", "Remove firmware files from SD Card?": "Удалить файлы прошивки с SD-карты?", "Res. - Format": "Разреш. - Формат", "Restore factory settings and reboot?": "Восстановить заводские настройки и перезагрузить?", "Return to QR Viewer": "Вернуться к QR-просмотрщику", "Review scanned data, edit if necessary": "Просмотрите отсканированные данные, отредактируйте при необходимости", "Right": "Вправо", "Roll dice at least %d times to generate a mnemonic.": "Бросьте кубик не менее %d раз, чтобы сгенерировать мнемонику.", "Rolls distribution:": "Распределение бросков:", "Rolls:": "Броски:", "SD card": "SD карта", "SD card not detected.": "SD карта не обнаружена.", "SHA256 of rolls:": "SHA256 бросков:", "SHA256 of snapshot:": "SHA256 снэпшота:", "Save QR Image to SD Card": "Сохранить QR-изображение на SD-карту", "Save to SD card": "Сохранить на SD-карту", "Save to SD card?": "Сохранить на SD карту?", "Saved to SD card": "Сохранено на SD карту", "Scale": "Шкала", "Scan Address": "Отсканировать Адрес", "Scan BIP39 Passphrase": "Отсканировать BIP39 фразу-пароль", "Scan Key QR Code": "Отсканировать Ключ QR код", "Scanning words 1-12 again": "Сканирование слов 1-12 снова", "Scanning words 13-24": "Сканирование слов 13-24", "Screensaver Time": "Время Экранной Заставки", "Script Type": "Тип скрипта", "Security": "Охрана", "Self-transfer or Change (%d):": "Трансфер самому себе или Сдача (%d):", "Self-transfer:": "Перевод самому себе:", "Set a tamper check code first": "Сначала установите код проверки вскрытия", "Settings": "Настройки", "Settings stored internally on flash.": "Настройки хранятся во флэш-памяти.", "Settings stored on SD card.": "Настройки сохранены на SD-карте.", "Shannon's Entropy:": "Энтропия Шеннона:", "Shutdown": "Выключить", "Shutdown Time": "Время выключения", "Shutting down..": "Выключение..", "Sign": "Подписать", "Sign to QR code": "Подписать QR-код", "Sign to SD card": "Подписать на SD-карте", "Sign?": "Подписать?", "Signature": "Подпись", "Signed Message": "Подписанное Сообщение", "Signed PSBT": "Подписанное PSBT", "Signing..": "Подписание..", "Single-sig": "Одна подпись", "Size:": "Размер:", "Some checks cannot be performed.": "Некоторые проверки не могут быть выполнены.", "Spend (%d):": "Расход (%d):", "Spend:": "Расход:", "Stats for Nerds": "Статистика для Гиков", "Store on Flash": "Сохранить на Флэш Память", "Store on SD Card": "Сохранить на SD Карту", "Swipe to change mode": "Свайпните, чтобы сменить режим", "TC Flash Hash": "TC Flash Hash", "TC Flash Hash at Boot": "Проверка хэша Flash при загрузке", "TOUCH or ENTER to capture": "ПРИКОСНИТЕСЬ или нажмите ВВОД, чтобы захватить", "TX Pin": "TX Пин", "Tamper Check Code": "Код проверки вскрытия", "Tamper check code set successfully": "Код проверки вскрытия успешно установлен", "Tamper check codes do not match": "Коды проверки вскрытия не совпадают", "Text": "Текст", "Theme": "Тема", "Thermal": "Термальный", "To ensure data is unrecoverable use Wipe Device feature": "Для гарантии невосстановления данных используйте функцию Очистки Устройства", "Toggle Brightness": "Регулировка Яркости", "Tools": "Инструменты", "Touch Threshold": "Чувствительность", "Touchscreen": "Тачскрин", "Try more?": "Попробовать ещё?", "Type BIP39 Passphrase": "Ввести BIP39 фразу-пароль", "Type Key": "Ввести Ключ", "Unit": "Единица Измерения", "Upgrade complete.": "Обновление завершено.", "Use a black background surface.": "Использовать черную фоновую поверхность.", "Use camera's entropy to create a new mnemonic": "Использовать энтропию камеры, чтобы создать новую мнемонику", "Used:": "Использовано:", "User's Data": "Пользователь", "Value %s out of range: [%s, %s]": "Значение %s вне диапозона: [%s, %s]", "Value must be multiple of %s": "Значение должно быть кратным %s", "Verifying..": "Проверка..", "Version": "Версия", "Via Camera": "С Помощью Камеры", "Via D20": "С Помощью D20", "Via D6": "С Помощью D6", "Via Manual Input": "С Помощью Ручного Ввода", "Via Words": "Через Слово", "Wait for the capture": "Дождитесь Захвата", "Wallet": "Кошелек", "Wallet Descriptor": "Дескриптор Кошелька", "Wallet output descriptor": "Выходной дескриптор кошелька", "Wallet output descriptor loaded!": "Выходной дескриптор кошелька загружен!", "Wallet output descriptor not found.": "Выходной дескриптор кошелька не найден.", "Warning:": "Предупреждение:", "Word %d": "Слово %d", "Word Numbers": "Числа Слов", "Words": "Слова", "Yes": "Да", "is a valid address!": "некорректный адрес", "was NOT FOUND in the first %d addresses": "нЕ НАЙДЕНО в первых %d адресах"} \ No newline at end of file diff --git a/i18n/translations/tr-TR.json b/i18n/translations/tr-TR.json index 304fb6c5e..de867d1cf 100644 --- a/i18n/translations/tr-TR.json +++ b/i18n/translations/tr-TR.json @@ -1,323 +1 @@ -{ - "% of the amount.": "tutarın %'si.", - "%d of %d multisig": "%d / %d çoklu imza", - "%d to %d": "%d to %d", - "%s removed.": "%s kaldırıldı.", - "(%d total)": "(toplam %d)", - "(Experimental)": "(Deneysel)", - "(watch-only)": "(sadece izle)", - "12 words": "12 kelime", - "24 words": "24 kelime", - "About": "Hakkında", - "Accept assumption?": "Varsayım kabul edilsin mi?", - "Account": "Hesap", - "Account #0 would be assumed": "#0 numaralı hesap varsayılacaktır", - "Account Index": "Hesap Endeksi", - "Add or change wallet passphrase?": "Cüzdan parolası eklensin mi veya değiştirilsin mi?", - "Additional entropy from camera required for AES-CBC mode": "AES-CBC modu için kameradan ek entropi gereklidir", - "Address": "Adres", - "Align camera and backup plate properly.": "Kamerayı ve yedek plakay'ı düzgün bir şekilde hizalayın.", - "Allow in settings first!": "Önce ayarlarda izin ver!", - "Anti-glare disabled": "Parlama önleyici devre dışı", - "Anti-glare enabled": "Parlama önleyici etkin", - "Appearance": "Görünüm", - "Are you sure?": "Emin misiniz?", - "BGR Colors": "BGR Renkleri", - "BIP39 Mnemonic": "BIP39 Anımsatıcı", - "Back": "Geri", - "Back to Menu": "Menüye Dön", - "Backup Mnemonic": "Yedek Mnemonic", - "Bad signature": "Geçersiz imza", - "Base64 Password": "Base64 Parola", - "Baudrate": "Baud Hızı", - "Binary Grid": "İkili Izgara", - "Border Padding": "Kenarlık Dolgusu", - "Brightness": "Parlaklık", - "Buttons": "Butonlar", - "Buttons Debounce": "Buton Geri-sekmesi", - "Capture cancelled": "Yakalama iptal edildi", - "Change": "Para Üstü", - "Change Addresses": "Para Üstü Adresleri", - "Change theme and reboot?": "Temayı değiştir ve yeniden başlat?", - "Change:": "Para Üstü:", - "Changes will last until shutdown.": "Değişiklikler kapanışa kadar devam edecek.", - "Check SD Card": "SD Kartı Kontrol Et", - "Check that address belongs to this wallet?": "Bu adresin, bu cüzdana ait olduğunu kontrol et?", - "Checked %d addresses with no matches.": "Eşleşmeyen %d adres kontrol edildi.", - "Checking for SD card..": "SD kart kontrol ediliyor..", - "Confirm Tamper Check Code": "Kurcalama Kontrol Kodunu Onayla", - "Could not execute %s": "%s yürütülemedi", - "Create QR Code": "QR Kodu Oluştur", - "Create QR code from text?": "Metinden QR kodu oluşturulsun mu?", - "Created:": "Oluşturuldu:", - "Current Tamper Check Code": "Mevcut Kurcalama Kontrol Kodu", - "Custom QR Code": "Özel QR Kodu", - "Customize": "Özelleştir", - "Customizing your wallet will generate a new Key.": "Cüzdanınızı özelleştirmek yeni bir Anahtar oluşturacaktır.", - "Cut Depth": "Kesim Derinliği", - "Cut Method": "Kesim Yöntemi", - "Decimal": "Ondalık", - "Decrypt?": "Şifre çözülsün mü?", - "Default Wallet": "Varsayılan Cüzdan", - "Depth Per Pass": "Geçiş Başına Derinlik", - "Derive BIP85 entropy?": "BIP85 entropisi türetilsin mi?", - "Descriptor Addresses": "Tanımlayıcı Adresler", - "Display": "Ekran", - "Do not power off, it may take a while to complete.": "Kapatmayın, tamamlanması biraz zaman alabilir.", - "Done?": "Tamamlandı mı?", - "Double mnemonic": "Çifte anımsatıcı", - "Driver": "Sürücü", - "Empty": "Boş", - "Enable Krux apps": "Krux uygulamalarını etkinleştir", - "Encrypted": "Şifrelenmiş", - "Encrypted QR Code": "Şifrelenmiş QR Kodu", - "Encrypted mnemonic was not stored": "Şifrelenmiş mnemonic depolanmadı", - "Encrypted mnemonic was stored with ID:": "Şifrelenmiş mnemonic ID ile depolandı:", - "Encryption": "Şifreleme", - "Encryption Mode": "Şifreleme Modu", - "Enter %d BIP-39 words.": "%d BIP-39 kelime girin.", - "Enter a 6+ characters Tamper Check Code": "6+ karakterlik bir Kurcalama Kontrol Kodu girin", - "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "BIP-39 mnemonic'inizin her kelimesini 1'den 2048'e kadar bir sayı olarak girin.", - "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "BIP-39 mnemonic'inizin her kelimesini 1'den 800'e kadar onaltılık bir sayı olarak girin.", - "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "BIP-39 mnemonic'inizin her kelimesini 1'den 4000'e kadar sekizlik bir sayı olarak girin.", - "Enter each word of your BIP-39 mnemonic.": "BIP-39 mnemonic'inizin her kelimesini girin.", - "Erase User's Data": "Kullanıcı Verilerini Sil", - "Erasing user's data..": "Kullanıcının verileri siliniyor..", - "Error:": "Hata:", - "Esc": "Çıkış", - "Execute a signed Krux app?": "İmzalı bir Krux uygulaması çalıştırılsın mı?", - "Explore files?": "Dosyaları ara?", - "Exporting to SD card..": "SD karta aktarılıyor..", - "Extended Public Key": "Genişletilmiş Public Key", - "Factory Settings": "Fabrika Ayarları", - "Failed to decrypt": "Şifre çözme başarısız", - "Failed to load PSBT": "PSBT yükleme başarısız", - "Failed to load address": "Adres yükleme başarısız", - "Failed to load key": "Anahtar yükleme başarısız", - "Failed to load message": "Mesaj yükleme başarısız", - "Failed to load mnemonic": "Mnemonic yükleme başarısız", - "Failed to load output descriptor": "Çıktı tanımlayıcısı yüklemesi başarısız", - "Failed to load passphrase": "Parola yükleme başarısız", - "Failed to store mnemonic": "Mnemonic depolama başarısız", - "Fee:": "Ücret:", - "Feed Rate": "Besleme Hızı", - "Filename": "Dosya adı", - "Filename %s exists on SD card, overwrite?": "%s dosya adı SD kartta var, üzerine yazılsın mı?", - "Fill the flash with entropy from camera?": "Flash'ı kameradan gelen entropi ile doldur?", - "Filling Flash": "Flash Dolduruluyor", - "Fingerprint unset in PSBT": "PSBT'de parmak izi ayarı kaldırıldı", - "Firmware exceeds max size: %d": "Donanım yazılımı maksimum boyutu aşıyor: %d", - "Flash Map": "Flash Haritası", - "Flash Tools": "Flash Araçları", - "Flash filled with camera entropy": "Flash kamera entropisi ile dolduruldu", - "Flipped X Coordinates": "X Koordinatları Tersine Çevrildi", - "Flute Diameter": "Flute Çapı", - "Free:": "Boş:", - "From Storage": "Depolamadan Seç", - "Fully erase your SD card in another device to ensure data is unrecoverable": "Verilerin geri kullanılamaz olduğundan emin olmak için SD kartınızı başka bir cihazda tamamen silin", - "Generate Mnemonic": "Mnemonic Oluştur", - "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Bu mnemonic'e özel bir ID verilsin mi? Aksi takdirde mevcut parmak izi kullanılacaktır", - "Go": "Seç", - "Good entropy": "Yeterli entropi", - "Hardware": "Donanım", - "Hex Public Key": "Hex Public Key", - "Hexadecimal": "Onaltılık", - "Hide Mnemonics": "Mnemonic'leri Gizle", - "High fees!": "Yüksek ücret!", - "ID already exists": "ID zaten var", - "Index": "Dizin", - "Index: %s": "Dizin: %s", - "Inputs (%d):": "Girişler (%d):", - "Install?": "Yükle?", - "Insufficient Entropy!": "Yetersiz Entropi!", - "Insufficient entropy": "Yetersiz entropi", - "Invalid Tamper Check Code": "Geçersiz Kurcalama Kontrol Kodu", - "Invalid address": "Geçersiz adres", - "Invalid bootloader": "Geçersiz önyükleyici", - "Invalid mnemonic length": "Geçersiz mnemonic uzunluğu", - "Invalid public key": "Geçersiz public key", - "Invalid wallet:": "Geçersiz cüzdan:", - "Invert": "Ters Çevir", - "Inverted Colors": "Ters Renkler", - "Key": "Anahtar", - "Key was not provided": "Anahtar sağlanmadı", - "Krux Printer Test QR": "Krux Yazıcı Test QR'ı", - "LCD Type": "LCD Tipi", - "Language": "Dil", - "Leave blank if you'd like Krux to pick a valid final word": "Krux'un geçerli bir son kelime seçmesini istiyorsanız boş bırakın", - "Left": "Sol", - "Length: %s": "Uzunluk: %s", - "Line Delay": "Satır Gecikmesi", - "Line:": "Satır:", - "Load Krux app": "Krux uygulamasını yükle", - "Load Mnemonic": "Mnemonic Yükle", - "Load Wallet": "Cüzdan Yükle", - "Load a trusted wallet descriptor to view addresses?": "Adresleri görüntülemek için güvenilir bir cüzdan tanımlayıcısı yüklensin mi?", - "Load from SD card": "SD karttan yükle", - "Load from SD card?": "SD karttan yüklensin mi?", - "Load from camera": "Kameradan yükle", - "Load one?": "Bir tane mi yüklensin?", - "Load?": "Yüklensin mi?", - "Loading Camera..": "Kamera Yükleniyor..", - "Loading change addresses..": "Para üstü adresler yükleniyor..", - "Loading printer..": "Yazıcı yükleniyor..", - "Loading receive addresses..": "Alım adresler yükleniyor..", - "Loading..": "Yükleniyor..", - "Locale": "Yerel", - "Location": "Konum", - "Maximum length exceeded (%s)": "Maksimum uzunluk aşıldı (%s)", - "Message": "Mesaj", - "Message:": "Mesaj:", - "Missing signature file": "İmza dosyası eksik", - "Mnemonic": "Mnemonic", - "Mnemonic ID": "Mnemonic ID", - "Mnemonic and passphrase will be kept.": "Mnemonik ve parola tutulacaktır.", - "Mnemonic was not encrypted": "Mnemonic şifrelenmedi", - "Modified:": "Değiştirildi:", - "Multisig": "Çoklu imza", - "Native Segwit - 84 would be assumed": "Yerel Segwit - 84 varsayılacaktır", - "Network": "Ağ", - "New Mnemonic": "Yeni Mnemonic", - "New firmware detected.": "Yeni donanım yazılımı tespit edildi.", - "No": "Hayır", - "No Passphrase": "Parola Yok", - "Not enough rolls!": "Yeterli zar atışı yok!", - "Numbers": "Numaralar", - "Octal": "Sekizlik", - "Other Formats": "Diğer Formatlar", - "PBKDF2 Iter.": "PBKDF2 Yinelemesi", - "Paint punched dots black so they can be detected.": "İşaretlenmiş noktaları siyaha boyayın ki tespit edilebilsinler.", - "Paper Width": "Kağıt Genişliği", - "Part": "Parça", - "Part Size": "Parça Boyutu", - "Passphrase": "Parola", - "Password Length": "Parola Uzunluğu", - "Path mismatch": "Yol uyuşmazlığı", - "Pattern detected!": "Örüntü algılandı!", - "Permanently remove all stored encrypted mnemonics and settings from flash?": "Tüm depolanmış ve şifrelenmiş mnemonic'ler ve ayarlar flash'tan kalıcı olarak kaldırılsın mı?", - "Persist": "Kalıcı Depolama", - "Pixels deviation index:": "Piksel sapma indeksi:", - "Plaintext QR": "Düz Metin QR'ı", - "Please load a wallet output descriptor": "Lütfen bir cüzdan çıktı tanımlayıcısı yükleyin", - "Plunge Rate": "Dalış Hızı", - "Poor entropy": "Düşük entropi", - "Poor entropy detected!": "Düşük entropi tespit edildi!", - "Print Test QR": "Test QR'ını Yazdır", - "Print Tiny Seed?": "Tiny Seed Yazdırılsın mı?", - "Print to QR": "QR'a Yazdır", - "Print to QR?": "QR'a yazdırılsın mı?", - "Print?": "Yazdırılsın mı?", - "Printer": "Yazıcı", - "Printer Driver not set!": "Yazıcı Sürücüsü ayarlanmadı!", - "Printing..": "Yazdırılıyor..", - "Proceed anyway?": "Yine de devam edilsin mi?", - "Proceed?": "Devam edilsin mi?", - "Processing..": "İşleniyor..", - "QR Code": "QR Kodu", - "RX Pin": "RX Pini", - "Reboot": "Yeniden Başlat", - "Receive": "Al", - "Receive Addresses": "Adresleri Al", - "Region:": "Bölge:", - "Remove %s?": "%s kaldırılsın mı?", - "Remove Mnemonic": "Mnemonic'i Kaldır", - "Remove firmware files from SD Card?": "SD Karttan donanım yazılımı dosyaları kaldırılsın mı?", - "Res. - Format": "Çözünürlüğü Sıfırla", - "Restore factory settings and reboot?": "Fabrika ayarlarına geri dönüp ve yeniden başlatılsın mı?", - "Return to QR Viewer": "QR Görüntüleyiciye Dön", - "Review scanned data, edit if necessary": "Taranan verileri gözden geçirin, gerekirse düzenleyin", - "Right": "Sağ", - "Roll dice at least %d times to generate a mnemonic.": "Bir mnemonic oluşturmak için zarı en az %d kez atın.", - "Rolls distribution:": "Zar atış dağılımı:", - "Rolls:": "Zar atışları:", - "SD card": "SD kart", - "SD card not detected.": "SD kart algılanmadı.", - "SHA256 of rolls:": "Zar atışlarının SHA256'sı:", - "SHA256 of snapshot:": "Snapshot'ın SHA256'sı:", - "Save QR Image to SD Card": "QR Görüntüsünü SD Karta Kaydet", - "Save to SD card": "SD karta kaydet", - "Save to SD card?": "SD karta kaydedilsin mi?", - "Saved to SD card": "SD karta kaydedildi", - "Scale": "Ölçek", - "Scan Address": "Adresi Tara", - "Scan BIP39 Passphrase": "BIP39 Parolasını Tara", - "Scan Key QR Code": "Anahtar QR Kodunu Tara", - "Scanning words 1-12 again": "1-12 kelimeleri tekrar taranıyor", - "Scanning words 13-24": "13-24 kelimeleri taranıyor", - "Screensaver Time": "Ekran Koruyucu Süresi", - "Script Type": "Betik Türü", - "Security": "Güvenlik", - "Self-transfer or Change (%d):": "Kendine-transfer veya Para Üstü (%d):", - "Self-transfer:": "Kendine-transfer:", - "Set a tamper check code first": "Önce bir kurcalama kontrol kodu ayarlayın", - "Settings": "Ayarlar", - "Settings stored internally on flash.": "Ayarlar dahili olarak flaşta saklanır.", - "Settings stored on SD card.": "Ayarlar SD karta kaydedildi.", - "Shannon's Entropy:": "Shannon Entropisi:", - "Shutdown": "Kapat", - "Shutdown Time": "Kapanma Süresi", - "Shutting down..": "Kapatılıyor..", - "Sign": "İmzala", - "Sign to QR code": "QR koduna imzala", - "Sign to SD card": "SD karta imzala", - "Sign?": "İmzalansın mı?", - "Signature": "İmza", - "Signed Message": "İmzalı Mesaj", - "Signed PSBT": "İmzalı PSBT", - "Signing..": "İmzalanıyor..", - "Single-sig": "Tek-imza", - "Size:": "Boyut:", - "Some checks cannot be performed.": "Bazı kontroller yerine getirilemedi.", - "Spend (%d):": "Harcama (%d):", - "Spend:": "Harcama:", - "Stats for Nerds": "İnekler İçin İstatistikler", - "Store on Flash": "Flash'ta Sakla", - "Store on SD Card": "SD Kartta Sakla", - "Swipe to change mode": "Modu değiştirmek için kaydırın", - "TC Flash Hash": "TC Flash Hash", - "TC Flash Hash at Boot": "Önyüklemede TC Flash Hash", - "TOUCH or ENTER to capture": "Yakalamak için DOKUN veya GİR", - "TX Pin": "TX Pini", - "Tamper Check Code": "Kurcalama Kontrol Kodu", - "Tamper check code set successfully": "Kurcalama kontrol kodu başarıyla ayarlandı", - "Tamper check codes do not match": "Kurcalama kontrol kodları eşleşmiyor", - "Text": "Metin", - "Theme": "Tema", - "Thermal": "Termal", - "To ensure data is unrecoverable use Wipe Device feature": "Verilerin geri kullanılamaz olduğundan emin olmak için Cihazı Sil özelliğini kullanın", - "Toggle Brightness": "Parlaklığı Değiştir", - "Tools": "Araçlar", - "Touch Threshold": "Dokunma Eşiği", - "Touchscreen": "Dokunmatik ekran", - "Try more?": "Daha fazla kez denensin mi?", - "Type BIP39 Passphrase": "BIP39 parolasını yazın", - "Type Key": "Anahtar Yaz", - "Unit": "Birim", - "Upgrade complete.": "Güncelleme tamamlandı.", - "Use a black background surface.": "Siyah bir arka plan yüzeyi kullanın.", - "Use camera's entropy to create a new mnemonic": "Yeni bir mnemonic oluşturmak için kameranın entropisini kullanın", - "Used:": "Kullanılan:", - "User's Data": "Kullanıcı", - "Value %s out of range: [%s, %s]": "%s değeri aralık dışında: [%s, %s]", - "Value must be multiple of %s": "Değer %s'nin katı olmalıdır", - "Verifying..": "Doğrulanıyor..", - "Version": "Sürüm", - "Via Camera": "Kamera Aracılığıyla", - "Via D20": "D20 Aracılığıyla", - "Via D6": "D6 Aracılığıyla", - "Via Manual Input": "Manuel Giriş Aracılığıyla", - "Via Words": "Sözcüklerle", - "Wait for the capture": "Yakalamanın tamamlanmasını bekleyin", - "Wallet": "Cüzdan", - "Wallet Descriptor": "Cüzdan Tanımlayıcısı", - "Wallet output descriptor": "Cüzdan çıktı tanımlayıcısı", - "Wallet output descriptor loaded!": "Cüzdan çıktı tanımlayıcısı yüklendi!", - "Wallet output descriptor not found.": "Cüzdan çıktı tanımlayıcısı bulunamadı.", - "Warning:": "Uyarı:", - "Word %d": "Kelime %d", - "Word Numbers": "Kelime Numaraları", - "Words": "Kelimeler", - "Yes": "Evet", - "is a valid address!": "geçerli bir adres!", - "was NOT FOUND in the first %d addresses": "ilk %d adreste BULUNAMADI" -} \ No newline at end of file +{"% of the amount.": "tutarın %'si.", "%d of %d multisig": "%d / %d çoklu imza", "%d to %d": "%d to %d", "%s removed.": "%s kaldırıldı.", "(%d total)": "(toplam %d)", "(Experimental)": "(Deneysel)", "(watch-only)": "(sadece izle)", "12 words": "12 kelime", "24 words": "24 kelime", "About": "Hakkında", "Accept assumption?": "Varsayım kabul edilsin mi?", "Account": "Hesap", "Account #0 would be assumed": "#0 numaralı hesap varsayılacaktır", "Account Index": "Hesap Endeksi", "Add or change wallet passphrase?": "Cüzdan parolası eklensin mi veya değiştirilsin mi?", "Additional entropy from camera required for AES-CBC mode": "AES-CBC modu için kameradan ek entropi gereklidir", "Address": "Adres", "Align camera and backup plate properly.": "Kamerayı ve yedek plakay'ı düzgün bir şekilde hizalayın.", "Allow in settings first!": "Önce ayarlarda izin ver!", "Anti-glare disabled": "Parlama önleyici devre dışı", "Anti-glare enabled": "Parlama önleyici etkin", "Appearance": "Görünüm", "Are you sure?": "Emin misiniz?", "BGR Colors": "BGR Renkleri", "BIP39 Mnemonic": "BIP39 Anımsatıcı", "Back": "Geri", "Back to Menu": "Menüye Dön", "Backup Mnemonic": "Yedek Mnemonic", "Bad signature": "Geçersiz imza", "Base64 Password": "Base64 Parola", "Baudrate": "Baud Hızı", "Binary Grid": "İkili Izgara", "Border Padding": "Kenarlık Dolgusu", "Brightness": "Parlaklık", "Buttons": "Butonlar", "Buttons Debounce": "Buton Geri-sekmesi", "Capture cancelled": "Yakalama iptal edildi", "Change": "Para Üstü", "Change Addresses": "Para Üstü Adresleri", "Change theme and reboot?": "Temayı değiştir ve yeniden başlat?", "Change:": "Para Üstü:", "Changes will last until shutdown.": "Değişiklikler kapanışa kadar devam edecek.", "Check SD Card": "SD Kartı Kontrol Et", "Check that address belongs to this wallet?": "Bu adresin, bu cüzdana ait olduğunu kontrol et?", "Checked %d addresses with no matches.": "Eşleşmeyen %d adres kontrol edildi.", "Checking for SD card..": "SD kart kontrol ediliyor..", "Confirm Tamper Check Code": "Kurcalama Kontrol Kodunu Onayla", "Create QR Code": "QR Kodu Oluştur", "Create QR code from text?": "Metinden QR kodu oluşturulsun mu?", "Created:": "Oluşturuldu:", "Current Tamper Check Code": "Mevcut Kurcalama Kontrol Kodu", "Custom QR Code": "Özel QR Kodu", "Customize": "Özelleştir", "Customizing your wallet will generate a new Key.": "Cüzdanınızı özelleştirmek yeni bir Anahtar oluşturacaktır.", "Cut Depth": "Kesim Derinliği", "Cut Method": "Kesim Yöntemi", "Decimal": "Ondalık", "Decrypt?": "Şifre çözülsün mü?", "Default Wallet": "Varsayılan Cüzdan", "Depth Per Pass": "Geçiş Başına Derinlik", "Derive BIP85 entropy?": "BIP85 entropisi türetilsin mi?", "Descriptor Addresses": "Tanımlayıcı Adresler", "Display": "Ekran", "Do not power off, it may take a while to complete.": "Kapatmayın, tamamlanması biraz zaman alabilir.", "Done?": "Tamamlandı mı?", "Double mnemonic": "Çifte anımsatıcı", "Driver": "Sürücü", "Empty": "Boş", "Enable Krux apps": "Krux uygulamalarını etkinleştir", "Encrypted": "Şifrelenmiş", "Encrypted QR Code": "Şifrelenmiş QR Kodu", "Encrypted mnemonic was not stored": "Şifrelenmiş mnemonic depolanmadı", "Encrypted mnemonic was stored with ID:": "Şifrelenmiş mnemonic ID ile depolandı:", "Encryption": "Şifreleme", "Encryption Mode": "Şifreleme Modu", "Enter %d BIP-39 words.": "%d BIP-39 kelime girin.", "Enter a 6+ characters Tamper Check Code": "6+ karakterlik bir Kurcalama Kontrol Kodu girin", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "BIP-39 mnemonic'inizin her kelimesini 1'den 2048'e kadar bir sayı olarak girin.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "BIP-39 mnemonic'inizin her kelimesini 1'den 800'e kadar onaltılık bir sayı olarak girin.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "BIP-39 mnemonic'inizin her kelimesini 1'den 4000'e kadar sekizlik bir sayı olarak girin.", "Enter each word of your BIP-39 mnemonic.": "BIP-39 mnemonic'inizin her kelimesini girin.", "Erase User's Data": "Kullanıcı Verilerini Sil", "Erasing user's data..": "Kullanıcının verileri siliniyor..", "Error:": "Hata:", "Esc": "Çıkış", "Execute a signed Krux app?": "İmzalı bir Krux uygulaması çalıştırılsın mı?", "Explore files?": "Dosyaları ara?", "Exporting to SD card..": "SD karta aktarılıyor..", "Extended Public Key": "Genişletilmiş Public Key", "Factory Settings": "Fabrika Ayarları", "Failed to decrypt": "Şifre çözme başarısız", "Failed to load PSBT": "PSBT yükleme başarısız", "Failed to load address": "Adres yükleme başarısız", "Failed to load key": "Anahtar yükleme başarısız", "Failed to load message": "Mesaj yükleme başarısız", "Failed to load mnemonic": "Mnemonic yükleme başarısız", "Failed to load output descriptor": "Çıktı tanımlayıcısı yüklemesi başarısız", "Failed to load passphrase": "Parola yükleme başarısız", "Failed to store mnemonic": "Mnemonic depolama başarısız", "Fee:": "Ücret:", "Feed Rate": "Besleme Hızı", "Filename": "Dosya adı", "Filename %s exists on SD card, overwrite?": "%s dosya adı SD kartta var, üzerine yazılsın mı?", "Fill the flash with entropy from camera?": "Flash'ı kameradan gelen entropi ile doldur?", "Filling Flash": "Flash Dolduruluyor", "Fingerprint unset in PSBT": "PSBT'de parmak izi ayarı kaldırıldı", "Firmware exceeds max size: %d": "Donanım yazılımı maksimum boyutu aşıyor: %d", "Flash Map": "Flash Haritası", "Flash Tools": "Flash Araçları", "Flash filled with camera entropy": "Flash kamera entropisi ile dolduruldu", "Flipped X Coordinates": "X Koordinatları Tersine Çevrildi", "Flute Diameter": "Flute Çapı", "Free:": "Boş:", "From Storage": "Depolamadan Seç", "Fully erase your SD card in another device to ensure data is unrecoverable": "Verilerin geri kullanılamaz olduğundan emin olmak için SD kartınızı başka bir cihazda tamamen silin", "Generate Mnemonic": "Mnemonic Oluştur", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Bu mnemonic'e özel bir ID verilsin mi? Aksi takdirde mevcut parmak izi kullanılacaktır", "Go": "Seç", "Good entropy": "Yeterli entropi", "Hardware": "Donanım", "Hex Public Key": "Hex Public Key", "Hexadecimal": "Onaltılık", "Hide Mnemonics": "Mnemonic'leri Gizle", "High fees!": "Yüksek ücret!", "ID already exists": "ID zaten var", "Index": "Dizin", "Index: %s": "Dizin: %s", "Inputs (%d):": "Girişler (%d):", "Install?": "Yükle?", "Insufficient Entropy!": "Yetersiz Entropi!", "Insufficient entropy": "Yetersiz entropi", "Invalid Tamper Check Code": "Geçersiz Kurcalama Kontrol Kodu", "Invalid address": "Geçersiz adres", "Invalid bootloader": "Geçersiz önyükleyici", "Invalid mnemonic length": "Geçersiz mnemonic uzunluğu", "Invalid public key": "Geçersiz public key", "Invalid wallet:": "Geçersiz cüzdan:", "Invert": "Ters Çevir", "Inverted Colors": "Ters Renkler", "Key": "Anahtar", "Key was not provided": "Anahtar sağlanmadı", "Krux Printer Test QR": "Krux Yazıcı Test QR'ı", "LCD Type": "LCD Tipi", "Language": "Dil", "Leave blank if you'd like Krux to pick a valid final word": "Krux'un geçerli bir son kelime seçmesini istiyorsanız boş bırakın", "Left": "Sol", "Length: %s": "Uzunluk: %s", "Line Delay": "Satır Gecikmesi", "Line:": "Satır:", "Load Krux app": "Krux uygulamasını yükle", "Load Mnemonic": "Mnemonic Yükle", "Load Wallet": "Cüzdan Yükle", "Load a trusted wallet descriptor to view addresses?": "Adresleri görüntülemek için güvenilir bir cüzdan tanımlayıcısı yüklensin mi?", "Load from SD card": "SD karttan yükle", "Load from SD card?": "SD karttan yüklensin mi?", "Load from camera": "Kameradan yükle", "Load one?": "Bir tane mi yüklensin?", "Load?": "Yüklensin mi?", "Loading Camera..": "Kamera Yükleniyor..", "Loading change addresses..": "Para üstü adresler yükleniyor..", "Loading printer..": "Yazıcı yükleniyor..", "Loading receive addresses..": "Alım adresler yükleniyor..", "Loading..": "Yükleniyor..", "Locale": "Yerel", "Location": "Konum", "Maximum length exceeded (%s)": "Maksimum uzunluk aşıldı (%s)", "Message": "Mesaj", "Message:": "Mesaj:", "Missing signature file": "İmza dosyası eksik", "Mnemonic": "Mnemonic", "Mnemonic ID": "Mnemonic ID", "Mnemonic and passphrase will be kept.": "Mnemonik ve parola tutulacaktır.", "Mnemonic was not encrypted": "Mnemonic şifrelenmedi", "Modified:": "Değiştirildi:", "Multisig": "Çoklu imza", "Native Segwit - 84 would be assumed": "Yerel Segwit - 84 varsayılacaktır", "Network": "Ağ", "New Mnemonic": "Yeni Mnemonic", "New firmware detected.": "Yeni donanım yazılımı tespit edildi.", "No": "Hayır", "No Passphrase": "Parola Yok", "Not enough rolls!": "Yeterli zar atışı yok!", "Numbers": "Numaralar", "Octal": "Sekizlik", "Other Formats": "Diğer Formatlar", "PBKDF2 Iter.": "PBKDF2 Yinelemesi", "Paint punched dots black so they can be detected.": "İşaretlenmiş noktaları siyaha boyayın ki tespit edilebilsinler.", "Paper Width": "Kağıt Genişliği", "Part": "Parça", "Part Size": "Parça Boyutu", "Passphrase": "Parola", "Password Length": "Parola Uzunluğu", "Path mismatch": "Yol uyuşmazlığı", "Pattern detected!": "Örüntü algılandı!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "Tüm depolanmış ve şifrelenmiş mnemonic'ler ve ayarlar flash'tan kalıcı olarak kaldırılsın mı?", "Persist": "Kalıcı Depolama", "Pixels deviation index:": "Piksel sapma indeksi:", "Plaintext QR": "Düz Metin QR'ı", "Please load a wallet output descriptor": "Lütfen bir cüzdan çıktı tanımlayıcısı yükleyin", "Plunge Rate": "Dalış Hızı", "Poor entropy": "Düşük entropi", "Poor entropy detected!": "Düşük entropi tespit edildi!", "Print Test QR": "Test QR'ını Yazdır", "Print Tiny Seed?": "Tiny Seed Yazdırılsın mı?", "Print to QR": "QR'a Yazdır", "Print to QR?": "QR'a yazdırılsın mı?", "Print?": "Yazdırılsın mı?", "Printer": "Yazıcı", "Printer Driver not set!": "Yazıcı Sürücüsü ayarlanmadı!", "Printing..": "Yazdırılıyor..", "Proceed anyway?": "Yine de devam edilsin mi?", "Proceed?": "Devam edilsin mi?", "Processing..": "İşleniyor..", "QR Code": "QR Kodu", "RX Pin": "RX Pini", "Reboot": "Yeniden Başlat", "Receive": "Al", "Receive Addresses": "Adresleri Al", "Region:": "Bölge:", "Remove %s?": "%s kaldırılsın mı?", "Remove Mnemonic": "Mnemonic'i Kaldır", "Remove firmware files from SD Card?": "SD Karttan donanım yazılımı dosyaları kaldırılsın mı?", "Res. - Format": "Çözünürlüğü Sıfırla", "Restore factory settings and reboot?": "Fabrika ayarlarına geri dönüp ve yeniden başlatılsın mı?", "Return to QR Viewer": "QR Görüntüleyiciye Dön", "Review scanned data, edit if necessary": "Taranan verileri gözden geçirin, gerekirse düzenleyin", "Right": "Sağ", "Roll dice at least %d times to generate a mnemonic.": "Bir mnemonic oluşturmak için zarı en az %d kez atın.", "Rolls distribution:": "Zar atış dağılımı:", "Rolls:": "Zar atışları:", "SD card": "SD kart", "SD card not detected.": "SD kart algılanmadı.", "SHA256 of rolls:": "Zar atışlarının SHA256'sı:", "SHA256 of snapshot:": "Snapshot'ın SHA256'sı:", "Save QR Image to SD Card": "QR Görüntüsünü SD Karta Kaydet", "Save to SD card": "SD karta kaydet", "Save to SD card?": "SD karta kaydedilsin mi?", "Saved to SD card": "SD karta kaydedildi", "Scale": "Ölçek", "Scan Address": "Adresi Tara", "Scan BIP39 Passphrase": "BIP39 Parolasını Tara", "Scan Key QR Code": "Anahtar QR Kodunu Tara", "Scanning words 1-12 again": "1-12 kelimeleri tekrar taranıyor", "Scanning words 13-24": "13-24 kelimeleri taranıyor", "Screensaver Time": "Ekran Koruyucu Süresi", "Script Type": "Betik Türü", "Security": "Güvenlik", "Self-transfer or Change (%d):": "Kendine-transfer veya Para Üstü (%d):", "Self-transfer:": "Kendine-transfer:", "Set a tamper check code first": "Önce bir kurcalama kontrol kodu ayarlayın", "Settings": "Ayarlar", "Settings stored internally on flash.": "Ayarlar dahili olarak flaşta saklanır.", "Settings stored on SD card.": "Ayarlar SD karta kaydedildi.", "Shannon's Entropy:": "Shannon Entropisi:", "Shutdown": "Kapat", "Shutdown Time": "Kapanma Süresi", "Shutting down..": "Kapatılıyor..", "Sign": "İmzala", "Sign to QR code": "QR koduna imzala", "Sign to SD card": "SD karta imzala", "Sign?": "İmzalansın mı?", "Signature": "İmza", "Signed Message": "İmzalı Mesaj", "Signed PSBT": "İmzalı PSBT", "Signing..": "İmzalanıyor..", "Single-sig": "Tek-imza", "Size:": "Boyut:", "Some checks cannot be performed.": "Bazı kontroller yerine getirilemedi.", "Spend (%d):": "Harcama (%d):", "Spend:": "Harcama:", "Stats for Nerds": "İnekler İçin İstatistikler", "Store on Flash": "Flash'ta Sakla", "Store on SD Card": "SD Kartta Sakla", "Swipe to change mode": "Modu değiştirmek için kaydırın", "TC Flash Hash": "TC Flash Hash", "TC Flash Hash at Boot": "Önyüklemede TC Flash Hash", "TOUCH or ENTER to capture": "Yakalamak için DOKUN veya GİR", "TX Pin": "TX Pini", "Tamper Check Code": "Kurcalama Kontrol Kodu", "Tamper check code set successfully": "Kurcalama kontrol kodu başarıyla ayarlandı", "Tamper check codes do not match": "Kurcalama kontrol kodları eşleşmiyor", "Text": "Metin", "Theme": "Tema", "Thermal": "Termal", "To ensure data is unrecoverable use Wipe Device feature": "Verilerin geri kullanılamaz olduğundan emin olmak için Cihazı Sil özelliğini kullanın", "Toggle Brightness": "Parlaklığı Değiştir", "Tools": "Araçlar", "Touch Threshold": "Dokunma Eşiği", "Touchscreen": "Dokunmatik ekran", "Try more?": "Daha fazla kez denensin mi?", "Type BIP39 Passphrase": "BIP39 parolasını yazın", "Type Key": "Anahtar Yaz", "Unit": "Birim", "Upgrade complete.": "Güncelleme tamamlandı.", "Use a black background surface.": "Siyah bir arka plan yüzeyi kullanın.", "Use camera's entropy to create a new mnemonic": "Yeni bir mnemonic oluşturmak için kameranın entropisini kullanın", "Used:": "Kullanılan:", "User's Data": "Kullanıcı", "Value %s out of range: [%s, %s]": "%s değeri aralık dışında: [%s, %s]", "Value must be multiple of %s": "Değer %s'nin katı olmalıdır", "Verifying..": "Doğrulanıyor..", "Version": "Sürüm", "Via Camera": "Kamera Aracılığıyla", "Via D20": "D20 Aracılığıyla", "Via D6": "D6 Aracılığıyla", "Via Manual Input": "Manuel Giriş Aracılığıyla", "Via Words": "Sözcüklerle", "Wait for the capture": "Yakalamanın tamamlanmasını bekleyin", "Wallet": "Cüzdan", "Wallet Descriptor": "Cüzdan Tanımlayıcısı", "Wallet output descriptor": "Cüzdan çıktı tanımlayıcısı", "Wallet output descriptor loaded!": "Cüzdan çıktı tanımlayıcısı yüklendi!", "Wallet output descriptor not found.": "Cüzdan çıktı tanımlayıcısı bulunamadı.", "Warning:": "Uyarı:", "Word %d": "Kelime %d", "Word Numbers": "Kelime Numaraları", "Words": "Kelimeler", "Yes": "Evet", "is a valid address!": "geçerli bir adres!", "was NOT FOUND in the first %d addresses": "ilk %d adreste BULUNAMADI"} \ No newline at end of file diff --git a/i18n/translations/vi-VN.json b/i18n/translations/vi-VN.json index 556ff0db7..c7b94ce21 100644 --- a/i18n/translations/vi-VN.json +++ b/i18n/translations/vi-VN.json @@ -1,323 +1 @@ -{ - "% of the amount.": "% của số tiền.", - "%d of %d multisig": "%d của %d đa chữ kí", - "%d to %d": "%d đến %d", - "%s removed.": "%s Đã bỏ.", - "(%d total)": "(tổng cộng %d)", - "(Experimental)": "(Thực nghiệm)", - "(watch-only)": "(chỉ xem)", - "12 words": "12 từ", - "24 words": "24 từ", - "About": "Về chúng tôi", - "Accept assumption?": "Chấp nhận giả định?", - "Account": "Tài khoản", - "Account #0 would be assumed": "Tài khoản #0 sẽ được giả định", - "Account Index": "Chỉ mục tài khoản", - "Add or change wallet passphrase?": "Thêm hoặc thay đổi cụm mật khẩu ví?", - "Additional entropy from camera required for AES-CBC mode": "Cần thêm entropy từ camera cho chế độ AES-CBC", - "Address": "Địa chỉ", - "Align camera and backup plate properly.": "Căn chỉnh camera và tấm dự phòng đúng cách.", - "Allow in settings first!": "Cho phép cài đặt trước!", - "Anti-glare disabled": "Chống lóa bị vô hiệu hóa", - "Anti-glare enabled": "Đã bật chống lóa", - "Appearance": "Giao diện", - "Are you sure?": "Bạn có chắc không?", - "BGR Colors": "Màu BGR", - "BIP39 Mnemonic": "Từ gợi nhớ BIP39", - "Back": "Trở lại", - "Back to Menu": "Quay lại Menu", - "Backup Mnemonic": "Sao lưu Mnemonic", - "Bad signature": "Chữ ký xấu", - "Base64 Password": "Mật khẩu Base64", - "Baudrate": "Tốc độ baud", - "Binary Grid": "Lưới nhị phân", - "Border Padding": "Đệm viền", - "Brightness": "Độ sáng", - "Buttons": "Nút", - "Buttons Debounce": "Loại bỏ nhiễu nút", - "Capture cancelled": "Hủy chụp hình", - "Change": "Thay đổi", - "Change Addresses": "Các địa chỉ tiền thối", - "Change theme and reboot?": "Thay đổi giao diện và khởi động lại?", - "Change:": "Thay đổi:", - "Changes will last until shutdown.": "Thay đổi sẽ kéo dài cho đến khi tắt máy.", - "Check SD Card": "Kiểm tra thẻ SD", - "Check that address belongs to this wallet?": "Kiểm tra địa chỉ đó có thuộc về ví này không?", - "Checked %d addresses with no matches.": "Đã kiểm tra %d địa chỉ không khớp.", - "Checking for SD card..": "Kiểm tra thẻ SD..", - "Confirm Tamper Check Code": "Xác nhận mã kiểm tra giả mạo", - "Could not execute %s": "Không thể thực thi %s", - "Create QR Code": "Tạo mã QR", - "Create QR code from text?": "Tạo mã QR từ văn bản?", - "Created:": "Tạo:", - "Current Tamper Check Code": "Mã kiểm tra giả mạo hiện tại", - "Custom QR Code": "Mã QR tùy chỉnh", - "Customize": "Tùy chỉnh", - "Customizing your wallet will generate a new Key.": "Tùy chỉnh ví của bạn sẽ tạo một Khóa mới.", - "Cut Depth": "Chiều sâu cắt", - "Cut Method": "Phương pháp cắt", - "Decimal": "Số thập phân", - "Decrypt?": "Giải mã?", - "Default Wallet": "Ví mặc định", - "Depth Per Pass": "Độ sâu mỗi lần cắt CNC", - "Derive BIP85 entropy?": "Suy ra entropy BIP85?", - "Descriptor Addresses": "Địa chỉ người mô tả", - "Display": "Hiển thị", - "Do not power off, it may take a while to complete.": "Không được tắt máy, có thể mất một lúc để hoàn thành.", - "Done?": "Hoàn tất?", - "Double mnemonic": "Từ gợi nhớ kép", - "Driver": "Driver", - "Empty": "Trống", - "Enable Krux apps": "Bật ứng dụng Krux", - "Encrypted": "Đã mã hóa", - "Encrypted QR Code": "Mã QR được mã hóa", - "Encrypted mnemonic was not stored": "Mnemonic được mã hóa không được lưu trữ", - "Encrypted mnemonic was stored with ID:": "Mnemonic được mã hóa không được lưu trữ với ID:", - "Encryption": "Mã hóa", - "Encryption Mode": "Chế độ mã hóa", - "Enter %d BIP-39 words.": "Nhập %d từ BIP-39.", - "Enter a 6+ characters Tamper Check Code": "Nhập mã kiểm tra giả mạo gồm hơn 6 ký tự", - "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Nhập từng từ của Mnemonic BIP-39 của bạn dưới dạng số từ 1 đến 2048.", - "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số thập lục phân từ 1 đến 800.", - "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số bát phân từ 1 đến 4000.", - "Enter each word of your BIP-39 mnemonic.": "Nhập từng từ của Mnemonic BIP-39 của bạn.", - "Erase User's Data": "Xóa dữ liệu của người dùng", - "Erasing user's data..": "Đang xóa dữ liệu của người dùng..", - "Error:": "Lỗi:", - "Esc": "Esc", - "Execute a signed Krux app?": "Thực thi một ứng dụng Krux đã ký?", - "Explore files?": "Khám phá các tập tin?", - "Exporting to SD card..": "Xuất vào thẻ SD ..", - "Extended Public Key": "Khóa công cộng", - "Factory Settings": "Cài đặt Gốc", - "Failed to decrypt": "Không giải mã được", - "Failed to load PSBT": "Tải PSBT thất bại", - "Failed to load address": "Tải địa chỉ thất bại", - "Failed to load key": "Không tải được khóa", - "Failed to load message": "Không tải được tin nhắn", - "Failed to load mnemonic": "Tải mã Mnemonic thất bại", - "Failed to load output descriptor": "Không tải được bộ mô tả đầu ra", - "Failed to load passphrase": "Không tải được cụm mật khẩu", - "Failed to store mnemonic": "Không lưu trữ Mnemonic được", - "Fee:": "Phí:", - "Feed Rate": "Tốc độ cắt CNC", - "Filename": "Tên tệp", - "Filename %s exists on SD card, overwrite?": "Tên tệp %s tồn tại trên thẻ SD, ghi đè lên?", - "Fill the flash with entropy from camera?": "Điền vào flash với entropy từ máy ảnh?", - "Filling Flash": "Đèn Flash Đổ Đầy", - "Fingerprint unset in PSBT": "Bỏ dấu vân tay trong PSBT", - "Firmware exceeds max size: %d": "Phần mềm vượt quá kích thước tối đa: %d", - "Flash Map": "Bản đồ Flash", - "Flash Tools": "Công cụ Flash", - "Flash filled with camera entropy": "Đèn flash chứa đầy entropy của máy ảnh", - "Flipped X Coordinates": "Tọa độ X bị lật", - "Flute Diameter": "Đường kính mũi cắt CNC", - "Free:": "Khả dụng:", - "From Storage": "Từ bộ lưu trữ", - "Fully erase your SD card in another device to ensure data is unrecoverable": "Xóa hoàn toàn thẻ SD trong một thiết bị khác để đảm bảo dữ liệu không thể phục hồi", - "Generate Mnemonic": "Tạo Mnemonic", - "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Cung cấp cho Mnemonic này một ID tùy chỉnh? Nếu không thì fingerprint hiện tại sẽ được sử dụng", - "Go": "Chọn", - "Good entropy": "Entropy tốt", - "Hardware": "Phần cứng", - "Hex Public Key": "Khóa công cộng Hex", - "Hexadecimal": "Thập lục phân", - "Hide Mnemonics": "Ẩn Mnemonics", - "High fees!": "Phí cao!", - "ID already exists": "Id đã tồn tại", - "Index": "Chỉ mục", - "Index: %s": "Chỉ mục: %s", - "Inputs (%d):": "Đầu vào (%d):", - "Install?": "Cài đặt phần mềm?", - "Insufficient Entropy!": "Entropy không đủ!", - "Insufficient entropy": "Không đủ entropy", - "Invalid Tamper Check Code": "Mã kiểm tra giả mạo không hợp lệ", - "Invalid address": "Địa chỉ không hợp lệ", - "Invalid bootloader": "Bộ tải khởi động không hợp lệ", - "Invalid mnemonic length": "Độ dài mã Mnemonic không hợp lệ", - "Invalid public key": "Khóa công cộng không hợp lệ", - "Invalid wallet:": "Ví không hợp lệ:", - "Invert": "Đảo ngược", - "Inverted Colors": "Màu đảo ngược", - "Key": "Chìa khóa", - "Key was not provided": "Khóa không được cung cấp", - "Krux Printer Test QR": "QR kiểm tra máy in Krux", - "LCD Type": "Loại LCD", - "Language": "Ngôn ngữ", - "Leave blank if you'd like Krux to pick a valid final word": "Để trống nếu bạn muốn Krux chọn một từ cuối cùng hợp lệ", - "Left": "Trái", - "Length: %s": "Độ dài: %s", - "Line Delay": "Độ trễ Dòng", - "Line:": "Đường kẻ:", - "Load Krux app": "Tải ứng dụng Krux", - "Load Mnemonic": "Tải mã mnemonic", - "Load Wallet": "Nạp Ví", - "Load a trusted wallet descriptor to view addresses?": "Tải mô tả ví đáng tin cậy để xem địa chỉ?", - "Load from SD card": "Tải từ thẻ SD", - "Load from SD card?": "Tải từ thẻ SD?", - "Load from camera": "Tải từ máy ảnh", - "Load one?": "Tải một?", - "Load?": "Tải?", - "Loading Camera..": "Đang tải máy ảnh..", - "Loading change addresses..": "Đang tải địa chỉ tiền thối..", - "Loading printer..": "Đang tải máy in ..", - "Loading receive addresses..": "Đang tải địa chỉ nhận..", - "Loading..": "Đang tải..", - "Locale": "Ngôn ngữ", - "Location": "Vị trí lưu", - "Maximum length exceeded (%s)": "Chiều dài tối đa vượt quá (%s)", - "Message": "Tin nhắn", - "Message:": "Tin nhắn:", - "Missing signature file": "Thiếu tập tin chữ ký", - "Mnemonic": "Mã mnemonic", - "Mnemonic ID": "Mnemonic ID ", - "Mnemonic and passphrase will be kept.": "Từ gợi nhớ và cụm mật khẩu sẽ được lưu giữ.", - "Mnemonic was not encrypted": "Mnemonic không được mã hóa", - "Modified:": "Đã sửa đổi:", - "Multisig": "Đa chữ kí", - "Native Segwit - 84 would be assumed": "Native Segwit - 84 sẽ được giả định", - "Network": "Mạng lưới", - "New Mnemonic": "Mnemonic mới", - "New firmware detected.": "Phát hiện phần sụn mới.", - "No": "Không", - "No Passphrase": "Không có cụm mật khẩu", - "Not enough rolls!": "Không đủ số lần quay!", - "Numbers": "Số", - "Octal": "Bát phân", - "Other Formats": "Các định dạng khác", - "PBKDF2 Iter.": "Lặp lại PBKDF2", - "Paint punched dots black so they can be detected.": "Tô các chấm đục lỗ màu đen để chúng có thể được phát hiện.", - "Paper Width": "Chiều rộng giấy", - "Part": "Phần", - "Part Size": "Kích thước một phần", - "Passphrase": "Cụm mật khẩu", - "Password Length": "Độ dài mật khẩu tối thiểu:", - "Path mismatch": "Đường dẫn không khớp", - "Pattern detected!": "Đã phát hiện mẫu!", - "Permanently remove all stored encrypted mnemonics and settings from flash?": "Xóa vĩnh viễn mọi Mnemonics và cài đặt được mã hóa lưu trữ trong flash?", - "Persist": "Vị trí lưu", - "Pixels deviation index:": "Chỉ số độ lệch điểm ảnh:", - "Plaintext QR": "QR dạng văn bản", - "Please load a wallet output descriptor": "Vui lòng tải bộ mô tả đầu ra ví", - "Plunge Rate": "Tỷ lệ sụt giảm", - "Poor entropy": "Entropy kém", - "Poor entropy detected!": "Phát hiện entropy yếu!", - "Print Test QR": "In kiểm tra QR", - "Print Tiny Seed?": "In Tiny Seed?", - "Print to QR": "In ra QR", - "Print to QR?": "In ra mã QR?", - "Print?": "In?", - "Printer": "Máy in", - "Printer Driver not set!": "Trình điều khiển máy in chưa được cài đặt!", - "Printing..": "Đang in..", - "Proceed anyway?": "Vẫn tiếp tục?", - "Proceed?": "Thực hiện?", - "Processing..": "Đang xử lý..", - "QR Code": "Mã QR", - "RX Pin": "RX Pin", - "Reboot": "Khởi động lại", - "Receive": "Nhận được", - "Receive Addresses": "Các địa chỉ nhận", - "Region:": "Vùng:", - "Remove %s?": "Xóa %s?", - "Remove Mnemonic": "Xóa Mnemonic", - "Remove firmware files from SD Card?": "Xóa các tệp firmware khỏi Thẻ SD?", - "Res. - Format": "Độ phân giải - Định dạng", - "Restore factory settings and reboot?": "Khôi phục cài đặt gốc và khởi động lại?", - "Return to QR Viewer": "Quay lại Trình xem QR", - "Review scanned data, edit if necessary": "Xem lại dữ liệu đã quét, chỉnh sửa nếu cần", - "Right": "Phải", - "Roll dice at least %d times to generate a mnemonic.": "Lăn xúc xắc ít nhất %d lần để tạo Mnemonic.", - "Rolls distribution:": "Phân bổ xúc xắc:", - "Rolls:": "Tổng số lần quay xúc xắc:", - "SD card": "Thẻ SD", - "SD card not detected.": "Thẻ SD không được phát hiện.", - "SHA256 of rolls:": "SHA256 của xúc xắc:", - "SHA256 of snapshot:": "Sha256 của ảnh chụp:", - "Save QR Image to SD Card": "Lưu Ảnh QR vào Thẻ SD", - "Save to SD card": "Lưu vào thẻ SD", - "Save to SD card?": "Lưu vào thẻ SD?", - "Saved to SD card": "Đã lưu vào thẻ SD", - "Scale": "Tỉ lệ", - "Scan Address": "Quét địa chỉ", - "Scan BIP39 Passphrase": "Quét cụm mật khẩu BIP39", - "Scan Key QR Code": "Quét mã QR khóa", - "Scanning words 1-12 again": "Đang quét lại từ 1-12", - "Scanning words 13-24": "Đang quét từ 13-24", - "Screensaver Time": "Thời gian chế độ bảo vệ màn hình", - "Script Type": "Kiểu văn lệnh", - "Security": "Bảo mật", - "Self-transfer or Change (%d):": "Tự chuyển nhượng hoặc giao dịch (%d):", - "Self-transfer:": "Tự chuyển nhượng:", - "Set a tamper check code first": "Đặt mã kiểm tra giả mạo trước", - "Settings": "Cài đặt", - "Settings stored internally on flash.": "Cài đặt được lưu trữ nội bộ trên đèn flash.", - "Settings stored on SD card.": "Cài đặt được lưu trên thẻ SD.", - "Shannon's Entropy:": "Entropy của Shannon:", - "Shutdown": "Tắt máy", - "Shutdown Time": "Thời gian tắt máy", - "Shutting down..": "Đang tắt..", - "Sign": "Chữ kí", - "Sign to QR code": "Ký vào mã QR", - "Sign to SD card": "Ký vào thẻ SD", - "Sign?": "Kí?", - "Signature": "Chữ ký", - "Signed Message": "Tin nhắn đã ký", - "Signed PSBT": "Đã ký PSBT", - "Signing..": "Đang ký..", - "Single-sig": "Khóa đơn", - "Size:": "Dung lượng:", - "Some checks cannot be performed.": "Một số kiểm tra không thể được thực hiện.", - "Spend (%d):": "Chi tiêu (%d):", - "Spend:": "Chi tiêu:", - "Stats for Nerds": "Số liệu thống kê cho Mọt sách", - "Store on Flash": "Lưu trữ trên flash", - "Store on SD Card": "Lưu trữ trên thẻ SD", - "Swipe to change mode": "Vuốt để thay đổi chế độ", - "TC Flash Hash": "TC Flash Hash", - "TC Flash Hash at Boot": "Hash Flash TC khi khởi động", - "TOUCH or ENTER to capture": "Chạm màn hình hoặc nhấn nút ENTER để chụp", - "TX Pin": "TX Pin", - "Tamper Check Code": "Mã kiểm tra giả mạo", - "Tamper check code set successfully": "Đã đặt mã kiểm tra giả mạo thành công", - "Tamper check codes do not match": "Mã kiểm tra giả mạo không khớp", - "Text": "Chữ", - "Theme": "Chủ đề", - "Thermal": "Nhiệt", - "To ensure data is unrecoverable use Wipe Device feature": "Sử dụng tính năng Xóa dữ liệu trên thiết bị để đảm bảo dữ liệu không thể phục hồi", - "Toggle Brightness": "Chuyển đổi độ sáng", - "Tools": "Công cụ", - "Touch Threshold": "Ngưỡng cảm ứng", - "Touchscreen": "Màn hình cảm ứng", - "Try more?": "Thử thêm nữa?", - "Type BIP39 Passphrase": "Nhập cụm mật khẩu BIP39", - "Type Key": "Nhập khóa", - "Unit": "Đơn vị", - "Upgrade complete.": "Nâng cấp hoàn tất.", - "Use a black background surface.": "Sử dụng bề mặt nền đen.", - "Use camera's entropy to create a new mnemonic": "Sử dụng sự ngẫu nhiên của máy ảnh để tạo ra một Mnemonic mới", - "Used:": "Đã sử dụng:", - "User's Data": "Người dùng", - "Value %s out of range: [%s, %s]": "Giá trị %s ngoài phạm vi: [ %s, %s]", - "Value must be multiple of %s": "Giá trị phải là bội của %s", - "Verifying..": "Đang xác minh..", - "Version": "Phiên Bản", - "Via Camera": "Qua máy ảnh", - "Via D20": "Qua xúc xắc 20 mặt", - "Via D6": "Qua xúc xắc 6 mặt", - "Via Manual Input": "Thông qua đầu vào thủ công", - "Via Words": "Thông qua từ ngữ", - "Wait for the capture": "Chờ bắt", - "Wallet": "Ví", - "Wallet Descriptor": "Trình mô tả ví", - "Wallet output descriptor": "Ví đầu ra mô tả", - "Wallet output descriptor loaded!": "Đã tải bộ mô tả đầu ra của ví!", - "Wallet output descriptor not found.": "Không tìm thấy bộ mô tả đầu ra ví.", - "Warning:": "Cảnh báo:", - "Word %d": "Kí tự %d", - "Word Numbers": "Từ số", - "Words": "Từ ngữ", - "Yes": "Đúng", - "is a valid address!": "là một địa chỉ hợp lệ!", - "was NOT FOUND in the first %d addresses": "kHÔNG TÌM THẤY trong %d địa chỉ đầu tiên" -} \ No newline at end of file +{"% of the amount.": "% của số tiền.", "%d of %d multisig": "%d của %d đa chữ kí", "%d to %d": "%d đến %d", "%s removed.": "%s Đã bỏ.", "(%d total)": "(tổng cộng %d)", "(Experimental)": "(Thực nghiệm)", "(watch-only)": "(chỉ xem)", "12 words": "12 từ", "24 words": "24 từ", "About": "Về chúng tôi", "Accept assumption?": "Chấp nhận giả định?", "Account": "Tài khoản", "Account #0 would be assumed": "Tài khoản #0 sẽ được giả định", "Account Index": "Chỉ mục tài khoản", "Add or change wallet passphrase?": "Thêm hoặc thay đổi cụm mật khẩu ví?", "Additional entropy from camera required for AES-CBC mode": "Cần thêm entropy từ camera cho chế độ AES-CBC", "Address": "Địa chỉ", "Align camera and backup plate properly.": "Căn chỉnh camera và tấm dự phòng đúng cách.", "Allow in settings first!": "Cho phép cài đặt trước!", "Anti-glare disabled": "Chống lóa bị vô hiệu hóa", "Anti-glare enabled": "Đã bật chống lóa", "Appearance": "Giao diện", "Are you sure?": "Bạn có chắc không?", "BGR Colors": "Màu BGR", "BIP39 Mnemonic": "Từ gợi nhớ BIP39", "Back": "Trở lại", "Back to Menu": "Quay lại Menu", "Backup Mnemonic": "Sao lưu Mnemonic", "Bad signature": "Chữ ký xấu", "Base64 Password": "Mật khẩu Base64", "Baudrate": "Tốc độ baud", "Binary Grid": "Lưới nhị phân", "Border Padding": "Đệm viền", "Brightness": "Độ sáng", "Buttons": "Nút", "Buttons Debounce": "Loại bỏ nhiễu nút", "Capture cancelled": "Hủy chụp hình", "Change": "Thay đổi", "Change Addresses": "Các địa chỉ tiền thối", "Change theme and reboot?": "Thay đổi giao diện và khởi động lại?", "Change:": "Thay đổi:", "Changes will last until shutdown.": "Thay đổi sẽ kéo dài cho đến khi tắt máy.", "Check SD Card": "Kiểm tra thẻ SD", "Check that address belongs to this wallet?": "Kiểm tra địa chỉ đó có thuộc về ví này không?", "Checked %d addresses with no matches.": "Đã kiểm tra %d địa chỉ không khớp.", "Checking for SD card..": "Kiểm tra thẻ SD..", "Confirm Tamper Check Code": "Xác nhận mã kiểm tra giả mạo", "Create QR Code": "Tạo mã QR", "Create QR code from text?": "Tạo mã QR từ văn bản?", "Created:": "Tạo:", "Current Tamper Check Code": "Mã kiểm tra giả mạo hiện tại", "Custom QR Code": "Mã QR tùy chỉnh", "Customize": "Tùy chỉnh", "Customizing your wallet will generate a new Key.": "Tùy chỉnh ví của bạn sẽ tạo một Khóa mới.", "Cut Depth": "Chiều sâu cắt", "Cut Method": "Phương pháp cắt", "Decimal": "Số thập phân", "Decrypt?": "Giải mã?", "Default Wallet": "Ví mặc định", "Depth Per Pass": "Độ sâu mỗi lần cắt CNC", "Derive BIP85 entropy?": "Suy ra entropy BIP85?", "Descriptor Addresses": "Địa chỉ người mô tả", "Display": "Hiển thị", "Do not power off, it may take a while to complete.": "Không được tắt máy, có thể mất một lúc để hoàn thành.", "Done?": "Hoàn tất?", "Double mnemonic": "Từ gợi nhớ kép", "Driver": "Driver", "Empty": "Trống", "Enable Krux apps": "Bật ứng dụng Krux", "Encrypted": "Đã mã hóa", "Encrypted QR Code": "Mã QR được mã hóa", "Encrypted mnemonic was not stored": "Mnemonic được mã hóa không được lưu trữ", "Encrypted mnemonic was stored with ID:": "Mnemonic được mã hóa không được lưu trữ với ID:", "Encryption": "Mã hóa", "Encryption Mode": "Chế độ mã hóa", "Enter %d BIP-39 words.": "Nhập %d từ BIP-39.", "Enter a 6+ characters Tamper Check Code": "Nhập mã kiểm tra giả mạo gồm hơn 6 ký tự", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Nhập từng từ của Mnemonic BIP-39 của bạn dưới dạng số từ 1 đến 2048.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số thập lục phân từ 1 đến 800.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số bát phân từ 1 đến 4000.", "Enter each word of your BIP-39 mnemonic.": "Nhập từng từ của Mnemonic BIP-39 của bạn.", "Erase User's Data": "Xóa dữ liệu của người dùng", "Erasing user's data..": "Đang xóa dữ liệu của người dùng..", "Error:": "Lỗi:", "Esc": "Esc", "Execute a signed Krux app?": "Thực thi một ứng dụng Krux đã ký?", "Explore files?": "Khám phá các tập tin?", "Exporting to SD card..": "Xuất vào thẻ SD ..", "Extended Public Key": "Khóa công cộng", "Factory Settings": "Cài đặt Gốc", "Failed to decrypt": "Không giải mã được", "Failed to load PSBT": "Tải PSBT thất bại", "Failed to load address": "Tải địa chỉ thất bại", "Failed to load key": "Không tải được khóa", "Failed to load message": "Không tải được tin nhắn", "Failed to load mnemonic": "Tải mã Mnemonic thất bại", "Failed to load output descriptor": "Không tải được bộ mô tả đầu ra", "Failed to load passphrase": "Không tải được cụm mật khẩu", "Failed to store mnemonic": "Không lưu trữ Mnemonic được", "Fee:": "Phí:", "Feed Rate": "Tốc độ cắt CNC", "Filename": "Tên tệp", "Filename %s exists on SD card, overwrite?": "Tên tệp %s tồn tại trên thẻ SD, ghi đè lên?", "Fill the flash with entropy from camera?": "Điền vào flash với entropy từ máy ảnh?", "Filling Flash": "Đèn Flash Đổ Đầy", "Fingerprint unset in PSBT": "Bỏ dấu vân tay trong PSBT", "Firmware exceeds max size: %d": "Phần mềm vượt quá kích thước tối đa: %d", "Flash Map": "Bản đồ Flash", "Flash Tools": "Công cụ Flash", "Flash filled with camera entropy": "Đèn flash chứa đầy entropy của máy ảnh", "Flipped X Coordinates": "Tọa độ X bị lật", "Flute Diameter": "Đường kính mũi cắt CNC", "Free:": "Khả dụng:", "From Storage": "Từ bộ lưu trữ", "Fully erase your SD card in another device to ensure data is unrecoverable": "Xóa hoàn toàn thẻ SD trong một thiết bị khác để đảm bảo dữ liệu không thể phục hồi", "Generate Mnemonic": "Tạo Mnemonic", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Cung cấp cho Mnemonic này một ID tùy chỉnh? Nếu không thì fingerprint hiện tại sẽ được sử dụng", "Go": "Chọn", "Good entropy": "Entropy tốt", "Hardware": "Phần cứng", "Hex Public Key": "Khóa công cộng Hex", "Hexadecimal": "Thập lục phân", "Hide Mnemonics": "Ẩn Mnemonics", "High fees!": "Phí cao!", "ID already exists": "Id đã tồn tại", "Index": "Chỉ mục", "Index: %s": "Chỉ mục: %s", "Inputs (%d):": "Đầu vào (%d):", "Install?": "Cài đặt phần mềm?", "Insufficient Entropy!": "Entropy không đủ!", "Insufficient entropy": "Không đủ entropy", "Invalid Tamper Check Code": "Mã kiểm tra giả mạo không hợp lệ", "Invalid address": "Địa chỉ không hợp lệ", "Invalid bootloader": "Bộ tải khởi động không hợp lệ", "Invalid mnemonic length": "Độ dài mã Mnemonic không hợp lệ", "Invalid public key": "Khóa công cộng không hợp lệ", "Invalid wallet:": "Ví không hợp lệ:", "Invert": "Đảo ngược", "Inverted Colors": "Màu đảo ngược", "Key": "Chìa khóa", "Key was not provided": "Khóa không được cung cấp", "Krux Printer Test QR": "QR kiểm tra máy in Krux", "LCD Type": "Loại LCD", "Language": "Ngôn ngữ", "Leave blank if you'd like Krux to pick a valid final word": "Để trống nếu bạn muốn Krux chọn một từ cuối cùng hợp lệ", "Left": "Trái", "Length: %s": "Độ dài: %s", "Line Delay": "Độ trễ Dòng", "Line:": "Đường kẻ:", "Load Krux app": "Tải ứng dụng Krux", "Load Mnemonic": "Tải mã mnemonic", "Load Wallet": "Nạp Ví", "Load a trusted wallet descriptor to view addresses?": "Tải mô tả ví đáng tin cậy để xem địa chỉ?", "Load from SD card": "Tải từ thẻ SD", "Load from SD card?": "Tải từ thẻ SD?", "Load from camera": "Tải từ máy ảnh", "Load one?": "Tải một?", "Load?": "Tải?", "Loading Camera..": "Đang tải máy ảnh..", "Loading change addresses..": "Đang tải địa chỉ tiền thối..", "Loading printer..": "Đang tải máy in ..", "Loading receive addresses..": "Đang tải địa chỉ nhận..", "Loading..": "Đang tải..", "Locale": "Ngôn ngữ", "Location": "Vị trí lưu", "Maximum length exceeded (%s)": "Chiều dài tối đa vượt quá (%s)", "Message": "Tin nhắn", "Message:": "Tin nhắn:", "Missing signature file": "Thiếu tập tin chữ ký", "Mnemonic": "Mã mnemonic", "Mnemonic ID": "Mnemonic ID ", "Mnemonic and passphrase will be kept.": "Từ gợi nhớ và cụm mật khẩu sẽ được lưu giữ.", "Mnemonic was not encrypted": "Mnemonic không được mã hóa", "Modified:": "Đã sửa đổi:", "Multisig": "Đa chữ kí", "Native Segwit - 84 would be assumed": "Native Segwit - 84 sẽ được giả định", "Network": "Mạng lưới", "New Mnemonic": "Mnemonic mới", "New firmware detected.": "Phát hiện phần sụn mới.", "No": "Không", "No Passphrase": "Không có cụm mật khẩu", "Not enough rolls!": "Không đủ số lần quay!", "Numbers": "Số", "Octal": "Bát phân", "Other Formats": "Các định dạng khác", "PBKDF2 Iter.": "Lặp lại PBKDF2", "Paint punched dots black so they can be detected.": "Tô các chấm đục lỗ màu đen để chúng có thể được phát hiện.", "Paper Width": "Chiều rộng giấy", "Part": "Phần", "Part Size": "Kích thước một phần", "Passphrase": "Cụm mật khẩu", "Password Length": "Độ dài mật khẩu tối thiểu:", "Path mismatch": "Đường dẫn không khớp", "Pattern detected!": "Đã phát hiện mẫu!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "Xóa vĩnh viễn mọi Mnemonics và cài đặt được mã hóa lưu trữ trong flash?", "Persist": "Vị trí lưu", "Pixels deviation index:": "Chỉ số độ lệch điểm ảnh:", "Plaintext QR": "QR dạng văn bản", "Please load a wallet output descriptor": "Vui lòng tải bộ mô tả đầu ra ví", "Plunge Rate": "Tỷ lệ sụt giảm", "Poor entropy": "Entropy kém", "Poor entropy detected!": "Phát hiện entropy yếu!", "Print Test QR": "In kiểm tra QR", "Print Tiny Seed?": "In Tiny Seed?", "Print to QR": "In ra QR", "Print to QR?": "In ra mã QR?", "Print?": "In?", "Printer": "Máy in", "Printer Driver not set!": "Trình điều khiển máy in chưa được cài đặt!", "Printing..": "Đang in..", "Proceed anyway?": "Vẫn tiếp tục?", "Proceed?": "Thực hiện?", "Processing..": "Đang xử lý..", "QR Code": "Mã QR", "RX Pin": "RX Pin", "Reboot": "Khởi động lại", "Receive": "Nhận được", "Receive Addresses": "Các địa chỉ nhận", "Region:": "Vùng:", "Remove %s?": "Xóa %s?", "Remove Mnemonic": "Xóa Mnemonic", "Remove firmware files from SD Card?": "Xóa các tệp firmware khỏi Thẻ SD?", "Res. - Format": "Độ phân giải - Định dạng", "Restore factory settings and reboot?": "Khôi phục cài đặt gốc và khởi động lại?", "Return to QR Viewer": "Quay lại Trình xem QR", "Review scanned data, edit if necessary": "Xem lại dữ liệu đã quét, chỉnh sửa nếu cần", "Right": "Phải", "Roll dice at least %d times to generate a mnemonic.": "Lăn xúc xắc ít nhất %d lần để tạo Mnemonic.", "Rolls distribution:": "Phân bổ xúc xắc:", "Rolls:": "Tổng số lần quay xúc xắc:", "SD card": "Thẻ SD", "SD card not detected.": "Thẻ SD không được phát hiện.", "SHA256 of rolls:": "SHA256 của xúc xắc:", "SHA256 of snapshot:": "Sha256 của ảnh chụp:", "Save QR Image to SD Card": "Lưu Ảnh QR vào Thẻ SD", "Save to SD card": "Lưu vào thẻ SD", "Save to SD card?": "Lưu vào thẻ SD?", "Saved to SD card": "Đã lưu vào thẻ SD", "Scale": "Tỉ lệ", "Scan Address": "Quét địa chỉ", "Scan BIP39 Passphrase": "Quét cụm mật khẩu BIP39", "Scan Key QR Code": "Quét mã QR khóa", "Scanning words 1-12 again": "Đang quét lại từ 1-12", "Scanning words 13-24": "Đang quét từ 13-24", "Screensaver Time": "Thời gian chế độ bảo vệ màn hình", "Script Type": "Kiểu văn lệnh", "Security": "Bảo mật", "Self-transfer or Change (%d):": "Tự chuyển nhượng hoặc giao dịch (%d):", "Self-transfer:": "Tự chuyển nhượng:", "Set a tamper check code first": "Đặt mã kiểm tra giả mạo trước", "Settings": "Cài đặt", "Settings stored internally on flash.": "Cài đặt được lưu trữ nội bộ trên đèn flash.", "Settings stored on SD card.": "Cài đặt được lưu trên thẻ SD.", "Shannon's Entropy:": "Entropy của Shannon:", "Shutdown": "Tắt máy", "Shutdown Time": "Thời gian tắt máy", "Shutting down..": "Đang tắt..", "Sign": "Chữ kí", "Sign to QR code": "Ký vào mã QR", "Sign to SD card": "Ký vào thẻ SD", "Sign?": "Kí?", "Signature": "Chữ ký", "Signed Message": "Tin nhắn đã ký", "Signed PSBT": "Đã ký PSBT", "Signing..": "Đang ký..", "Single-sig": "Khóa đơn", "Size:": "Dung lượng:", "Some checks cannot be performed.": "Một số kiểm tra không thể được thực hiện.", "Spend (%d):": "Chi tiêu (%d):", "Spend:": "Chi tiêu:", "Stats for Nerds": "Số liệu thống kê cho Mọt sách", "Store on Flash": "Lưu trữ trên flash", "Store on SD Card": "Lưu trữ trên thẻ SD", "Swipe to change mode": "Vuốt để thay đổi chế độ", "TC Flash Hash": "TC Flash Hash", "TC Flash Hash at Boot": "Hash Flash TC khi khởi động", "TOUCH or ENTER to capture": "Chạm màn hình hoặc nhấn nút ENTER để chụp", "TX Pin": "TX Pin", "Tamper Check Code": "Mã kiểm tra giả mạo", "Tamper check code set successfully": "Đã đặt mã kiểm tra giả mạo thành công", "Tamper check codes do not match": "Mã kiểm tra giả mạo không khớp", "Text": "Chữ", "Theme": "Chủ đề", "Thermal": "Nhiệt", "To ensure data is unrecoverable use Wipe Device feature": "Sử dụng tính năng Xóa dữ liệu trên thiết bị để đảm bảo dữ liệu không thể phục hồi", "Toggle Brightness": "Chuyển đổi độ sáng", "Tools": "Công cụ", "Touch Threshold": "Ngưỡng cảm ứng", "Touchscreen": "Màn hình cảm ứng", "Try more?": "Thử thêm nữa?", "Type BIP39 Passphrase": "Nhập cụm mật khẩu BIP39", "Type Key": "Nhập khóa", "Unit": "Đơn vị", "Upgrade complete.": "Nâng cấp hoàn tất.", "Use a black background surface.": "Sử dụng bề mặt nền đen.", "Use camera's entropy to create a new mnemonic": "Sử dụng sự ngẫu nhiên của máy ảnh để tạo ra một Mnemonic mới", "Used:": "Đã sử dụng:", "User's Data": "Người dùng", "Value %s out of range: [%s, %s]": "Giá trị %s ngoài phạm vi: [ %s, %s]", "Value must be multiple of %s": "Giá trị phải là bội của %s", "Verifying..": "Đang xác minh..", "Version": "Phiên Bản", "Via Camera": "Qua máy ảnh", "Via D20": "Qua xúc xắc 20 mặt", "Via D6": "Qua xúc xắc 6 mặt", "Via Manual Input": "Thông qua đầu vào thủ công", "Via Words": "Thông qua từ ngữ", "Wait for the capture": "Chờ bắt", "Wallet": "Ví", "Wallet Descriptor": "Trình mô tả ví", "Wallet output descriptor": "Ví đầu ra mô tả", "Wallet output descriptor loaded!": "Đã tải bộ mô tả đầu ra của ví!", "Wallet output descriptor not found.": "Không tìm thấy bộ mô tả đầu ra ví.", "Warning:": "Cảnh báo:", "Word %d": "Kí tự %d", "Word Numbers": "Từ số", "Words": "Từ ngữ", "Yes": "Đúng", "is a valid address!": "là một địa chỉ hợp lệ!", "was NOT FOUND in the first %d addresses": "kHÔNG TÌM THẤY trong %d địa chỉ đầu tiên"} \ No newline at end of file diff --git a/i18n/translations/zh-CN.json b/i18n/translations/zh-CN.json index d678cd38b..a4fe7550e 100644 --- a/i18n/translations/zh-CN.json +++ b/i18n/translations/zh-CN.json @@ -1,323 +1 @@ -{ - "% of the amount.": "% 的金额。", - "%d of %d multisig": "%d/%d 多签", - "%d to %d": "%d到%d", - "%s removed.": "已移除%s", - "(%d total)": "(总计 %d)", - "(Experimental)": "(实验性)", - "(watch-only)": "(仅观察)", - "12 words": "12 单词", - "24 words": "24 单词", - "About": "关于", - "Accept assumption?": "接受假设?", - "Account": "账户", - "Account #0 would be assumed": "将假定为账户 #0", - "Account Index": "账户索引", - "Add or change wallet passphrase?": "添加或更改钱包密码?", - "Additional entropy from camera required for AES-CBC mode": "AES-CBC 模式需要相机的额外熵", - "Address": "地址", - "Align camera and backup plate properly.": "正确对齐摄像头和背板。", - "Allow in settings first!": "首先在设置中允许!", - "Anti-glare disabled": "防眩光已禁用", - "Anti-glare enabled": "防眩光已启用", - "Appearance": "界面", - "Are you sure?": "确定?", - "BGR Colors": "BGR 颜色", - "BIP39 Mnemonic": "BIP39助记符", - "Back": "返回", - "Back to Menu": "返回菜单", - "Backup Mnemonic": "备份助记词", - "Bad signature": "签名无效", - "Base64 Password": "Base64密码", - "Baudrate": "波特率", - "Binary Grid": "二进制网格", - "Border Padding": "边框填充", - "Brightness": "亮度", - "Buttons": "按钮", - "Buttons Debounce": "按钮去抖动", - "Capture cancelled": "截取已取消", - "Change": "找零", - "Change Addresses": "找零地址", - "Change theme and reboot?": "更改主题并重新启动?", - "Change:": "找零", - "Changes will last until shutdown.": "更改将在关机前保持。", - "Check SD Card": "检查 SD 卡", - "Check that address belongs to this wallet?": "检查该地址是否属于此钱包?", - "Checked %d addresses with no matches.": "已检查 %d 个不匹配的地址。", - "Checking for SD card..": "检查 SD 卡..", - "Confirm Tamper Check Code": "确认防篡改检查码", - "Could not execute %s": "无法执行 ", - "Create QR Code": "创建二维码", - "Create QR code from text?": "从文本创建二维码?", - "Created:": "已创建:", - "Current Tamper Check Code": "当前防篡改检查码", - "Custom QR Code": "自定义二维码", - "Customize": "自定义", - "Customizing your wallet will generate a new Key.": "自定义您的钱包将生成新私钥。", - "Cut Depth": "切割深度", - "Cut Method": "切割方法", - "Decimal": "十进制", - "Decrypt?": "解密?", - "Default Wallet": "默认钱包", - "Depth Per Pass": "每次通过的深度", - "Derive BIP85 entropy?": "导出BIP85熵?", - "Descriptor Addresses": "描述符地址", - "Display": "显示", - "Do not power off, it may take a while to complete.": "请勿断电,可能需要一段时间完成。", - "Done?": "完成了吗?", - "Double mnemonic": "双重助记词", - "Driver": "驱动程序", - "Empty": "为空", - "Enable Krux apps": "启用Krux应用程序", - "Encrypted": "已加密", - "Encrypted QR Code": "加密二维码", - "Encrypted mnemonic was not stored": "加密助记词未存储", - "Encrypted mnemonic was stored with ID:": "加密助记词已存储,ID 为:", - "Encryption": "加密", - "Encryption Mode": "加密模式", - "Enter %d BIP-39 words.": "输入 %d 个 BIP-39 词。", - "Enter a 6+ characters Tamper Check Code": "输入6个以上字符的防篡改检查码", - "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "将 BIP-39 助记词的每个词作为 1 到 2048 的数字输入。", - "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "将 BIP-39 助记词的每个词作为 1 到 800 的十六进制数输入。", - "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "将 BIP-39 助记词的每个词作为 1 到 4000 的八进制数输入。", - "Enter each word of your BIP-39 mnemonic.": "输入每个 BIP-39 助记词。", - "Erase User's Data": "清除用户数据", - "Erasing user's data..": "正在擦除用户数据..", - "Error:": "错误:", - "Esc": "退出", - "Execute a signed Krux app?": "是否执行签名的Krux应用程序?", - "Explore files?": "浏览文件?", - "Exporting to SD card..": "导出到 SD 卡..", - "Extended Public Key": "扩展公钥", - "Factory Settings": "出厂设置", - "Failed to decrypt": "解密失败", - "Failed to load PSBT": "加载 PSBT 失败", - "Failed to load address": "加载地址失败", - "Failed to load key": "加载密钥失败", - "Failed to load message": "加载消息失败", - "Failed to load mnemonic": "加载助记词失败", - "Failed to load output descriptor": "加载输出描述符失败", - "Failed to load passphrase": "加载密码失败", - "Failed to store mnemonic": "存储助记词失败", - "Fee:": "费用:", - "Feed Rate": "进给速度", - "Filename": "文件名", - "Filename %s exists on SD card, overwrite?": "文件名 %s 存在于 SD 卡上,覆盖?", - "Fill the flash with entropy from camera?": "用摄像头的熵填充Flash?", - "Filling Flash": "填充Flash", - "Fingerprint unset in PSBT": "PSBT 中未设置指纹", - "Firmware exceeds max size: %d": "固件超过最大尺寸:%d", - "Flash Map": "Flash地图", - "Flash Tools": "Flash工具", - "Flash filled with camera entropy": "Flash已用摄像头熵填充", - "Flipped X Coordinates": "翻转 X 坐标", - "Flute Diameter": "刀具直径", - "Free:": "空闲:", - "From Storage": "从存储中", - "Fully erase your SD card in another device to ensure data is unrecoverable": "在其他设备中完全擦除您的 SD 卡以确保数据不可恢复", - "Generate Mnemonic": "生成助记词", - "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "为此助记词设置自定义 ID?否则将使用当前指纹", - "Go": "去", - "Good entropy": "良好的熵", - "Hardware": "硬件", - "Hex Public Key": "十六进制公钥", - "Hexadecimal": "十六进制", - "Hide Mnemonics": "隐藏助记词", - "High fees!": "高费用!", - "ID already exists": "ID 已存在", - "Index": "索引", - "Index: %s": "索引: %s", - "Inputs (%d):": "输入 (%d):", - "Install?": "安装?", - "Insufficient Entropy!": "熵不足!", - "Insufficient entropy": "熵不足", - "Invalid Tamper Check Code": "无效的防篡改检查码", - "Invalid address": "无效地址", - "Invalid bootloader": "无效的 ootloader ", - "Invalid mnemonic length": "助记词长度无效", - "Invalid public key": "无效公钥", - "Invalid wallet:": "无效钱包:", - "Invert": "反转", - "Inverted Colors": "反转颜色", - "Key": "密钥", - "Key was not provided": "未提供密钥", - "Krux Printer Test QR": "Krux 打印机测试二维码", - "LCD Type": "LCD 类型", - "Language": "语言", - "Leave blank if you'd like Krux to pick a valid final word": "如果希望 Krux 自动计算最后一位 Checksum,请留空", - "Left": "左", - "Length: %s": "长度: %s", - "Line Delay": "行延迟", - "Line:": "行:", - "Load Krux app": "加载Krux应用", - "Load Mnemonic": "加载助记词", - "Load Wallet": "加载钱包", - "Load a trusted wallet descriptor to view addresses?": "加载受信任的钱包描述符以查看地址?", - "Load from SD card": "从 SD 卡加载", - "Load from SD card?": "从 SD 卡加载?", - "Load from camera": "从相机加载", - "Load one?": "加载一个?", - "Load?": "加载?", - "Loading Camera..": "加载相机..", - "Loading change addresses..": "加载找零地址..", - "Loading printer..": "加载打印机..", - "Loading receive addresses..": "加载接收地址..", - "Loading..": "加载中..", - "Locale": "语言环境", - "Location": "位置", - "Maximum length exceeded (%s)": "超过最大长度(%s)", - "Message": "消息", - "Message:": "消息:", - "Missing signature file": "缺少签名文件", - "Mnemonic": "助记词", - "Mnemonic ID": "助记词 ID", - "Mnemonic and passphrase will be kept.": "助记词和密码将被保留。", - "Mnemonic was not encrypted": "助记词未加密", - "Modified:": "修改时间:", - "Multisig": "多签", - "Native Segwit - 84 would be assumed": "假定为原生 Segwit - 84", - "Network": "网络", - "New Mnemonic": "新助记词", - "New firmware detected.": "检测到新固件。", - "No": "否", - "No Passphrase": "无 Passphrase ", - "Not enough rolls!": "投掷次数不足!", - "Numbers": "数字", - "Octal": "八进制", - "Other Formats": "其他格式", - "PBKDF2 Iter.": "PBKDF2 迭代", - "Paint punched dots black so they can be detected.": "将打孔点涂黑,以便它们能被检测到。", - "Paper Width": "纸张宽度", - "Part": "部分", - "Part Size": "部件尺寸", - "Passphrase": "Passphrase", - "Password Length": "密码长度:", - "Path mismatch": "路径不匹配", - "Pattern detected!": "检测到模式!", - "Permanently remove all stored encrypted mnemonics and settings from flash?": "从 Flash 中永久删除所有存储的加密助记词和设置?", - "Persist": "保存", - "Pixels deviation index:": "像素偏差指数:", - "Plaintext QR": "明文二维码", - "Please load a wallet output descriptor": "请加载钱包输出描述符", - "Plunge Rate": "下刀速度", - "Poor entropy": "熵值低", - "Poor entropy detected!": "检测到低熵!", - "Print Test QR": "打印测试二维码", - "Print Tiny Seed?": "打印 Tiny Seed?", - "Print to QR": "打印到二维码", - "Print to QR?": "打印到二维码?", - "Print?": "打印?", - "Printer": "打印机", - "Printer Driver not set!": "打印机驱动程序未设置!", - "Printing..": "正在打印", - "Proceed anyway?": "继续吗?", - "Proceed?": "继续?", - "Processing..": "正在处理..", - "QR Code": "二维码", - "RX Pin": "RX 引脚", - "Reboot": "重启", - "Receive": "接收", - "Receive Addresses": "接收地址", - "Region:": "区域:", - "Remove %s?": "删除 %s?", - "Remove Mnemonic": "删除助记词", - "Remove firmware files from SD Card?": "从 SD 卡中删除固件文件?", - "Res. - Format": "分辨率 - 格式", - "Restore factory settings and reboot?": "恢复出厂设置并重新设备?", - "Return to QR Viewer": "返回二维码查看器", - "Review scanned data, edit if necessary": "请检查扫描的数据,如有必要请编辑", - "Right": "右", - "Roll dice at least %d times to generate a mnemonic.": "掷骰子至少 %d 次以生成助记词。", - "Rolls distribution:": "掷骰子分布:", - "Rolls:": "掷骰子:", - "SD card": "SD 卡", - "SD card not detected.": "未检测到 SD 卡。", - "SHA256 of rolls:": "掷骰子的 SHA256:", - "SHA256 of snapshot:": "快照的 SHA256:", - "Save QR Image to SD Card": "将二维码图像保存到 SD 卡", - "Save to SD card": "保存到 SD 卡", - "Save to SD card?": "保存到 SD 卡?", - "Saved to SD card": "保存到 SD 卡", - "Scale": "缩放", - "Scan Address": "扫描地址", - "Scan BIP39 Passphrase": "扫描 BIP39 Passphrase", - "Scan Key QR Code": "扫描私钥二维码", - "Scanning words 1-12 again": "重新扫扫描第 1-12 个单词", - "Scanning words 13-24": "扫描第 13-24 个单词", - "Screensaver Time": "屏保时间", - "Script Type": "脚本类型", - "Security": "安全", - "Self-transfer or Change (%d):": "自转或找零 (%d):", - "Self-transfer:": "自行转账:", - "Set a tamper check code first": "请先设置防篡改检查码", - "Settings": "设置", - "Settings stored internally on flash.": "设置存储在 Flash 内部。", - "Settings stored on SD card.": "设置存储在SD卡上。", - "Shannon's Entropy:": "香农熵:", - "Shutdown": "关机", - "Shutdown Time": "关机时间", - "Shutting down..": "关机中..", - "Sign": "签名", - "Sign to QR code": "二维码签名", - "Sign to SD card": " SD 卡签名", - "Sign?": "是否签名?", - "Signature": "签名", - "Signed Message": "签名消息", - "Signed PSBT": "已签名 PSBT", - "Signing..": "签名中..", - "Single-sig": "单签", - "Size:": "大小:", - "Some checks cannot be performed.": "无法执行某些检查。", - "Spend (%d):": "花费 (%d):", - "Spend:": "花费", - "Stats for Nerds": "极客统计数据", - "Store on Flash": "存储到 Flash", - "Store on SD Card": "存储到 SD 卡", - "Swipe to change mode": "滑动切换模式", - "TC Flash Hash": "TC Flash Hash", - "TC Flash Hash at Boot": "启动时的 TC Flash Hash", - "TOUCH or ENTER to capture": "点击或按下 ENTER 截图", - "TX Pin": "TX 引脚", - "Tamper Check Code": "防篡改检查码", - "Tamper check code set successfully": "防篡改检查码设置成功", - "Tamper check codes do not match": "防篡改检查码不匹配", - "Text": "文本", - "Theme": "主题", - "Thermal": "热敏", - "To ensure data is unrecoverable use Wipe Device feature": "要确保数据不可恢复,请使用擦除设备功能", - "Toggle Brightness": "调整亮度", - "Tools": "工具", - "Touch Threshold": "触摸阈值", - "Touchscreen": "触摸屏", - "Try more?": "再次尝试?", - "Type BIP39 Passphrase": "输入 BIP39 Phrasephrase", - "Type Key": "输入私钥", - "Unit": "单位", - "Upgrade complete.": "升级已完成。", - "Use a black background surface.": "使用黑色背景界面。", - "Use camera's entropy to create a new mnemonic": "使用摄像头的熵创建新助记词", - "Used:": "已用:", - "User's Data": "用户数据", - "Value %s out of range: [%s, %s]": "值 %s 超出范围:[ %s,%s ]", - "Value must be multiple of %s": "值必须是 %s 的倍数", - "Verifying..": "验证中..", - "Version": "版本", - "Via Camera": "通过摄像头", - "Via D20": "通过 D20", - "Via D6": "通过 D6", - "Via Manual Input": "通过手动输入", - "Via Words": "通过单词", - "Wait for the capture": "等待截取", - "Wallet": "钱包", - "Wallet Descriptor": "钱包描述", - "Wallet output descriptor": "钱包输出描述符", - "Wallet output descriptor loaded!": "钱包输出描述符加载重复!", - "Wallet output descriptor not found.": "未找到钱包输出描述符。", - "Warning:": "警告:", - "Word %d": "词 %d", - "Word Numbers": "单词序号", - "Words": "单词", - "Yes": "是", - "is a valid address!": " 非有效地址", - "was NOT FOUND in the first %d addresses": "在前 %d 个地址中未找到" -} \ No newline at end of file +{"% of the amount.": "% 的金额。", "%d of %d multisig": "%d/%d 多签", "%d to %d": "%d到%d", "%s removed.": "已移除%s", "(%d total)": "(总计 %d)", "(Experimental)": "(实验性)", "(watch-only)": "(仅观察)", "12 words": "12 单词", "24 words": "24 单词", "About": "关于", "Accept assumption?": "接受假设?", "Account": "账户", "Account #0 would be assumed": "将假定为账户 #0", "Account Index": "账户索引", "Add or change wallet passphrase?": "添加或更改钱包密码?", "Additional entropy from camera required for AES-CBC mode": "AES-CBC 模式需要相机的额外熵", "Address": "地址", "Align camera and backup plate properly.": "正确对齐摄像头和背板。", "Allow in settings first!": "首先在设置中允许!", "Anti-glare disabled": "防眩光已禁用", "Anti-glare enabled": "防眩光已启用", "Appearance": "界面", "Are you sure?": "确定?", "BGR Colors": "BGR 颜色", "BIP39 Mnemonic": "BIP39助记符", "Back": "返回", "Back to Menu": "返回菜单", "Backup Mnemonic": "备份助记词", "Bad signature": "签名无效", "Base64 Password": "Base64密码", "Baudrate": "波特率", "Binary Grid": "二进制网格", "Border Padding": "边框填充", "Brightness": "亮度", "Buttons": "按钮", "Buttons Debounce": "按钮去抖动", "Capture cancelled": "截取已取消", "Change": "找零", "Change Addresses": "找零地址", "Change theme and reboot?": "更改主题并重新启动?", "Change:": "找零", "Changes will last until shutdown.": "更改将在关机前保持。", "Check SD Card": "检查 SD 卡", "Check that address belongs to this wallet?": "检查该地址是否属于此钱包?", "Checked %d addresses with no matches.": "已检查 %d 个不匹配的地址。", "Checking for SD card..": "检查 SD 卡..", "Confirm Tamper Check Code": "确认防篡改检查码", "Create QR Code": "创建二维码", "Create QR code from text?": "从文本创建二维码?", "Created:": "已创建:", "Current Tamper Check Code": "当前防篡改检查码", "Custom QR Code": "自定义二维码", "Customize": "自定义", "Customizing your wallet will generate a new Key.": "自定义您的钱包将生成新私钥。", "Cut Depth": "切割深度", "Cut Method": "切割方法", "Decimal": "十进制", "Decrypt?": "解密?", "Default Wallet": "默认钱包", "Depth Per Pass": "每次通过的深度", "Derive BIP85 entropy?": "导出BIP85熵?", "Descriptor Addresses": "描述符地址", "Display": "显示", "Do not power off, it may take a while to complete.": "请勿断电,可能需要一段时间完成。", "Done?": "完成了吗?", "Double mnemonic": "双重助记词", "Driver": "驱动程序", "Empty": "为空", "Enable Krux apps": "启用Krux应用程序", "Encrypted": "已加密", "Encrypted QR Code": "加密二维码", "Encrypted mnemonic was not stored": "加密助记词未存储", "Encrypted mnemonic was stored with ID:": "加密助记词已存储,ID 为:", "Encryption": "加密", "Encryption Mode": "加密模式", "Enter %d BIP-39 words.": "输入 %d 个 BIP-39 词。", "Enter a 6+ characters Tamper Check Code": "输入6个以上字符的防篡改检查码", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "将 BIP-39 助记词的每个词作为 1 到 2048 的数字输入。", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "将 BIP-39 助记词的每个词作为 1 到 800 的十六进制数输入。", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "将 BIP-39 助记词的每个词作为 1 到 4000 的八进制数输入。", "Enter each word of your BIP-39 mnemonic.": "输入每个 BIP-39 助记词。", "Erase User's Data": "清除用户数据", "Erasing user's data..": "正在擦除用户数据..", "Error:": "错误:", "Esc": "退出", "Execute a signed Krux app?": "是否执行签名的Krux应用程序?", "Explore files?": "浏览文件?", "Exporting to SD card..": "导出到 SD 卡..", "Extended Public Key": "扩展公钥", "Factory Settings": "出厂设置", "Failed to decrypt": "解密失败", "Failed to load PSBT": "加载 PSBT 失败", "Failed to load address": "加载地址失败", "Failed to load key": "加载密钥失败", "Failed to load message": "加载消息失败", "Failed to load mnemonic": "加载助记词失败", "Failed to load output descriptor": "加载输出描述符失败", "Failed to load passphrase": "加载密码失败", "Failed to store mnemonic": "存储助记词失败", "Fee:": "费用:", "Feed Rate": "进给速度", "Filename": "文件名", "Filename %s exists on SD card, overwrite?": "文件名 %s 存在于 SD 卡上,覆盖?", "Fill the flash with entropy from camera?": "用摄像头的熵填充Flash?", "Filling Flash": "填充Flash", "Fingerprint unset in PSBT": "PSBT 中未设置指纹", "Firmware exceeds max size: %d": "固件超过最大尺寸:%d", "Flash Map": "Flash地图", "Flash Tools": "Flash工具", "Flash filled with camera entropy": "Flash已用摄像头熵填充", "Flipped X Coordinates": "翻转 X 坐标", "Flute Diameter": "刀具直径", "Free:": "空闲:", "From Storage": "从存储中", "Fully erase your SD card in another device to ensure data is unrecoverable": "在其他设备中完全擦除您的 SD 卡以确保数据不可恢复", "Generate Mnemonic": "生成助记词", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "为此助记词设置自定义 ID?否则将使用当前指纹", "Go": "去", "Good entropy": "良好的熵", "Hardware": "硬件", "Hex Public Key": "十六进制公钥", "Hexadecimal": "十六进制", "Hide Mnemonics": "隐藏助记词", "High fees!": "高费用!", "ID already exists": "ID 已存在", "Index": "索引", "Index: %s": "索引: %s", "Inputs (%d):": "输入 (%d):", "Install?": "安装?", "Insufficient Entropy!": "熵不足!", "Insufficient entropy": "熵不足", "Invalid Tamper Check Code": "无效的防篡改检查码", "Invalid address": "无效地址", "Invalid bootloader": "无效的 ootloader ", "Invalid mnemonic length": "助记词长度无效", "Invalid public key": "无效公钥", "Invalid wallet:": "无效钱包:", "Invert": "反转", "Inverted Colors": "反转颜色", "Key": "密钥", "Key was not provided": "未提供密钥", "Krux Printer Test QR": "Krux 打印机测试二维码", "LCD Type": "LCD 类型", "Language": "语言", "Leave blank if you'd like Krux to pick a valid final word": "如果希望 Krux 自动计算最后一位 Checksum,请留空", "Left": "左", "Length: %s": "长度: %s", "Line Delay": "行延迟", "Line:": "行:", "Load Krux app": "加载Krux应用", "Load Mnemonic": "加载助记词", "Load Wallet": "加载钱包", "Load a trusted wallet descriptor to view addresses?": "加载受信任的钱包描述符以查看地址?", "Load from SD card": "从 SD 卡加载", "Load from SD card?": "从 SD 卡加载?", "Load from camera": "从相机加载", "Load one?": "加载一个?", "Load?": "加载?", "Loading Camera..": "加载相机..", "Loading change addresses..": "加载找零地址..", "Loading printer..": "加载打印机..", "Loading receive addresses..": "加载接收地址..", "Loading..": "加载中..", "Locale": "语言环境", "Location": "位置", "Maximum length exceeded (%s)": "超过最大长度(%s)", "Message": "消息", "Message:": "消息:", "Missing signature file": "缺少签名文件", "Mnemonic": "助记词", "Mnemonic ID": "助记词 ID", "Mnemonic and passphrase will be kept.": "助记词和密码将被保留。", "Mnemonic was not encrypted": "助记词未加密", "Modified:": "修改时间:", "Multisig": "多签", "Native Segwit - 84 would be assumed": "假定为原生 Segwit - 84", "Network": "网络", "New Mnemonic": "新助记词", "New firmware detected.": "检测到新固件。", "No": "否", "No Passphrase": "无 Passphrase ", "Not enough rolls!": "投掷次数不足!", "Numbers": "数字", "Octal": "八进制", "Other Formats": "其他格式", "PBKDF2 Iter.": "PBKDF2 迭代", "Paint punched dots black so they can be detected.": "将打孔点涂黑,以便它们能被检测到。", "Paper Width": "纸张宽度", "Part": "部分", "Part Size": "部件尺寸", "Passphrase": "Passphrase", "Password Length": "密码长度:", "Path mismatch": "路径不匹配", "Pattern detected!": "检测到模式!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "从 Flash 中永久删除所有存储的加密助记词和设置?", "Persist": "保存", "Pixels deviation index:": "像素偏差指数:", "Plaintext QR": "明文二维码", "Please load a wallet output descriptor": "请加载钱包输出描述符", "Plunge Rate": "下刀速度", "Poor entropy": "熵值低", "Poor entropy detected!": "检测到低熵!", "Print Test QR": "打印测试二维码", "Print Tiny Seed?": "打印 Tiny Seed?", "Print to QR": "打印到二维码", "Print to QR?": "打印到二维码?", "Print?": "打印?", "Printer": "打印机", "Printer Driver not set!": "打印机驱动程序未设置!", "Printing..": "正在打印", "Proceed anyway?": "继续吗?", "Proceed?": "继续?", "Processing..": "正在处理..", "QR Code": "二维码", "RX Pin": "RX 引脚", "Reboot": "重启", "Receive": "接收", "Receive Addresses": "接收地址", "Region:": "区域:", "Remove %s?": "删除 %s?", "Remove Mnemonic": "删除助记词", "Remove firmware files from SD Card?": "从 SD 卡中删除固件文件?", "Res. - Format": "分辨率 - 格式", "Restore factory settings and reboot?": "恢复出厂设置并重新设备?", "Return to QR Viewer": "返回二维码查看器", "Review scanned data, edit if necessary": "请检查扫描的数据,如有必要请编辑", "Right": "右", "Roll dice at least %d times to generate a mnemonic.": "掷骰子至少 %d 次以生成助记词。", "Rolls distribution:": "掷骰子分布:", "Rolls:": "掷骰子:", "SD card": "SD 卡", "SD card not detected.": "未检测到 SD 卡。", "SHA256 of rolls:": "掷骰子的 SHA256:", "SHA256 of snapshot:": "快照的 SHA256:", "Save QR Image to SD Card": "将二维码图像保存到 SD 卡", "Save to SD card": "保存到 SD 卡", "Save to SD card?": "保存到 SD 卡?", "Saved to SD card": "保存到 SD 卡", "Scale": "缩放", "Scan Address": "扫描地址", "Scan BIP39 Passphrase": "扫描 BIP39 Passphrase", "Scan Key QR Code": "扫描私钥二维码", "Scanning words 1-12 again": "重新扫扫描第 1-12 个单词", "Scanning words 13-24": "扫描第 13-24 个单词", "Screensaver Time": "屏保时间", "Script Type": "脚本类型", "Security": "安全", "Self-transfer or Change (%d):": "自转或找零 (%d):", "Self-transfer:": "自行转账:", "Set a tamper check code first": "请先设置防篡改检查码", "Settings": "设置", "Settings stored internally on flash.": "设置存储在 Flash 内部。", "Settings stored on SD card.": "设置存储在SD卡上。", "Shannon's Entropy:": "香农熵:", "Shutdown": "关机", "Shutdown Time": "关机时间", "Shutting down..": "关机中..", "Sign": "签名", "Sign to QR code": "二维码签名", "Sign to SD card": " SD 卡签名", "Sign?": "是否签名?", "Signature": "签名", "Signed Message": "签名消息", "Signed PSBT": "已签名 PSBT", "Signing..": "签名中..", "Single-sig": "单签", "Size:": "大小:", "Some checks cannot be performed.": "无法执行某些检查。", "Spend (%d):": "花费 (%d):", "Spend:": "花费", "Stats for Nerds": "极客统计数据", "Store on Flash": "存储到 Flash", "Store on SD Card": "存储到 SD 卡", "Swipe to change mode": "滑动切换模式", "TC Flash Hash": "TC Flash Hash", "TC Flash Hash at Boot": "启动时的 TC Flash Hash", "TOUCH or ENTER to capture": "点击或按下 ENTER 截图", "TX Pin": "TX 引脚", "Tamper Check Code": "防篡改检查码", "Tamper check code set successfully": "防篡改检查码设置成功", "Tamper check codes do not match": "防篡改检查码不匹配", "Text": "文本", "Theme": "主题", "Thermal": "热敏", "To ensure data is unrecoverable use Wipe Device feature": "要确保数据不可恢复,请使用擦除设备功能", "Toggle Brightness": "调整亮度", "Tools": "工具", "Touch Threshold": "触摸阈值", "Touchscreen": "触摸屏", "Try more?": "再次尝试?", "Type BIP39 Passphrase": "输入 BIP39 Phrasephrase", "Type Key": "输入私钥", "Unit": "单位", "Upgrade complete.": "升级已完成。", "Use a black background surface.": "使用黑色背景界面。", "Use camera's entropy to create a new mnemonic": "使用摄像头的熵创建新助记词", "Used:": "已用:", "User's Data": "用户数据", "Value %s out of range: [%s, %s]": "值 %s 超出范围:[ %s,%s ]", "Value must be multiple of %s": "值必须是 %s 的倍数", "Verifying..": "验证中..", "Version": "版本", "Via Camera": "通过摄像头", "Via D20": "通过 D20", "Via D6": "通过 D6", "Via Manual Input": "通过手动输入", "Via Words": "通过单词", "Wait for the capture": "等待截取", "Wallet": "钱包", "Wallet Descriptor": "钱包描述", "Wallet output descriptor": "钱包输出描述符", "Wallet output descriptor loaded!": "钱包输出描述符加载重复!", "Wallet output descriptor not found.": "未找到钱包输出描述符。", "Warning:": "警告:", "Word %d": "词 %d", "Word Numbers": "单词序号", "Words": "单词", "Yes": "是", "is a valid address!": " 非有效地址", "was NOT FOUND in the first %d addresses": "在前 %d 个地址中未找到"} \ No newline at end of file diff --git a/src/krux/pages/tools.py b/src/krux/pages/tools.py index f81a6ad02..8cd3cd6d7 100644 --- a/src/krux/pages/tools.py +++ b/src/krux/pages/tools.py @@ -38,6 +38,8 @@ from ..krux_settings import t from ..qr import FORMAT_NONE +READABLEBUFFER_SIZE = 128 + class Tools(Page): """Krux generic tools""" @@ -69,8 +71,7 @@ def _check_signature(self, sig, data_hash): try: pubkey = ec.PublicKey.from_string(SIGNER_PUBKEY) except: - self.flash_error(t("Invalid public key")) - return MENU_CONTINUE + raise ValueError("Invalid public key") try: # Parse, serialize, and reparse to ensure signature is compact prior to verification @@ -167,7 +168,7 @@ def sd_load_app(self): # pylint: disable=R1710 ) as kapp_file: with open(sd_path_prefix + filename, "rb", buffering=0) as file: while True: - chunk = file.read(128) + chunk = file.read(READABLEBUFFER_SIZE) if not chunk: break kapp_file.write(chunk) @@ -205,8 +206,7 @@ def sd_load_app(self): # pylint: disable=R1710 del i_kapp del sys.modules[kapp_filename] - self.flash_error(t("Could not execute %s") % filename) - return MENU_CONTINUE + raise ValueError("Could not execute %s" % filename) # avoids importing from flash VSF os.chdir("/") From 8b932e559d5c540eaada279317d40cae70d2178c Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sat, 7 Dec 2024 17:36:34 -0300 Subject: [PATCH 17/86] Moved kapps to a dedicated file, imported on demand --- src/krux/pages/kapps.py | 187 ++++++++++++++++++++++++++++++++++++++++ src/krux/pages/tools.py | 157 ++------------------------------- 2 files changed, 192 insertions(+), 152 deletions(-) create mode 100644 src/krux/pages/kapps.py diff --git a/src/krux/pages/kapps.py b/src/krux/pages/kapps.py new file mode 100644 index 000000000..84823999f --- /dev/null +++ b/src/krux/pages/kapps.py @@ -0,0 +1,187 @@ +# The MIT License (MIT) + +# Copyright (c) 2021-2024 Krux contributors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +from krux.pages import ( + Page, + MENU_CONTINUE, +) +from krux.krux_settings import t +from krux.display import BOTTOM_PROMPT_LINE + +READABLEBUFFER_SIZE = 128 + + +class Kapps(Page): + """Krux standalone apps manager""" + + def _check_signature(self, sig, data_hash): + from embit import ec + from ..metadata import SIGNER_PUBKEY + + pubkey = None + try: + pubkey = ec.PublicKey.from_string(SIGNER_PUBKEY) + except: + raise ValueError("Invalid public key") + + try: + # Parse, serialize, and reparse to ensure signature is compact prior to verification + sig = ec.Signature.parse(ec.Signature.parse(sig).serialize()) + + if not pubkey.verify(sig, data_hash): + self.flash_error(t("Bad signature")) + return MENU_CONTINUE + except: + self.flash_error(t("Bad signature")) + return MENU_CONTINUE + + return None + + def load_kapp(self): # pylint: disable=R1710 + """Prompt user to load and 'execute' a .mpy Krux app""" + if not self.prompt( + t("Execute a signed Krux app?"), self.ctx.display.height() // 2 + ): + return MENU_CONTINUE + + # Check if Krux app is enabled + from krux.krux_settings import Settings + + if not Settings().security.allow_kapp: + self.flash_error(t("Allow in settings first!")) + return MENU_CONTINUE + + if not self.has_sd_card(): + self.flash_error(t("SD card not detected.")) + return MENU_CONTINUE + + # Prompt user for .mpy file + from krux.pages.utils import Utils + from krux.sd_card import MPY_FILE_EXTENSION, SIGNATURE_FILE_EXTENSION, SD_PATH + + filename, _ = Utils(self.ctx).load_file( + MPY_FILE_EXTENSION, prompt=False, only_get_filename=True + ) + + if not filename: + return MENU_CONTINUE + + # Confirm hash string + sd_path_prefix = "/%s/" % SD_PATH + from krux.firmware import sha256 + + data_hash = sha256(sd_path_prefix + filename) + + import binascii + + self.ctx.display.clear() + self.ctx.display.draw_hcentered_text( + filename + "\n\n" + "SHA256:\n" + binascii.hexlify(data_hash).decode() + ) + if not self.prompt(t("Proceed?"), BOTTOM_PROMPT_LINE): + return MENU_CONTINUE + + # Check signature of .mpy file in SD + sig_data = None + try: + sig_data = open( + sd_path_prefix + filename + SIGNATURE_FILE_EXTENSION, "rb" + ).read() + except: + self.flash_error(t("Missing signature file")) + return MENU_CONTINUE + + if self._check_signature(sig_data, data_hash) == MENU_CONTINUE: + return MENU_CONTINUE + + # Delete any .mpy files from flash VFS to avoid malicious code import/execution + import os + from krux.settings import FLASH_PATH + + found_in_flash_vfs = False + flash_path_prefix = "/%s/" % FLASH_PATH + for file in os.listdir(flash_path_prefix): + if file.endswith(MPY_FILE_EXTENSION): + # Only remove .mpy different from what was loaded from SD + if sha256(flash_path_prefix + file) != data_hash: + os.remove(flash_path_prefix + file) + else: + found_in_flash_vfs = True + + # Copy kapp + sig from SD to flash VFS if not found + # sig file will allow the check and execution of the kapp at startup (opsec) + kapp_filename = "kapp" + if not found_in_flash_vfs: + with open( + flash_path_prefix + kapp_filename + MPY_FILE_EXTENSION, + "wb", + buffering=0, + ) as kapp_file: + with open(sd_path_prefix + filename, "rb", buffering=0) as file: + while True: + chunk = file.read(READABLEBUFFER_SIZE) + if not chunk: + break + kapp_file.write(chunk) + + with open( + flash_path_prefix + + kapp_filename + + MPY_FILE_EXTENSION + + SIGNATURE_FILE_EXTENSION, + "wb", + ) as kapp_sig_file: + kapp_sig_file.write(sig_data) + + del sig_data + import gc + + gc.collect() + + # Allows import of files in flash VFS + # TODO: Dinamically enable vsf->execution + os.chdir("/" + FLASH_PATH) + + # Import and exec the kapp + i_kapp = None + try: + i_kapp = __import__(kapp_filename) + i_kapp.run(self.ctx) + except: + # avoids importing from flash VSF + os.chdir("/") + + # unimport module + import sys + + del i_kapp + del sys.modules[kapp_filename] + + raise ValueError("Could not execute %s" % filename) + + # avoids importing from flash VSF + os.chdir("/") + + # After execution restart Krux (better safe than sorry) + from ..power import power_manager + + power_manager.shutdown() diff --git a/src/krux/pages/tools.py b/src/krux/pages/tools.py index 8cd3cd6d7..0d3c7f0f5 100644 --- a/src/krux/pages/tools.py +++ b/src/krux/pages/tools.py @@ -38,8 +38,6 @@ from ..krux_settings import t from ..qr import FORMAT_NONE -READABLEBUFFER_SIZE = 128 - class Tools(Page): """Krux generic tools""" @@ -53,7 +51,7 @@ def __init__(self, ctx): ctx, [ (t("Check SD Card"), self.sd_check), - (t("Load Krux app"), self.sd_load_app), + (t("Load Krux app"), self.load_krux_app), (t("Print Test QR"), self.print_test), (t("Create QR Code"), self.create_qr), (t("Descriptor Addresses"), self.descriptor_addresses), @@ -63,158 +61,13 @@ def __init__(self, ctx): ), ) - def _check_signature(self, sig, data_hash): - from embit import ec - from ..metadata import SIGNER_PUBKEY - - pubkey = None - try: - pubkey = ec.PublicKey.from_string(SIGNER_PUBKEY) - except: - raise ValueError("Invalid public key") - - try: - # Parse, serialize, and reparse to ensure signature is compact prior to verification - sig = ec.Signature.parse(ec.Signature.parse(sig).serialize()) - - if not pubkey.verify(sig, data_hash): - self.flash_error(t("Bad signature")) - return MENU_CONTINUE - except: - self.flash_error(t("Bad signature")) - return MENU_CONTINUE - - return None - - def sd_load_app(self): # pylint: disable=R1710 + def load_krux_app(self): """Handler for the 'Load Krux app' menu item""" - if not self.prompt( - t("Execute a signed Krux app?"), self.ctx.display.height() // 2 - ): - return MENU_CONTINUE - - # Check if Krux app is enabled - from krux.krux_settings import Settings - - if not Settings().security.allow_kapp: - self.flash_error(t("Allow in settings first!")) - return MENU_CONTINUE - - if not self.has_sd_card(): - self.flash_error(t("SD card not detected.")) - return MENU_CONTINUE - - # Prompt user for .mpy file - from krux.pages.utils import Utils - from krux.sd_card import MPY_FILE_EXTENSION, SIGNATURE_FILE_EXTENSION, SD_PATH - - filename, _ = Utils(self.ctx).load_file( - MPY_FILE_EXTENSION, prompt=False, only_get_filename=True - ) - - if not filename: - return MENU_CONTINUE - - # Confirm hash string - sd_path_prefix = "/%s/" % SD_PATH - from krux.firmware import sha256 - - data_hash = sha256(sd_path_prefix + filename) - - import binascii - - self.ctx.display.clear() - self.ctx.display.draw_hcentered_text( - filename + "\n\n" + "SHA256:\n" + binascii.hexlify(data_hash).decode() - ) - if not self.prompt(t("Proceed?"), BOTTOM_PROMPT_LINE): - return MENU_CONTINUE - - # Check signature of .mpy file in SD - sig_data = None - try: - sig_data = open( - sd_path_prefix + filename + SIGNATURE_FILE_EXTENSION, "rb" - ).read() - except: - self.flash_error(t("Missing signature file")) - return MENU_CONTINUE - - if self._check_signature(sig_data, data_hash) == MENU_CONTINUE: - return MENU_CONTINUE - - # Delete any .mpy files from flash VFS to avoid malicious code import/execution - import os - from krux.settings import FLASH_PATH - - found_in_flash_vfs = False - flash_path_prefix = "/%s/" % FLASH_PATH - for file in os.listdir(flash_path_prefix): - if file.endswith(MPY_FILE_EXTENSION): - # Only remove .mpy different from what was loaded from SD - if sha256(flash_path_prefix + file) != data_hash: - os.remove(flash_path_prefix + file) - else: - found_in_flash_vfs = True - - # Copy kapp + sig from SD to flash VFS if not found - # sig file will allow the check and execution of the kapp at startup (opsec) - kapp_filename = "kapp" - if not found_in_flash_vfs: - with open( - flash_path_prefix + kapp_filename + MPY_FILE_EXTENSION, - "wb", - buffering=0, - ) as kapp_file: - with open(sd_path_prefix + filename, "rb", buffering=0) as file: - while True: - chunk = file.read(READABLEBUFFER_SIZE) - if not chunk: - break - kapp_file.write(chunk) - - with open( - flash_path_prefix - + kapp_filename - + MPY_FILE_EXTENSION - + SIGNATURE_FILE_EXTENSION, - "wb", - ) as kapp_sig_file: - kapp_sig_file.write(sig_data) - - del sig_data - import gc - - gc.collect() - - # Allows import of files in flash VFS - # TODO: Dinamically enable vsf->execution - os.chdir("/" + FLASH_PATH) - - # Import and exec the kapp - i_kapp = None - try: - i_kapp = __import__(kapp_filename) - i_kapp.run(self.ctx) - except: - # avoids importing from flash VSF - os.chdir("/") - - # unimport module - import sys - - del i_kapp - del sys.modules[kapp_filename] - - raise ValueError("Could not execute %s" % filename) - - # avoids importing from flash VSF - os.chdir("/") - # After execution restart Krux (better safe than sorry) - from ..power import power_manager + from krux.pages.kapps import Kapps - power_manager.shutdown() + kapps = Kapps(self.ctx) + return kapps.load_kapp def flash_tools(self): """Handler for the 'Flash Tools' menu item""" From 166c4d3329216f3ff33f7381e8f91a9b243d8870 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sat, 7 Dec 2024 17:40:10 -0300 Subject: [PATCH 18/86] fix standalone kapp not being called --- src/krux/pages/tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/krux/pages/tools.py b/src/krux/pages/tools.py index 0d3c7f0f5..4bb22cd64 100644 --- a/src/krux/pages/tools.py +++ b/src/krux/pages/tools.py @@ -67,7 +67,7 @@ def load_krux_app(self): from krux.pages.kapps import Kapps kapps = Kapps(self.ctx) - return kapps.load_kapp + return kapps.load_kapp() def flash_tools(self): """Handler for the 'Flash Tools' menu item""" From 00513511ee71cd9f2ef393ab945e3f83438e7609 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sun, 8 Dec 2024 00:53:21 -0300 Subject: [PATCH 19/86] simplified check_signature return --- src/krux/pages/kapps.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/krux/pages/kapps.py b/src/krux/pages/kapps.py index 84823999f..47de11e9f 100644 --- a/src/krux/pages/kapps.py +++ b/src/krux/pages/kapps.py @@ -49,12 +49,12 @@ def _check_signature(self, sig, data_hash): if not pubkey.verify(sig, data_hash): self.flash_error(t("Bad signature")) - return MENU_CONTINUE + return False except: self.flash_error(t("Bad signature")) - return MENU_CONTINUE + return False - return None + return True def load_kapp(self): # pylint: disable=R1710 """Prompt user to load and 'execute' a .mpy Krux app""" @@ -110,7 +110,11 @@ def load_kapp(self): # pylint: disable=R1710 self.flash_error(t("Missing signature file")) return MENU_CONTINUE - if self._check_signature(sig_data, data_hash) == MENU_CONTINUE: + if not self._check_signature(sig_data, data_hash): + return MENU_CONTINUE + + # Warns user about changing users's space flash internal memory + if not self.prompt(t("App needs to be copied to user's "), self.ctx.display.height() // 2): return MENU_CONTINUE # Delete any .mpy files from flash VFS to avoid malicious code import/execution From b35220b53c1769dc6c12d7c2af21ea401668d4a5 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sun, 8 Dec 2024 01:08:35 -0300 Subject: [PATCH 20/86] fix translations --- i18n/translations/de-DE.json | 323 +++++++++++++++++++++++++++- i18n/translations/es-MX.json | 323 +++++++++++++++++++++++++++- i18n/translations/fr-FR.json | 323 +++++++++++++++++++++++++++- i18n/translations/ja-JP.json | 323 +++++++++++++++++++++++++++- i18n/translations/ko-KR.json | 323 +++++++++++++++++++++++++++- i18n/translations/nl-NL.json | 323 +++++++++++++++++++++++++++- i18n/translations/pt-BR.json | 323 +++++++++++++++++++++++++++- i18n/translations/ru-RU.json | 323 +++++++++++++++++++++++++++- i18n/translations/tr-TR.json | 323 +++++++++++++++++++++++++++- i18n/translations/vi-VN.json | 323 +++++++++++++++++++++++++++- i18n/translations/zh-CN.json | 323 +++++++++++++++++++++++++++- src/krux/translations/__init__.py | 338 +----------------------------- src/krux/translations/de.py | 324 +--------------------------- src/krux/translations/es.py | 324 +--------------------------- src/krux/translations/fr.py | 324 +--------------------------- src/krux/translations/ja.py | 324 +--------------------------- src/krux/translations/ko.py | 324 +--------------------------- src/krux/translations/nl.py | 324 +--------------------------- src/krux/translations/pt.py | 324 +--------------------------- src/krux/translations/ru.py | 324 +--------------------------- src/krux/translations/tr.py | 324 +--------------------------- src/krux/translations/vi.py | 324 +--------------------------- src/krux/translations/zh.py | 324 +--------------------------- 23 files changed, 3555 insertions(+), 3900 deletions(-) diff --git a/i18n/translations/de-DE.json b/i18n/translations/de-DE.json index bc44d584e..ce4d00637 100644 --- a/i18n/translations/de-DE.json +++ b/i18n/translations/de-DE.json @@ -1 +1,322 @@ -{"% of the amount.": "% des Betrags.", "%d of %d multisig": "%d von %d Multisig", "%d to %d": "%d bis %d ", "%s removed.": "%s wurde entfernt.", "(%d total)": "(%d insgesamt)", "(Experimental)": "(Experimental)", "(watch-only)": "(nur zur Betrachtung)", "12 words": "12 Wörter", "24 words": "24 Wörter", "About": "Über", "Accept assumption?": "Annahme akzeptieren?", "Account": "Konto", "Account #0 would be assumed": "Konto #0 würde angenommen", "Account Index": "Kontoindex", "Add or change wallet passphrase?": "Wallet-Passphrase hinzufügen oder ändern?", "Additional entropy from camera required for AES-CBC mode": "Zusätzliche Entropie von der Kamera für den AES-CBC-Modus erforderlich", "Address": "Adresse", "Align camera and backup plate properly.": "Richte Kamera und Sicherungsplatte richtig aus.", "Allow in settings first!": "Erlaube zuerst Einstellungen!", "Anti-glare disabled": "Blendschutz deaktiviert", "Anti-glare enabled": "Blendschutz aktiviert", "Appearance": "Aussehen", "Are you sure?": "Bist Du sicher?", "BGR Colors": "BGR-Farben", "BIP39 Mnemonic": "BIP39-Mnemonik", "Back": "Zurück", "Back to Menu": "Zurück zum Menü", "Backup Mnemonic": "Mnemonik-Backup", "Bad signature": "Ungültige Signatur", "Base64 Password": "Base64-Passwort", "Baudrate": "Baudrate", "Binary Grid": "Binäres Gitter", "Border Padding": "Randpolsterung", "Brightness": "Helligkeit", "Buttons": "Tasten", "Buttons Debounce": "Entprellung der Tasten", "Capture cancelled": "Aufnahme abgebrochen", "Change": "Change Adresse", "Change Addresses": "Change Adressen", "Change theme and reboot?": "Thema ändern und neu starten?", "Change:": "Change:", "Changes will last until shutdown.": "Änderungen bleiben bis zum Herunterfahren bestehen.", "Check SD Card": "Prüfe SD-Karte", "Check that address belongs to this wallet?": "Überprüfen, ob diese Adresse zu dieser Wallet gehört?", "Checked %d addresses with no matches.": "Überprüfte %d Adresse ohne Übereinstimmungen.", "Checking for SD card..": "Suche nach SD-Karte..", "Confirm Tamper Check Code": "Bestätigen Sie den Tamper Check Code", "Create QR Code": "Erstelle QR-Code", "Create QR code from text?": "QR-Code aus Text erzeugen?", "Created:": "Erstellt:", "Current Tamper Check Code": "Aktueller Tamper Check Code", "Custom QR Code": "Benutzerdefinierte QR-Code", "Customize": "Anpassen", "Customizing your wallet will generate a new Key.": "Wenn Sie Ihr Wallet anpassen, wird ein neuer Schlüssel generiert.", "Cut Depth": "Schnitttiefe", "Cut Method": "Cut-Methode", "Decimal": "Dezimal", "Decrypt?": "Entschlüsseln?", "Default Wallet": "Standard-Wallet", "Depth Per Pass": "Tiefe pro Durchgang", "Derive BIP85 entropy?": "BIP85-Entropie ableiten?", "Descriptor Addresses": "Deskriptor-Adressen", "Display": "Bildschirm", "Do not power off, it may take a while to complete.": "Schalten Sie das Gerät nicht aus, es kann eine Weile dauern.", "Done?": "Fertig?", "Double mnemonic": "Doppelte Gedächtnisstütze", "Driver": "Driver", "Empty": "Leer", "Enable Krux apps": "Krux-Apps aktivieren", "Encrypted": "Verschlüsselt", "Encrypted QR Code": "Verschlüsselter QR-Code", "Encrypted mnemonic was not stored": "Verschlüsselte Mnemonic wurde nicht gespeichert", "Encrypted mnemonic was stored with ID:": "Speicherung der verschlüsselten Mnemonic mit ID:", "Encryption": "Verschlüsselung", "Encryption Mode": "Verschlüsselungsmodus", "Enter %d BIP-39 words.": "Geben Sie %d BIP-39 Wörter ein.", "Enter a 6+ characters Tamper Check Code": "Geben Sie einen Tamper Check Code mit 6+ Zeichen ein", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Gib jedes Wort Deiner BIP-39 Mnemonic als Zahl von 1 bis 2048 ein.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Gib jedes Wort Deiner BIP-39 Mnemonic als Hexadezimalzahl von 1 bis 800 ein.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Gib jedes Wort Deiner BIP-39 Mnemonic als Oktalzahl von 1 bis 4000 ein.", "Enter each word of your BIP-39 mnemonic.": "Gib jedes Wort Deiner BIP-39 Mnemonic ein.", "Erase User's Data": "Benutzerdaten löschen", "Erasing user's data..": "Benutzerdaten werden gelöscht..", "Error:": "Fehler:", "Esc": "Esc", "Execute a signed Krux app?": "Eine signierte Krux-App ausführen?", "Explore files?": "Dateien durchsuchen?", "Exporting to SD card..": "Auf SD-Karte exportieren..", "Extended Public Key": "Öffentlicher Schlüssel", "Factory Settings": "Werkeinstellungen", "Failed to decrypt": "Entschlüsselung fehlgeschlagen", "Failed to load PSBT": "PSBT konnte nicht geladen werden", "Failed to load address": "Adresse konnte nicht geladen werden", "Failed to load key": "Schlüssel konnte nicht geladen werden", "Failed to load message": "Nachricht konnte nicht geladen werden", "Failed to load mnemonic": "Mnemonic konnte nicht geladen werden", "Failed to load output descriptor": "Ausgabedeskriptor konnte nicht geladen werden", "Failed to load passphrase": "Passphrase konnte nicht geladen werden", "Failed to store mnemonic": "Mnemonic konnte nicht gespeichert werden", "Fee:": "Gebühr:", "Feed Rate": "Vorschubgeschwindigkeit", "Filename": "Dateiname", "Filename %s exists on SD card, overwrite?": "Dateiname %s existiert auf SD-Karte, überschreiben?", "Fill the flash with entropy from camera?": "Den Flash mit Entropie von der Kamera füllen?", "Filling Flash": "Flash wird gefüllt", "Fingerprint unset in PSBT": "Fingerabdruck in PSBT deaktiviert", "Firmware exceeds max size: %d": "Die Firmware übersteigt die maximale Größe: %d", "Flash Map": "Flash-Karte", "Flash Tools": "Flash-Tools", "Flash filled with camera entropy": "Flash gefüllt mit Kameraentropie", "Flipped X Coordinates": "Umgedrehte X-Koordinaten", "Flute Diameter": "Flötendurchmesser", "Free:": "Frei:", "From Storage": "Vom Speicher", "Fully erase your SD card in another device to ensure data is unrecoverable": "Löschen Sie Ihre SD-Karte vollständig in einem anderen Gerät, um sicherzustellen, dass die Daten nicht wiederhergestellt werden können", "Generate Mnemonic": "Mnemonik erzeugen", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Dieser Mnemonic eine benutzerdefinierte ID zuteilen? Andernfalls wird der aktuelle Fingerabdruck verwendet", "Go": "Go", "Good entropy": "Gute Entropie", "Hardware": "Hardware", "Hex Public Key": "Hex öffentlicher Schlüssel", "Hexadecimal": "Hexadezimal", "Hide Mnemonics": "Mnemonics ausblenden", "High fees!": "Hohe Gebühren!", "ID already exists": "ID existiert bereits", "Index": "Index", "Index: %s": "Index: %s", "Inputs (%d):": "Input (%d):", "Install?": "Installieren?", "Insufficient Entropy!": "Unzureichende Entropie!", "Insufficient entropy": "Unzureichende Entropie", "Invalid Tamper Check Code": "Ungültiger Tamper Check Code", "Invalid address": "Ungültige Adresse", "Invalid bootloader": "Ungültiger Bootloader", "Invalid mnemonic length": "Ungültige mnemonische Lange", "Invalid public key": "Ungültiger öffentlicher Schlüssel", "Invalid wallet:": "Ungültige Wallet:", "Invert": "Umkehren", "Inverted Colors": "Invertierte Farben", "Key": "Schlüssel", "Key was not provided": "Schlüssel wurde nicht zur Verfügung gestellt", "Krux Printer Test QR": "Krux Drucker Test-QR", "LCD Type": "LCD-Typ", "Language": "Sprache", "Leave blank if you'd like Krux to pick a valid final word": "Lassen Sie das Feld leer, wenn Sie möchten, dass Krux ein gültiges letztes Wort auswählt", "Left": "Links", "Length: %s": "Länge: %s", "Line Delay": "Leitungsverzögerung", "Line:": "Linie:", "Load Krux app": "Krux-App laden", "Load Mnemonic": "Mnemonic laden", "Load Wallet": "Wallet laden", "Load a trusted wallet descriptor to view addresses?": "Einen vertrauenswürdigen Wallet-Deskriptor laden, um Adressen anzuzeigen?", "Load from SD card": "Von SD-Karte laden", "Load from SD card?": "Von SD-Karte laden?", "Load from camera": "Von der Kamera laden", "Load one?": "Eine laden?", "Load?": "Laden?", "Loading Camera..": "Lade Kamera..", "Loading change addresses..": "Lade Change Adressen..", "Loading printer..": "Drucker wird geladen..", "Loading receive addresses..": "Lade Empfangsadressen..", "Loading..": "Wird geladen..", "Locale": "Spracheinstellung", "Location": "Speicherort", "Maximum length exceeded (%s)": "Maximale Länge überschritten (%s)", "Message": "Nachricht", "Message:": "Nachricht:", "Missing signature file": "Fehlende Signaturdatei", "Mnemonic": "Mnemonic", "Mnemonic ID": "Mnemonische ID", "Mnemonic and passphrase will be kept.": "Mnemotechnik und Passphrase werden beibehalten.", "Mnemonic was not encrypted": "Mnemonic wurde nicht verschlüsselt", "Modified:": "Geändert:", "Multisig": "Multisig", "Native Segwit - 84 would be assumed": "Native Segwit - 84 würde angenommen", "Network": "Netzwerk", "New Mnemonic": "Neue Mnemonic", "New firmware detected.": "Neue Firmware erkannt.", "No": "Nein", "No Passphrase": "Keine Passphrase", "Not enough rolls!": "Nicht genug Würfe!", "Numbers": "Zahlen", "Octal": "Oktal", "Other Formats": "Andere Formate", "PBKDF2 Iter.": "PBKDF2-Iter.", "Paint punched dots black so they can be detected.": "Male gestanzte Punkte schwarz an, damit sie erkannt werden können.", "Paper Width": "Papierbreite", "Part": "Teil", "Part Size": "Teilegröße", "Passphrase": "Passphrase", "Password Length": "Passwortlänge", "Path mismatch": "Pfad stimmt nicht überein", "Pattern detected!": "Muster erkannt!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "Alle gespeicherten verschlüsselten Mnemoniken und Einstellungen dauerhaft vom Flash-Speicher entfernen?", "Persist": "Speicher", "Pixels deviation index:": "Pixelabweichungsindex:", "Plaintext QR": "Klartext-QR", "Please load a wallet output descriptor": "Bitte lade einen Wallet Ausgabedeskriptor", "Plunge Rate": "Tauchrate", "Poor entropy": "Schlechte Entropie", "Poor entropy detected!": "Schlechte Entropie erkannt!", "Print Test QR": "Drucke Test-QR", "Print Tiny Seed?": "Tiny Seed drucken?", "Print to QR": "Als QR-Code drucken", "Print to QR?": "Als QR-Code drucken?", "Print?": "Drucken?", "Printer": "Drucker", "Printer Driver not set!": "Druckertreiber nicht gesetzt!", "Printing..": "Wird gedruckt..", "Proceed anyway?": "Trotzdem fortfahren?", "Proceed?": "Weiter?", "Processing..": "Wird bearbeitet..", "QR Code": "QR-Code", "RX Pin": "RX Pin", "Reboot": "Neustart", "Receive": "Empfangen", "Receive Addresses": "Empfangsadresse", "Region:": "Region:", "Remove %s?": "Löschen %s?", "Remove Mnemonic": "Mnemonic löschen", "Remove firmware files from SD Card?": "Firmware-Dateien von der SD-Karte entfernen?", "Res. - Format": "Res. - Format", "Restore factory settings and reboot?": "Werkseinstellungen wiederherstellen und neu starten?", "Return to QR Viewer": "Zurück zum QR-Viewer", "Review scanned data, edit if necessary": "Überprüfe gescannte Daten und bearbeite sie bei Bedarf", "Right": "Rechts", "Roll dice at least %d times to generate a mnemonic.": "Würfel mindestens %d Mal, um eine Mnemonic zu erzeugen.", "Rolls distribution:": "Rollenverteilung:", "Rolls:": "Würfe:", "SD card": "SD-Karte", "SD card not detected.": "SD-Karte nicht erkannt.", "SHA256 of rolls:": "SHA256 der Würfe:", "SHA256 of snapshot:": "SHA256 des Snapshots:", "Save QR Image to SD Card": "QR-Bild auf SD-Karte speichern", "Save to SD card": "Auf SD-Karte speichern?", "Save to SD card?": "Auf SD-Karte speichern?", "Saved to SD card": "Auf SD-Karte gespeichert", "Scale": "Skala", "Scan Address": "Adresse\nscannen", "Scan BIP39 Passphrase": "Scan BIP39 Passphrase", "Scan Key QR Code": "Schlüssel QR-Code Scannen", "Scanning words 1-12 again": "Wörter 1-12 erneut scannen", "Scanning words 13-24": "Wörter 13-24 scannen", "Screensaver Time": "Bildschirmschonerzeit", "Script Type": "Script-Art", "Security": "Sicherheit", "Self-transfer or Change (%d):": "Selbstübertragung oder Change (%d):", "Self-transfer:": "Selbstübertragung:", "Set a tamper check code first": "Legen Sie zuerst einen Tamper Check Code fest", "Settings": "Einstellungen", "Settings stored internally on flash.": "Die Einstellungen werden intern auf Flash gespeichert.", "Settings stored on SD card.": "Einstellungen auf SD-Karte gespeichert.", "Shannon's Entropy:": "Shannons Entropie:", "Shutdown": "Ausschalten", "Shutdown Time": "Abschaltzeit:", "Shutting down..": "Herunterfahren..", "Sign": "Signieren", "Sign to QR code": "Am QR-Code unterschreiben", "Sign to SD card": "Auf SD-Karte signieren", "Sign?": "Signieren?", "Signature": "Signatur", "Signed Message": "Signierte Nachricht", "Signed PSBT": "Signierte PSBT", "Signing..": "Unterschreiben..", "Single-sig": "Single-Sig", "Size:": "Größe:", "Some checks cannot be performed.": "Einige Schecks können nicht durchgeführt werden.", "Spend (%d):": "Ausgabe (%d):", "Spend:": "Ausgaben:", "Stats for Nerds": "Statistiken für Nerds", "Store on Flash": "Auf Flash speichern", "Store on SD Card": "Auf der SD-Karte speichern", "Swipe to change mode": "Wischen um den Modus zu ändern", "TC Flash Hash": "TC Flash-Hash", "TC Flash Hash at Boot": "TC Flash-Hash beim Start", "TOUCH or ENTER to capture": "TOUCH oder ENTER zum Erfassen", "TX Pin": "TX Pin", "Tamper Check Code": "Tamper Check Code", "Tamper check code set successfully": "Tamper Check Code erfolgreich gesetzt", "Tamper check codes do not match": "Tamper Check Codes stimmen nicht überein", "Text": "Text", "Theme": "Thema", "Thermal": "Thermisch", "To ensure data is unrecoverable use Wipe Device feature": "Um sicherzustellen, dass die Daten nicht wiederhergestellt werden können, verwenden Sie die Funktion 'Gerät löschen'", "Toggle Brightness": "Helligkeit umschalten", "Tools": "Werkzeuge", "Touch Threshold": "Berühre Schwellenwert", "Touchscreen": "Touchscreen", "Try more?": "Weiter versuchen?", "Type BIP39 Passphrase": "BIP39 Passphrase eingeben", "Type Key": "Schlüssel eingeben", "Unit": "Einheit", "Upgrade complete.": "Upgrade abgeschlossen.", "Use a black background surface.": "Verwende eine schwarze Hintergrundfläche.", "Use camera's entropy to create a new mnemonic": "Verwende die Entropie der Kamera, um eine neue Mnemonic zu erstellen", "Used:": "Belegt:", "User's Data": "Benutzerdaten", "Value %s out of range: [%s, %s]": "Wert %S außerhalb des Bereichs: [ %s, %s]", "Value must be multiple of %s": "Der Wert muss ein Vielfaches von %s sein", "Verifying..": "Überprüfung..", "Version": "Version", "Via Camera": "Via Kamera", "Via D20": "Via D20", "Via D6": "Via D6", "Via Manual Input": "Via manueller Eingabe", "Via Words": "Via Wörter", "Wait for the capture": "Warte auf die Erfassung", "Wallet": "Wallet", "Wallet Descriptor": "Wallet-Deskriptor", "Wallet output descriptor": "Wallet Ausgabedeskriptor", "Wallet output descriptor loaded!": "Wallet Ausgabedeskriptor geladen!", "Wallet output descriptor not found.": "Wallet Ausgabedeskriptor nicht gefunden.", "Warning:": "Warnung:", "Word %d": "Wort %d", "Word Numbers": "Wortnummern", "Words": "Wörter", "Yes": "Ja", "is a valid address!": "ist eine gültige Adresse!", "was NOT FOUND in the first %d addresses": "wurde in den ersten %d Adressen nicht gefunden"} \ No newline at end of file +{ + "% of the amount.": "% des Betrags.", + "%d of %d multisig": "%d von %d Multisig", + "%d to %d": "%d bis %d ", + "%s removed.": "%s wurde entfernt.", + "(%d total)": "(%d insgesamt)", + "(Experimental)": "(Experimental)", + "(watch-only)": "(nur zur Betrachtung)", + "12 words": "12 Wörter", + "24 words": "24 Wörter", + "About": "Über", + "Accept assumption?": "Annahme akzeptieren?", + "Account": "Konto", + "Account #0 would be assumed": "Konto #0 würde angenommen", + "Account Index": "Kontoindex", + "Add or change wallet passphrase?": "Wallet-Passphrase hinzufügen oder ändern?", + "Additional entropy from camera required for AES-CBC mode": "Zusätzliche Entropie von der Kamera für den AES-CBC-Modus erforderlich", + "Address": "Adresse", + "Align camera and backup plate properly.": "Richte Kamera und Sicherungsplatte richtig aus.", + "Allow in settings first!": "Erlaube zuerst Einstellungen!", + "Anti-glare disabled": "Blendschutz deaktiviert", + "Anti-glare enabled": "Blendschutz aktiviert", + "Appearance": "Aussehen", + "Are you sure?": "Bist Du sicher?", + "BGR Colors": "BGR-Farben", + "BIP39 Mnemonic": "BIP39-Mnemonik", + "Back": "Zurück", + "Back to Menu": "Zurück zum Menü", + "Backup Mnemonic": "Mnemonik-Backup", + "Bad signature": "Ungültige Signatur", + "Base64 Password": "Base64-Passwort", + "Baudrate": "Baudrate", + "Binary Grid": "Binäres Gitter", + "Border Padding": "Randpolsterung", + "Brightness": "Helligkeit", + "Buttons": "Tasten", + "Buttons Debounce": "Entprellung der Tasten", + "Capture cancelled": "Aufnahme abgebrochen", + "Change": "Change Adresse", + "Change Addresses": "Change Adressen", + "Change theme and reboot?": "Thema ändern und neu starten?", + "Change:": "Change:", + "Changes will last until shutdown.": "Änderungen bleiben bis zum Herunterfahren bestehen.", + "Check SD Card": "Prüfe SD-Karte", + "Check that address belongs to this wallet?": "Überprüfen, ob diese Adresse zu dieser Wallet gehört?", + "Checked %d addresses with no matches.": "Überprüfte %d Adresse ohne Übereinstimmungen.", + "Checking for SD card..": "Suche nach SD-Karte..", + "Confirm Tamper Check Code": "Bestätigen Sie den Tamper Check Code", + "Create QR Code": "Erstelle QR-Code", + "Create QR code from text?": "QR-Code aus Text erzeugen?", + "Created:": "Erstellt:", + "Current Tamper Check Code": "Aktueller Tamper Check Code", + "Custom QR Code": "Benutzerdefinierte QR-Code", + "Customize": "Anpassen", + "Customizing your wallet will generate a new Key.": "Wenn Sie Ihr Wallet anpassen, wird ein neuer Schlüssel generiert.", + "Cut Depth": "Schnitttiefe", + "Cut Method": "Cut-Methode", + "Decimal": "Dezimal", + "Decrypt?": "Entschlüsseln?", + "Default Wallet": "Standard-Wallet", + "Depth Per Pass": "Tiefe pro Durchgang", + "Derive BIP85 entropy?": "BIP85-Entropie ableiten?", + "Descriptor Addresses": "Deskriptor-Adressen", + "Display": "Bildschirm", + "Do not power off, it may take a while to complete.": "Schalten Sie das Gerät nicht aus, es kann eine Weile dauern.", + "Done?": "Fertig?", + "Double mnemonic": "Doppelte Gedächtnisstütze", + "Driver": "Driver", + "Empty": "Leer", + "Enable Krux apps": "Krux-Apps aktivieren", + "Encrypted": "Verschlüsselt", + "Encrypted QR Code": "Verschlüsselter QR-Code", + "Encrypted mnemonic was not stored": "Verschlüsselte Mnemonic wurde nicht gespeichert", + "Encrypted mnemonic was stored with ID:": "Speicherung der verschlüsselten Mnemonic mit ID:", + "Encryption": "Verschlüsselung", + "Encryption Mode": "Verschlüsselungsmodus", + "Enter %d BIP-39 words.": "Geben Sie %d BIP-39 Wörter ein.", + "Enter a 6+ characters Tamper Check Code": "Geben Sie einen Tamper Check Code mit 6+ Zeichen ein", + "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Gib jedes Wort Deiner BIP-39 Mnemonic als Zahl von 1 bis 2048 ein.", + "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Gib jedes Wort Deiner BIP-39 Mnemonic als Hexadezimalzahl von 1 bis 800 ein.", + "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Gib jedes Wort Deiner BIP-39 Mnemonic als Oktalzahl von 1 bis 4000 ein.", + "Enter each word of your BIP-39 mnemonic.": "Gib jedes Wort Deiner BIP-39 Mnemonic ein.", + "Erase User's Data": "Benutzerdaten löschen", + "Erasing user's data..": "Benutzerdaten werden gelöscht..", + "Error:": "Fehler:", + "Esc": "Esc", + "Execute a signed Krux app?": "Eine signierte Krux-App ausführen?", + "Explore files?": "Dateien durchsuchen?", + "Exporting to SD card..": "Auf SD-Karte exportieren..", + "Extended Public Key": "Öffentlicher Schlüssel", + "Factory Settings": "Werkeinstellungen", + "Failed to decrypt": "Entschlüsselung fehlgeschlagen", + "Failed to load PSBT": "PSBT konnte nicht geladen werden", + "Failed to load address": "Adresse konnte nicht geladen werden", + "Failed to load key": "Schlüssel konnte nicht geladen werden", + "Failed to load message": "Nachricht konnte nicht geladen werden", + "Failed to load mnemonic": "Mnemonic konnte nicht geladen werden", + "Failed to load output descriptor": "Ausgabedeskriptor konnte nicht geladen werden", + "Failed to load passphrase": "Passphrase konnte nicht geladen werden", + "Failed to store mnemonic": "Mnemonic konnte nicht gespeichert werden", + "Fee:": "Gebühr:", + "Feed Rate": "Vorschubgeschwindigkeit", + "Filename": "Dateiname", + "Filename %s exists on SD card, overwrite?": "Dateiname %s existiert auf SD-Karte, überschreiben?", + "Fill the flash with entropy from camera?": "Den Flash mit Entropie von der Kamera füllen?", + "Filling Flash": "Flash wird gefüllt", + "Fingerprint unset in PSBT": "Fingerabdruck in PSBT deaktiviert", + "Firmware exceeds max size: %d": "Die Firmware übersteigt die maximale Größe: %d", + "Flash Map": "Flash-Karte", + "Flash Tools": "Flash-Tools", + "Flash filled with camera entropy": "Flash gefüllt mit Kameraentropie", + "Flipped X Coordinates": "Umgedrehte X-Koordinaten", + "Flute Diameter": "Flötendurchmesser", + "Free:": "Frei:", + "From Storage": "Vom Speicher", + "Fully erase your SD card in another device to ensure data is unrecoverable": "Löschen Sie Ihre SD-Karte vollständig in einem anderen Gerät, um sicherzustellen, dass die Daten nicht wiederhergestellt werden können", + "Generate Mnemonic": "Mnemonik erzeugen", + "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Dieser Mnemonic eine benutzerdefinierte ID zuteilen? Andernfalls wird der aktuelle Fingerabdruck verwendet", + "Go": "Go", + "Good entropy": "Gute Entropie", + "Hardware": "Hardware", + "Hex Public Key": "Hex öffentlicher Schlüssel", + "Hexadecimal": "Hexadezimal", + "Hide Mnemonics": "Mnemonics ausblenden", + "High fees!": "Hohe Gebühren!", + "ID already exists": "ID existiert bereits", + "Index": "Index", + "Index: %s": "Index: %s", + "Inputs (%d):": "Input (%d):", + "Install?": "Installieren?", + "Insufficient Entropy!": "Unzureichende Entropie!", + "Insufficient entropy": "Unzureichende Entropie", + "Invalid Tamper Check Code": "Ungültiger Tamper Check Code", + "Invalid address": "Ungültige Adresse", + "Invalid bootloader": "Ungültiger Bootloader", + "Invalid mnemonic length": "Ungültige mnemonische Lange", + "Invalid public key": "Ungültiger öffentlicher Schlüssel", + "Invalid wallet:": "Ungültige Wallet:", + "Invert": "Umkehren", + "Inverted Colors": "Invertierte Farben", + "Key": "Schlüssel", + "Key was not provided": "Schlüssel wurde nicht zur Verfügung gestellt", + "Krux Printer Test QR": "Krux Drucker Test-QR", + "LCD Type": "LCD-Typ", + "Language": "Sprache", + "Leave blank if you'd like Krux to pick a valid final word": "Lassen Sie das Feld leer, wenn Sie möchten, dass Krux ein gültiges letztes Wort auswählt", + "Left": "Links", + "Length: %s": "Länge: %s", + "Line Delay": "Leitungsverzögerung", + "Line:": "Linie:", + "Load Krux app": "Krux-App laden", + "Load Mnemonic": "Mnemonic laden", + "Load Wallet": "Wallet laden", + "Load a trusted wallet descriptor to view addresses?": "Einen vertrauenswürdigen Wallet-Deskriptor laden, um Adressen anzuzeigen?", + "Load from SD card": "Von SD-Karte laden", + "Load from SD card?": "Von SD-Karte laden?", + "Load from camera": "Von der Kamera laden", + "Load one?": "Eine laden?", + "Load?": "Laden?", + "Loading Camera..": "Lade Kamera..", + "Loading change addresses..": "Lade Change Adressen..", + "Loading printer..": "Drucker wird geladen..", + "Loading receive addresses..": "Lade Empfangsadressen..", + "Loading..": "Wird geladen..", + "Locale": "Spracheinstellung", + "Location": "Speicherort", + "Maximum length exceeded (%s)": "Maximale Länge überschritten (%s)", + "Message": "Nachricht", + "Message:": "Nachricht:", + "Missing signature file": "Fehlende Signaturdatei", + "Mnemonic": "Mnemonic", + "Mnemonic ID": "Mnemonische ID", + "Mnemonic and passphrase will be kept.": "Mnemotechnik und Passphrase werden beibehalten.", + "Mnemonic was not encrypted": "Mnemonic wurde nicht verschlüsselt", + "Modified:": "Geändert:", + "Multisig": "Multisig", + "Native Segwit - 84 would be assumed": "Native Segwit - 84 würde angenommen", + "Network": "Netzwerk", + "New Mnemonic": "Neue Mnemonic", + "New firmware detected.": "Neue Firmware erkannt.", + "No": "Nein", + "No Passphrase": "Keine Passphrase", + "Not enough rolls!": "Nicht genug Würfe!", + "Numbers": "Zahlen", + "Octal": "Oktal", + "Other Formats": "Andere Formate", + "PBKDF2 Iter.": "PBKDF2-Iter.", + "Paint punched dots black so they can be detected.": "Male gestanzte Punkte schwarz an, damit sie erkannt werden können.", + "Paper Width": "Papierbreite", + "Part": "Teil", + "Part Size": "Teilegröße", + "Passphrase": "Passphrase", + "Password Length": "Passwortlänge", + "Path mismatch": "Pfad stimmt nicht überein", + "Pattern detected!": "Muster erkannt!", + "Permanently remove all stored encrypted mnemonics and settings from flash?": "Alle gespeicherten verschlüsselten Mnemoniken und Einstellungen dauerhaft vom Flash-Speicher entfernen?", + "Persist": "Speicher", + "Pixels deviation index:": "Pixelabweichungsindex:", + "Plaintext QR": "Klartext-QR", + "Please load a wallet output descriptor": "Bitte lade einen Wallet Ausgabedeskriptor", + "Plunge Rate": "Tauchrate", + "Poor entropy": "Schlechte Entropie", + "Poor entropy detected!": "Schlechte Entropie erkannt!", + "Print Test QR": "Drucke Test-QR", + "Print Tiny Seed?": "Tiny Seed drucken?", + "Print to QR": "Als QR-Code drucken", + "Print to QR?": "Als QR-Code drucken?", + "Print?": "Drucken?", + "Printer": "Drucker", + "Printer Driver not set!": "Druckertreiber nicht gesetzt!", + "Printing..": "Wird gedruckt..", + "Proceed anyway?": "Trotzdem fortfahren?", + "Proceed?": "Weiter?", + "Processing..": "Wird bearbeitet..", + "QR Code": "QR-Code", + "RX Pin": "RX Pin", + "Reboot": "Neustart", + "Receive": "Empfangen", + "Receive Addresses": "Empfangsadresse", + "Region:": "Region:", + "Remove %s?": "Löschen %s?", + "Remove Mnemonic": "Mnemonic löschen", + "Remove firmware files from SD Card?": "Firmware-Dateien von der SD-Karte entfernen?", + "Res. - Format": "Res. - Format", + "Restore factory settings and reboot?": "Werkseinstellungen wiederherstellen und neu starten?", + "Return to QR Viewer": "Zurück zum QR-Viewer", + "Review scanned data, edit if necessary": "Überprüfe gescannte Daten und bearbeite sie bei Bedarf", + "Right": "Rechts", + "Roll dice at least %d times to generate a mnemonic.": "Würfel mindestens %d Mal, um eine Mnemonic zu erzeugen.", + "Rolls distribution:": "Rollenverteilung:", + "Rolls:": "Würfe:", + "SD card": "SD-Karte", + "SD card not detected.": "SD-Karte nicht erkannt.", + "SHA256 of rolls:": "SHA256 der Würfe:", + "SHA256 of snapshot:": "SHA256 des Snapshots:", + "Save QR Image to SD Card": "QR-Bild auf SD-Karte speichern", + "Save to SD card": "Auf SD-Karte speichern?", + "Save to SD card?": "Auf SD-Karte speichern?", + "Saved to SD card": "Auf SD-Karte gespeichert", + "Scale": "Skala", + "Scan Address": "Adresse\nscannen", + "Scan BIP39 Passphrase": "Scan BIP39 Passphrase", + "Scan Key QR Code": "Schlüssel QR-Code Scannen", + "Scanning words 1-12 again": "Wörter 1-12 erneut scannen", + "Scanning words 13-24": "Wörter 13-24 scannen", + "Screensaver Time": "Bildschirmschonerzeit", + "Script Type": "Script-Art", + "Security": "Sicherheit", + "Self-transfer or Change (%d):": "Selbstübertragung oder Change (%d):", + "Self-transfer:": "Selbstübertragung:", + "Set a tamper check code first": "Legen Sie zuerst einen Tamper Check Code fest", + "Settings": "Einstellungen", + "Settings stored internally on flash.": "Die Einstellungen werden intern auf Flash gespeichert.", + "Settings stored on SD card.": "Einstellungen auf SD-Karte gespeichert.", + "Shannon's Entropy:": "Shannons Entropie:", + "Shutdown": "Ausschalten", + "Shutdown Time": "Abschaltzeit:", + "Shutting down..": "Herunterfahren..", + "Sign": "Signieren", + "Sign to QR code": "Am QR-Code unterschreiben", + "Sign to SD card": "Auf SD-Karte signieren", + "Sign?": "Signieren?", + "Signature": "Signatur", + "Signed Message": "Signierte Nachricht", + "Signed PSBT": "Signierte PSBT", + "Signing..": "Unterschreiben..", + "Single-sig": "Single-Sig", + "Size:": "Größe:", + "Some checks cannot be performed.": "Einige Schecks können nicht durchgeführt werden.", + "Spend (%d):": "Ausgabe (%d):", + "Spend:": "Ausgaben:", + "Stats for Nerds": "Statistiken für Nerds", + "Store on Flash": "Auf Flash speichern", + "Store on SD Card": "Auf der SD-Karte speichern", + "Swipe to change mode": "Wischen um den Modus zu ändern", + "TC Flash Hash": "TC Flash-Hash", + "TC Flash Hash at Boot": "TC Flash-Hash beim Start", + "TOUCH or ENTER to capture": "TOUCH oder ENTER zum Erfassen", + "TX Pin": "TX Pin", + "Tamper Check Code": "Tamper Check Code", + "Tamper check code set successfully": "Tamper Check Code erfolgreich gesetzt", + "Tamper check codes do not match": "Tamper Check Codes stimmen nicht überein", + "Text": "Text", + "Theme": "Thema", + "Thermal": "Thermisch", + "To ensure data is unrecoverable use Wipe Device feature": "Um sicherzustellen, dass die Daten nicht wiederhergestellt werden können, verwenden Sie die Funktion 'Gerät löschen'", + "Toggle Brightness": "Helligkeit umschalten", + "Tools": "Werkzeuge", + "Touch Threshold": "Berühre Schwellenwert", + "Touchscreen": "Touchscreen", + "Try more?": "Weiter versuchen?", + "Type BIP39 Passphrase": "BIP39 Passphrase eingeben", + "Type Key": "Schlüssel eingeben", + "Unit": "Einheit", + "Upgrade complete.": "Upgrade abgeschlossen.", + "Use a black background surface.": "Verwende eine schwarze Hintergrundfläche.", + "Use camera's entropy to create a new mnemonic": "Verwende die Entropie der Kamera, um eine neue Mnemonic zu erstellen", + "Used:": "Belegt:", + "User's Data": "Benutzerdaten", + "Value %s out of range: [%s, %s]": "Wert %S außerhalb des Bereichs: [ %s, %s]", + "Value must be multiple of %s": "Der Wert muss ein Vielfaches von %s sein", + "Verifying..": "Überprüfung..", + "Version": "Version", + "Via Camera": "Via Kamera", + "Via D20": "Via D20", + "Via D6": "Via D6", + "Via Manual Input": "Via manueller Eingabe", + "Via Words": "Via Wörter", + "Wait for the capture": "Warte auf die Erfassung", + "Wallet": "Wallet", + "Wallet Descriptor": "Wallet-Deskriptor", + "Wallet output descriptor": "Wallet Ausgabedeskriptor", + "Wallet output descriptor loaded!": "Wallet Ausgabedeskriptor geladen!", + "Wallet output descriptor not found.": "Wallet Ausgabedeskriptor nicht gefunden.", + "Warning:": "Warnung:", + "Word %d": "Wort %d", + "Word Numbers": "Wortnummern", + "Words": "Wörter", + "Yes": "Ja", + "is a valid address!": "ist eine gültige Adresse!", + "was NOT FOUND in the first %d addresses": "wurde in den ersten %d Adressen nicht gefunden" +} \ No newline at end of file diff --git a/i18n/translations/es-MX.json b/i18n/translations/es-MX.json index a5383063d..9836fe256 100644 --- a/i18n/translations/es-MX.json +++ b/i18n/translations/es-MX.json @@ -1 +1,322 @@ -{"% of the amount.": "% del monto.", "%d of %d multisig": "%d de %d multisig", "%d to %d": "%d a %d", "%s removed.": "%s eliminado.", "(%d total)": "(%d total)", "(Experimental)": "(Experimental)", "(watch-only)": "(Solo para observación)", "12 words": "12 palabras", "24 words": "24 palabras", "About": "Nosotros", "Accept assumption?": "¿Aceptar la suposición?", "Account": "Cuenta", "Account #0 would be assumed": "Se supondría que la cuenta #0", "Account Index": "Índice de la cuenta", "Add or change wallet passphrase?": "¿Añadir o cambiar passphrase de la cartera?", "Additional entropy from camera required for AES-CBC mode": "Se requiere entropía adicional de la cámara para el modo AES-CBC", "Address": "Dirección", "Align camera and backup plate properly.": "Alinea la cámara y la placa de respaldo correctamente.", "Allow in settings first!": "¡Permitir en la configuración primero!", "Anti-glare disabled": "Anti-reflejo desactivado", "Anti-glare enabled": "Anti-reflejo habilitado", "Appearance": "Apariencia", "Are you sure?": "¿Estás seguro?", "BGR Colors": "Colores BGR", "BIP39 Mnemonic": "Mnemónico BIP39", "Back": "Atrás", "Back to Menu": "Volver al Menú", "Backup Mnemonic": "Backup del Mnemónico", "Bad signature": "Firma incorrecta", "Base64 Password": "Contraseña Base64", "Baudrate": "Baudrate", "Binary Grid": "Cuadrícula binaria", "Border Padding": "Grosor del Borde", "Brightness": "Brillo", "Buttons": "Botones", "Buttons Debounce": "Rebote de Botones", "Capture cancelled": "Captura cancelada", "Change": "Cambio", "Change Addresses": "Direcciones de Cambio", "Change theme and reboot?": "¿Cambiar de tema y reiniciar?", "Change:": "Cambio:", "Changes will last until shutdown.": "Los cambios durarán hasta que el dispositivo se apague.", "Check SD Card": "Verifica Tarjeta SD", "Check that address belongs to this wallet?": "¿Verificar que la dirección pertenece a esta cartera?", "Checked %d addresses with no matches.": "Comprobado %d direcciones sin coincidencias.", "Checking for SD card..": "Comprobación de la tarjeta SD..", "Confirm Tamper Check Code": "Confirmar el código de verificación", "Create QR Code": "Crear Código QR", "Create QR code from text?": "¿Crear código QR desde texto?", "Created:": "Creado:", "Current Tamper Check Code": "Código de verificación actual", "Custom QR Code": "Código QR Personalizado", "Customize": "Personalizar", "Customizing your wallet will generate a new Key.": "Personalizar tu cartera generará una nueva clave", "Cut Depth": "Profundidad de Corte", "Cut Method": "Método de Corte", "Decimal": "Decimal", "Decrypt?": "¿Descifrar?", "Default Wallet": "Cartera Predeterminada", "Depth Per Pass": "Profundidad por Pasada", "Derive BIP85 entropy?": "¿Derivar entropía BIP85?", "Descriptor Addresses": "Direcciones del descriptor", "Display": "Pantalla", "Do not power off, it may take a while to complete.": "No apagues el dispositivo, puede tardar un tiempo en completarse.", "Done?": "¿Listo?", "Double mnemonic": "Doble mnemónico", "Driver": "Operador", "Empty": "Vacío", "Enable Krux apps": "Habilitar aplicaciones Krux", "Encrypted": "Cifrado", "Encrypted QR Code": "Código QR Cifrado", "Encrypted mnemonic was not stored": "Mnemónico cifrado no se almacenó", "Encrypted mnemonic was stored with ID:": "Mnemónico cifrado fue almacenado con ID:", "Encryption": "Cifrado", "Encryption Mode": "Modo de Cifrado", "Enter %d BIP-39 words.": "Ingrese %d palabras BIP-39.", "Enter a 6+ characters Tamper Check Code": "Introduzca un código de verificación de más de 6 caracteres", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Ingresa cada palabra de tu mnemónico BIP-39 como un número del 1 al 2048.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Ingresa cada palabra de tu mnemónico BIP-39 como un número en hexadecimal del 1 al 800.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Ingresa cada palabra de tu mnemónico BIP-39 como un número en octal del 1 al 4000.", "Enter each word of your BIP-39 mnemonic.": "Ingresa cada palabra de tu mnemónico BIP-39.", "Erase User's Data": "Borrar datos de usuario", "Erasing user's data..": "Borrando los datos del usuario..", "Error:": "Error:", "Esc": "Esc", "Execute a signed Krux app?": "¿Ejecutar una aplicación Krux firmada?", "Explore files?": "¿Explorar archivos?", "Exporting to SD card..": "Exportando a la tarjeta SD..", "Extended Public Key": "Clave Pública Extendida", "Factory Settings": "Ajustes de Fábrica", "Failed to decrypt": "Error al descifrar", "Failed to load PSBT": "No se pudo cargar la PSBT", "Failed to load address": "No se pudo cargar la dirección", "Failed to load key": "No se pudo cargar la clave", "Failed to load message": "No se pudo cargar el mensaje", "Failed to load mnemonic": "No se pudo importar el mnemónico", "Failed to load output descriptor": "No se pudo cargar el descriptor de salida", "Failed to load passphrase": "No se pudo cargar el passphrase", "Failed to store mnemonic": "No pudo almacenar mnemónico", "Fee:": "Comisión:", "Feed Rate": "Feed Rate", "Filename": "Nombre del Archivo", "Filename %s exists on SD card, overwrite?": "El nombre de archivo %s existe en la tarjeta SD, ¿sobrescribir?", "Fill the flash with entropy from camera?": "¿Llenar el flash con entropía de la cámara?", "Filling Flash": "Llenando Flash", "Fingerprint unset in PSBT": "Huella dactilar no establecida en PSBT", "Firmware exceeds max size: %d": "El firmware supera el tamaño máximo: %d", "Flash Map": "Mapa Flash", "Flash Tools": "Flash Tools", "Flash filled with camera entropy": "Flash lleno de entropía de cámara", "Flipped X Coordinates": "Coordenadas X Invertidas", "Flute Diameter": "Diámetro de la Flauta", "Free:": "Libre:", "From Storage": "Desde el Almacenamiento", "Fully erase your SD card in another device to ensure data is unrecoverable": "Borra completamente su tarjeta SD en otro dispositivo para asegurarse de que los datos sean irrecuperables", "Generate Mnemonic": "Generar Mnemónico", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "¿Darle a este mnemónico una identificación personalizada? De lo contrario se utilizará el fingerprint actual", "Go": "Ir", "Good entropy": "Buena entropía", "Hardware": "Hardware", "Hex Public Key": "Clave Pública Hexadecimal", "Hexadecimal": "Hexadecimal", "Hide Mnemonics": "Ocultar Mnemónicos", "High fees!": "¡Tarifas altas!", "ID already exists": "ID ya existe", "Index": "Índice", "Index: %s": "Índice: %s", "Inputs (%d):": "Entradas (%d):", "Install?": "¿Instalar?", "Insufficient Entropy!": "¡Entropía Insuficiente!", "Insufficient entropy": "Entropía insuficiente", "Invalid Tamper Check Code": "Código de verificación no válido", "Invalid address": "Dirección inválida", "Invalid bootloader": "Bootloader inválido", "Invalid mnemonic length": "Longitud mnemónica no válida", "Invalid public key": "Clave pública inválida", "Invalid wallet:": "Cartera inválida:", "Invert": "Invertir", "Inverted Colors": "Colores Invertidos", "Key": "Clave", "Key was not provided": "No se proporcionó la clave", "Krux Printer Test QR": "Test de impresión QR", "LCD Type": "Tipo de LCD", "Language": "Idioma", "Leave blank if you'd like Krux to pick a valid final word": "Déjalo en blanco si quieres que Krux elija una última palabra válida", "Left": "Izquierda", "Length: %s": "Longitud: %s", "Line Delay": "Retraso de Línea", "Line:": "Línea:", "Load Krux app": "Cargar aplicación Krux", "Load Mnemonic": "Importar Mnemónico", "Load Wallet": "Cargar Cartera", "Load a trusted wallet descriptor to view addresses?": "¿Cargar un descriptor de monedero de confianza para ver las direcciones?", "Load from SD card": "Cargar desde tarjeta SD", "Load from SD card?": "¿Cargar desde la tarjeta SD?", "Load from camera": "Cargar desde la cámara", "Load one?": "¿Cargar algo?", "Load?": "¿Cargar?", "Loading Camera..": "Cargando Camara..", "Loading change addresses..": "Cargando direcciones de cambio..", "Loading printer..": "Cargando impresora..", "Loading receive addresses..": "Cargando direcciones de recepción..", "Loading..": "Cargando..", "Locale": "Idioma", "Location": "Ubicación", "Maximum length exceeded (%s)": "Longitud máxima excedida (%s)", "Message": "Mensaje", "Message:": "Mensaje:", "Missing signature file": "Falta archivo de firma", "Mnemonic": "Mnemónico", "Mnemonic ID": "Identificación del Mnemónico", "Mnemonic and passphrase will be kept.": "Mnemónico y passphrase se mantendrán.", "Mnemonic was not encrypted": "Mnemónico no fue descifrado", "Modified:": "Modificado:", "Multisig": "Multisig", "Native Segwit - 84 would be assumed": "Segwit nativo - 84 se supondría", "Network": "Red", "New Mnemonic": "Nuevo Mnemónico", "New firmware detected.": "Nuevo firmware detectado.", "No": "No", "No Passphrase": "Sin Passphrase", "Not enough rolls!": "¡No hay suficientes tiradas!", "Numbers": "Números", "Octal": "Octales", "Other Formats": "Otros Formatos", "PBKDF2 Iter.": "Iter. PBKDF2", "Paint punched dots black so they can be detected.": "Pinte los puntos perforados de negro para que puedan ser detectados.", "Paper Width": "Ancho del Papel", "Part": "Parte", "Part Size": "Tamaño de la Pieza", "Passphrase": "Passphrase", "Password Length": "Longitud", "Path mismatch": "La ruta no coincide", "Pattern detected!": "¡Patrón detectado!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "¿Eliminar permanentemente todos los mnemónicos y configuraciones cifradas almacenadas del flash?", "Persist": "Guardar", "Pixels deviation index:": "Índice de desviación de píxeles:", "Plaintext QR": "QR de Texto", "Please load a wallet output descriptor": "Carga un descriptor de cartera", "Plunge Rate": "Tasa de Caída", "Poor entropy": "Baja entropía", "Poor entropy detected!": "Mala entropía detectada!", "Print Test QR": "Prueba de Impresión QR", "Print Tiny Seed?": "¿Imprimir Tiny Seed?", "Print to QR": "Imprimir como Código QR", "Print to QR?": "¿Imprimir con Codigo QR?", "Print?": "¿Impresión?", "Printer": "Impresora", "Printer Driver not set!": "¡El controlador de impresora no está configurado!", "Printing..": "Imprimiendo..", "Proceed anyway?": "¿Proceder de todas maneras?", "Proceed?": "¿Continuar?", "Processing..": "Procesando..", "QR Code": "Código QR", "RX Pin": "RX Pin", "Reboot": "Reiniciar", "Receive": "Recepción", "Receive Addresses": "Direcciones de Recepción", "Region:": "Región:", "Remove %s?": "Eliminar %s?", "Remove Mnemonic": "Eliminar Mnemónico", "Remove firmware files from SD Card?": "¿Eliminar archivos de firmware de la tarjeta SD?", "Res. - Format": "Res. - Formato", "Restore factory settings and reboot?": "¿Restablecer a la configuración de fábrica y reiniciar?", "Return to QR Viewer": "Volver al QR", "Review scanned data, edit if necessary": "Revisa los datos escaneados, edítalos si es necesario", "Right": "Derecha", "Roll dice at least %d times to generate a mnemonic.": "Tira el dado al menos %d veces para generar un mnemónico.", "Rolls distribution:": "Distribución de tiradas:", "Rolls:": "Tiradas:", "SD card": "Tarjeta SD", "SD card not detected.": "Tarjeta SD no detectada.", "SHA256 of rolls:": "SHA256 de las tiradas:", "SHA256 of snapshot:": "SHA256 de la instantánea:", "Save QR Image to SD Card": "Guardar Imagen QR en la Tarjeta SD", "Save to SD card": "Guardar en tarjeta SD", "Save to SD card?": "¿Guardar en la tarjeta SD?", "Saved to SD card": "Guardado en la tarjeta SD", "Scale": "Escala", "Scan Address": "Escanear Dirección", "Scan BIP39 Passphrase": "Escanear Passphrase BIP39", "Scan Key QR Code": "Escanear el Código QR", "Scanning words 1-12 again": "Escaneo de palabras 1-12 de nuevo", "Scanning words 13-24": "Escaneo de palabras 13-24", "Screensaver Time": "Tiempo de Espera del Protector de Pantalla", "Script Type": "Tipo de Script", "Security": "Seguridad", "Self-transfer or Change (%d):": "Autotransferencia o Cambio (%d):", "Self-transfer:": "Autotransferencia:", "Set a tamper check code first": "Establezca primero un código de verificación", "Settings": "Ajustes", "Settings stored internally on flash.": "Ajustes almacenados internamente en flash.", "Settings stored on SD card.": "Configuración almacenada en la tarjeta SD.", "Shannon's Entropy:": "Entropía de Shannon:", "Shutdown": "Apagar", "Shutdown Time": "Tiempo de Apagado", "Shutting down..": "Apagando..", "Sign": "Firmar", "Sign to QR code": "Firmar en Código QR", "Sign to SD card": "Firmar en la Tarjeta SD", "Sign?": "¿Firmar?", "Signature": "Firma", "Signed Message": "Mensaje Firmado", "Signed PSBT": "PSBT Firmado", "Signing..": "Firmando..", "Single-sig": "Single-sig", "Size:": "Tamaño:", "Some checks cannot be performed.": "Algunas comprobaciones no se pueden realizar.", "Spend (%d):": "Gastos (%d):", "Spend:": "Gasto:", "Stats for Nerds": "Estadísticas para Entendidos", "Store on Flash": "Almacenar en Flash", "Store on SD Card": "Almacenar en la Tarjeta SD", "Swipe to change mode": "Deslizar para cambiar de modo", "TC Flash Hash": "TC Hash Flash", "TC Flash Hash at Boot": "TC Flash Hash al arranque", "TOUCH or ENTER to capture": "TOCA o ENTER para capturar", "TX Pin": "TX Pin", "Tamper Check Code": "Código de verificación", "Tamper check code set successfully": "Código de verificación establecido con éxito", "Tamper check codes do not match": "Los códigos de verificación no coinciden", "Text": "Texto", "Theme": "Tema", "Thermal": "Térmico", "To ensure data is unrecoverable use Wipe Device feature": "Para garantizar que los datos no se puedan recuperar, utiliza la función de borrar dispositivo", "Toggle Brightness": "Alternar Brillo", "Tools": "Herramientas", "Touch Threshold": "Umbral Táctil", "Touchscreen": "Pantalla Táctil", "Try more?": "¿Intentar con mas?", "Type BIP39 Passphrase": "Escribe la Passphrase BIP39", "Type Key": "Introduce la clave", "Unit": "Unidad", "Upgrade complete.": "Actualización completa.", "Use a black background surface.": "Usa una superficie de fondo negra.", "Use camera's entropy to create a new mnemonic": "Usa la entropía de la cámara para crear una nueva mnemónica", "Used:": "Usado:", "User's Data": "Usuario", "Value %s out of range: [%s, %s]": "Valor %s fuera del rango: [ %s, %s]", "Value must be multiple of %s": "El valor debe ser múltiple de %s", "Verifying..": "Verificando..", "Version": "Versión", "Via Camera": "Desde Cámara", "Via D20": "Vía D20", "Via D6": "Vía D6", "Via Manual Input": "Introducción Manual", "Via Words": "A Través de Palabras", "Wait for the capture": "Espera la captura", "Wallet": "Cartera", "Wallet Descriptor": "Descriptor de Cartera", "Wallet output descriptor": "Descriptor de salida de cartera", "Wallet output descriptor loaded!": "¡Se ha cargado el descriptor de salida de la cartera!", "Wallet output descriptor not found.": "No se encontró el descriptor de salida de la cartera.", "Warning:": "Advertencia:", "Word %d": "Palabra %d", "Word Numbers": "Números de Palabra", "Words": "Palabras", "Yes": "Sí", "is a valid address!": "es una dirección válida!", "was NOT FOUND in the first %d addresses": "NO FUE ENCONTRADO en las primeras %d direcciones"} \ No newline at end of file +{ + "% of the amount.": "% del monto.", + "%d of %d multisig": "%d de %d multisig", + "%d to %d": "%d a %d", + "%s removed.": "%s eliminado.", + "(%d total)": "(%d total)", + "(Experimental)": "(Experimental)", + "(watch-only)": "(Solo para observación)", + "12 words": "12 palabras", + "24 words": "24 palabras", + "About": "Nosotros", + "Accept assumption?": "¿Aceptar la suposición?", + "Account": "Cuenta", + "Account #0 would be assumed": "Se supondría que la cuenta #0", + "Account Index": "Índice de la cuenta", + "Add or change wallet passphrase?": "¿Añadir o cambiar passphrase de la cartera?", + "Additional entropy from camera required for AES-CBC mode": "Se requiere entropía adicional de la cámara para el modo AES-CBC", + "Address": "Dirección", + "Align camera and backup plate properly.": "Alinea la cámara y la placa de respaldo correctamente.", + "Allow in settings first!": "¡Permitir en la configuración primero!", + "Anti-glare disabled": "Anti-reflejo desactivado", + "Anti-glare enabled": "Anti-reflejo habilitado", + "Appearance": "Apariencia", + "Are you sure?": "¿Estás seguro?", + "BGR Colors": "Colores BGR", + "BIP39 Mnemonic": "Mnemónico BIP39", + "Back": "Atrás", + "Back to Menu": "Volver al Menú", + "Backup Mnemonic": "Backup del Mnemónico", + "Bad signature": "Firma incorrecta", + "Base64 Password": "Contraseña Base64", + "Baudrate": "Baudrate", + "Binary Grid": "Cuadrícula binaria", + "Border Padding": "Grosor del Borde", + "Brightness": "Brillo", + "Buttons": "Botones", + "Buttons Debounce": "Rebote de Botones", + "Capture cancelled": "Captura cancelada", + "Change": "Cambio", + "Change Addresses": "Direcciones de Cambio", + "Change theme and reboot?": "¿Cambiar de tema y reiniciar?", + "Change:": "Cambio:", + "Changes will last until shutdown.": "Los cambios durarán hasta que el dispositivo se apague.", + "Check SD Card": "Verifica Tarjeta SD", + "Check that address belongs to this wallet?": "¿Verificar que la dirección pertenece a esta cartera?", + "Checked %d addresses with no matches.": "Comprobado %d direcciones sin coincidencias.", + "Checking for SD card..": "Comprobación de la tarjeta SD..", + "Confirm Tamper Check Code": "Confirmar el código de verificación", + "Create QR Code": "Crear Código QR", + "Create QR code from text?": "¿Crear código QR desde texto?", + "Created:": "Creado:", + "Current Tamper Check Code": "Código de verificación actual", + "Custom QR Code": "Código QR Personalizado", + "Customize": "Personalizar", + "Customizing your wallet will generate a new Key.": "Personalizar tu cartera generará una nueva clave", + "Cut Depth": "Profundidad de Corte", + "Cut Method": "Método de Corte", + "Decimal": "Decimal", + "Decrypt?": "¿Descifrar?", + "Default Wallet": "Cartera Predeterminada", + "Depth Per Pass": "Profundidad por Pasada", + "Derive BIP85 entropy?": "¿Derivar entropía BIP85?", + "Descriptor Addresses": "Direcciones del descriptor", + "Display": "Pantalla", + "Do not power off, it may take a while to complete.": "No apagues el dispositivo, puede tardar un tiempo en completarse.", + "Done?": "¿Listo?", + "Double mnemonic": "Doble mnemónico", + "Driver": "Operador", + "Empty": "Vacío", + "Enable Krux apps": "Habilitar aplicaciones Krux", + "Encrypted": "Cifrado", + "Encrypted QR Code": "Código QR Cifrado", + "Encrypted mnemonic was not stored": "Mnemónico cifrado no se almacenó", + "Encrypted mnemonic was stored with ID:": "Mnemónico cifrado fue almacenado con ID:", + "Encryption": "Cifrado", + "Encryption Mode": "Modo de Cifrado", + "Enter %d BIP-39 words.": "Ingrese %d palabras BIP-39.", + "Enter a 6+ characters Tamper Check Code": "Introduzca un código de verificación de más de 6 caracteres", + "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Ingresa cada palabra de tu mnemónico BIP-39 como un número del 1 al 2048.", + "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Ingresa cada palabra de tu mnemónico BIP-39 como un número en hexadecimal del 1 al 800.", + "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Ingresa cada palabra de tu mnemónico BIP-39 como un número en octal del 1 al 4000.", + "Enter each word of your BIP-39 mnemonic.": "Ingresa cada palabra de tu mnemónico BIP-39.", + "Erase User's Data": "Borrar datos de usuario", + "Erasing user's data..": "Borrando los datos del usuario..", + "Error:": "Error:", + "Esc": "Esc", + "Execute a signed Krux app?": "¿Ejecutar una aplicación Krux firmada?", + "Explore files?": "¿Explorar archivos?", + "Exporting to SD card..": "Exportando a la tarjeta SD..", + "Extended Public Key": "Clave Pública Extendida", + "Factory Settings": "Ajustes de Fábrica", + "Failed to decrypt": "Error al descifrar", + "Failed to load PSBT": "No se pudo cargar la PSBT", + "Failed to load address": "No se pudo cargar la dirección", + "Failed to load key": "No se pudo cargar la clave", + "Failed to load message": "No se pudo cargar el mensaje", + "Failed to load mnemonic": "No se pudo importar el mnemónico", + "Failed to load output descriptor": "No se pudo cargar el descriptor de salida", + "Failed to load passphrase": "No se pudo cargar el passphrase", + "Failed to store mnemonic": "No pudo almacenar mnemónico", + "Fee:": "Comisión:", + "Feed Rate": "Feed Rate", + "Filename": "Nombre del Archivo", + "Filename %s exists on SD card, overwrite?": "El nombre de archivo %s existe en la tarjeta SD, ¿sobrescribir?", + "Fill the flash with entropy from camera?": "¿Llenar el flash con entropía de la cámara?", + "Filling Flash": "Llenando Flash", + "Fingerprint unset in PSBT": "Huella dactilar no establecida en PSBT", + "Firmware exceeds max size: %d": "El firmware supera el tamaño máximo: %d", + "Flash Map": "Mapa Flash", + "Flash Tools": "Flash Tools", + "Flash filled with camera entropy": "Flash lleno de entropía de cámara", + "Flipped X Coordinates": "Coordenadas X Invertidas", + "Flute Diameter": "Diámetro de la Flauta", + "Free:": "Libre:", + "From Storage": "Desde el Almacenamiento", + "Fully erase your SD card in another device to ensure data is unrecoverable": "Borra completamente su tarjeta SD en otro dispositivo para asegurarse de que los datos sean irrecuperables", + "Generate Mnemonic": "Generar Mnemónico", + "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "¿Darle a este mnemónico una identificación personalizada? De lo contrario se utilizará el fingerprint actual", + "Go": "Ir", + "Good entropy": "Buena entropía", + "Hardware": "Hardware", + "Hex Public Key": "Clave Pública Hexadecimal", + "Hexadecimal": "Hexadecimal", + "Hide Mnemonics": "Ocultar Mnemónicos", + "High fees!": "¡Tarifas altas!", + "ID already exists": "ID ya existe", + "Index": "Índice", + "Index: %s": "Índice: %s", + "Inputs (%d):": "Entradas (%d):", + "Install?": "¿Instalar?", + "Insufficient Entropy!": "¡Entropía Insuficiente!", + "Insufficient entropy": "Entropía insuficiente", + "Invalid Tamper Check Code": "Código de verificación no válido", + "Invalid address": "Dirección inválida", + "Invalid bootloader": "Bootloader inválido", + "Invalid mnemonic length": "Longitud mnemónica no válida", + "Invalid public key": "Clave pública inválida", + "Invalid wallet:": "Cartera inválida:", + "Invert": "Invertir", + "Inverted Colors": "Colores Invertidos", + "Key": "Clave", + "Key was not provided": "No se proporcionó la clave", + "Krux Printer Test QR": "Test de impresión QR", + "LCD Type": "Tipo de LCD", + "Language": "Idioma", + "Leave blank if you'd like Krux to pick a valid final word": "Déjalo en blanco si quieres que Krux elija una última palabra válida", + "Left": "Izquierda", + "Length: %s": "Longitud: %s", + "Line Delay": "Retraso de Línea", + "Line:": "Línea:", + "Load Krux app": "Cargar aplicación Krux", + "Load Mnemonic": "Importar Mnemónico", + "Load Wallet": "Cargar Cartera", + "Load a trusted wallet descriptor to view addresses?": "¿Cargar un descriptor de monedero de confianza para ver las direcciones?", + "Load from SD card": "Cargar desde tarjeta SD", + "Load from SD card?": "¿Cargar desde la tarjeta SD?", + "Load from camera": "Cargar desde la cámara", + "Load one?": "¿Cargar algo?", + "Load?": "¿Cargar?", + "Loading Camera..": "Cargando Camara..", + "Loading change addresses..": "Cargando direcciones de cambio..", + "Loading printer..": "Cargando impresora..", + "Loading receive addresses..": "Cargando direcciones de recepción..", + "Loading..": "Cargando..", + "Locale": "Idioma", + "Location": "Ubicación", + "Maximum length exceeded (%s)": "Longitud máxima excedida (%s)", + "Message": "Mensaje", + "Message:": "Mensaje:", + "Missing signature file": "Falta archivo de firma", + "Mnemonic": "Mnemónico", + "Mnemonic ID": "Identificación del Mnemónico", + "Mnemonic and passphrase will be kept.": "Mnemónico y passphrase se mantendrán.", + "Mnemonic was not encrypted": "Mnemónico no fue descifrado", + "Modified:": "Modificado:", + "Multisig": "Multisig", + "Native Segwit - 84 would be assumed": "Segwit nativo - 84 se supondría", + "Network": "Red", + "New Mnemonic": "Nuevo Mnemónico", + "New firmware detected.": "Nuevo firmware detectado.", + "No": "No", + "No Passphrase": "Sin Passphrase", + "Not enough rolls!": "¡No hay suficientes tiradas!", + "Numbers": "Números", + "Octal": "Octales", + "Other Formats": "Otros Formatos", + "PBKDF2 Iter.": "Iter. PBKDF2", + "Paint punched dots black so they can be detected.": "Pinte los puntos perforados de negro para que puedan ser detectados.", + "Paper Width": "Ancho del Papel", + "Part": "Parte", + "Part Size": "Tamaño de la Pieza", + "Passphrase": "Passphrase", + "Password Length": "Longitud", + "Path mismatch": "La ruta no coincide", + "Pattern detected!": "¡Patrón detectado!", + "Permanently remove all stored encrypted mnemonics and settings from flash?": "¿Eliminar permanentemente todos los mnemónicos y configuraciones cifradas almacenadas del flash?", + "Persist": "Guardar", + "Pixels deviation index:": "Índice de desviación de píxeles:", + "Plaintext QR": "QR de Texto", + "Please load a wallet output descriptor": "Carga un descriptor de cartera", + "Plunge Rate": "Tasa de Caída", + "Poor entropy": "Baja entropía", + "Poor entropy detected!": "Mala entropía detectada!", + "Print Test QR": "Prueba de Impresión QR", + "Print Tiny Seed?": "¿Imprimir Tiny Seed?", + "Print to QR": "Imprimir como Código QR", + "Print to QR?": "¿Imprimir con Codigo QR?", + "Print?": "¿Impresión?", + "Printer": "Impresora", + "Printer Driver not set!": "¡El controlador de impresora no está configurado!", + "Printing..": "Imprimiendo..", + "Proceed anyway?": "¿Proceder de todas maneras?", + "Proceed?": "¿Continuar?", + "Processing..": "Procesando..", + "QR Code": "Código QR", + "RX Pin": "RX Pin", + "Reboot": "Reiniciar", + "Receive": "Recepción", + "Receive Addresses": "Direcciones de Recepción", + "Region:": "Región:", + "Remove %s?": "Eliminar %s?", + "Remove Mnemonic": "Eliminar Mnemónico", + "Remove firmware files from SD Card?": "¿Eliminar archivos de firmware de la tarjeta SD?", + "Res. - Format": "Res. - Formato", + "Restore factory settings and reboot?": "¿Restablecer a la configuración de fábrica y reiniciar?", + "Return to QR Viewer": "Volver al QR", + "Review scanned data, edit if necessary": "Revisa los datos escaneados, edítalos si es necesario", + "Right": "Derecha", + "Roll dice at least %d times to generate a mnemonic.": "Tira el dado al menos %d veces para generar un mnemónico.", + "Rolls distribution:": "Distribución de tiradas:", + "Rolls:": "Tiradas:", + "SD card": "Tarjeta SD", + "SD card not detected.": "Tarjeta SD no detectada.", + "SHA256 of rolls:": "SHA256 de las tiradas:", + "SHA256 of snapshot:": "SHA256 de la instantánea:", + "Save QR Image to SD Card": "Guardar Imagen QR en la Tarjeta SD", + "Save to SD card": "Guardar en tarjeta SD", + "Save to SD card?": "¿Guardar en la tarjeta SD?", + "Saved to SD card": "Guardado en la tarjeta SD", + "Scale": "Escala", + "Scan Address": "Escanear Dirección", + "Scan BIP39 Passphrase": "Escanear Passphrase BIP39", + "Scan Key QR Code": "Escanear el Código QR", + "Scanning words 1-12 again": "Escaneo de palabras 1-12 de nuevo", + "Scanning words 13-24": "Escaneo de palabras 13-24", + "Screensaver Time": "Tiempo de Espera del Protector de Pantalla", + "Script Type": "Tipo de Script", + "Security": "Seguridad", + "Self-transfer or Change (%d):": "Autotransferencia o Cambio (%d):", + "Self-transfer:": "Autotransferencia:", + "Set a tamper check code first": "Establezca primero un código de verificación", + "Settings": "Ajustes", + "Settings stored internally on flash.": "Ajustes almacenados internamente en flash.", + "Settings stored on SD card.": "Configuración almacenada en la tarjeta SD.", + "Shannon's Entropy:": "Entropía de Shannon:", + "Shutdown": "Apagar", + "Shutdown Time": "Tiempo de Apagado", + "Shutting down..": "Apagando..", + "Sign": "Firmar", + "Sign to QR code": "Firmar en Código QR", + "Sign to SD card": "Firmar en la Tarjeta SD", + "Sign?": "¿Firmar?", + "Signature": "Firma", + "Signed Message": "Mensaje Firmado", + "Signed PSBT": "PSBT Firmado", + "Signing..": "Firmando..", + "Single-sig": "Single-sig", + "Size:": "Tamaño:", + "Some checks cannot be performed.": "Algunas comprobaciones no se pueden realizar.", + "Spend (%d):": "Gastos (%d):", + "Spend:": "Gasto:", + "Stats for Nerds": "Estadísticas para Entendidos", + "Store on Flash": "Almacenar en Flash", + "Store on SD Card": "Almacenar en la Tarjeta SD", + "Swipe to change mode": "Deslizar para cambiar de modo", + "TC Flash Hash": "TC Hash Flash", + "TC Flash Hash at Boot": "TC Flash Hash al arranque", + "TOUCH or ENTER to capture": "TOCA o ENTER para capturar", + "TX Pin": "TX Pin", + "Tamper Check Code": "Código de verificación", + "Tamper check code set successfully": "Código de verificación establecido con éxito", + "Tamper check codes do not match": "Los códigos de verificación no coinciden", + "Text": "Texto", + "Theme": "Tema", + "Thermal": "Térmico", + "To ensure data is unrecoverable use Wipe Device feature": "Para garantizar que los datos no se puedan recuperar, utiliza la función de borrar dispositivo", + "Toggle Brightness": "Alternar Brillo", + "Tools": "Herramientas", + "Touch Threshold": "Umbral Táctil", + "Touchscreen": "Pantalla Táctil", + "Try more?": "¿Intentar con mas?", + "Type BIP39 Passphrase": "Escribe la Passphrase BIP39", + "Type Key": "Introduce la clave", + "Unit": "Unidad", + "Upgrade complete.": "Actualización completa.", + "Use a black background surface.": "Usa una superficie de fondo negra.", + "Use camera's entropy to create a new mnemonic": "Usa la entropía de la cámara para crear una nueva mnemónica", + "Used:": "Usado:", + "User's Data": "Usuario", + "Value %s out of range: [%s, %s]": "Valor %s fuera del rango: [ %s, %s]", + "Value must be multiple of %s": "El valor debe ser múltiple de %s", + "Verifying..": "Verificando..", + "Version": "Versión", + "Via Camera": "Desde Cámara", + "Via D20": "Vía D20", + "Via D6": "Vía D6", + "Via Manual Input": "Introducción Manual", + "Via Words": "A Través de Palabras", + "Wait for the capture": "Espera la captura", + "Wallet": "Cartera", + "Wallet Descriptor": "Descriptor de Cartera", + "Wallet output descriptor": "Descriptor de salida de cartera", + "Wallet output descriptor loaded!": "¡Se ha cargado el descriptor de salida de la cartera!", + "Wallet output descriptor not found.": "No se encontró el descriptor de salida de la cartera.", + "Warning:": "Advertencia:", + "Word %d": "Palabra %d", + "Word Numbers": "Números de Palabra", + "Words": "Palabras", + "Yes": "Sí", + "is a valid address!": "es una dirección válida!", + "was NOT FOUND in the first %d addresses": "NO FUE ENCONTRADO en las primeras %d direcciones" +} \ No newline at end of file diff --git a/i18n/translations/fr-FR.json b/i18n/translations/fr-FR.json index 2e090fe9b..28dbd7244 100644 --- a/i18n/translations/fr-FR.json +++ b/i18n/translations/fr-FR.json @@ -1 +1,322 @@ -{"% of the amount.": "% du montant.", "%d of %d multisig": "%d de %d multisignature", "%d to %d": "%d à %d", "%s removed.": "%s supprimé.", "(%d total)": "(%d au total)", "(Experimental)": "(Expérimental)", "(watch-only)": "(consultation)", "12 words": "12 mots", "24 words": "24 mots", "About": "À propos", "Accept assumption?": "Accepter supposition ?", "Account": "Compte", "Account #0 would be assumed": "Le compte n °0 serait supposé", "Account Index": "Index du compte", "Add or change wallet passphrase?": "Ajoutez ou modifiez la phrase secrète ?", "Additional entropy from camera required for AES-CBC mode": "Entropie supplémentaire de la caméra requise pour le mode AES-CBC", "Address": "Adresse", "Align camera and backup plate properly.": "Alignez correctement la caméra et plaque de sauvegarde.", "Allow in settings first!": "Autoriser d'abord dans les paramètres !", "Anti-glare disabled": "Anti-éblouissement désactivé", "Anti-glare enabled": "Anti-éblouissement activé", "Appearance": "Apparence", "Are you sure?": "Es-tu sûr ?", "BGR Colors": "Couleurs BGR", "BIP39 Mnemonic": "Mnémonique BIP39", "Back": "Retour", "Back to Menu": "Retour au menu", "Backup Mnemonic": "Sauvegarde mnémonique", "Bad signature": "Signature non valide", "Base64 Password": "Mot de passe Base64", "Baudrate": "Débit en bauds", "Binary Grid": "Grille binaire", "Border Padding": "Rembourrage de bordure", "Brightness": "Luminosité", "Buttons": "Boutons", "Buttons Debounce": "Anti-rebond des boutons", "Capture cancelled": "Capture annulée", "Change": "Monnaie", "Change Addresses": "Adresses de Monnaie", "Change theme and reboot?": "Changer de thème et redémarrer ?", "Change:": "La monnaie :", "Changes will last until shutdown.": "Les modifications dureront jusqu'à l'arrêt.", "Check SD Card": "Vérifiez la carte SD", "Check that address belongs to this wallet?": "Vérifiez que l'adresse appartient à ce portefeuille ?", "Checked %d addresses with no matches.": "%d adresses vérifiées sans correspondance.", "Checking for SD card..": "Vérification de la carte SD..", "Confirm Tamper Check Code": "Confirmer le code de non compromis", "Create QR Code": "Créer un code QR", "Create QR code from text?": "Créer un code QR à partir d'un texte ?", "Created:": "Créé :", "Current Tamper Check Code": "Code de non compromis actuel", "Custom QR Code": "Code QR personnalisé", "Customize": "Personnaliser", "Customizing your wallet will generate a new Key.": "La personnalisation de votre portefeuille générera une nouvelle clé.", "Cut Depth": "Profondeur de coupe", "Cut Method": "Méthode de coupe", "Decimal": "Décimal", "Decrypt?": "Déchiffrer ?", "Default Wallet": "Portefeuille par défaut", "Depth Per Pass": "Profondeur par passage", "Derive BIP85 entropy?": "Dériver l'entropie BIP85 ?", "Descriptor Addresses": "Adresses du descripteur", "Display": "Affichage", "Do not power off, it may take a while to complete.": "Ne pas éteindre, cela peut prendre un certain temps.", "Done?": "Terminé ?", "Double mnemonic": "Double mnémonique", "Driver": "Pilote", "Empty": "Vide", "Enable Krux apps": "Activer les applications Krux", "Encrypted": "Chiffré", "Encrypted QR Code": "Code QR chiffré", "Encrypted mnemonic was not stored": "Le mnémonique chiffré n'a pas été stocké", "Encrypted mnemonic was stored with ID:": "Mnémonique chiffré a été stocké avec ID :", "Encryption": "Chiffrement", "Encryption Mode": "Mode de chiffrement", "Enter %d BIP-39 words.": "Entrez %d mots BIP-39.", "Enter a 6+ characters Tamper Check Code": "Saisissez un code de non compromis de plus de 6 caractères", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre de 1 à 2048.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en hexadécimal de 1 à 800.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en octal de 1 à 4000.", "Enter each word of your BIP-39 mnemonic.": "Entrez chaque mot de votre mnémonique BIP-39.", "Erase User's Data": "Effacer les données de l'utilisateur", "Erasing user's data..": "Effacement des données de l'utilisateur...", "Error:": "Erreur :", "Esc": "Esc", "Execute a signed Krux app?": "Exécuter une application Krux signée ?", "Explore files?": "Explorer des fichiers ?", "Exporting to SD card..": "Exportation vers la carte SD..", "Extended Public Key": "Clé publique", "Factory Settings": "Paramètres d'usine", "Failed to decrypt": "Échec du déchiffrement", "Failed to load PSBT": "Échec du chargement PSBT", "Failed to load address": "Échec du chargement d'adresse", "Failed to load key": "Échec du chargement de la clé", "Failed to load message": "Échec du chargement du message", "Failed to load mnemonic": "Échec du chargement mnémonique", "Failed to load output descriptor": "Échec du chargement du descripteur de sortie", "Failed to load passphrase": "Échec du chargement de la phrase secrète", "Failed to store mnemonic": "Échec du stockage mnémonique", "Fee:": "Frais :", "Feed Rate": "Taux d'alimentation", "Filename": "Nom de fichier", "Filename %s exists on SD card, overwrite?": "Le nom de fichier %s existe sur la carte SD, écraser ?", "Fill the flash with entropy from camera?": "Remplir le flash avec l'entropie de la caméra ?", "Filling Flash": "Remplissage du Flash", "Fingerprint unset in PSBT": "Empreinte digitale manquante dans PSBT", "Firmware exceeds max size: %d": "Le micrologiciel dépasse la taille maximale : %d", "Flash Map": "Plan du Flash", "Flash Tools": "Outils Flash", "Flash filled with camera entropy": "Flash rempli par l'entropie de la caméra", "Flipped X Coordinates": "Coordonnées X inversées", "Flute Diameter": "Diamètre de flûte", "Free:": "Libre :", "From Storage": "Du stockage", "Fully erase your SD card in another device to ensure data is unrecoverable": "Effacez complètement votre carte SD dans un autre appareil pour assurer que les données soient irrécupérables", "Generate Mnemonic": "Générer un mnémonique", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Donnez à ce mnémonique un identifiant personnalisé ? Sinon l'empreinte actuelle sera utilisée", "Go": "OK", "Good entropy": "Bonne entropie", "Hardware": "Matériel", "Hex Public Key": "Clé publique hexadécimale", "Hexadecimal": "Hexadécimal", "Hide Mnemonics": "Masquer les mnémoniques", "High fees!": "Frais élevés !", "ID already exists": "Id existe déjà", "Index": "Index", "Index: %s": "Index : %s", "Inputs (%d):": "Entrées (%d) :", "Install?": "Installer ?", "Insufficient Entropy!": "Entropie insuffisante !", "Insufficient entropy": "Entropie insuffisante", "Invalid Tamper Check Code": "Code de non compromis non valide", "Invalid address": "Adresse invalide", "Invalid bootloader": "Chargeur de démarrage invalide", "Invalid mnemonic length": "Longueur mnémonique invalide", "Invalid public key": "Clé publique non valide", "Invalid wallet:": "Portefeuille invalide :", "Invert": "Inverser", "Inverted Colors": "Couleurs inversées", "Key": "Clé", "Key was not provided": "La clé n'a pas été fournie", "Krux Printer Test QR": "Test de l'imprimante Krux QR", "LCD Type": "Type d'écran LCD", "Language": "Langue", "Leave blank if you'd like Krux to pick a valid final word": "Laissez vide si vous souhaitez que Krux choisisse un dernier mot valide", "Left": "Gauche", "Length: %s": "Longueur : %s", "Line Delay": "Délai de Ligne", "Line:": "Ligne :", "Load Krux app": "Charger l'application Krux", "Load Mnemonic": "Charger Mnémonique", "Load Wallet": "Charger le portefeuille", "Load a trusted wallet descriptor to view addresses?": "Charger un descripteur de portefeuille de confiance pour afficher les adresses ?", "Load from SD card": "Charger depuis la carte SD", "Load from SD card?": "Charger depuis la carte SD ?", "Load from camera": "Charger depuis la caméra", "Load one?": "Charger ?", "Load?": "Charger ?", "Loading Camera..": "Activation de la Caméra..", "Loading change addresses..": "Chargement des adresses de monnaie..", "Loading printer..": "Activation de l'imprimante..", "Loading receive addresses..": "Chargement des adresses de réception ..", "Loading..": "Chargement..", "Locale": "Paramètres régionaux", "Location": "Emplacement", "Maximum length exceeded (%s)": "Longueur maximale dépassée (%s)", "Message": "Message", "Message:": "Message :", "Missing signature file": "Fichier de signature manquant", "Mnemonic": "Mnémonique", "Mnemonic ID": "ID Mnémonique", "Mnemonic and passphrase will be kept.": "Mnémonique et phrase secrète seront conservés.", "Mnemonic was not encrypted": "Mnémonique n'était pas chiffré", "Modified:": "Modifié :", "Multisig": "Multi\nsignature", "Native Segwit - 84 would be assumed": "Native Segwit - 84 serait supposé", "Network": "Réseau", "New Mnemonic": "Nouveau Mnémonique", "New firmware detected.": "Nouveau micrologiciel détecté.", "No": "Non", "No Passphrase": "Pas de phrase secrète", "Not enough rolls!": "Pas assez de jets !", "Numbers": "Nombres", "Octal": "Octale", "Other Formats": "Autres formats", "PBKDF2 Iter.": "Itér. PBKDF2", "Paint punched dots black so they can be detected.": "Noircissez les points perforés afin qu'ils puissent être détectés.", "Paper Width": "Largeur du papier", "Part": "Partie", "Part Size": "Taille de la pièce", "Passphrase": "Phrase secréte", "Password Length": "Longueur du mot de passe", "Path mismatch": "Inadéquation du chemin", "Pattern detected!": "Pattern détecté !", "Permanently remove all stored encrypted mnemonics and settings from flash?": "Supprimer définitivement tous les mnémoniques et paramètres chiffrés stockés dans le flash ?", "Persist": "Persistance", "Pixels deviation index:": "Indice de déviation des pixels :", "Plaintext QR": "QR en Texte Brut", "Please load a wallet output descriptor": "Veuillez charger un descripteur de sortie de portefeuille", "Plunge Rate": "Taux de plongée", "Poor entropy": "Entropie faible", "Poor entropy detected!": "Entropie faible détectée !", "Print Test QR": "Impression Test QR", "Print Tiny Seed?": "Imprimer Tiny Seed ?", "Print to QR": "Imprimer Code QR", "Print to QR?": "Imprimer Code QR ?", "Print?": "Imprimer ?", "Printer": "Imprimante", "Printer Driver not set!": "Le pilote d'imprimante n'est pas défini !", "Printing..": "Impression..", "Proceed anyway?": "Procéder quand même ?", "Proceed?": "Procéder ?", "Processing..": "Traitement..", "QR Code": "Code QR", "RX Pin": "RX Fiche", "Reboot": "Redémarrer", "Receive": "Recevoir", "Receive Addresses": "Adresses de Réception", "Region:": "Région :", "Remove %s?": "Supprimer %s ?", "Remove Mnemonic": "Supprimer mnémonique", "Remove firmware files from SD Card?": "Supprimer les fichiers micrologiciel de la carte SD ?", "Res. - Format": "Rés. - Format", "Restore factory settings and reboot?": "Restaurer les paramètres d'usine et redémarrer ?", "Return to QR Viewer": "Retour au visualiseur QR", "Review scanned data, edit if necessary": "Examinez les données numérisées, modifiez-les si nécessaire", "Right": "À droite", "Roll dice at least %d times to generate a mnemonic.": "Lancez le dé au moins %d fois pour générer un mnémonique.", "Rolls distribution:": "Distribution des jets :", "Rolls:": "Jets :", "SD card": "Carte SD", "SD card not detected.": "Carte SD non détectée.", "SHA256 of rolls:": "SHA256 de jets :", "SHA256 of snapshot:": "SHA256 de snapshot :", "Save QR Image to SD Card": "Enregistrer l'image QR sur la carte SD", "Save to SD card": "Enregistrer sur la carte SD", "Save to SD card?": "Enregistrer sur la carte SD ?", "Saved to SD card": "Enregistré sur la carte SD", "Scale": "L'échelle", "Scan Address": "Scannez l'adresse", "Scan BIP39 Passphrase": "Scannez la phrase secrète BIP-39", "Scan Key QR Code": "Scannez le Code QR de la clé", "Scanning words 1-12 again": "Analyser à nouveau les mots 1 à 12", "Scanning words 13-24": "Analyser les mots 13 à 24", "Screensaver Time": "Delai d'Inactivité", "Script Type": "Type de Script", "Security": "Sécurité", "Self-transfer or Change (%d):": "Auto-transfert ou monnaie (%d) :", "Self-transfer:": "Auto-transfert :", "Set a tamper check code first": "Définissez d'abord un code de non compromis", "Settings": "Paramètres", "Settings stored internally on flash.": "Paramètres stockés en interne sur flash.", "Settings stored on SD card.": "Paramètres stockés sur la carte SD.", "Shannon's Entropy:": "Entropie de Shannon :", "Shutdown": "Éteindre", "Shutdown Time": "Delai d'Arrêt", "Shutting down..": "Arrêt en cours..", "Sign": "Signer", "Sign to QR code": "Signer avec le code QR", "Sign to SD card": "Signer sur la carte SD", "Sign?": "Signer ?", "Signature": "Signature", "Signed Message": "Message signé", "Signed PSBT": "PSBT signé", "Signing..": "Signature..", "Single-sig": "Clé unique", "Size:": "Capacité :", "Some checks cannot be performed.": "Certains vérifications ne peuvent pas être effectués.", "Spend (%d):": "Dépense (%d) :", "Spend:": "Dépense :", "Stats for Nerds": "Statistiques pour les geeks", "Store on Flash": "Stocker sur flash", "Store on SD Card": "Stocker sur la carte SD", "Swipe to change mode": "Faites glisser pour changer de mode", "TC Flash Hash": "TC Flash Hash", "TC Flash Hash at Boot": "TC Flash Hash au démarrage", "TOUCH or ENTER to capture": "TOUCHEZ ou ENTRER pour capturer", "TX Pin": "TX Fiche", "Tamper Check Code": "Code de non compromis", "Tamper check code set successfully": "Code de non compromis défini avec succès", "Tamper check codes do not match": "Les codes de non compromis ne correspondent pas", "Text": "Texte", "Theme": "Thème", "Thermal": "Thermique", "To ensure data is unrecoverable use Wipe Device feature": "Pour assurer que les données soient irrécupérables, utilisez la fonctionnalité 'Effacer l'appareil'", "Toggle Brightness": "Ajuster la luminosité", "Tools": "Outils", "Touch Threshold": "Sensibilité", "Touchscreen": "Écran Tactile", "Try more?": "Réessayer ?", "Type BIP39 Passphrase": "Entrez la phrase secrète BIP-39", "Type Key": "Taper clé", "Unit": "Unité", "Upgrade complete.": "Mise à jour complète.", "Use a black background surface.": "Utilisez une surface de fond noire.", "Use camera's entropy to create a new mnemonic": "Utilisez l'entropie de la caméra pour créer un nouveau mnémonique", "Used:": "Utilisé :", "User's Data": "Utilisateur", "Value %s out of range: [%s, %s]": "Valeur %s hors de portée: [%s, %s]", "Value must be multiple of %s": "La valeur doit être un multiple de %s", "Verifying..": "Vérification..", "Version": "Version", "Via Camera": "Par caméra", "Via D20": "Via D20", "Via D6": "Via D6", "Via Manual Input": "Par saisie manuelle", "Via Words": "Via Mots", "Wait for the capture": "Attendez la capture", "Wallet": "Portefeuille", "Wallet Descriptor": "Descripteur de Portefeuille", "Wallet output descriptor": "Descripteur de sortie du portefeuille", "Wallet output descriptor loaded!": "Descripteur de sortie du portefeuille chargé !", "Wallet output descriptor not found.": "Descripteur de sortie du portefeuille introuvable.", "Warning:": "Avertissement :", "Word %d": "Mot %d", "Word Numbers": "Numéros de mots", "Words": "Mots", "Yes": "Oui", "is a valid address!": "Adresse non valide !", "was NOT FOUND in the first %d addresses": "INTROUVABLE dans les %d premières adresses"} \ No newline at end of file +{ + "% of the amount.": "% du montant.", + "%d of %d multisig": "%d de %d multisignature", + "%d to %d": "%d à %d", + "%s removed.": "%s supprimé.", + "(%d total)": "(%d au total)", + "(Experimental)": "(Expérimental)", + "(watch-only)": "(consultation)", + "12 words": "12 mots", + "24 words": "24 mots", + "About": "À propos", + "Accept assumption?": "Accepter supposition ?", + "Account": "Compte", + "Account #0 would be assumed": "Le compte n °0 serait supposé", + "Account Index": "Index du compte", + "Add or change wallet passphrase?": "Ajoutez ou modifiez la phrase secrète ?", + "Additional entropy from camera required for AES-CBC mode": "Entropie supplémentaire de la caméra requise pour le mode AES-CBC", + "Address": "Adresse", + "Align camera and backup plate properly.": "Alignez correctement la caméra et plaque de sauvegarde.", + "Allow in settings first!": "Autoriser d'abord dans les paramètres !", + "Anti-glare disabled": "Anti-éblouissement désactivé", + "Anti-glare enabled": "Anti-éblouissement activé", + "Appearance": "Apparence", + "Are you sure?": "Es-tu sûr ?", + "BGR Colors": "Couleurs BGR", + "BIP39 Mnemonic": "Mnémonique BIP39", + "Back": "Retour", + "Back to Menu": "Retour au menu", + "Backup Mnemonic": "Sauvegarde mnémonique", + "Bad signature": "Signature non valide", + "Base64 Password": "Mot de passe Base64", + "Baudrate": "Débit en bauds", + "Binary Grid": "Grille binaire", + "Border Padding": "Rembourrage de bordure", + "Brightness": "Luminosité", + "Buttons": "Boutons", + "Buttons Debounce": "Anti-rebond des boutons", + "Capture cancelled": "Capture annulée", + "Change": "Monnaie", + "Change Addresses": "Adresses de Monnaie", + "Change theme and reboot?": "Changer de thème et redémarrer ?", + "Change:": "La monnaie :", + "Changes will last until shutdown.": "Les modifications dureront jusqu'à l'arrêt.", + "Check SD Card": "Vérifiez la carte SD", + "Check that address belongs to this wallet?": "Vérifiez que l'adresse appartient à ce portefeuille ?", + "Checked %d addresses with no matches.": "%d adresses vérifiées sans correspondance.", + "Checking for SD card..": "Vérification de la carte SD..", + "Confirm Tamper Check Code": "Confirmer le code de non compromis", + "Create QR Code": "Créer un code QR", + "Create QR code from text?": "Créer un code QR à partir d'un texte ?", + "Created:": "Créé :", + "Current Tamper Check Code": "Code de non compromis actuel", + "Custom QR Code": "Code QR personnalisé", + "Customize": "Personnaliser", + "Customizing your wallet will generate a new Key.": "La personnalisation de votre portefeuille générera une nouvelle clé.", + "Cut Depth": "Profondeur de coupe", + "Cut Method": "Méthode de coupe", + "Decimal": "Décimal", + "Decrypt?": "Déchiffrer ?", + "Default Wallet": "Portefeuille par défaut", + "Depth Per Pass": "Profondeur par passage", + "Derive BIP85 entropy?": "Dériver l'entropie BIP85 ?", + "Descriptor Addresses": "Adresses du descripteur", + "Display": "Affichage", + "Do not power off, it may take a while to complete.": "Ne pas éteindre, cela peut prendre un certain temps.", + "Done?": "Terminé ?", + "Double mnemonic": "Double mnémonique", + "Driver": "Pilote", + "Empty": "Vide", + "Enable Krux apps": "Activer les applications Krux", + "Encrypted": "Chiffré", + "Encrypted QR Code": "Code QR chiffré", + "Encrypted mnemonic was not stored": "Le mnémonique chiffré n'a pas été stocké", + "Encrypted mnemonic was stored with ID:": "Mnémonique chiffré a été stocké avec ID :", + "Encryption": "Chiffrement", + "Encryption Mode": "Mode de chiffrement", + "Enter %d BIP-39 words.": "Entrez %d mots BIP-39.", + "Enter a 6+ characters Tamper Check Code": "Saisissez un code de non compromis de plus de 6 caractères", + "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre de 1 à 2048.", + "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en hexadécimal de 1 à 800.", + "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en octal de 1 à 4000.", + "Enter each word of your BIP-39 mnemonic.": "Entrez chaque mot de votre mnémonique BIP-39.", + "Erase User's Data": "Effacer les données de l'utilisateur", + "Erasing user's data..": "Effacement des données de l'utilisateur...", + "Error:": "Erreur :", + "Esc": "Esc", + "Execute a signed Krux app?": "Exécuter une application Krux signée ?", + "Explore files?": "Explorer des fichiers ?", + "Exporting to SD card..": "Exportation vers la carte SD..", + "Extended Public Key": "Clé publique", + "Factory Settings": "Paramètres d'usine", + "Failed to decrypt": "Échec du déchiffrement", + "Failed to load PSBT": "Échec du chargement PSBT", + "Failed to load address": "Échec du chargement d'adresse", + "Failed to load key": "Échec du chargement de la clé", + "Failed to load message": "Échec du chargement du message", + "Failed to load mnemonic": "Échec du chargement mnémonique", + "Failed to load output descriptor": "Échec du chargement du descripteur de sortie", + "Failed to load passphrase": "Échec du chargement de la phrase secrète", + "Failed to store mnemonic": "Échec du stockage mnémonique", + "Fee:": "Frais :", + "Feed Rate": "Taux d'alimentation", + "Filename": "Nom de fichier", + "Filename %s exists on SD card, overwrite?": "Le nom de fichier %s existe sur la carte SD, écraser ?", + "Fill the flash with entropy from camera?": "Remplir le flash avec l'entropie de la caméra ?", + "Filling Flash": "Remplissage du Flash", + "Fingerprint unset in PSBT": "Empreinte digitale manquante dans PSBT", + "Firmware exceeds max size: %d": "Le micrologiciel dépasse la taille maximale : %d", + "Flash Map": "Plan du Flash", + "Flash Tools": "Outils Flash", + "Flash filled with camera entropy": "Flash rempli par l'entropie de la caméra", + "Flipped X Coordinates": "Coordonnées X inversées", + "Flute Diameter": "Diamètre de flûte", + "Free:": "Libre :", + "From Storage": "Du stockage", + "Fully erase your SD card in another device to ensure data is unrecoverable": "Effacez complètement votre carte SD dans un autre appareil pour assurer que les données soient irrécupérables", + "Generate Mnemonic": "Générer un mnémonique", + "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Donnez à ce mnémonique un identifiant personnalisé ? Sinon l'empreinte actuelle sera utilisée", + "Go": "OK", + "Good entropy": "Bonne entropie", + "Hardware": "Matériel", + "Hex Public Key": "Clé publique hexadécimale", + "Hexadecimal": "Hexadécimal", + "Hide Mnemonics": "Masquer les mnémoniques", + "High fees!": "Frais élevés !", + "ID already exists": "Id existe déjà", + "Index": "Index", + "Index: %s": "Index : %s", + "Inputs (%d):": "Entrées (%d) :", + "Install?": "Installer ?", + "Insufficient Entropy!": "Entropie insuffisante !", + "Insufficient entropy": "Entropie insuffisante", + "Invalid Tamper Check Code": "Code de non compromis non valide", + "Invalid address": "Adresse invalide", + "Invalid bootloader": "Chargeur de démarrage invalide", + "Invalid mnemonic length": "Longueur mnémonique invalide", + "Invalid public key": "Clé publique non valide", + "Invalid wallet:": "Portefeuille invalide :", + "Invert": "Inverser", + "Inverted Colors": "Couleurs inversées", + "Key": "Clé", + "Key was not provided": "La clé n'a pas été fournie", + "Krux Printer Test QR": "Test de l'imprimante Krux QR", + "LCD Type": "Type d'écran LCD", + "Language": "Langue", + "Leave blank if you'd like Krux to pick a valid final word": "Laissez vide si vous souhaitez que Krux choisisse un dernier mot valide", + "Left": "Gauche", + "Length: %s": "Longueur : %s", + "Line Delay": "Délai de Ligne", + "Line:": "Ligne :", + "Load Krux app": "Charger l'application Krux", + "Load Mnemonic": "Charger Mnémonique", + "Load Wallet": "Charger le portefeuille", + "Load a trusted wallet descriptor to view addresses?": "Charger un descripteur de portefeuille de confiance pour afficher les adresses ?", + "Load from SD card": "Charger depuis la carte SD", + "Load from SD card?": "Charger depuis la carte SD ?", + "Load from camera": "Charger depuis la caméra", + "Load one?": "Charger ?", + "Load?": "Charger ?", + "Loading Camera..": "Activation de la Caméra..", + "Loading change addresses..": "Chargement des adresses de monnaie..", + "Loading printer..": "Activation de l'imprimante..", + "Loading receive addresses..": "Chargement des adresses de réception ..", + "Loading..": "Chargement..", + "Locale": "Paramètres régionaux", + "Location": "Emplacement", + "Maximum length exceeded (%s)": "Longueur maximale dépassée (%s)", + "Message": "Message", + "Message:": "Message :", + "Missing signature file": "Fichier de signature manquant", + "Mnemonic": "Mnémonique", + "Mnemonic ID": "ID Mnémonique", + "Mnemonic and passphrase will be kept.": "Mnémonique et phrase secrète seront conservés.", + "Mnemonic was not encrypted": "Mnémonique n'était pas chiffré", + "Modified:": "Modifié :", + "Multisig": "Multi\nsignature", + "Native Segwit - 84 would be assumed": "Native Segwit - 84 serait supposé", + "Network": "Réseau", + "New Mnemonic": "Nouveau Mnémonique", + "New firmware detected.": "Nouveau micrologiciel détecté.", + "No": "Non", + "No Passphrase": "Pas de phrase secrète", + "Not enough rolls!": "Pas assez de jets !", + "Numbers": "Nombres", + "Octal": "Octale", + "Other Formats": "Autres formats", + "PBKDF2 Iter.": "Itér. PBKDF2", + "Paint punched dots black so they can be detected.": "Noircissez les points perforés afin qu'ils puissent être détectés.", + "Paper Width": "Largeur du papier", + "Part": "Partie", + "Part Size": "Taille de la pièce", + "Passphrase": "Phrase secréte", + "Password Length": "Longueur du mot de passe", + "Path mismatch": "Inadéquation du chemin", + "Pattern detected!": "Pattern détecté !", + "Permanently remove all stored encrypted mnemonics and settings from flash?": "Supprimer définitivement tous les mnémoniques et paramètres chiffrés stockés dans le flash ?", + "Persist": "Persistance", + "Pixels deviation index:": "Indice de déviation des pixels :", + "Plaintext QR": "QR en Texte Brut", + "Please load a wallet output descriptor": "Veuillez charger un descripteur de sortie de portefeuille", + "Plunge Rate": "Taux de plongée", + "Poor entropy": "Entropie faible", + "Poor entropy detected!": "Entropie faible détectée !", + "Print Test QR": "Impression Test QR", + "Print Tiny Seed?": "Imprimer Tiny Seed ?", + "Print to QR": "Imprimer Code QR", + "Print to QR?": "Imprimer Code QR ?", + "Print?": "Imprimer ?", + "Printer": "Imprimante", + "Printer Driver not set!": "Le pilote d'imprimante n'est pas défini !", + "Printing..": "Impression..", + "Proceed anyway?": "Procéder quand même ?", + "Proceed?": "Procéder ?", + "Processing..": "Traitement..", + "QR Code": "Code QR", + "RX Pin": "RX Fiche", + "Reboot": "Redémarrer", + "Receive": "Recevoir", + "Receive Addresses": "Adresses de Réception", + "Region:": "Région :", + "Remove %s?": "Supprimer %s ?", + "Remove Mnemonic": "Supprimer mnémonique", + "Remove firmware files from SD Card?": "Supprimer les fichiers micrologiciel de la carte SD ?", + "Res. - Format": "Rés. - Format", + "Restore factory settings and reboot?": "Restaurer les paramètres d'usine et redémarrer ?", + "Return to QR Viewer": "Retour au visualiseur QR", + "Review scanned data, edit if necessary": "Examinez les données numérisées, modifiez-les si nécessaire", + "Right": "À droite", + "Roll dice at least %d times to generate a mnemonic.": "Lancez le dé au moins %d fois pour générer un mnémonique.", + "Rolls distribution:": "Distribution des jets :", + "Rolls:": "Jets :", + "SD card": "Carte SD", + "SD card not detected.": "Carte SD non détectée.", + "SHA256 of rolls:": "SHA256 de jets :", + "SHA256 of snapshot:": "SHA256 de snapshot :", + "Save QR Image to SD Card": "Enregistrer l'image QR sur la carte SD", + "Save to SD card": "Enregistrer sur la carte SD", + "Save to SD card?": "Enregistrer sur la carte SD ?", + "Saved to SD card": "Enregistré sur la carte SD", + "Scale": "L'échelle", + "Scan Address": "Scannez l'adresse", + "Scan BIP39 Passphrase": "Scannez la phrase secrète BIP-39", + "Scan Key QR Code": "Scannez le Code QR de la clé", + "Scanning words 1-12 again": "Analyser à nouveau les mots 1 à 12", + "Scanning words 13-24": "Analyser les mots 13 à 24", + "Screensaver Time": "Delai d'Inactivité", + "Script Type": "Type de Script", + "Security": "Sécurité", + "Self-transfer or Change (%d):": "Auto-transfert ou monnaie (%d) :", + "Self-transfer:": "Auto-transfert :", + "Set a tamper check code first": "Définissez d'abord un code de non compromis", + "Settings": "Paramètres", + "Settings stored internally on flash.": "Paramètres stockés en interne sur flash.", + "Settings stored on SD card.": "Paramètres stockés sur la carte SD.", + "Shannon's Entropy:": "Entropie de Shannon :", + "Shutdown": "Éteindre", + "Shutdown Time": "Delai d'Arrêt", + "Shutting down..": "Arrêt en cours..", + "Sign": "Signer", + "Sign to QR code": "Signer avec le code QR", + "Sign to SD card": "Signer sur la carte SD", + "Sign?": "Signer ?", + "Signature": "Signature", + "Signed Message": "Message signé", + "Signed PSBT": "PSBT signé", + "Signing..": "Signature..", + "Single-sig": "Clé unique", + "Size:": "Capacité :", + "Some checks cannot be performed.": "Certains vérifications ne peuvent pas être effectués.", + "Spend (%d):": "Dépense (%d) :", + "Spend:": "Dépense :", + "Stats for Nerds": "Statistiques pour les geeks", + "Store on Flash": "Stocker sur flash", + "Store on SD Card": "Stocker sur la carte SD", + "Swipe to change mode": "Faites glisser pour changer de mode", + "TC Flash Hash": "TC Flash Hash", + "TC Flash Hash at Boot": "TC Flash Hash au démarrage", + "TOUCH or ENTER to capture": "TOUCHEZ ou ENTRER pour capturer", + "TX Pin": "TX Fiche", + "Tamper Check Code": "Code de non compromis", + "Tamper check code set successfully": "Code de non compromis défini avec succès", + "Tamper check codes do not match": "Les codes de non compromis ne correspondent pas", + "Text": "Texte", + "Theme": "Thème", + "Thermal": "Thermique", + "To ensure data is unrecoverable use Wipe Device feature": "Pour assurer que les données soient irrécupérables, utilisez la fonctionnalité 'Effacer l'appareil'", + "Toggle Brightness": "Ajuster la luminosité", + "Tools": "Outils", + "Touch Threshold": "Sensibilité", + "Touchscreen": "Écran Tactile", + "Try more?": "Réessayer ?", + "Type BIP39 Passphrase": "Entrez la phrase secrète BIP-39", + "Type Key": "Taper clé", + "Unit": "Unité", + "Upgrade complete.": "Mise à jour complète.", + "Use a black background surface.": "Utilisez une surface de fond noire.", + "Use camera's entropy to create a new mnemonic": "Utilisez l'entropie de la caméra pour créer un nouveau mnémonique", + "Used:": "Utilisé :", + "User's Data": "Utilisateur", + "Value %s out of range: [%s, %s]": "Valeur %s hors de portée: [%s, %s]", + "Value must be multiple of %s": "La valeur doit être un multiple de %s", + "Verifying..": "Vérification..", + "Version": "Version", + "Via Camera": "Par caméra", + "Via D20": "Via D20", + "Via D6": "Via D6", + "Via Manual Input": "Par saisie manuelle", + "Via Words": "Via Mots", + "Wait for the capture": "Attendez la capture", + "Wallet": "Portefeuille", + "Wallet Descriptor": "Descripteur de Portefeuille", + "Wallet output descriptor": "Descripteur de sortie du portefeuille", + "Wallet output descriptor loaded!": "Descripteur de sortie du portefeuille chargé !", + "Wallet output descriptor not found.": "Descripteur de sortie du portefeuille introuvable.", + "Warning:": "Avertissement :", + "Word %d": "Mot %d", + "Word Numbers": "Numéros de mots", + "Words": "Mots", + "Yes": "Oui", + "is a valid address!": "Adresse non valide !", + "was NOT FOUND in the first %d addresses": "INTROUVABLE dans les %d premières adresses" +} \ No newline at end of file diff --git a/i18n/translations/ja-JP.json b/i18n/translations/ja-JP.json index 57e09ae46..4a46d6f22 100644 --- a/i18n/translations/ja-JP.json +++ b/i18n/translations/ja-JP.json @@ -1 +1,322 @@ -{"% of the amount.": "% の金額.", "%d of %d multisig": "%d の%d マルチシグネチャ", "%d to %d": "%d へ %d", "%s removed.": "%s 削除されました.", "(%d total)": "(%d トータル)", "(Experimental)": "(実験的)", "(watch-only)": "(閲覧専用)", "12 words": "12の単語", "24 words": "24の単語", "About": "概要", "Accept assumption?": "仮定を受け入れますか?", "Account": "アカウント", "Account #0 would be assumed": "アカウント#0は仮定されます", "Account Index": "アカウントインデックス", "Add or change wallet passphrase?": "ウォレットのパスフレーズを追加または変更しますか?", "Additional entropy from camera required for AES-CBC mode": "AES-CBCモードにはカメラからの追加エントロピーが必要です", "Address": "アドレス", "Align camera and backup plate properly.": "カメラとバックプレートを正しく整列させてください.", "Allow in settings first!": "最初に設定で許可してください!", "Anti-glare disabled": "アンチグレアが無効", "Anti-glare enabled": "アンチグレアが有効", "Appearance": "外観", "Are you sure?": "よろしいですか?", "BGR Colors": "BGRカラー", "BIP39 Mnemonic": "BIP39 Mnemonic", "Back": "戻る", "Back to Menu": "メニューへ戻る", "Backup Mnemonic": "ニーモニックのバックアップ", "Bad signature": "無効なサイン", "Base64 Password": "Base64パスワード", "Baudrate": "Baudrate", "Binary Grid": "バイナリグリッド", "Border Padding": "ボーダーパディング", "Brightness": "明るさ", "Buttons": "ボタン", "Buttons Debounce": "ボタンのデバウンス", "Capture cancelled": "キャプチャがキャンセルされました", "Change": "お釣り", "Change Addresses": "アドレス変更", "Change theme and reboot?": "テーマの変更と再起動しますか?", "Change:": "お釣り:", "Changes will last until shutdown.": "変更はシャットダウンするまで持続します.", "Check SD Card": "SDカードを確認する", "Check that address belongs to this wallet?": "このアドレスがこのウォレットに属しているか確認しますか?", "Checked %d addresses with no matches.": "%d のアドレスを確認しましたが、一致するものはありませんでした.", "Checking for SD card..": "SDカードを確認中..", "Confirm Tamper Check Code": "改ざんチェックコードの確認", "Create QR Code": "QRコードを生成する", "Create QR code from text?": "テキストからQRコードを作成しますか?", "Created:": "作成されました:", "Current Tamper Check Code": "現在の改ざんチェックコード", "Custom QR Code": "カスタムQRコード", "Customize": "カスタマイズする", "Customizing your wallet will generate a new Key.": "ウォレットをカスタマイズすると、新しいキーが生成されます.", "Cut Depth": "カットの深さ", "Cut Method": "カット方法", "Decimal": "デシマル", "Decrypt?": "デクリプト?", "Default Wallet": "デフォルトの財布", "Depth Per Pass": "パスごとの深さ", "Derive BIP85 entropy?": "BIP85エントロピーを導出しますか?", "Descriptor Addresses": "ディスクリプタアドレス", "Display": "ディスプレイ", "Do not power off, it may take a while to complete.": "完了するまで電源を切らないでください", "Done?": "完了?", "Double mnemonic": "ダブルニーモニック", "Driver": "ドライバー", "Empty": "空", "Enable Krux apps": "Kruxアプリを有効にする", "Encrypted": "暗号化されました", "Encrypted QR Code": "暗号化されたQRコード", "Encrypted mnemonic was not stored": "暗号化されたニーモニックが保存されませんでした", "Encrypted mnemonic was stored with ID:": "暗号化されたニーモニックがIDとともに保存されました:", "Encryption": "暗号化", "Encryption Mode": "暗号化モード", "Enter %d BIP-39 words.": "%d のBIP-39ワードを入力してください.", "Enter a 6+ characters Tamper Check Code": "6文字以上の改ざんチェックコードを入力してください", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "あなたのBIP-39ニーモニックの各単語を1から2048の番号で入力してください.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "あなたのBIP-39ニーモニックの各単語を1から800の16進数で入力してください.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "あなたのBIP-39ニーモニックの各単語を1から4000の8進数で入力してください.", "Enter each word of your BIP-39 mnemonic.": "あなたのBIP-39ニーモニックの各単語を入力してください.", "Erase User's Data": "ユーザーのデータを消去する", "Erasing user's data..": "ユーザーのデータを消去しています..", "Error:": "エラー:", "Esc": "エスク", "Execute a signed Krux app?": "署名入りのKruxアプリを実行しますか?", "Explore files?": "アーカイブ探索?", "Exporting to SD card..": "SDカードへのエクスポート..", "Extended Public Key": "拡張公開キー", "Factory Settings": "初期設定", "Failed to decrypt": "復号化に失敗しました", "Failed to load PSBT": "PSBTのロードに失敗しました", "Failed to load address": "アドレスの読み込みに失敗しました", "Failed to load key": "キーのロードに失敗しました", "Failed to load message": "メッセージの読み込みに失敗しました", "Failed to load mnemonic": "mnemonicのロードに失敗しました", "Failed to load output descriptor": "出力記述子のロードに失敗しました", "Failed to load passphrase": "パスフレーズのロードに失敗しました", "Failed to store mnemonic": "mnemonicの保存に失敗しました", "Fee:": "手数料:", "Feed Rate": "フィードレート", "Filename": "ファイル名", "Filename %s exists on SD card, overwrite?": "ファイル名 %s が SD カードに存在します、上書きしますか?", "Fill the flash with entropy from camera?": "カメラからのエントロピーでフラッシュを埋めますか?", "Filling Flash": "フラッシュを充填中", "Fingerprint unset in PSBT": "PSBTでデジタル指紋が未設定", "Firmware exceeds max size: %d": "ファームウェアが最大サイズを超えました: %d", "Flash Map": "フラッシュマップ", "Flash Tools": "Flashツール", "Flash filled with camera entropy": "カメラエントロピーで満たされたフラッシュ", "Flipped X Coordinates": "X座標が反転しました", "Flute Diameter": "フルートディアメーター", "Free:": "フリー:", "From Storage": "ストレージから", "Fully erase your SD card in another device to ensure data is unrecoverable": "データが復元できないように、他のデバイスでSDカードを完全に消去してください", "Generate Mnemonic": "Mnemonicを生成する", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "このニーモニックにカスタムIDを付けますか?付けない場合は現在のフィンガープリントが使用されます", "Go": "行く", "Good entropy": "良いentropy", "Hardware": "ハードウェア", "Hex Public Key": "Hex公開キー", "Hexadecimal": "エクサデシマル", "Hide Mnemonics": "Mnemonicsを隠す", "High fees!": "高い手数料!", "ID already exists": "IDはすでに存在します", "Index": "インデックス", "Index: %s": "インデックス:%s", "Inputs (%d):": "インプット(%d):", "Install?": "インストールしますか?", "Insufficient Entropy!": "不十分なエントロピー!", "Insufficient entropy": "不十分なエントロピー", "Invalid Tamper Check Code": "無効な改ざんチェックコード", "Invalid address": "無効なアドレス", "Invalid bootloader": "無効なブートローダー", "Invalid mnemonic length": "無効なニーモニックの長さ", "Invalid public key": "無効な公開キー", "Invalid wallet:": "無効なウォレット:", "Invert": "反転する", "Inverted Colors": "反転した色", "Key": "キー", "Key was not provided": "キーが提供されていません", "Krux Printer Test QR": "KruxプリンターテストQR", "LCD Type": "LCDタイプ", "Language": "言語 ", "Leave blank if you'd like Krux to pick a valid final word": "有効な最終単語をKruxに選んでもらいたい場合は、空白のままにしてください", "Left": "左", "Length: %s": "長さ:%s", "Line Delay": "ライン遅延", "Line:": "ライン:", "Load Krux app": "Kruxアプリを読み込む", "Load Mnemonic": "ニーモニックをロード", "Load Wallet": "ウォレットをロード", "Load a trusted wallet descriptor to view addresses?": "信頼できるウォレット記述子をロードしてアドレスを表示しますか?", "Load from SD card": "SDカードからロード ", "Load from SD card?": "SDカードからロードしますか?", "Load from camera": "カメラからロード", "Load one?": "1つをロードしますか?", "Load?": "ロードしますか?", "Loading Camera..": "カメラを読み込み中..", "Loading change addresses..": "変更アドレスを読み込み中..", "Loading printer..": "プリンターを読み込み中..", "Loading receive addresses..": "受信アドレスを読み込み中 ..", "Loading..": "読み込み中..", "Locale": "ロケール", "Location": "場所", "Maximum length exceeded (%s)": "最大長を超えました (%s)", "Message": "メッセージ", "Message:": "メッセージ:", "Missing signature file": "署名ファイルが欠落しています", "Mnemonic": "Mnemonic", "Mnemonic ID": "Mnemonic ID", "Mnemonic and passphrase will be kept.": "Mnemonicとパスフレーズは保持されます.", "Mnemonic was not encrypted": "Mnemonicは暗号化されていませんでした", "Modified:": "修正されました:", "Multisig": "マルチシグ", "Native Segwit - 84 would be assumed": "ネイティブSegwit - 84が仮定されます", "Network": "ネットワーク", "New Mnemonic": "新しい Mnemonic", "New firmware detected.": "新しいファームウェアが検出されました.", "No": "いいえ", "No Passphrase": "パスフレーズなし", "Not enough rolls!": "ロールが足りません!", "Numbers": "数字", "Octal": "Octal", "Other Formats": "他のフォーマット", "PBKDF2 Iter.": "PBKDF2イテレーション", "Paint punched dots black so they can be detected.": "検出できるように、穴あけされた点を黒く塗ってください.", "Paper Width": "用紙幅 ", "Part": "パーツ", "Part Size": "パーツサイズ", "Passphrase": "パスワード", "Password Length": "パスワードの長さ", "Path mismatch": "パスの不一致", "Pattern detected!": "パターンが検出されました!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "フラッシュからすべての保存された暗号化mnemonicsと設定を永久に削除しますか?", "Persist": "永続させる", "Pixels deviation index:": "ピクセル偏差指数:", "Plaintext QR": "プレーンテキストQR", "Please load a wallet output descriptor": "ウォレットの出力記述子をロードしてください", "Plunge Rate": "沈下率", "Poor entropy": "低品質なエントロピー", "Poor entropy detected!": "低品質なエントロピーが検出されました!", "Print Test QR": "テストQRを印刷", "Print Tiny Seed?": "小さなシードを印刷しますか?", "Print to QR": "QRを印刷", "Print to QR?": "QRを印刷しますか?", "Print?": "印刷?", "Printer": "プリンター ", "Printer Driver not set!": "プリンタードライバーが設定されていません!", "Printing..": "印刷中..", "Proceed anyway?": "そのまま進みますか?", "Proceed?": "進みますか?", "Processing..": "処理中..", "QR Code": "QRコード", "RX Pin": "RXピン", "Reboot": "再起動", "Receive": "受け取る", "Receive Addresses": "受取アドレス", "Region:": "地域:", "Remove %s?": "%sを削除しますか?", "Remove Mnemonic": "ニーモニックを削除", "Remove firmware files from SD Card?": "SDカードからファームウェアファイルを削除しますか?", "Res. - Format": "Res. - フォーマット", "Restore factory settings and reboot?": "初期化を復元して再起動しますか?", "Return to QR Viewer": "QRビューワーに戻る", "Review scanned data, edit if necessary": "スキャンしたデータを確認し、必要に応じて編集します", "Right": "右", "Roll dice at least %d times to generate a mnemonic.": "mnemonicを生成するには、少なくとも%d回サイコロを振ってください.", "Rolls distribution:": "ロールの分布:", "Rolls:": "ロール:", "SD card": "SDカード", "SD card not detected.": "SDカードが検出されません.", "SHA256 of rolls:": "ロールのSHA256:", "SHA256 of snapshot:": "画像のSHA256:", "Save QR Image to SD Card": "QR画像をSDカードに保存する", "Save to SD card": "SDカードに保存する", "Save to SD card?": "SDカードに保存しますか?", "Saved to SD card": "SDカードに保存しました", "Scale": "スケール", "Scan Address": "アドレススキャン", "Scan BIP39 Passphrase": "BIP39パスフレーズをスキャンする", "Scan Key QR Code": "キーのQRコードをスキャンする", "Scanning words 1-12 again": "単語1-12を再度スキャン中", "Scanning words 13-24": "単語13-24をスキャン中", "Screensaver Time": "スクリーンセーバーの時間", "Script Type": "スクリプトタイプ", "Security": "セキュリティa", "Self-transfer or Change (%d):": "自己転送または変更(%d):", "Self-transfer:": "自己転送:", "Set a tamper check code first": "最初に改ざんチェックコードを設定する", "Settings": "設定", "Settings stored internally on flash.": "設定はフラッシュメモリに内部保存されています.", "Settings stored on SD card.": "設定はSDカードに保存されています.", "Shannon's Entropy:": "シャノンのエントロピー:", "Shutdown": "シャットダウン", "Shutdown Time": "シャットダウン時間", "Shutting down..": "シャットダウン中..", "Sign": "署名", "Sign to QR code": "QRコードにサインする", "Sign to SD card": "SDカードにサインする", "Sign?": "サインしますか?", "Signature": "サイン", "Signed Message": "サイン付きメッセージ", "Signed PSBT": "サインされたPSBT", "Signing..": "サインしてます..", "Single-sig": "シングルサイン", "Size:": "サイズ:", "Some checks cannot be performed.": "一部のチェックを実行できません.", "Spend (%d):": "支出(%d):", "Spend:": "支出:", "Stats for Nerds": "オタクのための統計", "Store on Flash": "フラッシュに保存する", "Store on SD Card": "SDカードに保存する", "Swipe to change mode": "スワイプしてモードを変更する", "TC Flash Hash": "TCフラッシュハッシュ", "TC Flash Hash at Boot": "起動時のTCフラッシュハッシュ", "TOUCH or ENTER to capture": "タッチまたはENTERでキャプチャする", "TX Pin": "TXピン", "Tamper Check Code": "改ざんチェックコード", "Tamper check code set successfully": "改ざんチェックコードが正常に設定されました", "Tamper check codes do not match": "改ざんチェックコードが一致しません", "Text": "テキスト", "Theme": "テーマ", "Thermal": "サーマル", "To ensure data is unrecoverable use Wipe Device feature": "データが復元不可能であることを確実にするには、デバイス消去機能を使用してください", "Toggle Brightness": "明るさを切り替える", "Tools": "ツール", "Touch Threshold": "タッチスレッショルド", "Touchscreen": "タッチスクリーン", "Try more?": "もっと試してみますか?", "Type BIP39 Passphrase": "BIP39パスフレーズを入力してください", "Type Key": "キーを入力する", "Unit": "ユニット", "Upgrade complete.": "アップグレードが完了しました.", "Use a black background surface.": "黒い背景面を使用してください.", "Use camera's entropy to create a new mnemonic": "カメラのエントロピーを使用して新しいmnemonicを作成してください", "Used:": "使用済み:", "User's Data": "ユーザーのデータ", "Value %s out of range: [%s, %s]": "値%sが範囲外です: [ %s, %s]", "Value must be multiple of %s": "値は%sの倍数でなければなりません", "Verifying..": "確認中..", "Version": "バージョン", "Via Camera": "カメラ経由", "Via D20": "D20経由", "Via D6": "D6経由", "Via Manual Input": "手動入力経由", "Via Words": "言葉経由", "Wait for the capture": "キャプチャを待ってください", "Wallet": "ワレット", "Wallet Descriptor": "ウォレットディスクリプター", "Wallet output descriptor": "ウォレット出力ディスクリプター", "Wallet output descriptor loaded!": "ウォレット出力ディスクリプターがロードされました!", "Wallet output descriptor not found.": "ウォレット出力ディスクリプターが見つかりません.", "Warning:": "警告:", "Word %d": "単語 %d", "Word Numbers": "単語番号", "Words": "単語", "Yes": "はい", "is a valid address!": "有効なアドレスです!", "was NOT FOUND in the first %d addresses": "最初の%dアドレスに見つかりませんでした"} \ No newline at end of file +{ + "% of the amount.": "% の金額.", + "%d of %d multisig": "%d の%d マルチシグネチャ", + "%d to %d": "%d へ %d", + "%s removed.": "%s 削除されました.", + "(%d total)": "(%d トータル)", + "(Experimental)": "(実験的)", + "(watch-only)": "(閲覧専用)", + "12 words": "12の単語", + "24 words": "24の単語", + "About": "概要", + "Accept assumption?": "仮定を受け入れますか?", + "Account": "アカウント", + "Account #0 would be assumed": "アカウント#0は仮定されます", + "Account Index": "アカウントインデックス", + "Add or change wallet passphrase?": "ウォレットのパスフレーズを追加または変更しますか?", + "Additional entropy from camera required for AES-CBC mode": "AES-CBCモードにはカメラからの追加エントロピーが必要です", + "Address": "アドレス", + "Align camera and backup plate properly.": "カメラとバックプレートを正しく整列させてください.", + "Allow in settings first!": "最初に設定で許可してください!", + "Anti-glare disabled": "アンチグレアが無効", + "Anti-glare enabled": "アンチグレアが有効", + "Appearance": "外観", + "Are you sure?": "よろしいですか?", + "BGR Colors": "BGRカラー", + "BIP39 Mnemonic": "BIP39 Mnemonic", + "Back": "戻る", + "Back to Menu": "メニューへ戻る", + "Backup Mnemonic": "ニーモニックのバックアップ", + "Bad signature": "無効なサイン", + "Base64 Password": "Base64パスワード", + "Baudrate": "Baudrate", + "Binary Grid": "バイナリグリッド", + "Border Padding": "ボーダーパディング", + "Brightness": "明るさ", + "Buttons": "ボタン", + "Buttons Debounce": "ボタンのデバウンス", + "Capture cancelled": "キャプチャがキャンセルされました", + "Change": "お釣り", + "Change Addresses": "アドレス変更", + "Change theme and reboot?": "テーマの変更と再起動しますか?", + "Change:": "お釣り:", + "Changes will last until shutdown.": "変更はシャットダウンするまで持続します.", + "Check SD Card": "SDカードを確認する", + "Check that address belongs to this wallet?": "このアドレスがこのウォレットに属しているか確認しますか?", + "Checked %d addresses with no matches.": "%d のアドレスを確認しましたが、一致するものはありませんでした.", + "Checking for SD card..": "SDカードを確認中..", + "Confirm Tamper Check Code": "改ざんチェックコードの確認", + "Create QR Code": "QRコードを生成する", + "Create QR code from text?": "テキストからQRコードを作成しますか?", + "Created:": "作成されました:", + "Current Tamper Check Code": "現在の改ざんチェックコード", + "Custom QR Code": "カスタムQRコード", + "Customize": "カスタマイズする", + "Customizing your wallet will generate a new Key.": "ウォレットをカスタマイズすると、新しいキーが生成されます.", + "Cut Depth": "カットの深さ", + "Cut Method": "カット方法", + "Decimal": "デシマル", + "Decrypt?": "デクリプト?", + "Default Wallet": "デフォルトの財布", + "Depth Per Pass": "パスごとの深さ", + "Derive BIP85 entropy?": "BIP85エントロピーを導出しますか?", + "Descriptor Addresses": "ディスクリプタアドレス", + "Display": "ディスプレイ", + "Do not power off, it may take a while to complete.": "完了するまで電源を切らないでください", + "Done?": "完了?", + "Double mnemonic": "ダブルニーモニック", + "Driver": "ドライバー", + "Empty": "空", + "Enable Krux apps": "Kruxアプリを有効にする", + "Encrypted": "暗号化されました", + "Encrypted QR Code": "暗号化されたQRコード", + "Encrypted mnemonic was not stored": "暗号化されたニーモニックが保存されませんでした", + "Encrypted mnemonic was stored with ID:": "暗号化されたニーモニックがIDとともに保存されました:", + "Encryption": "暗号化", + "Encryption Mode": "暗号化モード", + "Enter %d BIP-39 words.": "%d のBIP-39ワードを入力してください.", + "Enter a 6+ characters Tamper Check Code": "6文字以上の改ざんチェックコードを入力してください", + "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "あなたのBIP-39ニーモニックの各単語を1から2048の番号で入力してください.", + "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "あなたのBIP-39ニーモニックの各単語を1から800の16進数で入力してください.", + "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "あなたのBIP-39ニーモニックの各単語を1から4000の8進数で入力してください.", + "Enter each word of your BIP-39 mnemonic.": "あなたのBIP-39ニーモニックの各単語を入力してください.", + "Erase User's Data": "ユーザーのデータを消去する", + "Erasing user's data..": "ユーザーのデータを消去しています..", + "Error:": "エラー:", + "Esc": "エスク", + "Execute a signed Krux app?": "署名入りのKruxアプリを実行しますか?", + "Explore files?": "アーカイブ探索?", + "Exporting to SD card..": "SDカードへのエクスポート..", + "Extended Public Key": "拡張公開キー", + "Factory Settings": "初期設定", + "Failed to decrypt": "復号化に失敗しました", + "Failed to load PSBT": "PSBTのロードに失敗しました", + "Failed to load address": "アドレスの読み込みに失敗しました", + "Failed to load key": "キーのロードに失敗しました", + "Failed to load message": "メッセージの読み込みに失敗しました", + "Failed to load mnemonic": "mnemonicのロードに失敗しました", + "Failed to load output descriptor": "出力記述子のロードに失敗しました", + "Failed to load passphrase": "パスフレーズのロードに失敗しました", + "Failed to store mnemonic": "mnemonicの保存に失敗しました", + "Fee:": "手数料:", + "Feed Rate": "フィードレート", + "Filename": "ファイル名", + "Filename %s exists on SD card, overwrite?": "ファイル名 %s が SD カードに存在します、上書きしますか?", + "Fill the flash with entropy from camera?": "カメラからのエントロピーでフラッシュを埋めますか?", + "Filling Flash": "フラッシュを充填中", + "Fingerprint unset in PSBT": "PSBTでデジタル指紋が未設定", + "Firmware exceeds max size: %d": "ファームウェアが最大サイズを超えました: %d", + "Flash Map": "フラッシュマップ", + "Flash Tools": "Flashツール", + "Flash filled with camera entropy": "カメラエントロピーで満たされたフラッシュ", + "Flipped X Coordinates": "X座標が反転しました", + "Flute Diameter": "フルートディアメーター", + "Free:": "フリー:", + "From Storage": "ストレージから", + "Fully erase your SD card in another device to ensure data is unrecoverable": "データが復元できないように、他のデバイスでSDカードを完全に消去してください", + "Generate Mnemonic": "Mnemonicを生成する", + "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "このニーモニックにカスタムIDを付けますか?付けない場合は現在のフィンガープリントが使用されます", + "Go": "行く", + "Good entropy": "良いentropy", + "Hardware": "ハードウェア", + "Hex Public Key": "Hex公開キー", + "Hexadecimal": "エクサデシマル", + "Hide Mnemonics": "Mnemonicsを隠す", + "High fees!": "高い手数料!", + "ID already exists": "IDはすでに存在します", + "Index": "インデックス", + "Index: %s": "インデックス:%s", + "Inputs (%d):": "インプット(%d):", + "Install?": "インストールしますか?", + "Insufficient Entropy!": "不十分なエントロピー!", + "Insufficient entropy": "不十分なエントロピー", + "Invalid Tamper Check Code": "無効な改ざんチェックコード", + "Invalid address": "無効なアドレス", + "Invalid bootloader": "無効なブートローダー", + "Invalid mnemonic length": "無効なニーモニックの長さ", + "Invalid public key": "無効な公開キー", + "Invalid wallet:": "無効なウォレット:", + "Invert": "反転する", + "Inverted Colors": "反転した色", + "Key": "キー", + "Key was not provided": "キーが提供されていません", + "Krux Printer Test QR": "KruxプリンターテストQR", + "LCD Type": "LCDタイプ", + "Language": "言語 ", + "Leave blank if you'd like Krux to pick a valid final word": "有効な最終単語をKruxに選んでもらいたい場合は、空白のままにしてください", + "Left": "左", + "Length: %s": "長さ:%s", + "Line Delay": "ライン遅延", + "Line:": "ライン:", + "Load Krux app": "Kruxアプリを読み込む", + "Load Mnemonic": "ニーモニックをロード", + "Load Wallet": "ウォレットをロード", + "Load a trusted wallet descriptor to view addresses?": "信頼できるウォレット記述子をロードしてアドレスを表示しますか?", + "Load from SD card": "SDカードからロード ", + "Load from SD card?": "SDカードからロードしますか?", + "Load from camera": "カメラからロード", + "Load one?": "1つをロードしますか?", + "Load?": "ロードしますか?", + "Loading Camera..": "カメラを読み込み中..", + "Loading change addresses..": "変更アドレスを読み込み中..", + "Loading printer..": "プリンターを読み込み中..", + "Loading receive addresses..": "受信アドレスを読み込み中 ..", + "Loading..": "読み込み中..", + "Locale": "ロケール", + "Location": "場所", + "Maximum length exceeded (%s)": "最大長を超えました (%s)", + "Message": "メッセージ", + "Message:": "メッセージ:", + "Missing signature file": "署名ファイルが欠落しています", + "Mnemonic": "Mnemonic", + "Mnemonic ID": "Mnemonic ID", + "Mnemonic and passphrase will be kept.": "Mnemonicとパスフレーズは保持されます.", + "Mnemonic was not encrypted": "Mnemonicは暗号化されていませんでした", + "Modified:": "修正されました:", + "Multisig": "マルチシグ", + "Native Segwit - 84 would be assumed": "ネイティブSegwit - 84が仮定されます", + "Network": "ネットワーク", + "New Mnemonic": "新しい Mnemonic", + "New firmware detected.": "新しいファームウェアが検出されました.", + "No": "いいえ", + "No Passphrase": "パスフレーズなし", + "Not enough rolls!": "ロールが足りません!", + "Numbers": "数字", + "Octal": "Octal", + "Other Formats": "他のフォーマット", + "PBKDF2 Iter.": "PBKDF2イテレーション", + "Paint punched dots black so they can be detected.": "検出できるように、穴あけされた点を黒く塗ってください.", + "Paper Width": "用紙幅 ", + "Part": "パーツ", + "Part Size": "パーツサイズ", + "Passphrase": "パスワード", + "Password Length": "パスワードの長さ", + "Path mismatch": "パスの不一致", + "Pattern detected!": "パターンが検出されました!", + "Permanently remove all stored encrypted mnemonics and settings from flash?": "フラッシュからすべての保存された暗号化mnemonicsと設定を永久に削除しますか?", + "Persist": "永続させる", + "Pixels deviation index:": "ピクセル偏差指数:", + "Plaintext QR": "プレーンテキストQR", + "Please load a wallet output descriptor": "ウォレットの出力記述子をロードしてください", + "Plunge Rate": "沈下率", + "Poor entropy": "低品質なエントロピー", + "Poor entropy detected!": "低品質なエントロピーが検出されました!", + "Print Test QR": "テストQRを印刷", + "Print Tiny Seed?": "小さなシードを印刷しますか?", + "Print to QR": "QRを印刷", + "Print to QR?": "QRを印刷しますか?", + "Print?": "印刷?", + "Printer": "プリンター ", + "Printer Driver not set!": "プリンタードライバーが設定されていません!", + "Printing..": "印刷中..", + "Proceed anyway?": "そのまま進みますか?", + "Proceed?": "進みますか?", + "Processing..": "処理中..", + "QR Code": "QRコード", + "RX Pin": "RXピン", + "Reboot": "再起動", + "Receive": "受け取る", + "Receive Addresses": "受取アドレス", + "Region:": "地域:", + "Remove %s?": "%sを削除しますか?", + "Remove Mnemonic": "ニーモニックを削除", + "Remove firmware files from SD Card?": "SDカードからファームウェアファイルを削除しますか?", + "Res. - Format": "Res. - フォーマット", + "Restore factory settings and reboot?": "初期化を復元して再起動しますか?", + "Return to QR Viewer": "QRビューワーに戻る", + "Review scanned data, edit if necessary": "スキャンしたデータを確認し、必要に応じて編集します", + "Right": "右", + "Roll dice at least %d times to generate a mnemonic.": "mnemonicを生成するには、少なくとも%d回サイコロを振ってください.", + "Rolls distribution:": "ロールの分布:", + "Rolls:": "ロール:", + "SD card": "SDカード", + "SD card not detected.": "SDカードが検出されません.", + "SHA256 of rolls:": "ロールのSHA256:", + "SHA256 of snapshot:": "画像のSHA256:", + "Save QR Image to SD Card": "QR画像をSDカードに保存する", + "Save to SD card": "SDカードに保存する", + "Save to SD card?": "SDカードに保存しますか?", + "Saved to SD card": "SDカードに保存しました", + "Scale": "スケール", + "Scan Address": "アドレススキャン", + "Scan BIP39 Passphrase": "BIP39パスフレーズをスキャンする", + "Scan Key QR Code": "キーのQRコードをスキャンする", + "Scanning words 1-12 again": "単語1-12を再度スキャン中", + "Scanning words 13-24": "単語13-24をスキャン中", + "Screensaver Time": "スクリーンセーバーの時間", + "Script Type": "スクリプトタイプ", + "Security": "セキュリティa", + "Self-transfer or Change (%d):": "自己転送または変更(%d):", + "Self-transfer:": "自己転送:", + "Set a tamper check code first": "最初に改ざんチェックコードを設定する", + "Settings": "設定", + "Settings stored internally on flash.": "設定はフラッシュメモリに内部保存されています.", + "Settings stored on SD card.": "設定はSDカードに保存されています.", + "Shannon's Entropy:": "シャノンのエントロピー:", + "Shutdown": "シャットダウン", + "Shutdown Time": "シャットダウン時間", + "Shutting down..": "シャットダウン中..", + "Sign": "署名", + "Sign to QR code": "QRコードにサインする", + "Sign to SD card": "SDカードにサインする", + "Sign?": "サインしますか?", + "Signature": "サイン", + "Signed Message": "サイン付きメッセージ", + "Signed PSBT": "サインされたPSBT", + "Signing..": "サインしてます..", + "Single-sig": "シングルサイン", + "Size:": "サイズ:", + "Some checks cannot be performed.": "一部のチェックを実行できません.", + "Spend (%d):": "支出(%d):", + "Spend:": "支出:", + "Stats for Nerds": "オタクのための統計", + "Store on Flash": "フラッシュに保存する", + "Store on SD Card": "SDカードに保存する", + "Swipe to change mode": "スワイプしてモードを変更する", + "TC Flash Hash": "TCフラッシュハッシュ", + "TC Flash Hash at Boot": "起動時のTCフラッシュハッシュ", + "TOUCH or ENTER to capture": "タッチまたはENTERでキャプチャする", + "TX Pin": "TXピン", + "Tamper Check Code": "改ざんチェックコード", + "Tamper check code set successfully": "改ざんチェックコードが正常に設定されました", + "Tamper check codes do not match": "改ざんチェックコードが一致しません", + "Text": "テキスト", + "Theme": "テーマ", + "Thermal": "サーマル", + "To ensure data is unrecoverable use Wipe Device feature": "データが復元不可能であることを確実にするには、デバイス消去機能を使用してください", + "Toggle Brightness": "明るさを切り替える", + "Tools": "ツール", + "Touch Threshold": "タッチスレッショルド", + "Touchscreen": "タッチスクリーン", + "Try more?": "もっと試してみますか?", + "Type BIP39 Passphrase": "BIP39パスフレーズを入力してください", + "Type Key": "キーを入力する", + "Unit": "ユニット", + "Upgrade complete.": "アップグレードが完了しました.", + "Use a black background surface.": "黒い背景面を使用してください.", + "Use camera's entropy to create a new mnemonic": "カメラのエントロピーを使用して新しいmnemonicを作成してください", + "Used:": "使用済み:", + "User's Data": "ユーザーのデータ", + "Value %s out of range: [%s, %s]": "値%sが範囲外です: [ %s, %s]", + "Value must be multiple of %s": "値は%sの倍数でなければなりません", + "Verifying..": "確認中..", + "Version": "バージョン", + "Via Camera": "カメラ経由", + "Via D20": "D20経由", + "Via D6": "D6経由", + "Via Manual Input": "手動入力経由", + "Via Words": "言葉経由", + "Wait for the capture": "キャプチャを待ってください", + "Wallet": "ワレット", + "Wallet Descriptor": "ウォレットディスクリプター", + "Wallet output descriptor": "ウォレット出力ディスクリプター", + "Wallet output descriptor loaded!": "ウォレット出力ディスクリプターがロードされました!", + "Wallet output descriptor not found.": "ウォレット出力ディスクリプターが見つかりません.", + "Warning:": "警告:", + "Word %d": "単語 %d", + "Word Numbers": "単語番号", + "Words": "単語", + "Yes": "はい", + "is a valid address!": "有効なアドレスです!", + "was NOT FOUND in the first %d addresses": "最初の%dアドレスに見つかりませんでした" +} \ No newline at end of file diff --git a/i18n/translations/ko-KR.json b/i18n/translations/ko-KR.json index 29df19430..a46df3713 100644 --- a/i18n/translations/ko-KR.json +++ b/i18n/translations/ko-KR.json @@ -1 +1,322 @@ -{"% of the amount.": "수량: %", "%d of %d multisig": "%d의 %d 멀티시그", "%d to %d": "%d 부터 %d", "%s removed.": "%s 제거되었습니다.", "(%d total)": "(총 %d)", "(Experimental)": "(실험적 기능)", "(watch-only)": "(잔액조회 전용)", "12 words": "12단어", "24 words": "24단어", "About": "기본 정보", "Accept assumption?": "가정을 수락하시겠습니까?", "Account": "계정", "Account #0 would be assumed": "계정 #0이 가정됩니다", "Account Index": "계정 인덱스", "Add or change wallet passphrase?": "패스프레이즈를 추가하거나 변경하시겠습니까?", "Additional entropy from camera required for AES-CBC mode": "AES-CBC 모드를 위해 카메라의 추가 엔트로피가 필요합니다", "Address": "주소", "Align camera and backup plate properly.": "카메라와 보조 플레이트를 올바르게 정렬하십시오.", "Allow in settings first!": "먼저 설정에서 허용하세요!", "Anti-glare disabled": "눈부심방지 비활성화", "Anti-glare enabled": "눈부심방지 활성화", "Appearance": "디스플레이", "Are you sure?": "계속하시겠습니까?", "BGR Colors": "BGR 색상", "BIP39 Mnemonic": "BIP39 니뫠닉", "Back": "뒤로", "Back to Menu": "메뉴로 돌아가기", "Backup Mnemonic": "니모닉 백업", "Bad signature": "잘못된 서명", "Base64 Password": "Base64 비밀번호", "Baudrate": "Baudrate", "Binary Grid": "이진수 그리드", "Border Padding": "테두리 여백", "Brightness": "밝기", "Buttons": "버튼", "Buttons Debounce": "버튼 바운스 방지", "Capture cancelled": "캡처 취소됨", "Change": "잔돈", "Change Addresses": "잔돈 주소", "Change theme and reboot?": "테마를 변경하고 재부팅하시겠습니까?", "Change:": "변경", "Changes will last until shutdown.": "변경 사항은 종료될때까지 유지됩니다.", "Check SD Card": "SD카드 확인", "Check that address belongs to this wallet?": "해당 주소가 이 지갑에 속하는지 확인하시겠습니까?", "Checked %d addresses with no matches.": "일치하는 주소가 없는 %d 개를 확인했습니다.", "Checking for SD card..": "SD카드 확인 중..", "Confirm Tamper Check Code": "탬퍼 체크 코드 확인", "Create QR Code": "QR 코드 생성", "Create QR code from text?": "텍스트로부터 QR코드를 생성하시겠습니까?", "Created:": "생성됨:", "Current Tamper Check Code": "현재 탬퍼 체크 코드", "Custom QR Code": "사용자 정의 QR코드", "Customize": "사용자 정의", "Customizing your wallet will generate a new Key.": "지갑을 커스터마이징하면 새로운 비밀키가 생성됩니다.", "Cut Depth": "Cut Depth", "Cut Method": "Cut Method", "Decimal": "10진수", "Decrypt?": "복호화하시겠습니까?", "Default Wallet": "지갑 기본설정", "Depth Per Pass": "Depth Per Pass", "Derive BIP85 entropy?": "BIP85 엔트로피를 유독하시겠습니까?", "Descriptor Addresses": "디스크립터 주소", "Display": "디스플레이", "Do not power off, it may take a while to complete.": "전원을 끄지 마십시오. 완료하는 데 시간이 걸릴 수 있습니다.", "Done?": "완료되었습니까?", "Double mnemonic": "이중 니모닉", "Driver": "드라이버", "Empty": "비어 있음", "Enable Krux apps": "Krux 앱 활성화", "Encrypted": "암호화 후 저장", "Encrypted QR Code": "암호화된 QR 코드", "Encrypted mnemonic was not stored": "암호화된 니모닉을 저장하지 못했습니다", "Encrypted mnemonic was stored with ID:": "암호화된 니모닉을 다음 아이디와 함께 저장했습니다:", "Encryption": "암호화", "Encryption Mode": "암호화 모드", "Enter %d BIP-39 words.": "%d개의 BIP-39 단어를 입력하십시오.", "Enter a 6+ characters Tamper Check Code": "6자 이상의 탬퍼 체크 코드를 입력하세요", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "BIP-39 니모닉의 각 단어를 1에서 2048 사이의 숫자로 입력하십시오.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "BIP-39 니모닉의 각 단어를 1에서 800 사이의 16진수 숫자로 입력하십시오.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "BIP-39 니모닉의 각 단어를 1에서 4000 사이의 8진수 숫자로 입력하십시오.", "Enter each word of your BIP-39 mnemonic.": "BIP-39 니모닉의 각 단어를 입력하십시오.", "Erase User's Data": "사용자 데이터 지우기", "Erasing user's data..": "사용자의 데이터를 지우는 중...", "Error:": "오류:", "Esc": "Esc", "Execute a signed Krux app?": "서명된 Krux 앱을 실행하시겠습니까?", "Explore files?": "파일을 탐색하시겠습니까?", "Exporting to SD card..": "SD카드로 내보내는 중..", "Extended Public Key": "XPUB 내보내기", "Factory Settings": "공장 초기 설정", "Failed to decrypt": "복호화에 실패했습니다", "Failed to load PSBT": "PSBT를 불러오지 못했습니다", "Failed to load address": "주소를 불러오지 못했습니다", "Failed to load key": "키 로드에 실패했습니다", "Failed to load message": "메시지를 불러오지 못했습니다", "Failed to load mnemonic": "니모닉을 불러오지 못했습니다", "Failed to load output descriptor": "아웃풋 디스크립터를 불러오지 못했습니다", "Failed to load passphrase": "패스프레이즈를 불러오지 못했습니다", "Failed to store mnemonic": "니모닉을 저장하지 못했습니다", "Fee:": "수수료:", "Feed Rate": "Feed Rate", "Filename": "파일명", "Filename %s exists on SD card, overwrite?": "%s 파일명이 SD카드에 이미 존재합니다. 덮어쓰시겠습니까?", "Fill the flash with entropy from camera?": "카메라의 엔트로피로 플래시를 채우시겠습니까?", "Filling Flash": "플래시 채우기", "Fingerprint unset in PSBT": "PSBT에서 지문이 설정되지 않았습니다", "Firmware exceeds max size: %d": "펌웨어가 최대 크기를 초과했습니다: %d", "Flash Map": "플래시 맵", "Flash Tools": "플래시 도구", "Flash filled with camera entropy": "카메라 엔트로피로 가득 찬 플래시", "Flipped X Coordinates": "X 좌표 반전", "Flute Diameter": "플루트 직경", "Free:": "여유 공간:", "From Storage": "저장공간에서 불러오기", "Fully erase your SD card in another device to ensure data is unrecoverable": "다른 장치에서 데이터 복구가 불가능하도록 SD카드를 완전히 지우십시오", "Generate Mnemonic": "니모닉 생성", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "이 니모닉에 별도 아이디를 지정하시겠습니까? 지정하지 않으면 현재 지문을 사용합니다", "Go": "선택", "Good entropy": "엔트로피가 충분합니다", "Hardware": "하드웨어", "Hex Public Key": "16진수 공개키", "Hexadecimal": "16진수", "Hide Mnemonics": "니모닉 숨기기", "High fees!": "수수료가 높습니다!", "ID already exists": "아이디가 이미 존재합니다", "Index": "인덱스", "Index: %s": "인덱스: %s", "Inputs (%d):": "Input (%d):", "Install?": "설치하시겠습니까?", "Insufficient Entropy!": "엔트로피가 충분하지 않습니다!", "Insufficient entropy": "엔트로피가 충분하지 않습니다", "Invalid Tamper Check Code": "유효하지 않은 탬퍼 체크 코드", "Invalid address": "주소가 잘못되었습니다", "Invalid bootloader": "부트로더가 잘못되었습니다", "Invalid mnemonic length": "니모닉 길이가 잘못되었습니다", "Invalid public key": "공개키가 잘못되었습니다", "Invalid wallet:": "지갑이 잘못되었습니다:", "Invert": "반전", "Inverted Colors": "반전된 색상", "Key": "키", "Key was not provided": "키가 제공되지 않았습니다", "Krux Printer Test QR": "Krux 프린터 테스트 QR", "LCD Type": "LCD 유형", "Language": "언어", "Leave blank if you'd like Krux to pick a valid final word": "마지막 단어를 Krux가 선택하도록 하려면 비워두십시오", "Left": "왼쪽", "Length: %s": "길이: %s", "Line Delay": "줄 지연", "Line:": "줄:", "Load Krux app": "Krux 앱 로드", "Load Mnemonic": "니모닉 불러오기", "Load Wallet": "이대로 불러오기", "Load a trusted wallet descriptor to view addresses?": "주소를 보기위해 신뢰할 수 있는 월렛 디스크립터를 불러오시겠습니까?", "Load from SD card": "SD카드에서 불러오기", "Load from SD card?": "SD카드에서 불러오시겠습니까?", "Load from camera": "카메라로 불러오기", "Load one?": "불러오시겠습니까?", "Load?": "불러오시겠습니까?", "Loading Camera..": "카메라를 구동 중입니다..", "Loading change addresses..": "잔돈 주소를 불러옵니다..", "Loading printer..": "프린터를 로딩 중입니다..", "Loading receive addresses..": "수신 주소 불러옵니다..", "Loading..": "로딩 중..", "Locale": "언어 설정", "Location": "기본 저장소", "Maximum length exceeded (%s)": "최대 길이를 초과함 (%s)", "Message": "메시지", "Message:": "메시지:", "Missing signature file": "서명 파일이 누락되었습니다", "Mnemonic": "니모닉", "Mnemonic ID": "니모닉 ID", "Mnemonic and passphrase will be kept.": "니모닉과 암호는 유지됩니다.", "Mnemonic was not encrypted": "니모닉이 암호화되지 않았습니다", "Modified:": "수정되었습니다:", "Multisig": "멀티시그", "Native Segwit - 84 would be assumed": "네이티브 세그윗 - BIP84를 적용합니다", "Network": "네트워크", "New Mnemonic": "새로운 니모닉", "New firmware detected.": "새로운 펌웨어가 감지되었습니다.", "No": "아니요", "No Passphrase": "패스프레이즈 없음", "Not enough rolls!": "주사위 횟수가 충분하지 않습니다!", "Numbers": "시드문구 순번", "Octal": "8진수", "Other Formats": "기타 형식", "PBKDF2 Iter.": "PBKDF2 Iter.", "Paint punched dots black so they can be detected.": "카메라가 감지할 수 있도록 펀치된 점을 검게 칠하십시오.", "Paper Width": "종이 너비", "Part": "파트", "Part Size": "파트 사이즈", "Passphrase": "패스프레이즈", "Password Length": "비밀번호 길이", "Path mismatch": "경로 불일치", "Pattern detected!": "패턴이 감지되었습니다!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "저장된 모든 니모닉 및 설정값을 영구적으로 제거하시겠습니까?", "Persist": "저장", "Pixels deviation index:": "픽셀 편차 지수:", "Plaintext QR": "일반텍스트 QR", "Please load a wallet output descriptor": "지갑 출력 디스크립터를 불러오십시오", "Plunge Rate": "침수율", "Poor entropy": "엔트로피가 부족합니다", "Poor entropy detected!": "엔트로피가 부족합니다!", "Print Test QR": "QR 테스트 인쇄", "Print Tiny Seed?": "Tiny Seed를 인쇄하시겠습니까?", "Print to QR": "QR로 인쇄", "Print to QR?": "QR로 인쇄하시겠습니까?", "Print?": "인쇄하시겠습니까?", "Printer": "프린터", "Printer Driver not set!": "프린터 드라이버가 설정되지 않았습니다!", "Printing..": "출력중", "Proceed anyway?": "계속하시겠습니까?", "Proceed?": "계속하시겠습니까?", "Processing..": "처리...", "QR Code": "QR 코드", "RX Pin": "RX 핀", "Reboot": "다시 반복", "Receive": "받기", "Receive Addresses": "주소", "Region:": "지역:", "Remove %s?": "%s을 제거하시겠습니까?", "Remove Mnemonic": "니모닉 제거", "Remove firmware files from SD Card?": "SD카드에서 펌웨어 파일을 제거하시겠습니까?", "Res. - Format": "Res. - 형식", "Restore factory settings and reboot?": "공장 설정을 복원하고 재부팅하시겠습니까?", "Return to QR Viewer": "QR 뷰어로 돌아가기", "Review scanned data, edit if necessary": "스캔된 데이터를 검토하고 필요한 경우 수정하십시오", "Right": "오른쪽", "Roll dice at least %d times to generate a mnemonic.": "니모닉을 생성하려면 주사위를 최소 %d번 굴리십시오.", "Rolls distribution:": "주사위값 분포:", "Rolls:": "주사위 횟수:", "SD card": "SD카드", "SD card not detected.": "SD카드가 감지되지 않았습니다.", "SHA256 of rolls:": "주사위의 SHA256:", "SHA256 of snapshot:": "SHA256 스냅샷:", "Save QR Image to SD Card": "QR 이미지를 SD카드에 저장", "Save to SD card": "SD카드에 저장", "Save to SD card?": "SD카드에 저장하시겠습니까?", "Saved to SD card": "SD카드에 저장됨", "Scale": "스케일", "Scan Address": "주소 스캔하기", "Scan BIP39 Passphrase": "BIP39 패스프레이즈 스캔하기", "Scan Key QR Code": "비밀번호 QR 스캔", "Scanning words 1-12 again": "1번째부터 12번째 단어를 스캔 중입니다", "Scanning words 13-24": "13번째부터 24번째 단어를 스캔 중입니다", "Screensaver Time": "화면보호기 시간", "Script Type": "지갑 형식", "Security": "보안", "Self-transfer or Change (%d):": "본인주소 전송 또는 잔돈 (%d):", "Self-transfer:": "자가 이체:", "Set a tamper check code first": "먼저 탬퍼 체크 코드를 설정하세요.", "Settings": "설정", "Settings stored internally on flash.": "설정은 플래시에서 내부적으로 저장됩니다.", "Settings stored on SD card.": "SD 카드에 저장된 설정.", "Shannon's Entropy:": "Shannon의 엔트로피:", "Shutdown": "종료", "Shutdown Time": "자동 종료시간", "Shutting down..": "종료 중..", "Sign": "서명하기", "Sign to QR code": "QR코드로 내보내기", "Sign to SD card": "SD카드로 내보내기", "Sign?": "서명하시겠습니까?", "Signature": "서명", "Signed Message": "서명된 메시지", "Signed PSBT": "서명된 PSBT", "Signing..": "서명 중..", "Single-sig": "단일서명", "Size:": "크기:", "Some checks cannot be performed.": "일부 검사를 수행할 수 없습니다.", "Spend (%d):": "Spend (%d):", "Spend:": "지출", "Stats for Nerds": "전문가를 위한 통계", "Store on Flash": "플래시 메모리에 저장", "Store on SD Card": "SD카드에 저장", "Swipe to change mode": "모드를 변경하려면 화면을 옆으로 쓸어내리세요", "TC Flash Hash": "TC Flash Hash", "TC Flash Hash at Boot": "부팅 시 플래시 탬퍼 확인 해시", "TOUCH or ENTER to capture": "터치하거나 엔터를 눌러 캡처하십시오", "TX Pin": "TX 핀", "Tamper Check Code": "탬퍼 체크 코드", "Tamper check code set successfully": "탬퍼 검사 코드가 성공적으로 설정되었습니다", "Tamper check codes do not match": "탬퍼 검사 코드가 일치하지 않습니다", "Text": "텍스트", "Theme": "테마", "Thermal": "Thermal", "To ensure data is unrecoverable use Wipe Device feature": "데이터 복구가 불가능하도록 장치 전체지우기 기능을 사용하십시오", "Toggle Brightness": "밝기 전환", "Tools": "도구", "Touch Threshold": "터치 민감도", "Touchscreen": "터치스크린", "Try more?": "더 하시겠습니까?", "Type BIP39 Passphrase": "BIP39 패스프레이즈 입력", "Type Key": "비밀번호 입력", "Unit": "단위", "Upgrade complete.": "업그레이드가 완료되었습니다", "Use a black background surface.": "검은색 배경 화면을 사용하십시오.", "Use camera's entropy to create a new mnemonic": "카메라의 엔트로피를 사용하여 새로운 니모닉을 생성하십시오", "Used:": "이미 사용됨:", "User's Data": "사용자 데이터", "Value %s out of range: [%s, %s]": "%s는 [%s, %s] 범위를 벗어났습니다", "Value must be multiple of %s": "값은 %s의 배수여야 합니다", "Verifying..": "검증 중..", "Version": "버전", "Via Camera": "카메라", "Via D20": "20면체 주사위", "Via D6": "일반 주사위", "Via Manual Input": "직접 입력", "Via Words": "니모닉 단어 입력", "Wait for the capture": "캡처될때까지 기다리십시오", "Wallet": "지갑 설정", "Wallet Descriptor": "지갑 디스크립터", "Wallet output descriptor": "지갑 출력 디스크립터", "Wallet output descriptor loaded!": "지갑 출력 디스크립터가 로드되었습니다!", "Wallet output descriptor not found.": "지갑 출력 디스크립터를 찾을 수 없습니다.", "Warning:": "경고:", "Word %d": "%d 단어", "Word Numbers": "단어 번호(1-2048)", "Words": "시드문구", "Yes": "예", "is a valid address!": "는 유효한 주소입니다!", "was NOT FOUND in the first %d addresses": "첫 번째 %d개의 주소에서 찾을 수 없습니다"} \ No newline at end of file +{ + "% of the amount.": "수량: %", + "%d of %d multisig": "%d의 %d 멀티시그", + "%d to %d": "%d 부터 %d", + "%s removed.": "%s 제거되었습니다.", + "(%d total)": "(총 %d)", + "(Experimental)": "(실험적 기능)", + "(watch-only)": "(잔액조회 전용)", + "12 words": "12단어", + "24 words": "24단어", + "About": "기본 정보", + "Accept assumption?": "가정을 수락하시겠습니까?", + "Account": "계정", + "Account #0 would be assumed": "계정 #0이 가정됩니다", + "Account Index": "계정 인덱스", + "Add or change wallet passphrase?": "패스프레이즈를 추가하거나 변경하시겠습니까?", + "Additional entropy from camera required for AES-CBC mode": "AES-CBC 모드를 위해 카메라의 추가 엔트로피가 필요합니다", + "Address": "주소", + "Align camera and backup plate properly.": "카메라와 보조 플레이트를 올바르게 정렬하십시오.", + "Allow in settings first!": "먼저 설정에서 허용하세요!", + "Anti-glare disabled": "눈부심방지 비활성화", + "Anti-glare enabled": "눈부심방지 활성화", + "Appearance": "디스플레이", + "Are you sure?": "계속하시겠습니까?", + "BGR Colors": "BGR 색상", + "BIP39 Mnemonic": "BIP39 니뫠닉", + "Back": "뒤로", + "Back to Menu": "메뉴로 돌아가기", + "Backup Mnemonic": "니모닉 백업", + "Bad signature": "잘못된 서명", + "Base64 Password": "Base64 비밀번호", + "Baudrate": "Baudrate", + "Binary Grid": "이진수 그리드", + "Border Padding": "테두리 여백", + "Brightness": "밝기", + "Buttons": "버튼", + "Buttons Debounce": "버튼 바운스 방지", + "Capture cancelled": "캡처 취소됨", + "Change": "잔돈", + "Change Addresses": "잔돈 주소", + "Change theme and reboot?": "테마를 변경하고 재부팅하시겠습니까?", + "Change:": "변경", + "Changes will last until shutdown.": "변경 사항은 종료될때까지 유지됩니다.", + "Check SD Card": "SD카드 확인", + "Check that address belongs to this wallet?": "해당 주소가 이 지갑에 속하는지 확인하시겠습니까?", + "Checked %d addresses with no matches.": "일치하는 주소가 없는 %d 개를 확인했습니다.", + "Checking for SD card..": "SD카드 확인 중..", + "Confirm Tamper Check Code": "탬퍼 체크 코드 확인", + "Create QR Code": "QR 코드 생성", + "Create QR code from text?": "텍스트로부터 QR코드를 생성하시겠습니까?", + "Created:": "생성됨:", + "Current Tamper Check Code": "현재 탬퍼 체크 코드", + "Custom QR Code": "사용자 정의 QR코드", + "Customize": "사용자 정의", + "Customizing your wallet will generate a new Key.": "지갑을 커스터마이징하면 새로운 비밀키가 생성됩니다.", + "Cut Depth": "Cut Depth", + "Cut Method": "Cut Method", + "Decimal": "10진수", + "Decrypt?": "복호화하시겠습니까?", + "Default Wallet": "지갑 기본설정", + "Depth Per Pass": "Depth Per Pass", + "Derive BIP85 entropy?": "BIP85 엔트로피를 유독하시겠습니까?", + "Descriptor Addresses": "디스크립터 주소", + "Display": "디스플레이", + "Do not power off, it may take a while to complete.": "전원을 끄지 마십시오. 완료하는 데 시간이 걸릴 수 있습니다.", + "Done?": "완료되었습니까?", + "Double mnemonic": "이중 니모닉", + "Driver": "드라이버", + "Empty": "비어 있음", + "Enable Krux apps": "Krux 앱 활성화", + "Encrypted": "암호화 후 저장", + "Encrypted QR Code": "암호화된 QR 코드", + "Encrypted mnemonic was not stored": "암호화된 니모닉을 저장하지 못했습니다", + "Encrypted mnemonic was stored with ID:": "암호화된 니모닉을 다음 아이디와 함께 저장했습니다:", + "Encryption": "암호화", + "Encryption Mode": "암호화 모드", + "Enter %d BIP-39 words.": "%d개의 BIP-39 단어를 입력하십시오.", + "Enter a 6+ characters Tamper Check Code": "6자 이상의 탬퍼 체크 코드를 입력하세요", + "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "BIP-39 니모닉의 각 단어를 1에서 2048 사이의 숫자로 입력하십시오.", + "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "BIP-39 니모닉의 각 단어를 1에서 800 사이의 16진수 숫자로 입력하십시오.", + "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "BIP-39 니모닉의 각 단어를 1에서 4000 사이의 8진수 숫자로 입력하십시오.", + "Enter each word of your BIP-39 mnemonic.": "BIP-39 니모닉의 각 단어를 입력하십시오.", + "Erase User's Data": "사용자 데이터 지우기", + "Erasing user's data..": "사용자의 데이터를 지우는 중...", + "Error:": "오류:", + "Esc": "Esc", + "Execute a signed Krux app?": "서명된 Krux 앱을 실행하시겠습니까?", + "Explore files?": "파일을 탐색하시겠습니까?", + "Exporting to SD card..": "SD카드로 내보내는 중..", + "Extended Public Key": "XPUB 내보내기", + "Factory Settings": "공장 초기 설정", + "Failed to decrypt": "복호화에 실패했습니다", + "Failed to load PSBT": "PSBT를 불러오지 못했습니다", + "Failed to load address": "주소를 불러오지 못했습니다", + "Failed to load key": "키 로드에 실패했습니다", + "Failed to load message": "메시지를 불러오지 못했습니다", + "Failed to load mnemonic": "니모닉을 불러오지 못했습니다", + "Failed to load output descriptor": "아웃풋 디스크립터를 불러오지 못했습니다", + "Failed to load passphrase": "패스프레이즈를 불러오지 못했습니다", + "Failed to store mnemonic": "니모닉을 저장하지 못했습니다", + "Fee:": "수수료:", + "Feed Rate": "Feed Rate", + "Filename": "파일명", + "Filename %s exists on SD card, overwrite?": "%s 파일명이 SD카드에 이미 존재합니다. 덮어쓰시겠습니까?", + "Fill the flash with entropy from camera?": "카메라의 엔트로피로 플래시를 채우시겠습니까?", + "Filling Flash": "플래시 채우기", + "Fingerprint unset in PSBT": "PSBT에서 지문이 설정되지 않았습니다", + "Firmware exceeds max size: %d": "펌웨어가 최대 크기를 초과했습니다: %d", + "Flash Map": "플래시 맵", + "Flash Tools": "플래시 도구", + "Flash filled with camera entropy": "카메라 엔트로피로 가득 찬 플래시", + "Flipped X Coordinates": "X 좌표 반전", + "Flute Diameter": "플루트 직경", + "Free:": "여유 공간:", + "From Storage": "저장공간에서 불러오기", + "Fully erase your SD card in another device to ensure data is unrecoverable": "다른 장치에서 데이터 복구가 불가능하도록 SD카드를 완전히 지우십시오", + "Generate Mnemonic": "니모닉 생성", + "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "이 니모닉에 별도 아이디를 지정하시겠습니까? 지정하지 않으면 현재 지문을 사용합니다", + "Go": "선택", + "Good entropy": "엔트로피가 충분합니다", + "Hardware": "하드웨어", + "Hex Public Key": "16진수 공개키", + "Hexadecimal": "16진수", + "Hide Mnemonics": "니모닉 숨기기", + "High fees!": "수수료가 높습니다!", + "ID already exists": "아이디가 이미 존재합니다", + "Index": "인덱스", + "Index: %s": "인덱스: %s", + "Inputs (%d):": "Input (%d):", + "Install?": "설치하시겠습니까?", + "Insufficient Entropy!": "엔트로피가 충분하지 않습니다!", + "Insufficient entropy": "엔트로피가 충분하지 않습니다", + "Invalid Tamper Check Code": "유효하지 않은 탬퍼 체크 코드", + "Invalid address": "주소가 잘못되었습니다", + "Invalid bootloader": "부트로더가 잘못되었습니다", + "Invalid mnemonic length": "니모닉 길이가 잘못되었습니다", + "Invalid public key": "공개키가 잘못되었습니다", + "Invalid wallet:": "지갑이 잘못되었습니다:", + "Invert": "반전", + "Inverted Colors": "반전된 색상", + "Key": "키", + "Key was not provided": "키가 제공되지 않았습니다", + "Krux Printer Test QR": "Krux 프린터 테스트 QR", + "LCD Type": "LCD 유형", + "Language": "언어", + "Leave blank if you'd like Krux to pick a valid final word": "마지막 단어를 Krux가 선택하도록 하려면 비워두십시오", + "Left": "왼쪽", + "Length: %s": "길이: %s", + "Line Delay": "줄 지연", + "Line:": "줄:", + "Load Krux app": "Krux 앱 로드", + "Load Mnemonic": "니모닉 불러오기", + "Load Wallet": "이대로 불러오기", + "Load a trusted wallet descriptor to view addresses?": "주소를 보기위해 신뢰할 수 있는 월렛 디스크립터를 불러오시겠습니까?", + "Load from SD card": "SD카드에서 불러오기", + "Load from SD card?": "SD카드에서 불러오시겠습니까?", + "Load from camera": "카메라로 불러오기", + "Load one?": "불러오시겠습니까?", + "Load?": "불러오시겠습니까?", + "Loading Camera..": "카메라를 구동 중입니다..", + "Loading change addresses..": "잔돈 주소를 불러옵니다..", + "Loading printer..": "프린터를 로딩 중입니다..", + "Loading receive addresses..": "수신 주소 불러옵니다..", + "Loading..": "로딩 중..", + "Locale": "언어 설정", + "Location": "기본 저장소", + "Maximum length exceeded (%s)": "최대 길이를 초과함 (%s)", + "Message": "메시지", + "Message:": "메시지:", + "Missing signature file": "서명 파일이 누락되었습니다", + "Mnemonic": "니모닉", + "Mnemonic ID": "니모닉 ID", + "Mnemonic and passphrase will be kept.": "니모닉과 암호는 유지됩니다.", + "Mnemonic was not encrypted": "니모닉이 암호화되지 않았습니다", + "Modified:": "수정되었습니다:", + "Multisig": "멀티시그", + "Native Segwit - 84 would be assumed": "네이티브 세그윗 - BIP84를 적용합니다", + "Network": "네트워크", + "New Mnemonic": "새로운 니모닉", + "New firmware detected.": "새로운 펌웨어가 감지되었습니다.", + "No": "아니요", + "No Passphrase": "패스프레이즈 없음", + "Not enough rolls!": "주사위 횟수가 충분하지 않습니다!", + "Numbers": "시드문구 순번", + "Octal": "8진수", + "Other Formats": "기타 형식", + "PBKDF2 Iter.": "PBKDF2 Iter.", + "Paint punched dots black so they can be detected.": "카메라가 감지할 수 있도록 펀치된 점을 검게 칠하십시오.", + "Paper Width": "종이 너비", + "Part": "파트", + "Part Size": "파트 사이즈", + "Passphrase": "패스프레이즈", + "Password Length": "비밀번호 길이", + "Path mismatch": "경로 불일치", + "Pattern detected!": "패턴이 감지되었습니다!", + "Permanently remove all stored encrypted mnemonics and settings from flash?": "저장된 모든 니모닉 및 설정값을 영구적으로 제거하시겠습니까?", + "Persist": "저장", + "Pixels deviation index:": "픽셀 편차 지수:", + "Plaintext QR": "일반텍스트 QR", + "Please load a wallet output descriptor": "지갑 출력 디스크립터를 불러오십시오", + "Plunge Rate": "침수율", + "Poor entropy": "엔트로피가 부족합니다", + "Poor entropy detected!": "엔트로피가 부족합니다!", + "Print Test QR": "QR 테스트 인쇄", + "Print Tiny Seed?": "Tiny Seed를 인쇄하시겠습니까?", + "Print to QR": "QR로 인쇄", + "Print to QR?": "QR로 인쇄하시겠습니까?", + "Print?": "인쇄하시겠습니까?", + "Printer": "프린터", + "Printer Driver not set!": "프린터 드라이버가 설정되지 않았습니다!", + "Printing..": "출력중", + "Proceed anyway?": "계속하시겠습니까?", + "Proceed?": "계속하시겠습니까?", + "Processing..": "처리...", + "QR Code": "QR 코드", + "RX Pin": "RX 핀", + "Reboot": "다시 반복", + "Receive": "받기", + "Receive Addresses": "주소", + "Region:": "지역:", + "Remove %s?": "%s을 제거하시겠습니까?", + "Remove Mnemonic": "니모닉 제거", + "Remove firmware files from SD Card?": "SD카드에서 펌웨어 파일을 제거하시겠습니까?", + "Res. - Format": "Res. - 형식", + "Restore factory settings and reboot?": "공장 설정을 복원하고 재부팅하시겠습니까?", + "Return to QR Viewer": "QR 뷰어로 돌아가기", + "Review scanned data, edit if necessary": "스캔된 데이터를 검토하고 필요한 경우 수정하십시오", + "Right": "오른쪽", + "Roll dice at least %d times to generate a mnemonic.": "니모닉을 생성하려면 주사위를 최소 %d번 굴리십시오.", + "Rolls distribution:": "주사위값 분포:", + "Rolls:": "주사위 횟수:", + "SD card": "SD카드", + "SD card not detected.": "SD카드가 감지되지 않았습니다.", + "SHA256 of rolls:": "주사위의 SHA256:", + "SHA256 of snapshot:": "SHA256 스냅샷:", + "Save QR Image to SD Card": "QR 이미지를 SD카드에 저장", + "Save to SD card": "SD카드에 저장", + "Save to SD card?": "SD카드에 저장하시겠습니까?", + "Saved to SD card": "SD카드에 저장됨", + "Scale": "스케일", + "Scan Address": "주소 스캔하기", + "Scan BIP39 Passphrase": "BIP39 패스프레이즈 스캔하기", + "Scan Key QR Code": "비밀번호 QR 스캔", + "Scanning words 1-12 again": "1번째부터 12번째 단어를 스캔 중입니다", + "Scanning words 13-24": "13번째부터 24번째 단어를 스캔 중입니다", + "Screensaver Time": "화면보호기 시간", + "Script Type": "지갑 형식", + "Security": "보안", + "Self-transfer or Change (%d):": "본인주소 전송 또는 잔돈 (%d):", + "Self-transfer:": "자가 이체:", + "Set a tamper check code first": "먼저 탬퍼 체크 코드를 설정하세요.", + "Settings": "설정", + "Settings stored internally on flash.": "설정은 플래시에서 내부적으로 저장됩니다.", + "Settings stored on SD card.": "SD 카드에 저장된 설정.", + "Shannon's Entropy:": "Shannon의 엔트로피:", + "Shutdown": "종료", + "Shutdown Time": "자동 종료시간", + "Shutting down..": "종료 중..", + "Sign": "서명하기", + "Sign to QR code": "QR코드로 내보내기", + "Sign to SD card": "SD카드로 내보내기", + "Sign?": "서명하시겠습니까?", + "Signature": "서명", + "Signed Message": "서명된 메시지", + "Signed PSBT": "서명된 PSBT", + "Signing..": "서명 중..", + "Single-sig": "단일서명", + "Size:": "크기:", + "Some checks cannot be performed.": "일부 검사를 수행할 수 없습니다.", + "Spend (%d):": "Spend (%d):", + "Spend:": "지출", + "Stats for Nerds": "전문가를 위한 통계", + "Store on Flash": "플래시 메모리에 저장", + "Store on SD Card": "SD카드에 저장", + "Swipe to change mode": "모드를 변경하려면 화면을 옆으로 쓸어내리세요", + "TC Flash Hash": "TC Flash Hash", + "TC Flash Hash at Boot": "부팅 시 플래시 탬퍼 확인 해시", + "TOUCH or ENTER to capture": "터치하거나 엔터를 눌러 캡처하십시오", + "TX Pin": "TX 핀", + "Tamper Check Code": "탬퍼 체크 코드", + "Tamper check code set successfully": "탬퍼 검사 코드가 성공적으로 설정되었습니다", + "Tamper check codes do not match": "탬퍼 검사 코드가 일치하지 않습니다", + "Text": "텍스트", + "Theme": "테마", + "Thermal": "Thermal", + "To ensure data is unrecoverable use Wipe Device feature": "데이터 복구가 불가능하도록 장치 전체지우기 기능을 사용하십시오", + "Toggle Brightness": "밝기 전환", + "Tools": "도구", + "Touch Threshold": "터치 민감도", + "Touchscreen": "터치스크린", + "Try more?": "더 하시겠습니까?", + "Type BIP39 Passphrase": "BIP39 패스프레이즈 입력", + "Type Key": "비밀번호 입력", + "Unit": "단위", + "Upgrade complete.": "업그레이드가 완료되었습니다", + "Use a black background surface.": "검은색 배경 화면을 사용하십시오.", + "Use camera's entropy to create a new mnemonic": "카메라의 엔트로피를 사용하여 새로운 니모닉을 생성하십시오", + "Used:": "이미 사용됨:", + "User's Data": "사용자 데이터", + "Value %s out of range: [%s, %s]": "%s는 [%s, %s] 범위를 벗어났습니다", + "Value must be multiple of %s": "값은 %s의 배수여야 합니다", + "Verifying..": "검증 중..", + "Version": "버전", + "Via Camera": "카메라", + "Via D20": "20면체 주사위", + "Via D6": "일반 주사위", + "Via Manual Input": "직접 입력", + "Via Words": "니모닉 단어 입력", + "Wait for the capture": "캡처될때까지 기다리십시오", + "Wallet": "지갑 설정", + "Wallet Descriptor": "지갑 디스크립터", + "Wallet output descriptor": "지갑 출력 디스크립터", + "Wallet output descriptor loaded!": "지갑 출력 디스크립터가 로드되었습니다!", + "Wallet output descriptor not found.": "지갑 출력 디스크립터를 찾을 수 없습니다.", + "Warning:": "경고:", + "Word %d": "%d 단어", + "Word Numbers": "단어 번호(1-2048)", + "Words": "시드문구", + "Yes": "예", + "is a valid address!": "는 유효한 주소입니다!", + "was NOT FOUND in the first %d addresses": "첫 번째 %d개의 주소에서 찾을 수 없습니다" +} \ No newline at end of file diff --git a/i18n/translations/nl-NL.json b/i18n/translations/nl-NL.json index 9c458b7fd..cf30ccdcd 100644 --- a/i18n/translations/nl-NL.json +++ b/i18n/translations/nl-NL.json @@ -1 +1,322 @@ -{"% of the amount.": "% van het bedrag.", "%d of %d multisig": "%d van %d multisig", "%d to %d": "%d tot %d", "%s removed.": "%s verwijderd.", "(%d total)": "(%d totaal)", "(Experimental)": "(Experimenteel)", "(watch-only)": "(alleen inzien)", "12 words": "12 woorden", "24 words": "24 woorden", "About": "Over", "Accept assumption?": "Aanname accepteren?", "Account": "Account", "Account #0 would be assumed": "Account #0 zou worden aangenomen", "Account Index": "Accountindex", "Add or change wallet passphrase?": "Wachtwoordzin voor portemonnee toevoegen of wijzigen?", "Additional entropy from camera required for AES-CBC mode": "Extra entropie van de camera vereist voor AES-CBC-modus", "Address": "Adres", "Align camera and backup plate properly.": "Richt de camera en back-upplaat op de juiste manier.", "Allow in settings first!": "Sta eerst instellingen toe!", "Anti-glare disabled": "Anti reflecterend uitgeschakeld", "Anti-glare enabled": "Anti reflecterend ingeschakeld", "Appearance": "Uiterlijk", "Are you sure?": "Weet je het zeker?", "BGR Colors": "BGR-kleuren", "BIP39 Mnemonic": "BIP39 Mnemonic", "Back": "Terug", "Back to Menu": "Terug naar menu", "Backup Mnemonic": "Backup geheugensteun", "Bad signature": "Ongeldige handtekening", "Base64 Password": "Base64-wachtwoord", "Baudrate": "Baudratio", "Binary Grid": "Binair raster", "Border Padding": "Rand opvulling", "Brightness": "Helderheid", "Buttons": "Knoppen", "Buttons Debounce": "Debounce van knoppen", "Capture cancelled": "Opname geannuleerd", "Change": "Change", "Change Addresses": "Wisselgeldadres", "Change theme and reboot?": "Thema veranderen en opnieuw opstarten?", "Change:": "Wisselgeld:", "Changes will last until shutdown.": "Wijzigingen blijven van kracht tot afsluiten.", "Check SD Card": "Controleer SD kaart", "Check that address belongs to this wallet?": "Controleer of dit adres bij deze portemonnee hoort?", "Checked %d addresses with no matches.": "%d adressen gecontroleerd zonder overeenkomsten.", "Checking for SD card..": "SD kaart controleren..", "Confirm Tamper Check Code": "Bevestig de sabotagecontrolecode", "Create QR Code": "QR code maken", "Create QR code from text?": "QR code maken van tekst?", "Created:": "Aangemaakt:", "Current Tamper Check Code": "Huidige sabotagecontrolecode", "Custom QR Code": "Aangepaste QR code", "Customize": "Aanpassen", "Customizing your wallet will generate a new Key.": "Bij aanpassen van de portemonnee zal er een nieuwe sleutel gegenereerd worden.", "Cut Depth": "Snijdiepte", "Cut Method": "Snijmethode", "Decimal": "Decimaal", "Decrypt?": "Ontsleutelen?", "Default Wallet": "Standaard portemonnee", "Depth Per Pass": "Diepte per pas", "Derive BIP85 entropy?": "BIP85-entropie afleiden?", "Descriptor Addresses": "Descriptoradressen", "Display": "Weergave", "Do not power off, it may take a while to complete.": "Schakel het apparaat niet uit, het kan even duren voordat het klaar is.", "Done?": "Klaar?", "Double mnemonic": "Dubbel geheugensteuntje", "Driver": "Driver", "Empty": "Leeg", "Enable Krux apps": "Krux-apps inschakelen", "Encrypted": "Versleuteld", "Encrypted QR Code": "Versleutelde QR code", "Encrypted mnemonic was not stored": "Versleutelde geheugensteun was niet opgeslagen", "Encrypted mnemonic was stored with ID:": "Versleutelde geheugensteun is opgeslagen met ID:", "Encryption": "Versleutelen", "Encryption Mode": "Versleutel modus", "Enter %d BIP-39 words.": "Voer %d BIP-39 woorden in.", "Enter a 6+ characters Tamper Check Code": "Voer een sabotagecontrolecode van 6 of meer tekens in", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Voer elk woord van jouw BIP-39 geheugensteun in als een nummer van 1 tot 2048.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Voer elk woord van jouw BIP-39 geheugensteun in als een hexadecimaal van 1 tot 800.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Voer elk woord van jouw BIP-39 geheugensteun in als een octaal van 1 tot 4000.", "Enter each word of your BIP-39 mnemonic.": "Voer elk woord van jouw BIP-39 geheugensteun in.", "Erase User's Data": "Gegevens van gebruiker wissen", "Erasing user's data..": "Gegevens van gebruiker wissen..", "Error:": "Fout:", "Esc": "Esc", "Execute a signed Krux app?": "Een ondertekende Krux-app uitvoeren?", "Explore files?": "Bestanden verkennen?", "Exporting to SD card..": "Exporteren naar SD kaart..", "Extended Public Key": "Uitgebreide publieke sleutel", "Factory Settings": "Fabrieksinstellingen", "Failed to decrypt": "Ontsleutelen is niet gelukt", "Failed to load PSBT": "PSBT laden is niet gelukt", "Failed to load address": "Adres laden is niet gelukt", "Failed to load key": "Sleutel laden is niet gelukt", "Failed to load message": "Bericht laden is niet gelukt", "Failed to load mnemonic": "Geheugensteun laden is niet gelukt", "Failed to load output descriptor": "Descriptor laden is niet gelukt", "Failed to load passphrase": "Wachtwoord laden is niet gelukt", "Failed to store mnemonic": "Geheugensteun opslaan is niet gelukt", "Fee:": "Tarief:", "Feed Rate": "Voedingssnelheid", "Filename": "Bestandsnaam", "Filename %s exists on SD card, overwrite?": "Bestandsnaam %s OVERSCHRIJVEN op SD kaart?", "Fill the flash with entropy from camera?": "De flash vullen met entropie van de camera?", "Filling Flash": "Flash vullen", "Fingerprint unset in PSBT": "Vingerafdruk niet ingesteld in PSBT", "Firmware exceeds max size: %d": "Firmware overschrijdt de maximale grootte: %d", "Flash Map": "Flash Map", "Flash Tools": "Flash Tools", "Flash filled with camera entropy": "Flash gevuld met camera-entropie", "Flipped X Coordinates": "Geflipte X-coördinaten", "Flute Diameter": "Fluit diameter", "Free:": "Vrij:", "From Storage": "Uit data-opslag", "Fully erase your SD card in another device to ensure data is unrecoverable": "Wis uw SD kaart volledig in een ander apparaat om te zorgen dat de gegevens onherstelbaar zijn", "Generate Mnemonic": "Geheugensteun genereren", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Eigen ID gebruiken voor geheugensteun? Anders vingerafdruk gebruiken", "Go": "Ga", "Good entropy": "Goede entropie", "Hardware": "Hardware", "Hex Public Key": "Hex publieke sleutel", "Hexadecimal": "Hexadecimaal", "Hide Mnemonics": "Verberg geheugensteunen", "High fees!": "Hoge kosten!", "ID already exists": "ID bestaat al", "Index": "Index", "Index: %s": "Index: %s", "Inputs (%d):": "Invoer (%d):", "Install?": "Installeren?", "Insufficient Entropy!": "Onvoldoende Entropie!", "Insufficient entropy": "Onvoldoende entropie", "Invalid Tamper Check Code": "Ongeldige sabotagecontrolecode", "Invalid address": "Ongeldig adres", "Invalid bootloader": "Ongeldige bootloader", "Invalid mnemonic length": "Ongeldige geheugensteun lengte", "Invalid public key": "Ongeldige publieke sleutel", "Invalid wallet:": "Ongeldige portemonnee:", "Invert": "Omkeren", "Inverted Colors": "Omgekeerde kleuren", "Key": "Sleutel", "Key was not provided": "Sleutel niet verstrekt", "Krux Printer Test QR": "Krux printer test QR", "LCD Type": "LCD-type", "Language": "Taal", "Leave blank if you'd like Krux to pick a valid final word": "Laat leeg als je wilt dat Krux een geldig laatste woord kiest", "Left": "Links", "Length: %s": "Lengte: %s", "Line Delay": "Lijn vertraging", "Line:": "Lijn:", "Load Krux app": "Krux-app laden", "Load Mnemonic": "Geheugensteun laden", "Load Wallet": "Portemonnee laden", "Load a trusted wallet descriptor to view addresses?": "Een vertrouwde portemonnee descriptor laden om adressen te bekijken?", "Load from SD card": "Laden vanaf SD kaart", "Load from SD card?": "Laden vanaf SD kaart?", "Load from camera": "Laden van camera", "Load one?": "Laden?", "Load?": "Laden?", "Loading Camera..": "Camera laden..", "Loading change addresses..": "Wijzigingsadressen laden..", "Loading printer..": "Laadprinter..", "Loading receive addresses..": "Ontvangstadressen laden..", "Loading..": "Laden..", "Locale": "Taal", "Location": "Opslaglocatie", "Maximum length exceeded (%s)": "Maximale lengte overschreden (%s)", "Message": "Bericht", "Message:": "Bericht:", "Missing signature file": "Handtekening bestand mist", "Mnemonic": "Geheugensteun", "Mnemonic ID": "Geheugensteun ID", "Mnemonic and passphrase will be kept.": "Geheugensteun en wachtwoord worden bewaard.", "Mnemonic was not encrypted": "Geheugensteun is niet versleuteld", "Modified:": "Aangepast:", "Multisig": "Multisig", "Native Segwit - 84 would be assumed": "Native Segwit - 84 zal worden gebruikt", "Network": "Netwerk", "New Mnemonic": "Geheugensteun aanmaken", "New firmware detected.": "Nieuwe firmware gevonden.", "No": "Nee", "No Passphrase": "Geen wachtwoordzin", "Not enough rolls!": "Niet genoeg gedobbeld!", "Numbers": "Nummers", "Octal": "Octaal", "Other Formats": "Andere indelingen", "PBKDF2 Iter.": "PBKDF2 iter.", "Paint punched dots black so they can be detected.": "Maak geperforeerde stippen zwart zodat ze worden gedetecteerd.", "Paper Width": "Papier breedte", "Part": "Deel", "Part Size": "Deel grootte", "Passphrase": "Wachtwoord", "Password Length": "Wachtwoordlengte:", "Path mismatch": "Pad komt niet overeen", "Pattern detected!": "Patroon gevonden!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "Alle opgeslagen versleutelde mnemonics en instellingen permanent uit het flashgeheugen verwijderen?", "Persist": "Opslag", "Pixels deviation index:": "Pixelafwijkingsindex:", "Plaintext QR": "Platte tekst QR", "Please load a wallet output descriptor": "Laadt een portemonnee descriptor in", "Plunge Rate": "Duik tarief", "Poor entropy": "Slechte entropie", "Poor entropy detected!": "Lage entropie gedetecteerd!", "Print Test QR": "Test QR afdrukken", "Print Tiny Seed?": "Tiny Seed afdrukken?", "Print to QR": "Afdrukken naar QR", "Print to QR?": "Afdrukken naar QR?", "Print?": "Afdrukken?", "Printer": "Printer", "Printer Driver not set!": "Printer driver niet ingesteld!", "Printing..": "Afdrukken..", "Proceed anyway?": "Toch doorgaan?", "Proceed?": "Doorgaan?", "Processing..": "Verwerken..", "QR Code": "QR code", "RX Pin": "RX pin", "Reboot": "Opnieuw opstarten", "Receive": "Ontvangen", "Receive Addresses": "Ontvangstadres", "Region:": "Regio:", "Remove %s?": "Verwijderen %s?", "Remove Mnemonic": "Geheugensteun verwijderen", "Remove firmware files from SD Card?": "Firmwarebestanden van SD kaart verwijderen?", "Res. - Format": "Res. - Formaat", "Restore factory settings and reboot?": "Fabrieksinstellingen herstellen en opnieuw opstarten?", "Return to QR Viewer": "Terug naar QR-lezer", "Review scanned data, edit if necessary": "Controleer gescande gegevens en bewerk indien nodig", "Right": "Rechts", "Roll dice at least %d times to generate a mnemonic.": "Dobbel een dobbelsteen minstens %d keer voor het genereren van een geheugensteun.", "Rolls distribution:": "Roldistributie:", "Rolls:": "Gedobbeld:", "SD card": "SD kaart", "SD card not detected.": "SD kaart niet gedetecteerd.", "SHA256 of rolls:": "Gedobbelde SHA256:", "SHA256 of snapshot:": "Momentopname van SHA256:", "Save QR Image to SD Card": "QR-afbeelding opslaan op SD kaart", "Save to SD card": "Opslaan op SD kaart", "Save to SD card?": "Opslaan op SD kaart?", "Saved to SD card": "Opgeslagen op SD kaart", "Scale": "Schaal", "Scan Address": "Adres scannen", "Scan BIP39 Passphrase": "BIP-39 Wachtwoord Scannen", "Scan Key QR Code": "QR Code Sleutel Scannen", "Scanning words 1-12 again": "Woorden 1 t/m 12 opnieuw scannen", "Scanning words 13-24": "Woorden 13 t/m 24 scannen", "Screensaver Time": "Schermbeveiligingstijd", "Script Type": "Scripttype", "Security": "Beveiliging", "Self-transfer or Change (%d):": "Overschrijving naar jezelf, of wisselgeld (%d):", "Self-transfer:": "Zelf overschrijving:", "Set a tamper check code first": "Stel eerst een sabotagecontrolecode in", "Settings": "Instellingen", "Settings stored internally on flash.": "Instellingen intern opgeslagen op flitser.", "Settings stored on SD card.": "Instellingen opgeslagen op SD kaart.", "Shannon's Entropy:": "Shannon's entropie:", "Shutdown": "Afsluiten", "Shutdown Time": "Uitschakelingstijd:", "Shutting down..": "Bezig met afsluiten..", "Sign": "Ondertekenen", "Sign to QR code": "Teken op QR-code", "Sign to SD card": "Teken op SD kaart", "Sign?": "Ondertekenen?", "Signature": "Handtekening", "Signed Message": "Bericht ondertekend", "Signed PSBT": "PSBT ondertekend", "Signing..": "Ondertekenen..", "Single-sig": "Enkele sleutel", "Size:": "Grootte:", "Some checks cannot be performed.": "Sommige controles kunnen niet worden uitgevoerd.", "Spend (%d):": "Uitgaven (%d):", "Spend:": "Uitgaven:", "Stats for Nerds": "Statistieken voor nerds", "Store on Flash": "Opslaan op apparaat", "Store on SD Card": "Opslaan op SD kaart", "Swipe to change mode": "Verander modus", "TC Flash Hash": "TC Flash Hash", "TC Flash Hash at Boot": "Hash Flash bij het opstarten", "TOUCH or ENTER to capture": "TIK of ENTER voor opname", "TX Pin": "TX pin", "Tamper Check Code": "Sabotagecontrolecode", "Tamper check code set successfully": "Sabotagecontrolecode succesvol ingesteld", "Tamper check codes do not match": "Sabotagecontrolecodes komen niet overeen", "Text": "Tekst", "Theme": "Thema", "Thermal": "Thermisch", "To ensure data is unrecoverable use Wipe Device feature": "Gebruik de functie 'Apparaat wissen' om te zorgen dat de gegevens onherstelbaar zijn", "Toggle Brightness": "Helderheid schakelen", "Tools": "Hulpmiddelen", "Touch Threshold": "Aanraak gevoeligheid", "Touchscreen": "Aanraakscherm", "Try more?": "Meer proberen?", "Type BIP39 Passphrase": "Voer een BIP-39 wachtwoord in", "Type Key": "Voer sleutel in", "Unit": "Eenheid", "Upgrade complete.": "Upgrade afgerond.", "Use a black background surface.": "Gebruik een donker achergrond.", "Use camera's entropy to create a new mnemonic": "Gebruik de camera als entropie voor het aanmaken van een nieuwe geheugensteun", "Used:": "Gebruikt:", "User's Data": "Gebruiker", "Value %s out of range: [%s, %s]": "Waarde %s is buiten bereik: [%s, %s]", "Value must be multiple of %s": "Waarde moet meerdere van %s zijn", "Verifying..": "Bezig met verifiëren..", "Version": "Versie", "Via Camera": "Via camera", "Via D20": "Via D20", "Via D6": "Via D6", "Via Manual Input": "Via handmatige invoer", "Via Words": "Via woorden", "Wait for the capture": "Wacht op opname", "Wallet": "Portemonnee", "Wallet Descriptor": "Descriptor", "Wallet output descriptor": "Portemonnee descriptor", "Wallet output descriptor loaded!": "Portemonnee descriptor geladen!", "Wallet output descriptor not found.": "Portemonnee descriptor niet gevonden.", "Warning:": "Waarschuwing:", "Word %d": "Woord %d", "Word Numbers": "Woord nummers", "Words": "Woorden", "Yes": "Yes", "is a valid address!": "is geen geldig adres", "was NOT FOUND in the first %d addresses": "werd NIET GEVONDEN in de eerste %d adressen"} \ No newline at end of file +{ + "% of the amount.": "% van het bedrag.", + "%d of %d multisig": "%d van %d multisig", + "%d to %d": "%d tot %d", + "%s removed.": "%s verwijderd.", + "(%d total)": "(%d totaal)", + "(Experimental)": "(Experimenteel)", + "(watch-only)": "(alleen inzien)", + "12 words": "12 woorden", + "24 words": "24 woorden", + "About": "Over", + "Accept assumption?": "Aanname accepteren?", + "Account": "Account", + "Account #0 would be assumed": "Account #0 zou worden aangenomen", + "Account Index": "Accountindex", + "Add or change wallet passphrase?": "Wachtwoordzin voor portemonnee toevoegen of wijzigen?", + "Additional entropy from camera required for AES-CBC mode": "Extra entropie van de camera vereist voor AES-CBC-modus", + "Address": "Adres", + "Align camera and backup plate properly.": "Richt de camera en back-upplaat op de juiste manier.", + "Allow in settings first!": "Sta eerst instellingen toe!", + "Anti-glare disabled": "Anti reflecterend uitgeschakeld", + "Anti-glare enabled": "Anti reflecterend ingeschakeld", + "Appearance": "Uiterlijk", + "Are you sure?": "Weet je het zeker?", + "BGR Colors": "BGR-kleuren", + "BIP39 Mnemonic": "BIP39 Mnemonic", + "Back": "Terug", + "Back to Menu": "Terug naar menu", + "Backup Mnemonic": "Backup geheugensteun", + "Bad signature": "Ongeldige handtekening", + "Base64 Password": "Base64-wachtwoord", + "Baudrate": "Baudratio", + "Binary Grid": "Binair raster", + "Border Padding": "Rand opvulling", + "Brightness": "Helderheid", + "Buttons": "Knoppen", + "Buttons Debounce": "Debounce van knoppen", + "Capture cancelled": "Opname geannuleerd", + "Change": "Change", + "Change Addresses": "Wisselgeldadres", + "Change theme and reboot?": "Thema veranderen en opnieuw opstarten?", + "Change:": "Wisselgeld:", + "Changes will last until shutdown.": "Wijzigingen blijven van kracht tot afsluiten.", + "Check SD Card": "Controleer SD kaart", + "Check that address belongs to this wallet?": "Controleer of dit adres bij deze portemonnee hoort?", + "Checked %d addresses with no matches.": "%d adressen gecontroleerd zonder overeenkomsten.", + "Checking for SD card..": "SD kaart controleren..", + "Confirm Tamper Check Code": "Bevestig de sabotagecontrolecode", + "Create QR Code": "QR code maken", + "Create QR code from text?": "QR code maken van tekst?", + "Created:": "Aangemaakt:", + "Current Tamper Check Code": "Huidige sabotagecontrolecode", + "Custom QR Code": "Aangepaste QR code", + "Customize": "Aanpassen", + "Customizing your wallet will generate a new Key.": "Bij aanpassen van de portemonnee zal er een nieuwe sleutel gegenereerd worden.", + "Cut Depth": "Snijdiepte", + "Cut Method": "Snijmethode", + "Decimal": "Decimaal", + "Decrypt?": "Ontsleutelen?", + "Default Wallet": "Standaard portemonnee", + "Depth Per Pass": "Diepte per pas", + "Derive BIP85 entropy?": "BIP85-entropie afleiden?", + "Descriptor Addresses": "Descriptoradressen", + "Display": "Weergave", + "Do not power off, it may take a while to complete.": "Schakel het apparaat niet uit, het kan even duren voordat het klaar is.", + "Done?": "Klaar?", + "Double mnemonic": "Dubbel geheugensteuntje", + "Driver": "Driver", + "Empty": "Leeg", + "Enable Krux apps": "Krux-apps inschakelen", + "Encrypted": "Versleuteld", + "Encrypted QR Code": "Versleutelde QR code", + "Encrypted mnemonic was not stored": "Versleutelde geheugensteun was niet opgeslagen", + "Encrypted mnemonic was stored with ID:": "Versleutelde geheugensteun is opgeslagen met ID:", + "Encryption": "Versleutelen", + "Encryption Mode": "Versleutel modus", + "Enter %d BIP-39 words.": "Voer %d BIP-39 woorden in.", + "Enter a 6+ characters Tamper Check Code": "Voer een sabotagecontrolecode van 6 of meer tekens in", + "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Voer elk woord van jouw BIP-39 geheugensteun in als een nummer van 1 tot 2048.", + "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Voer elk woord van jouw BIP-39 geheugensteun in als een hexadecimaal van 1 tot 800.", + "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Voer elk woord van jouw BIP-39 geheugensteun in als een octaal van 1 tot 4000.", + "Enter each word of your BIP-39 mnemonic.": "Voer elk woord van jouw BIP-39 geheugensteun in.", + "Erase User's Data": "Gegevens van gebruiker wissen", + "Erasing user's data..": "Gegevens van gebruiker wissen..", + "Error:": "Fout:", + "Esc": "Esc", + "Execute a signed Krux app?": "Een ondertekende Krux-app uitvoeren?", + "Explore files?": "Bestanden verkennen?", + "Exporting to SD card..": "Exporteren naar SD kaart..", + "Extended Public Key": "Uitgebreide publieke sleutel", + "Factory Settings": "Fabrieksinstellingen", + "Failed to decrypt": "Ontsleutelen is niet gelukt", + "Failed to load PSBT": "PSBT laden is niet gelukt", + "Failed to load address": "Adres laden is niet gelukt", + "Failed to load key": "Sleutel laden is niet gelukt", + "Failed to load message": "Bericht laden is niet gelukt", + "Failed to load mnemonic": "Geheugensteun laden is niet gelukt", + "Failed to load output descriptor": "Descriptor laden is niet gelukt", + "Failed to load passphrase": "Wachtwoord laden is niet gelukt", + "Failed to store mnemonic": "Geheugensteun opslaan is niet gelukt", + "Fee:": "Tarief:", + "Feed Rate": "Voedingssnelheid", + "Filename": "Bestandsnaam", + "Filename %s exists on SD card, overwrite?": "Bestandsnaam %s OVERSCHRIJVEN op SD kaart?", + "Fill the flash with entropy from camera?": "De flash vullen met entropie van de camera?", + "Filling Flash": "Flash vullen", + "Fingerprint unset in PSBT": "Vingerafdruk niet ingesteld in PSBT", + "Firmware exceeds max size: %d": "Firmware overschrijdt de maximale grootte: %d", + "Flash Map": "Flash Map", + "Flash Tools": "Flash Tools", + "Flash filled with camera entropy": "Flash gevuld met camera-entropie", + "Flipped X Coordinates": "Geflipte X-coördinaten", + "Flute Diameter": "Fluit diameter", + "Free:": "Vrij:", + "From Storage": "Uit data-opslag", + "Fully erase your SD card in another device to ensure data is unrecoverable": "Wis uw SD kaart volledig in een ander apparaat om te zorgen dat de gegevens onherstelbaar zijn", + "Generate Mnemonic": "Geheugensteun genereren", + "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Eigen ID gebruiken voor geheugensteun? Anders vingerafdruk gebruiken", + "Go": "Ga", + "Good entropy": "Goede entropie", + "Hardware": "Hardware", + "Hex Public Key": "Hex publieke sleutel", + "Hexadecimal": "Hexadecimaal", + "Hide Mnemonics": "Verberg geheugensteunen", + "High fees!": "Hoge kosten!", + "ID already exists": "ID bestaat al", + "Index": "Index", + "Index: %s": "Index: %s", + "Inputs (%d):": "Invoer (%d):", + "Install?": "Installeren?", + "Insufficient Entropy!": "Onvoldoende Entropie!", + "Insufficient entropy": "Onvoldoende entropie", + "Invalid Tamper Check Code": "Ongeldige sabotagecontrolecode", + "Invalid address": "Ongeldig adres", + "Invalid bootloader": "Ongeldige bootloader", + "Invalid mnemonic length": "Ongeldige geheugensteun lengte", + "Invalid public key": "Ongeldige publieke sleutel", + "Invalid wallet:": "Ongeldige portemonnee:", + "Invert": "Omkeren", + "Inverted Colors": "Omgekeerde kleuren", + "Key": "Sleutel", + "Key was not provided": "Sleutel niet verstrekt", + "Krux Printer Test QR": "Krux printer test QR", + "LCD Type": "LCD-type", + "Language": "Taal", + "Leave blank if you'd like Krux to pick a valid final word": "Laat leeg als je wilt dat Krux een geldig laatste woord kiest", + "Left": "Links", + "Length: %s": "Lengte: %s", + "Line Delay": "Lijn vertraging", + "Line:": "Lijn:", + "Load Krux app": "Krux-app laden", + "Load Mnemonic": "Geheugensteun laden", + "Load Wallet": "Portemonnee laden", + "Load a trusted wallet descriptor to view addresses?": "Een vertrouwde portemonnee descriptor laden om adressen te bekijken?", + "Load from SD card": "Laden vanaf SD kaart", + "Load from SD card?": "Laden vanaf SD kaart?", + "Load from camera": "Laden van camera", + "Load one?": "Laden?", + "Load?": "Laden?", + "Loading Camera..": "Camera laden..", + "Loading change addresses..": "Wijzigingsadressen laden..", + "Loading printer..": "Laadprinter..", + "Loading receive addresses..": "Ontvangstadressen laden..", + "Loading..": "Laden..", + "Locale": "Taal", + "Location": "Opslaglocatie", + "Maximum length exceeded (%s)": "Maximale lengte overschreden (%s)", + "Message": "Bericht", + "Message:": "Bericht:", + "Missing signature file": "Handtekening bestand mist", + "Mnemonic": "Geheugensteun", + "Mnemonic ID": "Geheugensteun ID", + "Mnemonic and passphrase will be kept.": "Geheugensteun en wachtwoord worden bewaard.", + "Mnemonic was not encrypted": "Geheugensteun is niet versleuteld", + "Modified:": "Aangepast:", + "Multisig": "Multisig", + "Native Segwit - 84 would be assumed": "Native Segwit - 84 zal worden gebruikt", + "Network": "Netwerk", + "New Mnemonic": "Geheugensteun aanmaken", + "New firmware detected.": "Nieuwe firmware gevonden.", + "No": "Nee", + "No Passphrase": "Geen wachtwoordzin", + "Not enough rolls!": "Niet genoeg gedobbeld!", + "Numbers": "Nummers", + "Octal": "Octaal", + "Other Formats": "Andere indelingen", + "PBKDF2 Iter.": "PBKDF2 iter.", + "Paint punched dots black so they can be detected.": "Maak geperforeerde stippen zwart zodat ze worden gedetecteerd.", + "Paper Width": "Papier breedte", + "Part": "Deel", + "Part Size": "Deel grootte", + "Passphrase": "Wachtwoord", + "Password Length": "Wachtwoordlengte:", + "Path mismatch": "Pad komt niet overeen", + "Pattern detected!": "Patroon gevonden!", + "Permanently remove all stored encrypted mnemonics and settings from flash?": "Alle opgeslagen versleutelde mnemonics en instellingen permanent uit het flashgeheugen verwijderen?", + "Persist": "Opslag", + "Pixels deviation index:": "Pixelafwijkingsindex:", + "Plaintext QR": "Platte tekst QR", + "Please load a wallet output descriptor": "Laadt een portemonnee descriptor in", + "Plunge Rate": "Duik tarief", + "Poor entropy": "Slechte entropie", + "Poor entropy detected!": "Lage entropie gedetecteerd!", + "Print Test QR": "Test QR afdrukken", + "Print Tiny Seed?": "Tiny Seed afdrukken?", + "Print to QR": "Afdrukken naar QR", + "Print to QR?": "Afdrukken naar QR?", + "Print?": "Afdrukken?", + "Printer": "Printer", + "Printer Driver not set!": "Printer driver niet ingesteld!", + "Printing..": "Afdrukken..", + "Proceed anyway?": "Toch doorgaan?", + "Proceed?": "Doorgaan?", + "Processing..": "Verwerken..", + "QR Code": "QR code", + "RX Pin": "RX pin", + "Reboot": "Opnieuw opstarten", + "Receive": "Ontvangen", + "Receive Addresses": "Ontvangstadres", + "Region:": "Regio:", + "Remove %s?": "Verwijderen %s?", + "Remove Mnemonic": "Geheugensteun verwijderen", + "Remove firmware files from SD Card?": "Firmwarebestanden van SD kaart verwijderen?", + "Res. - Format": "Res. - Formaat", + "Restore factory settings and reboot?": "Fabrieksinstellingen herstellen en opnieuw opstarten?", + "Return to QR Viewer": "Terug naar QR-lezer", + "Review scanned data, edit if necessary": "Controleer gescande gegevens en bewerk indien nodig", + "Right": "Rechts", + "Roll dice at least %d times to generate a mnemonic.": "Dobbel een dobbelsteen minstens %d keer voor het genereren van een geheugensteun.", + "Rolls distribution:": "Roldistributie:", + "Rolls:": "Gedobbeld:", + "SD card": "SD kaart", + "SD card not detected.": "SD kaart niet gedetecteerd.", + "SHA256 of rolls:": "Gedobbelde SHA256:", + "SHA256 of snapshot:": "Momentopname van SHA256:", + "Save QR Image to SD Card": "QR-afbeelding opslaan op SD kaart", + "Save to SD card": "Opslaan op SD kaart", + "Save to SD card?": "Opslaan op SD kaart?", + "Saved to SD card": "Opgeslagen op SD kaart", + "Scale": "Schaal", + "Scan Address": "Adres scannen", + "Scan BIP39 Passphrase": "BIP-39 Wachtwoord Scannen", + "Scan Key QR Code": "QR Code Sleutel Scannen", + "Scanning words 1-12 again": "Woorden 1 t/m 12 opnieuw scannen", + "Scanning words 13-24": "Woorden 13 t/m 24 scannen", + "Screensaver Time": "Schermbeveiligingstijd", + "Script Type": "Scripttype", + "Security": "Beveiliging", + "Self-transfer or Change (%d):": "Overschrijving naar jezelf, of wisselgeld (%d):", + "Self-transfer:": "Zelf overschrijving:", + "Set a tamper check code first": "Stel eerst een sabotagecontrolecode in", + "Settings": "Instellingen", + "Settings stored internally on flash.": "Instellingen intern opgeslagen op flitser.", + "Settings stored on SD card.": "Instellingen opgeslagen op SD kaart.", + "Shannon's Entropy:": "Shannon's entropie:", + "Shutdown": "Afsluiten", + "Shutdown Time": "Uitschakelingstijd:", + "Shutting down..": "Bezig met afsluiten..", + "Sign": "Ondertekenen", + "Sign to QR code": "Teken op QR-code", + "Sign to SD card": "Teken op SD kaart", + "Sign?": "Ondertekenen?", + "Signature": "Handtekening", + "Signed Message": "Bericht ondertekend", + "Signed PSBT": "PSBT ondertekend", + "Signing..": "Ondertekenen..", + "Single-sig": "Enkele sleutel", + "Size:": "Grootte:", + "Some checks cannot be performed.": "Sommige controles kunnen niet worden uitgevoerd.", + "Spend (%d):": "Uitgaven (%d):", + "Spend:": "Uitgaven:", + "Stats for Nerds": "Statistieken voor nerds", + "Store on Flash": "Opslaan op apparaat", + "Store on SD Card": "Opslaan op SD kaart", + "Swipe to change mode": "Verander modus", + "TC Flash Hash": "TC Flash Hash", + "TC Flash Hash at Boot": "Hash Flash bij het opstarten", + "TOUCH or ENTER to capture": "TIK of ENTER voor opname", + "TX Pin": "TX pin", + "Tamper Check Code": "Sabotagecontrolecode", + "Tamper check code set successfully": "Sabotagecontrolecode succesvol ingesteld", + "Tamper check codes do not match": "Sabotagecontrolecodes komen niet overeen", + "Text": "Tekst", + "Theme": "Thema", + "Thermal": "Thermisch", + "To ensure data is unrecoverable use Wipe Device feature": "Gebruik de functie 'Apparaat wissen' om te zorgen dat de gegevens onherstelbaar zijn", + "Toggle Brightness": "Helderheid schakelen", + "Tools": "Hulpmiddelen", + "Touch Threshold": "Aanraak gevoeligheid", + "Touchscreen": "Aanraakscherm", + "Try more?": "Meer proberen?", + "Type BIP39 Passphrase": "Voer een BIP-39 wachtwoord in", + "Type Key": "Voer sleutel in", + "Unit": "Eenheid", + "Upgrade complete.": "Upgrade afgerond.", + "Use a black background surface.": "Gebruik een donker achergrond.", + "Use camera's entropy to create a new mnemonic": "Gebruik de camera als entropie voor het aanmaken van een nieuwe geheugensteun", + "Used:": "Gebruikt:", + "User's Data": "Gebruiker", + "Value %s out of range: [%s, %s]": "Waarde %s is buiten bereik: [%s, %s]", + "Value must be multiple of %s": "Waarde moet meerdere van %s zijn", + "Verifying..": "Bezig met verifiëren..", + "Version": "Versie", + "Via Camera": "Via camera", + "Via D20": "Via D20", + "Via D6": "Via D6", + "Via Manual Input": "Via handmatige invoer", + "Via Words": "Via woorden", + "Wait for the capture": "Wacht op opname", + "Wallet": "Portemonnee", + "Wallet Descriptor": "Descriptor", + "Wallet output descriptor": "Portemonnee descriptor", + "Wallet output descriptor loaded!": "Portemonnee descriptor geladen!", + "Wallet output descriptor not found.": "Portemonnee descriptor niet gevonden.", + "Warning:": "Waarschuwing:", + "Word %d": "Woord %d", + "Word Numbers": "Woord nummers", + "Words": "Woorden", + "Yes": "Yes", + "is a valid address!": "is geen geldig adres", + "was NOT FOUND in the first %d addresses": "werd NIET GEVONDEN in de eerste %d adressen" +} \ No newline at end of file diff --git a/i18n/translations/pt-BR.json b/i18n/translations/pt-BR.json index 37c656025..d4b8d3925 100644 --- a/i18n/translations/pt-BR.json +++ b/i18n/translations/pt-BR.json @@ -1 +1,322 @@ -{"% of the amount.": "% do valor.", "%d of %d multisig": "%d da %d multisig", "%d to %d": "%d a %d", "%s removed.": "%s removido.", "(%d total)": "(%d total)", "(Experimental)": "(Experimental)", "(watch-only)": "(Somente visualização)", "12 words": "12 palavras", "24 words": "24 palavras", "About": "Sobre", "Accept assumption?": "Aceitar suposições?", "Account": "Conta", "Account #0 would be assumed": "A conta #0 seria assumida", "Account Index": "Índice da Conta", "Add or change wallet passphrase?": "Adicionar ou alterar senha da carteira?", "Additional entropy from camera required for AES-CBC mode": "Entropia adicional da câmera necessária para o modo AES-CBC", "Address": "Endereço", "Align camera and backup plate properly.": "Alinhe a câmera e a placa de backup corretamente.", "Allow in settings first!": "Permita nas configurações primeiro!", "Anti-glare disabled": "Antirreflexo desativado", "Anti-glare enabled": "Antirreflexo ativado", "Appearance": "Aparência", "Are you sure?": "Tem certeza?", "BGR Colors": "Cores BGR", "BIP39 Mnemonic": "Mnemônico BIP39", "Back": "Voltar", "Back to Menu": "Voltar ao Menu", "Backup Mnemonic": "Backup de Mnemônico", "Bad signature": "Assinatura Inválida", "Base64 Password": "Senha Base64", "Baudrate": "Baudrate", "Binary Grid": "Grade binária", "Border Padding": "Borda", "Brightness": "Brilho", "Buttons": "Botões", "Buttons Debounce": "Debounce dos Botões", "Capture cancelled": "Captura cancelada", "Change": "Troco", "Change Addresses": "Endereços de Troco", "Change theme and reboot?": "Mudar o tema e reiniciar?", "Change:": "Troco:", "Changes will last until shutdown.": "Alterações só durarão até o desligamento.", "Check SD Card": "Verifique o cartão SD", "Check that address belongs to this wallet?": "Verificar se este endereço pertence a carteira?", "Checked %d addresses with no matches.": "Verificado %d endereços sem correspondências.", "Checking for SD card..": "Verificando o cartão SD..", "Confirm Tamper Check Code": "Confirmar Código", "Create QR Code": "Gerar Código QR", "Create QR code from text?": "Gerar código QR do texto?", "Created:": "Criado:", "Current Tamper Check Code": "Código Atual", "Custom QR Code": "Código QR Customizado", "Customize": "Customizar", "Customizing your wallet will generate a new Key.": "Personalizar sua carteira gerará uma nova chave.", "Cut Depth": "Profundidade de Corte", "Cut Method": "Método de Corte", "Decimal": "Decimal", "Decrypt?": "Descriptografar?", "Default Wallet": "Carteira Padrão", "Depth Per Pass": "Profundidade da Passagem", "Derive BIP85 entropy?": "Derivar entropia BIP85?", "Descriptor Addresses": "Endereços do Descritor", "Display": "Display", "Do not power off, it may take a while to complete.": "Não desligue, pode demorar um pouco para concluir.", "Done?": "Feito?", "Double mnemonic": "Duplo mnemônico", "Driver": "Driver", "Empty": "Vazio", "Enable Krux apps": "Ativar Krux app", "Encrypted": "Criptografado", "Encrypted QR Code": "Código QR Criptografado", "Encrypted mnemonic was not stored": "Mnemonic criptografado não foi armazenado", "Encrypted mnemonic was stored with ID:": "Mnemônico criptografado foi armazenado com ID:", "Encryption": "Criptografia", "Encryption Mode": "Modo de Criptografia", "Enter %d BIP-39 words.": "Insira %d palavras BIP-39.", "Enter a 6+ characters Tamper Check Code": "Insira um código de verificação com mais de 6 caracteres", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Digite o número de cada palavra do seu mnemônico BIP-39, de 1 a 2048.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Digite o número de cada palavra do seu mnemônico BIP-39 como um número em hexadecimal, de 1 a 800.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Digite o número de cada palavra do seu mnemônico BIP-39 como um número em octal, de 1 a 4000.", "Enter each word of your BIP-39 mnemonic.": "Digite cada palavra do seu mnemônico BIP-39.", "Erase User's Data": "Apagar Dados do Usuário", "Erasing user's data..": "Apagando os dados do usuário..", "Error:": "Erro:", "Esc": "Esc", "Execute a signed Krux app?": "Executar um Krux app assinado?", "Explore files?": "Explorar arquivos?", "Exporting to SD card..": "Exportando para o cartão SD..", "Extended Public Key": "Chave Pública Estendida", "Factory Settings": "Configurações de Fábrica", "Failed to decrypt": "Falhou em descriptografar", "Failed to load PSBT": "Falhou ao carregar PSBT", "Failed to load address": "Falhou ao carregar endereço", "Failed to load key": "Falha ao carregar a chave", "Failed to load message": "Falhou ao carregar mensagem", "Failed to load mnemonic": "Falhou ao carregar mnemônico", "Failed to load output descriptor": "Falha ao carregar o descritor de saída", "Failed to load passphrase": "Falha ao carregar a senha", "Failed to store mnemonic": "Falhou ao armazenar mnemônico", "Fee:": "Taxa:", "Feed Rate": "Taxa de Alimentação", "Filename": "Nome do arquivo", "Filename %s exists on SD card, overwrite?": "O nome do arquivo %s existe no cartão SD, substituir?", "Fill the flash with entropy from camera?": "Preencher a flash com entropia da câmera?", "Filling Flash": "Preenchendo a Flash", "Fingerprint unset in PSBT": "Impressão digital não definida no PSBT", "Firmware exceeds max size: %d": "Firmware excede o tamanho máximo: %d", "Flash Map": "Mapa da Flash", "Flash Tools": "Ferramentas da Flash", "Flash filled with camera entropy": "Flash preenchida com entropia da câmera", "Flipped X Coordinates": "Coordenadas X invertidas", "Flute Diameter": "Diâmetro da Fresa", "Free:": "Livre:", "From Storage": "Do Armazenamento", "Fully erase your SD card in another device to ensure data is unrecoverable": "Apague totalmente seu cartão SD em outro dispositivo para garantir que os dados sejam irrecuperáveis", "Generate Mnemonic": "Gerar Mnemônico", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Dê a este mnemônico um ID personalizado? Caso contrário, a impressão digital atual será usada", "Go": "Ir", "Good entropy": "Boa entropia", "Hardware": "Hardware", "Hex Public Key": "Chave pública hexadecimal", "Hexadecimal": "Hexadecimal", "Hide Mnemonics": "Ocultar Mnemônicos", "High fees!": "Taxas altas!", "ID already exists": "Id já existe", "Index": "Índice", "Index: %s": "Índice: %s", "Inputs (%d):": "Entradas (%d):", "Install?": "Instalar?", "Insufficient Entropy!": "Entropia insuficiente!", "Insufficient entropy": "Entropia insuficiente", "Invalid Tamper Check Code": "Código de verificação inválido", "Invalid address": "Endereço inválido", "Invalid bootloader": "Bootloader inválido", "Invalid mnemonic length": "Comprimento de mnemônico inválido", "Invalid public key": "Chave pública inválida", "Invalid wallet:": "Carteira inválida:", "Invert": "Invertido", "Inverted Colors": "Cores invertidas", "Key": "Chave", "Key was not provided": "A chave não foi fornecida", "Krux Printer Test QR": "Teste de impressão de QR krux", "LCD Type": "Tipo de LCD", "Language": "Língua", "Leave blank if you'd like Krux to pick a valid final word": "Deixe em branco se quiser que o Krux escolha uma palavra final válida", "Left": "Esquerda", "Length: %s": "Comprimento: %s", "Line Delay": "Atraso de Linha", "Line:": "Linha:", "Load Krux app": "Carregar Krux app", "Load Mnemonic": "Carregar Mnemônico", "Load Wallet": "Carregar Carteira", "Load a trusted wallet descriptor to view addresses?": "Carregar um descritor de carteira confiável para visualizar endereços?", "Load from SD card": "Carregar do cartão SD", "Load from SD card?": "Carregar do cartão SD?", "Load from camera": "Carregar da câmera", "Load one?": "Carregar um?", "Load?": "Carregar?", "Loading Camera..": "Carregando Câmera..", "Loading change addresses..": "Carregando endereços de troco..", "Loading printer..": "Carregando impressora..", "Loading receive addresses..": "Carregando endereços de recebimento..", "Loading..": "Carregando..", "Locale": "Idioma", "Location": "Local", "Maximum length exceeded (%s)": "Comprimento máximo excedido (%s)", "Message": "Mensagem", "Message:": "Mensagem:", "Missing signature file": "Arquivo de assinatura faltando", "Mnemonic": "Mnemônico", "Mnemonic ID": "ID do mnemônico", "Mnemonic and passphrase will be kept.": "Mnemônico e senha serão mantidos.", "Mnemonic was not encrypted": "Mnemônico não foi criptografado", "Modified:": "Modificado:", "Multisig": "Multisig", "Native Segwit - 84 would be assumed": "Segwit nativo - 84 seria assumido", "Network": "Rede", "New Mnemonic": "Novo Mnemônico", "New firmware detected.": "Novo firmware detectado.", "No": "Não", "No Passphrase": "Sem Senha", "Not enough rolls!": "Jogadas insuficientes!", "Numbers": "Números", "Octal": "Octal", "Other Formats": "Outros Formatos", "PBKDF2 Iter.": "Iter. PBKDF2", "Paint punched dots black so they can be detected.": "Pinte os pontos perfurados de preto para que possam ser detectados.", "Paper Width": "Largura do papel", "Part": "Parte", "Part Size": "Tamanho da peça", "Passphrase": "Senha", "Password Length": "Comprimento da Senha", "Path mismatch": "Incompatibilidade de caminho", "Pattern detected!": "Padrão detectado!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "Remover permanentemente todos os mnemônicos criptografados e configurações armazenados da memória flash?", "Persist": "Salvar", "Pixels deviation index:": "Índice de desvio de pixels:", "Plaintext QR": "QR em Texto", "Please load a wallet output descriptor": "Carregue um descritor da carteira", "Plunge Rate": "Taxa de Mergulho", "Poor entropy": "Entropia fraca", "Poor entropy detected!": "Baixa entropia detectada!", "Print Test QR": "Imprimir QR de teste", "Print Tiny Seed?": "Imprimir Tiny Seed?", "Print to QR": "Imprimir QR", "Print to QR?": "Imprimir QR?", "Print?": "Imprimir?", "Printer": "Impressora", "Printer Driver not set!": "Driver de impressora não está definido!", "Printing..": "Imprimindo..", "Proceed anyway?": "Continuar mesmo assim?", "Proceed?": "Seguir?", "Processing..": "Processando..", "QR Code": "Código QR", "RX Pin": "Pino RX", "Reboot": "Reiniciar", "Receive": "Recebimento", "Receive Addresses": "Endereços de Recebimento", "Region:": "Região:", "Remove %s?": "Excluir %s?", "Remove Mnemonic": "Excluir Mnemônico", "Remove firmware files from SD Card?": "Remover arquivos de firmware do cartão SD?", "Res. - Format": "Res. - Formato", "Restore factory settings and reboot?": "Restaurar as configurações de fábrica e reiniciar?", "Return to QR Viewer": "Retornar ao Visualizador de QR", "Review scanned data, edit if necessary": "Revise os dados, edite se necessário", "Right": "Direita", "Roll dice at least %d times to generate a mnemonic.": "Role o dado pelo menos %d vezes para gerar um mnemônico.", "Rolls distribution:": "Distribuição de jogadas:", "Rolls:": "Jogadas:", "SD card": "Cartão SD", "SD card not detected.": "Cartão SD não detectado.", "SHA256 of rolls:": "SHA256 de jogadas:", "SHA256 of snapshot:": "Sha256 da imagem:", "Save QR Image to SD Card": "Salvar imagem do QR no cartão SD", "Save to SD card": "Salvar no cartão SD", "Save to SD card?": "Salvar no cartão SD?", "Saved to SD card": "Salvo no cartão SD", "Scale": "Escala", "Scan Address": "Escanear Endereço", "Scan BIP39 Passphrase": "Escanear a senha BIP39", "Scan Key QR Code": "Escanear Código QR da Chave", "Scanning words 1-12 again": "Escaneando as palavras 1-12 novamente", "Scanning words 13-24": "Escaneando as palavras 13-24", "Screensaver Time": "Tempo para protetor de tela", "Script Type": "Tipo de Script", "Security": "Segurança", "Self-transfer or Change (%d):": "Autotransferência ou Troco (%d):", "Self-transfer:": "Autotransferência:", "Set a tamper check code first": "Defina um código de verificação primeiro", "Settings": "Configurações", "Settings stored internally on flash.": "Configurações armazenadas internamente no flash.", "Settings stored on SD card.": "Configurações armazenadas no cartão SD.", "Shannon's Entropy:": "Entropia de Shannon:", "Shutdown": "Desligar", "Shutdown Time": "Tempo de desligamento", "Shutting down..": "Desligando..", "Sign": "Assinar", "Sign to QR code": "Assinar para código QR", "Sign to SD card": "Assinar para cartão SD", "Sign?": "Assinar?", "Signature": "Assinatura", "Signed Message": "Mensagem Assinada", "Signed PSBT": "PSBT Assinada", "Signing..": "Assinando..", "Single-sig": "Single-sig", "Size:": "Total:", "Some checks cannot be performed.": "Algumas verificações não podem ser realizadas.", "Spend (%d):": "Gastos (%d):", "Spend:": "Gasto:", "Stats for Nerds": "Estatísticas para Nerds", "Store on Flash": "Armazene na Flash", "Store on SD Card": "Armazene no Cartão SD", "Swipe to change mode": "Deslize para mudar de modo", "TC Flash Hash": "TC Flash Hash", "TC Flash Hash at Boot": "TC Hash Flash na Inicialização", "TOUCH or ENTER to capture": "TOQUE ou ENTER para capturar", "TX Pin": "Pino TX", "Tamper Check Code": "Código de Verificação", "Tamper check code set successfully": "Código de verificação definido com sucesso", "Tamper check codes do not match": "Os códigos de verificação não correspondem", "Text": "Texto", "Theme": "Tema", "Thermal": "Térmica", "To ensure data is unrecoverable use Wipe Device feature": "Para garantir que os dados sejam irrecuperáveis, use o recurso Limpar Dispositivo", "Toggle Brightness": "Alternar brilho", "Tools": "Ferramentas", "Touch Threshold": "Limiar de Toque", "Touchscreen": "Touchscreen", "Try more?": "Tentar mais?", "Type BIP39 Passphrase": "Digitar a senha BIP39", "Type Key": "Digite a Chave", "Unit": "Unidade", "Upgrade complete.": "Atualização completa.", "Use a black background surface.": "Use uma superfície de fundo preta.", "Use camera's entropy to create a new mnemonic": "Use a entropia da câmera para criar um novo mnemônico", "Used:": "Usado:", "User's Data": "Usuário", "Value %s out of range: [%s, %s]": "Valor %s fora do alcance: [ %s, %s]", "Value must be multiple of %s": "O valor deve ser múltiplo de %s", "Verifying..": "Verificando..", "Version": "Versão", "Via Camera": "Pela Câmera", "Via D20": "Via D20", "Via D6": "Via D6", "Via Manual Input": "Por entrada manual", "Via Words": "Via Palavras", "Wait for the capture": "Aguarde a captura", "Wallet": "Carteira", "Wallet Descriptor": "Descritor de Carteira", "Wallet output descriptor": "Descritor da carteira", "Wallet output descriptor loaded!": "Descritor de saída da carteira carregado!", "Wallet output descriptor not found.": "O descritor de saída da carteira não foi encontrado.", "Warning:": "Aviso:", "Word %d": "Palavra %d", "Word Numbers": "Números das Palavras", "Words": "Palavras", "Yes": "Sim", "is a valid address!": "é um endereço válido!", "was NOT FOUND in the first %d addresses": "NÃO FOI ENCONTRADO nos primeiros %d endereços"} \ No newline at end of file +{ + "% of the amount.": "% do valor.", + "%d of %d multisig": "%d da %d multisig", + "%d to %d": "%d a %d", + "%s removed.": "%s removido.", + "(%d total)": "(%d total)", + "(Experimental)": "(Experimental)", + "(watch-only)": "(Somente visualização)", + "12 words": "12 palavras", + "24 words": "24 palavras", + "About": "Sobre", + "Accept assumption?": "Aceitar suposições?", + "Account": "Conta", + "Account #0 would be assumed": "A conta #0 seria assumida", + "Account Index": "Índice da Conta", + "Add or change wallet passphrase?": "Adicionar ou alterar senha da carteira?", + "Additional entropy from camera required for AES-CBC mode": "Entropia adicional da câmera necessária para o modo AES-CBC", + "Address": "Endereço", + "Align camera and backup plate properly.": "Alinhe a câmera e a placa de backup corretamente.", + "Allow in settings first!": "Permita nas configurações primeiro!", + "Anti-glare disabled": "Antirreflexo desativado", + "Anti-glare enabled": "Antirreflexo ativado", + "Appearance": "Aparência", + "Are you sure?": "Tem certeza?", + "BGR Colors": "Cores BGR", + "BIP39 Mnemonic": "Mnemônico BIP39", + "Back": "Voltar", + "Back to Menu": "Voltar ao Menu", + "Backup Mnemonic": "Backup de Mnemônico", + "Bad signature": "Assinatura Inválida", + "Base64 Password": "Senha Base64", + "Baudrate": "Baudrate", + "Binary Grid": "Grade binária", + "Border Padding": "Borda", + "Brightness": "Brilho", + "Buttons": "Botões", + "Buttons Debounce": "Debounce dos Botões", + "Capture cancelled": "Captura cancelada", + "Change": "Troco", + "Change Addresses": "Endereços de Troco", + "Change theme and reboot?": "Mudar o tema e reiniciar?", + "Change:": "Troco:", + "Changes will last until shutdown.": "Alterações só durarão até o desligamento.", + "Check SD Card": "Verifique o cartão SD", + "Check that address belongs to this wallet?": "Verificar se este endereço pertence a carteira?", + "Checked %d addresses with no matches.": "Verificado %d endereços sem correspondências.", + "Checking for SD card..": "Verificando o cartão SD..", + "Confirm Tamper Check Code": "Confirmar Código", + "Create QR Code": "Gerar Código QR", + "Create QR code from text?": "Gerar código QR do texto?", + "Created:": "Criado:", + "Current Tamper Check Code": "Código Atual", + "Custom QR Code": "Código QR Customizado", + "Customize": "Customizar", + "Customizing your wallet will generate a new Key.": "Personalizar sua carteira gerará uma nova chave.", + "Cut Depth": "Profundidade de Corte", + "Cut Method": "Método de Corte", + "Decimal": "Decimal", + "Decrypt?": "Descriptografar?", + "Default Wallet": "Carteira Padrão", + "Depth Per Pass": "Profundidade da Passagem", + "Derive BIP85 entropy?": "Derivar entropia BIP85?", + "Descriptor Addresses": "Endereços do Descritor", + "Display": "Display", + "Do not power off, it may take a while to complete.": "Não desligue, pode demorar um pouco para concluir.", + "Done?": "Feito?", + "Double mnemonic": "Duplo mnemônico", + "Driver": "Driver", + "Empty": "Vazio", + "Enable Krux apps": "Ativar Krux app", + "Encrypted": "Criptografado", + "Encrypted QR Code": "Código QR Criptografado", + "Encrypted mnemonic was not stored": "Mnemonic criptografado não foi armazenado", + "Encrypted mnemonic was stored with ID:": "Mnemônico criptografado foi armazenado com ID:", + "Encryption": "Criptografia", + "Encryption Mode": "Modo de Criptografia", + "Enter %d BIP-39 words.": "Insira %d palavras BIP-39.", + "Enter a 6+ characters Tamper Check Code": "Insira um código de verificação com mais de 6 caracteres", + "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Digite o número de cada palavra do seu mnemônico BIP-39, de 1 a 2048.", + "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Digite o número de cada palavra do seu mnemônico BIP-39 como um número em hexadecimal, de 1 a 800.", + "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Digite o número de cada palavra do seu mnemônico BIP-39 como um número em octal, de 1 a 4000.", + "Enter each word of your BIP-39 mnemonic.": "Digite cada palavra do seu mnemônico BIP-39.", + "Erase User's Data": "Apagar Dados do Usuário", + "Erasing user's data..": "Apagando os dados do usuário..", + "Error:": "Erro:", + "Esc": "Esc", + "Execute a signed Krux app?": "Executar um Krux app assinado?", + "Explore files?": "Explorar arquivos?", + "Exporting to SD card..": "Exportando para o cartão SD..", + "Extended Public Key": "Chave Pública Estendida", + "Factory Settings": "Configurações de Fábrica", + "Failed to decrypt": "Falhou em descriptografar", + "Failed to load PSBT": "Falhou ao carregar PSBT", + "Failed to load address": "Falhou ao carregar endereço", + "Failed to load key": "Falha ao carregar a chave", + "Failed to load message": "Falhou ao carregar mensagem", + "Failed to load mnemonic": "Falhou ao carregar mnemônico", + "Failed to load output descriptor": "Falha ao carregar o descritor de saída", + "Failed to load passphrase": "Falha ao carregar a senha", + "Failed to store mnemonic": "Falhou ao armazenar mnemônico", + "Fee:": "Taxa:", + "Feed Rate": "Taxa de Alimentação", + "Filename": "Nome do arquivo", + "Filename %s exists on SD card, overwrite?": "O nome do arquivo %s existe no cartão SD, substituir?", + "Fill the flash with entropy from camera?": "Preencher a flash com entropia da câmera?", + "Filling Flash": "Preenchendo a Flash", + "Fingerprint unset in PSBT": "Impressão digital não definida no PSBT", + "Firmware exceeds max size: %d": "Firmware excede o tamanho máximo: %d", + "Flash Map": "Mapa da Flash", + "Flash Tools": "Ferramentas da Flash", + "Flash filled with camera entropy": "Flash preenchida com entropia da câmera", + "Flipped X Coordinates": "Coordenadas X invertidas", + "Flute Diameter": "Diâmetro da Fresa", + "Free:": "Livre:", + "From Storage": "Do Armazenamento", + "Fully erase your SD card in another device to ensure data is unrecoverable": "Apague totalmente seu cartão SD em outro dispositivo para garantir que os dados sejam irrecuperáveis", + "Generate Mnemonic": "Gerar Mnemônico", + "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Dê a este mnemônico um ID personalizado? Caso contrário, a impressão digital atual será usada", + "Go": "Ir", + "Good entropy": "Boa entropia", + "Hardware": "Hardware", + "Hex Public Key": "Chave pública hexadecimal", + "Hexadecimal": "Hexadecimal", + "Hide Mnemonics": "Ocultar Mnemônicos", + "High fees!": "Taxas altas!", + "ID already exists": "Id já existe", + "Index": "Índice", + "Index: %s": "Índice: %s", + "Inputs (%d):": "Entradas (%d):", + "Install?": "Instalar?", + "Insufficient Entropy!": "Entropia insuficiente!", + "Insufficient entropy": "Entropia insuficiente", + "Invalid Tamper Check Code": "Código de verificação inválido", + "Invalid address": "Endereço inválido", + "Invalid bootloader": "Bootloader inválido", + "Invalid mnemonic length": "Comprimento de mnemônico inválido", + "Invalid public key": "Chave pública inválida", + "Invalid wallet:": "Carteira inválida:", + "Invert": "Invertido", + "Inverted Colors": "Cores invertidas", + "Key": "Chave", + "Key was not provided": "A chave não foi fornecida", + "Krux Printer Test QR": "Teste de impressão de QR krux", + "LCD Type": "Tipo de LCD", + "Language": "Língua", + "Leave blank if you'd like Krux to pick a valid final word": "Deixe em branco se quiser que o Krux escolha uma palavra final válida", + "Left": "Esquerda", + "Length: %s": "Comprimento: %s", + "Line Delay": "Atraso de Linha", + "Line:": "Linha:", + "Load Krux app": "Carregar Krux app", + "Load Mnemonic": "Carregar Mnemônico", + "Load Wallet": "Carregar Carteira", + "Load a trusted wallet descriptor to view addresses?": "Carregar um descritor de carteira confiável para visualizar endereços?", + "Load from SD card": "Carregar do cartão SD", + "Load from SD card?": "Carregar do cartão SD?", + "Load from camera": "Carregar da câmera", + "Load one?": "Carregar um?", + "Load?": "Carregar?", + "Loading Camera..": "Carregando Câmera..", + "Loading change addresses..": "Carregando endereços de troco..", + "Loading printer..": "Carregando impressora..", + "Loading receive addresses..": "Carregando endereços de recebimento..", + "Loading..": "Carregando..", + "Locale": "Idioma", + "Location": "Local", + "Maximum length exceeded (%s)": "Comprimento máximo excedido (%s)", + "Message": "Mensagem", + "Message:": "Mensagem:", + "Missing signature file": "Arquivo de assinatura faltando", + "Mnemonic": "Mnemônico", + "Mnemonic ID": "ID do mnemônico", + "Mnemonic and passphrase will be kept.": "Mnemônico e senha serão mantidos.", + "Mnemonic was not encrypted": "Mnemônico não foi criptografado", + "Modified:": "Modificado:", + "Multisig": "Multisig", + "Native Segwit - 84 would be assumed": "Segwit nativo - 84 seria assumido", + "Network": "Rede", + "New Mnemonic": "Novo Mnemônico", + "New firmware detected.": "Novo firmware detectado.", + "No": "Não", + "No Passphrase": "Sem Senha", + "Not enough rolls!": "Jogadas insuficientes!", + "Numbers": "Números", + "Octal": "Octal", + "Other Formats": "Outros Formatos", + "PBKDF2 Iter.": "Iter. PBKDF2", + "Paint punched dots black so they can be detected.": "Pinte os pontos perfurados de preto para que possam ser detectados.", + "Paper Width": "Largura do papel", + "Part": "Parte", + "Part Size": "Tamanho da peça", + "Passphrase": "Senha", + "Password Length": "Comprimento da Senha", + "Path mismatch": "Incompatibilidade de caminho", + "Pattern detected!": "Padrão detectado!", + "Permanently remove all stored encrypted mnemonics and settings from flash?": "Remover permanentemente todos os mnemônicos criptografados e configurações armazenados da memória flash?", + "Persist": "Salvar", + "Pixels deviation index:": "Índice de desvio de pixels:", + "Plaintext QR": "QR em Texto", + "Please load a wallet output descriptor": "Carregue um descritor da carteira", + "Plunge Rate": "Taxa de Mergulho", + "Poor entropy": "Entropia fraca", + "Poor entropy detected!": "Baixa entropia detectada!", + "Print Test QR": "Imprimir QR de teste", + "Print Tiny Seed?": "Imprimir Tiny Seed?", + "Print to QR": "Imprimir QR", + "Print to QR?": "Imprimir QR?", + "Print?": "Imprimir?", + "Printer": "Impressora", + "Printer Driver not set!": "Driver de impressora não está definido!", + "Printing..": "Imprimindo..", + "Proceed anyway?": "Continuar mesmo assim?", + "Proceed?": "Seguir?", + "Processing..": "Processando..", + "QR Code": "Código QR", + "RX Pin": "Pino RX", + "Reboot": "Reiniciar", + "Receive": "Recebimento", + "Receive Addresses": "Endereços de Recebimento", + "Region:": "Região:", + "Remove %s?": "Excluir %s?", + "Remove Mnemonic": "Excluir Mnemônico", + "Remove firmware files from SD Card?": "Remover arquivos de firmware do cartão SD?", + "Res. - Format": "Res. - Formato", + "Restore factory settings and reboot?": "Restaurar as configurações de fábrica e reiniciar?", + "Return to QR Viewer": "Retornar ao Visualizador de QR", + "Review scanned data, edit if necessary": "Revise os dados, edite se necessário", + "Right": "Direita", + "Roll dice at least %d times to generate a mnemonic.": "Role o dado pelo menos %d vezes para gerar um mnemônico.", + "Rolls distribution:": "Distribuição de jogadas:", + "Rolls:": "Jogadas:", + "SD card": "Cartão SD", + "SD card not detected.": "Cartão SD não detectado.", + "SHA256 of rolls:": "SHA256 de jogadas:", + "SHA256 of snapshot:": "Sha256 da imagem:", + "Save QR Image to SD Card": "Salvar imagem do QR no cartão SD", + "Save to SD card": "Salvar no cartão SD", + "Save to SD card?": "Salvar no cartão SD?", + "Saved to SD card": "Salvo no cartão SD", + "Scale": "Escala", + "Scan Address": "Escanear Endereço", + "Scan BIP39 Passphrase": "Escanear a senha BIP39", + "Scan Key QR Code": "Escanear Código QR da Chave", + "Scanning words 1-12 again": "Escaneando as palavras 1-12 novamente", + "Scanning words 13-24": "Escaneando as palavras 13-24", + "Screensaver Time": "Tempo para protetor de tela", + "Script Type": "Tipo de Script", + "Security": "Segurança", + "Self-transfer or Change (%d):": "Autotransferência ou Troco (%d):", + "Self-transfer:": "Autotransferência:", + "Set a tamper check code first": "Defina um código de verificação primeiro", + "Settings": "Configurações", + "Settings stored internally on flash.": "Configurações armazenadas internamente no flash.", + "Settings stored on SD card.": "Configurações armazenadas no cartão SD.", + "Shannon's Entropy:": "Entropia de Shannon:", + "Shutdown": "Desligar", + "Shutdown Time": "Tempo de desligamento", + "Shutting down..": "Desligando..", + "Sign": "Assinar", + "Sign to QR code": "Assinar para código QR", + "Sign to SD card": "Assinar para cartão SD", + "Sign?": "Assinar?", + "Signature": "Assinatura", + "Signed Message": "Mensagem Assinada", + "Signed PSBT": "PSBT Assinada", + "Signing..": "Assinando..", + "Single-sig": "Single-sig", + "Size:": "Total:", + "Some checks cannot be performed.": "Algumas verificações não podem ser realizadas.", + "Spend (%d):": "Gastos (%d):", + "Spend:": "Gasto:", + "Stats for Nerds": "Estatísticas para Nerds", + "Store on Flash": "Armazene na Flash", + "Store on SD Card": "Armazene no Cartão SD", + "Swipe to change mode": "Deslize para mudar de modo", + "TC Flash Hash": "TC Flash Hash", + "TC Flash Hash at Boot": "TC Hash Flash na Inicialização", + "TOUCH or ENTER to capture": "TOQUE ou ENTER para capturar", + "TX Pin": "Pino TX", + "Tamper Check Code": "Código de Verificação", + "Tamper check code set successfully": "Código de verificação definido com sucesso", + "Tamper check codes do not match": "Os códigos de verificação não correspondem", + "Text": "Texto", + "Theme": "Tema", + "Thermal": "Térmica", + "To ensure data is unrecoverable use Wipe Device feature": "Para garantir que os dados sejam irrecuperáveis, use o recurso Limpar Dispositivo", + "Toggle Brightness": "Alternar brilho", + "Tools": "Ferramentas", + "Touch Threshold": "Limiar de Toque", + "Touchscreen": "Touchscreen", + "Try more?": "Tentar mais?", + "Type BIP39 Passphrase": "Digitar a senha BIP39", + "Type Key": "Digite a Chave", + "Unit": "Unidade", + "Upgrade complete.": "Atualização completa.", + "Use a black background surface.": "Use uma superfície de fundo preta.", + "Use camera's entropy to create a new mnemonic": "Use a entropia da câmera para criar um novo mnemônico", + "Used:": "Usado:", + "User's Data": "Usuário", + "Value %s out of range: [%s, %s]": "Valor %s fora do alcance: [ %s, %s]", + "Value must be multiple of %s": "O valor deve ser múltiplo de %s", + "Verifying..": "Verificando..", + "Version": "Versão", + "Via Camera": "Pela Câmera", + "Via D20": "Via D20", + "Via D6": "Via D6", + "Via Manual Input": "Por entrada manual", + "Via Words": "Via Palavras", + "Wait for the capture": "Aguarde a captura", + "Wallet": "Carteira", + "Wallet Descriptor": "Descritor de Carteira", + "Wallet output descriptor": "Descritor da carteira", + "Wallet output descriptor loaded!": "Descritor de saída da carteira carregado!", + "Wallet output descriptor not found.": "O descritor de saída da carteira não foi encontrado.", + "Warning:": "Aviso:", + "Word %d": "Palavra %d", + "Word Numbers": "Números das Palavras", + "Words": "Palavras", + "Yes": "Sim", + "is a valid address!": "é um endereço válido!", + "was NOT FOUND in the first %d addresses": "NÃO FOI ENCONTRADO nos primeiros %d endereços" +} \ No newline at end of file diff --git a/i18n/translations/ru-RU.json b/i18n/translations/ru-RU.json index 30377fac5..de1c994e3 100644 --- a/i18n/translations/ru-RU.json +++ b/i18n/translations/ru-RU.json @@ -1 +1,322 @@ -{"% of the amount.": "% от суммы.", "%d of %d multisig": "%d из %d мультиподпись", "%d to %d": "%d к %d", "%s removed.": "%s удален.", "(%d total)": "(%d всего)", "(Experimental)": "(Эксперементальный)", "(watch-only)": "(Только часы)", "12 words": "12 слов", "24 words": "24 слова", "About": "О Программе", "Accept assumption?": "Принять предположение?", "Account": "Учетная запись", "Account #0 would be assumed": "Будет принят счет №0", "Account Index": "Индекс счета", "Add or change wallet passphrase?": "Добавить или изменить пароль кошелька?", "Additional entropy from camera required for AES-CBC mode": "Для режима AES-CBC требуется дополнительная энтропия от камеры", "Address": "Адрес", "Align camera and backup plate properly.": "Правильно совместите камеру и резервную пластину.", "Allow in settings first!": "Сначала разрешите в настройках!", "Anti-glare disabled": "Антиблик отключен", "Anti-glare enabled": "Антиблик включен", "Appearance": "Внешний Вид", "Are you sure?": "Вы уверены?", "BGR Colors": "Цвета BGR", "BIP39 Mnemonic": "BIP39 Мнемоника", "Back": "Назад", "Back to Menu": "Назад в Mеню", "Backup Mnemonic": "Резервная мнемоника", "Bad signature": "Плохая подпись", "Base64 Password": "Пароль Base64", "Baudrate": "Скорость Передачи Данных", "Binary Grid": "Двоичная сетка", "Border Padding": "Заполнение Границ", "Brightness": "Яркость", "Buttons": "Кнопки", "Buttons Debounce": "Антидребезг кнопок", "Capture cancelled": "Захват отменен", "Change": "Сдача", "Change Addresses": "Адрес Сдачи", "Change theme and reboot?": "Сменить тему и перезагрузить?", "Change:": "Сдача:", "Changes will last until shutdown.": "Изменения будут храниться до выключения.", "Check SD Card": "Проверить SD Карту", "Check that address belongs to this wallet?": "Проверить, что адрес принадлежит этому кошельку?", "Checked %d addresses with no matches.": "Проверено %d адресов без совпадений.", "Checking for SD card..": "Проверка SD карты..", "Confirm Tamper Check Code": "Подтвердите код проверки вскрытия", "Create QR Code": "Создать QR Код", "Create QR code from text?": "Создать QR код из текста?", "Created:": "Создано:", "Current Tamper Check Code": "Текущий код проверки вскрытия", "Custom QR Code": "Пользовательский QR Код", "Customize": "Настроить", "Customizing your wallet will generate a new Key.": "Настройка вашего кошелька создаст новый ключ.", "Cut Depth": "Глубина Резки", "Cut Method": "Метод Резки", "Decimal": "Десятичный", "Decrypt?": "Расшифровать?", "Default Wallet": "Кошелек по умолчанию", "Depth Per Pass": "Глубина за Проход", "Derive BIP85 entropy?": "Вывести энтропию BIP85?", "Descriptor Addresses": "Адреса дескрипторов", "Display": "Дисплеи", "Do not power off, it may take a while to complete.": "Не выключайте питание, это может занять некоторое время.", "Done?": "Готово?", "Double mnemonic": "Двойная мнемоника", "Driver": "Драйвер", "Empty": "Пустой", "Enable Krux apps": "Включить приложения Krux", "Encrypted": "Зашифровано", "Encrypted QR Code": "Зашифрованный QR Код", "Encrypted mnemonic was not stored": "Зашифрованная мнемоника не была сохранена", "Encrypted mnemonic was stored with ID:": "Зашифрованная мнемоника была сохранена с ID:", "Encryption": "Шифрование", "Encryption Mode": "Метод Шифрования", "Enter %d BIP-39 words.": "Введите %d слов BIP-39.", "Enter a 6+ characters Tamper Check Code": "Введите более 6 символов кода проверки вскрытия", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Введите каждое слово вашей мнемоники BIP-39 в виде числа от 1 до 2048.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Введите каждое слово вашей мнемоники BIP-39 в виде шестнадцатеричного числа от 1 до 800.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Введите каждое слово вашей мнемоники BIP-39 в виде восьмеричного числа от 1 до 4000.", "Enter each word of your BIP-39 mnemonic.": "Введите каждое слово вашей BIP-39 мнемоники.", "Erase User's Data": "Удалить данные пользователя", "Erasing user's data..": "Удаление данных пользователя..", "Error:": "Ошибка:", "Esc": "Выйти", "Execute a signed Krux app?": "Выполнить подписанное приложение Krux?", "Explore files?": "Исследовать файлы?", "Exporting to SD card..": "Экспортирование на SD карту..", "Extended Public Key": "Расширенный Публичный Ключ", "Factory Settings": "Заводские Настройки", "Failed to decrypt": "Не удалось расшифровать", "Failed to load PSBT": "Не удалось загрузить PSBT", "Failed to load address": "Не удалось загрузить адрес", "Failed to load key": "Не удалось загрузить ключ", "Failed to load message": "Не удалось загрузить сообщение", "Failed to load mnemonic": "Не удалось загрузить мнемонику", "Failed to load output descriptor": "Не удалось загрузить выходной дескриптор", "Failed to load passphrase": "Не удалось загрузить фразу-пароль", "Failed to store mnemonic": "Не удалось сохранить мнемонику", "Fee:": "Комиссия:", "Feed Rate": "Скорость Подачи", "Filename": "Имя файла", "Filename %s exists on SD card, overwrite?": "Файл %s существует на SD карте, перезаписать?", "Fill the flash with entropy from camera?": "Заполнить флэш энтропией с камеры?", "Filling Flash": "Заполнение флэша", "Fingerprint unset in PSBT": "Отпечаток пальца не установлен в PSBT", "Firmware exceeds max size: %d": "Прошивка превышает максимальный размер: %d", "Flash Map": "Карта флэша", "Flash Tools": "Flash Tools", "Flash filled with camera entropy": "Флэш заполнен энтропией камеры", "Flipped X Coordinates": "Перевернутые координаты X", "Flute Diameter": "Диаметр Флюта", "Free:": "Свободно:", "From Storage": "Из Памяти", "Fully erase your SD card in another device to ensure data is unrecoverable": "Полностью стерите SD-карту в другом устройстве, чтобы убедиться, что данные не восстановимы", "Generate Mnemonic": "Создать Мнемонику", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Назначить этой мнемоники кастомный ID? В ином случае будет использован текущий фингерпринт", "Go": "OK", "Good entropy": "Хорошая энтропия", "Hardware": "Аппаратное Обеспечение", "Hex Public Key": "Шестнадцатеричный Публичный Ключ", "Hexadecimal": "Шестнадцатеричный", "Hide Mnemonics": "Скрыть мнемоники", "High fees!": "Высокие комиссии!", "ID already exists": "ID уже существует", "Index": "Индекс", "Index: %s": "Индекс: %s", "Inputs (%d):": "Входы (%d):", "Install?": "Установить?", "Insufficient Entropy!": "Недостаточная Энтропия!", "Insufficient entropy": "Недостаточная энтропия", "Invalid Tamper Check Code": "Недействительный код проверки вскрытия", "Invalid address": "Неверный адрес", "Invalid bootloader": "Неверный загрузчик", "Invalid mnemonic length": "Неверная длина мнемоники", "Invalid public key": "Неверный публичный ключ", "Invalid wallet:": "Неверный кошелек:", "Invert": "Инвертировать", "Inverted Colors": "Перевернутые цвета", "Key": "Ключ", "Key was not provided": "Ключ не предоставлен", "Krux Printer Test QR": "Тестовый QR Принтера Krux", "LCD Type": "Тип ЖК-дисплея", "Language": "Язык", "Leave blank if you'd like Krux to pick a valid final word": "Оставьте пустым, если хотите, чтобы Krux выбрал подходящее последнее слово", "Left": "Влево", "Length: %s": "Длина: %s", "Line Delay": "Задержка Линии", "Line:": "Линия:", "Load Krux app": "Загрузить приложение Krux", "Load Mnemonic": "Загрузить Мнемонику", "Load Wallet": "Загрузить кошелек", "Load a trusted wallet descriptor to view addresses?": "Загрузить дескриптор доверенного кошелька для просмотра адресов?", "Load from SD card": "Загрузка с SD-карты", "Load from SD card?": "Загрузить с SD карты?", "Load from camera": "Из камеры", "Load one?": "Загрузить один?", "Load?": "Загрузить?", "Loading Camera..": "Загрузка Камеры..", "Loading change addresses..": "Загрузка адресов изменения..", "Loading printer..": "Загрузка принтера..", "Loading receive addresses..": "Загрузка адресов получения..", "Loading..": "Загрузка..", "Locale": "Локаль", "Location": "Расположение", "Maximum length exceeded (%s)": "Максимальная длина превышена (%s)", "Message": "Сообщение", "Message:": "Сообщение:", "Missing signature file": "Отсутствует файл подписи", "Mnemonic": "Мнемоника", "Mnemonic ID": "ID Мнемоники", "Mnemonic and passphrase will be kept.": "Мнемоника и парольная фраза будут сохранены.", "Mnemonic was not encrypted": "Мнемоника не была зашифрована", "Modified:": "Изменено:", "Multisig": "Мультиподпись", "Native Segwit - 84 would be assumed": "Native Segwit - 84 будет принято", "Network": "Сеть", "New Mnemonic": "Новая Мнемоника", "New firmware detected.": "Обнаружена новая прошивка.", "No": "Нет", "No Passphrase": "Нет Фраза-пароль", "Not enough rolls!": "Недостаточно бросков!", "Numbers": "Числа", "Octal": "Восьмеричный", "Other Formats": "Другие форматы", "PBKDF2 Iter.": "PBKDF2 Итерации", "Paint punched dots black so they can be detected.": "Закрасьте перфорированные точки черным цветом, чтобы их можно было обнаружить.", "Paper Width": "Ширина Бумаги", "Part": "Часть", "Part Size": "Размер Части", "Passphrase": "Фраза-пароль", "Password Length": "Длина пароля", "Path mismatch": "Несоответствие пути", "Pattern detected!": "Образец обнаружен!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "Окончательно удалить все сохраненные зашифрованные мнемоники и настройки из флеш-памяти?", "Persist": "Постоянная Память", "Pixels deviation index:": "Индекс отклонения пикселей:", "Plaintext QR": "QR Открытым Текстом", "Please load a wallet output descriptor": "Пожалуйста загрузите выходной дескриптор кошелька", "Plunge Rate": "Скорость Погружения", "Poor entropy": "Плохая энтропия", "Poor entropy detected!": "Обнаружена плохая энтропия!", "Print Test QR": "Напечатать Тестовый QR", "Print Tiny Seed?": "Распечатать Tiny Seed?", "Print to QR": "Печать в QR", "Print to QR?": "Напечатать в виде QR?", "Print?": "Печатать?", "Printer": "Принтер", "Printer Driver not set!": "Драйвер Принтера не установлен!", "Printing..": "Идет печать..", "Proceed anyway?": "Все равно продолжить?", "Proceed?": "Продолжить?", "Processing..": "Обработка..", "QR Code": "QR Код", "RX Pin": "RX Пин", "Reboot": "Перезагрузить", "Receive": "Получить", "Receive Addresses": "Адрес Получения", "Region:": "Регион:", "Remove %s?": "Удалить %s?", "Remove Mnemonic": "Удалить Мнемонику", "Remove firmware files from SD Card?": "Удалить файлы прошивки с SD-карты?", "Res. - Format": "Разреш. - Формат", "Restore factory settings and reboot?": "Восстановить заводские настройки и перезагрузить?", "Return to QR Viewer": "Вернуться к QR-просмотрщику", "Review scanned data, edit if necessary": "Просмотрите отсканированные данные, отредактируйте при необходимости", "Right": "Вправо", "Roll dice at least %d times to generate a mnemonic.": "Бросьте кубик не менее %d раз, чтобы сгенерировать мнемонику.", "Rolls distribution:": "Распределение бросков:", "Rolls:": "Броски:", "SD card": "SD карта", "SD card not detected.": "SD карта не обнаружена.", "SHA256 of rolls:": "SHA256 бросков:", "SHA256 of snapshot:": "SHA256 снэпшота:", "Save QR Image to SD Card": "Сохранить QR-изображение на SD-карту", "Save to SD card": "Сохранить на SD-карту", "Save to SD card?": "Сохранить на SD карту?", "Saved to SD card": "Сохранено на SD карту", "Scale": "Шкала", "Scan Address": "Отсканировать Адрес", "Scan BIP39 Passphrase": "Отсканировать BIP39 фразу-пароль", "Scan Key QR Code": "Отсканировать Ключ QR код", "Scanning words 1-12 again": "Сканирование слов 1-12 снова", "Scanning words 13-24": "Сканирование слов 13-24", "Screensaver Time": "Время Экранной Заставки", "Script Type": "Тип скрипта", "Security": "Охрана", "Self-transfer or Change (%d):": "Трансфер самому себе или Сдача (%d):", "Self-transfer:": "Перевод самому себе:", "Set a tamper check code first": "Сначала установите код проверки вскрытия", "Settings": "Настройки", "Settings stored internally on flash.": "Настройки хранятся во флэш-памяти.", "Settings stored on SD card.": "Настройки сохранены на SD-карте.", "Shannon's Entropy:": "Энтропия Шеннона:", "Shutdown": "Выключить", "Shutdown Time": "Время выключения", "Shutting down..": "Выключение..", "Sign": "Подписать", "Sign to QR code": "Подписать QR-код", "Sign to SD card": "Подписать на SD-карте", "Sign?": "Подписать?", "Signature": "Подпись", "Signed Message": "Подписанное Сообщение", "Signed PSBT": "Подписанное PSBT", "Signing..": "Подписание..", "Single-sig": "Одна подпись", "Size:": "Размер:", "Some checks cannot be performed.": "Некоторые проверки не могут быть выполнены.", "Spend (%d):": "Расход (%d):", "Spend:": "Расход:", "Stats for Nerds": "Статистика для Гиков", "Store on Flash": "Сохранить на Флэш Память", "Store on SD Card": "Сохранить на SD Карту", "Swipe to change mode": "Свайпните, чтобы сменить режим", "TC Flash Hash": "TC Flash Hash", "TC Flash Hash at Boot": "Проверка хэша Flash при загрузке", "TOUCH or ENTER to capture": "ПРИКОСНИТЕСЬ или нажмите ВВОД, чтобы захватить", "TX Pin": "TX Пин", "Tamper Check Code": "Код проверки вскрытия", "Tamper check code set successfully": "Код проверки вскрытия успешно установлен", "Tamper check codes do not match": "Коды проверки вскрытия не совпадают", "Text": "Текст", "Theme": "Тема", "Thermal": "Термальный", "To ensure data is unrecoverable use Wipe Device feature": "Для гарантии невосстановления данных используйте функцию Очистки Устройства", "Toggle Brightness": "Регулировка Яркости", "Tools": "Инструменты", "Touch Threshold": "Чувствительность", "Touchscreen": "Тачскрин", "Try more?": "Попробовать ещё?", "Type BIP39 Passphrase": "Ввести BIP39 фразу-пароль", "Type Key": "Ввести Ключ", "Unit": "Единица Измерения", "Upgrade complete.": "Обновление завершено.", "Use a black background surface.": "Использовать черную фоновую поверхность.", "Use camera's entropy to create a new mnemonic": "Использовать энтропию камеры, чтобы создать новую мнемонику", "Used:": "Использовано:", "User's Data": "Пользователь", "Value %s out of range: [%s, %s]": "Значение %s вне диапозона: [%s, %s]", "Value must be multiple of %s": "Значение должно быть кратным %s", "Verifying..": "Проверка..", "Version": "Версия", "Via Camera": "С Помощью Камеры", "Via D20": "С Помощью D20", "Via D6": "С Помощью D6", "Via Manual Input": "С Помощью Ручного Ввода", "Via Words": "Через Слово", "Wait for the capture": "Дождитесь Захвата", "Wallet": "Кошелек", "Wallet Descriptor": "Дескриптор Кошелька", "Wallet output descriptor": "Выходной дескриптор кошелька", "Wallet output descriptor loaded!": "Выходной дескриптор кошелька загружен!", "Wallet output descriptor not found.": "Выходной дескриптор кошелька не найден.", "Warning:": "Предупреждение:", "Word %d": "Слово %d", "Word Numbers": "Числа Слов", "Words": "Слова", "Yes": "Да", "is a valid address!": "некорректный адрес", "was NOT FOUND in the first %d addresses": "нЕ НАЙДЕНО в первых %d адресах"} \ No newline at end of file +{ + "% of the amount.": "% от суммы.", + "%d of %d multisig": "%d из %d мультиподпись", + "%d to %d": "%d к %d", + "%s removed.": "%s удален.", + "(%d total)": "(%d всего)", + "(Experimental)": "(Эксперементальный)", + "(watch-only)": "(Только часы)", + "12 words": "12 слов", + "24 words": "24 слова", + "About": "О Программе", + "Accept assumption?": "Принять предположение?", + "Account": "Учетная запись", + "Account #0 would be assumed": "Будет принят счет №0", + "Account Index": "Индекс счета", + "Add or change wallet passphrase?": "Добавить или изменить пароль кошелька?", + "Additional entropy from camera required for AES-CBC mode": "Для режима AES-CBC требуется дополнительная энтропия от камеры", + "Address": "Адрес", + "Align camera and backup plate properly.": "Правильно совместите камеру и резервную пластину.", + "Allow in settings first!": "Сначала разрешите в настройках!", + "Anti-glare disabled": "Антиблик отключен", + "Anti-glare enabled": "Антиблик включен", + "Appearance": "Внешний Вид", + "Are you sure?": "Вы уверены?", + "BGR Colors": "Цвета BGR", + "BIP39 Mnemonic": "BIP39 Мнемоника", + "Back": "Назад", + "Back to Menu": "Назад в Mеню", + "Backup Mnemonic": "Резервная мнемоника", + "Bad signature": "Плохая подпись", + "Base64 Password": "Пароль Base64", + "Baudrate": "Скорость Передачи Данных", + "Binary Grid": "Двоичная сетка", + "Border Padding": "Заполнение Границ", + "Brightness": "Яркость", + "Buttons": "Кнопки", + "Buttons Debounce": "Антидребезг кнопок", + "Capture cancelled": "Захват отменен", + "Change": "Сдача", + "Change Addresses": "Адрес Сдачи", + "Change theme and reboot?": "Сменить тему и перезагрузить?", + "Change:": "Сдача:", + "Changes will last until shutdown.": "Изменения будут храниться до выключения.", + "Check SD Card": "Проверить SD Карту", + "Check that address belongs to this wallet?": "Проверить, что адрес принадлежит этому кошельку?", + "Checked %d addresses with no matches.": "Проверено %d адресов без совпадений.", + "Checking for SD card..": "Проверка SD карты..", + "Confirm Tamper Check Code": "Подтвердите код проверки вскрытия", + "Create QR Code": "Создать QR Код", + "Create QR code from text?": "Создать QR код из текста?", + "Created:": "Создано:", + "Current Tamper Check Code": "Текущий код проверки вскрытия", + "Custom QR Code": "Пользовательский QR Код", + "Customize": "Настроить", + "Customizing your wallet will generate a new Key.": "Настройка вашего кошелька создаст новый ключ.", + "Cut Depth": "Глубина Резки", + "Cut Method": "Метод Резки", + "Decimal": "Десятичный", + "Decrypt?": "Расшифровать?", + "Default Wallet": "Кошелек по умолчанию", + "Depth Per Pass": "Глубина за Проход", + "Derive BIP85 entropy?": "Вывести энтропию BIP85?", + "Descriptor Addresses": "Адреса дескрипторов", + "Display": "Дисплеи", + "Do not power off, it may take a while to complete.": "Не выключайте питание, это может занять некоторое время.", + "Done?": "Готово?", + "Double mnemonic": "Двойная мнемоника", + "Driver": "Драйвер", + "Empty": "Пустой", + "Enable Krux apps": "Включить приложения Krux", + "Encrypted": "Зашифровано", + "Encrypted QR Code": "Зашифрованный QR Код", + "Encrypted mnemonic was not stored": "Зашифрованная мнемоника не была сохранена", + "Encrypted mnemonic was stored with ID:": "Зашифрованная мнемоника была сохранена с ID:", + "Encryption": "Шифрование", + "Encryption Mode": "Метод Шифрования", + "Enter %d BIP-39 words.": "Введите %d слов BIP-39.", + "Enter a 6+ characters Tamper Check Code": "Введите более 6 символов кода проверки вскрытия", + "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Введите каждое слово вашей мнемоники BIP-39 в виде числа от 1 до 2048.", + "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Введите каждое слово вашей мнемоники BIP-39 в виде шестнадцатеричного числа от 1 до 800.", + "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Введите каждое слово вашей мнемоники BIP-39 в виде восьмеричного числа от 1 до 4000.", + "Enter each word of your BIP-39 mnemonic.": "Введите каждое слово вашей BIP-39 мнемоники.", + "Erase User's Data": "Удалить данные пользователя", + "Erasing user's data..": "Удаление данных пользователя..", + "Error:": "Ошибка:", + "Esc": "Выйти", + "Execute a signed Krux app?": "Выполнить подписанное приложение Krux?", + "Explore files?": "Исследовать файлы?", + "Exporting to SD card..": "Экспортирование на SD карту..", + "Extended Public Key": "Расширенный Публичный Ключ", + "Factory Settings": "Заводские Настройки", + "Failed to decrypt": "Не удалось расшифровать", + "Failed to load PSBT": "Не удалось загрузить PSBT", + "Failed to load address": "Не удалось загрузить адрес", + "Failed to load key": "Не удалось загрузить ключ", + "Failed to load message": "Не удалось загрузить сообщение", + "Failed to load mnemonic": "Не удалось загрузить мнемонику", + "Failed to load output descriptor": "Не удалось загрузить выходной дескриптор", + "Failed to load passphrase": "Не удалось загрузить фразу-пароль", + "Failed to store mnemonic": "Не удалось сохранить мнемонику", + "Fee:": "Комиссия:", + "Feed Rate": "Скорость Подачи", + "Filename": "Имя файла", + "Filename %s exists on SD card, overwrite?": "Файл %s существует на SD карте, перезаписать?", + "Fill the flash with entropy from camera?": "Заполнить флэш энтропией с камеры?", + "Filling Flash": "Заполнение флэша", + "Fingerprint unset in PSBT": "Отпечаток пальца не установлен в PSBT", + "Firmware exceeds max size: %d": "Прошивка превышает максимальный размер: %d", + "Flash Map": "Карта флэша", + "Flash Tools": "Flash Tools", + "Flash filled with camera entropy": "Флэш заполнен энтропией камеры", + "Flipped X Coordinates": "Перевернутые координаты X", + "Flute Diameter": "Диаметр Флюта", + "Free:": "Свободно:", + "From Storage": "Из Памяти", + "Fully erase your SD card in another device to ensure data is unrecoverable": "Полностью стерите SD-карту в другом устройстве, чтобы убедиться, что данные не восстановимы", + "Generate Mnemonic": "Создать Мнемонику", + "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Назначить этой мнемоники кастомный ID? В ином случае будет использован текущий фингерпринт", + "Go": "OK", + "Good entropy": "Хорошая энтропия", + "Hardware": "Аппаратное Обеспечение", + "Hex Public Key": "Шестнадцатеричный Публичный Ключ", + "Hexadecimal": "Шестнадцатеричный", + "Hide Mnemonics": "Скрыть мнемоники", + "High fees!": "Высокие комиссии!", + "ID already exists": "ID уже существует", + "Index": "Индекс", + "Index: %s": "Индекс: %s", + "Inputs (%d):": "Входы (%d):", + "Install?": "Установить?", + "Insufficient Entropy!": "Недостаточная Энтропия!", + "Insufficient entropy": "Недостаточная энтропия", + "Invalid Tamper Check Code": "Недействительный код проверки вскрытия", + "Invalid address": "Неверный адрес", + "Invalid bootloader": "Неверный загрузчик", + "Invalid mnemonic length": "Неверная длина мнемоники", + "Invalid public key": "Неверный публичный ключ", + "Invalid wallet:": "Неверный кошелек:", + "Invert": "Инвертировать", + "Inverted Colors": "Перевернутые цвета", + "Key": "Ключ", + "Key was not provided": "Ключ не предоставлен", + "Krux Printer Test QR": "Тестовый QR Принтера Krux", + "LCD Type": "Тип ЖК-дисплея", + "Language": "Язык", + "Leave blank if you'd like Krux to pick a valid final word": "Оставьте пустым, если хотите, чтобы Krux выбрал подходящее последнее слово", + "Left": "Влево", + "Length: %s": "Длина: %s", + "Line Delay": "Задержка Линии", + "Line:": "Линия:", + "Load Krux app": "Загрузить приложение Krux", + "Load Mnemonic": "Загрузить Мнемонику", + "Load Wallet": "Загрузить кошелек", + "Load a trusted wallet descriptor to view addresses?": "Загрузить дескриптор доверенного кошелька для просмотра адресов?", + "Load from SD card": "Загрузка с SD-карты", + "Load from SD card?": "Загрузить с SD карты?", + "Load from camera": "Из камеры", + "Load one?": "Загрузить один?", + "Load?": "Загрузить?", + "Loading Camera..": "Загрузка Камеры..", + "Loading change addresses..": "Загрузка адресов изменения..", + "Loading printer..": "Загрузка принтера..", + "Loading receive addresses..": "Загрузка адресов получения..", + "Loading..": "Загрузка..", + "Locale": "Локаль", + "Location": "Расположение", + "Maximum length exceeded (%s)": "Максимальная длина превышена (%s)", + "Message": "Сообщение", + "Message:": "Сообщение:", + "Missing signature file": "Отсутствует файл подписи", + "Mnemonic": "Мнемоника", + "Mnemonic ID": "ID Мнемоники", + "Mnemonic and passphrase will be kept.": "Мнемоника и парольная фраза будут сохранены.", + "Mnemonic was not encrypted": "Мнемоника не была зашифрована", + "Modified:": "Изменено:", + "Multisig": "Мультиподпись", + "Native Segwit - 84 would be assumed": "Native Segwit - 84 будет принято", + "Network": "Сеть", + "New Mnemonic": "Новая Мнемоника", + "New firmware detected.": "Обнаружена новая прошивка.", + "No": "Нет", + "No Passphrase": "Нет Фраза-пароль", + "Not enough rolls!": "Недостаточно бросков!", + "Numbers": "Числа", + "Octal": "Восьмеричный", + "Other Formats": "Другие форматы", + "PBKDF2 Iter.": "PBKDF2 Итерации", + "Paint punched dots black so they can be detected.": "Закрасьте перфорированные точки черным цветом, чтобы их можно было обнаружить.", + "Paper Width": "Ширина Бумаги", + "Part": "Часть", + "Part Size": "Размер Части", + "Passphrase": "Фраза-пароль", + "Password Length": "Длина пароля", + "Path mismatch": "Несоответствие пути", + "Pattern detected!": "Образец обнаружен!", + "Permanently remove all stored encrypted mnemonics and settings from flash?": "Окончательно удалить все сохраненные зашифрованные мнемоники и настройки из флеш-памяти?", + "Persist": "Постоянная Память", + "Pixels deviation index:": "Индекс отклонения пикселей:", + "Plaintext QR": "QR Открытым Текстом", + "Please load a wallet output descriptor": "Пожалуйста загрузите выходной дескриптор кошелька", + "Plunge Rate": "Скорость Погружения", + "Poor entropy": "Плохая энтропия", + "Poor entropy detected!": "Обнаружена плохая энтропия!", + "Print Test QR": "Напечатать Тестовый QR", + "Print Tiny Seed?": "Распечатать Tiny Seed?", + "Print to QR": "Печать в QR", + "Print to QR?": "Напечатать в виде QR?", + "Print?": "Печатать?", + "Printer": "Принтер", + "Printer Driver not set!": "Драйвер Принтера не установлен!", + "Printing..": "Идет печать..", + "Proceed anyway?": "Все равно продолжить?", + "Proceed?": "Продолжить?", + "Processing..": "Обработка..", + "QR Code": "QR Код", + "RX Pin": "RX Пин", + "Reboot": "Перезагрузить", + "Receive": "Получить", + "Receive Addresses": "Адрес Получения", + "Region:": "Регион:", + "Remove %s?": "Удалить %s?", + "Remove Mnemonic": "Удалить Мнемонику", + "Remove firmware files from SD Card?": "Удалить файлы прошивки с SD-карты?", + "Res. - Format": "Разреш. - Формат", + "Restore factory settings and reboot?": "Восстановить заводские настройки и перезагрузить?", + "Return to QR Viewer": "Вернуться к QR-просмотрщику", + "Review scanned data, edit if necessary": "Просмотрите отсканированные данные, отредактируйте при необходимости", + "Right": "Вправо", + "Roll dice at least %d times to generate a mnemonic.": "Бросьте кубик не менее %d раз, чтобы сгенерировать мнемонику.", + "Rolls distribution:": "Распределение бросков:", + "Rolls:": "Броски:", + "SD card": "SD карта", + "SD card not detected.": "SD карта не обнаружена.", + "SHA256 of rolls:": "SHA256 бросков:", + "SHA256 of snapshot:": "SHA256 снэпшота:", + "Save QR Image to SD Card": "Сохранить QR-изображение на SD-карту", + "Save to SD card": "Сохранить на SD-карту", + "Save to SD card?": "Сохранить на SD карту?", + "Saved to SD card": "Сохранено на SD карту", + "Scale": "Шкала", + "Scan Address": "Отсканировать Адрес", + "Scan BIP39 Passphrase": "Отсканировать BIP39 фразу-пароль", + "Scan Key QR Code": "Отсканировать Ключ QR код", + "Scanning words 1-12 again": "Сканирование слов 1-12 снова", + "Scanning words 13-24": "Сканирование слов 13-24", + "Screensaver Time": "Время Экранной Заставки", + "Script Type": "Тип скрипта", + "Security": "Охрана", + "Self-transfer or Change (%d):": "Трансфер самому себе или Сдача (%d):", + "Self-transfer:": "Перевод самому себе:", + "Set a tamper check code first": "Сначала установите код проверки вскрытия", + "Settings": "Настройки", + "Settings stored internally on flash.": "Настройки хранятся во флэш-памяти.", + "Settings stored on SD card.": "Настройки сохранены на SD-карте.", + "Shannon's Entropy:": "Энтропия Шеннона:", + "Shutdown": "Выключить", + "Shutdown Time": "Время выключения", + "Shutting down..": "Выключение..", + "Sign": "Подписать", + "Sign to QR code": "Подписать QR-код", + "Sign to SD card": "Подписать на SD-карте", + "Sign?": "Подписать?", + "Signature": "Подпись", + "Signed Message": "Подписанное Сообщение", + "Signed PSBT": "Подписанное PSBT", + "Signing..": "Подписание..", + "Single-sig": "Одна подпись", + "Size:": "Размер:", + "Some checks cannot be performed.": "Некоторые проверки не могут быть выполнены.", + "Spend (%d):": "Расход (%d):", + "Spend:": "Расход:", + "Stats for Nerds": "Статистика для Гиков", + "Store on Flash": "Сохранить на Флэш Память", + "Store on SD Card": "Сохранить на SD Карту", + "Swipe to change mode": "Свайпните, чтобы сменить режим", + "TC Flash Hash": "TC Flash Hash", + "TC Flash Hash at Boot": "Проверка хэша Flash при загрузке", + "TOUCH or ENTER to capture": "ПРИКОСНИТЕСЬ или нажмите ВВОД, чтобы захватить", + "TX Pin": "TX Пин", + "Tamper Check Code": "Код проверки вскрытия", + "Tamper check code set successfully": "Код проверки вскрытия успешно установлен", + "Tamper check codes do not match": "Коды проверки вскрытия не совпадают", + "Text": "Текст", + "Theme": "Тема", + "Thermal": "Термальный", + "To ensure data is unrecoverable use Wipe Device feature": "Для гарантии невосстановления данных используйте функцию Очистки Устройства", + "Toggle Brightness": "Регулировка Яркости", + "Tools": "Инструменты", + "Touch Threshold": "Чувствительность", + "Touchscreen": "Тачскрин", + "Try more?": "Попробовать ещё?", + "Type BIP39 Passphrase": "Ввести BIP39 фразу-пароль", + "Type Key": "Ввести Ключ", + "Unit": "Единица Измерения", + "Upgrade complete.": "Обновление завершено.", + "Use a black background surface.": "Использовать черную фоновую поверхность.", + "Use camera's entropy to create a new mnemonic": "Использовать энтропию камеры, чтобы создать новую мнемонику", + "Used:": "Использовано:", + "User's Data": "Пользователь", + "Value %s out of range: [%s, %s]": "Значение %s вне диапозона: [%s, %s]", + "Value must be multiple of %s": "Значение должно быть кратным %s", + "Verifying..": "Проверка..", + "Version": "Версия", + "Via Camera": "С Помощью Камеры", + "Via D20": "С Помощью D20", + "Via D6": "С Помощью D6", + "Via Manual Input": "С Помощью Ручного Ввода", + "Via Words": "Через Слово", + "Wait for the capture": "Дождитесь Захвата", + "Wallet": "Кошелек", + "Wallet Descriptor": "Дескриптор Кошелька", + "Wallet output descriptor": "Выходной дескриптор кошелька", + "Wallet output descriptor loaded!": "Выходной дескриптор кошелька загружен!", + "Wallet output descriptor not found.": "Выходной дескриптор кошелька не найден.", + "Warning:": "Предупреждение:", + "Word %d": "Слово %d", + "Word Numbers": "Числа Слов", + "Words": "Слова", + "Yes": "Да", + "is a valid address!": "некорректный адрес", + "was NOT FOUND in the first %d addresses": "нЕ НАЙДЕНО в первых %d адресах" +} \ No newline at end of file diff --git a/i18n/translations/tr-TR.json b/i18n/translations/tr-TR.json index de867d1cf..9c30b883c 100644 --- a/i18n/translations/tr-TR.json +++ b/i18n/translations/tr-TR.json @@ -1 +1,322 @@ -{"% of the amount.": "tutarın %'si.", "%d of %d multisig": "%d / %d çoklu imza", "%d to %d": "%d to %d", "%s removed.": "%s kaldırıldı.", "(%d total)": "(toplam %d)", "(Experimental)": "(Deneysel)", "(watch-only)": "(sadece izle)", "12 words": "12 kelime", "24 words": "24 kelime", "About": "Hakkında", "Accept assumption?": "Varsayım kabul edilsin mi?", "Account": "Hesap", "Account #0 would be assumed": "#0 numaralı hesap varsayılacaktır", "Account Index": "Hesap Endeksi", "Add or change wallet passphrase?": "Cüzdan parolası eklensin mi veya değiştirilsin mi?", "Additional entropy from camera required for AES-CBC mode": "AES-CBC modu için kameradan ek entropi gereklidir", "Address": "Adres", "Align camera and backup plate properly.": "Kamerayı ve yedek plakay'ı düzgün bir şekilde hizalayın.", "Allow in settings first!": "Önce ayarlarda izin ver!", "Anti-glare disabled": "Parlama önleyici devre dışı", "Anti-glare enabled": "Parlama önleyici etkin", "Appearance": "Görünüm", "Are you sure?": "Emin misiniz?", "BGR Colors": "BGR Renkleri", "BIP39 Mnemonic": "BIP39 Anımsatıcı", "Back": "Geri", "Back to Menu": "Menüye Dön", "Backup Mnemonic": "Yedek Mnemonic", "Bad signature": "Geçersiz imza", "Base64 Password": "Base64 Parola", "Baudrate": "Baud Hızı", "Binary Grid": "İkili Izgara", "Border Padding": "Kenarlık Dolgusu", "Brightness": "Parlaklık", "Buttons": "Butonlar", "Buttons Debounce": "Buton Geri-sekmesi", "Capture cancelled": "Yakalama iptal edildi", "Change": "Para Üstü", "Change Addresses": "Para Üstü Adresleri", "Change theme and reboot?": "Temayı değiştir ve yeniden başlat?", "Change:": "Para Üstü:", "Changes will last until shutdown.": "Değişiklikler kapanışa kadar devam edecek.", "Check SD Card": "SD Kartı Kontrol Et", "Check that address belongs to this wallet?": "Bu adresin, bu cüzdana ait olduğunu kontrol et?", "Checked %d addresses with no matches.": "Eşleşmeyen %d adres kontrol edildi.", "Checking for SD card..": "SD kart kontrol ediliyor..", "Confirm Tamper Check Code": "Kurcalama Kontrol Kodunu Onayla", "Create QR Code": "QR Kodu Oluştur", "Create QR code from text?": "Metinden QR kodu oluşturulsun mu?", "Created:": "Oluşturuldu:", "Current Tamper Check Code": "Mevcut Kurcalama Kontrol Kodu", "Custom QR Code": "Özel QR Kodu", "Customize": "Özelleştir", "Customizing your wallet will generate a new Key.": "Cüzdanınızı özelleştirmek yeni bir Anahtar oluşturacaktır.", "Cut Depth": "Kesim Derinliği", "Cut Method": "Kesim Yöntemi", "Decimal": "Ondalık", "Decrypt?": "Şifre çözülsün mü?", "Default Wallet": "Varsayılan Cüzdan", "Depth Per Pass": "Geçiş Başına Derinlik", "Derive BIP85 entropy?": "BIP85 entropisi türetilsin mi?", "Descriptor Addresses": "Tanımlayıcı Adresler", "Display": "Ekran", "Do not power off, it may take a while to complete.": "Kapatmayın, tamamlanması biraz zaman alabilir.", "Done?": "Tamamlandı mı?", "Double mnemonic": "Çifte anımsatıcı", "Driver": "Sürücü", "Empty": "Boş", "Enable Krux apps": "Krux uygulamalarını etkinleştir", "Encrypted": "Şifrelenmiş", "Encrypted QR Code": "Şifrelenmiş QR Kodu", "Encrypted mnemonic was not stored": "Şifrelenmiş mnemonic depolanmadı", "Encrypted mnemonic was stored with ID:": "Şifrelenmiş mnemonic ID ile depolandı:", "Encryption": "Şifreleme", "Encryption Mode": "Şifreleme Modu", "Enter %d BIP-39 words.": "%d BIP-39 kelime girin.", "Enter a 6+ characters Tamper Check Code": "6+ karakterlik bir Kurcalama Kontrol Kodu girin", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "BIP-39 mnemonic'inizin her kelimesini 1'den 2048'e kadar bir sayı olarak girin.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "BIP-39 mnemonic'inizin her kelimesini 1'den 800'e kadar onaltılık bir sayı olarak girin.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "BIP-39 mnemonic'inizin her kelimesini 1'den 4000'e kadar sekizlik bir sayı olarak girin.", "Enter each word of your BIP-39 mnemonic.": "BIP-39 mnemonic'inizin her kelimesini girin.", "Erase User's Data": "Kullanıcı Verilerini Sil", "Erasing user's data..": "Kullanıcının verileri siliniyor..", "Error:": "Hata:", "Esc": "Çıkış", "Execute a signed Krux app?": "İmzalı bir Krux uygulaması çalıştırılsın mı?", "Explore files?": "Dosyaları ara?", "Exporting to SD card..": "SD karta aktarılıyor..", "Extended Public Key": "Genişletilmiş Public Key", "Factory Settings": "Fabrika Ayarları", "Failed to decrypt": "Şifre çözme başarısız", "Failed to load PSBT": "PSBT yükleme başarısız", "Failed to load address": "Adres yükleme başarısız", "Failed to load key": "Anahtar yükleme başarısız", "Failed to load message": "Mesaj yükleme başarısız", "Failed to load mnemonic": "Mnemonic yükleme başarısız", "Failed to load output descriptor": "Çıktı tanımlayıcısı yüklemesi başarısız", "Failed to load passphrase": "Parola yükleme başarısız", "Failed to store mnemonic": "Mnemonic depolama başarısız", "Fee:": "Ücret:", "Feed Rate": "Besleme Hızı", "Filename": "Dosya adı", "Filename %s exists on SD card, overwrite?": "%s dosya adı SD kartta var, üzerine yazılsın mı?", "Fill the flash with entropy from camera?": "Flash'ı kameradan gelen entropi ile doldur?", "Filling Flash": "Flash Dolduruluyor", "Fingerprint unset in PSBT": "PSBT'de parmak izi ayarı kaldırıldı", "Firmware exceeds max size: %d": "Donanım yazılımı maksimum boyutu aşıyor: %d", "Flash Map": "Flash Haritası", "Flash Tools": "Flash Araçları", "Flash filled with camera entropy": "Flash kamera entropisi ile dolduruldu", "Flipped X Coordinates": "X Koordinatları Tersine Çevrildi", "Flute Diameter": "Flute Çapı", "Free:": "Boş:", "From Storage": "Depolamadan Seç", "Fully erase your SD card in another device to ensure data is unrecoverable": "Verilerin geri kullanılamaz olduğundan emin olmak için SD kartınızı başka bir cihazda tamamen silin", "Generate Mnemonic": "Mnemonic Oluştur", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Bu mnemonic'e özel bir ID verilsin mi? Aksi takdirde mevcut parmak izi kullanılacaktır", "Go": "Seç", "Good entropy": "Yeterli entropi", "Hardware": "Donanım", "Hex Public Key": "Hex Public Key", "Hexadecimal": "Onaltılık", "Hide Mnemonics": "Mnemonic'leri Gizle", "High fees!": "Yüksek ücret!", "ID already exists": "ID zaten var", "Index": "Dizin", "Index: %s": "Dizin: %s", "Inputs (%d):": "Girişler (%d):", "Install?": "Yükle?", "Insufficient Entropy!": "Yetersiz Entropi!", "Insufficient entropy": "Yetersiz entropi", "Invalid Tamper Check Code": "Geçersiz Kurcalama Kontrol Kodu", "Invalid address": "Geçersiz adres", "Invalid bootloader": "Geçersiz önyükleyici", "Invalid mnemonic length": "Geçersiz mnemonic uzunluğu", "Invalid public key": "Geçersiz public key", "Invalid wallet:": "Geçersiz cüzdan:", "Invert": "Ters Çevir", "Inverted Colors": "Ters Renkler", "Key": "Anahtar", "Key was not provided": "Anahtar sağlanmadı", "Krux Printer Test QR": "Krux Yazıcı Test QR'ı", "LCD Type": "LCD Tipi", "Language": "Dil", "Leave blank if you'd like Krux to pick a valid final word": "Krux'un geçerli bir son kelime seçmesini istiyorsanız boş bırakın", "Left": "Sol", "Length: %s": "Uzunluk: %s", "Line Delay": "Satır Gecikmesi", "Line:": "Satır:", "Load Krux app": "Krux uygulamasını yükle", "Load Mnemonic": "Mnemonic Yükle", "Load Wallet": "Cüzdan Yükle", "Load a trusted wallet descriptor to view addresses?": "Adresleri görüntülemek için güvenilir bir cüzdan tanımlayıcısı yüklensin mi?", "Load from SD card": "SD karttan yükle", "Load from SD card?": "SD karttan yüklensin mi?", "Load from camera": "Kameradan yükle", "Load one?": "Bir tane mi yüklensin?", "Load?": "Yüklensin mi?", "Loading Camera..": "Kamera Yükleniyor..", "Loading change addresses..": "Para üstü adresler yükleniyor..", "Loading printer..": "Yazıcı yükleniyor..", "Loading receive addresses..": "Alım adresler yükleniyor..", "Loading..": "Yükleniyor..", "Locale": "Yerel", "Location": "Konum", "Maximum length exceeded (%s)": "Maksimum uzunluk aşıldı (%s)", "Message": "Mesaj", "Message:": "Mesaj:", "Missing signature file": "İmza dosyası eksik", "Mnemonic": "Mnemonic", "Mnemonic ID": "Mnemonic ID", "Mnemonic and passphrase will be kept.": "Mnemonik ve parola tutulacaktır.", "Mnemonic was not encrypted": "Mnemonic şifrelenmedi", "Modified:": "Değiştirildi:", "Multisig": "Çoklu imza", "Native Segwit - 84 would be assumed": "Yerel Segwit - 84 varsayılacaktır", "Network": "Ağ", "New Mnemonic": "Yeni Mnemonic", "New firmware detected.": "Yeni donanım yazılımı tespit edildi.", "No": "Hayır", "No Passphrase": "Parola Yok", "Not enough rolls!": "Yeterli zar atışı yok!", "Numbers": "Numaralar", "Octal": "Sekizlik", "Other Formats": "Diğer Formatlar", "PBKDF2 Iter.": "PBKDF2 Yinelemesi", "Paint punched dots black so they can be detected.": "İşaretlenmiş noktaları siyaha boyayın ki tespit edilebilsinler.", "Paper Width": "Kağıt Genişliği", "Part": "Parça", "Part Size": "Parça Boyutu", "Passphrase": "Parola", "Password Length": "Parola Uzunluğu", "Path mismatch": "Yol uyuşmazlığı", "Pattern detected!": "Örüntü algılandı!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "Tüm depolanmış ve şifrelenmiş mnemonic'ler ve ayarlar flash'tan kalıcı olarak kaldırılsın mı?", "Persist": "Kalıcı Depolama", "Pixels deviation index:": "Piksel sapma indeksi:", "Plaintext QR": "Düz Metin QR'ı", "Please load a wallet output descriptor": "Lütfen bir cüzdan çıktı tanımlayıcısı yükleyin", "Plunge Rate": "Dalış Hızı", "Poor entropy": "Düşük entropi", "Poor entropy detected!": "Düşük entropi tespit edildi!", "Print Test QR": "Test QR'ını Yazdır", "Print Tiny Seed?": "Tiny Seed Yazdırılsın mı?", "Print to QR": "QR'a Yazdır", "Print to QR?": "QR'a yazdırılsın mı?", "Print?": "Yazdırılsın mı?", "Printer": "Yazıcı", "Printer Driver not set!": "Yazıcı Sürücüsü ayarlanmadı!", "Printing..": "Yazdırılıyor..", "Proceed anyway?": "Yine de devam edilsin mi?", "Proceed?": "Devam edilsin mi?", "Processing..": "İşleniyor..", "QR Code": "QR Kodu", "RX Pin": "RX Pini", "Reboot": "Yeniden Başlat", "Receive": "Al", "Receive Addresses": "Adresleri Al", "Region:": "Bölge:", "Remove %s?": "%s kaldırılsın mı?", "Remove Mnemonic": "Mnemonic'i Kaldır", "Remove firmware files from SD Card?": "SD Karttan donanım yazılımı dosyaları kaldırılsın mı?", "Res. - Format": "Çözünürlüğü Sıfırla", "Restore factory settings and reboot?": "Fabrika ayarlarına geri dönüp ve yeniden başlatılsın mı?", "Return to QR Viewer": "QR Görüntüleyiciye Dön", "Review scanned data, edit if necessary": "Taranan verileri gözden geçirin, gerekirse düzenleyin", "Right": "Sağ", "Roll dice at least %d times to generate a mnemonic.": "Bir mnemonic oluşturmak için zarı en az %d kez atın.", "Rolls distribution:": "Zar atış dağılımı:", "Rolls:": "Zar atışları:", "SD card": "SD kart", "SD card not detected.": "SD kart algılanmadı.", "SHA256 of rolls:": "Zar atışlarının SHA256'sı:", "SHA256 of snapshot:": "Snapshot'ın SHA256'sı:", "Save QR Image to SD Card": "QR Görüntüsünü SD Karta Kaydet", "Save to SD card": "SD karta kaydet", "Save to SD card?": "SD karta kaydedilsin mi?", "Saved to SD card": "SD karta kaydedildi", "Scale": "Ölçek", "Scan Address": "Adresi Tara", "Scan BIP39 Passphrase": "BIP39 Parolasını Tara", "Scan Key QR Code": "Anahtar QR Kodunu Tara", "Scanning words 1-12 again": "1-12 kelimeleri tekrar taranıyor", "Scanning words 13-24": "13-24 kelimeleri taranıyor", "Screensaver Time": "Ekran Koruyucu Süresi", "Script Type": "Betik Türü", "Security": "Güvenlik", "Self-transfer or Change (%d):": "Kendine-transfer veya Para Üstü (%d):", "Self-transfer:": "Kendine-transfer:", "Set a tamper check code first": "Önce bir kurcalama kontrol kodu ayarlayın", "Settings": "Ayarlar", "Settings stored internally on flash.": "Ayarlar dahili olarak flaşta saklanır.", "Settings stored on SD card.": "Ayarlar SD karta kaydedildi.", "Shannon's Entropy:": "Shannon Entropisi:", "Shutdown": "Kapat", "Shutdown Time": "Kapanma Süresi", "Shutting down..": "Kapatılıyor..", "Sign": "İmzala", "Sign to QR code": "QR koduna imzala", "Sign to SD card": "SD karta imzala", "Sign?": "İmzalansın mı?", "Signature": "İmza", "Signed Message": "İmzalı Mesaj", "Signed PSBT": "İmzalı PSBT", "Signing..": "İmzalanıyor..", "Single-sig": "Tek-imza", "Size:": "Boyut:", "Some checks cannot be performed.": "Bazı kontroller yerine getirilemedi.", "Spend (%d):": "Harcama (%d):", "Spend:": "Harcama:", "Stats for Nerds": "İnekler İçin İstatistikler", "Store on Flash": "Flash'ta Sakla", "Store on SD Card": "SD Kartta Sakla", "Swipe to change mode": "Modu değiştirmek için kaydırın", "TC Flash Hash": "TC Flash Hash", "TC Flash Hash at Boot": "Önyüklemede TC Flash Hash", "TOUCH or ENTER to capture": "Yakalamak için DOKUN veya GİR", "TX Pin": "TX Pini", "Tamper Check Code": "Kurcalama Kontrol Kodu", "Tamper check code set successfully": "Kurcalama kontrol kodu başarıyla ayarlandı", "Tamper check codes do not match": "Kurcalama kontrol kodları eşleşmiyor", "Text": "Metin", "Theme": "Tema", "Thermal": "Termal", "To ensure data is unrecoverable use Wipe Device feature": "Verilerin geri kullanılamaz olduğundan emin olmak için Cihazı Sil özelliğini kullanın", "Toggle Brightness": "Parlaklığı Değiştir", "Tools": "Araçlar", "Touch Threshold": "Dokunma Eşiği", "Touchscreen": "Dokunmatik ekran", "Try more?": "Daha fazla kez denensin mi?", "Type BIP39 Passphrase": "BIP39 parolasını yazın", "Type Key": "Anahtar Yaz", "Unit": "Birim", "Upgrade complete.": "Güncelleme tamamlandı.", "Use a black background surface.": "Siyah bir arka plan yüzeyi kullanın.", "Use camera's entropy to create a new mnemonic": "Yeni bir mnemonic oluşturmak için kameranın entropisini kullanın", "Used:": "Kullanılan:", "User's Data": "Kullanıcı", "Value %s out of range: [%s, %s]": "%s değeri aralık dışında: [%s, %s]", "Value must be multiple of %s": "Değer %s'nin katı olmalıdır", "Verifying..": "Doğrulanıyor..", "Version": "Sürüm", "Via Camera": "Kamera Aracılığıyla", "Via D20": "D20 Aracılığıyla", "Via D6": "D6 Aracılığıyla", "Via Manual Input": "Manuel Giriş Aracılığıyla", "Via Words": "Sözcüklerle", "Wait for the capture": "Yakalamanın tamamlanmasını bekleyin", "Wallet": "Cüzdan", "Wallet Descriptor": "Cüzdan Tanımlayıcısı", "Wallet output descriptor": "Cüzdan çıktı tanımlayıcısı", "Wallet output descriptor loaded!": "Cüzdan çıktı tanımlayıcısı yüklendi!", "Wallet output descriptor not found.": "Cüzdan çıktı tanımlayıcısı bulunamadı.", "Warning:": "Uyarı:", "Word %d": "Kelime %d", "Word Numbers": "Kelime Numaraları", "Words": "Kelimeler", "Yes": "Evet", "is a valid address!": "geçerli bir adres!", "was NOT FOUND in the first %d addresses": "ilk %d adreste BULUNAMADI"} \ No newline at end of file +{ + "% of the amount.": "tutarın %'si.", + "%d of %d multisig": "%d / %d çoklu imza", + "%d to %d": "%d to %d", + "%s removed.": "%s kaldırıldı.", + "(%d total)": "(toplam %d)", + "(Experimental)": "(Deneysel)", + "(watch-only)": "(sadece izle)", + "12 words": "12 kelime", + "24 words": "24 kelime", + "About": "Hakkında", + "Accept assumption?": "Varsayım kabul edilsin mi?", + "Account": "Hesap", + "Account #0 would be assumed": "#0 numaralı hesap varsayılacaktır", + "Account Index": "Hesap Endeksi", + "Add or change wallet passphrase?": "Cüzdan parolası eklensin mi veya değiştirilsin mi?", + "Additional entropy from camera required for AES-CBC mode": "AES-CBC modu için kameradan ek entropi gereklidir", + "Address": "Adres", + "Align camera and backup plate properly.": "Kamerayı ve yedek plakay'ı düzgün bir şekilde hizalayın.", + "Allow in settings first!": "Önce ayarlarda izin ver!", + "Anti-glare disabled": "Parlama önleyici devre dışı", + "Anti-glare enabled": "Parlama önleyici etkin", + "Appearance": "Görünüm", + "Are you sure?": "Emin misiniz?", + "BGR Colors": "BGR Renkleri", + "BIP39 Mnemonic": "BIP39 Anımsatıcı", + "Back": "Geri", + "Back to Menu": "Menüye Dön", + "Backup Mnemonic": "Yedek Mnemonic", + "Bad signature": "Geçersiz imza", + "Base64 Password": "Base64 Parola", + "Baudrate": "Baud Hızı", + "Binary Grid": "İkili Izgara", + "Border Padding": "Kenarlık Dolgusu", + "Brightness": "Parlaklık", + "Buttons": "Butonlar", + "Buttons Debounce": "Buton Geri-sekmesi", + "Capture cancelled": "Yakalama iptal edildi", + "Change": "Para Üstü", + "Change Addresses": "Para Üstü Adresleri", + "Change theme and reboot?": "Temayı değiştir ve yeniden başlat?", + "Change:": "Para Üstü:", + "Changes will last until shutdown.": "Değişiklikler kapanışa kadar devam edecek.", + "Check SD Card": "SD Kartı Kontrol Et", + "Check that address belongs to this wallet?": "Bu adresin, bu cüzdana ait olduğunu kontrol et?", + "Checked %d addresses with no matches.": "Eşleşmeyen %d adres kontrol edildi.", + "Checking for SD card..": "SD kart kontrol ediliyor..", + "Confirm Tamper Check Code": "Kurcalama Kontrol Kodunu Onayla", + "Create QR Code": "QR Kodu Oluştur", + "Create QR code from text?": "Metinden QR kodu oluşturulsun mu?", + "Created:": "Oluşturuldu:", + "Current Tamper Check Code": "Mevcut Kurcalama Kontrol Kodu", + "Custom QR Code": "Özel QR Kodu", + "Customize": "Özelleştir", + "Customizing your wallet will generate a new Key.": "Cüzdanınızı özelleştirmek yeni bir Anahtar oluşturacaktır.", + "Cut Depth": "Kesim Derinliği", + "Cut Method": "Kesim Yöntemi", + "Decimal": "Ondalık", + "Decrypt?": "Şifre çözülsün mü?", + "Default Wallet": "Varsayılan Cüzdan", + "Depth Per Pass": "Geçiş Başına Derinlik", + "Derive BIP85 entropy?": "BIP85 entropisi türetilsin mi?", + "Descriptor Addresses": "Tanımlayıcı Adresler", + "Display": "Ekran", + "Do not power off, it may take a while to complete.": "Kapatmayın, tamamlanması biraz zaman alabilir.", + "Done?": "Tamamlandı mı?", + "Double mnemonic": "Çifte anımsatıcı", + "Driver": "Sürücü", + "Empty": "Boş", + "Enable Krux apps": "Krux uygulamalarını etkinleştir", + "Encrypted": "Şifrelenmiş", + "Encrypted QR Code": "Şifrelenmiş QR Kodu", + "Encrypted mnemonic was not stored": "Şifrelenmiş mnemonic depolanmadı", + "Encrypted mnemonic was stored with ID:": "Şifrelenmiş mnemonic ID ile depolandı:", + "Encryption": "Şifreleme", + "Encryption Mode": "Şifreleme Modu", + "Enter %d BIP-39 words.": "%d BIP-39 kelime girin.", + "Enter a 6+ characters Tamper Check Code": "6+ karakterlik bir Kurcalama Kontrol Kodu girin", + "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "BIP-39 mnemonic'inizin her kelimesini 1'den 2048'e kadar bir sayı olarak girin.", + "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "BIP-39 mnemonic'inizin her kelimesini 1'den 800'e kadar onaltılık bir sayı olarak girin.", + "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "BIP-39 mnemonic'inizin her kelimesini 1'den 4000'e kadar sekizlik bir sayı olarak girin.", + "Enter each word of your BIP-39 mnemonic.": "BIP-39 mnemonic'inizin her kelimesini girin.", + "Erase User's Data": "Kullanıcı Verilerini Sil", + "Erasing user's data..": "Kullanıcının verileri siliniyor..", + "Error:": "Hata:", + "Esc": "Çıkış", + "Execute a signed Krux app?": "İmzalı bir Krux uygulaması çalıştırılsın mı?", + "Explore files?": "Dosyaları ara?", + "Exporting to SD card..": "SD karta aktarılıyor..", + "Extended Public Key": "Genişletilmiş Public Key", + "Factory Settings": "Fabrika Ayarları", + "Failed to decrypt": "Şifre çözme başarısız", + "Failed to load PSBT": "PSBT yükleme başarısız", + "Failed to load address": "Adres yükleme başarısız", + "Failed to load key": "Anahtar yükleme başarısız", + "Failed to load message": "Mesaj yükleme başarısız", + "Failed to load mnemonic": "Mnemonic yükleme başarısız", + "Failed to load output descriptor": "Çıktı tanımlayıcısı yüklemesi başarısız", + "Failed to load passphrase": "Parola yükleme başarısız", + "Failed to store mnemonic": "Mnemonic depolama başarısız", + "Fee:": "Ücret:", + "Feed Rate": "Besleme Hızı", + "Filename": "Dosya adı", + "Filename %s exists on SD card, overwrite?": "%s dosya adı SD kartta var, üzerine yazılsın mı?", + "Fill the flash with entropy from camera?": "Flash'ı kameradan gelen entropi ile doldur?", + "Filling Flash": "Flash Dolduruluyor", + "Fingerprint unset in PSBT": "PSBT'de parmak izi ayarı kaldırıldı", + "Firmware exceeds max size: %d": "Donanım yazılımı maksimum boyutu aşıyor: %d", + "Flash Map": "Flash Haritası", + "Flash Tools": "Flash Araçları", + "Flash filled with camera entropy": "Flash kamera entropisi ile dolduruldu", + "Flipped X Coordinates": "X Koordinatları Tersine Çevrildi", + "Flute Diameter": "Flute Çapı", + "Free:": "Boş:", + "From Storage": "Depolamadan Seç", + "Fully erase your SD card in another device to ensure data is unrecoverable": "Verilerin geri kullanılamaz olduğundan emin olmak için SD kartınızı başka bir cihazda tamamen silin", + "Generate Mnemonic": "Mnemonic Oluştur", + "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Bu mnemonic'e özel bir ID verilsin mi? Aksi takdirde mevcut parmak izi kullanılacaktır", + "Go": "Seç", + "Good entropy": "Yeterli entropi", + "Hardware": "Donanım", + "Hex Public Key": "Hex Public Key", + "Hexadecimal": "Onaltılık", + "Hide Mnemonics": "Mnemonic'leri Gizle", + "High fees!": "Yüksek ücret!", + "ID already exists": "ID zaten var", + "Index": "Dizin", + "Index: %s": "Dizin: %s", + "Inputs (%d):": "Girişler (%d):", + "Install?": "Yükle?", + "Insufficient Entropy!": "Yetersiz Entropi!", + "Insufficient entropy": "Yetersiz entropi", + "Invalid Tamper Check Code": "Geçersiz Kurcalama Kontrol Kodu", + "Invalid address": "Geçersiz adres", + "Invalid bootloader": "Geçersiz önyükleyici", + "Invalid mnemonic length": "Geçersiz mnemonic uzunluğu", + "Invalid public key": "Geçersiz public key", + "Invalid wallet:": "Geçersiz cüzdan:", + "Invert": "Ters Çevir", + "Inverted Colors": "Ters Renkler", + "Key": "Anahtar", + "Key was not provided": "Anahtar sağlanmadı", + "Krux Printer Test QR": "Krux Yazıcı Test QR'ı", + "LCD Type": "LCD Tipi", + "Language": "Dil", + "Leave blank if you'd like Krux to pick a valid final word": "Krux'un geçerli bir son kelime seçmesini istiyorsanız boş bırakın", + "Left": "Sol", + "Length: %s": "Uzunluk: %s", + "Line Delay": "Satır Gecikmesi", + "Line:": "Satır:", + "Load Krux app": "Krux uygulamasını yükle", + "Load Mnemonic": "Mnemonic Yükle", + "Load Wallet": "Cüzdan Yükle", + "Load a trusted wallet descriptor to view addresses?": "Adresleri görüntülemek için güvenilir bir cüzdan tanımlayıcısı yüklensin mi?", + "Load from SD card": "SD karttan yükle", + "Load from SD card?": "SD karttan yüklensin mi?", + "Load from camera": "Kameradan yükle", + "Load one?": "Bir tane mi yüklensin?", + "Load?": "Yüklensin mi?", + "Loading Camera..": "Kamera Yükleniyor..", + "Loading change addresses..": "Para üstü adresler yükleniyor..", + "Loading printer..": "Yazıcı yükleniyor..", + "Loading receive addresses..": "Alım adresler yükleniyor..", + "Loading..": "Yükleniyor..", + "Locale": "Yerel", + "Location": "Konum", + "Maximum length exceeded (%s)": "Maksimum uzunluk aşıldı (%s)", + "Message": "Mesaj", + "Message:": "Mesaj:", + "Missing signature file": "İmza dosyası eksik", + "Mnemonic": "Mnemonic", + "Mnemonic ID": "Mnemonic ID", + "Mnemonic and passphrase will be kept.": "Mnemonik ve parola tutulacaktır.", + "Mnemonic was not encrypted": "Mnemonic şifrelenmedi", + "Modified:": "Değiştirildi:", + "Multisig": "Çoklu imza", + "Native Segwit - 84 would be assumed": "Yerel Segwit - 84 varsayılacaktır", + "Network": "Ağ", + "New Mnemonic": "Yeni Mnemonic", + "New firmware detected.": "Yeni donanım yazılımı tespit edildi.", + "No": "Hayır", + "No Passphrase": "Parola Yok", + "Not enough rolls!": "Yeterli zar atışı yok!", + "Numbers": "Numaralar", + "Octal": "Sekizlik", + "Other Formats": "Diğer Formatlar", + "PBKDF2 Iter.": "PBKDF2 Yinelemesi", + "Paint punched dots black so they can be detected.": "İşaretlenmiş noktaları siyaha boyayın ki tespit edilebilsinler.", + "Paper Width": "Kağıt Genişliği", + "Part": "Parça", + "Part Size": "Parça Boyutu", + "Passphrase": "Parola", + "Password Length": "Parola Uzunluğu", + "Path mismatch": "Yol uyuşmazlığı", + "Pattern detected!": "Örüntü algılandı!", + "Permanently remove all stored encrypted mnemonics and settings from flash?": "Tüm depolanmış ve şifrelenmiş mnemonic'ler ve ayarlar flash'tan kalıcı olarak kaldırılsın mı?", + "Persist": "Kalıcı Depolama", + "Pixels deviation index:": "Piksel sapma indeksi:", + "Plaintext QR": "Düz Metin QR'ı", + "Please load a wallet output descriptor": "Lütfen bir cüzdan çıktı tanımlayıcısı yükleyin", + "Plunge Rate": "Dalış Hızı", + "Poor entropy": "Düşük entropi", + "Poor entropy detected!": "Düşük entropi tespit edildi!", + "Print Test QR": "Test QR'ını Yazdır", + "Print Tiny Seed?": "Tiny Seed Yazdırılsın mı?", + "Print to QR": "QR'a Yazdır", + "Print to QR?": "QR'a yazdırılsın mı?", + "Print?": "Yazdırılsın mı?", + "Printer": "Yazıcı", + "Printer Driver not set!": "Yazıcı Sürücüsü ayarlanmadı!", + "Printing..": "Yazdırılıyor..", + "Proceed anyway?": "Yine de devam edilsin mi?", + "Proceed?": "Devam edilsin mi?", + "Processing..": "İşleniyor..", + "QR Code": "QR Kodu", + "RX Pin": "RX Pini", + "Reboot": "Yeniden Başlat", + "Receive": "Al", + "Receive Addresses": "Adresleri Al", + "Region:": "Bölge:", + "Remove %s?": "%s kaldırılsın mı?", + "Remove Mnemonic": "Mnemonic'i Kaldır", + "Remove firmware files from SD Card?": "SD Karttan donanım yazılımı dosyaları kaldırılsın mı?", + "Res. - Format": "Çözünürlüğü Sıfırla", + "Restore factory settings and reboot?": "Fabrika ayarlarına geri dönüp ve yeniden başlatılsın mı?", + "Return to QR Viewer": "QR Görüntüleyiciye Dön", + "Review scanned data, edit if necessary": "Taranan verileri gözden geçirin, gerekirse düzenleyin", + "Right": "Sağ", + "Roll dice at least %d times to generate a mnemonic.": "Bir mnemonic oluşturmak için zarı en az %d kez atın.", + "Rolls distribution:": "Zar atış dağılımı:", + "Rolls:": "Zar atışları:", + "SD card": "SD kart", + "SD card not detected.": "SD kart algılanmadı.", + "SHA256 of rolls:": "Zar atışlarının SHA256'sı:", + "SHA256 of snapshot:": "Snapshot'ın SHA256'sı:", + "Save QR Image to SD Card": "QR Görüntüsünü SD Karta Kaydet", + "Save to SD card": "SD karta kaydet", + "Save to SD card?": "SD karta kaydedilsin mi?", + "Saved to SD card": "SD karta kaydedildi", + "Scale": "Ölçek", + "Scan Address": "Adresi Tara", + "Scan BIP39 Passphrase": "BIP39 Parolasını Tara", + "Scan Key QR Code": "Anahtar QR Kodunu Tara", + "Scanning words 1-12 again": "1-12 kelimeleri tekrar taranıyor", + "Scanning words 13-24": "13-24 kelimeleri taranıyor", + "Screensaver Time": "Ekran Koruyucu Süresi", + "Script Type": "Betik Türü", + "Security": "Güvenlik", + "Self-transfer or Change (%d):": "Kendine-transfer veya Para Üstü (%d):", + "Self-transfer:": "Kendine-transfer:", + "Set a tamper check code first": "Önce bir kurcalama kontrol kodu ayarlayın", + "Settings": "Ayarlar", + "Settings stored internally on flash.": "Ayarlar dahili olarak flaşta saklanır.", + "Settings stored on SD card.": "Ayarlar SD karta kaydedildi.", + "Shannon's Entropy:": "Shannon Entropisi:", + "Shutdown": "Kapat", + "Shutdown Time": "Kapanma Süresi", + "Shutting down..": "Kapatılıyor..", + "Sign": "İmzala", + "Sign to QR code": "QR koduna imzala", + "Sign to SD card": "SD karta imzala", + "Sign?": "İmzalansın mı?", + "Signature": "İmza", + "Signed Message": "İmzalı Mesaj", + "Signed PSBT": "İmzalı PSBT", + "Signing..": "İmzalanıyor..", + "Single-sig": "Tek-imza", + "Size:": "Boyut:", + "Some checks cannot be performed.": "Bazı kontroller yerine getirilemedi.", + "Spend (%d):": "Harcama (%d):", + "Spend:": "Harcama:", + "Stats for Nerds": "İnekler İçin İstatistikler", + "Store on Flash": "Flash'ta Sakla", + "Store on SD Card": "SD Kartta Sakla", + "Swipe to change mode": "Modu değiştirmek için kaydırın", + "TC Flash Hash": "TC Flash Hash", + "TC Flash Hash at Boot": "Önyüklemede TC Flash Hash", + "TOUCH or ENTER to capture": "Yakalamak için DOKUN veya GİR", + "TX Pin": "TX Pini", + "Tamper Check Code": "Kurcalama Kontrol Kodu", + "Tamper check code set successfully": "Kurcalama kontrol kodu başarıyla ayarlandı", + "Tamper check codes do not match": "Kurcalama kontrol kodları eşleşmiyor", + "Text": "Metin", + "Theme": "Tema", + "Thermal": "Termal", + "To ensure data is unrecoverable use Wipe Device feature": "Verilerin geri kullanılamaz olduğundan emin olmak için Cihazı Sil özelliğini kullanın", + "Toggle Brightness": "Parlaklığı Değiştir", + "Tools": "Araçlar", + "Touch Threshold": "Dokunma Eşiği", + "Touchscreen": "Dokunmatik ekran", + "Try more?": "Daha fazla kez denensin mi?", + "Type BIP39 Passphrase": "BIP39 parolasını yazın", + "Type Key": "Anahtar Yaz", + "Unit": "Birim", + "Upgrade complete.": "Güncelleme tamamlandı.", + "Use a black background surface.": "Siyah bir arka plan yüzeyi kullanın.", + "Use camera's entropy to create a new mnemonic": "Yeni bir mnemonic oluşturmak için kameranın entropisini kullanın", + "Used:": "Kullanılan:", + "User's Data": "Kullanıcı", + "Value %s out of range: [%s, %s]": "%s değeri aralık dışında: [%s, %s]", + "Value must be multiple of %s": "Değer %s'nin katı olmalıdır", + "Verifying..": "Doğrulanıyor..", + "Version": "Sürüm", + "Via Camera": "Kamera Aracılığıyla", + "Via D20": "D20 Aracılığıyla", + "Via D6": "D6 Aracılığıyla", + "Via Manual Input": "Manuel Giriş Aracılığıyla", + "Via Words": "Sözcüklerle", + "Wait for the capture": "Yakalamanın tamamlanmasını bekleyin", + "Wallet": "Cüzdan", + "Wallet Descriptor": "Cüzdan Tanımlayıcısı", + "Wallet output descriptor": "Cüzdan çıktı tanımlayıcısı", + "Wallet output descriptor loaded!": "Cüzdan çıktı tanımlayıcısı yüklendi!", + "Wallet output descriptor not found.": "Cüzdan çıktı tanımlayıcısı bulunamadı.", + "Warning:": "Uyarı:", + "Word %d": "Kelime %d", + "Word Numbers": "Kelime Numaraları", + "Words": "Kelimeler", + "Yes": "Evet", + "is a valid address!": "geçerli bir adres!", + "was NOT FOUND in the first %d addresses": "ilk %d adreste BULUNAMADI" +} \ No newline at end of file diff --git a/i18n/translations/vi-VN.json b/i18n/translations/vi-VN.json index c7b94ce21..63d689358 100644 --- a/i18n/translations/vi-VN.json +++ b/i18n/translations/vi-VN.json @@ -1 +1,322 @@ -{"% of the amount.": "% của số tiền.", "%d of %d multisig": "%d của %d đa chữ kí", "%d to %d": "%d đến %d", "%s removed.": "%s Đã bỏ.", "(%d total)": "(tổng cộng %d)", "(Experimental)": "(Thực nghiệm)", "(watch-only)": "(chỉ xem)", "12 words": "12 từ", "24 words": "24 từ", "About": "Về chúng tôi", "Accept assumption?": "Chấp nhận giả định?", "Account": "Tài khoản", "Account #0 would be assumed": "Tài khoản #0 sẽ được giả định", "Account Index": "Chỉ mục tài khoản", "Add or change wallet passphrase?": "Thêm hoặc thay đổi cụm mật khẩu ví?", "Additional entropy from camera required for AES-CBC mode": "Cần thêm entropy từ camera cho chế độ AES-CBC", "Address": "Địa chỉ", "Align camera and backup plate properly.": "Căn chỉnh camera và tấm dự phòng đúng cách.", "Allow in settings first!": "Cho phép cài đặt trước!", "Anti-glare disabled": "Chống lóa bị vô hiệu hóa", "Anti-glare enabled": "Đã bật chống lóa", "Appearance": "Giao diện", "Are you sure?": "Bạn có chắc không?", "BGR Colors": "Màu BGR", "BIP39 Mnemonic": "Từ gợi nhớ BIP39", "Back": "Trở lại", "Back to Menu": "Quay lại Menu", "Backup Mnemonic": "Sao lưu Mnemonic", "Bad signature": "Chữ ký xấu", "Base64 Password": "Mật khẩu Base64", "Baudrate": "Tốc độ baud", "Binary Grid": "Lưới nhị phân", "Border Padding": "Đệm viền", "Brightness": "Độ sáng", "Buttons": "Nút", "Buttons Debounce": "Loại bỏ nhiễu nút", "Capture cancelled": "Hủy chụp hình", "Change": "Thay đổi", "Change Addresses": "Các địa chỉ tiền thối", "Change theme and reboot?": "Thay đổi giao diện và khởi động lại?", "Change:": "Thay đổi:", "Changes will last until shutdown.": "Thay đổi sẽ kéo dài cho đến khi tắt máy.", "Check SD Card": "Kiểm tra thẻ SD", "Check that address belongs to this wallet?": "Kiểm tra địa chỉ đó có thuộc về ví này không?", "Checked %d addresses with no matches.": "Đã kiểm tra %d địa chỉ không khớp.", "Checking for SD card..": "Kiểm tra thẻ SD..", "Confirm Tamper Check Code": "Xác nhận mã kiểm tra giả mạo", "Create QR Code": "Tạo mã QR", "Create QR code from text?": "Tạo mã QR từ văn bản?", "Created:": "Tạo:", "Current Tamper Check Code": "Mã kiểm tra giả mạo hiện tại", "Custom QR Code": "Mã QR tùy chỉnh", "Customize": "Tùy chỉnh", "Customizing your wallet will generate a new Key.": "Tùy chỉnh ví của bạn sẽ tạo một Khóa mới.", "Cut Depth": "Chiều sâu cắt", "Cut Method": "Phương pháp cắt", "Decimal": "Số thập phân", "Decrypt?": "Giải mã?", "Default Wallet": "Ví mặc định", "Depth Per Pass": "Độ sâu mỗi lần cắt CNC", "Derive BIP85 entropy?": "Suy ra entropy BIP85?", "Descriptor Addresses": "Địa chỉ người mô tả", "Display": "Hiển thị", "Do not power off, it may take a while to complete.": "Không được tắt máy, có thể mất một lúc để hoàn thành.", "Done?": "Hoàn tất?", "Double mnemonic": "Từ gợi nhớ kép", "Driver": "Driver", "Empty": "Trống", "Enable Krux apps": "Bật ứng dụng Krux", "Encrypted": "Đã mã hóa", "Encrypted QR Code": "Mã QR được mã hóa", "Encrypted mnemonic was not stored": "Mnemonic được mã hóa không được lưu trữ", "Encrypted mnemonic was stored with ID:": "Mnemonic được mã hóa không được lưu trữ với ID:", "Encryption": "Mã hóa", "Encryption Mode": "Chế độ mã hóa", "Enter %d BIP-39 words.": "Nhập %d từ BIP-39.", "Enter a 6+ characters Tamper Check Code": "Nhập mã kiểm tra giả mạo gồm hơn 6 ký tự", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Nhập từng từ của Mnemonic BIP-39 của bạn dưới dạng số từ 1 đến 2048.", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số thập lục phân từ 1 đến 800.", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số bát phân từ 1 đến 4000.", "Enter each word of your BIP-39 mnemonic.": "Nhập từng từ của Mnemonic BIP-39 của bạn.", "Erase User's Data": "Xóa dữ liệu của người dùng", "Erasing user's data..": "Đang xóa dữ liệu của người dùng..", "Error:": "Lỗi:", "Esc": "Esc", "Execute a signed Krux app?": "Thực thi một ứng dụng Krux đã ký?", "Explore files?": "Khám phá các tập tin?", "Exporting to SD card..": "Xuất vào thẻ SD ..", "Extended Public Key": "Khóa công cộng", "Factory Settings": "Cài đặt Gốc", "Failed to decrypt": "Không giải mã được", "Failed to load PSBT": "Tải PSBT thất bại", "Failed to load address": "Tải địa chỉ thất bại", "Failed to load key": "Không tải được khóa", "Failed to load message": "Không tải được tin nhắn", "Failed to load mnemonic": "Tải mã Mnemonic thất bại", "Failed to load output descriptor": "Không tải được bộ mô tả đầu ra", "Failed to load passphrase": "Không tải được cụm mật khẩu", "Failed to store mnemonic": "Không lưu trữ Mnemonic được", "Fee:": "Phí:", "Feed Rate": "Tốc độ cắt CNC", "Filename": "Tên tệp", "Filename %s exists on SD card, overwrite?": "Tên tệp %s tồn tại trên thẻ SD, ghi đè lên?", "Fill the flash with entropy from camera?": "Điền vào flash với entropy từ máy ảnh?", "Filling Flash": "Đèn Flash Đổ Đầy", "Fingerprint unset in PSBT": "Bỏ dấu vân tay trong PSBT", "Firmware exceeds max size: %d": "Phần mềm vượt quá kích thước tối đa: %d", "Flash Map": "Bản đồ Flash", "Flash Tools": "Công cụ Flash", "Flash filled with camera entropy": "Đèn flash chứa đầy entropy của máy ảnh", "Flipped X Coordinates": "Tọa độ X bị lật", "Flute Diameter": "Đường kính mũi cắt CNC", "Free:": "Khả dụng:", "From Storage": "Từ bộ lưu trữ", "Fully erase your SD card in another device to ensure data is unrecoverable": "Xóa hoàn toàn thẻ SD trong một thiết bị khác để đảm bảo dữ liệu không thể phục hồi", "Generate Mnemonic": "Tạo Mnemonic", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Cung cấp cho Mnemonic này một ID tùy chỉnh? Nếu không thì fingerprint hiện tại sẽ được sử dụng", "Go": "Chọn", "Good entropy": "Entropy tốt", "Hardware": "Phần cứng", "Hex Public Key": "Khóa công cộng Hex", "Hexadecimal": "Thập lục phân", "Hide Mnemonics": "Ẩn Mnemonics", "High fees!": "Phí cao!", "ID already exists": "Id đã tồn tại", "Index": "Chỉ mục", "Index: %s": "Chỉ mục: %s", "Inputs (%d):": "Đầu vào (%d):", "Install?": "Cài đặt phần mềm?", "Insufficient Entropy!": "Entropy không đủ!", "Insufficient entropy": "Không đủ entropy", "Invalid Tamper Check Code": "Mã kiểm tra giả mạo không hợp lệ", "Invalid address": "Địa chỉ không hợp lệ", "Invalid bootloader": "Bộ tải khởi động không hợp lệ", "Invalid mnemonic length": "Độ dài mã Mnemonic không hợp lệ", "Invalid public key": "Khóa công cộng không hợp lệ", "Invalid wallet:": "Ví không hợp lệ:", "Invert": "Đảo ngược", "Inverted Colors": "Màu đảo ngược", "Key": "Chìa khóa", "Key was not provided": "Khóa không được cung cấp", "Krux Printer Test QR": "QR kiểm tra máy in Krux", "LCD Type": "Loại LCD", "Language": "Ngôn ngữ", "Leave blank if you'd like Krux to pick a valid final word": "Để trống nếu bạn muốn Krux chọn một từ cuối cùng hợp lệ", "Left": "Trái", "Length: %s": "Độ dài: %s", "Line Delay": "Độ trễ Dòng", "Line:": "Đường kẻ:", "Load Krux app": "Tải ứng dụng Krux", "Load Mnemonic": "Tải mã mnemonic", "Load Wallet": "Nạp Ví", "Load a trusted wallet descriptor to view addresses?": "Tải mô tả ví đáng tin cậy để xem địa chỉ?", "Load from SD card": "Tải từ thẻ SD", "Load from SD card?": "Tải từ thẻ SD?", "Load from camera": "Tải từ máy ảnh", "Load one?": "Tải một?", "Load?": "Tải?", "Loading Camera..": "Đang tải máy ảnh..", "Loading change addresses..": "Đang tải địa chỉ tiền thối..", "Loading printer..": "Đang tải máy in ..", "Loading receive addresses..": "Đang tải địa chỉ nhận..", "Loading..": "Đang tải..", "Locale": "Ngôn ngữ", "Location": "Vị trí lưu", "Maximum length exceeded (%s)": "Chiều dài tối đa vượt quá (%s)", "Message": "Tin nhắn", "Message:": "Tin nhắn:", "Missing signature file": "Thiếu tập tin chữ ký", "Mnemonic": "Mã mnemonic", "Mnemonic ID": "Mnemonic ID ", "Mnemonic and passphrase will be kept.": "Từ gợi nhớ và cụm mật khẩu sẽ được lưu giữ.", "Mnemonic was not encrypted": "Mnemonic không được mã hóa", "Modified:": "Đã sửa đổi:", "Multisig": "Đa chữ kí", "Native Segwit - 84 would be assumed": "Native Segwit - 84 sẽ được giả định", "Network": "Mạng lưới", "New Mnemonic": "Mnemonic mới", "New firmware detected.": "Phát hiện phần sụn mới.", "No": "Không", "No Passphrase": "Không có cụm mật khẩu", "Not enough rolls!": "Không đủ số lần quay!", "Numbers": "Số", "Octal": "Bát phân", "Other Formats": "Các định dạng khác", "PBKDF2 Iter.": "Lặp lại PBKDF2", "Paint punched dots black so they can be detected.": "Tô các chấm đục lỗ màu đen để chúng có thể được phát hiện.", "Paper Width": "Chiều rộng giấy", "Part": "Phần", "Part Size": "Kích thước một phần", "Passphrase": "Cụm mật khẩu", "Password Length": "Độ dài mật khẩu tối thiểu:", "Path mismatch": "Đường dẫn không khớp", "Pattern detected!": "Đã phát hiện mẫu!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "Xóa vĩnh viễn mọi Mnemonics và cài đặt được mã hóa lưu trữ trong flash?", "Persist": "Vị trí lưu", "Pixels deviation index:": "Chỉ số độ lệch điểm ảnh:", "Plaintext QR": "QR dạng văn bản", "Please load a wallet output descriptor": "Vui lòng tải bộ mô tả đầu ra ví", "Plunge Rate": "Tỷ lệ sụt giảm", "Poor entropy": "Entropy kém", "Poor entropy detected!": "Phát hiện entropy yếu!", "Print Test QR": "In kiểm tra QR", "Print Tiny Seed?": "In Tiny Seed?", "Print to QR": "In ra QR", "Print to QR?": "In ra mã QR?", "Print?": "In?", "Printer": "Máy in", "Printer Driver not set!": "Trình điều khiển máy in chưa được cài đặt!", "Printing..": "Đang in..", "Proceed anyway?": "Vẫn tiếp tục?", "Proceed?": "Thực hiện?", "Processing..": "Đang xử lý..", "QR Code": "Mã QR", "RX Pin": "RX Pin", "Reboot": "Khởi động lại", "Receive": "Nhận được", "Receive Addresses": "Các địa chỉ nhận", "Region:": "Vùng:", "Remove %s?": "Xóa %s?", "Remove Mnemonic": "Xóa Mnemonic", "Remove firmware files from SD Card?": "Xóa các tệp firmware khỏi Thẻ SD?", "Res. - Format": "Độ phân giải - Định dạng", "Restore factory settings and reboot?": "Khôi phục cài đặt gốc và khởi động lại?", "Return to QR Viewer": "Quay lại Trình xem QR", "Review scanned data, edit if necessary": "Xem lại dữ liệu đã quét, chỉnh sửa nếu cần", "Right": "Phải", "Roll dice at least %d times to generate a mnemonic.": "Lăn xúc xắc ít nhất %d lần để tạo Mnemonic.", "Rolls distribution:": "Phân bổ xúc xắc:", "Rolls:": "Tổng số lần quay xúc xắc:", "SD card": "Thẻ SD", "SD card not detected.": "Thẻ SD không được phát hiện.", "SHA256 of rolls:": "SHA256 của xúc xắc:", "SHA256 of snapshot:": "Sha256 của ảnh chụp:", "Save QR Image to SD Card": "Lưu Ảnh QR vào Thẻ SD", "Save to SD card": "Lưu vào thẻ SD", "Save to SD card?": "Lưu vào thẻ SD?", "Saved to SD card": "Đã lưu vào thẻ SD", "Scale": "Tỉ lệ", "Scan Address": "Quét địa chỉ", "Scan BIP39 Passphrase": "Quét cụm mật khẩu BIP39", "Scan Key QR Code": "Quét mã QR khóa", "Scanning words 1-12 again": "Đang quét lại từ 1-12", "Scanning words 13-24": "Đang quét từ 13-24", "Screensaver Time": "Thời gian chế độ bảo vệ màn hình", "Script Type": "Kiểu văn lệnh", "Security": "Bảo mật", "Self-transfer or Change (%d):": "Tự chuyển nhượng hoặc giao dịch (%d):", "Self-transfer:": "Tự chuyển nhượng:", "Set a tamper check code first": "Đặt mã kiểm tra giả mạo trước", "Settings": "Cài đặt", "Settings stored internally on flash.": "Cài đặt được lưu trữ nội bộ trên đèn flash.", "Settings stored on SD card.": "Cài đặt được lưu trên thẻ SD.", "Shannon's Entropy:": "Entropy của Shannon:", "Shutdown": "Tắt máy", "Shutdown Time": "Thời gian tắt máy", "Shutting down..": "Đang tắt..", "Sign": "Chữ kí", "Sign to QR code": "Ký vào mã QR", "Sign to SD card": "Ký vào thẻ SD", "Sign?": "Kí?", "Signature": "Chữ ký", "Signed Message": "Tin nhắn đã ký", "Signed PSBT": "Đã ký PSBT", "Signing..": "Đang ký..", "Single-sig": "Khóa đơn", "Size:": "Dung lượng:", "Some checks cannot be performed.": "Một số kiểm tra không thể được thực hiện.", "Spend (%d):": "Chi tiêu (%d):", "Spend:": "Chi tiêu:", "Stats for Nerds": "Số liệu thống kê cho Mọt sách", "Store on Flash": "Lưu trữ trên flash", "Store on SD Card": "Lưu trữ trên thẻ SD", "Swipe to change mode": "Vuốt để thay đổi chế độ", "TC Flash Hash": "TC Flash Hash", "TC Flash Hash at Boot": "Hash Flash TC khi khởi động", "TOUCH or ENTER to capture": "Chạm màn hình hoặc nhấn nút ENTER để chụp", "TX Pin": "TX Pin", "Tamper Check Code": "Mã kiểm tra giả mạo", "Tamper check code set successfully": "Đã đặt mã kiểm tra giả mạo thành công", "Tamper check codes do not match": "Mã kiểm tra giả mạo không khớp", "Text": "Chữ", "Theme": "Chủ đề", "Thermal": "Nhiệt", "To ensure data is unrecoverable use Wipe Device feature": "Sử dụng tính năng Xóa dữ liệu trên thiết bị để đảm bảo dữ liệu không thể phục hồi", "Toggle Brightness": "Chuyển đổi độ sáng", "Tools": "Công cụ", "Touch Threshold": "Ngưỡng cảm ứng", "Touchscreen": "Màn hình cảm ứng", "Try more?": "Thử thêm nữa?", "Type BIP39 Passphrase": "Nhập cụm mật khẩu BIP39", "Type Key": "Nhập khóa", "Unit": "Đơn vị", "Upgrade complete.": "Nâng cấp hoàn tất.", "Use a black background surface.": "Sử dụng bề mặt nền đen.", "Use camera's entropy to create a new mnemonic": "Sử dụng sự ngẫu nhiên của máy ảnh để tạo ra một Mnemonic mới", "Used:": "Đã sử dụng:", "User's Data": "Người dùng", "Value %s out of range: [%s, %s]": "Giá trị %s ngoài phạm vi: [ %s, %s]", "Value must be multiple of %s": "Giá trị phải là bội của %s", "Verifying..": "Đang xác minh..", "Version": "Phiên Bản", "Via Camera": "Qua máy ảnh", "Via D20": "Qua xúc xắc 20 mặt", "Via D6": "Qua xúc xắc 6 mặt", "Via Manual Input": "Thông qua đầu vào thủ công", "Via Words": "Thông qua từ ngữ", "Wait for the capture": "Chờ bắt", "Wallet": "Ví", "Wallet Descriptor": "Trình mô tả ví", "Wallet output descriptor": "Ví đầu ra mô tả", "Wallet output descriptor loaded!": "Đã tải bộ mô tả đầu ra của ví!", "Wallet output descriptor not found.": "Không tìm thấy bộ mô tả đầu ra ví.", "Warning:": "Cảnh báo:", "Word %d": "Kí tự %d", "Word Numbers": "Từ số", "Words": "Từ ngữ", "Yes": "Đúng", "is a valid address!": "là một địa chỉ hợp lệ!", "was NOT FOUND in the first %d addresses": "kHÔNG TÌM THẤY trong %d địa chỉ đầu tiên"} \ No newline at end of file +{ + "% of the amount.": "% của số tiền.", + "%d of %d multisig": "%d của %d đa chữ kí", + "%d to %d": "%d đến %d", + "%s removed.": "%s Đã bỏ.", + "(%d total)": "(tổng cộng %d)", + "(Experimental)": "(Thực nghiệm)", + "(watch-only)": "(chỉ xem)", + "12 words": "12 từ", + "24 words": "24 từ", + "About": "Về chúng tôi", + "Accept assumption?": "Chấp nhận giả định?", + "Account": "Tài khoản", + "Account #0 would be assumed": "Tài khoản #0 sẽ được giả định", + "Account Index": "Chỉ mục tài khoản", + "Add or change wallet passphrase?": "Thêm hoặc thay đổi cụm mật khẩu ví?", + "Additional entropy from camera required for AES-CBC mode": "Cần thêm entropy từ camera cho chế độ AES-CBC", + "Address": "Địa chỉ", + "Align camera and backup plate properly.": "Căn chỉnh camera và tấm dự phòng đúng cách.", + "Allow in settings first!": "Cho phép cài đặt trước!", + "Anti-glare disabled": "Chống lóa bị vô hiệu hóa", + "Anti-glare enabled": "Đã bật chống lóa", + "Appearance": "Giao diện", + "Are you sure?": "Bạn có chắc không?", + "BGR Colors": "Màu BGR", + "BIP39 Mnemonic": "Từ gợi nhớ BIP39", + "Back": "Trở lại", + "Back to Menu": "Quay lại Menu", + "Backup Mnemonic": "Sao lưu Mnemonic", + "Bad signature": "Chữ ký xấu", + "Base64 Password": "Mật khẩu Base64", + "Baudrate": "Tốc độ baud", + "Binary Grid": "Lưới nhị phân", + "Border Padding": "Đệm viền", + "Brightness": "Độ sáng", + "Buttons": "Nút", + "Buttons Debounce": "Loại bỏ nhiễu nút", + "Capture cancelled": "Hủy chụp hình", + "Change": "Thay đổi", + "Change Addresses": "Các địa chỉ tiền thối", + "Change theme and reboot?": "Thay đổi giao diện và khởi động lại?", + "Change:": "Thay đổi:", + "Changes will last until shutdown.": "Thay đổi sẽ kéo dài cho đến khi tắt máy.", + "Check SD Card": "Kiểm tra thẻ SD", + "Check that address belongs to this wallet?": "Kiểm tra địa chỉ đó có thuộc về ví này không?", + "Checked %d addresses with no matches.": "Đã kiểm tra %d địa chỉ không khớp.", + "Checking for SD card..": "Kiểm tra thẻ SD..", + "Confirm Tamper Check Code": "Xác nhận mã kiểm tra giả mạo", + "Create QR Code": "Tạo mã QR", + "Create QR code from text?": "Tạo mã QR từ văn bản?", + "Created:": "Tạo:", + "Current Tamper Check Code": "Mã kiểm tra giả mạo hiện tại", + "Custom QR Code": "Mã QR tùy chỉnh", + "Customize": "Tùy chỉnh", + "Customizing your wallet will generate a new Key.": "Tùy chỉnh ví của bạn sẽ tạo một Khóa mới.", + "Cut Depth": "Chiều sâu cắt", + "Cut Method": "Phương pháp cắt", + "Decimal": "Số thập phân", + "Decrypt?": "Giải mã?", + "Default Wallet": "Ví mặc định", + "Depth Per Pass": "Độ sâu mỗi lần cắt CNC", + "Derive BIP85 entropy?": "Suy ra entropy BIP85?", + "Descriptor Addresses": "Địa chỉ người mô tả", + "Display": "Hiển thị", + "Do not power off, it may take a while to complete.": "Không được tắt máy, có thể mất một lúc để hoàn thành.", + "Done?": "Hoàn tất?", + "Double mnemonic": "Từ gợi nhớ kép", + "Driver": "Driver", + "Empty": "Trống", + "Enable Krux apps": "Bật ứng dụng Krux", + "Encrypted": "Đã mã hóa", + "Encrypted QR Code": "Mã QR được mã hóa", + "Encrypted mnemonic was not stored": "Mnemonic được mã hóa không được lưu trữ", + "Encrypted mnemonic was stored with ID:": "Mnemonic được mã hóa không được lưu trữ với ID:", + "Encryption": "Mã hóa", + "Encryption Mode": "Chế độ mã hóa", + "Enter %d BIP-39 words.": "Nhập %d từ BIP-39.", + "Enter a 6+ characters Tamper Check Code": "Nhập mã kiểm tra giả mạo gồm hơn 6 ký tự", + "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "Nhập từng từ của Mnemonic BIP-39 của bạn dưới dạng số từ 1 đến 2048.", + "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số thập lục phân từ 1 đến 800.", + "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số bát phân từ 1 đến 4000.", + "Enter each word of your BIP-39 mnemonic.": "Nhập từng từ của Mnemonic BIP-39 của bạn.", + "Erase User's Data": "Xóa dữ liệu của người dùng", + "Erasing user's data..": "Đang xóa dữ liệu của người dùng..", + "Error:": "Lỗi:", + "Esc": "Esc", + "Execute a signed Krux app?": "Thực thi một ứng dụng Krux đã ký?", + "Explore files?": "Khám phá các tập tin?", + "Exporting to SD card..": "Xuất vào thẻ SD ..", + "Extended Public Key": "Khóa công cộng", + "Factory Settings": "Cài đặt Gốc", + "Failed to decrypt": "Không giải mã được", + "Failed to load PSBT": "Tải PSBT thất bại", + "Failed to load address": "Tải địa chỉ thất bại", + "Failed to load key": "Không tải được khóa", + "Failed to load message": "Không tải được tin nhắn", + "Failed to load mnemonic": "Tải mã Mnemonic thất bại", + "Failed to load output descriptor": "Không tải được bộ mô tả đầu ra", + "Failed to load passphrase": "Không tải được cụm mật khẩu", + "Failed to store mnemonic": "Không lưu trữ Mnemonic được", + "Fee:": "Phí:", + "Feed Rate": "Tốc độ cắt CNC", + "Filename": "Tên tệp", + "Filename %s exists on SD card, overwrite?": "Tên tệp %s tồn tại trên thẻ SD, ghi đè lên?", + "Fill the flash with entropy from camera?": "Điền vào flash với entropy từ máy ảnh?", + "Filling Flash": "Đèn Flash Đổ Đầy", + "Fingerprint unset in PSBT": "Bỏ dấu vân tay trong PSBT", + "Firmware exceeds max size: %d": "Phần mềm vượt quá kích thước tối đa: %d", + "Flash Map": "Bản đồ Flash", + "Flash Tools": "Công cụ Flash", + "Flash filled with camera entropy": "Đèn flash chứa đầy entropy của máy ảnh", + "Flipped X Coordinates": "Tọa độ X bị lật", + "Flute Diameter": "Đường kính mũi cắt CNC", + "Free:": "Khả dụng:", + "From Storage": "Từ bộ lưu trữ", + "Fully erase your SD card in another device to ensure data is unrecoverable": "Xóa hoàn toàn thẻ SD trong một thiết bị khác để đảm bảo dữ liệu không thể phục hồi", + "Generate Mnemonic": "Tạo Mnemonic", + "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "Cung cấp cho Mnemonic này một ID tùy chỉnh? Nếu không thì fingerprint hiện tại sẽ được sử dụng", + "Go": "Chọn", + "Good entropy": "Entropy tốt", + "Hardware": "Phần cứng", + "Hex Public Key": "Khóa công cộng Hex", + "Hexadecimal": "Thập lục phân", + "Hide Mnemonics": "Ẩn Mnemonics", + "High fees!": "Phí cao!", + "ID already exists": "Id đã tồn tại", + "Index": "Chỉ mục", + "Index: %s": "Chỉ mục: %s", + "Inputs (%d):": "Đầu vào (%d):", + "Install?": "Cài đặt phần mềm?", + "Insufficient Entropy!": "Entropy không đủ!", + "Insufficient entropy": "Không đủ entropy", + "Invalid Tamper Check Code": "Mã kiểm tra giả mạo không hợp lệ", + "Invalid address": "Địa chỉ không hợp lệ", + "Invalid bootloader": "Bộ tải khởi động không hợp lệ", + "Invalid mnemonic length": "Độ dài mã Mnemonic không hợp lệ", + "Invalid public key": "Khóa công cộng không hợp lệ", + "Invalid wallet:": "Ví không hợp lệ:", + "Invert": "Đảo ngược", + "Inverted Colors": "Màu đảo ngược", + "Key": "Chìa khóa", + "Key was not provided": "Khóa không được cung cấp", + "Krux Printer Test QR": "QR kiểm tra máy in Krux", + "LCD Type": "Loại LCD", + "Language": "Ngôn ngữ", + "Leave blank if you'd like Krux to pick a valid final word": "Để trống nếu bạn muốn Krux chọn một từ cuối cùng hợp lệ", + "Left": "Trái", + "Length: %s": "Độ dài: %s", + "Line Delay": "Độ trễ Dòng", + "Line:": "Đường kẻ:", + "Load Krux app": "Tải ứng dụng Krux", + "Load Mnemonic": "Tải mã mnemonic", + "Load Wallet": "Nạp Ví", + "Load a trusted wallet descriptor to view addresses?": "Tải mô tả ví đáng tin cậy để xem địa chỉ?", + "Load from SD card": "Tải từ thẻ SD", + "Load from SD card?": "Tải từ thẻ SD?", + "Load from camera": "Tải từ máy ảnh", + "Load one?": "Tải một?", + "Load?": "Tải?", + "Loading Camera..": "Đang tải máy ảnh..", + "Loading change addresses..": "Đang tải địa chỉ tiền thối..", + "Loading printer..": "Đang tải máy in ..", + "Loading receive addresses..": "Đang tải địa chỉ nhận..", + "Loading..": "Đang tải..", + "Locale": "Ngôn ngữ", + "Location": "Vị trí lưu", + "Maximum length exceeded (%s)": "Chiều dài tối đa vượt quá (%s)", + "Message": "Tin nhắn", + "Message:": "Tin nhắn:", + "Missing signature file": "Thiếu tập tin chữ ký", + "Mnemonic": "Mã mnemonic", + "Mnemonic ID": "Mnemonic ID ", + "Mnemonic and passphrase will be kept.": "Từ gợi nhớ và cụm mật khẩu sẽ được lưu giữ.", + "Mnemonic was not encrypted": "Mnemonic không được mã hóa", + "Modified:": "Đã sửa đổi:", + "Multisig": "Đa chữ kí", + "Native Segwit - 84 would be assumed": "Native Segwit - 84 sẽ được giả định", + "Network": "Mạng lưới", + "New Mnemonic": "Mnemonic mới", + "New firmware detected.": "Phát hiện phần sụn mới.", + "No": "Không", + "No Passphrase": "Không có cụm mật khẩu", + "Not enough rolls!": "Không đủ số lần quay!", + "Numbers": "Số", + "Octal": "Bát phân", + "Other Formats": "Các định dạng khác", + "PBKDF2 Iter.": "Lặp lại PBKDF2", + "Paint punched dots black so they can be detected.": "Tô các chấm đục lỗ màu đen để chúng có thể được phát hiện.", + "Paper Width": "Chiều rộng giấy", + "Part": "Phần", + "Part Size": "Kích thước một phần", + "Passphrase": "Cụm mật khẩu", + "Password Length": "Độ dài mật khẩu tối thiểu:", + "Path mismatch": "Đường dẫn không khớp", + "Pattern detected!": "Đã phát hiện mẫu!", + "Permanently remove all stored encrypted mnemonics and settings from flash?": "Xóa vĩnh viễn mọi Mnemonics và cài đặt được mã hóa lưu trữ trong flash?", + "Persist": "Vị trí lưu", + "Pixels deviation index:": "Chỉ số độ lệch điểm ảnh:", + "Plaintext QR": "QR dạng văn bản", + "Please load a wallet output descriptor": "Vui lòng tải bộ mô tả đầu ra ví", + "Plunge Rate": "Tỷ lệ sụt giảm", + "Poor entropy": "Entropy kém", + "Poor entropy detected!": "Phát hiện entropy yếu!", + "Print Test QR": "In kiểm tra QR", + "Print Tiny Seed?": "In Tiny Seed?", + "Print to QR": "In ra QR", + "Print to QR?": "In ra mã QR?", + "Print?": "In?", + "Printer": "Máy in", + "Printer Driver not set!": "Trình điều khiển máy in chưa được cài đặt!", + "Printing..": "Đang in..", + "Proceed anyway?": "Vẫn tiếp tục?", + "Proceed?": "Thực hiện?", + "Processing..": "Đang xử lý..", + "QR Code": "Mã QR", + "RX Pin": "RX Pin", + "Reboot": "Khởi động lại", + "Receive": "Nhận được", + "Receive Addresses": "Các địa chỉ nhận", + "Region:": "Vùng:", + "Remove %s?": "Xóa %s?", + "Remove Mnemonic": "Xóa Mnemonic", + "Remove firmware files from SD Card?": "Xóa các tệp firmware khỏi Thẻ SD?", + "Res. - Format": "Độ phân giải - Định dạng", + "Restore factory settings and reboot?": "Khôi phục cài đặt gốc và khởi động lại?", + "Return to QR Viewer": "Quay lại Trình xem QR", + "Review scanned data, edit if necessary": "Xem lại dữ liệu đã quét, chỉnh sửa nếu cần", + "Right": "Phải", + "Roll dice at least %d times to generate a mnemonic.": "Lăn xúc xắc ít nhất %d lần để tạo Mnemonic.", + "Rolls distribution:": "Phân bổ xúc xắc:", + "Rolls:": "Tổng số lần quay xúc xắc:", + "SD card": "Thẻ SD", + "SD card not detected.": "Thẻ SD không được phát hiện.", + "SHA256 of rolls:": "SHA256 của xúc xắc:", + "SHA256 of snapshot:": "Sha256 của ảnh chụp:", + "Save QR Image to SD Card": "Lưu Ảnh QR vào Thẻ SD", + "Save to SD card": "Lưu vào thẻ SD", + "Save to SD card?": "Lưu vào thẻ SD?", + "Saved to SD card": "Đã lưu vào thẻ SD", + "Scale": "Tỉ lệ", + "Scan Address": "Quét địa chỉ", + "Scan BIP39 Passphrase": "Quét cụm mật khẩu BIP39", + "Scan Key QR Code": "Quét mã QR khóa", + "Scanning words 1-12 again": "Đang quét lại từ 1-12", + "Scanning words 13-24": "Đang quét từ 13-24", + "Screensaver Time": "Thời gian chế độ bảo vệ màn hình", + "Script Type": "Kiểu văn lệnh", + "Security": "Bảo mật", + "Self-transfer or Change (%d):": "Tự chuyển nhượng hoặc giao dịch (%d):", + "Self-transfer:": "Tự chuyển nhượng:", + "Set a tamper check code first": "Đặt mã kiểm tra giả mạo trước", + "Settings": "Cài đặt", + "Settings stored internally on flash.": "Cài đặt được lưu trữ nội bộ trên đèn flash.", + "Settings stored on SD card.": "Cài đặt được lưu trên thẻ SD.", + "Shannon's Entropy:": "Entropy của Shannon:", + "Shutdown": "Tắt máy", + "Shutdown Time": "Thời gian tắt máy", + "Shutting down..": "Đang tắt..", + "Sign": "Chữ kí", + "Sign to QR code": "Ký vào mã QR", + "Sign to SD card": "Ký vào thẻ SD", + "Sign?": "Kí?", + "Signature": "Chữ ký", + "Signed Message": "Tin nhắn đã ký", + "Signed PSBT": "Đã ký PSBT", + "Signing..": "Đang ký..", + "Single-sig": "Khóa đơn", + "Size:": "Dung lượng:", + "Some checks cannot be performed.": "Một số kiểm tra không thể được thực hiện.", + "Spend (%d):": "Chi tiêu (%d):", + "Spend:": "Chi tiêu:", + "Stats for Nerds": "Số liệu thống kê cho Mọt sách", + "Store on Flash": "Lưu trữ trên flash", + "Store on SD Card": "Lưu trữ trên thẻ SD", + "Swipe to change mode": "Vuốt để thay đổi chế độ", + "TC Flash Hash": "TC Flash Hash", + "TC Flash Hash at Boot": "Hash Flash TC khi khởi động", + "TOUCH or ENTER to capture": "Chạm màn hình hoặc nhấn nút ENTER để chụp", + "TX Pin": "TX Pin", + "Tamper Check Code": "Mã kiểm tra giả mạo", + "Tamper check code set successfully": "Đã đặt mã kiểm tra giả mạo thành công", + "Tamper check codes do not match": "Mã kiểm tra giả mạo không khớp", + "Text": "Chữ", + "Theme": "Chủ đề", + "Thermal": "Nhiệt", + "To ensure data is unrecoverable use Wipe Device feature": "Sử dụng tính năng Xóa dữ liệu trên thiết bị để đảm bảo dữ liệu không thể phục hồi", + "Toggle Brightness": "Chuyển đổi độ sáng", + "Tools": "Công cụ", + "Touch Threshold": "Ngưỡng cảm ứng", + "Touchscreen": "Màn hình cảm ứng", + "Try more?": "Thử thêm nữa?", + "Type BIP39 Passphrase": "Nhập cụm mật khẩu BIP39", + "Type Key": "Nhập khóa", + "Unit": "Đơn vị", + "Upgrade complete.": "Nâng cấp hoàn tất.", + "Use a black background surface.": "Sử dụng bề mặt nền đen.", + "Use camera's entropy to create a new mnemonic": "Sử dụng sự ngẫu nhiên của máy ảnh để tạo ra một Mnemonic mới", + "Used:": "Đã sử dụng:", + "User's Data": "Người dùng", + "Value %s out of range: [%s, %s]": "Giá trị %s ngoài phạm vi: [ %s, %s]", + "Value must be multiple of %s": "Giá trị phải là bội của %s", + "Verifying..": "Đang xác minh..", + "Version": "Phiên Bản", + "Via Camera": "Qua máy ảnh", + "Via D20": "Qua xúc xắc 20 mặt", + "Via D6": "Qua xúc xắc 6 mặt", + "Via Manual Input": "Thông qua đầu vào thủ công", + "Via Words": "Thông qua từ ngữ", + "Wait for the capture": "Chờ bắt", + "Wallet": "Ví", + "Wallet Descriptor": "Trình mô tả ví", + "Wallet output descriptor": "Ví đầu ra mô tả", + "Wallet output descriptor loaded!": "Đã tải bộ mô tả đầu ra của ví!", + "Wallet output descriptor not found.": "Không tìm thấy bộ mô tả đầu ra ví.", + "Warning:": "Cảnh báo:", + "Word %d": "Kí tự %d", + "Word Numbers": "Từ số", + "Words": "Từ ngữ", + "Yes": "Đúng", + "is a valid address!": "là một địa chỉ hợp lệ!", + "was NOT FOUND in the first %d addresses": "kHÔNG TÌM THẤY trong %d địa chỉ đầu tiên" +} \ No newline at end of file diff --git a/i18n/translations/zh-CN.json b/i18n/translations/zh-CN.json index a4fe7550e..e5502512e 100644 --- a/i18n/translations/zh-CN.json +++ b/i18n/translations/zh-CN.json @@ -1 +1,322 @@ -{"% of the amount.": "% 的金额。", "%d of %d multisig": "%d/%d 多签", "%d to %d": "%d到%d", "%s removed.": "已移除%s", "(%d total)": "(总计 %d)", "(Experimental)": "(实验性)", "(watch-only)": "(仅观察)", "12 words": "12 单词", "24 words": "24 单词", "About": "关于", "Accept assumption?": "接受假设?", "Account": "账户", "Account #0 would be assumed": "将假定为账户 #0", "Account Index": "账户索引", "Add or change wallet passphrase?": "添加或更改钱包密码?", "Additional entropy from camera required for AES-CBC mode": "AES-CBC 模式需要相机的额外熵", "Address": "地址", "Align camera and backup plate properly.": "正确对齐摄像头和背板。", "Allow in settings first!": "首先在设置中允许!", "Anti-glare disabled": "防眩光已禁用", "Anti-glare enabled": "防眩光已启用", "Appearance": "界面", "Are you sure?": "确定?", "BGR Colors": "BGR 颜色", "BIP39 Mnemonic": "BIP39助记符", "Back": "返回", "Back to Menu": "返回菜单", "Backup Mnemonic": "备份助记词", "Bad signature": "签名无效", "Base64 Password": "Base64密码", "Baudrate": "波特率", "Binary Grid": "二进制网格", "Border Padding": "边框填充", "Brightness": "亮度", "Buttons": "按钮", "Buttons Debounce": "按钮去抖动", "Capture cancelled": "截取已取消", "Change": "找零", "Change Addresses": "找零地址", "Change theme and reboot?": "更改主题并重新启动?", "Change:": "找零", "Changes will last until shutdown.": "更改将在关机前保持。", "Check SD Card": "检查 SD 卡", "Check that address belongs to this wallet?": "检查该地址是否属于此钱包?", "Checked %d addresses with no matches.": "已检查 %d 个不匹配的地址。", "Checking for SD card..": "检查 SD 卡..", "Confirm Tamper Check Code": "确认防篡改检查码", "Create QR Code": "创建二维码", "Create QR code from text?": "从文本创建二维码?", "Created:": "已创建:", "Current Tamper Check Code": "当前防篡改检查码", "Custom QR Code": "自定义二维码", "Customize": "自定义", "Customizing your wallet will generate a new Key.": "自定义您的钱包将生成新私钥。", "Cut Depth": "切割深度", "Cut Method": "切割方法", "Decimal": "十进制", "Decrypt?": "解密?", "Default Wallet": "默认钱包", "Depth Per Pass": "每次通过的深度", "Derive BIP85 entropy?": "导出BIP85熵?", "Descriptor Addresses": "描述符地址", "Display": "显示", "Do not power off, it may take a while to complete.": "请勿断电,可能需要一段时间完成。", "Done?": "完成了吗?", "Double mnemonic": "双重助记词", "Driver": "驱动程序", "Empty": "为空", "Enable Krux apps": "启用Krux应用程序", "Encrypted": "已加密", "Encrypted QR Code": "加密二维码", "Encrypted mnemonic was not stored": "加密助记词未存储", "Encrypted mnemonic was stored with ID:": "加密助记词已存储,ID 为:", "Encryption": "加密", "Encryption Mode": "加密模式", "Enter %d BIP-39 words.": "输入 %d 个 BIP-39 词。", "Enter a 6+ characters Tamper Check Code": "输入6个以上字符的防篡改检查码", "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "将 BIP-39 助记词的每个词作为 1 到 2048 的数字输入。", "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "将 BIP-39 助记词的每个词作为 1 到 800 的十六进制数输入。", "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "将 BIP-39 助记词的每个词作为 1 到 4000 的八进制数输入。", "Enter each word of your BIP-39 mnemonic.": "输入每个 BIP-39 助记词。", "Erase User's Data": "清除用户数据", "Erasing user's data..": "正在擦除用户数据..", "Error:": "错误:", "Esc": "退出", "Execute a signed Krux app?": "是否执行签名的Krux应用程序?", "Explore files?": "浏览文件?", "Exporting to SD card..": "导出到 SD 卡..", "Extended Public Key": "扩展公钥", "Factory Settings": "出厂设置", "Failed to decrypt": "解密失败", "Failed to load PSBT": "加载 PSBT 失败", "Failed to load address": "加载地址失败", "Failed to load key": "加载密钥失败", "Failed to load message": "加载消息失败", "Failed to load mnemonic": "加载助记词失败", "Failed to load output descriptor": "加载输出描述符失败", "Failed to load passphrase": "加载密码失败", "Failed to store mnemonic": "存储助记词失败", "Fee:": "费用:", "Feed Rate": "进给速度", "Filename": "文件名", "Filename %s exists on SD card, overwrite?": "文件名 %s 存在于 SD 卡上,覆盖?", "Fill the flash with entropy from camera?": "用摄像头的熵填充Flash?", "Filling Flash": "填充Flash", "Fingerprint unset in PSBT": "PSBT 中未设置指纹", "Firmware exceeds max size: %d": "固件超过最大尺寸:%d", "Flash Map": "Flash地图", "Flash Tools": "Flash工具", "Flash filled with camera entropy": "Flash已用摄像头熵填充", "Flipped X Coordinates": "翻转 X 坐标", "Flute Diameter": "刀具直径", "Free:": "空闲:", "From Storage": "从存储中", "Fully erase your SD card in another device to ensure data is unrecoverable": "在其他设备中完全擦除您的 SD 卡以确保数据不可恢复", "Generate Mnemonic": "生成助记词", "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "为此助记词设置自定义 ID?否则将使用当前指纹", "Go": "去", "Good entropy": "良好的熵", "Hardware": "硬件", "Hex Public Key": "十六进制公钥", "Hexadecimal": "十六进制", "Hide Mnemonics": "隐藏助记词", "High fees!": "高费用!", "ID already exists": "ID 已存在", "Index": "索引", "Index: %s": "索引: %s", "Inputs (%d):": "输入 (%d):", "Install?": "安装?", "Insufficient Entropy!": "熵不足!", "Insufficient entropy": "熵不足", "Invalid Tamper Check Code": "无效的防篡改检查码", "Invalid address": "无效地址", "Invalid bootloader": "无效的 ootloader ", "Invalid mnemonic length": "助记词长度无效", "Invalid public key": "无效公钥", "Invalid wallet:": "无效钱包:", "Invert": "反转", "Inverted Colors": "反转颜色", "Key": "密钥", "Key was not provided": "未提供密钥", "Krux Printer Test QR": "Krux 打印机测试二维码", "LCD Type": "LCD 类型", "Language": "语言", "Leave blank if you'd like Krux to pick a valid final word": "如果希望 Krux 自动计算最后一位 Checksum,请留空", "Left": "左", "Length: %s": "长度: %s", "Line Delay": "行延迟", "Line:": "行:", "Load Krux app": "加载Krux应用", "Load Mnemonic": "加载助记词", "Load Wallet": "加载钱包", "Load a trusted wallet descriptor to view addresses?": "加载受信任的钱包描述符以查看地址?", "Load from SD card": "从 SD 卡加载", "Load from SD card?": "从 SD 卡加载?", "Load from camera": "从相机加载", "Load one?": "加载一个?", "Load?": "加载?", "Loading Camera..": "加载相机..", "Loading change addresses..": "加载找零地址..", "Loading printer..": "加载打印机..", "Loading receive addresses..": "加载接收地址..", "Loading..": "加载中..", "Locale": "语言环境", "Location": "位置", "Maximum length exceeded (%s)": "超过最大长度(%s)", "Message": "消息", "Message:": "消息:", "Missing signature file": "缺少签名文件", "Mnemonic": "助记词", "Mnemonic ID": "助记词 ID", "Mnemonic and passphrase will be kept.": "助记词和密码将被保留。", "Mnemonic was not encrypted": "助记词未加密", "Modified:": "修改时间:", "Multisig": "多签", "Native Segwit - 84 would be assumed": "假定为原生 Segwit - 84", "Network": "网络", "New Mnemonic": "新助记词", "New firmware detected.": "检测到新固件。", "No": "否", "No Passphrase": "无 Passphrase ", "Not enough rolls!": "投掷次数不足!", "Numbers": "数字", "Octal": "八进制", "Other Formats": "其他格式", "PBKDF2 Iter.": "PBKDF2 迭代", "Paint punched dots black so they can be detected.": "将打孔点涂黑,以便它们能被检测到。", "Paper Width": "纸张宽度", "Part": "部分", "Part Size": "部件尺寸", "Passphrase": "Passphrase", "Password Length": "密码长度:", "Path mismatch": "路径不匹配", "Pattern detected!": "检测到模式!", "Permanently remove all stored encrypted mnemonics and settings from flash?": "从 Flash 中永久删除所有存储的加密助记词和设置?", "Persist": "保存", "Pixels deviation index:": "像素偏差指数:", "Plaintext QR": "明文二维码", "Please load a wallet output descriptor": "请加载钱包输出描述符", "Plunge Rate": "下刀速度", "Poor entropy": "熵值低", "Poor entropy detected!": "检测到低熵!", "Print Test QR": "打印测试二维码", "Print Tiny Seed?": "打印 Tiny Seed?", "Print to QR": "打印到二维码", "Print to QR?": "打印到二维码?", "Print?": "打印?", "Printer": "打印机", "Printer Driver not set!": "打印机驱动程序未设置!", "Printing..": "正在打印", "Proceed anyway?": "继续吗?", "Proceed?": "继续?", "Processing..": "正在处理..", "QR Code": "二维码", "RX Pin": "RX 引脚", "Reboot": "重启", "Receive": "接收", "Receive Addresses": "接收地址", "Region:": "区域:", "Remove %s?": "删除 %s?", "Remove Mnemonic": "删除助记词", "Remove firmware files from SD Card?": "从 SD 卡中删除固件文件?", "Res. - Format": "分辨率 - 格式", "Restore factory settings and reboot?": "恢复出厂设置并重新设备?", "Return to QR Viewer": "返回二维码查看器", "Review scanned data, edit if necessary": "请检查扫描的数据,如有必要请编辑", "Right": "右", "Roll dice at least %d times to generate a mnemonic.": "掷骰子至少 %d 次以生成助记词。", "Rolls distribution:": "掷骰子分布:", "Rolls:": "掷骰子:", "SD card": "SD 卡", "SD card not detected.": "未检测到 SD 卡。", "SHA256 of rolls:": "掷骰子的 SHA256:", "SHA256 of snapshot:": "快照的 SHA256:", "Save QR Image to SD Card": "将二维码图像保存到 SD 卡", "Save to SD card": "保存到 SD 卡", "Save to SD card?": "保存到 SD 卡?", "Saved to SD card": "保存到 SD 卡", "Scale": "缩放", "Scan Address": "扫描地址", "Scan BIP39 Passphrase": "扫描 BIP39 Passphrase", "Scan Key QR Code": "扫描私钥二维码", "Scanning words 1-12 again": "重新扫扫描第 1-12 个单词", "Scanning words 13-24": "扫描第 13-24 个单词", "Screensaver Time": "屏保时间", "Script Type": "脚本类型", "Security": "安全", "Self-transfer or Change (%d):": "自转或找零 (%d):", "Self-transfer:": "自行转账:", "Set a tamper check code first": "请先设置防篡改检查码", "Settings": "设置", "Settings stored internally on flash.": "设置存储在 Flash 内部。", "Settings stored on SD card.": "设置存储在SD卡上。", "Shannon's Entropy:": "香农熵:", "Shutdown": "关机", "Shutdown Time": "关机时间", "Shutting down..": "关机中..", "Sign": "签名", "Sign to QR code": "二维码签名", "Sign to SD card": " SD 卡签名", "Sign?": "是否签名?", "Signature": "签名", "Signed Message": "签名消息", "Signed PSBT": "已签名 PSBT", "Signing..": "签名中..", "Single-sig": "单签", "Size:": "大小:", "Some checks cannot be performed.": "无法执行某些检查。", "Spend (%d):": "花费 (%d):", "Spend:": "花费", "Stats for Nerds": "极客统计数据", "Store on Flash": "存储到 Flash", "Store on SD Card": "存储到 SD 卡", "Swipe to change mode": "滑动切换模式", "TC Flash Hash": "TC Flash Hash", "TC Flash Hash at Boot": "启动时的 TC Flash Hash", "TOUCH or ENTER to capture": "点击或按下 ENTER 截图", "TX Pin": "TX 引脚", "Tamper Check Code": "防篡改检查码", "Tamper check code set successfully": "防篡改检查码设置成功", "Tamper check codes do not match": "防篡改检查码不匹配", "Text": "文本", "Theme": "主题", "Thermal": "热敏", "To ensure data is unrecoverable use Wipe Device feature": "要确保数据不可恢复,请使用擦除设备功能", "Toggle Brightness": "调整亮度", "Tools": "工具", "Touch Threshold": "触摸阈值", "Touchscreen": "触摸屏", "Try more?": "再次尝试?", "Type BIP39 Passphrase": "输入 BIP39 Phrasephrase", "Type Key": "输入私钥", "Unit": "单位", "Upgrade complete.": "升级已完成。", "Use a black background surface.": "使用黑色背景界面。", "Use camera's entropy to create a new mnemonic": "使用摄像头的熵创建新助记词", "Used:": "已用:", "User's Data": "用户数据", "Value %s out of range: [%s, %s]": "值 %s 超出范围:[ %s,%s ]", "Value must be multiple of %s": "值必须是 %s 的倍数", "Verifying..": "验证中..", "Version": "版本", "Via Camera": "通过摄像头", "Via D20": "通过 D20", "Via D6": "通过 D6", "Via Manual Input": "通过手动输入", "Via Words": "通过单词", "Wait for the capture": "等待截取", "Wallet": "钱包", "Wallet Descriptor": "钱包描述", "Wallet output descriptor": "钱包输出描述符", "Wallet output descriptor loaded!": "钱包输出描述符加载重复!", "Wallet output descriptor not found.": "未找到钱包输出描述符。", "Warning:": "警告:", "Word %d": "词 %d", "Word Numbers": "单词序号", "Words": "单词", "Yes": "是", "is a valid address!": " 非有效地址", "was NOT FOUND in the first %d addresses": "在前 %d 个地址中未找到"} \ No newline at end of file +{ + "% of the amount.": "% 的金额。", + "%d of %d multisig": "%d/%d 多签", + "%d to %d": "%d到%d", + "%s removed.": "已移除%s", + "(%d total)": "(总计 %d)", + "(Experimental)": "(实验性)", + "(watch-only)": "(仅观察)", + "12 words": "12 单词", + "24 words": "24 单词", + "About": "关于", + "Accept assumption?": "接受假设?", + "Account": "账户", + "Account #0 would be assumed": "将假定为账户 #0", + "Account Index": "账户索引", + "Add or change wallet passphrase?": "添加或更改钱包密码?", + "Additional entropy from camera required for AES-CBC mode": "AES-CBC 模式需要相机的额外熵", + "Address": "地址", + "Align camera and backup plate properly.": "正确对齐摄像头和背板。", + "Allow in settings first!": "首先在设置中允许!", + "Anti-glare disabled": "防眩光已禁用", + "Anti-glare enabled": "防眩光已启用", + "Appearance": "界面", + "Are you sure?": "确定?", + "BGR Colors": "BGR 颜色", + "BIP39 Mnemonic": "BIP39助记符", + "Back": "返回", + "Back to Menu": "返回菜单", + "Backup Mnemonic": "备份助记词", + "Bad signature": "签名无效", + "Base64 Password": "Base64密码", + "Baudrate": "波特率", + "Binary Grid": "二进制网格", + "Border Padding": "边框填充", + "Brightness": "亮度", + "Buttons": "按钮", + "Buttons Debounce": "按钮去抖动", + "Capture cancelled": "截取已取消", + "Change": "找零", + "Change Addresses": "找零地址", + "Change theme and reboot?": "更改主题并重新启动?", + "Change:": "找零", + "Changes will last until shutdown.": "更改将在关机前保持。", + "Check SD Card": "检查 SD 卡", + "Check that address belongs to this wallet?": "检查该地址是否属于此钱包?", + "Checked %d addresses with no matches.": "已检查 %d 个不匹配的地址。", + "Checking for SD card..": "检查 SD 卡..", + "Confirm Tamper Check Code": "确认防篡改检查码", + "Create QR Code": "创建二维码", + "Create QR code from text?": "从文本创建二维码?", + "Created:": "已创建:", + "Current Tamper Check Code": "当前防篡改检查码", + "Custom QR Code": "自定义二维码", + "Customize": "自定义", + "Customizing your wallet will generate a new Key.": "自定义您的钱包将生成新私钥。", + "Cut Depth": "切割深度", + "Cut Method": "切割方法", + "Decimal": "十进制", + "Decrypt?": "解密?", + "Default Wallet": "默认钱包", + "Depth Per Pass": "每次通过的深度", + "Derive BIP85 entropy?": "导出BIP85熵?", + "Descriptor Addresses": "描述符地址", + "Display": "显示", + "Do not power off, it may take a while to complete.": "请勿断电,可能需要一段时间完成。", + "Done?": "完成了吗?", + "Double mnemonic": "双重助记词", + "Driver": "驱动程序", + "Empty": "为空", + "Enable Krux apps": "启用Krux应用程序", + "Encrypted": "已加密", + "Encrypted QR Code": "加密二维码", + "Encrypted mnemonic was not stored": "加密助记词未存储", + "Encrypted mnemonic was stored with ID:": "加密助记词已存储,ID 为:", + "Encryption": "加密", + "Encryption Mode": "加密模式", + "Enter %d BIP-39 words.": "输入 %d 个 BIP-39 词。", + "Enter a 6+ characters Tamper Check Code": "输入6个以上字符的防篡改检查码", + "Enter each word of your BIP-39 mnemonic as a number from 1 to 2048.": "将 BIP-39 助记词的每个词作为 1 到 2048 的数字输入。", + "Enter each word of your BIP-39 mnemonic as a number in hexadecimal from 1 to 800.": "将 BIP-39 助记词的每个词作为 1 到 800 的十六进制数输入。", + "Enter each word of your BIP-39 mnemonic as a number in octal from 1 to 4000.": "将 BIP-39 助记词的每个词作为 1 到 4000 的八进制数输入。", + "Enter each word of your BIP-39 mnemonic.": "输入每个 BIP-39 助记词。", + "Erase User's Data": "清除用户数据", + "Erasing user's data..": "正在擦除用户数据..", + "Error:": "错误:", + "Esc": "退出", + "Execute a signed Krux app?": "是否执行签名的Krux应用程序?", + "Explore files?": "浏览文件?", + "Exporting to SD card..": "导出到 SD 卡..", + "Extended Public Key": "扩展公钥", + "Factory Settings": "出厂设置", + "Failed to decrypt": "解密失败", + "Failed to load PSBT": "加载 PSBT 失败", + "Failed to load address": "加载地址失败", + "Failed to load key": "加载密钥失败", + "Failed to load message": "加载消息失败", + "Failed to load mnemonic": "加载助记词失败", + "Failed to load output descriptor": "加载输出描述符失败", + "Failed to load passphrase": "加载密码失败", + "Failed to store mnemonic": "存储助记词失败", + "Fee:": "费用:", + "Feed Rate": "进给速度", + "Filename": "文件名", + "Filename %s exists on SD card, overwrite?": "文件名 %s 存在于 SD 卡上,覆盖?", + "Fill the flash with entropy from camera?": "用摄像头的熵填充Flash?", + "Filling Flash": "填充Flash", + "Fingerprint unset in PSBT": "PSBT 中未设置指纹", + "Firmware exceeds max size: %d": "固件超过最大尺寸:%d", + "Flash Map": "Flash地图", + "Flash Tools": "Flash工具", + "Flash filled with camera entropy": "Flash已用摄像头熵填充", + "Flipped X Coordinates": "翻转 X 坐标", + "Flute Diameter": "刀具直径", + "Free:": "空闲:", + "From Storage": "从存储中", + "Fully erase your SD card in another device to ensure data is unrecoverable": "在其他设备中完全擦除您的 SD 卡以确保数据不可恢复", + "Generate Mnemonic": "生成助记词", + "Give this mnemonic a custom ID? Otherwise current fingerprint will be used": "为此助记词设置自定义 ID?否则将使用当前指纹", + "Go": "去", + "Good entropy": "良好的熵", + "Hardware": "硬件", + "Hex Public Key": "十六进制公钥", + "Hexadecimal": "十六进制", + "Hide Mnemonics": "隐藏助记词", + "High fees!": "高费用!", + "ID already exists": "ID 已存在", + "Index": "索引", + "Index: %s": "索引: %s", + "Inputs (%d):": "输入 (%d):", + "Install?": "安装?", + "Insufficient Entropy!": "熵不足!", + "Insufficient entropy": "熵不足", + "Invalid Tamper Check Code": "无效的防篡改检查码", + "Invalid address": "无效地址", + "Invalid bootloader": "无效的 ootloader ", + "Invalid mnemonic length": "助记词长度无效", + "Invalid public key": "无效公钥", + "Invalid wallet:": "无效钱包:", + "Invert": "反转", + "Inverted Colors": "反转颜色", + "Key": "密钥", + "Key was not provided": "未提供密钥", + "Krux Printer Test QR": "Krux 打印机测试二维码", + "LCD Type": "LCD 类型", + "Language": "语言", + "Leave blank if you'd like Krux to pick a valid final word": "如果希望 Krux 自动计算最后一位 Checksum,请留空", + "Left": "左", + "Length: %s": "长度: %s", + "Line Delay": "行延迟", + "Line:": "行:", + "Load Krux app": "加载Krux应用", + "Load Mnemonic": "加载助记词", + "Load Wallet": "加载钱包", + "Load a trusted wallet descriptor to view addresses?": "加载受信任的钱包描述符以查看地址?", + "Load from SD card": "从 SD 卡加载", + "Load from SD card?": "从 SD 卡加载?", + "Load from camera": "从相机加载", + "Load one?": "加载一个?", + "Load?": "加载?", + "Loading Camera..": "加载相机..", + "Loading change addresses..": "加载找零地址..", + "Loading printer..": "加载打印机..", + "Loading receive addresses..": "加载接收地址..", + "Loading..": "加载中..", + "Locale": "语言环境", + "Location": "位置", + "Maximum length exceeded (%s)": "超过最大长度(%s)", + "Message": "消息", + "Message:": "消息:", + "Missing signature file": "缺少签名文件", + "Mnemonic": "助记词", + "Mnemonic ID": "助记词 ID", + "Mnemonic and passphrase will be kept.": "助记词和密码将被保留。", + "Mnemonic was not encrypted": "助记词未加密", + "Modified:": "修改时间:", + "Multisig": "多签", + "Native Segwit - 84 would be assumed": "假定为原生 Segwit - 84", + "Network": "网络", + "New Mnemonic": "新助记词", + "New firmware detected.": "检测到新固件。", + "No": "否", + "No Passphrase": "无 Passphrase ", + "Not enough rolls!": "投掷次数不足!", + "Numbers": "数字", + "Octal": "八进制", + "Other Formats": "其他格式", + "PBKDF2 Iter.": "PBKDF2 迭代", + "Paint punched dots black so they can be detected.": "将打孔点涂黑,以便它们能被检测到。", + "Paper Width": "纸张宽度", + "Part": "部分", + "Part Size": "部件尺寸", + "Passphrase": "Passphrase", + "Password Length": "密码长度:", + "Path mismatch": "路径不匹配", + "Pattern detected!": "检测到模式!", + "Permanently remove all stored encrypted mnemonics and settings from flash?": "从 Flash 中永久删除所有存储的加密助记词和设置?", + "Persist": "保存", + "Pixels deviation index:": "像素偏差指数:", + "Plaintext QR": "明文二维码", + "Please load a wallet output descriptor": "请加载钱包输出描述符", + "Plunge Rate": "下刀速度", + "Poor entropy": "熵值低", + "Poor entropy detected!": "检测到低熵!", + "Print Test QR": "打印测试二维码", + "Print Tiny Seed?": "打印 Tiny Seed?", + "Print to QR": "打印到二维码", + "Print to QR?": "打印到二维码?", + "Print?": "打印?", + "Printer": "打印机", + "Printer Driver not set!": "打印机驱动程序未设置!", + "Printing..": "正在打印", + "Proceed anyway?": "继续吗?", + "Proceed?": "继续?", + "Processing..": "正在处理..", + "QR Code": "二维码", + "RX Pin": "RX 引脚", + "Reboot": "重启", + "Receive": "接收", + "Receive Addresses": "接收地址", + "Region:": "区域:", + "Remove %s?": "删除 %s?", + "Remove Mnemonic": "删除助记词", + "Remove firmware files from SD Card?": "从 SD 卡中删除固件文件?", + "Res. - Format": "分辨率 - 格式", + "Restore factory settings and reboot?": "恢复出厂设置并重新设备?", + "Return to QR Viewer": "返回二维码查看器", + "Review scanned data, edit if necessary": "请检查扫描的数据,如有必要请编辑", + "Right": "右", + "Roll dice at least %d times to generate a mnemonic.": "掷骰子至少 %d 次以生成助记词。", + "Rolls distribution:": "掷骰子分布:", + "Rolls:": "掷骰子:", + "SD card": "SD 卡", + "SD card not detected.": "未检测到 SD 卡。", + "SHA256 of rolls:": "掷骰子的 SHA256:", + "SHA256 of snapshot:": "快照的 SHA256:", + "Save QR Image to SD Card": "将二维码图像保存到 SD 卡", + "Save to SD card": "保存到 SD 卡", + "Save to SD card?": "保存到 SD 卡?", + "Saved to SD card": "保存到 SD 卡", + "Scale": "缩放", + "Scan Address": "扫描地址", + "Scan BIP39 Passphrase": "扫描 BIP39 Passphrase", + "Scan Key QR Code": "扫描私钥二维码", + "Scanning words 1-12 again": "重新扫扫描第 1-12 个单词", + "Scanning words 13-24": "扫描第 13-24 个单词", + "Screensaver Time": "屏保时间", + "Script Type": "脚本类型", + "Security": "安全", + "Self-transfer or Change (%d):": "自转或找零 (%d):", + "Self-transfer:": "自行转账:", + "Set a tamper check code first": "请先设置防篡改检查码", + "Settings": "设置", + "Settings stored internally on flash.": "设置存储在 Flash 内部。", + "Settings stored on SD card.": "设置存储在SD卡上。", + "Shannon's Entropy:": "香农熵:", + "Shutdown": "关机", + "Shutdown Time": "关机时间", + "Shutting down..": "关机中..", + "Sign": "签名", + "Sign to QR code": "二维码签名", + "Sign to SD card": " SD 卡签名", + "Sign?": "是否签名?", + "Signature": "签名", + "Signed Message": "签名消息", + "Signed PSBT": "已签名 PSBT", + "Signing..": "签名中..", + "Single-sig": "单签", + "Size:": "大小:", + "Some checks cannot be performed.": "无法执行某些检查。", + "Spend (%d):": "花费 (%d):", + "Spend:": "花费", + "Stats for Nerds": "极客统计数据", + "Store on Flash": "存储到 Flash", + "Store on SD Card": "存储到 SD 卡", + "Swipe to change mode": "滑动切换模式", + "TC Flash Hash": "TC Flash Hash", + "TC Flash Hash at Boot": "启动时的 TC Flash Hash", + "TOUCH or ENTER to capture": "点击或按下 ENTER 截图", + "TX Pin": "TX 引脚", + "Tamper Check Code": "防篡改检查码", + "Tamper check code set successfully": "防篡改检查码设置成功", + "Tamper check codes do not match": "防篡改检查码不匹配", + "Text": "文本", + "Theme": "主题", + "Thermal": "热敏", + "To ensure data is unrecoverable use Wipe Device feature": "要确保数据不可恢复,请使用擦除设备功能", + "Toggle Brightness": "调整亮度", + "Tools": "工具", + "Touch Threshold": "触摸阈值", + "Touchscreen": "触摸屏", + "Try more?": "再次尝试?", + "Type BIP39 Passphrase": "输入 BIP39 Phrasephrase", + "Type Key": "输入私钥", + "Unit": "单位", + "Upgrade complete.": "升级已完成。", + "Use a black background surface.": "使用黑色背景界面。", + "Use camera's entropy to create a new mnemonic": "使用摄像头的熵创建新助记词", + "Used:": "已用:", + "User's Data": "用户数据", + "Value %s out of range: [%s, %s]": "值 %s 超出范围:[ %s,%s ]", + "Value must be multiple of %s": "值必须是 %s 的倍数", + "Verifying..": "验证中..", + "Version": "版本", + "Via Camera": "通过摄像头", + "Via D20": "通过 D20", + "Via D6": "通过 D6", + "Via Manual Input": "通过手动输入", + "Via Words": "通过单词", + "Wait for the capture": "等待截取", + "Wallet": "钱包", + "Wallet Descriptor": "钱包描述", + "Wallet output descriptor": "钱包输出描述符", + "Wallet output descriptor loaded!": "钱包输出描述符加载重复!", + "Wallet output descriptor not found.": "未找到钱包输出描述符。", + "Warning:": "警告:", + "Word %d": "词 %d", + "Word Numbers": "单词序号", + "Words": "单词", + "Yes": "是", + "is a valid address!": " 非有效地址", + "was NOT FOUND in the first %d addresses": "在前 %d 个地址中未找到" +} \ No newline at end of file diff --git a/src/krux/translations/__init__.py b/src/krux/translations/__init__.py index 878265c15..e00b05a22 100644 --- a/src/krux/translations/__init__.py +++ b/src/krux/translations/__init__.py @@ -19,339 +19,5 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -available_languages = [ - "de-DE", - "es-MX", - "fr-FR", - "ja-JP", - "ko-KR", - "nl-NL", - "pt-BR", - "ru-RU", - "tr-TR", - "vi-VN", - "zh-CN", -] -ref_array = [ - 232475068, - 1185266064, - 1503087751, - 1178563089, - 1092222515, - 3348584292, - 1099786887, - 2739590230, - 1310058127, - 1949634023, - 4287534872, - 2995482424, - 2415648848, - 1043817877, - 3439746594, - 2143824150, - 3270727197, - 900375497, - 276039542, - 88746165, - 1521033296, - 3857613120, - 1056821534, - 1868069640, - 3247612282, - 3455872521, - 4151330982, - 2756316330, - 2256777600, - 2568189522, - 3937333362, - 2046615409, - 928727036, - 2519455027, - 2363604010, - 2038226551, - 3138204438, - 1207696150, - 3126552510, - 1583186953, - 3768416405, - 388908871, - 3442025874, - 3119547911, - 1187826970, - 2470115694, - 422237057, - 3226440384, - 4094072796, - 167798282, - 678449760, - 1347214433, - 3513215254, - 3585411775, - 534274978, - 124617190, - 597912140, - 2504034831, - 2751113454, - 1272005728, - 4102535566, - 2940689088, - 1712856005, - 3278654271, - 3895447625, - 3836852788, - 690625786, - 382368239, - 2835747520, - 807457043, - 3582575312, - 1244124409, - 2968548114, - 781419966, - 350279787, - 2601598799, - 1821513079, - 2325729718, - 3504179008, - 1100685007, - 4090266642, - 2780625730, - 3625557340, - 3706575164, - 889040671, - 1505332462, - 2731446492, - 3838465623, - 4170881190, - 1711312434, - 3981762528, - 383371114, - 3048830188, - 4192663412, - 1996021743, - 1108715658, - 1081425878, - 928667220, - 1620572516, - 2946146830, - 262248294, - 104500973, - 3313339187, - 1982637349, - 4014189410, - 3804482397, - 4006602858, - 2542772894, - 828589330, - 2777318640, - 1384661010, - 3748840176, - 1406590538, - 1077771640, - 1893243331, - 1871146425, - 3549015533, - 299338213, - 602716148, - 1198393582, - 133139382, - 3580020863, - 2691246967, - 3903754133, - 3876651191, - 2880010062, - 1102202885, - 958390318, - 3242179508, - 3034883011, - 3755547839, - 2032416055, - 3248804547, - 2585599782, - 2874529150, - 4093416954, - 1422874211, - 237577215, - 4122897393, - 640219121, - 3000888649, - 3264569915, - 3835918229, - 911419226, - 766317539, - 4180141032, - 3663022166, - 1163744846, - 972436696, - 2176866982, - 2993872092, - 2820726296, - 2369474953, - 2256441194, - 237136240, - 879727077, - 1936877965, - 669106195, - 3330705289, - 2596531078, - 2488179069, - 336702608, - 1201104769, - 3159494909, - 1177338798, - 2817059741, - 2917810189, - 2030045667, - 762611188, - 3928301843, - 1948316555, - 2123991188, - 1443208255, - 1746030071, - 1237332019, - 1845376098, - 4265479636, - 2939797024, - 73574491, - 3634967631, - 4063104189, - 2325721074, - 4092516657, - 3089363813, - 1577637745, - 391304453, - 3312581301, - 995862913, - 2987800462, - 3913146360, - 3559456868, - 4249903283, - 433951968, - 3745269737, - 500286397, - 3040011773, - 140802882, - 2578106186, - 1703779997, - 3561756278, - 784609464, - 3761518438, - 3639136476, - 3037062877, - 2362732578, - 3123770978, - 3345150514, - 3339507095, - 1123106929, - 3903571079, - 3586624216, - 3593149291, - 2580599003, - 3108881025, - 1848310591, - 710709610, - 3338633658, - 2697857197, - 1746677167, - 1658501467, - 3739634002, - 1476462492, - 1557093280, - 2817311427, - 2365886561, - 3091105710, - 1662254634, - 1963678224, - 770350922, - 3271055013, - 432366011, - 3976793317, - 2736513298, - 1166743226, - 817419367, - 699906428, - 2163347007, - 3531742595, - 2940025484, - 763824768, - 4117455079, - 4038076821, - 923277590, - 4006316572, - 2736506158, - 2029624154, - 289960586, - 1022211991, - 4255182430, - 3753172956, - 2186790517, - 473154195, - 563836138, - 712533907, - 2377955518, - 1825881236, - 3656120779, - 2120776272, - 1061961408, - 2293863356, - 2879966040, - 4282338366, - 746161122, - 1988416729, - 3672006076, - 3406791302, - 2281377987, - 2019512665, - 2344747135, - 2090568351, - 1260825919, - 1232757391, - 3303592908, - 720041451, - 3514476519, - 2596024031, - 2440924821, - 1898550184, - 4228215415, - 2336603177, - 3679411849, - 1820163048, - 2612594937, - 1454688268, - 1180180513, - 2258131455, - 2700207481, - 725348723, - 3684696112, - 2978718564, - 2732611775, - 401829098, - 2061556020, - 2089395053, - 2786714360, - 2674953168, - 2402455261, - 3336226318, - 3984160815, - 4003084591, - 989428076, - 3429519584, - 1889659487, - 4191058607, - 1254681955, - 525309547, - 590330112, - 1947603760, - 2504354847, - 2076481321, - 2297028319, - 4232654916, - 2587172867, - 2499782468, - 2671738224, - 797660533, - 3742424146, - 2965123464, - 1303016265, - 2171149824, - 1875891934, -] +available_languages = ["de-DE", "es-MX", "fr-FR", "ja-JP", "ko-KR", "nl-NL", "pt-BR", "ru-RU", "tr-TR", "vi-VN", "zh-CN"] +ref_array = [232475068, 1185266064, 1503087751, 1178563089, 1092222515, 3348584292, 1099786887, 2739590230, 1310058127, 1949634023, 4287534872, 2995482424, 2415648848, 1043817877, 3439746594, 2143824150, 3270727197, 900375497, 276039542, 88746165, 1521033296, 3857613120, 1056821534, 1868069640, 3247612282, 3455872521, 4151330982, 2756316330, 2256777600, 2568189522, 3937333362, 2046615409, 928727036, 2519455027, 2363604010, 2038226551, 3138204438, 1207696150, 3126552510, 1583186953, 3768416405, 388908871, 3442025874, 3119547911, 1187826970, 2470115694, 422237057, 4094072796, 167798282, 678449760, 1347214433, 3513215254, 3585411775, 534274978, 124617190, 597912140, 2504034831, 2751113454, 1272005728, 4102535566, 2940689088, 1712856005, 3278654271, 3895447625, 3836852788, 690625786, 382368239, 2835747520, 807457043, 3582575312, 1244124409, 2968548114, 781419966, 350279787, 2601598799, 1821513079, 2325729718, 3504179008, 1100685007, 4090266642, 2780625730, 3625557340, 3706575164, 889040671, 1505332462, 2731446492, 3838465623, 4170881190, 1711312434, 3981762528, 383371114, 3048830188, 4192663412, 1996021743, 1108715658, 1081425878, 928667220, 1620572516, 2946146830, 262248294, 104500973, 3313339187, 1982637349, 4014189410, 3804482397, 4006602858, 2542772894, 828589330, 2777318640, 1384661010, 3748840176, 1406590538, 1077771640, 1893243331, 1871146425, 3549015533, 299338213, 602716148, 1198393582, 133139382, 3580020863, 2691246967, 3903754133, 3876651191, 2880010062, 1102202885, 958390318, 3242179508, 3034883011, 3755547839, 2032416055, 3248804547, 2585599782, 2874529150, 4093416954, 1422874211, 237577215, 4122897393, 640219121, 3000888649, 3264569915, 3835918229, 911419226, 766317539, 4180141032, 3663022166, 1163744846, 972436696, 2176866982, 2993872092, 2820726296, 2369474953, 2256441194, 237136240, 879727077, 1936877965, 669106195, 3330705289, 2596531078, 2488179069, 336702608, 1201104769, 3159494909, 1177338798, 2817059741, 2917810189, 2030045667, 762611188, 3928301843, 1948316555, 2123991188, 1443208255, 1746030071, 1237332019, 1845376098, 4265479636, 2939797024, 73574491, 3634967631, 4063104189, 2325721074, 4092516657, 3089363813, 1577637745, 391304453, 3312581301, 995862913, 2987800462, 3913146360, 3559456868, 4249903283, 433951968, 3745269737, 500286397, 3040011773, 140802882, 2578106186, 1703779997, 3561756278, 784609464, 3761518438, 3639136476, 3037062877, 2362732578, 3123770978, 3345150514, 3339507095, 1123106929, 3903571079, 3586624216, 3593149291, 2580599003, 3108881025, 1848310591, 710709610, 3338633658, 2697857197, 1746677167, 1658501467, 3739634002, 1476462492, 1557093280, 2817311427, 2365886561, 3091105710, 1662254634, 1963678224, 770350922, 3271055013, 432366011, 3976793317, 2736513298, 1166743226, 817419367, 699906428, 2163347007, 3531742595, 2940025484, 763824768, 4117455079, 4038076821, 923277590, 4006316572, 2736506158, 2029624154, 289960586, 1022211991, 4255182430, 3753172956, 2186790517, 473154195, 563836138, 712533907, 2377955518, 1825881236, 3656120779, 2120776272, 1061961408, 2293863356, 2879966040, 4282338366, 746161122, 1988416729, 3672006076, 3406791302, 2281377987, 2019512665, 2344747135, 2090568351, 1260825919, 1232757391, 3303592908, 720041451, 3514476519, 2596024031, 2440924821, 1898550184, 4228215415, 2336603177, 3679411849, 1820163048, 2612594937, 1531842997, 1454688268, 1180180513, 2258131455, 2700207481, 725348723, 3684696112, 2978718564, 2732611775, 401829098, 2061556020, 2089395053, 2786714360, 2674953168, 2402455261, 3336226318, 3984160815, 4003084591, 989428076, 3429519584, 1889659487, 4191058607, 1254681955, 525309547, 590330112, 1947603760, 2504354847, 2076481321, 2297028319, 4232654916, 2587172867, 2499782468, 2671738224, 797660533, 3742424146, 2965123464, 1303016265, 2171149824, 1875891934] diff --git a/src/krux/translations/de.py b/src/krux/translations/de.py index 980bc1758..8335b5f35 100644 --- a/src/krux/translations/de.py +++ b/src/krux/translations/de.py @@ -20,326 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = [ - "% des Betrags.", - "%d von %d Multisig", - "%d bis %d ", - "%s wurde entfernt.", - "(%d insgesamt)", - "(Experimental)", - "(nur zur Betrachtung)", - "12 Wörter", - "24 Wörter", - "Über", - "Annahme akzeptieren?", - "Konto", - "Konto #0 würde angenommen", - "Kontoindex", - "Wallet-Passphrase hinzufügen oder ändern?", - "Zusätzliche Entropie von der Kamera für den AES-CBC-Modus erforderlich", - "Adresse", - "Richte Kamera und Sicherungsplatte richtig aus.", - "Erlaube zuerst Einstellungen!", - "Blendschutz deaktiviert", - "Blendschutz aktiviert", - "Aussehen", - "Bist Du sicher?", - "BGR-Farben", - "BIP39-Mnemonik", - "Zurück", - "Zurück zum Menü", - "Mnemonik-Backup", - "Ungültige Signatur", - "Base64-Passwort", - "Baudrate", - "Binäres Gitter", - "Randpolsterung", - "Helligkeit", - "Tasten", - "Entprellung der Tasten", - "Aufnahme abgebrochen", - "Change Adresse", - "Change Adressen", - "Thema ändern und neu starten?", - "Change:", - "Änderungen bleiben bis zum Herunterfahren bestehen.", - "Prüfe SD-Karte", - "Überprüfen, ob diese Adresse zu dieser Wallet gehört?", - "Überprüfte %d Adresse ohne Übereinstimmungen.", - "Suche nach SD-Karte..", - "Bestätigen Sie den Tamper Check Code", - "Ausführung nicht möglich.", - "Erstelle QR-Code", - "QR-Code aus Text erzeugen?", - "Erstellt:", - "Aktueller Tamper Check Code", - "Benutzerdefinierte QR-Code", - "Anpassen", - "Wenn Sie Ihr Wallet anpassen, wird ein neuer Schlüssel generiert.", - "Schnitttiefe", - "Cut-Methode", - "Dezimal", - "Entschlüsseln?", - "Standard-Wallet", - "Tiefe pro Durchgang", - "BIP85-Entropie ableiten?", - "Deskriptor-Adressen", - "Bildschirm", - "Schalten Sie das Gerät nicht aus, es kann eine Weile dauern.", - "Fertig?", - "Doppelte Gedächtnisstütze", - "Driver", - "Leer", - "Krux-Apps aktivieren", - "Verschlüsselt", - "Verschlüsselter QR-Code", - "Verschlüsselte Mnemonic wurde nicht gespeichert", - "Speicherung der verschlüsselten Mnemonic mit ID:", - "Verschlüsselung", - "Verschlüsselungsmodus", - "Geben Sie %d BIP-39 Wörter ein.", - "Geben Sie einen Tamper Check Code mit 6+ Zeichen ein", - "Gib jedes Wort Deiner BIP-39 Mnemonic als Zahl von 1 bis 2048 ein.", - "Gib jedes Wort Deiner BIP-39 Mnemonic als Hexadezimalzahl von 1 bis 800 ein.", - "Gib jedes Wort Deiner BIP-39 Mnemonic als Oktalzahl von 1 bis 4000 ein.", - "Gib jedes Wort Deiner BIP-39 Mnemonic ein.", - "Benutzerdaten löschen", - "Benutzerdaten werden gelöscht..", - "Fehler:", - "Esc", - "Eine signierte Krux-App ausführen?", - "Dateien durchsuchen?", - "Auf SD-Karte exportieren..", - "Öffentlicher Schlüssel", - "Werkeinstellungen", - "Entschlüsselung fehlgeschlagen", - "PSBT konnte nicht geladen werden", - "Adresse konnte nicht geladen werden", - "Schlüssel konnte nicht geladen werden", - "Nachricht konnte nicht geladen werden", - "Mnemonic konnte nicht geladen werden", - "Ausgabedeskriptor konnte nicht geladen werden", - "Passphrase konnte nicht geladen werden", - "Mnemonic konnte nicht gespeichert werden", - "Gebühr:", - "Vorschubgeschwindigkeit", - "Dateiname", - "Dateiname %s existiert auf SD-Karte, überschreiben?", - "Den Flash mit Entropie von der Kamera füllen?", - "Flash wird gefüllt", - "Fingerabdruck in PSBT deaktiviert", - "Die Firmware übersteigt die maximale Größe: %d", - "Flash-Karte", - "Flash-Tools", - "Flash gefüllt mit Kameraentropie", - "Umgedrehte X-Koordinaten", - "Flötendurchmesser", - "Frei:", - "Vom Speicher", - "Löschen Sie Ihre SD-Karte vollständig in einem anderen Gerät, um sicherzustellen, dass die Daten nicht wiederhergestellt werden können", - "Mnemonik erzeugen", - "Dieser Mnemonic eine benutzerdefinierte ID zuteilen? Andernfalls wird der aktuelle Fingerabdruck verwendet", - "Go", - "Gute Entropie", - "Hardware", - "Hex öffentlicher Schlüssel", - "Hexadezimal", - "Mnemonics ausblenden", - "Hohe Gebühren!", - "ID existiert bereits", - "Index", - "Index: %s", - "Input (%d):", - "Installieren?", - "Unzureichende Entropie!", - "Unzureichende Entropie", - "Ungültiger Tamper Check Code", - "Ungültige Adresse", - "Ungültiger Bootloader", - "Ungültige mnemonische Lange", - "Ungültiger öffentlicher Schlüssel", - "Ungültige Wallet:", - "Umkehren", - "Invertierte Farben", - "Schlüssel", - "Schlüssel wurde nicht zur Verfügung gestellt", - "Krux Drucker Test-QR", - "LCD-Typ", - "Sprache", - "Lassen Sie das Feld leer, wenn Sie möchten, dass Krux ein gültiges letztes Wort auswählt", - "Links", - "Länge: %s", - "Leitungsverzögerung", - "Linie:", - "Krux-App laden", - "Mnemonic laden", - "Wallet laden", - "Einen vertrauenswürdigen Wallet-Deskriptor laden, um Adressen anzuzeigen?", - "Von SD-Karte laden", - "Von SD-Karte laden?", - "Von der Kamera laden", - "Eine laden?", - "Laden?", - "Lade Kamera..", - "Lade Change Adressen..", - "Drucker wird geladen..", - "Lade Empfangsadressen..", - "Wird geladen..", - "Spracheinstellung", - "Speicherort", - "Maximale Länge überschritten (%s)", - "Nachricht", - "Nachricht:", - "Fehlende Signaturdatei", - "Mnemonic", - "Mnemonische ID", - "Mnemotechnik und Passphrase werden beibehalten.", - "Mnemonic wurde nicht verschlüsselt", - "Geändert:", - "Multisig", - "Native Segwit - 84 würde angenommen", - "Netzwerk", - "Neue Mnemonic", - "Neue Firmware erkannt.", - "Nein", - "Keine Passphrase", - "Nicht genug Würfe!", - "Zahlen", - "Oktal", - "Andere Formate", - "PBKDF2-Iter.", - "Male gestanzte Punkte schwarz an, damit sie erkannt werden können.", - "Papierbreite", - "Teil", - "Teilegröße", - "Passphrase", - "Passwortlänge", - "Pfad stimmt nicht überein", - "Muster erkannt!", - "Alle gespeicherten verschlüsselten Mnemoniken und Einstellungen dauerhaft vom Flash-Speicher entfernen?", - "Speicher", - "Pixelabweichungsindex:", - "Klartext-QR", - "Bitte lade einen Wallet Ausgabedeskriptor", - "Tauchrate", - "Schlechte Entropie", - "Schlechte Entropie erkannt!", - "Drucke Test-QR", - "Tiny Seed drucken?", - "Als QR-Code drucken", - "Als QR-Code drucken?", - "Drucken?", - "Drucker", - "Druckertreiber nicht gesetzt!", - "Wird gedruckt..", - "Trotzdem fortfahren?", - "Weiter?", - "Wird bearbeitet..", - "QR-Code", - "RX Pin", - "Neustart", - "Empfangen", - "Empfangsadresse", - "Region:", - "Löschen %s?", - "Mnemonic löschen", - "Firmware-Dateien von der SD-Karte entfernen?", - "Res. - Format", - "Werkseinstellungen wiederherstellen und neu starten?", - "Zurück zum QR-Viewer", - "Überprüfe gescannte Daten und bearbeite sie bei Bedarf", - "Rechts", - "Würfel mindestens %d Mal, um eine Mnemonic zu erzeugen.", - "Rollenverteilung:", - "Würfe:", - "SD-Karte", - "SD-Karte nicht erkannt.", - "SHA256 der Würfe:", - "SHA256 des Snapshots:", - "QR-Bild auf SD-Karte speichern", - "Auf SD-Karte speichern?", - "Auf SD-Karte speichern?", - "Auf SD-Karte gespeichert", - "Skala", - "Adresse\nscannen", - "Scan BIP39 Passphrase", - "Schlüssel QR-Code Scannen", - "Wörter 1-12 erneut scannen", - "Wörter 13-24 scannen", - "Bildschirmschonerzeit", - "Script-Art", - "Sicherheit", - "Selbstübertragung oder Change (%d):", - "Selbstübertragung:", - "Legen Sie zuerst einen Tamper Check Code fest", - "Einstellungen", - "Die Einstellungen werden intern auf Flash gespeichert.", - "Einstellungen auf SD-Karte gespeichert.", - "Shannons Entropie:", - "Ausschalten", - "Abschaltzeit:", - "Herunterfahren..", - "Signieren", - "Am QR-Code unterschreiben", - "Auf SD-Karte signieren", - "Signieren?", - "Signatur", - "Signierte Nachricht", - "Signierte PSBT", - "Unterschreiben..", - "Single-Sig", - "Größe:", - "Einige Schecks können nicht durchgeführt werden.", - "Ausgabe (%d):", - "Ausgaben:", - "Statistiken für Nerds", - "Auf Flash speichern", - "Auf der SD-Karte speichern", - "Wischen um den Modus zu ändern", - "TC Flash-Hash", - "TC Flash-Hash beim Start", - "TOUCH oder ENTER zum Erfassen", - "TX Pin", - "Tamper Check Code", - "Tamper Check Code erfolgreich gesetzt", - "Tamper Check Codes stimmen nicht überein", - "Text", - "Thema", - "Thermisch", - "Um sicherzustellen, dass die Daten nicht wiederhergestellt werden können, verwenden Sie die Funktion 'Gerät löschen'", - "Helligkeit umschalten", - "Werkzeuge", - "Berühre Schwellenwert", - "Touchscreen", - "Weiter versuchen?", - "BIP39 Passphrase eingeben", - "Schlüssel eingeben", - "Einheit", - "Upgrade abgeschlossen.", - "Verwende eine schwarze Hintergrundfläche.", - "Verwende die Entropie der Kamera, um eine neue Mnemonic zu erstellen", - "Belegt:", - "Benutzerdaten", - "Wert %S außerhalb des Bereichs: [ %s, %s]", - "Der Wert muss ein Vielfaches von %s sein", - "Überprüfung..", - "Version", - "Via Kamera", - "Via D20", - "Via D6", - "Via manueller Eingabe", - "Via Wörter", - "Warte auf die Erfassung", - "Wallet", - "Wallet-Deskriptor", - "Wallet Ausgabedeskriptor", - "Wallet Ausgabedeskriptor geladen!", - "Wallet Ausgabedeskriptor nicht gefunden.", - "Warnung:", - "Wort %d", - "Wortnummern", - "Wörter", - "Ja", - "ist eine gültige Adresse!", - "wurde in den ersten %d Adressen nicht gefunden", -] +translation_array = ['% des Betrags.', '%d von %d Multisig', '%d bis %d ', '%s wurde entfernt.', '(%d insgesamt)', '(Experimental)', '(nur zur Betrachtung)', '12 Wörter', '24 Wörter', 'Über', 'Annahme akzeptieren?', 'Konto', 'Konto #0 würde angenommen', 'Kontoindex', 'Wallet-Passphrase hinzufügen oder ändern?', 'Zusätzliche Entropie von der Kamera für den AES-CBC-Modus erforderlich', 'Adresse', 'Richte Kamera und Sicherungsplatte richtig aus.', 'Erlaube zuerst Einstellungen!', 'Blendschutz deaktiviert', 'Blendschutz aktiviert', 'Aussehen', 'Bist Du sicher?', 'BGR-Farben', 'BIP39-Mnemonik', 'Zurück', 'Zurück zum Menü', 'Mnemonik-Backup', 'Ungültige Signatur', 'Base64-Passwort', 'Baudrate', 'Binäres Gitter', 'Randpolsterung', 'Helligkeit', 'Tasten', 'Entprellung der Tasten', 'Aufnahme abgebrochen', 'Change Adresse', 'Change Adressen', 'Thema ändern und neu starten?', 'Change:', 'Änderungen bleiben bis zum Herunterfahren bestehen.', 'Prüfe SD-Karte', 'Überprüfen, ob diese Adresse zu dieser Wallet gehört?', 'Überprüfte %d Adresse ohne Übereinstimmungen.', 'Suche nach SD-Karte..', 'Bestätigen Sie den Tamper Check Code', 'Erstelle QR-Code', 'QR-Code aus Text erzeugen?', 'Erstellt:', 'Aktueller Tamper Check Code', 'Benutzerdefinierte QR-Code', 'Anpassen', 'Wenn Sie Ihr Wallet anpassen, wird ein neuer Schlüssel generiert.', 'Schnitttiefe', 'Cut-Methode', 'Dezimal', 'Entschlüsseln?', 'Standard-Wallet', 'Tiefe pro Durchgang', 'BIP85-Entropie ableiten?', 'Deskriptor-Adressen', 'Bildschirm', 'Schalten Sie das Gerät nicht aus, es kann eine Weile dauern.', 'Fertig?', 'Doppelte Gedächtnisstütze', 'Driver', 'Leer', 'Krux-Apps aktivieren', 'Verschlüsselt', 'Verschlüsselter QR-Code', 'Verschlüsselte Mnemonic wurde nicht gespeichert', 'Speicherung der verschlüsselten Mnemonic mit ID:', 'Verschlüsselung', 'Verschlüsselungsmodus', 'Geben Sie %d BIP-39 Wörter ein.', 'Geben Sie einen Tamper Check Code mit 6+ Zeichen ein', 'Gib jedes Wort Deiner BIP-39 Mnemonic als Zahl von 1 bis 2048 ein.', 'Gib jedes Wort Deiner BIP-39 Mnemonic als Hexadezimalzahl von 1 bis 800 ein.', 'Gib jedes Wort Deiner BIP-39 Mnemonic als Oktalzahl von 1 bis 4000 ein.', 'Gib jedes Wort Deiner BIP-39 Mnemonic ein.', 'Benutzerdaten löschen', 'Benutzerdaten werden gelöscht..', 'Fehler:', 'Esc', 'Eine signierte Krux-App ausführen?', 'Dateien durchsuchen?', 'Auf SD-Karte exportieren..', 'Öffentlicher Schlüssel', 'Werkeinstellungen', 'Entschlüsselung fehlgeschlagen', 'PSBT konnte nicht geladen werden', 'Adresse konnte nicht geladen werden', 'Schlüssel konnte nicht geladen werden', 'Nachricht konnte nicht geladen werden', 'Mnemonic konnte nicht geladen werden', 'Ausgabedeskriptor konnte nicht geladen werden', 'Passphrase konnte nicht geladen werden', 'Mnemonic konnte nicht gespeichert werden', 'Gebühr:', 'Vorschubgeschwindigkeit', 'Dateiname', 'Dateiname %s existiert auf SD-Karte, überschreiben?', 'Den Flash mit Entropie von der Kamera füllen?', 'Flash wird gefüllt', 'Fingerabdruck in PSBT deaktiviert', 'Die Firmware übersteigt die maximale Größe: %d', 'Flash-Karte', 'Flash-Tools', 'Flash gefüllt mit Kameraentropie', 'Umgedrehte X-Koordinaten', 'Flötendurchmesser', 'Frei:', 'Vom Speicher', 'Löschen Sie Ihre SD-Karte vollständig in einem anderen Gerät, um sicherzustellen, dass die Daten nicht wiederhergestellt werden können', 'Mnemonik erzeugen', 'Dieser Mnemonic eine benutzerdefinierte ID zuteilen? Andernfalls wird der aktuelle Fingerabdruck verwendet', 'Go', 'Gute Entropie', 'Hardware', 'Hex öffentlicher Schlüssel', 'Hexadezimal', 'Mnemonics ausblenden', 'Hohe Gebühren!', 'ID existiert bereits', 'Index', 'Index: %s', 'Input (%d):', 'Installieren?', 'Unzureichende Entropie!', 'Unzureichende Entropie', 'Ungültiger Tamper Check Code', 'Ungültige Adresse', 'Ungültiger Bootloader', 'Ungültige mnemonische Lange', 'Ungültiger öffentlicher Schlüssel', 'Ungültige Wallet:', 'Umkehren', 'Invertierte Farben', 'Schlüssel', 'Schlüssel wurde nicht zur Verfügung gestellt', 'Krux Drucker Test-QR', 'LCD-Typ', 'Sprache', 'Lassen Sie das Feld leer, wenn Sie möchten, dass Krux ein gültiges letztes Wort auswählt', 'Links', 'Länge: %s', 'Leitungsverzögerung', 'Linie:', 'Krux-App laden', 'Mnemonic laden', 'Wallet laden', 'Einen vertrauenswürdigen Wallet-Deskriptor laden, um Adressen anzuzeigen?', 'Von SD-Karte laden', 'Von SD-Karte laden?', 'Von der Kamera laden', 'Eine laden?', 'Laden?', 'Lade Kamera..', 'Lade Change Adressen..', 'Drucker wird geladen..', 'Lade Empfangsadressen..', 'Wird geladen..', 'Spracheinstellung', 'Speicherort', 'Maximale Länge überschritten (%s)', 'Nachricht', 'Nachricht:', 'Fehlende Signaturdatei', 'Mnemonic', 'Mnemonische ID', 'Mnemotechnik und Passphrase werden beibehalten.', 'Mnemonic wurde nicht verschlüsselt', 'Geändert:', 'Multisig', 'Native Segwit - 84 würde angenommen', 'Netzwerk', 'Neue Mnemonic', 'Neue Firmware erkannt.', 'Nein', 'Keine Passphrase', 'Nicht genug Würfe!', 'Zahlen', 'Oktal', 'Andere Formate', 'PBKDF2-Iter.', 'Male gestanzte Punkte schwarz an, damit sie erkannt werden können.', 'Papierbreite', 'Teil', 'Teilegröße', 'Passphrase', 'Passwortlänge', 'Pfad stimmt nicht überein', 'Muster erkannt!', 'Alle gespeicherten verschlüsselten Mnemoniken und Einstellungen dauerhaft vom Flash-Speicher entfernen?', 'Speicher', 'Pixelabweichungsindex:', 'Klartext-QR', 'Bitte lade einen Wallet Ausgabedeskriptor', 'Tauchrate', 'Schlechte Entropie', 'Schlechte Entropie erkannt!', 'Drucke Test-QR', 'Tiny Seed drucken?', 'Als QR-Code drucken', 'Als QR-Code drucken?', 'Drucken?', 'Drucker', 'Druckertreiber nicht gesetzt!', 'Wird gedruckt..', 'Trotzdem fortfahren?', 'Weiter?', 'Wird bearbeitet..', 'QR-Code', 'RX Pin', 'Neustart', 'Empfangen', 'Empfangsadresse', 'Region:', 'Löschen %s?', 'Mnemonic löschen', 'Firmware-Dateien von der SD-Karte entfernen?', 'Res. - Format', 'Werkseinstellungen wiederherstellen und neu starten?', 'Zurück zum QR-Viewer', 'Überprüfe gescannte Daten und bearbeite sie bei Bedarf', 'Rechts', 'Würfel mindestens %d Mal, um eine Mnemonic zu erzeugen.', 'Rollenverteilung:', 'Würfe:', 'SD-Karte', 'SD-Karte nicht erkannt.', 'SHA256 der Würfe:', 'SHA256 des Snapshots:', 'QR-Bild auf SD-Karte speichern', 'Auf SD-Karte speichern?', 'Auf SD-Karte speichern?', 'Auf SD-Karte gespeichert', 'Skala', 'Adresse\nscannen', 'Scan BIP39 Passphrase', 'Schlüssel QR-Code Scannen', 'Wörter 1-12 erneut scannen', 'Wörter 13-24 scannen', 'Bildschirmschonerzeit', 'Script-Art', 'Sicherheit', 'Selbstübertragung oder Change (%d):', 'Selbstübertragung:', 'Legen Sie zuerst einen Tamper Check Code fest', 'Einstellungen', 'Die Einstellungen werden intern auf Flash gespeichert.', 'Einstellungen auf SD-Karte gespeichert.', 'Shannons Entropie:', 'Ausschalten', 'Abschaltzeit:', 'Herunterfahren..', 'Signieren', 'Am QR-Code unterschreiben', 'Auf SD-Karte signieren', 'Signieren?', 'Signatur', 'Signierte Nachricht', 'Signierte PSBT', 'Unterschreiben..', 'Single-Sig', 'Größe:', 'Einige Schecks können nicht durchgeführt werden.', 'Ausgabe (%d):', 'Ausgaben:', 'Statistiken für Nerds', 'Auf Flash speichern', 'Auf der SD-Karte speichern', 'Wischen um den Modus zu ändern', 'TC Flash-Hash', 'TC Flash-Hash beim Start', 'TOUCH oder ENTER zum Erfassen', 'TX Pin', 'Tamper Check Code', 'Tamper Check Code erfolgreich gesetzt', 'Tamper Check Codes stimmen nicht überein', 'Text', "The app will be copied to user's flash ", 'Thema', 'Thermisch', "Um sicherzustellen, dass die Daten nicht wiederhergestellt werden können, verwenden Sie die Funktion 'Gerät löschen'", 'Helligkeit umschalten', 'Werkzeuge', 'Berühre Schwellenwert', 'Touchscreen', 'Weiter versuchen?', 'BIP39 Passphrase eingeben', 'Schlüssel eingeben', 'Einheit', 'Upgrade abgeschlossen.', 'Verwende eine schwarze Hintergrundfläche.', 'Verwende die Entropie der Kamera, um eine neue Mnemonic zu erstellen', 'Belegt:', 'Benutzerdaten', 'Wert %S außerhalb des Bereichs: [ %s, %s]', 'Der Wert muss ein Vielfaches von %s sein', 'Überprüfung..', 'Version', 'Via Kamera', 'Via D20', 'Via D6', 'Via manueller Eingabe', 'Via Wörter', 'Warte auf die Erfassung', 'Wallet', 'Wallet-Deskriptor', 'Wallet Ausgabedeskriptor', 'Wallet Ausgabedeskriptor geladen!', 'Wallet Ausgabedeskriptor nicht gefunden.', 'Warnung:', 'Wort %d', 'Wortnummern', 'Wörter', 'Ja', 'ist eine gültige Adresse!', 'wurde in den ersten %d Adressen nicht gefunden'] diff --git a/src/krux/translations/es.py b/src/krux/translations/es.py index 9cfc533e9..37d7751c5 100644 --- a/src/krux/translations/es.py +++ b/src/krux/translations/es.py @@ -20,326 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = [ - "% del monto.", - "%d de %d multisig", - "%d a %d", - "%s eliminado.", - "(%d total)", - "(Experimental)", - "(Solo para observación)", - "12 palabras", - "24 palabras", - "Nosotros", - "¿Aceptar la suposición?", - "Cuenta", - "Se supondría que la cuenta #0", - "Índice de la cuenta", - "¿Añadir o cambiar passphrase de la cartera?", - "Se requiere entropía adicional de la cámara para el modo AES-CBC", - "Dirección", - "Alinea la cámara y la placa de respaldo correctamente.", - "¡Permitir en la configuración primero!", - "Anti-reflejo desactivado", - "Anti-reflejo habilitado", - "Apariencia", - "¿Estás seguro?", - "Colores BGR", - "Mnemónico BIP39", - "Atrás", - "Volver al Menú", - "Backup del Mnemónico", - "Firma incorrecta", - "Contraseña Base64", - "Baudrate", - "Cuadrícula binaria", - "Grosor del Borde", - "Brillo", - "Botones", - "Rebote de Botones", - "Captura cancelada", - "Cambio", - "Direcciones de Cambio", - "¿Cambiar de tema y reiniciar?", - "Cambio:", - "Los cambios durarán hasta que el dispositivo se apague.", - "Verifica Tarjeta SD", - "¿Verificar que la dirección pertenece a esta cartera?", - "Comprobado %d direcciones sin coincidencias.", - "Comprobación de la tarjeta SD..", - "Confirmar el código de verificación", - "no se pudo ejecutar [%1]", - "Crear Código QR", - "¿Crear código QR desde texto?", - "Creado:", - "Código de verificación actual", - "Código QR Personalizado", - "Personalizar", - "Personalizar tu cartera generará una nueva clave", - "Profundidad de Corte", - "Método de Corte", - "Decimal", - "¿Descifrar?", - "Cartera Predeterminada", - "Profundidad por Pasada", - "¿Derivar entropía BIP85?", - "Direcciones del descriptor", - "Pantalla", - "No apagues el dispositivo, puede tardar un tiempo en completarse.", - "¿Listo?", - "Doble mnemónico", - "Operador", - "Vacío", - "Habilitar aplicaciones Krux", - "Cifrado", - "Código QR Cifrado", - "Mnemónico cifrado no se almacenó", - "Mnemónico cifrado fue almacenado con ID:", - "Cifrado", - "Modo de Cifrado", - "Ingrese %d palabras BIP-39.", - "Introduzca un código de verificación de más de 6 caracteres", - "Ingresa cada palabra de tu mnemónico BIP-39 como un número del 1 al 2048.", - "Ingresa cada palabra de tu mnemónico BIP-39 como un número en hexadecimal del 1 al 800.", - "Ingresa cada palabra de tu mnemónico BIP-39 como un número en octal del 1 al 4000.", - "Ingresa cada palabra de tu mnemónico BIP-39.", - "Borrar datos de usuario", - "Borrando los datos del usuario..", - "Error:", - "Esc", - "¿Ejecutar una aplicación Krux firmada?", - "¿Explorar archivos?", - "Exportando a la tarjeta SD..", - "Clave Pública Extendida", - "Ajustes de Fábrica", - "Error al descifrar", - "No se pudo cargar la PSBT", - "No se pudo cargar la dirección", - "No se pudo cargar la clave", - "No se pudo cargar el mensaje", - "No se pudo importar el mnemónico", - "No se pudo cargar el descriptor de salida", - "No se pudo cargar el passphrase", - "No pudo almacenar mnemónico", - "Comisión:", - "Feed Rate", - "Nombre del Archivo", - "El nombre de archivo %s existe en la tarjeta SD, ¿sobrescribir?", - "¿Llenar el flash con entropía de la cámara?", - "Llenando Flash", - "Huella dactilar no establecida en PSBT", - "El firmware supera el tamaño máximo: %d", - "Mapa Flash", - "Flash Tools", - "Flash lleno de entropía de cámara", - "Coordenadas X Invertidas", - "Diámetro de la Flauta", - "Libre:", - "Desde el Almacenamiento", - "Borra completamente su tarjeta SD en otro dispositivo para asegurarse de que los datos sean irrecuperables", - "Generar Mnemónico", - "¿Darle a este mnemónico una identificación personalizada? De lo contrario se utilizará el fingerprint actual", - "Ir", - "Buena entropía", - "Hardware", - "Clave Pública Hexadecimal", - "Hexadecimal", - "Ocultar Mnemónicos", - "¡Tarifas altas!", - "ID ya existe", - "Índice", - "Índice: %s", - "Entradas (%d):", - "¿Instalar?", - "¡Entropía Insuficiente!", - "Entropía insuficiente", - "Código de verificación no válido", - "Dirección inválida", - "Bootloader inválido", - "Longitud mnemónica no válida", - "Clave pública inválida", - "Cartera inválida:", - "Invertir", - "Colores Invertidos", - "Clave", - "No se proporcionó la clave", - "Test de impresión QR", - "Tipo de LCD", - "Idioma", - "Déjalo en blanco si quieres que Krux elija una última palabra válida", - "Izquierda", - "Longitud: %s", - "Retraso de Línea", - "Línea:", - "Cargar aplicación Krux", - "Importar Mnemónico", - "Cargar Cartera", - "¿Cargar un descriptor de monedero de confianza para ver las direcciones?", - "Cargar desde tarjeta SD", - "¿Cargar desde la tarjeta SD?", - "Cargar desde la cámara", - "¿Cargar algo?", - "¿Cargar?", - "Cargando Camara..", - "Cargando direcciones de cambio..", - "Cargando impresora..", - "Cargando direcciones de recepción..", - "Cargando..", - "Idioma", - "Ubicación", - "Longitud máxima excedida (%s)", - "Mensaje", - "Mensaje:", - "Falta archivo de firma", - "Mnemónico", - "Identificación del Mnemónico", - "Mnemónico y passphrase se mantendrán.", - "Mnemónico no fue descifrado", - "Modificado:", - "Multisig", - "Segwit nativo - 84 se supondría", - "Red", - "Nuevo Mnemónico", - "Nuevo firmware detectado.", - "No", - "Sin Passphrase", - "¡No hay suficientes tiradas!", - "Números", - "Octales", - "Otros Formatos", - "Iter. PBKDF2", - "Pinte los puntos perforados de negro para que puedan ser detectados.", - "Ancho del Papel", - "Parte", - "Tamaño de la Pieza", - "Passphrase", - "Longitud", - "La ruta no coincide", - "¡Patrón detectado!", - "¿Eliminar permanentemente todos los mnemónicos y configuraciones cifradas almacenadas del flash?", - "Guardar", - "Índice de desviación de píxeles:", - "QR de Texto", - "Carga un descriptor de cartera", - "Tasa de Caída", - "Baja entropía", - "Mala entropía detectada!", - "Prueba de Impresión QR", - "¿Imprimir Tiny Seed?", - "Imprimir como Código QR", - "¿Imprimir con Codigo QR?", - "¿Impresión?", - "Impresora", - "¡El controlador de impresora no está configurado!", - "Imprimiendo..", - "¿Proceder de todas maneras?", - "¿Continuar?", - "Procesando..", - "Código QR", - "RX Pin", - "Reiniciar", - "Recepción", - "Direcciones de Recepción", - "Región:", - "Eliminar %s?", - "Eliminar Mnemónico", - "¿Eliminar archivos de firmware de la tarjeta SD?", - "Res. - Formato", - "¿Restablecer a la configuración de fábrica y reiniciar?", - "Volver al QR", - "Revisa los datos escaneados, edítalos si es necesario", - "Derecha", - "Tira el dado al menos %d veces para generar un mnemónico.", - "Distribución de tiradas:", - "Tiradas:", - "Tarjeta SD", - "Tarjeta SD no detectada.", - "SHA256 de las tiradas:", - "SHA256 de la instantánea:", - "Guardar Imagen QR en la Tarjeta SD", - "Guardar en tarjeta SD", - "¿Guardar en la tarjeta SD?", - "Guardado en la tarjeta SD", - "Escala", - "Escanear Dirección", - "Escanear Passphrase BIP39", - "Escanear el Código QR", - "Escaneo de palabras 1-12 de nuevo", - "Escaneo de palabras 13-24", - "Tiempo de Espera del Protector de Pantalla", - "Tipo de Script", - "Seguridad", - "Autotransferencia o Cambio (%d):", - "Autotransferencia:", - "Establezca primero un código de verificación", - "Ajustes", - "Ajustes almacenados internamente en flash.", - "Configuración almacenada en la tarjeta SD.", - "Entropía de Shannon:", - "Apagar", - "Tiempo de Apagado", - "Apagando..", - "Firmar", - "Firmar en Código QR", - "Firmar en la Tarjeta SD", - "¿Firmar?", - "Firma", - "Mensaje Firmado", - "PSBT Firmado", - "Firmando..", - "Single-sig", - "Tamaño:", - "Algunas comprobaciones no se pueden realizar.", - "Gastos (%d):", - "Gasto:", - "Estadísticas para Entendidos", - "Almacenar en Flash", - "Almacenar en la Tarjeta SD", - "Deslizar para cambiar de modo", - "TC Hash Flash", - "TC Flash Hash al arranque", - "TOCA o ENTER para capturar", - "TX Pin", - "Código de verificación", - "Código de verificación establecido con éxito", - "Los códigos de verificación no coinciden", - "Texto", - "Tema", - "Térmico", - "Para garantizar que los datos no se puedan recuperar, utiliza la función de borrar dispositivo", - "Alternar Brillo", - "Herramientas", - "Umbral Táctil", - "Pantalla Táctil", - "¿Intentar con mas?", - "Escribe la Passphrase BIP39", - "Introduce la clave", - "Unidad", - "Actualización completa.", - "Usa una superficie de fondo negra.", - "Usa la entropía de la cámara para crear una nueva mnemónica", - "Usado:", - "Usuario", - "Valor %s fuera del rango: [ %s, %s]", - "El valor debe ser múltiple de %s", - "Verificando..", - "Versión", - "Desde Cámara", - "Vía D20", - "Vía D6", - "Introducción Manual", - "A Través de Palabras", - "Espera la captura", - "Cartera", - "Descriptor de Cartera", - "Descriptor de salida de cartera", - "¡Se ha cargado el descriptor de salida de la cartera!", - "No se encontró el descriptor de salida de la cartera.", - "Advertencia:", - "Palabra %d", - "Números de Palabra", - "Palabras", - "Sí", - "es una dirección válida!", - "NO FUE ENCONTRADO en las primeras %d direcciones", -] +translation_array = ['% del monto.', '%d de %d multisig', '%d a %d', '%s eliminado.', '(%d total)', '(Experimental)', '(Solo para observación)', '12 palabras', '24 palabras', 'Nosotros', '¿Aceptar la suposición?', 'Cuenta', 'Se supondría que la cuenta #0', 'Índice de la cuenta', '¿Añadir o cambiar passphrase de la cartera?', 'Se requiere entropía adicional de la cámara para el modo AES-CBC', 'Dirección', 'Alinea la cámara y la placa de respaldo correctamente.', '¡Permitir en la configuración primero!', 'Anti-reflejo desactivado', 'Anti-reflejo habilitado', 'Apariencia', '¿Estás seguro?', 'Colores BGR', 'Mnemónico BIP39', 'Atrás', 'Volver al Menú', 'Backup del Mnemónico', 'Firma incorrecta', 'Contraseña Base64', 'Baudrate', 'Cuadrícula binaria', 'Grosor del Borde', 'Brillo', 'Botones', 'Rebote de Botones', 'Captura cancelada', 'Cambio', 'Direcciones de Cambio', '¿Cambiar de tema y reiniciar?', 'Cambio:', 'Los cambios durarán hasta que el dispositivo se apague.', 'Verifica Tarjeta SD', '¿Verificar que la dirección pertenece a esta cartera?', 'Comprobado %d direcciones sin coincidencias.', 'Comprobación de la tarjeta SD..', 'Confirmar el código de verificación', 'Crear Código QR', '¿Crear código QR desde texto?', 'Creado:', 'Código de verificación actual', 'Código QR Personalizado', 'Personalizar', 'Personalizar tu cartera generará una nueva clave', 'Profundidad de Corte', 'Método de Corte', 'Decimal', '¿Descifrar?', 'Cartera Predeterminada', 'Profundidad por Pasada', '¿Derivar entropía BIP85?', 'Direcciones del descriptor', 'Pantalla', 'No apagues el dispositivo, puede tardar un tiempo en completarse.', '¿Listo?', 'Doble mnemónico', 'Operador', 'Vacío', 'Habilitar aplicaciones Krux', 'Cifrado', 'Código QR Cifrado', 'Mnemónico cifrado no se almacenó', 'Mnemónico cifrado fue almacenado con ID:', 'Cifrado', 'Modo de Cifrado', 'Ingrese %d palabras BIP-39.', 'Introduzca un código de verificación de más de 6 caracteres', 'Ingresa cada palabra de tu mnemónico BIP-39 como un número del 1 al 2048.', 'Ingresa cada palabra de tu mnemónico BIP-39 como un número en hexadecimal del 1 al 800.', 'Ingresa cada palabra de tu mnemónico BIP-39 como un número en octal del 1 al 4000.', 'Ingresa cada palabra de tu mnemónico BIP-39.', 'Borrar datos de usuario', 'Borrando los datos del usuario..', 'Error:', 'Esc', '¿Ejecutar una aplicación Krux firmada?', '¿Explorar archivos?', 'Exportando a la tarjeta SD..', 'Clave Pública Extendida', 'Ajustes de Fábrica', 'Error al descifrar', 'No se pudo cargar la PSBT', 'No se pudo cargar la dirección', 'No se pudo cargar la clave', 'No se pudo cargar el mensaje', 'No se pudo importar el mnemónico', 'No se pudo cargar el descriptor de salida', 'No se pudo cargar el passphrase', 'No pudo almacenar mnemónico', 'Comisión:', 'Feed Rate', 'Nombre del Archivo', 'El nombre de archivo %s existe en la tarjeta SD, ¿sobrescribir?', '¿Llenar el flash con entropía de la cámara?', 'Llenando Flash', 'Huella dactilar no establecida en PSBT', 'El firmware supera el tamaño máximo: %d', 'Mapa Flash', 'Flash Tools', 'Flash lleno de entropía de cámara', 'Coordenadas X Invertidas', 'Diámetro de la Flauta', 'Libre:', 'Desde el Almacenamiento', 'Borra completamente su tarjeta SD en otro dispositivo para asegurarse de que los datos sean irrecuperables', 'Generar Mnemónico', '¿Darle a este mnemónico una identificación personalizada? De lo contrario se utilizará el fingerprint actual', 'Ir', 'Buena entropía', 'Hardware', 'Clave Pública Hexadecimal', 'Hexadecimal', 'Ocultar Mnemónicos', '¡Tarifas altas!', 'ID ya existe', 'Índice', 'Índice: %s', 'Entradas (%d):', '¿Instalar?', '¡Entropía Insuficiente!', 'Entropía insuficiente', 'Código de verificación no válido', 'Dirección inválida', 'Bootloader inválido', 'Longitud mnemónica no válida', 'Clave pública inválida', 'Cartera inválida:', 'Invertir', 'Colores Invertidos', 'Clave', 'No se proporcionó la clave', 'Test de impresión QR', 'Tipo de LCD', 'Idioma', 'Déjalo en blanco si quieres que Krux elija una última palabra válida', 'Izquierda', 'Longitud: %s', 'Retraso de Línea', 'Línea:', 'Cargar aplicación Krux', 'Importar Mnemónico', 'Cargar Cartera', '¿Cargar un descriptor de monedero de confianza para ver las direcciones?', 'Cargar desde tarjeta SD', '¿Cargar desde la tarjeta SD?', 'Cargar desde la cámara', '¿Cargar algo?', '¿Cargar?', 'Cargando Camara..', 'Cargando direcciones de cambio..', 'Cargando impresora..', 'Cargando direcciones de recepción..', 'Cargando..', 'Idioma', 'Ubicación', 'Longitud máxima excedida (%s)', 'Mensaje', 'Mensaje:', 'Falta archivo de firma', 'Mnemónico', 'Identificación del Mnemónico', 'Mnemónico y passphrase se mantendrán.', 'Mnemónico no fue descifrado', 'Modificado:', 'Multisig', 'Segwit nativo - 84 se supondría', 'Red', 'Nuevo Mnemónico', 'Nuevo firmware detectado.', 'No', 'Sin Passphrase', '¡No hay suficientes tiradas!', 'Números', 'Octales', 'Otros Formatos', 'Iter. PBKDF2', 'Pinte los puntos perforados de negro para que puedan ser detectados.', 'Ancho del Papel', 'Parte', 'Tamaño de la Pieza', 'Passphrase', 'Longitud', 'La ruta no coincide', '¡Patrón detectado!', '¿Eliminar permanentemente todos los mnemónicos y configuraciones cifradas almacenadas del flash?', 'Guardar', 'Índice de desviación de píxeles:', 'QR de Texto', 'Carga un descriptor de cartera', 'Tasa de Caída', 'Baja entropía', 'Mala entropía detectada!', 'Prueba de Impresión QR', '¿Imprimir Tiny Seed?', 'Imprimir como Código QR', '¿Imprimir con Codigo QR?', '¿Impresión?', 'Impresora', '¡El controlador de impresora no está configurado!', 'Imprimiendo..', '¿Proceder de todas maneras?', '¿Continuar?', 'Procesando..', 'Código QR', 'RX Pin', 'Reiniciar', 'Recepción', 'Direcciones de Recepción', 'Región:', 'Eliminar %s?', 'Eliminar Mnemónico', '¿Eliminar archivos de firmware de la tarjeta SD?', 'Res. - Formato', '¿Restablecer a la configuración de fábrica y reiniciar?', 'Volver al QR', 'Revisa los datos escaneados, edítalos si es necesario', 'Derecha', 'Tira el dado al menos %d veces para generar un mnemónico.', 'Distribución de tiradas:', 'Tiradas:', 'Tarjeta SD', 'Tarjeta SD no detectada.', 'SHA256 de las tiradas:', 'SHA256 de la instantánea:', 'Guardar Imagen QR en la Tarjeta SD', 'Guardar en tarjeta SD', '¿Guardar en la tarjeta SD?', 'Guardado en la tarjeta SD', 'Escala', 'Escanear Dirección', 'Escanear Passphrase BIP39', 'Escanear el Código QR', 'Escaneo de palabras 1-12 de nuevo', 'Escaneo de palabras 13-24', 'Tiempo de Espera del Protector de Pantalla', 'Tipo de Script', 'Seguridad', 'Autotransferencia o Cambio (%d):', 'Autotransferencia:', 'Establezca primero un código de verificación', 'Ajustes', 'Ajustes almacenados internamente en flash.', 'Configuración almacenada en la tarjeta SD.', 'Entropía de Shannon:', 'Apagar', 'Tiempo de Apagado', 'Apagando..', 'Firmar', 'Firmar en Código QR', 'Firmar en la Tarjeta SD', '¿Firmar?', 'Firma', 'Mensaje Firmado', 'PSBT Firmado', 'Firmando..', 'Single-sig', 'Tamaño:', 'Algunas comprobaciones no se pueden realizar.', 'Gastos (%d):', 'Gasto:', 'Estadísticas para Entendidos', 'Almacenar en Flash', 'Almacenar en la Tarjeta SD', 'Deslizar para cambiar de modo', 'TC Hash Flash', 'TC Flash Hash al arranque', 'TOCA o ENTER para capturar', 'TX Pin', 'Código de verificación', 'Código de verificación establecido con éxito', 'Los códigos de verificación no coinciden', 'Texto', "The app will be copied to user's flash ", 'Tema', 'Térmico', 'Para garantizar que los datos no se puedan recuperar, utiliza la función de borrar dispositivo', 'Alternar Brillo', 'Herramientas', 'Umbral Táctil', 'Pantalla Táctil', '¿Intentar con mas?', 'Escribe la Passphrase BIP39', 'Introduce la clave', 'Unidad', 'Actualización completa.', 'Usa una superficie de fondo negra.', 'Usa la entropía de la cámara para crear una nueva mnemónica', 'Usado:', 'Usuario', 'Valor %s fuera del rango: [ %s, %s]', 'El valor debe ser múltiple de %s', 'Verificando..', 'Versión', 'Desde Cámara', 'Vía D20', 'Vía D6', 'Introducción Manual', 'A Través de Palabras', 'Espera la captura', 'Cartera', 'Descriptor de Cartera', 'Descriptor de salida de cartera', '¡Se ha cargado el descriptor de salida de la cartera!', 'No se encontró el descriptor de salida de la cartera.', 'Advertencia:', 'Palabra %d', 'Números de Palabra', 'Palabras', 'Sí', 'es una dirección válida!', 'NO FUE ENCONTRADO en las primeras %d direcciones'] diff --git a/src/krux/translations/fr.py b/src/krux/translations/fr.py index ccf57bd38..adaa2ff3b 100644 --- a/src/krux/translations/fr.py +++ b/src/krux/translations/fr.py @@ -20,326 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = [ - "% du montant.", - "%d de %d multisignature", - "%d à %d", - "%s supprimé.", - "(%d au total)", - "(Expérimental)", - "(consultation)", - "12 mots", - "24 mots", - "À propos", - "Accepter supposition\u2009?", - "Compte", - "Le compte n °0 serait supposé", - "Index du compte", - "Ajoutez ou modifiez la phrase secrète\u2009?", - "Entropie supplémentaire de la caméra requise pour le mode AES-CBC", - "Adresse", - "Alignez correctement la caméra et plaque de sauvegarde.", - "Autoriser d'abord dans les paramètres !", - "Anti-éblouissement désactivé", - "Anti-éblouissement activé", - "Apparence", - "Es-tu sûr\u2009?", - "Couleurs BGR", - "Mnémonique BIP39", - "Retour", - "Retour au menu", - "Sauvegarde mnémonique", - "Signature non valide", - "Mot de passe Base64", - "Débit en bauds", - "Grille binaire", - "Rembourrage de bordure", - "Luminosité", - "Boutons", - "Anti-rebond des boutons", - "Capture annulée", - "Monnaie", - "Adresses de Monnaie", - "Changer de thème et redémarrer\u2009?", - "La monnaie\u2009:", - "Les modifications dureront jusqu'à l'arrêt.", - "Vérifiez la carte SD", - "Vérifiez que l'adresse appartient à ce portefeuille\u2009?", - "%d adresses vérifiées sans correspondance.", - "Vérification de la carte SD..", - "Confirmer le code de non compromis", - "Impossible d'exécuter [%1]", - "Créer un code QR", - "Créer un code QR à partir d'un texte\u2009?", - "Créé\u2009:", - "Code de non compromis actuel", - "Code QR personnalisé", - "Personnaliser", - "La personnalisation de votre portefeuille générera une nouvelle clé.", - "Profondeur de coupe", - "Méthode de coupe", - "Décimal", - "Déchiffrer ?", - "Portefeuille par défaut", - "Profondeur par passage", - "Dériver l'entropie BIP85 ?", - "Adresses du descripteur", - "Affichage", - "Ne pas éteindre, cela peut prendre un certain temps.", - "Terminé\u2009?", - "Double mnémonique", - "Pilote", - "Vide", - "Activer les applications Krux", - "Chiffré", - "Code QR chiffré", - "Le mnémonique chiffré n'a pas été stocké", - "Mnémonique chiffré a été stocké avec ID\u2009:", - "Chiffrement", - "Mode de chiffrement", - "Entrez %d mots BIP-39.", - "Saisissez un code de non compromis de plus de 6 caractères", - "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre de 1 à 2048.", - "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en hexadécimal de 1 à 800.", - "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en octal de 1 à 4000.", - "Entrez chaque mot de votre mnémonique BIP-39.", - "Effacer les données de l'utilisateur", - "Effacement des données de l'utilisateur...", - "Erreur\u2009:", - "Esc", - "Exécuter une application Krux signée ?", - "Explorer des fichiers\u2009?", - "Exportation vers la carte SD..", - "Clé publique", - "Paramètres d'usine", - "Échec du déchiffrement", - "Échec du chargement PSBT", - "Échec du chargement d'adresse", - "Échec du chargement de la clé", - "Échec du chargement du message", - "Échec du chargement mnémonique", - "Échec du chargement du descripteur de sortie", - "Échec du chargement de la phrase secrète", - "Échec du stockage mnémonique", - "Frais\u2009:", - "Taux d'alimentation", - "Nom de fichier", - "Le nom de fichier %s existe sur la carte SD, écraser\u2009?", - "Remplir le flash avec l'entropie de la caméra ?", - "Remplissage du Flash", - "Empreinte digitale manquante dans PSBT", - "Le micrologiciel dépasse la taille maximale\u2009: %d", - "Plan du Flash", - "Outils Flash", - "Flash rempli par l'entropie de la caméra", - "Coordonnées X inversées", - "Diamètre de flûte", - "Libre\u2009:", - "Du stockage", - "Effacez complètement votre carte SD dans un autre appareil pour assurer que les données soient irrécupérables", - "Générer un mnémonique", - "Donnez à ce mnémonique un identifiant personnalisé\u2009? Sinon l'empreinte actuelle sera utilisée", - "OK", - "Bonne entropie", - "Matériel", - "Clé publique hexadécimale", - "Hexadécimal", - "Masquer les mnémoniques", - "Frais élevés\u2009!", - "Id existe déjà", - "Index", - "Index : %s", - "Entrées (%d)\u2009:", - "Installer\u2009?", - "Entropie insuffisante\u2009!", - "Entropie insuffisante", - "Code de non compromis non valide", - "Adresse invalide", - "Chargeur de démarrage invalide", - "Longueur mnémonique invalide", - "Clé publique non valide", - "Portefeuille invalide\u2009:", - "Inverser", - "Couleurs inversées", - "Clé", - "La clé n'a pas été fournie", - "Test de l'imprimante Krux QR", - "Type d'écran LCD", - "Langue", - "Laissez vide si vous souhaitez que Krux choisisse un dernier mot valide", - "Gauche", - "Longueur : %s", - "Délai de Ligne", - "Ligne\u2009:", - "Charger l'application Krux", - "Charger Mnémonique", - "Charger le portefeuille", - "Charger un descripteur de portefeuille de confiance pour afficher les adresses\u2009?", - "Charger depuis la carte SD", - "Charger depuis la carte SD\u2009?", - "Charger depuis la caméra", - "Charger\u2009?", - "Charger\u2009?", - "Activation de la Caméra..", - "Chargement des adresses de monnaie..", - "Activation de l'imprimante..", - "Chargement des adresses de réception ..", - "Chargement..", - "Paramètres régionaux", - "Emplacement", - "Longueur maximale dépassée (%s)", - "Message", - "Message\u2009:", - "Fichier de signature manquant", - "Mnémonique", - "ID Mnémonique", - "Mnémonique et phrase secrète seront conservés.", - "Mnémonique n'était pas chiffré", - "Modifié\u2009:", - "Multi\nsignature", - "Native Segwit - 84 serait supposé", - "Réseau", - "Nouveau Mnémonique", - "Nouveau micrologiciel détecté.", - "Non", - "Pas de phrase secrète", - "Pas assez de jets\u2009!", - "Nombres", - "Octale", - "Autres formats", - "Itér. PBKDF2", - "Noircissez les points perforés afin qu'ils puissent être détectés.", - "Largeur du papier", - "Partie", - "Taille de la pièce", - "Phrase secréte", - "Longueur du mot de passe", - "Inadéquation du chemin", - "Pattern détecté\u2009!", - "Supprimer définitivement tous les mnémoniques et paramètres chiffrés stockés dans le flash\u2009?", - "Persistance", - "Indice de déviation des pixels\u2009:", - "QR en Texte Brut", - "Veuillez charger un descripteur de sortie de portefeuille", - "Taux de plongée", - "Entropie faible", - "Entropie faible détectée\u2009!", - "Impression Test QR", - "Imprimer Tiny Seed\u2009?", - "Imprimer Code QR", - "Imprimer Code QR\u2009?", - "Imprimer\u2009?", - "Imprimante", - "Le pilote d'imprimante n'est pas défini\u2009!", - "Impression..", - "Procéder quand même\u2009?", - "Procéder\u2009?", - "Traitement..", - "Code QR", - "RX Fiche", - "Redémarrer", - "Recevoir", - "Adresses de Réception", - "Région\u2009:", - "Supprimer %s\u2009?", - "Supprimer mnémonique", - "Supprimer les fichiers micrologiciel de la carte SD\u2009?", - "Rés. - Format", - "Restaurer les paramètres d'usine et redémarrer\u2009?", - "Retour au visualiseur QR", - "Examinez les données numérisées, modifiez-les si nécessaire", - "À droite", - "Lancez le dé au moins %d fois pour générer un mnémonique.", - "Distribution des jets\u2009:", - "Jets\u2009:", - "Carte SD", - "Carte SD non détectée.", - "SHA256 de jets\u2009:", - "SHA256 de snapshot\u2009:", - "Enregistrer l'image QR sur la carte SD", - "Enregistrer sur la carte SD", - "Enregistrer sur la carte SD\u2009?", - "Enregistré sur la carte SD", - "L'échelle", - "Scannez l'adresse", - "Scannez la phrase secrète BIP-39", - "Scannez le Code QR de la clé", - "Analyser à nouveau les mots 1 à 12", - "Analyser les mots 13 à 24", - "Delai d'Inactivité", - "Type de Script", - "Sécurité", - "Auto-transfert ou monnaie (%d)\u2009:", - "Auto-transfert\u2009:", - "Définissez d'abord un code de non compromis", - "Paramètres", - "Paramètres stockés en interne sur flash.", - "Paramètres stockés sur la carte SD.", - "Entropie de Shannon\u2009:", - "Éteindre", - "Delai d'Arrêt", - "Arrêt en cours..", - "Signer", - "Signer avec le code QR", - "Signer sur la carte SD", - "Signer\u2009?", - "Signature", - "Message signé", - "PSBT signé", - "Signature..", - "Clé unique", - "Capacité\u2009:", - "Certains vérifications ne peuvent pas être effectués.", - "Dépense (%d)\u2009:", - "Dépense\u2009:", - "Statistiques pour les geeks", - "Stocker sur flash", - "Stocker sur la carte SD", - "Faites glisser pour changer de mode", - "TC Flash Hash", - "TC Flash Hash au démarrage", - "TOUCHEZ ou ENTRER pour capturer", - "TX Fiche", - "Code de non compromis", - "Code de non compromis défini avec succès", - "Les codes de non compromis ne correspondent pas", - "Texte", - "Thème", - "Thermique", - "Pour assurer que les données soient irrécupérables, utilisez la fonctionnalité 'Effacer l'appareil'", - "Ajuster la luminosité", - "Outils", - "Sensibilité", - "Écran Tactile", - "Réessayer\u2009?", - "Entrez la phrase secrète BIP-39", - "Taper clé", - "Unité", - "Mise à jour complète.", - "Utilisez une surface de fond noire.", - "Utilisez l'entropie de la caméra pour créer un nouveau mnémonique", - "Utilisé\u2009:", - "Utilisateur", - "Valeur %s hors de portée: [%s, %s]", - "La valeur doit être un multiple de %s", - "Vérification..", - "Version", - "Par caméra", - "Via D20", - "Via D6", - "Par saisie manuelle", - "Via Mots", - "Attendez la capture", - "Portefeuille", - "Descripteur de Portefeuille", - "Descripteur de sortie du portefeuille", - "Descripteur de sortie du portefeuille chargé\u2009!", - "Descripteur de sortie du portefeuille introuvable.", - "Avertissement\u2009:", - "Mot %d", - "Numéros de mots", - "Mots", - "Oui", - "Adresse non valide\u2009!", - "INTROUVABLE dans les %d premières adresses", -] +translation_array = ['% du montant.', '%d de %d multisignature', '%d à %d', '%s supprimé.', '(%d au total)', '(Expérimental)', '(consultation)', '12 mots', '24 mots', 'À propos', 'Accepter supposition\u2009?', 'Compte', 'Le compte n °0 serait supposé', 'Index du compte', 'Ajoutez ou modifiez la phrase secrète\u2009?', 'Entropie supplémentaire de la caméra requise pour le mode AES-CBC', 'Adresse', 'Alignez correctement la caméra et plaque de sauvegarde.', "Autoriser d'abord dans les paramètres !", 'Anti-éblouissement désactivé', 'Anti-éblouissement activé', 'Apparence', 'Es-tu sûr\u2009?', 'Couleurs BGR', 'Mnémonique BIP39', 'Retour', 'Retour au menu', 'Sauvegarde mnémonique', 'Signature non valide', 'Mot de passe Base64', 'Débit en bauds', 'Grille binaire', 'Rembourrage de bordure', 'Luminosité', 'Boutons', 'Anti-rebond des boutons', 'Capture annulée', 'Monnaie', 'Adresses de Monnaie', 'Changer de thème et redémarrer\u2009?', 'La monnaie\u2009:', "Les modifications dureront jusqu'à l'arrêt.", 'Vérifiez la carte SD', "Vérifiez que l'adresse appartient à ce portefeuille\u2009?", '%d adresses vérifiées sans correspondance.', 'Vérification de la carte SD..', 'Confirmer le code de non compromis', 'Créer un code QR', "Créer un code QR à partir d'un texte\u2009?", 'Créé\u2009:', 'Code de non compromis actuel', 'Code QR personnalisé', 'Personnaliser', 'La personnalisation de votre portefeuille générera une nouvelle clé.', 'Profondeur de coupe', 'Méthode de coupe', 'Décimal', 'Déchiffrer ?', 'Portefeuille par défaut', 'Profondeur par passage', "Dériver l'entropie BIP85 ?", 'Adresses du descripteur', 'Affichage', 'Ne pas éteindre, cela peut prendre un certain temps.', 'Terminé\u2009?', 'Double mnémonique', 'Pilote', 'Vide', 'Activer les applications Krux', 'Chiffré', 'Code QR chiffré', "Le mnémonique chiffré n'a pas été stocké", 'Mnémonique chiffré a été stocké avec ID\u2009:', 'Chiffrement', 'Mode de chiffrement', 'Entrez %d mots BIP-39.', 'Saisissez un code de non compromis de plus de 6 caractères', "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre de 1 à 2048.", "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en hexadécimal de 1 à 800.", "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en octal de 1 à 4000.", 'Entrez chaque mot de votre mnémonique BIP-39.', "Effacer les données de l'utilisateur", "Effacement des données de l'utilisateur...", 'Erreur\u2009:', 'Esc', 'Exécuter une application Krux signée ?', 'Explorer des fichiers\u2009?', 'Exportation vers la carte SD..', 'Clé publique', "Paramètres d'usine", 'Échec du déchiffrement', 'Échec du chargement PSBT', "Échec du chargement d'adresse", 'Échec du chargement de la clé', 'Échec du chargement du message', 'Échec du chargement mnémonique', 'Échec du chargement du descripteur de sortie', 'Échec du chargement de la phrase secrète', 'Échec du stockage mnémonique', 'Frais\u2009:', "Taux d'alimentation", 'Nom de fichier', 'Le nom de fichier %s existe sur la carte SD, écraser\u2009?', "Remplir le flash avec l'entropie de la caméra ?", 'Remplissage du Flash', 'Empreinte digitale manquante dans PSBT', 'Le micrologiciel dépasse la taille maximale\u2009: %d', 'Plan du Flash', 'Outils Flash', "Flash rempli par l'entropie de la caméra", 'Coordonnées X inversées', 'Diamètre de flûte', 'Libre\u2009:', 'Du stockage', 'Effacez complètement votre carte SD dans un autre appareil pour assurer que les données soient irrécupérables', 'Générer un mnémonique', "Donnez à ce mnémonique un identifiant personnalisé\u2009? Sinon l'empreinte actuelle sera utilisée", 'OK', 'Bonne entropie', 'Matériel', 'Clé publique hexadécimale', 'Hexadécimal', 'Masquer les mnémoniques', 'Frais élevés\u2009!', 'Id existe déjà', 'Index', 'Index : %s', 'Entrées (%d)\u2009:', 'Installer\u2009?', 'Entropie insuffisante\u2009!', 'Entropie insuffisante', 'Code de non compromis non valide', 'Adresse invalide', 'Chargeur de démarrage invalide', 'Longueur mnémonique invalide', 'Clé publique non valide', 'Portefeuille invalide\u2009:', 'Inverser', 'Couleurs inversées', 'Clé', "La clé n'a pas été fournie", "Test de l'imprimante Krux QR", "Type d'écran LCD", 'Langue', 'Laissez vide si vous souhaitez que Krux choisisse un dernier mot valide', 'Gauche', 'Longueur : %s', 'Délai de Ligne', 'Ligne\u2009:', "Charger l'application Krux", 'Charger Mnémonique', 'Charger le portefeuille', 'Charger un descripteur de portefeuille de confiance pour afficher les adresses\u2009?', 'Charger depuis la carte SD', 'Charger depuis la carte SD\u2009?', 'Charger depuis la caméra', 'Charger\u2009?', 'Charger\u2009?', 'Activation de la Caméra..', 'Chargement des adresses de monnaie..', "Activation de l'imprimante..", 'Chargement des adresses de réception ..', 'Chargement..', 'Paramètres régionaux', 'Emplacement', 'Longueur maximale dépassée (%s)', 'Message', 'Message\u2009:', 'Fichier de signature manquant', 'Mnémonique', 'ID Mnémonique', 'Mnémonique et phrase secrète seront conservés.', "Mnémonique n'était pas chiffré", 'Modifié\u2009:', 'Multi\nsignature', 'Native Segwit - 84 serait supposé', 'Réseau', 'Nouveau Mnémonique', 'Nouveau micrologiciel détecté.', 'Non', 'Pas de phrase secrète', 'Pas assez de jets\u2009!', 'Nombres', 'Octale', 'Autres formats', 'Itér. PBKDF2', "Noircissez les points perforés afin qu'ils puissent être détectés.", 'Largeur du papier', 'Partie', 'Taille de la pièce', 'Phrase secréte', 'Longueur du mot de passe', 'Inadéquation du chemin', 'Pattern détecté\u2009!', 'Supprimer définitivement tous les mnémoniques et paramètres chiffrés stockés dans le flash\u2009?', 'Persistance', 'Indice de déviation des pixels\u2009:', 'QR en Texte Brut', 'Veuillez charger un descripteur de sortie de portefeuille', 'Taux de plongée', 'Entropie faible', 'Entropie faible détectée\u2009!', 'Impression Test QR', 'Imprimer Tiny Seed\u2009?', 'Imprimer Code QR', 'Imprimer Code QR\u2009?', 'Imprimer\u2009?', 'Imprimante', "Le pilote d'imprimante n'est pas défini\u2009!", 'Impression..', 'Procéder quand même\u2009?', 'Procéder\u2009?', 'Traitement..', 'Code QR', 'RX Fiche', 'Redémarrer', 'Recevoir', 'Adresses de Réception', 'Région\u2009:', 'Supprimer %s\u2009?', 'Supprimer mnémonique', 'Supprimer les fichiers micrologiciel de la carte SD\u2009?', 'Rés. - Format', "Restaurer les paramètres d'usine et redémarrer\u2009?", 'Retour au visualiseur QR', 'Examinez les données numérisées, modifiez-les si nécessaire', 'À droite', 'Lancez le dé au moins %d fois pour générer un mnémonique.', 'Distribution des jets\u2009:', 'Jets\u2009:', 'Carte SD', 'Carte SD non détectée.', 'SHA256 de jets\u2009:', 'SHA256 de snapshot\u2009:', "Enregistrer l'image QR sur la carte SD", 'Enregistrer sur la carte SD', 'Enregistrer sur la carte SD\u2009?', 'Enregistré sur la carte SD', "L'échelle", "Scannez l'adresse", 'Scannez la phrase secrète BIP-39', 'Scannez le Code QR de la clé', 'Analyser à nouveau les mots 1 à 12', 'Analyser les mots 13 à 24', "Delai d'Inactivité", 'Type de Script', 'Sécurité', 'Auto-transfert ou monnaie (%d)\u2009:', 'Auto-transfert\u2009:', "Définissez d'abord un code de non compromis", 'Paramètres', 'Paramètres stockés en interne sur flash.', 'Paramètres stockés sur la carte SD.', 'Entropie de Shannon\u2009:', 'Éteindre', "Delai d'Arrêt", 'Arrêt en cours..', 'Signer', 'Signer avec le code QR', 'Signer sur la carte SD', 'Signer\u2009?', 'Signature', 'Message signé', 'PSBT signé', 'Signature..', 'Clé unique', 'Capacité\u2009:', 'Certains vérifications ne peuvent pas être effectués.', 'Dépense (%d)\u2009:', 'Dépense\u2009:', 'Statistiques pour les geeks', 'Stocker sur flash', 'Stocker sur la carte SD', 'Faites glisser pour changer de mode', 'TC Flash Hash', 'TC Flash Hash au démarrage', 'TOUCHEZ ou ENTRER pour capturer', 'TX Fiche', 'Code de non compromis', 'Code de non compromis défini avec succès', 'Les codes de non compromis ne correspondent pas', 'Texte', "The app will be copied to user's flash ", 'Thème', 'Thermique', "Pour assurer que les données soient irrécupérables, utilisez la fonctionnalité 'Effacer l'appareil'", 'Ajuster la luminosité', 'Outils', 'Sensibilité', 'Écran Tactile', 'Réessayer\u2009?', 'Entrez la phrase secrète BIP-39', 'Taper clé', 'Unité', 'Mise à jour complète.', 'Utilisez une surface de fond noire.', "Utilisez l'entropie de la caméra pour créer un nouveau mnémonique", 'Utilisé\u2009:', 'Utilisateur', 'Valeur %s hors de portée: [%s, %s]', 'La valeur doit être un multiple de %s', 'Vérification..', 'Version', 'Par caméra', 'Via D20', 'Via D6', 'Par saisie manuelle', 'Via Mots', 'Attendez la capture', 'Portefeuille', 'Descripteur de Portefeuille', 'Descripteur de sortie du portefeuille', 'Descripteur de sortie du portefeuille chargé\u2009!', 'Descripteur de sortie du portefeuille introuvable.', 'Avertissement\u2009:', 'Mot %d', 'Numéros de mots', 'Mots', 'Oui', 'Adresse non valide\u2009!', 'INTROUVABLE dans les %d premières adresses'] diff --git a/src/krux/translations/ja.py b/src/krux/translations/ja.py index 543e1d96b..dba82e696 100644 --- a/src/krux/translations/ja.py +++ b/src/krux/translations/ja.py @@ -20,326 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = [ - "% の金額.", - "%d の%d マルチシグネチャ", - "%d へ %d", - "%s 削除されました.", - "(%d トータル)", - "(実験的)", - "(閲覧専用)", - "12の単語", - "24の単語", - "概要", - "仮定を受け入れますか?", - "アカウント", - "アカウント#0は仮定されます", - "アカウントインデックス", - "ウォレットのパスフレーズを追加または変更しますか?", - "AES-CBCモードにはカメラからの追加エントロピーが必要です", - "アドレス", - "カメラとバックプレートを正しく整列させてください.", - "最初に設定で許可してください!", - "アンチグレアが無効", - "アンチグレアが有効", - "外観", - "よろしいですか?", - "BGRカラー", - "BIP39 Mnemonic", - "戻る", - "メニューへ戻る", - "ニーモニックのバックアップ", - "無効なサイン", - "Base64パスワード", - "Baudrate", - "バイナリグリッド", - "ボーダーパディング", - "明るさ", - "ボタン", - "ボタンのデバウンス", - "キャプチャがキャンセルされました", - "お釣り", - "アドレス変更", - "テーマの変更と再起動しますか?", - "お釣り:", - "変更はシャットダウンするまで持続します.", - "SDカードを確認する", - "このアドレスがこのウォレットに属しているか確認しますか?", - "%d のアドレスを確認しましたが、一致するものはありませんでした.", - "SDカードを確認中..", - "改ざんチェックコードの確認", - "%sを実行できませんでした", - "QRコードを生成する", - "テキストからQRコードを作成しますか?", - "作成されました:", - "現在の改ざんチェックコード", - "カスタムQRコード", - "カスタマイズする", - "ウォレットをカスタマイズすると、新しいキーが生成されます.", - "カットの深さ", - "カット方法", - "デシマル", - "デクリプト?", - "デフォルトの財布", - "パスごとの深さ", - "BIP85エントロピーを導出しますか?", - "ディスクリプタアドレス", - "ディスプレイ", - "完了するまで電源を切らないでください", - "完了?", - "ダブルニーモニック", - "ドライバー", - "空", - "Kruxアプリを有効にする", - "暗号化されました", - "暗号化されたQRコード", - "暗号化されたニーモニックが保存されませんでした", - "暗号化されたニーモニックがIDとともに保存されました:", - "暗号化", - "暗号化モード", - "%d のBIP-39ワードを入力してください.", - "6文字以上の改ざんチェックコードを入力してください", - "あなたのBIP-39ニーモニックの各単語を1から2048の番号で入力してください.", - "あなたのBIP-39ニーモニックの各単語を1から800の16進数で入力してください.", - "あなたのBIP-39ニーモニックの各単語を1から4000の8進数で入力してください.", - "あなたのBIP-39ニーモニックの各単語を入力してください.", - "ユーザーのデータを消去する", - "ユーザーのデータを消去しています..", - "エラー:", - "エスク", - "署名入りのKruxアプリを実行しますか?", - "アーカイブ探索?", - "SDカードへのエクスポート..", - "拡張公開キー", - "初期設定", - "復号化に失敗しました", - "PSBTのロードに失敗しました", - "アドレスの読み込みに失敗しました", - "キーのロードに失敗しました", - "メッセージの読み込みに失敗しました", - "mnemonicのロードに失敗しました", - "出力記述子のロードに失敗しました", - "パスフレーズのロードに失敗しました", - "mnemonicの保存に失敗しました", - "手数料:", - "フィードレート", - "ファイル名", - "ファイル名 %s が SD カードに存在します、上書きしますか?", - "カメラからのエントロピーでフラッシュを埋めますか?", - "フラッシュを充填中", - "PSBTでデジタル指紋が未設定", - "ファームウェアが最大サイズを超えました: %d", - "フラッシュマップ", - "Flashツール", - "カメラエントロピーで満たされたフラッシュ", - "X座標が反転しました", - "フルートディアメーター", - "フリー:", - "ストレージから", - "データが復元できないように、他のデバイスでSDカードを完全に消去してください", - "Mnemonicを生成する", - "このニーモニックにカスタムIDを付けますか?付けない場合は現在のフィンガープリントが使用されます", - "行く", - "良いentropy", - "ハードウェア", - "Hex公開キー", - "エクサデシマル", - "Mnemonicsを隠す", - "高い手数料!", - "IDはすでに存在します", - "インデックス", - "インデックス:%s", - "インプット(%d):", - "インストールしますか?", - "不十分なエントロピー!", - "不十分なエントロピー", - "無効な改ざんチェックコード", - "無効なアドレス", - "無効なブートローダー", - "無効なニーモニックの長さ", - "無効な公開キー", - "無効なウォレット:", - "反転する", - "反転した色", - "キー", - "キーが提供されていません", - "KruxプリンターテストQR", - "LCDタイプ", - "言語 ", - "有効な最終単語をKruxに選んでもらいたい場合は、空白のままにしてください", - "左", - "長さ:%s", - "ライン遅延", - "ライン:", - "Kruxアプリを読み込む", - "ニーモニックをロード", - "ウォレットをロード", - "信頼できるウォレット記述子をロードしてアドレスを表示しますか?", - "SDカードからロード ", - "SDカードからロードしますか?", - "カメラからロード", - "1つをロードしますか?", - "ロードしますか?", - "カメラを読み込み中..", - "変更アドレスを読み込み中..", - "プリンターを読み込み中..", - "受信アドレスを読み込み中 ..", - "読み込み中..", - "ロケール", - "場所", - "最大長を超えました (%s)", - "メッセージ", - "メッセージ:", - "署名ファイルが欠落しています", - "Mnemonic", - "Mnemonic ID", - "Mnemonicとパスフレーズは保持されます.", - "Mnemonicは暗号化されていませんでした", - "修正されました:", - "マルチシグ", - "ネイティブSegwit - 84が仮定されます", - "ネットワーク", - "新しい Mnemonic", - "新しいファームウェアが検出されました.", - "いいえ", - "パスフレーズなし", - "ロールが足りません!", - "数字", - "Octal", - "他のフォーマット", - "PBKDF2イテレーション", - "検出できるように、穴あけされた点を黒く塗ってください.", - "用紙幅 ", - "パーツ", - "パーツサイズ", - "パスワード", - "パスワードの長さ", - "パスの不一致", - "パターンが検出されました!", - "フラッシュからすべての保存された暗号化mnemonicsと設定を永久に削除しますか?", - "永続させる", - "ピクセル偏差指数:", - "プレーンテキストQR", - "ウォレットの出力記述子をロードしてください", - "沈下率", - "低品質なエントロピー", - "低品質なエントロピーが検出されました!", - "テストQRを印刷", - "小さなシードを印刷しますか?", - "QRを印刷", - "QRを印刷しますか?", - "印刷?", - "プリンター ", - "プリンタードライバーが設定されていません!", - "印刷中..", - "そのまま進みますか?", - "進みますか?", - "処理中..", - "QRコード", - "RXピン", - "再起動", - "受け取る", - "受取アドレス", - "地域:", - "%sを削除しますか?", - "ニーモニックを削除", - "SDカードからファームウェアファイルを削除しますか?", - "Res. - フォーマット", - "初期化を復元して再起動しますか?", - "QRビューワーに戻る", - "スキャンしたデータを確認し、必要に応じて編集します", - "右", - "mnemonicを生成するには、少なくとも%d回サイコロを振ってください.", - "ロールの分布:", - "ロール:", - "SDカード", - "SDカードが検出されません.", - "ロールのSHA256:", - "画像のSHA256:", - "QR画像をSDカードに保存する", - "SDカードに保存する", - "SDカードに保存しますか?", - "SDカードに保存しました", - "スケール", - "アドレススキャン", - "BIP39パスフレーズをスキャンする", - "キーのQRコードをスキャンする", - "単語1-12を再度スキャン中", - "単語13-24をスキャン中", - "スクリーンセーバーの時間", - "スクリプトタイプ", - "セキュリティa", - "自己転送または変更(%d):", - "自己転送:", - "最初に改ざんチェックコードを設定する", - "設定", - "設定はフラッシュメモリに内部保存されています.", - "設定はSDカードに保存されています.", - "シャノンのエントロピー:", - "シャットダウン", - "シャットダウン時間", - "シャットダウン中..", - "署名", - "QRコードにサインする", - "SDカードにサインする", - "サインしますか?", - "サイン", - "サイン付きメッセージ", - "サインされたPSBT", - "サインしてます..", - "シングルサイン", - "サイズ:", - "一部のチェックを実行できません.", - "支出(%d):", - "支出:", - "オタクのための統計", - "フラッシュに保存する", - "SDカードに保存する", - "スワイプしてモードを変更する", - "TCフラッシュハッシュ", - "起動時のTCフラッシュハッシュ", - "タッチまたはENTERでキャプチャする", - "TXピン", - "改ざんチェックコード", - "改ざんチェックコードが正常に設定されました", - "改ざんチェックコードが一致しません", - "テキスト", - "テーマ", - "サーマル", - "データが復元不可能であることを確実にするには、デバイス消去機能を使用してください", - "明るさを切り替える", - "ツール", - "タッチスレッショルド", - "タッチスクリーン", - "もっと試してみますか?", - "BIP39パスフレーズを入力してください", - "キーを入力する", - "ユニット", - "アップグレードが完了しました.", - "黒い背景面を使用してください.", - "カメラのエントロピーを使用して新しいmnemonicを作成してください", - "使用済み:", - "ユーザーのデータ", - "値%sが範囲外です: [ %s, %s]", - "値は%sの倍数でなければなりません", - "確認中..", - "バージョン", - "カメラ経由", - "D20経由", - "D6経由", - "手動入力経由", - "言葉経由", - "キャプチャを待ってください", - "ワレット", - "ウォレットディスクリプター", - "ウォレット出力ディスクリプター", - "ウォレット出力ディスクリプターがロードされました!", - "ウォレット出力ディスクリプターが見つかりません.", - "警告:", - "単語 %d", - "単語番号", - "単語", - "はい", - "有効なアドレスです!", - "最初の%dアドレスに見つかりませんでした", -] +translation_array = ['% の金額.', '%d の%d マルチシグネチャ', '%d へ %d', '%s 削除されました.', '(%d トータル)', '(実験的)', '(閲覧専用)', '12の単語', '24の単語', '概要', '仮定を受け入れますか?', 'アカウント', 'アカウント#0は仮定されます', 'アカウントインデックス', 'ウォレットのパスフレーズを追加または変更しますか?', 'AES-CBCモードにはカメラからの追加エントロピーが必要です', 'アドレス', 'カメラとバックプレートを正しく整列させてください.', '最初に設定で許可してください!', 'アンチグレアが無効', 'アンチグレアが有効', '外観', 'よろしいですか?', 'BGRカラー', 'BIP39 Mnemonic', '戻る', 'メニューへ戻る', 'ニーモニックのバックアップ', '無効なサイン', 'Base64パスワード', 'Baudrate', 'バイナリグリッド', 'ボーダーパディング', '明るさ', 'ボタン', 'ボタンのデバウンス', 'キャプチャがキャンセルされました', 'お釣り', 'アドレス変更', 'テーマの変更と再起動しますか?', 'お釣り:', '変更はシャットダウンするまで持続します.', 'SDカードを確認する', 'このアドレスがこのウォレットに属しているか確認しますか?', '%d のアドレスを確認しましたが、一致するものはありませんでした.', 'SDカードを確認中..', '改ざんチェックコードの確認', 'QRコードを生成する', 'テキストからQRコードを作成しますか?', '作成されました:', '現在の改ざんチェックコード', 'カスタムQRコード', 'カスタマイズする', 'ウォレットをカスタマイズすると、新しいキーが生成されます.', 'カットの深さ', 'カット方法', 'デシマル', 'デクリプト?', 'デフォルトの財布', 'パスごとの深さ', 'BIP85エントロピーを導出しますか?', 'ディスクリプタアドレス', 'ディスプレイ', '完了するまで電源を切らないでください', '完了?', 'ダブルニーモニック', 'ドライバー', '空', 'Kruxアプリを有効にする', '暗号化されました', '暗号化されたQRコード', '暗号化されたニーモニックが保存されませんでした', '暗号化されたニーモニックがIDとともに保存されました:', '暗号化', '暗号化モード', '%d のBIP-39ワードを入力してください.', '6文字以上の改ざんチェックコードを入力してください', 'あなたのBIP-39ニーモニックの各単語を1から2048の番号で入力してください.', 'あなたのBIP-39ニーモニックの各単語を1から800の16進数で入力してください.', 'あなたのBIP-39ニーモニックの各単語を1から4000の8進数で入力してください.', 'あなたのBIP-39ニーモニックの各単語を入力してください.', 'ユーザーのデータを消去する', 'ユーザーのデータを消去しています..', 'エラー:', 'エスク', '署名入りのKruxアプリを実行しますか?', 'アーカイブ探索?', 'SDカードへのエクスポート..', '拡張公開キー', '初期設定', '復号化に失敗しました', 'PSBTのロードに失敗しました', 'アドレスの読み込みに失敗しました', 'キーのロードに失敗しました', 'メッセージの読み込みに失敗しました', 'mnemonicのロードに失敗しました', '出力記述子のロードに失敗しました', 'パスフレーズのロードに失敗しました', 'mnemonicの保存に失敗しました', '手数料:', 'フィードレート', 'ファイル名', 'ファイル名 %s が SD カードに存在します、上書きしますか?', 'カメラからのエントロピーでフラッシュを埋めますか?', 'フラッシュを充填中', 'PSBTでデジタル指紋が未設定', 'ファームウェアが最大サイズを超えました: %d', 'フラッシュマップ', 'Flashツール', 'カメラエントロピーで満たされたフラッシュ', 'X座標が反転しました', 'フルートディアメーター', 'フリー:', 'ストレージから', 'データが復元できないように、他のデバイスでSDカードを完全に消去してください', 'Mnemonicを生成する', 'このニーモニックにカスタムIDを付けますか?付けない場合は現在のフィンガープリントが使用されます', '行く', '良いentropy', 'ハードウェア', 'Hex公開キー', 'エクサデシマル', 'Mnemonicsを隠す', '高い手数料!', 'IDはすでに存在します', 'インデックス', 'インデックス:%s', 'インプット(%d):', 'インストールしますか?', '不十分なエントロピー!', '不十分なエントロピー', '無効な改ざんチェックコード', '無効なアドレス', '無効なブートローダー', '無効なニーモニックの長さ', '無効な公開キー', '無効なウォレット:', '反転する', '反転した色', 'キー', 'キーが提供されていません', 'KruxプリンターテストQR', 'LCDタイプ', '言語 ', '有効な最終単語をKruxに選んでもらいたい場合は、空白のままにしてください', '左', '長さ:%s', 'ライン遅延', 'ライン:', 'Kruxアプリを読み込む', 'ニーモニックをロード', 'ウォレットをロード', '信頼できるウォレット記述子をロードしてアドレスを表示しますか?', 'SDカードからロード ', 'SDカードからロードしますか?', 'カメラからロード', '1つをロードしますか?', 'ロードしますか?', 'カメラを読み込み中..', '変更アドレスを読み込み中..', 'プリンターを読み込み中..', '受信アドレスを読み込み中 ..', '読み込み中..', 'ロケール', '場所', '最大長を超えました (%s)', 'メッセージ', 'メッセージ:', '署名ファイルが欠落しています', 'Mnemonic', 'Mnemonic ID', 'Mnemonicとパスフレーズは保持されます.', 'Mnemonicは暗号化されていませんでした', '修正されました:', 'マルチシグ', 'ネイティブSegwit - 84が仮定されます', 'ネットワーク', '新しい Mnemonic', '新しいファームウェアが検出されました.', 'いいえ', 'パスフレーズなし', 'ロールが足りません!', '数字', 'Octal', '他のフォーマット', 'PBKDF2イテレーション', '検出できるように、穴あけされた点を黒く塗ってください.', '用紙幅 ', 'パーツ', 'パーツサイズ', 'パスワード', 'パスワードの長さ', 'パスの不一致', 'パターンが検出されました!', 'フラッシュからすべての保存された暗号化mnemonicsと設定を永久に削除しますか?', '永続させる', 'ピクセル偏差指数:', 'プレーンテキストQR', 'ウォレットの出力記述子をロードしてください', '沈下率', '低品質なエントロピー', '低品質なエントロピーが検出されました!', 'テストQRを印刷', '小さなシードを印刷しますか?', 'QRを印刷', 'QRを印刷しますか?', '印刷?', 'プリンター ', 'プリンタードライバーが設定されていません!', '印刷中..', 'そのまま進みますか?', '進みますか?', '処理中..', 'QRコード', 'RXピン', '再起動', '受け取る', '受取アドレス', '地域:', '%sを削除しますか?', 'ニーモニックを削除', 'SDカードからファームウェアファイルを削除しますか?', 'Res. - フォーマット', '初期化を復元して再起動しますか?', 'QRビューワーに戻る', 'スキャンしたデータを確認し、必要に応じて編集します', '右', 'mnemonicを生成するには、少なくとも%d回サイコロを振ってください.', 'ロールの分布:', 'ロール:', 'SDカード', 'SDカードが検出されません.', 'ロールのSHA256:', '画像のSHA256:', 'QR画像をSDカードに保存する', 'SDカードに保存する', 'SDカードに保存しますか?', 'SDカードに保存しました', 'スケール', 'アドレススキャン', 'BIP39パスフレーズをスキャンする', 'キーのQRコードをスキャンする', '単語1-12を再度スキャン中', '単語13-24をスキャン中', 'スクリーンセーバーの時間', 'スクリプトタイプ', 'セキュリティa', '自己転送または変更(%d):', '自己転送:', '最初に改ざんチェックコードを設定する', '設定', '設定はフラッシュメモリに内部保存されています.', '設定はSDカードに保存されています.', 'シャノンのエントロピー:', 'シャットダウン', 'シャットダウン時間', 'シャットダウン中..', '署名', 'QRコードにサインする', 'SDカードにサインする', 'サインしますか?', 'サイン', 'サイン付きメッセージ', 'サインされたPSBT', 'サインしてます..', 'シングルサイン', 'サイズ:', '一部のチェックを実行できません.', '支出(%d):', '支出:', 'オタクのための統計', 'フラッシュに保存する', 'SDカードに保存する', 'スワイプしてモードを変更する', 'TCフラッシュハッシュ', '起動時のTCフラッシュハッシュ', 'タッチまたはENTERでキャプチャする', 'TXピン', '改ざんチェックコード', '改ざんチェックコードが正常に設定されました', '改ざんチェックコードが一致しません', 'テキスト', "The app will be copied to user's flash ", 'テーマ', 'サーマル', 'データが復元不可能であることを確実にするには、デバイス消去機能を使用してください', '明るさを切り替える', 'ツール', 'タッチスレッショルド', 'タッチスクリーン', 'もっと試してみますか?', 'BIP39パスフレーズを入力してください', 'キーを入力する', 'ユニット', 'アップグレードが完了しました.', '黒い背景面を使用してください.', 'カメラのエントロピーを使用して新しいmnemonicを作成してください', '使用済み:', 'ユーザーのデータ', '値%sが範囲外です: [ %s, %s]', '値は%sの倍数でなければなりません', '確認中..', 'バージョン', 'カメラ経由', 'D20経由', 'D6経由', '手動入力経由', '言葉経由', 'キャプチャを待ってください', 'ワレット', 'ウォレットディスクリプター', 'ウォレット出力ディスクリプター', 'ウォレット出力ディスクリプターがロードされました!', 'ウォレット出力ディスクリプターが見つかりません.', '警告:', '単語 %d', '単語番号', '単語', 'はい', '有効なアドレスです!', '最初の%dアドレスに見つかりませんでした'] diff --git a/src/krux/translations/ko.py b/src/krux/translations/ko.py index c70e7c4a5..c10435048 100644 --- a/src/krux/translations/ko.py +++ b/src/krux/translations/ko.py @@ -20,326 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = [ - "수량: %", - "%d의 %d 멀티시그", - "%d 부터 %d", - "%s 제거되었습니다.", - "(총 %d)", - "(실험적 기능)", - "(잔액조회 전용)", - "12단어", - "24단어", - "기본 정보", - "가정을 수락하시겠습니까?", - "계정", - "계정 #0이 가정됩니다", - "계정 인덱스", - "패스프레이즈를 추가하거나 변경하시겠습니까?", - "AES-CBC 모드를 위해 카메라의 추가 엔트로피가 필요합니다", - "주소", - "카메라와 보조 플레이트를 올바르게 정렬하십시오.", - "먼저 설정에서 허용하세요!", - "눈부심방지 비활성화", - "눈부심방지 활성화", - "디스플레이", - "계속하시겠습니까?", - "BGR 색상", - "BIP39 니뫠닉", - "뒤로", - "메뉴로 돌아가기", - "니모닉 백업", - "잘못된 서명", - "Base64 비밀번호", - "Baudrate", - "이진수 그리드", - "테두리 여백", - "밝기", - "버튼", - "버튼 바운스 방지", - "캡처 취소됨", - "잔돈", - "잔돈 주소", - "테마를 변경하고 재부팅하시겠습니까?", - "변경", - "변경 사항은 종료될때까지 유지됩니다.", - "SD카드 확인", - "해당 주소가 이 지갑에 속하는지 확인하시겠습니까?", - "일치하는 주소가 없는 %d 개를 확인했습니다.", - "SD카드 확인 중..", - "탬퍼 체크 코드 확인", - "%s 을 (를) 실행할 수 없습니다", - "QR 코드 생성", - "텍스트로부터 QR코드를 생성하시겠습니까?", - "생성됨:", - "현재 탬퍼 체크 코드", - "사용자 정의 QR코드", - "사용자 정의", - "지갑을 커스터마이징하면 새로운 비밀키가 생성됩니다.", - "Cut Depth", - "Cut Method", - "10진수", - "복호화하시겠습니까?", - "지갑 기본설정", - "Depth Per Pass", - "BIP85 엔트로피를 유독하시겠습니까?", - "디스크립터 주소", - "디스플레이", - "전원을 끄지 마십시오. 완료하는 데 시간이 걸릴 수 있습니다.", - "완료되었습니까?", - "이중 니모닉", - "드라이버", - "비어 있음", - "Krux 앱 활성화", - "암호화 후 저장", - "암호화된 QR 코드", - "암호화된 니모닉을 저장하지 못했습니다", - "암호화된 니모닉을 다음 아이디와 함께 저장했습니다:", - "암호화", - "암호화 모드", - "%d개의 BIP-39 단어를 입력하십시오.", - "6자 이상의 탬퍼 체크 코드를 입력하세요", - "BIP-39 니모닉의 각 단어를 1에서 2048 사이의 숫자로 입력하십시오.", - "BIP-39 니모닉의 각 단어를 1에서 800 사이의 16진수 숫자로 입력하십시오.", - "BIP-39 니모닉의 각 단어를 1에서 4000 사이의 8진수 숫자로 입력하십시오.", - "BIP-39 니모닉의 각 단어를 입력하십시오.", - "사용자 데이터 지우기", - "사용자의 데이터를 지우는 중...", - "오류:", - "Esc", - "서명된 Krux 앱을 실행하시겠습니까?", - "파일을 탐색하시겠습니까?", - "SD카드로 내보내는 중..", - "XPUB 내보내기", - "공장 초기 설정", - "복호화에 실패했습니다", - "PSBT를 불러오지 못했습니다", - "주소를 불러오지 못했습니다", - "키 로드에 실패했습니다", - "메시지를 불러오지 못했습니다", - "니모닉을 불러오지 못했습니다", - "아웃풋 디스크립터를 불러오지 못했습니다", - "패스프레이즈를 불러오지 못했습니다", - "니모닉을 저장하지 못했습니다", - "수수료:", - "Feed Rate", - "파일명", - "%s 파일명이 SD카드에 이미 존재합니다. 덮어쓰시겠습니까?", - "카메라의 엔트로피로 플래시를 채우시겠습니까?", - "플래시 채우기", - "PSBT에서 지문이 설정되지 않았습니다", - "펌웨어가 최대 크기를 초과했습니다: %d", - "플래시 맵", - "플래시 도구", - "카메라 엔트로피로 가득 찬 플래시", - "X 좌표 반전", - "플루트 직경", - "여유 공간:", - "저장공간에서 불러오기", - "다른 장치에서 데이터 복구가 불가능하도록 SD카드를 완전히 지우십시오", - "니모닉 생성", - "이 니모닉에 별도 아이디를 지정하시겠습니까? 지정하지 않으면 현재 지문을 사용합니다", - "선택", - "엔트로피가 충분합니다", - "하드웨어", - "16진수 공개키", - "16진수", - "니모닉 숨기기", - "수수료가 높습니다!", - "아이디가 이미 존재합니다", - "인덱스", - "인덱스: %s", - "Input (%d):", - "설치하시겠습니까?", - "엔트로피가 충분하지 않습니다!", - "엔트로피가 충분하지 않습니다", - "유효하지 않은 탬퍼 체크 코드", - "주소가 잘못되었습니다", - "부트로더가 잘못되었습니다", - "니모닉 길이가 잘못되었습니다", - "공개키가 잘못되었습니다", - "지갑이 잘못되었습니다:", - "반전", - "반전된 색상", - "키", - "키가 제공되지 않았습니다", - "Krux 프린터 테스트 QR", - "LCD 유형", - "언어", - "마지막 단어를 Krux가 선택하도록 하려면 비워두십시오", - "왼쪽", - "길이: %s", - "줄 지연", - "줄:", - "Krux 앱 로드", - "니모닉 불러오기", - "이대로 불러오기", - "주소를 보기위해 신뢰할 수 있는 월렛 디스크립터를 불러오시겠습니까?", - "SD카드에서 불러오기", - "SD카드에서 불러오시겠습니까?", - "카메라로 불러오기", - "불러오시겠습니까?", - "불러오시겠습니까?", - "카메라를 구동 중입니다..", - "잔돈 주소를 불러옵니다..", - "프린터를 로딩 중입니다..", - "수신 주소 불러옵니다..", - "로딩 중..", - "언어 설정", - "기본 저장소", - "최대 길이를 초과함 (%s)", - "메시지", - "메시지:", - "서명 파일이 누락되었습니다", - "니모닉", - "니모닉 ID", - "니모닉과 암호는 유지됩니다.", - "니모닉이 암호화되지 않았습니다", - "수정되었습니다:", - "멀티시그", - "네이티브 세그윗 - BIP84를 적용합니다", - "네트워크", - "새로운 니모닉", - "새로운 펌웨어가 감지되었습니다.", - "아니요", - "패스프레이즈 없음", - "주사위 횟수가 충분하지 않습니다!", - "시드문구 순번", - "8진수", - "기타 형식", - "PBKDF2 Iter.", - "카메라가 감지할 수 있도록 펀치된 점을 검게 칠하십시오.", - "종이 너비", - "파트", - "파트 사이즈", - "패스프레이즈", - "비밀번호 길이", - "경로 불일치", - "패턴이 감지되었습니다!", - "저장된 모든 니모닉 및 설정값을 영구적으로 제거하시겠습니까?", - "저장", - "픽셀 편차 지수:", - "일반텍스트 QR", - "지갑 출력 디스크립터를 불러오십시오", - "침수율", - "엔트로피가 부족합니다", - "엔트로피가 부족합니다!", - "QR 테스트 인쇄", - "Tiny Seed를 인쇄하시겠습니까?", - "QR로 인쇄", - "QR로 인쇄하시겠습니까?", - "인쇄하시겠습니까?", - "프린터", - "프린터 드라이버가 설정되지 않았습니다!", - "출력중", - "계속하시겠습니까?", - "계속하시겠습니까?", - "처리...", - "QR 코드", - "RX 핀", - "다시 반복", - "받기", - "주소", - "지역:", - "%s을 제거하시겠습니까?", - "니모닉 제거", - "SD카드에서 펌웨어 파일을 제거하시겠습니까?", - "Res. - 형식", - "공장 설정을 복원하고 재부팅하시겠습니까?", - "QR 뷰어로 돌아가기", - "스캔된 데이터를 검토하고 필요한 경우 수정하십시오", - "오른쪽", - "니모닉을 생성하려면 주사위를 최소 %d번 굴리십시오.", - "주사위값 분포:", - "주사위 횟수:", - "SD카드", - "SD카드가 감지되지 않았습니다.", - "주사위의 SHA256:", - "SHA256 스냅샷:", - "QR 이미지를 SD카드에 저장", - "SD카드에 저장", - "SD카드에 저장하시겠습니까?", - "SD카드에 저장됨", - "스케일", - "주소 스캔하기", - "BIP39 패스프레이즈 스캔하기", - "비밀번호 QR 스캔", - "1번째부터 12번째 단어를 스캔 중입니다", - "13번째부터 24번째 단어를 스캔 중입니다", - "화면보호기 시간", - "지갑 형식", - "보안", - "본인주소 전송 또는 잔돈 (%d):", - "자가 이체:", - "먼저 탬퍼 체크 코드를 설정하세요.", - "설정", - "설정은 플래시에서 내부적으로 저장됩니다.", - "SD 카드에 저장된 설정.", - "Shannon의 엔트로피:", - "종료", - "자동 종료시간", - "종료 중..", - "서명하기", - "QR코드로 내보내기", - "SD카드로 내보내기", - "서명하시겠습니까?", - "서명", - "서명된 메시지", - "서명된 PSBT", - "서명 중..", - "단일서명", - "크기:", - "일부 검사를 수행할 수 없습니다.", - "Spend (%d):", - "지출", - "전문가를 위한 통계", - "플래시 메모리에 저장", - "SD카드에 저장", - "모드를 변경하려면 화면을 옆으로 쓸어내리세요", - "TC Flash Hash", - "부팅 시 플래시 탬퍼 확인 해시", - "터치하거나 엔터를 눌러 캡처하십시오", - "TX 핀", - "탬퍼 체크 코드", - "탬퍼 검사 코드가 성공적으로 설정되었습니다", - "탬퍼 검사 코드가 일치하지 않습니다", - "텍스트", - "테마", - "Thermal", - "데이터 복구가 불가능하도록 장치 전체지우기 기능을 사용하십시오", - "밝기 전환", - "도구", - "터치 민감도", - "터치스크린", - "더 하시겠습니까?", - "BIP39 패스프레이즈 입력", - "비밀번호 입력", - "단위", - "업그레이드가 완료되었습니다", - "검은색 배경 화면을 사용하십시오.", - "카메라의 엔트로피를 사용하여 새로운 니모닉을 생성하십시오", - "이미 사용됨:", - "사용자 데이터", - "%s는 [%s, %s] 범위를 벗어났습니다", - "값은 %s의 배수여야 합니다", - "검증 중..", - "버전", - "카메라", - "20면체 주사위", - "일반 주사위", - "직접 입력", - "니모닉 단어 입력", - "캡처될때까지 기다리십시오", - "지갑 설정", - "지갑 디스크립터", - "지갑 출력 디스크립터", - "지갑 출력 디스크립터가 로드되었습니다!", - "지갑 출력 디스크립터를 찾을 수 없습니다.", - "경고:", - "%d 단어", - "단어 번호(1-2048)", - "시드문구", - "예", - "는 유효한 주소입니다!", - "첫 번째 %d개의 주소에서 찾을 수 없습니다", -] +translation_array = ['수량: %', '%d의 %d 멀티시그', '%d 부터 %d', '%s 제거되었습니다.', '(총 %d)', '(실험적 기능)', '(잔액조회 전용)', '12단어', '24단어', '기본 정보', '가정을 수락하시겠습니까?', '계정', '계정 #0이 가정됩니다', '계정 인덱스', '패스프레이즈를 추가하거나 변경하시겠습니까?', 'AES-CBC 모드를 위해 카메라의 추가 엔트로피가 필요합니다', '주소', '카메라와 보조 플레이트를 올바르게 정렬하십시오.', '먼저 설정에서 허용하세요!', '눈부심방지 비활성화', '눈부심방지 활성화', '디스플레이', '계속하시겠습니까?', 'BGR 색상', 'BIP39 니뫠닉', '뒤로', '메뉴로 돌아가기', '니모닉 백업', '잘못된 서명', 'Base64 비밀번호', 'Baudrate', '이진수 그리드', '테두리 여백', '밝기', '버튼', '버튼 바운스 방지', '캡처 취소됨', '잔돈', '잔돈 주소', '테마를 변경하고 재부팅하시겠습니까?', '변경', '변경 사항은 종료될때까지 유지됩니다.', 'SD카드 확인', '해당 주소가 이 지갑에 속하는지 확인하시겠습니까?', '일치하는 주소가 없는 %d 개를 확인했습니다.', 'SD카드 확인 중..', '탬퍼 체크 코드 확인', 'QR 코드 생성', '텍스트로부터 QR코드를 생성하시겠습니까?', '생성됨:', '현재 탬퍼 체크 코드', '사용자 정의 QR코드', '사용자 정의', '지갑을 커스터마이징하면 새로운 비밀키가 생성됩니다.', 'Cut Depth', 'Cut Method', '10진수', '복호화하시겠습니까?', '지갑 기본설정', 'Depth Per Pass', 'BIP85 엔트로피를 유독하시겠습니까?', '디스크립터 주소', '디스플레이', '전원을 끄지 마십시오. 완료하는 데 시간이 걸릴 수 있습니다.', '완료되었습니까?', '이중 니모닉', '드라이버', '비어 있음', 'Krux 앱 활성화', '암호화 후 저장', '암호화된 QR 코드', '암호화된 니모닉을 저장하지 못했습니다', '암호화된 니모닉을 다음 아이디와 함께 저장했습니다:', '암호화', '암호화 모드', '%d개의 BIP-39 단어를 입력하십시오.', '6자 이상의 탬퍼 체크 코드를 입력하세요', 'BIP-39 니모닉의 각 단어를 1에서 2048 사이의 숫자로 입력하십시오.', 'BIP-39 니모닉의 각 단어를 1에서 800 사이의 16진수 숫자로 입력하십시오.', 'BIP-39 니모닉의 각 단어를 1에서 4000 사이의 8진수 숫자로 입력하십시오.', 'BIP-39 니모닉의 각 단어를 입력하십시오.', '사용자 데이터 지우기', '사용자의 데이터를 지우는 중...', '오류:', 'Esc', '서명된 Krux 앱을 실행하시겠습니까?', '파일을 탐색하시겠습니까?', 'SD카드로 내보내는 중..', 'XPUB 내보내기', '공장 초기 설정', '복호화에 실패했습니다', 'PSBT를 불러오지 못했습니다', '주소를 불러오지 못했습니다', '키 로드에 실패했습니다', '메시지를 불러오지 못했습니다', '니모닉을 불러오지 못했습니다', '아웃풋 디스크립터를 불러오지 못했습니다', '패스프레이즈를 불러오지 못했습니다', '니모닉을 저장하지 못했습니다', '수수료:', 'Feed Rate', '파일명', '%s 파일명이 SD카드에 이미 존재합니다. 덮어쓰시겠습니까?', '카메라의 엔트로피로 플래시를 채우시겠습니까?', '플래시 채우기', 'PSBT에서 지문이 설정되지 않았습니다', '펌웨어가 최대 크기를 초과했습니다: %d', '플래시 맵', '플래시 도구', '카메라 엔트로피로 가득 찬 플래시', 'X 좌표 반전', '플루트 직경', '여유 공간:', '저장공간에서 불러오기', '다른 장치에서 데이터 복구가 불가능하도록 SD카드를 완전히 지우십시오', '니모닉 생성', '이 니모닉에 별도 아이디를 지정하시겠습니까? 지정하지 않으면 현재 지문을 사용합니다', '선택', '엔트로피가 충분합니다', '하드웨어', '16진수 공개키', '16진수', '니모닉 숨기기', '수수료가 높습니다!', '아이디가 이미 존재합니다', '인덱스', '인덱스: %s', 'Input (%d):', '설치하시겠습니까?', '엔트로피가 충분하지 않습니다!', '엔트로피가 충분하지 않습니다', '유효하지 않은 탬퍼 체크 코드', '주소가 잘못되었습니다', '부트로더가 잘못되었습니다', '니모닉 길이가 잘못되었습니다', '공개키가 잘못되었습니다', '지갑이 잘못되었습니다:', '반전', '반전된 색상', '키', '키가 제공되지 않았습니다', 'Krux 프린터 테스트 QR', 'LCD 유형', '언어', '마지막 단어를 Krux가 선택하도록 하려면 비워두십시오', '왼쪽', '길이: %s', '줄 지연', '줄:', 'Krux 앱 로드', '니모닉 불러오기', '이대로 불러오기', '주소를 보기위해 신뢰할 수 있는 월렛 디스크립터를 불러오시겠습니까?', 'SD카드에서 불러오기', 'SD카드에서 불러오시겠습니까?', '카메라로 불러오기', '불러오시겠습니까?', '불러오시겠습니까?', '카메라를 구동 중입니다..', '잔돈 주소를 불러옵니다..', '프린터를 로딩 중입니다..', '수신 주소 불러옵니다..', '로딩 중..', '언어 설정', '기본 저장소', '최대 길이를 초과함 (%s)', '메시지', '메시지:', '서명 파일이 누락되었습니다', '니모닉', '니모닉 ID', '니모닉과 암호는 유지됩니다.', '니모닉이 암호화되지 않았습니다', '수정되었습니다:', '멀티시그', '네이티브 세그윗 - BIP84를 적용합니다', '네트워크', '새로운 니모닉', '새로운 펌웨어가 감지되었습니다.', '아니요', '패스프레이즈 없음', '주사위 횟수가 충분하지 않습니다!', '시드문구 순번', '8진수', '기타 형식', 'PBKDF2 Iter.', '카메라가 감지할 수 있도록 펀치된 점을 검게 칠하십시오.', '종이 너비', '파트', '파트 사이즈', '패스프레이즈', '비밀번호 길이', '경로 불일치', '패턴이 감지되었습니다!', '저장된 모든 니모닉 및 설정값을 영구적으로 제거하시겠습니까?', '저장', '픽셀 편차 지수:', '일반텍스트 QR', '지갑 출력 디스크립터를 불러오십시오', '침수율', '엔트로피가 부족합니다', '엔트로피가 부족합니다!', 'QR 테스트 인쇄', 'Tiny Seed를 인쇄하시겠습니까?', 'QR로 인쇄', 'QR로 인쇄하시겠습니까?', '인쇄하시겠습니까?', '프린터', '프린터 드라이버가 설정되지 않았습니다!', '출력중', '계속하시겠습니까?', '계속하시겠습니까?', '처리...', 'QR 코드', 'RX 핀', '다시 반복', '받기', '주소', '지역:', '%s을 제거하시겠습니까?', '니모닉 제거', 'SD카드에서 펌웨어 파일을 제거하시겠습니까?', 'Res. - 형식', '공장 설정을 복원하고 재부팅하시겠습니까?', 'QR 뷰어로 돌아가기', '스캔된 데이터를 검토하고 필요한 경우 수정하십시오', '오른쪽', '니모닉을 생성하려면 주사위를 최소 %d번 굴리십시오.', '주사위값 분포:', '주사위 횟수:', 'SD카드', 'SD카드가 감지되지 않았습니다.', '주사위의 SHA256:', 'SHA256 스냅샷:', 'QR 이미지를 SD카드에 저장', 'SD카드에 저장', 'SD카드에 저장하시겠습니까?', 'SD카드에 저장됨', '스케일', '주소 스캔하기', 'BIP39 패스프레이즈 스캔하기', '비밀번호 QR 스캔', '1번째부터 12번째 단어를 스캔 중입니다', '13번째부터 24번째 단어를 스캔 중입니다', '화면보호기 시간', '지갑 형식', '보안', '본인주소 전송 또는 잔돈 (%d):', '자가 이체:', '먼저 탬퍼 체크 코드를 설정하세요.', '설정', '설정은 플래시에서 내부적으로 저장됩니다.', 'SD 카드에 저장된 설정.', 'Shannon의 엔트로피:', '종료', '자동 종료시간', '종료 중..', '서명하기', 'QR코드로 내보내기', 'SD카드로 내보내기', '서명하시겠습니까?', '서명', '서명된 메시지', '서명된 PSBT', '서명 중..', '단일서명', '크기:', '일부 검사를 수행할 수 없습니다.', 'Spend (%d):', '지출', '전문가를 위한 통계', '플래시 메모리에 저장', 'SD카드에 저장', '모드를 변경하려면 화면을 옆으로 쓸어내리세요', 'TC Flash Hash', '부팅 시 플래시 탬퍼 확인 해시', '터치하거나 엔터를 눌러 캡처하십시오', 'TX 핀', '탬퍼 체크 코드', '탬퍼 검사 코드가 성공적으로 설정되었습니다', '탬퍼 검사 코드가 일치하지 않습니다', '텍스트', "The app will be copied to user's flash ", '테마', 'Thermal', '데이터 복구가 불가능하도록 장치 전체지우기 기능을 사용하십시오', '밝기 전환', '도구', '터치 민감도', '터치스크린', '더 하시겠습니까?', 'BIP39 패스프레이즈 입력', '비밀번호 입력', '단위', '업그레이드가 완료되었습니다', '검은색 배경 화면을 사용하십시오.', '카메라의 엔트로피를 사용하여 새로운 니모닉을 생성하십시오', '이미 사용됨:', '사용자 데이터', '%s는 [%s, %s] 범위를 벗어났습니다', '값은 %s의 배수여야 합니다', '검증 중..', '버전', '카메라', '20면체 주사위', '일반 주사위', '직접 입력', '니모닉 단어 입력', '캡처될때까지 기다리십시오', '지갑 설정', '지갑 디스크립터', '지갑 출력 디스크립터', '지갑 출력 디스크립터가 로드되었습니다!', '지갑 출력 디스크립터를 찾을 수 없습니다.', '경고:', '%d 단어', '단어 번호(1-2048)', '시드문구', '예', '는 유효한 주소입니다!', '첫 번째 %d개의 주소에서 찾을 수 없습니다'] diff --git a/src/krux/translations/nl.py b/src/krux/translations/nl.py index 7d65ef3e7..6db4fca42 100644 --- a/src/krux/translations/nl.py +++ b/src/krux/translations/nl.py @@ -20,326 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = [ - "% van het bedrag.", - "%d van %d multisig", - "%d tot %d", - "%s verwijderd.", - "(%d totaal)", - "(Experimenteel)", - "(alleen inzien)", - "12 woorden", - "24 woorden", - "Over", - "Aanname accepteren?", - "Account", - "Account #0 zou worden aangenomen", - "Accountindex", - "Wachtwoordzin voor portemonnee toevoegen of wijzigen?", - "Extra entropie van de camera vereist voor AES-CBC-modus", - "Adres", - "Richt de camera en back-upplaat op de juiste manier.", - "Sta eerst instellingen toe!", - "Anti reflecterend uitgeschakeld", - "Anti reflecterend ingeschakeld", - "Uiterlijk", - "Weet je het zeker?", - "BGR-kleuren", - "BIP39 Mnemonic", - "Terug", - "Terug naar menu", - "Backup geheugensteun", - "Ongeldige handtekening", - "Base64-wachtwoord", - "Baudratio", - "Binair raster", - "Rand opvulling", - "Helderheid", - "Knoppen", - "Debounce van knoppen", - "Opname geannuleerd", - "Change", - "Wisselgeldadres", - "Thema veranderen en opnieuw opstarten?", - "Wisselgeld:", - "Wijzigingen blijven van kracht tot afsluiten.", - "Controleer SD kaart", - "Controleer of dit adres bij deze portemonnee hoort?", - "%d adressen gecontroleerd zonder overeenkomsten.", - "SD kaart controleren..", - "Bevestig de sabotagecontrolecode", - "Kon ‘%s’ niet uitvoeren", - "QR code maken", - "QR code maken van tekst?", - "Aangemaakt:", - "Huidige sabotagecontrolecode", - "Aangepaste QR code", - "Aanpassen", - "Bij aanpassen van de portemonnee zal er een nieuwe sleutel gegenereerd worden.", - "Snijdiepte", - "Snijmethode", - "Decimaal", - "Ontsleutelen?", - "Standaard portemonnee", - "Diepte per pas", - "BIP85-entropie afleiden?", - "Descriptoradressen", - "Weergave", - "Schakel het apparaat niet uit, het kan even duren voordat het klaar is.", - "Klaar?", - "Dubbel geheugensteuntje", - "Driver", - "Leeg", - "Krux-apps inschakelen", - "Versleuteld", - "Versleutelde QR code", - "Versleutelde geheugensteun was niet opgeslagen", - "Versleutelde geheugensteun is opgeslagen met ID:", - "Versleutelen", - "Versleutel modus", - "Voer %d BIP-39 woorden in.", - "Voer een sabotagecontrolecode van 6 of meer tekens in", - "Voer elk woord van jouw BIP-39 geheugensteun in als een nummer van 1 tot 2048.", - "Voer elk woord van jouw BIP-39 geheugensteun in als een hexadecimaal van 1 tot 800.", - "Voer elk woord van jouw BIP-39 geheugensteun in als een octaal van 1 tot 4000.", - "Voer elk woord van jouw BIP-39 geheugensteun in.", - "Gegevens van gebruiker wissen", - "Gegevens van gebruiker wissen..", - "Fout:", - "Esc", - "Een ondertekende Krux-app uitvoeren?", - "Bestanden verkennen?", - "Exporteren naar SD kaart..", - "Uitgebreide publieke sleutel", - "Fabrieksinstellingen", - "Ontsleutelen is niet gelukt", - "PSBT laden is niet gelukt", - "Adres laden is niet gelukt", - "Sleutel laden is niet gelukt", - "Bericht laden is niet gelukt", - "Geheugensteun laden is niet gelukt", - "Descriptor laden is niet gelukt", - "Wachtwoord laden is niet gelukt", - "Geheugensteun opslaan is niet gelukt", - "Tarief:", - "Voedingssnelheid", - "Bestandsnaam", - "Bestandsnaam %s OVERSCHRIJVEN op SD kaart?", - "De flash vullen met entropie van de camera?", - "Flash vullen", - "Vingerafdruk niet ingesteld in PSBT", - "Firmware overschrijdt de maximale grootte: %d", - "Flash Map", - "Flash Tools", - "Flash gevuld met camera-entropie", - "Geflipte X-coördinaten", - "Fluit diameter", - "Vrij:", - "Uit data-opslag", - "Wis uw SD kaart volledig in een ander apparaat om te zorgen dat de gegevens onherstelbaar zijn", - "Geheugensteun genereren", - "Eigen ID gebruiken voor geheugensteun? Anders vingerafdruk gebruiken", - "Ga", - "Goede entropie", - "Hardware", - "Hex publieke sleutel", - "Hexadecimaal", - "Verberg geheugensteunen", - "Hoge kosten!", - "ID bestaat al", - "Index", - "Index: %s", - "Invoer (%d):", - "Installeren?", - "Onvoldoende Entropie!", - "Onvoldoende entropie", - "Ongeldige sabotagecontrolecode", - "Ongeldig adres", - "Ongeldige bootloader", - "Ongeldige geheugensteun lengte", - "Ongeldige publieke sleutel", - "Ongeldige portemonnee:", - "Omkeren", - "Omgekeerde kleuren", - "Sleutel", - "Sleutel niet verstrekt", - "Krux printer test QR", - "LCD-type", - "Taal", - "Laat leeg als je wilt dat Krux een geldig laatste woord kiest", - "Links", - "Lengte: %s", - "Lijn vertraging", - "Lijn:", - "Krux-app laden", - "Geheugensteun laden", - "Portemonnee laden", - "Een vertrouwde portemonnee descriptor laden om adressen te bekijken?", - "Laden vanaf SD kaart", - "Laden vanaf SD kaart?", - "Laden van camera", - "Laden?", - "Laden?", - "Camera laden..", - "Wijzigingsadressen laden..", - "Laadprinter..", - "Ontvangstadressen laden..", - "Laden..", - "Taal", - "Opslaglocatie", - "Maximale lengte overschreden (%s)", - "Bericht", - "Bericht:", - "Handtekening bestand mist", - "Geheugensteun", - "Geheugensteun ID", - "Geheugensteun en wachtwoord worden bewaard.", - "Geheugensteun is niet versleuteld", - "Aangepast:", - "Multisig", - "Native Segwit - 84 zal worden gebruikt", - "Netwerk", - "Geheugensteun aanmaken", - "Nieuwe firmware gevonden.", - "Nee", - "Geen wachtwoordzin", - "Niet genoeg gedobbeld!", - "Nummers", - "Octaal", - "Andere indelingen", - "PBKDF2 iter.", - "Maak geperforeerde stippen zwart zodat ze worden gedetecteerd.", - "Papier breedte", - "Deel", - "Deel grootte", - "Wachtwoord", - "Wachtwoordlengte:", - "Pad komt niet overeen", - "Patroon gevonden!", - "Alle opgeslagen versleutelde mnemonics en instellingen permanent uit het flashgeheugen verwijderen?", - "Opslag", - "Pixelafwijkingsindex:", - "Platte tekst QR", - "Laadt een portemonnee descriptor in", - "Duik tarief", - "Slechte entropie", - "Lage entropie gedetecteerd!", - "Test QR afdrukken", - "Tiny Seed afdrukken?", - "Afdrukken naar QR", - "Afdrukken naar QR?", - "Afdrukken?", - "Printer", - "Printer driver niet ingesteld!", - "Afdrukken..", - "Toch doorgaan?", - "Doorgaan?", - "Verwerken..", - "QR code", - "RX pin", - "Opnieuw opstarten", - "Ontvangen", - "Ontvangstadres", - "Regio:", - "Verwijderen %s?", - "Geheugensteun verwijderen", - "Firmwarebestanden van SD kaart verwijderen?", - "Res. - Formaat", - "Fabrieksinstellingen herstellen en opnieuw opstarten?", - "Terug naar QR-lezer", - "Controleer gescande gegevens en bewerk indien nodig", - "Rechts", - "Dobbel een dobbelsteen minstens %d keer voor het genereren van een geheugensteun.", - "Roldistributie:", - "Gedobbeld:", - "SD kaart", - "SD kaart niet gedetecteerd.", - "Gedobbelde SHA256:", - "Momentopname van SHA256:", - "QR-afbeelding opslaan op SD kaart", - "Opslaan op SD kaart", - "Opslaan op SD kaart?", - "Opgeslagen op SD kaart", - "Schaal", - "Adres scannen", - "BIP-39 Wachtwoord Scannen", - "QR Code Sleutel Scannen", - "Woorden 1 t/m 12 opnieuw scannen", - "Woorden 13 t/m 24 scannen", - "Schermbeveiligingstijd", - "Scripttype", - "Beveiliging", - "Overschrijving naar jezelf, of wisselgeld (%d):", - "Zelf overschrijving:", - "Stel eerst een sabotagecontrolecode in", - "Instellingen", - "Instellingen intern opgeslagen op flitser.", - "Instellingen opgeslagen op SD kaart.", - "Shannon's entropie:", - "Afsluiten", - "Uitschakelingstijd:", - "Bezig met afsluiten..", - "Ondertekenen", - "Teken op QR-code", - "Teken op SD kaart", - "Ondertekenen?", - "Handtekening", - "Bericht ondertekend", - "PSBT ondertekend", - "Ondertekenen..", - "Enkele sleutel", - "Grootte:", - "Sommige controles kunnen niet worden uitgevoerd.", - "Uitgaven (%d):", - "Uitgaven:", - "Statistieken voor nerds", - "Opslaan op apparaat", - "Opslaan op SD kaart", - "Verander modus", - "TC Flash Hash", - "Hash Flash bij het opstarten", - "TIK of ENTER voor opname", - "TX pin", - "Sabotagecontrolecode", - "Sabotagecontrolecode succesvol ingesteld", - "Sabotagecontrolecodes komen niet overeen", - "Tekst", - "Thema", - "Thermisch", - "Gebruik de functie 'Apparaat wissen' om te zorgen dat de gegevens onherstelbaar zijn", - "Helderheid schakelen", - "Hulpmiddelen", - "Aanraak gevoeligheid", - "Aanraakscherm", - "Meer proberen?", - "Voer een BIP-39 wachtwoord in", - "Voer sleutel in", - "Eenheid", - "Upgrade afgerond.", - "Gebruik een donker achergrond.", - "Gebruik de camera als entropie voor het aanmaken van een nieuwe geheugensteun", - "Gebruikt:", - "Gebruiker", - "Waarde %s is buiten bereik: [%s, %s]", - "Waarde moet meerdere van %s zijn", - "Bezig met verifiëren..", - "Versie", - "Via camera", - "Via D20", - "Via D6", - "Via handmatige invoer", - "Via woorden", - "Wacht op opname", - "Portemonnee", - "Descriptor", - "Portemonnee descriptor", - "Portemonnee descriptor geladen!", - "Portemonnee descriptor niet gevonden.", - "Waarschuwing:", - "Woord %d", - "Woord nummers", - "Woorden", - "Yes", - "is geen geldig adres", - "werd NIET GEVONDEN in de eerste %d adressen", -] +translation_array = ['% van het bedrag.', '%d van %d multisig', '%d tot %d', '%s verwijderd.', '(%d totaal)', '(Experimenteel)', '(alleen inzien)', '12 woorden', '24 woorden', 'Over', 'Aanname accepteren?', 'Account', 'Account #0 zou worden aangenomen', 'Accountindex', 'Wachtwoordzin voor portemonnee toevoegen of wijzigen?', 'Extra entropie van de camera vereist voor AES-CBC-modus', 'Adres', 'Richt de camera en back-upplaat op de juiste manier.', 'Sta eerst instellingen toe!', 'Anti reflecterend uitgeschakeld', 'Anti reflecterend ingeschakeld', 'Uiterlijk', 'Weet je het zeker?', 'BGR-kleuren', 'BIP39 Mnemonic', 'Terug', 'Terug naar menu', 'Backup geheugensteun', 'Ongeldige handtekening', 'Base64-wachtwoord', 'Baudratio', 'Binair raster', 'Rand opvulling', 'Helderheid', 'Knoppen', 'Debounce van knoppen', 'Opname geannuleerd', 'Change', 'Wisselgeldadres', 'Thema veranderen en opnieuw opstarten?', 'Wisselgeld:', 'Wijzigingen blijven van kracht tot afsluiten.', 'Controleer SD kaart', 'Controleer of dit adres bij deze portemonnee hoort?', '%d adressen gecontroleerd zonder overeenkomsten.', 'SD kaart controleren..', 'Bevestig de sabotagecontrolecode', 'QR code maken', 'QR code maken van tekst?', 'Aangemaakt:', 'Huidige sabotagecontrolecode', 'Aangepaste QR code', 'Aanpassen', 'Bij aanpassen van de portemonnee zal er een nieuwe sleutel gegenereerd worden.', 'Snijdiepte', 'Snijmethode', 'Decimaal', 'Ontsleutelen?', 'Standaard portemonnee', 'Diepte per pas', 'BIP85-entropie afleiden?', 'Descriptoradressen', 'Weergave', 'Schakel het apparaat niet uit, het kan even duren voordat het klaar is.', 'Klaar?', 'Dubbel geheugensteuntje', 'Driver', 'Leeg', 'Krux-apps inschakelen', 'Versleuteld', 'Versleutelde QR code', 'Versleutelde geheugensteun was niet opgeslagen', 'Versleutelde geheugensteun is opgeslagen met ID:', 'Versleutelen', 'Versleutel modus', 'Voer %d BIP-39 woorden in.', 'Voer een sabotagecontrolecode van 6 of meer tekens in', 'Voer elk woord van jouw BIP-39 geheugensteun in als een nummer van 1 tot 2048.', 'Voer elk woord van jouw BIP-39 geheugensteun in als een hexadecimaal van 1 tot 800.', 'Voer elk woord van jouw BIP-39 geheugensteun in als een octaal van 1 tot 4000.', 'Voer elk woord van jouw BIP-39 geheugensteun in.', 'Gegevens van gebruiker wissen', 'Gegevens van gebruiker wissen..', 'Fout:', 'Esc', 'Een ondertekende Krux-app uitvoeren?', 'Bestanden verkennen?', 'Exporteren naar SD kaart..', 'Uitgebreide publieke sleutel', 'Fabrieksinstellingen', 'Ontsleutelen is niet gelukt', 'PSBT laden is niet gelukt', 'Adres laden is niet gelukt', 'Sleutel laden is niet gelukt', 'Bericht laden is niet gelukt', 'Geheugensteun laden is niet gelukt', 'Descriptor laden is niet gelukt', 'Wachtwoord laden is niet gelukt', 'Geheugensteun opslaan is niet gelukt', 'Tarief:', 'Voedingssnelheid', 'Bestandsnaam', 'Bestandsnaam %s OVERSCHRIJVEN op SD kaart?', 'De flash vullen met entropie van de camera?', 'Flash vullen', 'Vingerafdruk niet ingesteld in PSBT', 'Firmware overschrijdt de maximale grootte: %d', 'Flash Map', 'Flash Tools', 'Flash gevuld met camera-entropie', 'Geflipte X-coördinaten', 'Fluit diameter', 'Vrij:', 'Uit data-opslag', 'Wis uw SD kaart volledig in een ander apparaat om te zorgen dat de gegevens onherstelbaar zijn', 'Geheugensteun genereren', 'Eigen ID gebruiken voor geheugensteun? Anders vingerafdruk gebruiken', 'Ga', 'Goede entropie', 'Hardware', 'Hex publieke sleutel', 'Hexadecimaal', 'Verberg geheugensteunen', 'Hoge kosten!', 'ID bestaat al', 'Index', 'Index: %s', 'Invoer (%d):', 'Installeren?', 'Onvoldoende Entropie!', 'Onvoldoende entropie', 'Ongeldige sabotagecontrolecode', 'Ongeldig adres', 'Ongeldige bootloader', 'Ongeldige geheugensteun lengte', 'Ongeldige publieke sleutel', 'Ongeldige portemonnee:', 'Omkeren', 'Omgekeerde kleuren', 'Sleutel', 'Sleutel niet verstrekt', 'Krux printer test QR', 'LCD-type', 'Taal', 'Laat leeg als je wilt dat Krux een geldig laatste woord kiest', 'Links', 'Lengte: %s', 'Lijn vertraging', 'Lijn:', 'Krux-app laden', 'Geheugensteun laden', 'Portemonnee laden', 'Een vertrouwde portemonnee descriptor laden om adressen te bekijken?', 'Laden vanaf SD kaart', 'Laden vanaf SD kaart?', 'Laden van camera', 'Laden?', 'Laden?', 'Camera laden..', 'Wijzigingsadressen laden..', 'Laadprinter..', 'Ontvangstadressen laden..', 'Laden..', 'Taal', 'Opslaglocatie', 'Maximale lengte overschreden (%s)', 'Bericht', 'Bericht:', 'Handtekening bestand mist', 'Geheugensteun', 'Geheugensteun ID', 'Geheugensteun en wachtwoord worden bewaard.', 'Geheugensteun is niet versleuteld', 'Aangepast:', 'Multisig', 'Native Segwit - 84 zal worden gebruikt', 'Netwerk', 'Geheugensteun aanmaken', 'Nieuwe firmware gevonden.', 'Nee', 'Geen wachtwoordzin', 'Niet genoeg gedobbeld!', 'Nummers', 'Octaal', 'Andere indelingen', 'PBKDF2 iter.', 'Maak geperforeerde stippen zwart zodat ze worden gedetecteerd.', 'Papier breedte', 'Deel', 'Deel grootte', 'Wachtwoord', 'Wachtwoordlengte:', 'Pad komt niet overeen', 'Patroon gevonden!', 'Alle opgeslagen versleutelde mnemonics en instellingen permanent uit het flashgeheugen verwijderen?', 'Opslag', 'Pixelafwijkingsindex:', 'Platte tekst QR', 'Laadt een portemonnee descriptor in', 'Duik tarief', 'Slechte entropie', 'Lage entropie gedetecteerd!', 'Test QR afdrukken', 'Tiny Seed afdrukken?', 'Afdrukken naar QR', 'Afdrukken naar QR?', 'Afdrukken?', 'Printer', 'Printer driver niet ingesteld!', 'Afdrukken..', 'Toch doorgaan?', 'Doorgaan?', 'Verwerken..', 'QR code', 'RX pin', 'Opnieuw opstarten', 'Ontvangen', 'Ontvangstadres', 'Regio:', 'Verwijderen %s?', 'Geheugensteun verwijderen', 'Firmwarebestanden van SD kaart verwijderen?', 'Res. - Formaat', 'Fabrieksinstellingen herstellen en opnieuw opstarten?', 'Terug naar QR-lezer', 'Controleer gescande gegevens en bewerk indien nodig', 'Rechts', 'Dobbel een dobbelsteen minstens %d keer voor het genereren van een geheugensteun.', 'Roldistributie:', 'Gedobbeld:', 'SD kaart', 'SD kaart niet gedetecteerd.', 'Gedobbelde SHA256:', 'Momentopname van SHA256:', 'QR-afbeelding opslaan op SD kaart', 'Opslaan op SD kaart', 'Opslaan op SD kaart?', 'Opgeslagen op SD kaart', 'Schaal', 'Adres scannen', 'BIP-39 Wachtwoord Scannen', 'QR Code Sleutel Scannen', 'Woorden 1 t/m 12 opnieuw scannen', 'Woorden 13 t/m 24 scannen', 'Schermbeveiligingstijd', 'Scripttype', 'Beveiliging', 'Overschrijving naar jezelf, of wisselgeld (%d):', 'Zelf overschrijving:', 'Stel eerst een sabotagecontrolecode in', 'Instellingen', 'Instellingen intern opgeslagen op flitser.', 'Instellingen opgeslagen op SD kaart.', "Shannon's entropie:", 'Afsluiten', 'Uitschakelingstijd:', 'Bezig met afsluiten..', 'Ondertekenen', 'Teken op QR-code', 'Teken op SD kaart', 'Ondertekenen?', 'Handtekening', 'Bericht ondertekend', 'PSBT ondertekend', 'Ondertekenen..', 'Enkele sleutel', 'Grootte:', 'Sommige controles kunnen niet worden uitgevoerd.', 'Uitgaven (%d):', 'Uitgaven:', 'Statistieken voor nerds', 'Opslaan op apparaat', 'Opslaan op SD kaart', 'Verander modus', 'TC Flash Hash', 'Hash Flash bij het opstarten', 'TIK of ENTER voor opname', 'TX pin', 'Sabotagecontrolecode', 'Sabotagecontrolecode succesvol ingesteld', 'Sabotagecontrolecodes komen niet overeen', 'Tekst', "The app will be copied to user's flash ", 'Thema', 'Thermisch', "Gebruik de functie 'Apparaat wissen' om te zorgen dat de gegevens onherstelbaar zijn", 'Helderheid schakelen', 'Hulpmiddelen', 'Aanraak gevoeligheid', 'Aanraakscherm', 'Meer proberen?', 'Voer een BIP-39 wachtwoord in', 'Voer sleutel in', 'Eenheid', 'Upgrade afgerond.', 'Gebruik een donker achergrond.', 'Gebruik de camera als entropie voor het aanmaken van een nieuwe geheugensteun', 'Gebruikt:', 'Gebruiker', 'Waarde %s is buiten bereik: [%s, %s]', 'Waarde moet meerdere van %s zijn', 'Bezig met verifiëren..', 'Versie', 'Via camera', 'Via D20', 'Via D6', 'Via handmatige invoer', 'Via woorden', 'Wacht op opname', 'Portemonnee', 'Descriptor', 'Portemonnee descriptor', 'Portemonnee descriptor geladen!', 'Portemonnee descriptor niet gevonden.', 'Waarschuwing:', 'Woord %d', 'Woord nummers', 'Woorden', 'Yes', 'is geen geldig adres', 'werd NIET GEVONDEN in de eerste %d adressen'] diff --git a/src/krux/translations/pt.py b/src/krux/translations/pt.py index 4b3e74b09..ca000953c 100644 --- a/src/krux/translations/pt.py +++ b/src/krux/translations/pt.py @@ -20,326 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = [ - "% do valor.", - "%d da %d multisig", - "%d a %d", - "%s removido.", - "(%d total)", - "(Experimental)", - "(Somente visualização)", - "12 palavras", - "24 palavras", - "Sobre", - "Aceitar suposições?", - "Conta", - "A conta #0 seria assumida", - "Índice da Conta", - "Adicionar ou alterar senha da carteira?", - "Entropia adicional da câmera necessária para o modo AES-CBC", - "Endereço", - "Alinhe a câmera e a placa de backup corretamente.", - "Permita nas configurações primeiro!", - "Antirreflexo desativado", - "Antirreflexo ativado", - "Aparência", - "Tem certeza?", - "Cores BGR", - "Mnemônico BIP39", - "Voltar", - "Voltar ao Menu", - "Backup de Mnemônico", - "Assinatura Inválida", - "Senha Base64", - "Baudrate", - "Grade binária", - "Borda", - "Brilho", - "Botões", - "Debounce dos Botões", - "Captura cancelada", - "Troco", - "Endereços de Troco", - "Mudar o tema e reiniciar?", - "Troco:", - "Alterações só durarão até o desligamento.", - "Verifique o cartão SD", - "Verificar se este endereço pertence a carteira?", - "Verificado %d endereços sem correspondências.", - "Verificando o cartão SD..", - "Confirmar Código", - "Não foi possível executar %s", - "Gerar Código QR", - "Gerar código QR do texto?", - "Criado:", - "Código Atual", - "Código QR Customizado", - "Customizar", - "Personalizar sua carteira gerará uma nova chave.", - "Profundidade de Corte", - "Método de Corte", - "Decimal", - "Descriptografar?", - "Carteira Padrão", - "Profundidade da Passagem", - "Derivar entropia BIP85?", - "Endereços do Descritor", - "Display", - "Não desligue, pode demorar um pouco para concluir.", - "Feito?", - "Duplo mnemônico", - "Driver", - "Vazio", - "Ativar Krux app", - "Criptografado", - "Código QR Criptografado", - "Mnemonic criptografado não foi armazenado", - "Mnemônico criptografado foi armazenado com ID:", - "Criptografia", - "Modo de Criptografia", - "Insira %d palavras BIP-39.", - "Insira um código de verificação com mais de 6 caracteres", - "Digite o número de cada palavra do seu mnemônico BIP-39, de 1 a 2048.", - "Digite o número de cada palavra do seu mnemônico BIP-39 como um número em hexadecimal, de 1 a 800.", - "Digite o número de cada palavra do seu mnemônico BIP-39 como um número em octal, de 1 a 4000.", - "Digite cada palavra do seu mnemônico BIP-39.", - "Apagar Dados do Usuário", - "Apagando os dados do usuário..", - "Erro:", - "Esc", - "Executar um Krux app assinado?", - "Explorar arquivos?", - "Exportando para o cartão SD..", - "Chave Pública Estendida", - "Configurações de Fábrica", - "Falhou em descriptografar", - "Falhou ao carregar PSBT", - "Falhou ao carregar endereço", - "Falha ao carregar a chave", - "Falhou ao carregar mensagem", - "Falhou ao carregar mnemônico", - "Falha ao carregar o descritor de saída", - "Falha ao carregar a senha", - "Falhou ao armazenar mnemônico", - "Taxa:", - "Taxa de Alimentação", - "Nome do arquivo", - "O nome do arquivo %s existe no cartão SD, substituir?", - "Preencher a flash com entropia da câmera?", - "Preenchendo a Flash", - "Impressão digital não definida no PSBT", - "Firmware excede o tamanho máximo: %d", - "Mapa da Flash", - "Ferramentas da Flash", - "Flash preenchida com entropia da câmera", - "Coordenadas X invertidas", - "Diâmetro da Fresa", - "Livre:", - "Do Armazenamento", - "Apague totalmente seu cartão SD em outro dispositivo para garantir que os dados sejam irrecuperáveis", - "Gerar Mnemônico", - "Dê a este mnemônico um ID personalizado? Caso contrário, a impressão digital atual será usada", - "Ir", - "Boa entropia", - "Hardware", - "Chave pública hexadecimal", - "Hexadecimal", - "Ocultar Mnemônicos", - "Taxas altas!", - "Id já existe", - "Índice", - "Índice: %s", - "Entradas (%d):", - "Instalar?", - "Entropia insuficiente!", - "Entropia insuficiente", - "Código de verificação inválido", - "Endereço inválido", - "Bootloader inválido", - "Comprimento de mnemônico inválido", - "Chave pública inválida", - "Carteira inválida:", - "Invertido", - "Cores invertidas", - "Chave", - "A chave não foi fornecida", - "Teste de impressão de QR krux", - "Tipo de LCD", - "Língua", - "Deixe em branco se quiser que o Krux escolha uma palavra final válida", - "Esquerda", - "Comprimento: %s", - "Atraso de Linha", - "Linha:", - "Carregar Krux app", - "Carregar Mnemônico", - "Carregar Carteira", - "Carregar um descritor de carteira confiável para visualizar endereços?", - "Carregar do cartão SD", - "Carregar do cartão SD?", - "Carregar da câmera", - "Carregar um?", - "Carregar?", - "Carregando Câmera..", - "Carregando endereços de troco..", - "Carregando impressora..", - "Carregando endereços de recebimento..", - "Carregando..", - "Idioma", - "Local", - "Comprimento máximo excedido (%s)", - "Mensagem", - "Mensagem:", - "Arquivo de assinatura faltando", - "Mnemônico", - "ID do mnemônico", - "Mnemônico e senha serão mantidos.", - "Mnemônico não foi criptografado", - "Modificado:", - "Multisig", - "Segwit nativo - 84 seria assumido", - "Rede", - "Novo Mnemônico", - "Novo firmware detectado.", - "Não", - "Sem Senha", - "Jogadas insuficientes!", - "Números", - "Octal", - "Outros Formatos", - "Iter. PBKDF2", - "Pinte os pontos perfurados de preto para que possam ser detectados.", - "Largura do papel", - "Parte", - "Tamanho da peça", - "Senha", - "Comprimento da Senha", - "Incompatibilidade de caminho", - "Padrão detectado!", - "Remover permanentemente todos os mnemônicos criptografados e configurações armazenados da memória flash?", - "Salvar", - "Índice de desvio de pixels:", - "QR em Texto", - "Carregue um descritor da carteira", - "Taxa de Mergulho", - "Entropia fraca", - "Baixa entropia detectada!", - "Imprimir QR de teste", - "Imprimir Tiny Seed?", - "Imprimir QR", - "Imprimir QR?", - "Imprimir?", - "Impressora", - "Driver de impressora não está definido!", - "Imprimindo..", - "Continuar mesmo assim?", - "Seguir?", - "Processando..", - "Código QR", - "Pino RX", - "Reiniciar", - "Recebimento", - "Endereços de Recebimento", - "Região:", - "Excluir %s?", - "Excluir Mnemônico", - "Remover arquivos de firmware do cartão SD?", - "Res. - Formato", - "Restaurar as configurações de fábrica e reiniciar?", - "Retornar ao Visualizador de QR", - "Revise os dados, edite se necessário", - "Direita", - "Role o dado pelo menos %d vezes para gerar um mnemônico.", - "Distribuição de jogadas:", - "Jogadas:", - "Cartão SD", - "Cartão SD não detectado.", - "SHA256 de jogadas:", - "Sha256 da imagem:", - "Salvar imagem do QR no cartão SD", - "Salvar no cartão SD", - "Salvar no cartão SD?", - "Salvo no cartão SD", - "Escala", - "Escanear Endereço", - "Escanear a senha BIP39", - "Escanear Código QR da Chave", - "Escaneando as palavras 1-12 novamente", - "Escaneando as palavras 13-24", - "Tempo para protetor de tela", - "Tipo de Script", - "Segurança", - "Autotransferência ou Troco (%d):", - "Autotransferência:", - "Defina um código de verificação primeiro", - "Configurações", - "Configurações armazenadas internamente no flash.", - "Configurações armazenadas no cartão SD.", - "Entropia de Shannon:", - "Desligar", - "Tempo de desligamento", - "Desligando..", - "Assinar", - "Assinar para código QR", - "Assinar para cartão SD", - "Assinar?", - "Assinatura", - "Mensagem Assinada", - "PSBT Assinada", - "Assinando..", - "Single-sig", - "Total:", - "Algumas verificações não podem ser realizadas.", - "Gastos (%d):", - "Gasto:", - "Estatísticas para Nerds", - "Armazene na Flash", - "Armazene no Cartão SD", - "Deslize para mudar de modo", - "TC Flash Hash", - "TC Hash Flash na Inicialização", - "TOQUE ou ENTER para capturar", - "Pino TX", - "Código de Verificação", - "Código de verificação definido com sucesso", - "Os códigos de verificação não correspondem", - "Texto", - "Tema", - "Térmica", - "Para garantir que os dados sejam irrecuperáveis, use o recurso Limpar Dispositivo", - "Alternar brilho", - "Ferramentas", - "Limiar de Toque", - "Touchscreen", - "Tentar mais?", - "Digitar a senha BIP39", - "Digite a Chave", - "Unidade", - "Atualização completa.", - "Use uma superfície de fundo preta.", - "Use a entropia da câmera para criar um novo mnemônico", - "Usado:", - "Usuário", - "Valor %s fora do alcance: [ %s, %s]", - "O valor deve ser múltiplo de %s", - "Verificando..", - "Versão", - "Pela Câmera", - "Via D20", - "Via D6", - "Por entrada manual", - "Via Palavras", - "Aguarde a captura", - "Carteira", - "Descritor de Carteira", - "Descritor da carteira", - "Descritor de saída da carteira carregado!", - "O descritor de saída da carteira não foi encontrado.", - "Aviso:", - "Palavra %d", - "Números das Palavras", - "Palavras", - "Sim", - "é um endereço válido!", - "NÃO FOI ENCONTRADO nos primeiros %d endereços", -] +translation_array = ['% do valor.', '%d da %d multisig', '%d a %d', '%s removido.', '(%d total)', '(Experimental)', '(Somente visualização)', '12 palavras', '24 palavras', 'Sobre', 'Aceitar suposições?', 'Conta', 'A conta #0 seria assumida', 'Índice da Conta', 'Adicionar ou alterar senha da carteira?', 'Entropia adicional da câmera necessária para o modo AES-CBC', 'Endereço', 'Alinhe a câmera e a placa de backup corretamente.', 'Permita nas configurações primeiro!', 'Antirreflexo desativado', 'Antirreflexo ativado', 'Aparência', 'Tem certeza?', 'Cores BGR', 'Mnemônico BIP39', 'Voltar', 'Voltar ao Menu', 'Backup de Mnemônico', 'Assinatura Inválida', 'Senha Base64', 'Baudrate', 'Grade binária', 'Borda', 'Brilho', 'Botões', 'Debounce dos Botões', 'Captura cancelada', 'Troco', 'Endereços de Troco', 'Mudar o tema e reiniciar?', 'Troco:', 'Alterações só durarão até o desligamento.', 'Verifique o cartão SD', 'Verificar se este endereço pertence a carteira?', 'Verificado %d endereços sem correspondências.', 'Verificando o cartão SD..', 'Confirmar Código', 'Gerar Código QR', 'Gerar código QR do texto?', 'Criado:', 'Código Atual', 'Código QR Customizado', 'Customizar', 'Personalizar sua carteira gerará uma nova chave.', 'Profundidade de Corte', 'Método de Corte', 'Decimal', 'Descriptografar?', 'Carteira Padrão', 'Profundidade da Passagem', 'Derivar entropia BIP85?', 'Endereços do Descritor', 'Display', 'Não desligue, pode demorar um pouco para concluir.', 'Feito?', 'Duplo mnemônico', 'Driver', 'Vazio', 'Ativar Krux app', 'Criptografado', 'Código QR Criptografado', 'Mnemonic criptografado não foi armazenado', 'Mnemônico criptografado foi armazenado com ID:', 'Criptografia', 'Modo de Criptografia', 'Insira %d palavras BIP-39.', 'Insira um código de verificação com mais de 6 caracteres', 'Digite o número de cada palavra do seu mnemônico BIP-39, de 1 a 2048.', 'Digite o número de cada palavra do seu mnemônico BIP-39 como um número em hexadecimal, de 1 a 800.', 'Digite o número de cada palavra do seu mnemônico BIP-39 como um número em octal, de 1 a 4000.', 'Digite cada palavra do seu mnemônico BIP-39.', 'Apagar Dados do Usuário', 'Apagando os dados do usuário..', 'Erro:', 'Esc', 'Executar um Krux app assinado?', 'Explorar arquivos?', 'Exportando para o cartão SD..', 'Chave Pública Estendida', 'Configurações de Fábrica', 'Falhou em descriptografar', 'Falhou ao carregar PSBT', 'Falhou ao carregar endereço', 'Falha ao carregar a chave', 'Falhou ao carregar mensagem', 'Falhou ao carregar mnemônico', 'Falha ao carregar o descritor de saída', 'Falha ao carregar a senha', 'Falhou ao armazenar mnemônico', 'Taxa:', 'Taxa de Alimentação', 'Nome do arquivo', 'O nome do arquivo %s existe no cartão SD, substituir?', 'Preencher a flash com entropia da câmera?', 'Preenchendo a Flash', 'Impressão digital não definida no PSBT', 'Firmware excede o tamanho máximo: %d', 'Mapa da Flash', 'Ferramentas da Flash', 'Flash preenchida com entropia da câmera', 'Coordenadas X invertidas', 'Diâmetro da Fresa', 'Livre:', 'Do Armazenamento', 'Apague totalmente seu cartão SD em outro dispositivo para garantir que os dados sejam irrecuperáveis', 'Gerar Mnemônico', 'Dê a este mnemônico um ID personalizado? Caso contrário, a impressão digital atual será usada', 'Ir', 'Boa entropia', 'Hardware', 'Chave pública hexadecimal', 'Hexadecimal', 'Ocultar Mnemônicos', 'Taxas altas!', 'Id já existe', 'Índice', 'Índice: %s', 'Entradas (%d):', 'Instalar?', 'Entropia insuficiente!', 'Entropia insuficiente', 'Código de verificação inválido', 'Endereço inválido', 'Bootloader inválido', 'Comprimento de mnemônico inválido', 'Chave pública inválida', 'Carteira inválida:', 'Invertido', 'Cores invertidas', 'Chave', 'A chave não foi fornecida', 'Teste de impressão de QR krux', 'Tipo de LCD', 'Língua', 'Deixe em branco se quiser que o Krux escolha uma palavra final válida', 'Esquerda', 'Comprimento: %s', 'Atraso de Linha', 'Linha:', 'Carregar Krux app', 'Carregar Mnemônico', 'Carregar Carteira', 'Carregar um descritor de carteira confiável para visualizar endereços?', 'Carregar do cartão SD', 'Carregar do cartão SD?', 'Carregar da câmera', 'Carregar um?', 'Carregar?', 'Carregando Câmera..', 'Carregando endereços de troco..', 'Carregando impressora..', 'Carregando endereços de recebimento..', 'Carregando..', 'Idioma', 'Local', 'Comprimento máximo excedido (%s)', 'Mensagem', 'Mensagem:', 'Arquivo de assinatura faltando', 'Mnemônico', 'ID do mnemônico', 'Mnemônico e senha serão mantidos.', 'Mnemônico não foi criptografado', 'Modificado:', 'Multisig', 'Segwit nativo - 84 seria assumido', 'Rede', 'Novo Mnemônico', 'Novo firmware detectado.', 'Não', 'Sem Senha', 'Jogadas insuficientes!', 'Números', 'Octal', 'Outros Formatos', 'Iter. PBKDF2', 'Pinte os pontos perfurados de preto para que possam ser detectados.', 'Largura do papel', 'Parte', 'Tamanho da peça', 'Senha', 'Comprimento da Senha', 'Incompatibilidade de caminho', 'Padrão detectado!', 'Remover permanentemente todos os mnemônicos criptografados e configurações armazenados da memória flash?', 'Salvar', 'Índice de desvio de pixels:', 'QR em Texto', 'Carregue um descritor da carteira', 'Taxa de Mergulho', 'Entropia fraca', 'Baixa entropia detectada!', 'Imprimir QR de teste', 'Imprimir Tiny Seed?', 'Imprimir QR', 'Imprimir QR?', 'Imprimir?', 'Impressora', 'Driver de impressora não está definido!', 'Imprimindo..', 'Continuar mesmo assim?', 'Seguir?', 'Processando..', 'Código QR', 'Pino RX', 'Reiniciar', 'Recebimento', 'Endereços de Recebimento', 'Região:', 'Excluir %s?', 'Excluir Mnemônico', 'Remover arquivos de firmware do cartão SD?', 'Res. - Formato', 'Restaurar as configurações de fábrica e reiniciar?', 'Retornar ao Visualizador de QR', 'Revise os dados, edite se necessário', 'Direita', 'Role o dado pelo menos %d vezes para gerar um mnemônico.', 'Distribuição de jogadas:', 'Jogadas:', 'Cartão SD', 'Cartão SD não detectado.', 'SHA256 de jogadas:', 'Sha256 da imagem:', 'Salvar imagem do QR no cartão SD', 'Salvar no cartão SD', 'Salvar no cartão SD?', 'Salvo no cartão SD', 'Escala', 'Escanear Endereço', 'Escanear a senha BIP39', 'Escanear Código QR da Chave', 'Escaneando as palavras 1-12 novamente', 'Escaneando as palavras 13-24', 'Tempo para protetor de tela', 'Tipo de Script', 'Segurança', 'Autotransferência ou Troco (%d):', 'Autotransferência:', 'Defina um código de verificação primeiro', 'Configurações', 'Configurações armazenadas internamente no flash.', 'Configurações armazenadas no cartão SD.', 'Entropia de Shannon:', 'Desligar', 'Tempo de desligamento', 'Desligando..', 'Assinar', 'Assinar para código QR', 'Assinar para cartão SD', 'Assinar?', 'Assinatura', 'Mensagem Assinada', 'PSBT Assinada', 'Assinando..', 'Single-sig', 'Total:', 'Algumas verificações não podem ser realizadas.', 'Gastos (%d):', 'Gasto:', 'Estatísticas para Nerds', 'Armazene na Flash', 'Armazene no Cartão SD', 'Deslize para mudar de modo', 'TC Flash Hash', 'TC Hash Flash na Inicialização', 'TOQUE ou ENTER para capturar', 'Pino TX', 'Código de Verificação', 'Código de verificação definido com sucesso', 'Os códigos de verificação não correspondem', 'Texto', "The app will be copied to user's flash ", 'Tema', 'Térmica', 'Para garantir que os dados sejam irrecuperáveis, use o recurso Limpar Dispositivo', 'Alternar brilho', 'Ferramentas', 'Limiar de Toque', 'Touchscreen', 'Tentar mais?', 'Digitar a senha BIP39', 'Digite a Chave', 'Unidade', 'Atualização completa.', 'Use uma superfície de fundo preta.', 'Use a entropia da câmera para criar um novo mnemônico', 'Usado:', 'Usuário', 'Valor %s fora do alcance: [ %s, %s]', 'O valor deve ser múltiplo de %s', 'Verificando..', 'Versão', 'Pela Câmera', 'Via D20', 'Via D6', 'Por entrada manual', 'Via Palavras', 'Aguarde a captura', 'Carteira', 'Descritor de Carteira', 'Descritor da carteira', 'Descritor de saída da carteira carregado!', 'O descritor de saída da carteira não foi encontrado.', 'Aviso:', 'Palavra %d', 'Números das Palavras', 'Palavras', 'Sim', 'é um endereço válido!', 'NÃO FOI ENCONTRADO nos primeiros %d endereços'] diff --git a/src/krux/translations/ru.py b/src/krux/translations/ru.py index ef4f136b5..21dd2466f 100644 --- a/src/krux/translations/ru.py +++ b/src/krux/translations/ru.py @@ -20,326 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = [ - "% от суммы.", - "%d из %d мультиподпись", - "%d к %d", - "%s удален.", - "(%d всего)", - "(Эксперементальный)", - "(Только часы)", - "12 слов", - "24 слова", - "О Программе", - "Принять предположение?", - "Учетная запись", - "Будет принят счет №0", - "Индекс счета", - "Добавить или изменить пароль кошелька?", - "Для режима AES-CBC требуется дополнительная энтропия от камеры", - "Адрес", - "Правильно совместите камеру и резервную пластину.", - "Сначала разрешите в настройках!", - "Антиблик отключен", - "Антиблик включен", - "Внешний Вид", - "Вы уверены?", - "Цвета BGR", - "BIP39 Мнемоника", - "Назад", - "Назад в Mеню", - "Резервная мнемоника", - "Плохая подпись", - "Пароль Base64", - "Скорость Передачи Данных", - "Двоичная сетка", - "Заполнение Границ", - "Яркость", - "Кнопки", - "Антидребезг кнопок", - "Захват отменен", - "Сдача", - "Адрес Сдачи", - "Сменить тему и перезагрузить?", - "Сдача:", - "Изменения будут храниться до выключения.", - "Проверить SD Карту", - "Проверить, что адрес принадлежит этому кошельку?", - "Проверено %d адресов без совпадений.", - "Проверка SD карты..", - "Подтвердите код проверки вскрытия", - "Не удалось выполнить %s", - "Создать QR Код", - "Создать QR код из текста?", - "Создано:", - "Текущий код проверки вскрытия", - "Пользовательский QR Код", - "Настроить", - "Настройка вашего кошелька создаст новый ключ.", - "Глубина Резки", - "Метод Резки", - "Десятичный", - "Расшифровать?", - "Кошелек по умолчанию", - "Глубина за Проход", - "Вывести энтропию BIP85?", - "Адреса дескрипторов", - "Дисплеи", - "Не выключайте питание, это может занять некоторое время.", - "Готово?", - "Двойная мнемоника", - "Драйвер", - "Пустой", - "Включить приложения Krux", - "Зашифровано", - "Зашифрованный QR Код", - "Зашифрованная мнемоника не была сохранена", - "Зашифрованная мнемоника была сохранена с ID:", - "Шифрование", - "Метод Шифрования", - "Введите %d слов BIP-39.", - "Введите более 6 символов кода проверки вскрытия", - "Введите каждое слово вашей мнемоники BIP-39 в виде числа от 1 до 2048.", - "Введите каждое слово вашей мнемоники BIP-39 в виде шестнадцатеричного числа от 1 до 800.", - "Введите каждое слово вашей мнемоники BIP-39 в виде восьмеричного числа от 1 до 4000.", - "Введите каждое слово вашей BIP-39 мнемоники.", - "Удалить данные пользователя", - "Удаление данных пользователя..", - "Ошибка:", - "Выйти", - "Выполнить подписанное приложение Krux?", - "Исследовать файлы?", - "Экспортирование на SD карту..", - "Расширенный Публичный Ключ", - "Заводские Настройки", - "Не удалось расшифровать", - "Не удалось загрузить PSBT", - "Не удалось загрузить адрес", - "Не удалось загрузить ключ", - "Не удалось загрузить сообщение", - "Не удалось загрузить мнемонику", - "Не удалось загрузить выходной дескриптор", - "Не удалось загрузить фразу-пароль", - "Не удалось сохранить мнемонику", - "Комиссия:", - "Скорость Подачи", - "Имя файла", - "Файл %s существует на SD карте, перезаписать?", - "Заполнить флэш энтропией с камеры?", - "Заполнение флэша", - "Отпечаток пальца не установлен в PSBT", - "Прошивка превышает максимальный размер: %d", - "Карта флэша", - "Flash Tools", - "Флэш заполнен энтропией камеры", - "Перевернутые координаты X", - "Диаметр Флюта", - "Свободно:", - "Из Памяти", - "Полностью стерите SD-карту в другом устройстве, чтобы убедиться, что данные не восстановимы", - "Создать Мнемонику", - "Назначить этой мнемоники кастомный ID? В ином случае будет использован текущий фингерпринт", - "OK", - "Хорошая энтропия", - "Аппаратное Обеспечение", - "Шестнадцатеричный Публичный Ключ", - "Шестнадцатеричный", - "Скрыть мнемоники", - "Высокие комиссии!", - "ID уже существует", - "Индекс", - "Индекс: %s", - "Входы (%d):", - "Установить?", - "Недостаточная Энтропия!", - "Недостаточная энтропия", - "Недействительный код проверки вскрытия", - "Неверный адрес", - "Неверный загрузчик", - "Неверная длина мнемоники", - "Неверный публичный ключ", - "Неверный кошелек:", - "Инвертировать", - "Перевернутые цвета", - "Ключ", - "Ключ не предоставлен", - "Тестовый QR Принтера Krux", - "Тип ЖК-дисплея", - "Язык", - "Оставьте пустым, если хотите, чтобы Krux выбрал подходящее последнее слово", - "Влево", - "Длина: %s", - "Задержка Линии", - "Линия:", - "Загрузить приложение Krux", - "Загрузить Мнемонику", - "Загрузить кошелек", - "Загрузить дескриптор доверенного кошелька для просмотра адресов?", - "Загрузка с SD-карты", - "Загрузить с SD карты?", - "Из камеры", - "Загрузить один?", - "Загрузить?", - "Загрузка Камеры..", - "Загрузка адресов изменения..", - "Загрузка принтера..", - "Загрузка адресов получения..", - "Загрузка..", - "Локаль", - "Расположение", - "Максимальная длина превышена (%s)", - "Сообщение", - "Сообщение:", - "Отсутствует файл подписи", - "Мнемоника", - "ID Мнемоники", - "Мнемоника и парольная фраза будут сохранены.", - "Мнемоника не была зашифрована", - "Изменено:", - "Мультиподпись", - "Native Segwit - 84 будет принято", - "Сеть", - "Новая Мнемоника", - "Обнаружена новая прошивка.", - "Нет", - "Нет Фраза-пароль", - "Недостаточно бросков!", - "Числа", - "Восьмеричный", - "Другие форматы", - "PBKDF2 Итерации", - "Закрасьте перфорированные точки черным цветом, чтобы их можно было обнаружить.", - "Ширина Бумаги", - "Часть", - "Размер Части", - "Фраза-пароль", - "Длина пароля", - "Несоответствие пути", - "Образец обнаружен!", - "Окончательно удалить все сохраненные зашифрованные мнемоники и настройки из флеш-памяти?", - "Постоянная Память", - "Индекс отклонения пикселей:", - "QR Открытым Текстом", - "Пожалуйста загрузите выходной дескриптор кошелька", - "Скорость Погружения", - "Плохая энтропия", - "Обнаружена плохая энтропия!", - "Напечатать Тестовый QR", - "Распечатать Tiny Seed?", - "Печать в QR", - "Напечатать в виде QR?", - "Печатать?", - "Принтер", - "Драйвер Принтера не установлен!", - "Идет печать..", - "Все равно продолжить?", - "Продолжить?", - "Обработка..", - "QR Код", - "RX Пин", - "Перезагрузить", - "Получить", - "Адрес Получения", - "Регион:", - "Удалить %s?", - "Удалить Мнемонику", - "Удалить файлы прошивки с SD-карты?", - "Разреш. - Формат", - "Восстановить заводские настройки и перезагрузить?", - "Вернуться к QR-просмотрщику", - "Просмотрите отсканированные данные, отредактируйте при необходимости", - "Вправо", - "Бросьте кубик не менее %d раз, чтобы сгенерировать мнемонику.", - "Распределение бросков:", - "Броски:", - "SD карта", - "SD карта не обнаружена.", - "SHA256 бросков:", - "SHA256 снэпшота:", - "Сохранить QR-изображение на SD-карту", - "Сохранить на SD-карту", - "Сохранить на SD карту?", - "Сохранено на SD карту", - "Шкала", - "Отсканировать Адрес", - "Отсканировать BIP39 фразу-пароль", - "Отсканировать Ключ QR код", - "Сканирование слов 1-12 снова", - "Сканирование слов 13-24", - "Время Экранной Заставки", - "Тип скрипта", - "Охрана", - "Трансфер самому себе или Сдача (%d):", - "Перевод самому себе:", - "Сначала установите код проверки вскрытия", - "Настройки", - "Настройки хранятся во флэш-памяти.", - "Настройки сохранены на SD-карте.", - "Энтропия Шеннона:", - "Выключить", - "Время выключения", - "Выключение..", - "Подписать", - "Подписать QR-код", - "Подписать на SD-карте", - "Подписать?", - "Подпись", - "Подписанное Сообщение", - "Подписанное PSBT", - "Подписание..", - "Одна подпись", - "Размер:", - "Некоторые проверки не могут быть выполнены.", - "Расход (%d):", - "Расход:", - "Статистика для Гиков", - "Сохранить на Флэш Память", - "Сохранить на SD Карту", - "Свайпните, чтобы сменить режим", - "TC Flash Hash", - "Проверка хэша Flash при загрузке", - "ПРИКОСНИТЕСЬ или нажмите ВВОД, чтобы захватить", - "TX Пин", - "Код проверки вскрытия", - "Код проверки вскрытия успешно установлен", - "Коды проверки вскрытия не совпадают", - "Текст", - "Тема", - "Термальный", - "Для гарантии невосстановления данных используйте функцию Очистки Устройства", - "Регулировка Яркости", - "Инструменты", - "Чувствительность", - "Тачскрин", - "Попробовать ещё?", - "Ввести BIP39 фразу-пароль", - "Ввести Ключ", - "Единица Измерения", - "Обновление завершено.", - "Использовать черную фоновую поверхность.", - "Использовать энтропию камеры, чтобы создать новую мнемонику", - "Использовано:", - "Пользователь", - "Значение %s вне диапозона: [%s, %s]", - "Значение должно быть кратным %s", - "Проверка..", - "Версия", - "С Помощью Камеры", - "С Помощью D20", - "С Помощью D6", - "С Помощью Ручного Ввода", - "Через Слово", - "Дождитесь Захвата", - "Кошелек", - "Дескриптор Кошелька", - "Выходной дескриптор кошелька", - "Выходной дескриптор кошелька загружен!", - "Выходной дескриптор кошелька не найден.", - "Предупреждение:", - "Слово %d", - "Числа Слов", - "Слова", - "Да", - "некорректный адрес", - "нЕ НАЙДЕНО в первых %d адресах", -] +translation_array = ['% от суммы.', '%d из %d мультиподпись', '%d к %d', '%s удален.', '(%d всего)', '(Эксперементальный)', '(Только часы)', '12 слов', '24 слова', 'О Программе', 'Принять предположение?', 'Учетная запись', 'Будет принят счет №0', 'Индекс счета', 'Добавить или изменить пароль кошелька?', 'Для режима AES-CBC требуется дополнительная энтропия от камеры', 'Адрес', 'Правильно совместите камеру и резервную пластину.', 'Сначала разрешите в настройках!', 'Антиблик отключен', 'Антиблик включен', 'Внешний Вид', 'Вы уверены?', 'Цвета BGR', 'BIP39 Мнемоника', 'Назад', 'Назад в Mеню', 'Резервная мнемоника', 'Плохая подпись', 'Пароль Base64', 'Скорость Передачи Данных', 'Двоичная сетка', 'Заполнение Границ', 'Яркость', 'Кнопки', 'Антидребезг кнопок', 'Захват отменен', 'Сдача', 'Адрес Сдачи', 'Сменить тему и перезагрузить?', 'Сдача:', 'Изменения будут храниться до выключения.', 'Проверить SD Карту', 'Проверить, что адрес принадлежит этому кошельку?', 'Проверено %d адресов без совпадений.', 'Проверка SD карты..', 'Подтвердите код проверки вскрытия', 'Создать QR Код', 'Создать QR код из текста?', 'Создано:', 'Текущий код проверки вскрытия', 'Пользовательский QR Код', 'Настроить', 'Настройка вашего кошелька создаст новый ключ.', 'Глубина Резки', 'Метод Резки', 'Десятичный', 'Расшифровать?', 'Кошелек по умолчанию', 'Глубина за Проход', 'Вывести энтропию BIP85?', 'Адреса дескрипторов', 'Дисплеи', 'Не выключайте питание, это может занять некоторое время.', 'Готово?', 'Двойная мнемоника', 'Драйвер', 'Пустой', 'Включить приложения Krux', 'Зашифровано', 'Зашифрованный QR Код', 'Зашифрованная мнемоника не была сохранена', 'Зашифрованная мнемоника была сохранена с ID:', 'Шифрование', 'Метод Шифрования', 'Введите %d слов BIP-39.', 'Введите более 6 символов кода проверки вскрытия', 'Введите каждое слово вашей мнемоники BIP-39 в виде числа от 1 до 2048.', 'Введите каждое слово вашей мнемоники BIP-39 в виде шестнадцатеричного числа от 1 до 800.', 'Введите каждое слово вашей мнемоники BIP-39 в виде восьмеричного числа от 1 до 4000.', 'Введите каждое слово вашей BIP-39 мнемоники.', 'Удалить данные пользователя', 'Удаление данных пользователя..', 'Ошибка:', 'Выйти', 'Выполнить подписанное приложение Krux?', 'Исследовать файлы?', 'Экспортирование на SD карту..', 'Расширенный Публичный Ключ', 'Заводские Настройки', 'Не удалось расшифровать', 'Не удалось загрузить PSBT', 'Не удалось загрузить адрес', 'Не удалось загрузить ключ', 'Не удалось загрузить сообщение', 'Не удалось загрузить мнемонику', 'Не удалось загрузить выходной дескриптор', 'Не удалось загрузить фразу-пароль', 'Не удалось сохранить мнемонику', 'Комиссия:', 'Скорость Подачи', 'Имя файла', 'Файл %s существует на SD карте, перезаписать?', 'Заполнить флэш энтропией с камеры?', 'Заполнение флэша', 'Отпечаток пальца не установлен в PSBT', 'Прошивка превышает максимальный размер: %d', 'Карта флэша', 'Flash Tools', 'Флэш заполнен энтропией камеры', 'Перевернутые координаты X', 'Диаметр Флюта', 'Свободно:', 'Из Памяти', 'Полностью стерите SD-карту в другом устройстве, чтобы убедиться, что данные не восстановимы', 'Создать Мнемонику', 'Назначить этой мнемоники кастомный ID? В ином случае будет использован текущий фингерпринт', 'OK', 'Хорошая энтропия', 'Аппаратное Обеспечение', 'Шестнадцатеричный Публичный Ключ', 'Шестнадцатеричный', 'Скрыть мнемоники', 'Высокие комиссии!', 'ID уже существует', 'Индекс', 'Индекс: %s', 'Входы (%d):', 'Установить?', 'Недостаточная Энтропия!', 'Недостаточная энтропия', 'Недействительный код проверки вскрытия', 'Неверный адрес', 'Неверный загрузчик', 'Неверная длина мнемоники', 'Неверный публичный ключ', 'Неверный кошелек:', 'Инвертировать', 'Перевернутые цвета', 'Ключ', 'Ключ не предоставлен', 'Тестовый QR Принтера Krux', 'Тип ЖК-дисплея', 'Язык', 'Оставьте пустым, если хотите, чтобы Krux выбрал подходящее последнее слово', 'Влево', 'Длина: %s', 'Задержка Линии', 'Линия:', 'Загрузить приложение Krux', 'Загрузить Мнемонику', 'Загрузить кошелек', 'Загрузить дескриптор доверенного кошелька для просмотра адресов?', 'Загрузка с SD-карты', 'Загрузить с SD карты?', 'Из камеры', 'Загрузить один?', 'Загрузить?', 'Загрузка Камеры..', 'Загрузка адресов изменения..', 'Загрузка принтера..', 'Загрузка адресов получения..', 'Загрузка..', 'Локаль', 'Расположение', 'Максимальная длина превышена (%s)', 'Сообщение', 'Сообщение:', 'Отсутствует файл подписи', 'Мнемоника', 'ID Мнемоники', 'Мнемоника и парольная фраза будут сохранены.', 'Мнемоника не была зашифрована', 'Изменено:', 'Мультиподпись', 'Native Segwit - 84 будет принято', 'Сеть', 'Новая Мнемоника', 'Обнаружена новая прошивка.', 'Нет', 'Нет Фраза-пароль', 'Недостаточно бросков!', 'Числа', 'Восьмеричный', 'Другие форматы', 'PBKDF2 Итерации', 'Закрасьте перфорированные точки черным цветом, чтобы их можно было обнаружить.', 'Ширина Бумаги', 'Часть', 'Размер Части', 'Фраза-пароль', 'Длина пароля', 'Несоответствие пути', 'Образец обнаружен!', 'Окончательно удалить все сохраненные зашифрованные мнемоники и настройки из флеш-памяти?', 'Постоянная Память', 'Индекс отклонения пикселей:', 'QR Открытым Текстом', 'Пожалуйста загрузите выходной дескриптор кошелька', 'Скорость Погружения', 'Плохая энтропия', 'Обнаружена плохая энтропия!', 'Напечатать Тестовый QR', 'Распечатать Tiny Seed?', 'Печать в QR', 'Напечатать в виде QR?', 'Печатать?', 'Принтер', 'Драйвер Принтера не установлен!', 'Идет печать..', 'Все равно продолжить?', 'Продолжить?', 'Обработка..', 'QR Код', 'RX Пин', 'Перезагрузить', 'Получить', 'Адрес Получения', 'Регион:', 'Удалить %s?', 'Удалить Мнемонику', 'Удалить файлы прошивки с SD-карты?', 'Разреш. - Формат', 'Восстановить заводские настройки и перезагрузить?', 'Вернуться к QR-просмотрщику', 'Просмотрите отсканированные данные, отредактируйте при необходимости', 'Вправо', 'Бросьте кубик не менее %d раз, чтобы сгенерировать мнемонику.', 'Распределение бросков:', 'Броски:', 'SD карта', 'SD карта не обнаружена.', 'SHA256 бросков:', 'SHA256 снэпшота:', 'Сохранить QR-изображение на SD-карту', 'Сохранить на SD-карту', 'Сохранить на SD карту?', 'Сохранено на SD карту', 'Шкала', 'Отсканировать Адрес', 'Отсканировать BIP39 фразу-пароль', 'Отсканировать Ключ QR код', 'Сканирование слов 1-12 снова', 'Сканирование слов 13-24', 'Время Экранной Заставки', 'Тип скрипта', 'Охрана', 'Трансфер самому себе или Сдача (%d):', 'Перевод самому себе:', 'Сначала установите код проверки вскрытия', 'Настройки', 'Настройки хранятся во флэш-памяти.', 'Настройки сохранены на SD-карте.', 'Энтропия Шеннона:', 'Выключить', 'Время выключения', 'Выключение..', 'Подписать', 'Подписать QR-код', 'Подписать на SD-карте', 'Подписать?', 'Подпись', 'Подписанное Сообщение', 'Подписанное PSBT', 'Подписание..', 'Одна подпись', 'Размер:', 'Некоторые проверки не могут быть выполнены.', 'Расход (%d):', 'Расход:', 'Статистика для Гиков', 'Сохранить на Флэш Память', 'Сохранить на SD Карту', 'Свайпните, чтобы сменить режим', 'TC Flash Hash', 'Проверка хэша Flash при загрузке', 'ПРИКОСНИТЕСЬ или нажмите ВВОД, чтобы захватить', 'TX Пин', 'Код проверки вскрытия', 'Код проверки вскрытия успешно установлен', 'Коды проверки вскрытия не совпадают', 'Текст', "The app will be copied to user's flash ", 'Тема', 'Термальный', 'Для гарантии невосстановления данных используйте функцию Очистки Устройства', 'Регулировка Яркости', 'Инструменты', 'Чувствительность', 'Тачскрин', 'Попробовать ещё?', 'Ввести BIP39 фразу-пароль', 'Ввести Ключ', 'Единица Измерения', 'Обновление завершено.', 'Использовать черную фоновую поверхность.', 'Использовать энтропию камеры, чтобы создать новую мнемонику', 'Использовано:', 'Пользователь', 'Значение %s вне диапозона: [%s, %s]', 'Значение должно быть кратным %s', 'Проверка..', 'Версия', 'С Помощью Камеры', 'С Помощью D20', 'С Помощью D6', 'С Помощью Ручного Ввода', 'Через Слово', 'Дождитесь Захвата', 'Кошелек', 'Дескриптор Кошелька', 'Выходной дескриптор кошелька', 'Выходной дескриптор кошелька загружен!', 'Выходной дескриптор кошелька не найден.', 'Предупреждение:', 'Слово %d', 'Числа Слов', 'Слова', 'Да', 'некорректный адрес', 'нЕ НАЙДЕНО в первых %d адресах'] diff --git a/src/krux/translations/tr.py b/src/krux/translations/tr.py index 50f2cbcac..f040cddf4 100644 --- a/src/krux/translations/tr.py +++ b/src/krux/translations/tr.py @@ -20,326 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = [ - "tutarın %'si.", - "%d / %d çoklu imza", - "%d to %d", - "%s kaldırıldı.", - "(toplam %d)", - "(Deneysel)", - "(sadece izle)", - "12 kelime", - "24 kelime", - "Hakkında", - "Varsayım kabul edilsin mi?", - "Hesap", - "#0 numaralı hesap varsayılacaktır", - "Hesap Endeksi", - "Cüzdan parolası eklensin mi veya değiştirilsin mi?", - "AES-CBC modu için kameradan ek entropi gereklidir", - "Adres", - "Kamerayı ve yedek plakay'ı düzgün bir şekilde hizalayın.", - "Önce ayarlarda izin ver!", - "Parlama önleyici devre dışı", - "Parlama önleyici etkin", - "Görünüm", - "Emin misiniz?", - "BGR Renkleri", - "BIP39 Anımsatıcı", - "Geri", - "Menüye Dön", - "Yedek Mnemonic", - "Geçersiz imza", - "Base64 Parola", - "Baud Hızı", - "İkili Izgara", - "Kenarlık Dolgusu", - "Parlaklık", - "Butonlar", - "Buton Geri-sekmesi", - "Yakalama iptal edildi", - "Para Üstü", - "Para Üstü Adresleri", - "Temayı değiştir ve yeniden başlat?", - "Para Üstü:", - "Değişiklikler kapanışa kadar devam edecek.", - "SD Kartı Kontrol Et", - "Bu adresin, bu cüzdana ait olduğunu kontrol et?", - "Eşleşmeyen %d adres kontrol edildi.", - "SD kart kontrol ediliyor..", - "Kurcalama Kontrol Kodunu Onayla", - "%s yürütülemedi", - "QR Kodu Oluştur", - "Metinden QR kodu oluşturulsun mu?", - "Oluşturuldu:", - "Mevcut Kurcalama Kontrol Kodu", - "Özel QR Kodu", - "Özelleştir", - "Cüzdanınızı özelleştirmek yeni bir Anahtar oluşturacaktır.", - "Kesim Derinliği", - "Kesim Yöntemi", - "Ondalık", - "Şifre çözülsün mü?", - "Varsayılan Cüzdan", - "Geçiş Başına Derinlik", - "BIP85 entropisi türetilsin mi?", - "Tanımlayıcı Adresler", - "Ekran", - "Kapatmayın, tamamlanması biraz zaman alabilir.", - "Tamamlandı mı?", - "Çifte anımsatıcı", - "Sürücü", - "Boş", - "Krux uygulamalarını etkinleştir", - "Şifrelenmiş", - "Şifrelenmiş QR Kodu", - "Şifrelenmiş mnemonic depolanmadı", - "Şifrelenmiş mnemonic ID ile depolandı:", - "Şifreleme", - "Şifreleme Modu", - "%d BIP-39 kelime girin.", - "6+ karakterlik bir Kurcalama Kontrol Kodu girin", - "BIP-39 mnemonic'inizin her kelimesini 1'den 2048'e kadar bir sayı olarak girin.", - "BIP-39 mnemonic'inizin her kelimesini 1'den 800'e kadar onaltılık bir sayı olarak girin.", - "BIP-39 mnemonic'inizin her kelimesini 1'den 4000'e kadar sekizlik bir sayı olarak girin.", - "BIP-39 mnemonic'inizin her kelimesini girin.", - "Kullanıcı Verilerini Sil", - "Kullanıcının verileri siliniyor..", - "Hata:", - "Çıkış", - "İmzalı bir Krux uygulaması çalıştırılsın mı?", - "Dosyaları ara?", - "SD karta aktarılıyor..", - "Genişletilmiş Public Key", - "Fabrika Ayarları", - "Şifre çözme başarısız", - "PSBT yükleme başarısız", - "Adres yükleme başarısız", - "Anahtar yükleme başarısız", - "Mesaj yükleme başarısız", - "Mnemonic yükleme başarısız", - "Çıktı tanımlayıcısı yüklemesi başarısız", - "Parola yükleme başarısız", - "Mnemonic depolama başarısız", - "Ücret:", - "Besleme Hızı", - "Dosya adı", - "%s dosya adı SD kartta var, üzerine yazılsın mı?", - "Flash'ı kameradan gelen entropi ile doldur?", - "Flash Dolduruluyor", - "PSBT'de parmak izi ayarı kaldırıldı", - "Donanım yazılımı maksimum boyutu aşıyor: %d", - "Flash Haritası", - "Flash Araçları", - "Flash kamera entropisi ile dolduruldu", - "X Koordinatları Tersine Çevrildi", - "Flute Çapı", - "Boş:", - "Depolamadan Seç", - "Verilerin geri kullanılamaz olduğundan emin olmak için SD kartınızı başka bir cihazda tamamen silin", - "Mnemonic Oluştur", - "Bu mnemonic'e özel bir ID verilsin mi? Aksi takdirde mevcut parmak izi kullanılacaktır", - "Seç", - "Yeterli entropi", - "Donanım", - "Hex Public Key", - "Onaltılık", - "Mnemonic'leri Gizle", - "Yüksek ücret!", - "ID zaten var", - "Dizin", - "Dizin: %s", - "Girişler (%d):", - "Yükle?", - "Yetersiz Entropi!", - "Yetersiz entropi", - "Geçersiz Kurcalama Kontrol Kodu", - "Geçersiz adres", - "Geçersiz önyükleyici", - "Geçersiz mnemonic uzunluğu", - "Geçersiz public key", - "Geçersiz cüzdan:", - "Ters Çevir", - "Ters Renkler", - "Anahtar", - "Anahtar sağlanmadı", - "Krux Yazıcı Test QR'ı", - "LCD Tipi", - "Dil", - "Krux'un geçerli bir son kelime seçmesini istiyorsanız boş bırakın", - "Sol", - "Uzunluk: %s", - "Satır Gecikmesi", - "Satır:", - "Krux uygulamasını yükle", - "Mnemonic Yükle", - "Cüzdan Yükle", - "Adresleri görüntülemek için güvenilir bir cüzdan tanımlayıcısı yüklensin mi?", - "SD karttan yükle", - "SD karttan yüklensin mi?", - "Kameradan yükle", - "Bir tane mi yüklensin?", - "Yüklensin mi?", - "Kamera Yükleniyor..", - "Para üstü adresler yükleniyor..", - "Yazıcı yükleniyor..", - "Alım adresler yükleniyor..", - "Yükleniyor..", - "Yerel", - "Konum", - "Maksimum uzunluk aşıldı (%s)", - "Mesaj", - "Mesaj:", - "İmza dosyası eksik", - "Mnemonic", - "Mnemonic ID", - "Mnemonik ve parola tutulacaktır.", - "Mnemonic şifrelenmedi", - "Değiştirildi:", - "Çoklu imza", - "Yerel Segwit - 84 varsayılacaktır", - "Ağ", - "Yeni Mnemonic", - "Yeni donanım yazılımı tespit edildi.", - "Hayır", - "Parola Yok", - "Yeterli zar atışı yok!", - "Numaralar", - "Sekizlik", - "Diğer Formatlar", - "PBKDF2 Yinelemesi", - "İşaretlenmiş noktaları siyaha boyayın ki tespit edilebilsinler.", - "Kağıt Genişliği", - "Parça", - "Parça Boyutu", - "Parola", - "Parola Uzunluğu", - "Yol uyuşmazlığı", - "Örüntü algılandı!", - "Tüm depolanmış ve şifrelenmiş mnemonic'ler ve ayarlar flash'tan kalıcı olarak kaldırılsın mı?", - "Kalıcı Depolama", - "Piksel sapma indeksi:", - "Düz Metin QR'ı", - "Lütfen bir cüzdan çıktı tanımlayıcısı yükleyin", - "Dalış Hızı", - "Düşük entropi", - "Düşük entropi tespit edildi!", - "Test QR'ını Yazdır", - "Tiny Seed Yazdırılsın mı?", - "QR'a Yazdır", - "QR'a yazdırılsın mı?", - "Yazdırılsın mı?", - "Yazıcı", - "Yazıcı Sürücüsü ayarlanmadı!", - "Yazdırılıyor..", - "Yine de devam edilsin mi?", - "Devam edilsin mi?", - "İşleniyor..", - "QR Kodu", - "RX Pini", - "Yeniden Başlat", - "Al", - "Adresleri Al", - "Bölge:", - "%s kaldırılsın mı?", - "Mnemonic'i Kaldır", - "SD Karttan donanım yazılımı dosyaları kaldırılsın mı?", - "Çözünürlüğü Sıfırla", - "Fabrika ayarlarına geri dönüp ve yeniden başlatılsın mı?", - "QR Görüntüleyiciye Dön", - "Taranan verileri gözden geçirin, gerekirse düzenleyin", - "Sağ", - "Bir mnemonic oluşturmak için zarı en az %d kez atın.", - "Zar atış dağılımı:", - "Zar atışları:", - "SD kart", - "SD kart algılanmadı.", - "Zar atışlarının SHA256'sı:", - "Snapshot'ın SHA256'sı:", - "QR Görüntüsünü SD Karta Kaydet", - "SD karta kaydet", - "SD karta kaydedilsin mi?", - "SD karta kaydedildi", - "Ölçek", - "Adresi Tara", - "BIP39 Parolasını Tara", - "Anahtar QR Kodunu Tara", - "1-12 kelimeleri tekrar taranıyor", - "13-24 kelimeleri taranıyor", - "Ekran Koruyucu Süresi", - "Betik Türü", - "Güvenlik", - "Kendine-transfer veya Para Üstü (%d):", - "Kendine-transfer:", - "Önce bir kurcalama kontrol kodu ayarlayın", - "Ayarlar", - "Ayarlar dahili olarak flaşta saklanır.", - "Ayarlar SD karta kaydedildi.", - "Shannon Entropisi:", - "Kapat", - "Kapanma Süresi", - "Kapatılıyor..", - "İmzala", - "QR koduna imzala", - "SD karta imzala", - "İmzalansın mı?", - "İmza", - "İmzalı Mesaj", - "İmzalı PSBT", - "İmzalanıyor..", - "Tek-imza", - "Boyut:", - "Bazı kontroller yerine getirilemedi.", - "Harcama (%d):", - "Harcama:", - "İnekler İçin İstatistikler", - "Flash'ta Sakla", - "SD Kartta Sakla", - "Modu değiştirmek için kaydırın", - "TC Flash Hash", - "Önyüklemede TC Flash Hash", - "Yakalamak için DOKUN veya GİR", - "TX Pini", - "Kurcalama Kontrol Kodu", - "Kurcalama kontrol kodu başarıyla ayarlandı", - "Kurcalama kontrol kodları eşleşmiyor", - "Metin", - "Tema", - "Termal", - "Verilerin geri kullanılamaz olduğundan emin olmak için Cihazı Sil özelliğini kullanın", - "Parlaklığı Değiştir", - "Araçlar", - "Dokunma Eşiği", - "Dokunmatik ekran", - "Daha fazla kez denensin mi?", - "BIP39 parolasını yazın", - "Anahtar Yaz", - "Birim", - "Güncelleme tamamlandı.", - "Siyah bir arka plan yüzeyi kullanın.", - "Yeni bir mnemonic oluşturmak için kameranın entropisini kullanın", - "Kullanılan:", - "Kullanıcı", - "%s değeri aralık dışında: [%s, %s]", - "Değer %s'nin katı olmalıdır", - "Doğrulanıyor..", - "Sürüm", - "Kamera Aracılığıyla", - "D20 Aracılığıyla", - "D6 Aracılığıyla", - "Manuel Giriş Aracılığıyla", - "Sözcüklerle", - "Yakalamanın tamamlanmasını bekleyin", - "Cüzdan", - "Cüzdan Tanımlayıcısı", - "Cüzdan çıktı tanımlayıcısı", - "Cüzdan çıktı tanımlayıcısı yüklendi!", - "Cüzdan çıktı tanımlayıcısı bulunamadı.", - "Uyarı:", - "Kelime %d", - "Kelime Numaraları", - "Kelimeler", - "Evet", - "geçerli bir adres!", - "ilk %d adreste BULUNAMADI", -] +translation_array = ["tutarın %'si.", '%d / %d çoklu imza', '%d to %d', '%s kaldırıldı.', '(toplam %d)', '(Deneysel)', '(sadece izle)', '12 kelime', '24 kelime', 'Hakkında', 'Varsayım kabul edilsin mi?', 'Hesap', '#0 numaralı hesap varsayılacaktır', 'Hesap Endeksi', 'Cüzdan parolası eklensin mi veya değiştirilsin mi?', 'AES-CBC modu için kameradan ek entropi gereklidir', 'Adres', "Kamerayı ve yedek plakay'ı düzgün bir şekilde hizalayın.", 'Önce ayarlarda izin ver!', 'Parlama önleyici devre dışı', 'Parlama önleyici etkin', 'Görünüm', 'Emin misiniz?', 'BGR Renkleri', 'BIP39 Anımsatıcı', 'Geri', 'Menüye Dön', 'Yedek Mnemonic', 'Geçersiz imza', 'Base64 Parola', 'Baud Hızı', 'İkili Izgara', 'Kenarlık Dolgusu', 'Parlaklık', 'Butonlar', 'Buton Geri-sekmesi', 'Yakalama iptal edildi', 'Para Üstü', 'Para Üstü Adresleri', 'Temayı değiştir ve yeniden başlat?', 'Para Üstü:', 'Değişiklikler kapanışa kadar devam edecek.', 'SD Kartı Kontrol Et', 'Bu adresin, bu cüzdana ait olduğunu kontrol et?', 'Eşleşmeyen %d adres kontrol edildi.', 'SD kart kontrol ediliyor..', 'Kurcalama Kontrol Kodunu Onayla', 'QR Kodu Oluştur', 'Metinden QR kodu oluşturulsun mu?', 'Oluşturuldu:', 'Mevcut Kurcalama Kontrol Kodu', 'Özel QR Kodu', 'Özelleştir', 'Cüzdanınızı özelleştirmek yeni bir Anahtar oluşturacaktır.', 'Kesim Derinliği', 'Kesim Yöntemi', 'Ondalık', 'Şifre çözülsün mü?', 'Varsayılan Cüzdan', 'Geçiş Başına Derinlik', 'BIP85 entropisi türetilsin mi?', 'Tanımlayıcı Adresler', 'Ekran', 'Kapatmayın, tamamlanması biraz zaman alabilir.', 'Tamamlandı mı?', 'Çifte anımsatıcı', 'Sürücü', 'Boş', 'Krux uygulamalarını etkinleştir', 'Şifrelenmiş', 'Şifrelenmiş QR Kodu', 'Şifrelenmiş mnemonic depolanmadı', 'Şifrelenmiş mnemonic ID ile depolandı:', 'Şifreleme', 'Şifreleme Modu', '%d BIP-39 kelime girin.', '6+ karakterlik bir Kurcalama Kontrol Kodu girin', "BIP-39 mnemonic'inizin her kelimesini 1'den 2048'e kadar bir sayı olarak girin.", "BIP-39 mnemonic'inizin her kelimesini 1'den 800'e kadar onaltılık bir sayı olarak girin.", "BIP-39 mnemonic'inizin her kelimesini 1'den 4000'e kadar sekizlik bir sayı olarak girin.", "BIP-39 mnemonic'inizin her kelimesini girin.", 'Kullanıcı Verilerini Sil', 'Kullanıcının verileri siliniyor..', 'Hata:', 'Çıkış', 'İmzalı bir Krux uygulaması çalıştırılsın mı?', 'Dosyaları ara?', 'SD karta aktarılıyor..', 'Genişletilmiş Public Key', 'Fabrika Ayarları', 'Şifre çözme başarısız', 'PSBT yükleme başarısız', 'Adres yükleme başarısız', 'Anahtar yükleme başarısız', 'Mesaj yükleme başarısız', 'Mnemonic yükleme başarısız', 'Çıktı tanımlayıcısı yüklemesi başarısız', 'Parola yükleme başarısız', 'Mnemonic depolama başarısız', 'Ücret:', 'Besleme Hızı', 'Dosya adı', '%s dosya adı SD kartta var, üzerine yazılsın mı?', "Flash'ı kameradan gelen entropi ile doldur?", 'Flash Dolduruluyor', "PSBT'de parmak izi ayarı kaldırıldı", 'Donanım yazılımı maksimum boyutu aşıyor: %d', 'Flash Haritası', 'Flash Araçları', 'Flash kamera entropisi ile dolduruldu', 'X Koordinatları Tersine Çevrildi', 'Flute Çapı', 'Boş:', 'Depolamadan Seç', 'Verilerin geri kullanılamaz olduğundan emin olmak için SD kartınızı başka bir cihazda tamamen silin', 'Mnemonic Oluştur', "Bu mnemonic'e özel bir ID verilsin mi? Aksi takdirde mevcut parmak izi kullanılacaktır", 'Seç', 'Yeterli entropi', 'Donanım', 'Hex Public Key', 'Onaltılık', "Mnemonic'leri Gizle", 'Yüksek ücret!', 'ID zaten var', 'Dizin', 'Dizin: %s', 'Girişler (%d):', 'Yükle?', 'Yetersiz Entropi!', 'Yetersiz entropi', 'Geçersiz Kurcalama Kontrol Kodu', 'Geçersiz adres', 'Geçersiz önyükleyici', 'Geçersiz mnemonic uzunluğu', 'Geçersiz public key', 'Geçersiz cüzdan:', 'Ters Çevir', 'Ters Renkler', 'Anahtar', 'Anahtar sağlanmadı', "Krux Yazıcı Test QR'ı", 'LCD Tipi', 'Dil', "Krux'un geçerli bir son kelime seçmesini istiyorsanız boş bırakın", 'Sol', 'Uzunluk: %s', 'Satır Gecikmesi', 'Satır:', 'Krux uygulamasını yükle', 'Mnemonic Yükle', 'Cüzdan Yükle', 'Adresleri görüntülemek için güvenilir bir cüzdan tanımlayıcısı yüklensin mi?', 'SD karttan yükle', 'SD karttan yüklensin mi?', 'Kameradan yükle', 'Bir tane mi yüklensin?', 'Yüklensin mi?', 'Kamera Yükleniyor..', 'Para üstü adresler yükleniyor..', 'Yazıcı yükleniyor..', 'Alım adresler yükleniyor..', 'Yükleniyor..', 'Yerel', 'Konum', 'Maksimum uzunluk aşıldı (%s)', 'Mesaj', 'Mesaj:', 'İmza dosyası eksik', 'Mnemonic', 'Mnemonic ID', 'Mnemonik ve parola tutulacaktır.', 'Mnemonic şifrelenmedi', 'Değiştirildi:', 'Çoklu imza', 'Yerel Segwit - 84 varsayılacaktır', 'Ağ', 'Yeni Mnemonic', 'Yeni donanım yazılımı tespit edildi.', 'Hayır', 'Parola Yok', 'Yeterli zar atışı yok!', 'Numaralar', 'Sekizlik', 'Diğer Formatlar', 'PBKDF2 Yinelemesi', 'İşaretlenmiş noktaları siyaha boyayın ki tespit edilebilsinler.', 'Kağıt Genişliği', 'Parça', 'Parça Boyutu', 'Parola', 'Parola Uzunluğu', 'Yol uyuşmazlığı', 'Örüntü algılandı!', "Tüm depolanmış ve şifrelenmiş mnemonic'ler ve ayarlar flash'tan kalıcı olarak kaldırılsın mı?", 'Kalıcı Depolama', 'Piksel sapma indeksi:', "Düz Metin QR'ı", 'Lütfen bir cüzdan çıktı tanımlayıcısı yükleyin', 'Dalış Hızı', 'Düşük entropi', 'Düşük entropi tespit edildi!', "Test QR'ını Yazdır", 'Tiny Seed Yazdırılsın mı?', "QR'a Yazdır", "QR'a yazdırılsın mı?", 'Yazdırılsın mı?', 'Yazıcı', 'Yazıcı Sürücüsü ayarlanmadı!', 'Yazdırılıyor..', 'Yine de devam edilsin mi?', 'Devam edilsin mi?', 'İşleniyor..', 'QR Kodu', 'RX Pini', 'Yeniden Başlat', 'Al', 'Adresleri Al', 'Bölge:', '%s kaldırılsın mı?', "Mnemonic'i Kaldır", 'SD Karttan donanım yazılımı dosyaları kaldırılsın mı?', 'Çözünürlüğü Sıfırla', 'Fabrika ayarlarına geri dönüp ve yeniden başlatılsın mı?', 'QR Görüntüleyiciye Dön', 'Taranan verileri gözden geçirin, gerekirse düzenleyin', 'Sağ', 'Bir mnemonic oluşturmak için zarı en az %d kez atın.', 'Zar atış dağılımı:', 'Zar atışları:', 'SD kart', 'SD kart algılanmadı.', "Zar atışlarının SHA256'sı:", "Snapshot'ın SHA256'sı:", 'QR Görüntüsünü SD Karta Kaydet', 'SD karta kaydet', 'SD karta kaydedilsin mi?', 'SD karta kaydedildi', 'Ölçek', 'Adresi Tara', 'BIP39 Parolasını Tara', 'Anahtar QR Kodunu Tara', '1-12 kelimeleri tekrar taranıyor', '13-24 kelimeleri taranıyor', 'Ekran Koruyucu Süresi', 'Betik Türü', 'Güvenlik', 'Kendine-transfer veya Para Üstü (%d):', 'Kendine-transfer:', 'Önce bir kurcalama kontrol kodu ayarlayın', 'Ayarlar', 'Ayarlar dahili olarak flaşta saklanır.', 'Ayarlar SD karta kaydedildi.', 'Shannon Entropisi:', 'Kapat', 'Kapanma Süresi', 'Kapatılıyor..', 'İmzala', 'QR koduna imzala', 'SD karta imzala', 'İmzalansın mı?', 'İmza', 'İmzalı Mesaj', 'İmzalı PSBT', 'İmzalanıyor..', 'Tek-imza', 'Boyut:', 'Bazı kontroller yerine getirilemedi.', 'Harcama (%d):', 'Harcama:', 'İnekler İçin İstatistikler', "Flash'ta Sakla", 'SD Kartta Sakla', 'Modu değiştirmek için kaydırın', 'TC Flash Hash', 'Önyüklemede TC Flash Hash', 'Yakalamak için DOKUN veya GİR', 'TX Pini', 'Kurcalama Kontrol Kodu', 'Kurcalama kontrol kodu başarıyla ayarlandı', 'Kurcalama kontrol kodları eşleşmiyor', 'Metin', "The app will be copied to user's flash ", 'Tema', 'Termal', 'Verilerin geri kullanılamaz olduğundan emin olmak için Cihazı Sil özelliğini kullanın', 'Parlaklığı Değiştir', 'Araçlar', 'Dokunma Eşiği', 'Dokunmatik ekran', 'Daha fazla kez denensin mi?', 'BIP39 parolasını yazın', 'Anahtar Yaz', 'Birim', 'Güncelleme tamamlandı.', 'Siyah bir arka plan yüzeyi kullanın.', 'Yeni bir mnemonic oluşturmak için kameranın entropisini kullanın', 'Kullanılan:', 'Kullanıcı', '%s değeri aralık dışında: [%s, %s]', "Değer %s'nin katı olmalıdır", 'Doğrulanıyor..', 'Sürüm', 'Kamera Aracılığıyla', 'D20 Aracılığıyla', 'D6 Aracılığıyla', 'Manuel Giriş Aracılığıyla', 'Sözcüklerle', 'Yakalamanın tamamlanmasını bekleyin', 'Cüzdan', 'Cüzdan Tanımlayıcısı', 'Cüzdan çıktı tanımlayıcısı', 'Cüzdan çıktı tanımlayıcısı yüklendi!', 'Cüzdan çıktı tanımlayıcısı bulunamadı.', 'Uyarı:', 'Kelime %d', 'Kelime Numaraları', 'Kelimeler', 'Evet', 'geçerli bir adres!', 'ilk %d adreste BULUNAMADI'] diff --git a/src/krux/translations/vi.py b/src/krux/translations/vi.py index e4a4d1710..9ab9d6cad 100644 --- a/src/krux/translations/vi.py +++ b/src/krux/translations/vi.py @@ -20,326 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = [ - "% của số tiền.", - "%d của %d đa chữ kí", - "%d đến %d", - "%s Đã bỏ.", - "(tổng cộng %d)", - "(Thực nghiệm)", - "(chỉ xem)", - "12 từ", - "24 từ", - "Về chúng tôi", - "Chấp nhận giả định?", - "Tài khoản", - "Tài khoản #0 sẽ được giả định", - "Chỉ mục tài khoản", - "Thêm hoặc thay đổi cụm mật khẩu ví?", - "Cần thêm entropy từ camera cho chế độ AES-CBC", - "Địa chỉ", - "Căn chỉnh camera và tấm dự phòng đúng cách.", - "Cho phép cài đặt trước!", - "Chống lóa bị vô hiệu hóa", - "Đã bật chống lóa", - "Giao diện", - "Bạn có chắc không?", - "Màu BGR", - "Từ gợi nhớ BIP39", - "Trở lại", - "Quay lại Menu", - "Sao lưu Mnemonic", - "Chữ ký xấu", - "Mật khẩu Base64", - "Tốc độ baud", - "Lưới nhị phân", - "Đệm viền", - "Độ sáng", - "Nút", - "Loại bỏ nhiễu nút", - "Hủy chụp hình", - "Thay đổi", - "Các địa chỉ tiền thối", - "Thay đổi giao diện và khởi động lại?", - "Thay đổi:", - "Thay đổi sẽ kéo dài cho đến khi tắt máy.", - "Kiểm tra thẻ SD", - "Kiểm tra địa chỉ đó có thuộc về ví này không?", - "Đã kiểm tra %d địa chỉ không khớp.", - "Kiểm tra thẻ SD..", - "Xác nhận mã kiểm tra giả mạo", - "Không thể thực thi %s", - "Tạo mã QR", - "Tạo mã QR từ văn bản?", - "Tạo:", - "Mã kiểm tra giả mạo hiện tại", - "Mã QR tùy chỉnh", - "Tùy chỉnh", - "Tùy chỉnh ví của bạn sẽ tạo một Khóa mới.", - "Chiều sâu cắt", - "Phương pháp cắt", - "Số thập phân", - "Giải mã?", - "Ví mặc định", - "Độ sâu mỗi lần cắt CNC", - "Suy ra entropy BIP85?", - "Địa chỉ người mô tả", - "Hiển thị", - "Không được tắt máy, có thể mất một lúc để hoàn thành.", - "Hoàn tất?", - "Từ gợi nhớ kép", - "Driver", - "Trống", - "Bật ứng dụng Krux", - "Đã mã hóa", - "Mã QR được mã hóa", - "Mnemonic được mã hóa không được lưu trữ", - "Mnemonic được mã hóa không được lưu trữ với ID:", - "Mã hóa", - "Chế độ mã hóa", - "Nhập %d từ BIP-39.", - "Nhập mã kiểm tra giả mạo gồm hơn 6 ký tự", - "Nhập từng từ của Mnemonic BIP-39 của bạn dưới dạng số từ 1 đến 2048.", - "Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số thập lục phân từ 1 đến 800.", - "Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số bát phân từ 1 đến 4000.", - "Nhập từng từ của Mnemonic BIP-39 của bạn.", - "Xóa dữ liệu của người dùng", - "Đang xóa dữ liệu của người dùng..", - "Lỗi:", - "Esc", - "Thực thi một ứng dụng Krux đã ký?", - "Khám phá các tập tin?", - "Xuất vào thẻ SD ..", - "Khóa công cộng", - "Cài đặt Gốc", - "Không giải mã được", - "Tải PSBT thất bại", - "Tải địa chỉ thất bại", - "Không tải được khóa", - "Không tải được tin nhắn", - "Tải mã Mnemonic thất bại", - "Không tải được bộ mô tả đầu ra", - "Không tải được cụm mật khẩu", - "Không lưu trữ Mnemonic được", - "Phí:", - "Tốc độ cắt CNC", - "Tên tệp", - "Tên tệp %s tồn tại trên thẻ SD, ghi đè lên?", - "Điền vào flash với entropy từ máy ảnh?", - "Đèn Flash Đổ Đầy", - "Bỏ dấu vân tay trong PSBT", - "Phần mềm vượt quá kích thước tối đa: %d", - "Bản đồ Flash", - "Công cụ Flash", - "Đèn flash chứa đầy entropy của máy ảnh", - "Tọa độ X bị lật", - "Đường kính mũi cắt CNC", - "Khả dụng:", - "Từ bộ lưu trữ", - "Xóa hoàn toàn thẻ SD trong một thiết bị khác để đảm bảo dữ liệu không thể phục hồi", - "Tạo Mnemonic", - "Cung cấp cho Mnemonic này một ID tùy chỉnh? Nếu không thì fingerprint hiện tại sẽ được sử dụng", - "Chọn", - "Entropy tốt", - "Phần cứng", - "Khóa công cộng Hex", - "Thập lục phân", - "Ẩn Mnemonics", - "Phí cao!", - "Id đã tồn tại", - "Chỉ mục", - "Chỉ mục: %s", - "Đầu vào (%d):", - "Cài đặt phần mềm?", - "Entropy không đủ!", - "Không đủ entropy", - "Mã kiểm tra giả mạo không hợp lệ", - "Địa chỉ không hợp lệ", - "Bộ tải khởi động không hợp lệ", - "Độ dài mã Mnemonic không hợp lệ", - "Khóa công cộng không hợp lệ", - "Ví không hợp lệ:", - "Đảo ngược", - "Màu đảo ngược", - "Chìa khóa", - "Khóa không được cung cấp", - "QR kiểm tra máy in Krux", - "Loại LCD", - "Ngôn ngữ", - "Để trống nếu bạn muốn Krux chọn một từ cuối cùng hợp lệ", - "Trái", - "Độ dài: %s", - "Độ trễ Dòng", - "Đường kẻ:", - "Tải ứng dụng Krux", - "Tải mã mnemonic", - "Nạp Ví", - "Tải mô tả ví đáng tin cậy để xem địa chỉ?", - "Tải từ thẻ SD", - "Tải từ thẻ SD?", - "Tải từ máy ảnh", - "Tải một?", - "Tải?", - "Đang tải máy ảnh..", - "Đang tải địa chỉ tiền thối..", - "Đang tải máy in ..", - "Đang tải địa chỉ nhận..", - "Đang tải..", - "Ngôn ngữ", - "Vị trí lưu", - "Chiều dài tối đa vượt quá (%s)", - "Tin nhắn", - "Tin nhắn:", - "Thiếu tập tin chữ ký", - "Mã mnemonic", - "Mnemonic ID ", - "Từ gợi nhớ và cụm mật khẩu sẽ được lưu giữ.", - "Mnemonic không được mã hóa", - "Đã sửa đổi:", - "Đa chữ kí", - "Native Segwit - 84 sẽ được giả định", - "Mạng lưới", - "Mnemonic mới", - "Phát hiện phần sụn mới.", - "Không", - "Không có cụm mật khẩu", - "Không đủ số lần quay!", - "Số", - "Bát phân", - "Các định dạng khác", - "Lặp lại PBKDF2", - "Tô các chấm đục lỗ màu đen để chúng có thể được phát hiện.", - "Chiều rộng giấy", - "Phần", - "Kích thước một phần", - "Cụm mật khẩu", - "Độ dài mật khẩu tối thiểu:", - "Đường dẫn không khớp", - "Đã phát hiện mẫu!", - "Xóa vĩnh viễn mọi Mnemonics và cài đặt được mã hóa lưu trữ trong flash?", - "Vị trí lưu", - "Chỉ số độ lệch điểm ảnh:", - "QR dạng văn bản", - "Vui lòng tải bộ mô tả đầu ra ví", - "Tỷ lệ sụt giảm", - "Entropy kém", - "Phát hiện entropy yếu!", - "In kiểm tra QR", - "In Tiny Seed?", - "In ra QR", - "In ra mã QR?", - "In?", - "Máy in", - "Trình điều khiển máy in chưa được cài đặt!", - "Đang in..", - "Vẫn tiếp tục?", - "Thực hiện?", - "Đang xử lý..", - "Mã QR", - "RX Pin", - "Khởi động lại", - "Nhận được", - "Các địa chỉ nhận", - "Vùng:", - "Xóa %s?", - "Xóa Mnemonic", - "Xóa các tệp firmware khỏi Thẻ SD?", - "Độ phân giải - Định dạng", - "Khôi phục cài đặt gốc và khởi động lại?", - "Quay lại Trình xem QR", - "Xem lại dữ liệu đã quét, chỉnh sửa nếu cần", - "Phải", - "Lăn xúc xắc ít nhất %d lần để tạo Mnemonic.", - "Phân bổ xúc xắc:", - "Tổng số lần quay xúc xắc:", - "Thẻ SD", - "Thẻ SD không được phát hiện.", - "SHA256 của xúc xắc:", - "Sha256 của ảnh chụp:", - "Lưu Ảnh QR vào Thẻ SD", - "Lưu vào thẻ SD", - "Lưu vào thẻ SD?", - "Đã lưu vào thẻ SD", - "Tỉ lệ", - "Quét địa chỉ", - "Quét cụm mật khẩu BIP39", - "Quét mã QR khóa", - "Đang quét lại từ 1-12", - "Đang quét từ 13-24", - "Thời gian chế độ bảo vệ màn hình", - "Kiểu văn lệnh", - "Bảo mật", - "Tự chuyển nhượng hoặc giao dịch (%d):", - "Tự chuyển nhượng:", - "Đặt mã kiểm tra giả mạo trước", - "Cài đặt", - "Cài đặt được lưu trữ nội bộ trên đèn flash.", - "Cài đặt được lưu trên thẻ SD.", - "Entropy của Shannon:", - "Tắt máy", - "Thời gian tắt máy", - "Đang tắt..", - "Chữ kí", - "Ký vào mã QR", - "Ký vào thẻ SD", - "Kí?", - "Chữ ký", - "Tin nhắn đã ký", - "Đã ký PSBT", - "Đang ký..", - "Khóa đơn", - "Dung lượng:", - "Một số kiểm tra không thể được thực hiện.", - "Chi tiêu (%d):", - "Chi tiêu:", - "Số liệu thống kê cho Mọt sách", - "Lưu trữ trên flash", - "Lưu trữ trên thẻ SD", - "Vuốt để thay đổi chế độ", - "TC Flash Hash", - "Hash Flash TC khi khởi động", - "Chạm màn hình hoặc nhấn nút ENTER để chụp", - "TX Pin", - "Mã kiểm tra giả mạo", - "Đã đặt mã kiểm tra giả mạo thành công", - "Mã kiểm tra giả mạo không khớp", - "Chữ", - "Chủ đề", - "Nhiệt", - "Sử dụng tính năng Xóa dữ liệu trên thiết bị để đảm bảo dữ liệu không thể phục hồi", - "Chuyển đổi độ sáng", - "Công cụ", - "Ngưỡng cảm ứng", - "Màn hình cảm ứng", - "Thử thêm nữa?", - "Nhập cụm mật khẩu BIP39", - "Nhập khóa", - "Đơn vị", - "Nâng cấp hoàn tất.", - "Sử dụng bề mặt nền đen.", - "Sử dụng sự ngẫu nhiên của máy ảnh để tạo ra một Mnemonic mới", - "Đã sử dụng:", - "Người dùng", - "Giá trị %s ngoài phạm vi: [ %s, %s]", - "Giá trị phải là bội của %s", - "Đang xác minh..", - "Phiên Bản", - "Qua máy ảnh", - "Qua xúc xắc 20 mặt", - "Qua xúc xắc 6 mặt", - "Thông qua đầu vào thủ công", - "Thông qua từ ngữ", - "Chờ bắt", - "Ví", - "Trình mô tả ví", - "Ví đầu ra mô tả", - "Đã tải bộ mô tả đầu ra của ví!", - "Không tìm thấy bộ mô tả đầu ra ví.", - "Cảnh báo:", - "Kí tự %d", - "Từ số", - "Từ ngữ", - "Đúng", - "là một địa chỉ hợp lệ!", - "kHÔNG TÌM THẤY trong %d địa chỉ đầu tiên", -] +translation_array = ['% của số tiền.', '%d của %d đa chữ kí', '%d đến %d', '%s Đã bỏ.', '(tổng cộng %d)', '(Thực nghiệm)', '(chỉ xem)', '12 từ', '24 từ', 'Về chúng tôi', 'Chấp nhận giả định?', 'Tài khoản', 'Tài khoản #0 sẽ được giả định', 'Chỉ mục tài khoản', 'Thêm hoặc thay đổi cụm mật khẩu ví?', 'Cần thêm entropy từ camera cho chế độ AES-CBC', 'Địa chỉ', 'Căn chỉnh camera và tấm dự phòng đúng cách.', 'Cho phép cài đặt trước!', 'Chống lóa bị vô hiệu hóa', 'Đã bật chống lóa', 'Giao diện', 'Bạn có chắc không?', 'Màu BGR', 'Từ gợi nhớ BIP39', 'Trở lại', 'Quay lại Menu', 'Sao lưu Mnemonic', 'Chữ ký xấu', 'Mật khẩu Base64', 'Tốc độ baud', 'Lưới nhị phân', 'Đệm viền', 'Độ sáng', 'Nút', 'Loại bỏ nhiễu nút', 'Hủy chụp hình', 'Thay đổi', 'Các địa chỉ tiền thối', 'Thay đổi giao diện và khởi động lại?', 'Thay đổi:', 'Thay đổi sẽ kéo dài cho đến khi tắt máy.', 'Kiểm tra thẻ SD', 'Kiểm tra địa chỉ đó có thuộc về ví này không?', 'Đã kiểm tra %d địa chỉ không khớp.', 'Kiểm tra thẻ SD..', 'Xác nhận mã kiểm tra giả mạo', 'Tạo mã QR', 'Tạo mã QR từ văn bản?', 'Tạo:', 'Mã kiểm tra giả mạo hiện tại', 'Mã QR tùy chỉnh', 'Tùy chỉnh', 'Tùy chỉnh ví của bạn sẽ tạo một Khóa mới.', 'Chiều sâu cắt', 'Phương pháp cắt', 'Số thập phân', 'Giải mã?', 'Ví mặc định', 'Độ sâu mỗi lần cắt CNC', 'Suy ra entropy BIP85?', 'Địa chỉ người mô tả', 'Hiển thị', 'Không được tắt máy, có thể mất một lúc để hoàn thành.', 'Hoàn tất?', 'Từ gợi nhớ kép', 'Driver', 'Trống', 'Bật ứng dụng Krux', 'Đã mã hóa', 'Mã QR được mã hóa', 'Mnemonic được mã hóa không được lưu trữ', 'Mnemonic được mã hóa không được lưu trữ với ID:', 'Mã hóa', 'Chế độ mã hóa', 'Nhập %d từ BIP-39.', 'Nhập mã kiểm tra giả mạo gồm hơn 6 ký tự', 'Nhập từng từ của Mnemonic BIP-39 của bạn dưới dạng số từ 1 đến 2048.', 'Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số thập lục phân từ 1 đến 800.', 'Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số bát phân từ 1 đến 4000.', 'Nhập từng từ của Mnemonic BIP-39 của bạn.', 'Xóa dữ liệu của người dùng', 'Đang xóa dữ liệu của người dùng..', 'Lỗi:', 'Esc', 'Thực thi một ứng dụng Krux đã ký?', 'Khám phá các tập tin?', 'Xuất vào thẻ SD ..', 'Khóa công cộng', 'Cài đặt Gốc', 'Không giải mã được', 'Tải PSBT thất bại', 'Tải địa chỉ thất bại', 'Không tải được khóa', 'Không tải được tin nhắn', 'Tải mã Mnemonic thất bại', 'Không tải được bộ mô tả đầu ra', 'Không tải được cụm mật khẩu', 'Không lưu trữ Mnemonic được', 'Phí:', 'Tốc độ cắt CNC', 'Tên tệp', 'Tên tệp %s tồn tại trên thẻ SD, ghi đè lên?', 'Điền vào flash với entropy từ máy ảnh?', 'Đèn Flash Đổ Đầy', 'Bỏ dấu vân tay trong PSBT', 'Phần mềm vượt quá kích thước tối đa: %d', 'Bản đồ Flash', 'Công cụ Flash', 'Đèn flash chứa đầy entropy của máy ảnh', 'Tọa độ X bị lật', 'Đường kính mũi cắt CNC', 'Khả dụng:', 'Từ bộ lưu trữ', 'Xóa hoàn toàn thẻ SD trong một thiết bị khác để đảm bảo dữ liệu không thể phục hồi', 'Tạo Mnemonic', 'Cung cấp cho Mnemonic này một ID tùy chỉnh? Nếu không thì fingerprint hiện tại sẽ được sử dụng', 'Chọn', 'Entropy tốt', 'Phần cứng', 'Khóa công cộng Hex', 'Thập lục phân', 'Ẩn Mnemonics', 'Phí cao!', 'Id đã tồn tại', 'Chỉ mục', 'Chỉ mục: %s', 'Đầu vào (%d):', 'Cài đặt phần mềm?', 'Entropy không đủ!', 'Không đủ entropy', 'Mã kiểm tra giả mạo không hợp lệ', 'Địa chỉ không hợp lệ', 'Bộ tải khởi động không hợp lệ', 'Độ dài mã Mnemonic không hợp lệ', 'Khóa công cộng không hợp lệ', 'Ví không hợp lệ:', 'Đảo ngược', 'Màu đảo ngược', 'Chìa khóa', 'Khóa không được cung cấp', 'QR kiểm tra máy in Krux', 'Loại LCD', 'Ngôn ngữ', 'Để trống nếu bạn muốn Krux chọn một từ cuối cùng hợp lệ', 'Trái', 'Độ dài: %s', 'Độ trễ Dòng', 'Đường kẻ:', 'Tải ứng dụng Krux', 'Tải mã mnemonic', 'Nạp Ví', 'Tải mô tả ví đáng tin cậy để xem địa chỉ?', 'Tải từ thẻ SD', 'Tải từ thẻ SD?', 'Tải từ máy ảnh', 'Tải một?', 'Tải?', 'Đang tải máy ảnh..', 'Đang tải địa chỉ tiền thối..', 'Đang tải máy in ..', 'Đang tải địa chỉ nhận..', 'Đang tải..', 'Ngôn ngữ', 'Vị trí lưu', 'Chiều dài tối đa vượt quá (%s)', 'Tin nhắn', 'Tin nhắn:', 'Thiếu tập tin chữ ký', 'Mã mnemonic', 'Mnemonic ID ', 'Từ gợi nhớ và cụm mật khẩu sẽ được lưu giữ.', 'Mnemonic không được mã hóa', 'Đã sửa đổi:', 'Đa chữ kí', 'Native Segwit - 84 sẽ được giả định', 'Mạng lưới', 'Mnemonic mới', 'Phát hiện phần sụn mới.', 'Không', 'Không có cụm mật khẩu', 'Không đủ số lần quay!', 'Số', 'Bát phân', 'Các định dạng khác', 'Lặp lại PBKDF2', 'Tô các chấm đục lỗ màu đen để chúng có thể được phát hiện.', 'Chiều rộng giấy', 'Phần', 'Kích thước một phần', 'Cụm mật khẩu', 'Độ dài mật khẩu tối thiểu:', 'Đường dẫn không khớp', 'Đã phát hiện mẫu!', 'Xóa vĩnh viễn mọi Mnemonics và cài đặt được mã hóa lưu trữ trong flash?', 'Vị trí lưu', 'Chỉ số độ lệch điểm ảnh:', 'QR dạng văn bản', 'Vui lòng tải bộ mô tả đầu ra ví', 'Tỷ lệ sụt giảm', 'Entropy kém', 'Phát hiện entropy yếu!', 'In kiểm tra QR', 'In Tiny Seed?', 'In ra QR', 'In ra mã QR?', 'In?', 'Máy in', 'Trình điều khiển máy in chưa được cài đặt!', 'Đang in..', 'Vẫn tiếp tục?', 'Thực hiện?', 'Đang xử lý..', 'Mã QR', 'RX Pin', 'Khởi động lại', 'Nhận được', 'Các địa chỉ nhận', 'Vùng:', 'Xóa %s?', 'Xóa Mnemonic', 'Xóa các tệp firmware khỏi Thẻ SD?', 'Độ phân giải - Định dạng', 'Khôi phục cài đặt gốc và khởi động lại?', 'Quay lại Trình xem QR', 'Xem lại dữ liệu đã quét, chỉnh sửa nếu cần', 'Phải', 'Lăn xúc xắc ít nhất %d lần để tạo Mnemonic.', 'Phân bổ xúc xắc:', 'Tổng số lần quay xúc xắc:', 'Thẻ SD', 'Thẻ SD không được phát hiện.', 'SHA256 của xúc xắc:', 'Sha256 của ảnh chụp:', 'Lưu Ảnh QR vào Thẻ SD', 'Lưu vào thẻ SD', 'Lưu vào thẻ SD?', 'Đã lưu vào thẻ SD', 'Tỉ lệ', 'Quét địa chỉ', 'Quét cụm mật khẩu BIP39', 'Quét mã QR khóa', 'Đang quét lại từ 1-12', 'Đang quét từ 13-24', 'Thời gian chế độ bảo vệ màn hình', 'Kiểu văn lệnh', 'Bảo mật', 'Tự chuyển nhượng hoặc giao dịch (%d):', 'Tự chuyển nhượng:', 'Đặt mã kiểm tra giả mạo trước', 'Cài đặt', 'Cài đặt được lưu trữ nội bộ trên đèn flash.', 'Cài đặt được lưu trên thẻ SD.', 'Entropy của Shannon:', 'Tắt máy', 'Thời gian tắt máy', 'Đang tắt..', 'Chữ kí', 'Ký vào mã QR', 'Ký vào thẻ SD', 'Kí?', 'Chữ ký', 'Tin nhắn đã ký', 'Đã ký PSBT', 'Đang ký..', 'Khóa đơn', 'Dung lượng:', 'Một số kiểm tra không thể được thực hiện.', 'Chi tiêu (%d):', 'Chi tiêu:', 'Số liệu thống kê cho Mọt sách', 'Lưu trữ trên flash', 'Lưu trữ trên thẻ SD', 'Vuốt để thay đổi chế độ', 'TC Flash Hash', 'Hash Flash TC khi khởi động', 'Chạm màn hình hoặc nhấn nút ENTER để chụp', 'TX Pin', 'Mã kiểm tra giả mạo', 'Đã đặt mã kiểm tra giả mạo thành công', 'Mã kiểm tra giả mạo không khớp', 'Chữ', "The app will be copied to user's flash ", 'Chủ đề', 'Nhiệt', 'Sử dụng tính năng Xóa dữ liệu trên thiết bị để đảm bảo dữ liệu không thể phục hồi', 'Chuyển đổi độ sáng', 'Công cụ', 'Ngưỡng cảm ứng', 'Màn hình cảm ứng', 'Thử thêm nữa?', 'Nhập cụm mật khẩu BIP39', 'Nhập khóa', 'Đơn vị', 'Nâng cấp hoàn tất.', 'Sử dụng bề mặt nền đen.', 'Sử dụng sự ngẫu nhiên của máy ảnh để tạo ra một Mnemonic mới', 'Đã sử dụng:', 'Người dùng', 'Giá trị %s ngoài phạm vi: [ %s, %s]', 'Giá trị phải là bội của %s', 'Đang xác minh..', 'Phiên Bản', 'Qua máy ảnh', 'Qua xúc xắc 20 mặt', 'Qua xúc xắc 6 mặt', 'Thông qua đầu vào thủ công', 'Thông qua từ ngữ', 'Chờ bắt', 'Ví', 'Trình mô tả ví', 'Ví đầu ra mô tả', 'Đã tải bộ mô tả đầu ra của ví!', 'Không tìm thấy bộ mô tả đầu ra ví.', 'Cảnh báo:', 'Kí tự %d', 'Từ số', 'Từ ngữ', 'Đúng', 'là một địa chỉ hợp lệ!', 'kHÔNG TÌM THẤY trong %d địa chỉ đầu tiên'] diff --git a/src/krux/translations/zh.py b/src/krux/translations/zh.py index be90fefe9..6396160c7 100644 --- a/src/krux/translations/zh.py +++ b/src/krux/translations/zh.py @@ -20,326 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = [ - "% 的金额。", - "%d/%d 多签", - "%d到%d", - "已移除%s", - "(总计 %d)", - "(实验性)", - "(仅观察)", - "12 单词", - "24 单词", - "关于", - "接受假设?", - "账户", - "将假定为账户 #0", - "账户索引", - "添加或更改钱包密码?", - "AES-CBC 模式需要相机的额外熵", - "地址", - "正确对齐摄像头和背板。", - "首先在设置中允许!", - "防眩光已禁用", - "防眩光已启用", - "界面", - "确定?", - "BGR 颜色", - "BIP39助记符", - "返回", - "返回菜单", - "备份助记词", - "签名无效", - "Base64密码", - "波特率", - "二进制网格", - "边框填充", - "亮度", - "按钮", - "按钮去抖动", - "截取已取消", - "找零", - "找零地址", - "更改主题并重新启动?", - "找零", - "更改将在关机前保持。", - "检查 SD 卡", - "检查该地址是否属于此钱包?", - "已检查 %d 个不匹配的地址。", - "检查 SD 卡..", - "确认防篡改检查码", - "无法执行 ", - "创建二维码", - "从文本创建二维码?", - "已创建:", - "当前防篡改检查码", - "自定义二维码", - "自定义", - "自定义您的钱包将生成新私钥。", - "切割深度", - "切割方法", - "十进制", - "解密?", - "默认钱包", - "每次通过的深度", - "导出BIP85熵?", - "描述符地址", - "显示", - "请勿断电,可能需要一段时间完成。", - "完成了吗?", - "双重助记词", - "驱动程序", - "为空", - "启用Krux应用程序", - "已加密", - "加密二维码", - "加密助记词未存储", - "加密助记词已存储,ID 为:", - "加密", - "加密模式", - "输入 %d 个 BIP-39 词。", - "输入6个以上字符的防篡改检查码", - "将 BIP-39 助记词的每个词作为 1 到 2048 的数字输入。", - "将 BIP-39 助记词的每个词作为 1 到 800 的十六进制数输入。", - "将 BIP-39 助记词的每个词作为 1 到 4000 的八进制数输入。", - "输入每个 BIP-39 助记词。", - "清除用户数据", - "正在擦除用户数据..", - "错误:", - "退出", - "是否执行签名的Krux应用程序?", - "浏览文件?", - "导出到 SD 卡..", - "扩展公钥", - "出厂设置", - "解密失败", - "加载 PSBT 失败", - "加载地址失败", - "加载密钥失败", - "加载消息失败", - "加载助记词失败", - "加载输出描述符失败", - "加载密码失败", - "存储助记词失败", - "费用:", - "进给速度", - "文件名", - "文件名 %s 存在于 SD 卡上,覆盖?", - "用摄像头的熵填充Flash?", - "填充Flash", - "PSBT 中未设置指纹", - "固件超过最大尺寸:%d", - "Flash地图", - "Flash工具", - "Flash已用摄像头熵填充", - "翻转 X 坐标", - "刀具直径", - "空闲:", - "从存储中", - "在其他设备中完全擦除您的 SD 卡以确保数据不可恢复", - "生成助记词", - "为此助记词设置自定义 ID?否则将使用当前指纹", - "去", - "良好的熵", - "硬件", - "十六进制公钥", - "十六进制", - "隐藏助记词", - "高费用!", - "ID 已存在", - "索引", - "索引: %s", - "输入 (%d):", - "安装?", - "熵不足!", - "熵不足", - "无效的防篡改检查码", - "无效地址", - "无效的 ootloader ", - "助记词长度无效", - "无效公钥", - "无效钱包:", - "反转", - "反转颜色", - "密钥", - "未提供密钥", - "Krux 打印机测试二维码", - "LCD 类型", - "语言", - "如果希望 Krux 自动计算最后一位 Checksum,请留空", - "左", - "长度: %s", - "行延迟", - "行:", - "加载Krux应用", - "加载助记词", - "加载钱包", - "加载受信任的钱包描述符以查看地址?", - "从 SD 卡加载", - "从 SD 卡加载?", - "从相机加载", - "加载一个?", - "加载?", - "加载相机..", - "加载找零地址..", - "加载打印机..", - "加载接收地址..", - "加载中..", - "语言环境", - "位置", - "超过最大长度(%s)", - "消息", - "消息:", - "缺少签名文件", - "助记词", - "助记词 ID", - "助记词和密码将被保留。", - "助记词未加密", - "修改时间:", - "多签", - "假定为原生 Segwit - 84", - "网络", - "新助记词", - "检测到新固件。", - "否", - "无 Passphrase ", - "投掷次数不足!", - "数字", - "八进制", - "其他格式", - "PBKDF2 迭代", - "将打孔点涂黑,以便它们能被检测到。", - "纸张宽度", - "部分", - "部件尺寸", - "Passphrase", - "密码长度:", - "路径不匹配", - "检测到模式!", - "从 Flash 中永久删除所有存储的加密助记词和设置?", - "保存", - "像素偏差指数:", - "明文二维码", - "请加载钱包输出描述符", - "下刀速度", - "熵值低", - "检测到低熵!", - "打印测试二维码", - "打印 Tiny Seed?", - "打印到二维码", - "打印到二维码?", - "打印?", - "打印机", - "打印机驱动程序未设置!", - "正在打印", - "继续吗?", - "继续?", - "正在处理..", - "二维码", - "RX 引脚", - "重启", - "接收", - "接收地址", - "区域:", - "删除 %s?", - "删除助记词", - "从 SD 卡中删除固件文件?", - "分辨率 - 格式", - "恢复出厂设置并重新设备?", - "返回二维码查看器", - "请检查扫描的数据,如有必要请编辑", - "右", - "掷骰子至少 %d 次以生成助记词。", - "掷骰子分布:", - "掷骰子:", - "SD 卡", - "未检测到 SD 卡。", - "掷骰子的 SHA256:", - "快照的 SHA256:", - "将二维码图像保存到 SD 卡", - "保存到 SD 卡", - "保存到 SD 卡?", - "保存到 SD 卡", - "缩放", - "扫描地址", - "扫描 BIP39 Passphrase", - "扫描私钥二维码", - "重新扫扫描第 1-12 个单词", - "扫描第 13-24 个单词", - "屏保时间", - "脚本类型", - "安全", - "自转或找零 (%d):", - "自行转账:", - "请先设置防篡改检查码", - "设置", - "设置存储在 Flash 内部。", - "设置存储在SD卡上。", - "香农熵:", - "关机", - "关机时间", - "关机中..", - "签名", - "二维码签名", - " SD 卡签名", - "是否签名?", - "签名", - "签名消息", - "已签名 PSBT", - "签名中..", - "单签", - "大小:", - "无法执行某些检查。", - "花费 (%d):", - "花费", - "极客统计数据", - "存储到 Flash", - "存储到 SD 卡", - "滑动切换模式", - "TC Flash Hash", - "启动时的 TC Flash Hash", - "点击或按下 ENTER 截图", - "TX 引脚", - "防篡改检查码", - "防篡改检查码设置成功", - "防篡改检查码不匹配", - "文本", - "主题", - "热敏", - "要确保数据不可恢复,请使用擦除设备功能", - "调整亮度", - "工具", - "触摸阈值", - "触摸屏", - "再次尝试?", - "输入 BIP39 Phrasephrase", - "输入私钥", - "单位", - "升级已完成。", - "使用黑色背景界面。", - "使用摄像头的熵创建新助记词", - "已用:", - "用户数据", - "值 %s 超出范围:[ %s,%s ]", - "值必须是 %s 的倍数", - "验证中..", - "版本", - "通过摄像头", - "通过 D20", - "通过 D6", - "通过手动输入", - "通过单词", - "等待截取", - "钱包", - "钱包描述", - "钱包输出描述符", - "钱包输出描述符加载重复!", - "未找到钱包输出描述符。", - "警告:", - "词 %d", - "单词序号", - "单词", - "是", - " 非有效地址", - "在前 %d 个地址中未找到", -] +translation_array = ['% 的金额。', '%d/%d 多签', '%d到%d', '已移除%s', '(总计 %d)', '(实验性)', '(仅观察)', '12 单词', '24 单词', '关于', '接受假设?', '账户', '将假定为账户 #0', '账户索引', '添加或更改钱包密码?', 'AES-CBC 模式需要相机的额外熵', '地址', '正确对齐摄像头和背板。', '首先在设置中允许!', '防眩光已禁用', '防眩光已启用', '界面', '确定?', 'BGR 颜色', 'BIP39助记符', '返回', '返回菜单', '备份助记词', '签名无效', 'Base64密码', '波特率', '二进制网格', '边框填充', '亮度', '按钮', '按钮去抖动', '截取已取消', '找零', '找零地址', '更改主题并重新启动?', '找零', '更改将在关机前保持。', '检查 SD 卡', '检查该地址是否属于此钱包?', '已检查 %d 个不匹配的地址。', '检查 SD 卡..', '确认防篡改检查码', '创建二维码', '从文本创建二维码?', '已创建:', '当前防篡改检查码', '自定义二维码', '自定义', '自定义您的钱包将生成新私钥。', '切割深度', '切割方法', '十进制', '解密?', '默认钱包', '每次通过的深度', '导出BIP85熵?', '描述符地址', '显示', '请勿断电,可能需要一段时间完成。', '完成了吗?', '双重助记词', '驱动程序', '为空', '启用Krux应用程序', '已加密', '加密二维码', '加密助记词未存储', '加密助记词已存储,ID 为:', '加密', '加密模式', '输入 %d 个 BIP-39 词。', '输入6个以上字符的防篡改检查码', '将 BIP-39 助记词的每个词作为 1 到 2048 的数字输入。', '将 BIP-39 助记词的每个词作为 1 到 800 的十六进制数输入。', '将 BIP-39 助记词的每个词作为 1 到 4000 的八进制数输入。', '输入每个 BIP-39 助记词。', '清除用户数据', '正在擦除用户数据..', '错误:', '退出', '是否执行签名的Krux应用程序?', '浏览文件?', '导出到 SD 卡..', '扩展公钥', '出厂设置', '解密失败', '加载 PSBT 失败', '加载地址失败', '加载密钥失败', '加载消息失败', '加载助记词失败', '加载输出描述符失败', '加载密码失败', '存储助记词失败', '费用:', '进给速度', '文件名', '文件名 %s 存在于 SD 卡上,覆盖?', '用摄像头的熵填充Flash?', '填充Flash', 'PSBT 中未设置指纹', '固件超过最大尺寸:%d', 'Flash地图', 'Flash工具', 'Flash已用摄像头熵填充', '翻转 X 坐标', '刀具直径', '空闲:', '从存储中', '在其他设备中完全擦除您的 SD 卡以确保数据不可恢复', '生成助记词', '为此助记词设置自定义 ID?否则将使用当前指纹', '去', '良好的熵', '硬件', '十六进制公钥', '十六进制', '隐藏助记词', '高费用!', 'ID 已存在', '索引', '索引: %s', '输入 (%d):', '安装?', '熵不足!', '熵不足', '无效的防篡改检查码', '无效地址', '无效的 ootloader ', '助记词长度无效', '无效公钥', '无效钱包:', '反转', '反转颜色', '密钥', '未提供密钥', 'Krux 打印机测试二维码', 'LCD 类型', '语言', '如果希望 Krux 自动计算最后一位 Checksum,请留空', '左', '长度: %s', '行延迟', '行:', '加载Krux应用', '加载助记词', '加载钱包', '加载受信任的钱包描述符以查看地址?', '从 SD 卡加载', '从 SD 卡加载?', '从相机加载', '加载一个?', '加载?', '加载相机..', '加载找零地址..', '加载打印机..', '加载接收地址..', '加载中..', '语言环境', '位置', '超过最大长度(%s)', '消息', '消息:', '缺少签名文件', '助记词', '助记词 ID', '助记词和密码将被保留。', '助记词未加密', '修改时间:', '多签', '假定为原生 Segwit - 84', '网络', '新助记词', '检测到新固件。', '否', '无 Passphrase ', '投掷次数不足!', '数字', '八进制', '其他格式', 'PBKDF2 迭代', '将打孔点涂黑,以便它们能被检测到。', '纸张宽度', '部分', '部件尺寸', 'Passphrase', '密码长度:', '路径不匹配', '检测到模式!', '从 Flash 中永久删除所有存储的加密助记词和设置?', '保存', '像素偏差指数:', '明文二维码', '请加载钱包输出描述符', '下刀速度', '熵值低', '检测到低熵!', '打印测试二维码', '打印 Tiny Seed?', '打印到二维码', '打印到二维码?', '打印?', '打印机', '打印机驱动程序未设置!', '正在打印', '继续吗?', '继续?', '正在处理..', '二维码', 'RX 引脚', '重启', '接收', '接收地址', '区域:', '删除 %s?', '删除助记词', '从 SD 卡中删除固件文件?', '分辨率 - 格式', '恢复出厂设置并重新设备?', '返回二维码查看器', '请检查扫描的数据,如有必要请编辑', '右', '掷骰子至少 %d 次以生成助记词。', '掷骰子分布:', '掷骰子:', 'SD 卡', '未检测到 SD 卡。', '掷骰子的 SHA256:', '快照的 SHA256:', '将二维码图像保存到 SD 卡', '保存到 SD 卡', '保存到 SD 卡?', '保存到 SD 卡', '缩放', '扫描地址', '扫描 BIP39 Passphrase', '扫描私钥二维码', '重新扫扫描第 1-12 个单词', '扫描第 13-24 个单词', '屏保时间', '脚本类型', '安全', '自转或找零 (%d):', '自行转账:', '请先设置防篡改检查码', '设置', '设置存储在 Flash 内部。', '设置存储在SD卡上。', '香农熵:', '关机', '关机时间', '关机中..', '签名', '二维码签名', ' SD 卡签名', '是否签名?', '签名', '签名消息', '已签名 PSBT', '签名中..', '单签', '大小:', '无法执行某些检查。', '花费 (%d):', '花费', '极客统计数据', '存储到 Flash', '存储到 SD 卡', '滑动切换模式', 'TC Flash Hash', '启动时的 TC Flash Hash', '点击或按下 ENTER 截图', 'TX 引脚', '防篡改检查码', '防篡改检查码设置成功', '防篡改检查码不匹配', '文本', "The app will be copied to user's flash ", '主题', '热敏', '要确保数据不可恢复,请使用擦除设备功能', '调整亮度', '工具', '触摸阈值', '触摸屏', '再次尝试?', '输入 BIP39 Phrasephrase', '输入私钥', '单位', '升级已完成。', '使用黑色背景界面。', '使用摄像头的熵创建新助记词', '已用:', '用户数据', '值 %s 超出范围:[ %s,%s ]', '值必须是 %s 的倍数', '验证中..', '版本', '通过摄像头', '通过 D20', '通过 D6', '通过手动输入', '通过单词', '等待截取', '钱包', '钱包描述', '钱包输出描述符', '钱包输出描述符加载重复!', '未找到钱包输出描述符。', '警告:', '词 %d', '单词序号', '单词', '是', ' 非有效地址', '在前 %d 个地址中未找到'] From b2127cb28034f59bb7a34fd5be1f55ccd7ca5c4f Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sun, 8 Dec 2024 01:09:07 -0300 Subject: [PATCH 21/86] simulator small fix --- simulator/kruxsim/mocks/sensor.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/simulator/kruxsim/mocks/sensor.py b/simulator/kruxsim/mocks/sensor.py index cb12a4d88..5b2bf6b4c 100644 --- a/simulator/kruxsim/mocks/sensor.py +++ b/simulator/kruxsim/mocks/sensor.py @@ -88,7 +88,8 @@ def run(on): if on: capturer = VideoCapture(0) else: - capturer.release() + if capturer: + capturer.release() def find_qrcodes(img): From 5d846df3637b1518810e1463f392d6fac7a87043 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sun, 8 Dec 2024 01:13:14 -0300 Subject: [PATCH 22/86] warn user about altering flash --- src/krux/pages/kapps.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/krux/pages/kapps.py b/src/krux/pages/kapps.py index 47de11e9f..b866ce6b9 100644 --- a/src/krux/pages/kapps.py +++ b/src/krux/pages/kapps.py @@ -112,9 +112,13 @@ def load_kapp(self): # pylint: disable=R1710 if not self._check_signature(sig_data, data_hash): return MENU_CONTINUE - - # Warns user about changing users's space flash internal memory - if not self.prompt(t("App needs to be copied to user's "), self.ctx.display.height() // 2): + + # Warns user about changing users's flash internal memory region + self.ctx.display.clear() + if not self.prompt( + t("App will be stored internally on flash.") + "\n\n" + t("Proceed?"), + self.ctx.display.height() // 2, + ): return MENU_CONTINUE # Delete any .mpy files from flash VFS to avoid malicious code import/execution From 559599dd313c4c587a4b81a2ade41d614056471d Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sun, 8 Dec 2024 01:27:04 -0300 Subject: [PATCH 23/86] translations --- src/krux/translations/de.py | 324 +++++++++++++++++++++++++++++++++++- src/krux/translations/es.py | 324 +++++++++++++++++++++++++++++++++++- src/krux/translations/fr.py | 324 +++++++++++++++++++++++++++++++++++- src/krux/translations/ja.py | 324 +++++++++++++++++++++++++++++++++++- src/krux/translations/ko.py | 324 +++++++++++++++++++++++++++++++++++- src/krux/translations/nl.py | 324 +++++++++++++++++++++++++++++++++++- src/krux/translations/pt.py | 324 +++++++++++++++++++++++++++++++++++- src/krux/translations/ru.py | 324 +++++++++++++++++++++++++++++++++++- src/krux/translations/tr.py | 324 +++++++++++++++++++++++++++++++++++- src/krux/translations/vi.py | 324 +++++++++++++++++++++++++++++++++++- src/krux/translations/zh.py | 324 +++++++++++++++++++++++++++++++++++- 11 files changed, 3553 insertions(+), 11 deletions(-) diff --git a/src/krux/translations/de.py b/src/krux/translations/de.py index 8335b5f35..d8918c6c0 100644 --- a/src/krux/translations/de.py +++ b/src/krux/translations/de.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['% des Betrags.', '%d von %d Multisig', '%d bis %d ', '%s wurde entfernt.', '(%d insgesamt)', '(Experimental)', '(nur zur Betrachtung)', '12 Wörter', '24 Wörter', 'Über', 'Annahme akzeptieren?', 'Konto', 'Konto #0 würde angenommen', 'Kontoindex', 'Wallet-Passphrase hinzufügen oder ändern?', 'Zusätzliche Entropie von der Kamera für den AES-CBC-Modus erforderlich', 'Adresse', 'Richte Kamera und Sicherungsplatte richtig aus.', 'Erlaube zuerst Einstellungen!', 'Blendschutz deaktiviert', 'Blendschutz aktiviert', 'Aussehen', 'Bist Du sicher?', 'BGR-Farben', 'BIP39-Mnemonik', 'Zurück', 'Zurück zum Menü', 'Mnemonik-Backup', 'Ungültige Signatur', 'Base64-Passwort', 'Baudrate', 'Binäres Gitter', 'Randpolsterung', 'Helligkeit', 'Tasten', 'Entprellung der Tasten', 'Aufnahme abgebrochen', 'Change Adresse', 'Change Adressen', 'Thema ändern und neu starten?', 'Change:', 'Änderungen bleiben bis zum Herunterfahren bestehen.', 'Prüfe SD-Karte', 'Überprüfen, ob diese Adresse zu dieser Wallet gehört?', 'Überprüfte %d Adresse ohne Übereinstimmungen.', 'Suche nach SD-Karte..', 'Bestätigen Sie den Tamper Check Code', 'Erstelle QR-Code', 'QR-Code aus Text erzeugen?', 'Erstellt:', 'Aktueller Tamper Check Code', 'Benutzerdefinierte QR-Code', 'Anpassen', 'Wenn Sie Ihr Wallet anpassen, wird ein neuer Schlüssel generiert.', 'Schnitttiefe', 'Cut-Methode', 'Dezimal', 'Entschlüsseln?', 'Standard-Wallet', 'Tiefe pro Durchgang', 'BIP85-Entropie ableiten?', 'Deskriptor-Adressen', 'Bildschirm', 'Schalten Sie das Gerät nicht aus, es kann eine Weile dauern.', 'Fertig?', 'Doppelte Gedächtnisstütze', 'Driver', 'Leer', 'Krux-Apps aktivieren', 'Verschlüsselt', 'Verschlüsselter QR-Code', 'Verschlüsselte Mnemonic wurde nicht gespeichert', 'Speicherung der verschlüsselten Mnemonic mit ID:', 'Verschlüsselung', 'Verschlüsselungsmodus', 'Geben Sie %d BIP-39 Wörter ein.', 'Geben Sie einen Tamper Check Code mit 6+ Zeichen ein', 'Gib jedes Wort Deiner BIP-39 Mnemonic als Zahl von 1 bis 2048 ein.', 'Gib jedes Wort Deiner BIP-39 Mnemonic als Hexadezimalzahl von 1 bis 800 ein.', 'Gib jedes Wort Deiner BIP-39 Mnemonic als Oktalzahl von 1 bis 4000 ein.', 'Gib jedes Wort Deiner BIP-39 Mnemonic ein.', 'Benutzerdaten löschen', 'Benutzerdaten werden gelöscht..', 'Fehler:', 'Esc', 'Eine signierte Krux-App ausführen?', 'Dateien durchsuchen?', 'Auf SD-Karte exportieren..', 'Öffentlicher Schlüssel', 'Werkeinstellungen', 'Entschlüsselung fehlgeschlagen', 'PSBT konnte nicht geladen werden', 'Adresse konnte nicht geladen werden', 'Schlüssel konnte nicht geladen werden', 'Nachricht konnte nicht geladen werden', 'Mnemonic konnte nicht geladen werden', 'Ausgabedeskriptor konnte nicht geladen werden', 'Passphrase konnte nicht geladen werden', 'Mnemonic konnte nicht gespeichert werden', 'Gebühr:', 'Vorschubgeschwindigkeit', 'Dateiname', 'Dateiname %s existiert auf SD-Karte, überschreiben?', 'Den Flash mit Entropie von der Kamera füllen?', 'Flash wird gefüllt', 'Fingerabdruck in PSBT deaktiviert', 'Die Firmware übersteigt die maximale Größe: %d', 'Flash-Karte', 'Flash-Tools', 'Flash gefüllt mit Kameraentropie', 'Umgedrehte X-Koordinaten', 'Flötendurchmesser', 'Frei:', 'Vom Speicher', 'Löschen Sie Ihre SD-Karte vollständig in einem anderen Gerät, um sicherzustellen, dass die Daten nicht wiederhergestellt werden können', 'Mnemonik erzeugen', 'Dieser Mnemonic eine benutzerdefinierte ID zuteilen? Andernfalls wird der aktuelle Fingerabdruck verwendet', 'Go', 'Gute Entropie', 'Hardware', 'Hex öffentlicher Schlüssel', 'Hexadezimal', 'Mnemonics ausblenden', 'Hohe Gebühren!', 'ID existiert bereits', 'Index', 'Index: %s', 'Input (%d):', 'Installieren?', 'Unzureichende Entropie!', 'Unzureichende Entropie', 'Ungültiger Tamper Check Code', 'Ungültige Adresse', 'Ungültiger Bootloader', 'Ungültige mnemonische Lange', 'Ungültiger öffentlicher Schlüssel', 'Ungültige Wallet:', 'Umkehren', 'Invertierte Farben', 'Schlüssel', 'Schlüssel wurde nicht zur Verfügung gestellt', 'Krux Drucker Test-QR', 'LCD-Typ', 'Sprache', 'Lassen Sie das Feld leer, wenn Sie möchten, dass Krux ein gültiges letztes Wort auswählt', 'Links', 'Länge: %s', 'Leitungsverzögerung', 'Linie:', 'Krux-App laden', 'Mnemonic laden', 'Wallet laden', 'Einen vertrauenswürdigen Wallet-Deskriptor laden, um Adressen anzuzeigen?', 'Von SD-Karte laden', 'Von SD-Karte laden?', 'Von der Kamera laden', 'Eine laden?', 'Laden?', 'Lade Kamera..', 'Lade Change Adressen..', 'Drucker wird geladen..', 'Lade Empfangsadressen..', 'Wird geladen..', 'Spracheinstellung', 'Speicherort', 'Maximale Länge überschritten (%s)', 'Nachricht', 'Nachricht:', 'Fehlende Signaturdatei', 'Mnemonic', 'Mnemonische ID', 'Mnemotechnik und Passphrase werden beibehalten.', 'Mnemonic wurde nicht verschlüsselt', 'Geändert:', 'Multisig', 'Native Segwit - 84 würde angenommen', 'Netzwerk', 'Neue Mnemonic', 'Neue Firmware erkannt.', 'Nein', 'Keine Passphrase', 'Nicht genug Würfe!', 'Zahlen', 'Oktal', 'Andere Formate', 'PBKDF2-Iter.', 'Male gestanzte Punkte schwarz an, damit sie erkannt werden können.', 'Papierbreite', 'Teil', 'Teilegröße', 'Passphrase', 'Passwortlänge', 'Pfad stimmt nicht überein', 'Muster erkannt!', 'Alle gespeicherten verschlüsselten Mnemoniken und Einstellungen dauerhaft vom Flash-Speicher entfernen?', 'Speicher', 'Pixelabweichungsindex:', 'Klartext-QR', 'Bitte lade einen Wallet Ausgabedeskriptor', 'Tauchrate', 'Schlechte Entropie', 'Schlechte Entropie erkannt!', 'Drucke Test-QR', 'Tiny Seed drucken?', 'Als QR-Code drucken', 'Als QR-Code drucken?', 'Drucken?', 'Drucker', 'Druckertreiber nicht gesetzt!', 'Wird gedruckt..', 'Trotzdem fortfahren?', 'Weiter?', 'Wird bearbeitet..', 'QR-Code', 'RX Pin', 'Neustart', 'Empfangen', 'Empfangsadresse', 'Region:', 'Löschen %s?', 'Mnemonic löschen', 'Firmware-Dateien von der SD-Karte entfernen?', 'Res. - Format', 'Werkseinstellungen wiederherstellen und neu starten?', 'Zurück zum QR-Viewer', 'Überprüfe gescannte Daten und bearbeite sie bei Bedarf', 'Rechts', 'Würfel mindestens %d Mal, um eine Mnemonic zu erzeugen.', 'Rollenverteilung:', 'Würfe:', 'SD-Karte', 'SD-Karte nicht erkannt.', 'SHA256 der Würfe:', 'SHA256 des Snapshots:', 'QR-Bild auf SD-Karte speichern', 'Auf SD-Karte speichern?', 'Auf SD-Karte speichern?', 'Auf SD-Karte gespeichert', 'Skala', 'Adresse\nscannen', 'Scan BIP39 Passphrase', 'Schlüssel QR-Code Scannen', 'Wörter 1-12 erneut scannen', 'Wörter 13-24 scannen', 'Bildschirmschonerzeit', 'Script-Art', 'Sicherheit', 'Selbstübertragung oder Change (%d):', 'Selbstübertragung:', 'Legen Sie zuerst einen Tamper Check Code fest', 'Einstellungen', 'Die Einstellungen werden intern auf Flash gespeichert.', 'Einstellungen auf SD-Karte gespeichert.', 'Shannons Entropie:', 'Ausschalten', 'Abschaltzeit:', 'Herunterfahren..', 'Signieren', 'Am QR-Code unterschreiben', 'Auf SD-Karte signieren', 'Signieren?', 'Signatur', 'Signierte Nachricht', 'Signierte PSBT', 'Unterschreiben..', 'Single-Sig', 'Größe:', 'Einige Schecks können nicht durchgeführt werden.', 'Ausgabe (%d):', 'Ausgaben:', 'Statistiken für Nerds', 'Auf Flash speichern', 'Auf der SD-Karte speichern', 'Wischen um den Modus zu ändern', 'TC Flash-Hash', 'TC Flash-Hash beim Start', 'TOUCH oder ENTER zum Erfassen', 'TX Pin', 'Tamper Check Code', 'Tamper Check Code erfolgreich gesetzt', 'Tamper Check Codes stimmen nicht überein', 'Text', "The app will be copied to user's flash ", 'Thema', 'Thermisch', "Um sicherzustellen, dass die Daten nicht wiederhergestellt werden können, verwenden Sie die Funktion 'Gerät löschen'", 'Helligkeit umschalten', 'Werkzeuge', 'Berühre Schwellenwert', 'Touchscreen', 'Weiter versuchen?', 'BIP39 Passphrase eingeben', 'Schlüssel eingeben', 'Einheit', 'Upgrade abgeschlossen.', 'Verwende eine schwarze Hintergrundfläche.', 'Verwende die Entropie der Kamera, um eine neue Mnemonic zu erstellen', 'Belegt:', 'Benutzerdaten', 'Wert %S außerhalb des Bereichs: [ %s, %s]', 'Der Wert muss ein Vielfaches von %s sein', 'Überprüfung..', 'Version', 'Via Kamera', 'Via D20', 'Via D6', 'Via manueller Eingabe', 'Via Wörter', 'Warte auf die Erfassung', 'Wallet', 'Wallet-Deskriptor', 'Wallet Ausgabedeskriptor', 'Wallet Ausgabedeskriptor geladen!', 'Wallet Ausgabedeskriptor nicht gefunden.', 'Warnung:', 'Wort %d', 'Wortnummern', 'Wörter', 'Ja', 'ist eine gültige Adresse!', 'wurde in den ersten %d Adressen nicht gefunden'] +translation_array = [ + "% des Betrags.", + "%d von %d Multisig", + "%d bis %d ", + "%s wurde entfernt.", + "(%d insgesamt)", + "(Experimental)", + "(nur zur Betrachtung)", + "12 Wörter", + "24 Wörter", + "Über", + "Annahme akzeptieren?", + "Konto", + "Konto #0 würde angenommen", + "Kontoindex", + "Wallet-Passphrase hinzufügen oder ändern?", + "Zusätzliche Entropie von der Kamera für den AES-CBC-Modus erforderlich", + "Adresse", + "Richte Kamera und Sicherungsplatte richtig aus.", + "Erlaube zuerst Einstellungen!", + "Blendschutz deaktiviert", + "Blendschutz aktiviert", + "Aussehen", + "Bist Du sicher?", + "BGR-Farben", + "BIP39-Mnemonik", + "Zurück", + "Zurück zum Menü", + "Mnemonik-Backup", + "Ungültige Signatur", + "Base64-Passwort", + "Baudrate", + "Binäres Gitter", + "Randpolsterung", + "Helligkeit", + "Tasten", + "Entprellung der Tasten", + "Aufnahme abgebrochen", + "Change Adresse", + "Change Adressen", + "Thema ändern und neu starten?", + "Change:", + "Änderungen bleiben bis zum Herunterfahren bestehen.", + "Prüfe SD-Karte", + "Überprüfen, ob diese Adresse zu dieser Wallet gehört?", + "Überprüfte %d Adresse ohne Übereinstimmungen.", + "Suche nach SD-Karte..", + "Bestätigen Sie den Tamper Check Code", + "Erstelle QR-Code", + "QR-Code aus Text erzeugen?", + "Erstellt:", + "Aktueller Tamper Check Code", + "Benutzerdefinierte QR-Code", + "Anpassen", + "Wenn Sie Ihr Wallet anpassen, wird ein neuer Schlüssel generiert.", + "Schnitttiefe", + "Cut-Methode", + "Dezimal", + "Entschlüsseln?", + "Standard-Wallet", + "Tiefe pro Durchgang", + "BIP85-Entropie ableiten?", + "Deskriptor-Adressen", + "Bildschirm", + "Schalten Sie das Gerät nicht aus, es kann eine Weile dauern.", + "Fertig?", + "Doppelte Gedächtnisstütze", + "Driver", + "Leer", + "Krux-Apps aktivieren", + "Verschlüsselt", + "Verschlüsselter QR-Code", + "Verschlüsselte Mnemonic wurde nicht gespeichert", + "Speicherung der verschlüsselten Mnemonic mit ID:", + "Verschlüsselung", + "Verschlüsselungsmodus", + "Geben Sie %d BIP-39 Wörter ein.", + "Geben Sie einen Tamper Check Code mit 6+ Zeichen ein", + "Gib jedes Wort Deiner BIP-39 Mnemonic als Zahl von 1 bis 2048 ein.", + "Gib jedes Wort Deiner BIP-39 Mnemonic als Hexadezimalzahl von 1 bis 800 ein.", + "Gib jedes Wort Deiner BIP-39 Mnemonic als Oktalzahl von 1 bis 4000 ein.", + "Gib jedes Wort Deiner BIP-39 Mnemonic ein.", + "Benutzerdaten löschen", + "Benutzerdaten werden gelöscht..", + "Fehler:", + "Esc", + "Eine signierte Krux-App ausführen?", + "Dateien durchsuchen?", + "Auf SD-Karte exportieren..", + "Öffentlicher Schlüssel", + "Werkeinstellungen", + "Entschlüsselung fehlgeschlagen", + "PSBT konnte nicht geladen werden", + "Adresse konnte nicht geladen werden", + "Schlüssel konnte nicht geladen werden", + "Nachricht konnte nicht geladen werden", + "Mnemonic konnte nicht geladen werden", + "Ausgabedeskriptor konnte nicht geladen werden", + "Passphrase konnte nicht geladen werden", + "Mnemonic konnte nicht gespeichert werden", + "Gebühr:", + "Vorschubgeschwindigkeit", + "Dateiname", + "Dateiname %s existiert auf SD-Karte, überschreiben?", + "Den Flash mit Entropie von der Kamera füllen?", + "Flash wird gefüllt", + "Fingerabdruck in PSBT deaktiviert", + "Die Firmware übersteigt die maximale Größe: %d", + "Flash-Karte", + "Flash-Tools", + "Flash gefüllt mit Kameraentropie", + "Umgedrehte X-Koordinaten", + "Flötendurchmesser", + "Frei:", + "Vom Speicher", + "Löschen Sie Ihre SD-Karte vollständig in einem anderen Gerät, um sicherzustellen, dass die Daten nicht wiederhergestellt werden können", + "Mnemonik erzeugen", + "Dieser Mnemonic eine benutzerdefinierte ID zuteilen? Andernfalls wird der aktuelle Fingerabdruck verwendet", + "Go", + "Gute Entropie", + "Hardware", + "Hex öffentlicher Schlüssel", + "Hexadezimal", + "Mnemonics ausblenden", + "Hohe Gebühren!", + "ID existiert bereits", + "Index", + "Index: %s", + "Input (%d):", + "Installieren?", + "Unzureichende Entropie!", + "Unzureichende Entropie", + "Ungültiger Tamper Check Code", + "Ungültige Adresse", + "Ungültiger Bootloader", + "Ungültige mnemonische Lange", + "Ungültiger öffentlicher Schlüssel", + "Ungültige Wallet:", + "Umkehren", + "Invertierte Farben", + "Schlüssel", + "Schlüssel wurde nicht zur Verfügung gestellt", + "Krux Drucker Test-QR", + "LCD-Typ", + "Sprache", + "Lassen Sie das Feld leer, wenn Sie möchten, dass Krux ein gültiges letztes Wort auswählt", + "Links", + "Länge: %s", + "Leitungsverzögerung", + "Linie:", + "Krux-App laden", + "Mnemonic laden", + "Wallet laden", + "Einen vertrauenswürdigen Wallet-Deskriptor laden, um Adressen anzuzeigen?", + "Von SD-Karte laden", + "Von SD-Karte laden?", + "Von der Kamera laden", + "Eine laden?", + "Laden?", + "Lade Kamera..", + "Lade Change Adressen..", + "Drucker wird geladen..", + "Lade Empfangsadressen..", + "Wird geladen..", + "Spracheinstellung", + "Speicherort", + "Maximale Länge überschritten (%s)", + "Nachricht", + "Nachricht:", + "Fehlende Signaturdatei", + "Mnemonic", + "Mnemonische ID", + "Mnemotechnik und Passphrase werden beibehalten.", + "Mnemonic wurde nicht verschlüsselt", + "Geändert:", + "Multisig", + "Native Segwit - 84 würde angenommen", + "Netzwerk", + "Neue Mnemonic", + "Neue Firmware erkannt.", + "Nein", + "Keine Passphrase", + "Nicht genug Würfe!", + "Zahlen", + "Oktal", + "Andere Formate", + "PBKDF2-Iter.", + "Male gestanzte Punkte schwarz an, damit sie erkannt werden können.", + "Papierbreite", + "Teil", + "Teilegröße", + "Passphrase", + "Passwortlänge", + "Pfad stimmt nicht überein", + "Muster erkannt!", + "Alle gespeicherten verschlüsselten Mnemoniken und Einstellungen dauerhaft vom Flash-Speicher entfernen?", + "Speicher", + "Pixelabweichungsindex:", + "Klartext-QR", + "Bitte lade einen Wallet Ausgabedeskriptor", + "Tauchrate", + "Schlechte Entropie", + "Schlechte Entropie erkannt!", + "Drucke Test-QR", + "Tiny Seed drucken?", + "Als QR-Code drucken", + "Als QR-Code drucken?", + "Drucken?", + "Drucker", + "Druckertreiber nicht gesetzt!", + "Wird gedruckt..", + "Trotzdem fortfahren?", + "Weiter?", + "Wird bearbeitet..", + "QR-Code", + "RX Pin", + "Neustart", + "Empfangen", + "Empfangsadresse", + "Region:", + "Löschen %s?", + "Mnemonic löschen", + "Firmware-Dateien von der SD-Karte entfernen?", + "Res. - Format", + "Werkseinstellungen wiederherstellen und neu starten?", + "Zurück zum QR-Viewer", + "Überprüfe gescannte Daten und bearbeite sie bei Bedarf", + "Rechts", + "Würfel mindestens %d Mal, um eine Mnemonic zu erzeugen.", + "Rollenverteilung:", + "Würfe:", + "SD-Karte", + "SD-Karte nicht erkannt.", + "SHA256 der Würfe:", + "SHA256 des Snapshots:", + "QR-Bild auf SD-Karte speichern", + "Auf SD-Karte speichern?", + "Auf SD-Karte speichern?", + "Auf SD-Karte gespeichert", + "Skala", + "Adresse\nscannen", + "Scan BIP39 Passphrase", + "Schlüssel QR-Code Scannen", + "Wörter 1-12 erneut scannen", + "Wörter 13-24 scannen", + "Bildschirmschonerzeit", + "Script-Art", + "Sicherheit", + "Selbstübertragung oder Change (%d):", + "Selbstübertragung:", + "Legen Sie zuerst einen Tamper Check Code fest", + "Einstellungen", + "Die Einstellungen werden intern auf Flash gespeichert.", + "Einstellungen auf SD-Karte gespeichert.", + "Shannons Entropie:", + "Ausschalten", + "Abschaltzeit:", + "Herunterfahren..", + "Signieren", + "Am QR-Code unterschreiben", + "Auf SD-Karte signieren", + "Signieren?", + "Signatur", + "Signierte Nachricht", + "Signierte PSBT", + "Unterschreiben..", + "Single-Sig", + "Größe:", + "Einige Schecks können nicht durchgeführt werden.", + "Ausgabe (%d):", + "Ausgaben:", + "Statistiken für Nerds", + "Auf Flash speichern", + "Auf der SD-Karte speichern", + "Wischen um den Modus zu ändern", + "TC Flash-Hash", + "TC Flash-Hash beim Start", + "TOUCH oder ENTER zum Erfassen", + "TX Pin", + "Tamper Check Code", + "Tamper Check Code erfolgreich gesetzt", + "Tamper Check Codes stimmen nicht überein", + "Text", + "The app will be copied to user's flash ", + "Thema", + "Thermisch", + "Um sicherzustellen, dass die Daten nicht wiederhergestellt werden können, verwenden Sie die Funktion 'Gerät löschen'", + "Helligkeit umschalten", + "Werkzeuge", + "Berühre Schwellenwert", + "Touchscreen", + "Weiter versuchen?", + "BIP39 Passphrase eingeben", + "Schlüssel eingeben", + "Einheit", + "Upgrade abgeschlossen.", + "Verwende eine schwarze Hintergrundfläche.", + "Verwende die Entropie der Kamera, um eine neue Mnemonic zu erstellen", + "Belegt:", + "Benutzerdaten", + "Wert %S außerhalb des Bereichs: [ %s, %s]", + "Der Wert muss ein Vielfaches von %s sein", + "Überprüfung..", + "Version", + "Via Kamera", + "Via D20", + "Via D6", + "Via manueller Eingabe", + "Via Wörter", + "Warte auf die Erfassung", + "Wallet", + "Wallet-Deskriptor", + "Wallet Ausgabedeskriptor", + "Wallet Ausgabedeskriptor geladen!", + "Wallet Ausgabedeskriptor nicht gefunden.", + "Warnung:", + "Wort %d", + "Wortnummern", + "Wörter", + "Ja", + "ist eine gültige Adresse!", + "wurde in den ersten %d Adressen nicht gefunden", +] diff --git a/src/krux/translations/es.py b/src/krux/translations/es.py index 37d7751c5..11184a56a 100644 --- a/src/krux/translations/es.py +++ b/src/krux/translations/es.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['% del monto.', '%d de %d multisig', '%d a %d', '%s eliminado.', '(%d total)', '(Experimental)', '(Solo para observación)', '12 palabras', '24 palabras', 'Nosotros', '¿Aceptar la suposición?', 'Cuenta', 'Se supondría que la cuenta #0', 'Índice de la cuenta', '¿Añadir o cambiar passphrase de la cartera?', 'Se requiere entropía adicional de la cámara para el modo AES-CBC', 'Dirección', 'Alinea la cámara y la placa de respaldo correctamente.', '¡Permitir en la configuración primero!', 'Anti-reflejo desactivado', 'Anti-reflejo habilitado', 'Apariencia', '¿Estás seguro?', 'Colores BGR', 'Mnemónico BIP39', 'Atrás', 'Volver al Menú', 'Backup del Mnemónico', 'Firma incorrecta', 'Contraseña Base64', 'Baudrate', 'Cuadrícula binaria', 'Grosor del Borde', 'Brillo', 'Botones', 'Rebote de Botones', 'Captura cancelada', 'Cambio', 'Direcciones de Cambio', '¿Cambiar de tema y reiniciar?', 'Cambio:', 'Los cambios durarán hasta que el dispositivo se apague.', 'Verifica Tarjeta SD', '¿Verificar que la dirección pertenece a esta cartera?', 'Comprobado %d direcciones sin coincidencias.', 'Comprobación de la tarjeta SD..', 'Confirmar el código de verificación', 'Crear Código QR', '¿Crear código QR desde texto?', 'Creado:', 'Código de verificación actual', 'Código QR Personalizado', 'Personalizar', 'Personalizar tu cartera generará una nueva clave', 'Profundidad de Corte', 'Método de Corte', 'Decimal', '¿Descifrar?', 'Cartera Predeterminada', 'Profundidad por Pasada', '¿Derivar entropía BIP85?', 'Direcciones del descriptor', 'Pantalla', 'No apagues el dispositivo, puede tardar un tiempo en completarse.', '¿Listo?', 'Doble mnemónico', 'Operador', 'Vacío', 'Habilitar aplicaciones Krux', 'Cifrado', 'Código QR Cifrado', 'Mnemónico cifrado no se almacenó', 'Mnemónico cifrado fue almacenado con ID:', 'Cifrado', 'Modo de Cifrado', 'Ingrese %d palabras BIP-39.', 'Introduzca un código de verificación de más de 6 caracteres', 'Ingresa cada palabra de tu mnemónico BIP-39 como un número del 1 al 2048.', 'Ingresa cada palabra de tu mnemónico BIP-39 como un número en hexadecimal del 1 al 800.', 'Ingresa cada palabra de tu mnemónico BIP-39 como un número en octal del 1 al 4000.', 'Ingresa cada palabra de tu mnemónico BIP-39.', 'Borrar datos de usuario', 'Borrando los datos del usuario..', 'Error:', 'Esc', '¿Ejecutar una aplicación Krux firmada?', '¿Explorar archivos?', 'Exportando a la tarjeta SD..', 'Clave Pública Extendida', 'Ajustes de Fábrica', 'Error al descifrar', 'No se pudo cargar la PSBT', 'No se pudo cargar la dirección', 'No se pudo cargar la clave', 'No se pudo cargar el mensaje', 'No se pudo importar el mnemónico', 'No se pudo cargar el descriptor de salida', 'No se pudo cargar el passphrase', 'No pudo almacenar mnemónico', 'Comisión:', 'Feed Rate', 'Nombre del Archivo', 'El nombre de archivo %s existe en la tarjeta SD, ¿sobrescribir?', '¿Llenar el flash con entropía de la cámara?', 'Llenando Flash', 'Huella dactilar no establecida en PSBT', 'El firmware supera el tamaño máximo: %d', 'Mapa Flash', 'Flash Tools', 'Flash lleno de entropía de cámara', 'Coordenadas X Invertidas', 'Diámetro de la Flauta', 'Libre:', 'Desde el Almacenamiento', 'Borra completamente su tarjeta SD en otro dispositivo para asegurarse de que los datos sean irrecuperables', 'Generar Mnemónico', '¿Darle a este mnemónico una identificación personalizada? De lo contrario se utilizará el fingerprint actual', 'Ir', 'Buena entropía', 'Hardware', 'Clave Pública Hexadecimal', 'Hexadecimal', 'Ocultar Mnemónicos', '¡Tarifas altas!', 'ID ya existe', 'Índice', 'Índice: %s', 'Entradas (%d):', '¿Instalar?', '¡Entropía Insuficiente!', 'Entropía insuficiente', 'Código de verificación no válido', 'Dirección inválida', 'Bootloader inválido', 'Longitud mnemónica no válida', 'Clave pública inválida', 'Cartera inválida:', 'Invertir', 'Colores Invertidos', 'Clave', 'No se proporcionó la clave', 'Test de impresión QR', 'Tipo de LCD', 'Idioma', 'Déjalo en blanco si quieres que Krux elija una última palabra válida', 'Izquierda', 'Longitud: %s', 'Retraso de Línea', 'Línea:', 'Cargar aplicación Krux', 'Importar Mnemónico', 'Cargar Cartera', '¿Cargar un descriptor de monedero de confianza para ver las direcciones?', 'Cargar desde tarjeta SD', '¿Cargar desde la tarjeta SD?', 'Cargar desde la cámara', '¿Cargar algo?', '¿Cargar?', 'Cargando Camara..', 'Cargando direcciones de cambio..', 'Cargando impresora..', 'Cargando direcciones de recepción..', 'Cargando..', 'Idioma', 'Ubicación', 'Longitud máxima excedida (%s)', 'Mensaje', 'Mensaje:', 'Falta archivo de firma', 'Mnemónico', 'Identificación del Mnemónico', 'Mnemónico y passphrase se mantendrán.', 'Mnemónico no fue descifrado', 'Modificado:', 'Multisig', 'Segwit nativo - 84 se supondría', 'Red', 'Nuevo Mnemónico', 'Nuevo firmware detectado.', 'No', 'Sin Passphrase', '¡No hay suficientes tiradas!', 'Números', 'Octales', 'Otros Formatos', 'Iter. PBKDF2', 'Pinte los puntos perforados de negro para que puedan ser detectados.', 'Ancho del Papel', 'Parte', 'Tamaño de la Pieza', 'Passphrase', 'Longitud', 'La ruta no coincide', '¡Patrón detectado!', '¿Eliminar permanentemente todos los mnemónicos y configuraciones cifradas almacenadas del flash?', 'Guardar', 'Índice de desviación de píxeles:', 'QR de Texto', 'Carga un descriptor de cartera', 'Tasa de Caída', 'Baja entropía', 'Mala entropía detectada!', 'Prueba de Impresión QR', '¿Imprimir Tiny Seed?', 'Imprimir como Código QR', '¿Imprimir con Codigo QR?', '¿Impresión?', 'Impresora', '¡El controlador de impresora no está configurado!', 'Imprimiendo..', '¿Proceder de todas maneras?', '¿Continuar?', 'Procesando..', 'Código QR', 'RX Pin', 'Reiniciar', 'Recepción', 'Direcciones de Recepción', 'Región:', 'Eliminar %s?', 'Eliminar Mnemónico', '¿Eliminar archivos de firmware de la tarjeta SD?', 'Res. - Formato', '¿Restablecer a la configuración de fábrica y reiniciar?', 'Volver al QR', 'Revisa los datos escaneados, edítalos si es necesario', 'Derecha', 'Tira el dado al menos %d veces para generar un mnemónico.', 'Distribución de tiradas:', 'Tiradas:', 'Tarjeta SD', 'Tarjeta SD no detectada.', 'SHA256 de las tiradas:', 'SHA256 de la instantánea:', 'Guardar Imagen QR en la Tarjeta SD', 'Guardar en tarjeta SD', '¿Guardar en la tarjeta SD?', 'Guardado en la tarjeta SD', 'Escala', 'Escanear Dirección', 'Escanear Passphrase BIP39', 'Escanear el Código QR', 'Escaneo de palabras 1-12 de nuevo', 'Escaneo de palabras 13-24', 'Tiempo de Espera del Protector de Pantalla', 'Tipo de Script', 'Seguridad', 'Autotransferencia o Cambio (%d):', 'Autotransferencia:', 'Establezca primero un código de verificación', 'Ajustes', 'Ajustes almacenados internamente en flash.', 'Configuración almacenada en la tarjeta SD.', 'Entropía de Shannon:', 'Apagar', 'Tiempo de Apagado', 'Apagando..', 'Firmar', 'Firmar en Código QR', 'Firmar en la Tarjeta SD', '¿Firmar?', 'Firma', 'Mensaje Firmado', 'PSBT Firmado', 'Firmando..', 'Single-sig', 'Tamaño:', 'Algunas comprobaciones no se pueden realizar.', 'Gastos (%d):', 'Gasto:', 'Estadísticas para Entendidos', 'Almacenar en Flash', 'Almacenar en la Tarjeta SD', 'Deslizar para cambiar de modo', 'TC Hash Flash', 'TC Flash Hash al arranque', 'TOCA o ENTER para capturar', 'TX Pin', 'Código de verificación', 'Código de verificación establecido con éxito', 'Los códigos de verificación no coinciden', 'Texto', "The app will be copied to user's flash ", 'Tema', 'Térmico', 'Para garantizar que los datos no se puedan recuperar, utiliza la función de borrar dispositivo', 'Alternar Brillo', 'Herramientas', 'Umbral Táctil', 'Pantalla Táctil', '¿Intentar con mas?', 'Escribe la Passphrase BIP39', 'Introduce la clave', 'Unidad', 'Actualización completa.', 'Usa una superficie de fondo negra.', 'Usa la entropía de la cámara para crear una nueva mnemónica', 'Usado:', 'Usuario', 'Valor %s fuera del rango: [ %s, %s]', 'El valor debe ser múltiple de %s', 'Verificando..', 'Versión', 'Desde Cámara', 'Vía D20', 'Vía D6', 'Introducción Manual', 'A Través de Palabras', 'Espera la captura', 'Cartera', 'Descriptor de Cartera', 'Descriptor de salida de cartera', '¡Se ha cargado el descriptor de salida de la cartera!', 'No se encontró el descriptor de salida de la cartera.', 'Advertencia:', 'Palabra %d', 'Números de Palabra', 'Palabras', 'Sí', 'es una dirección válida!', 'NO FUE ENCONTRADO en las primeras %d direcciones'] +translation_array = [ + "% del monto.", + "%d de %d multisig", + "%d a %d", + "%s eliminado.", + "(%d total)", + "(Experimental)", + "(Solo para observación)", + "12 palabras", + "24 palabras", + "Nosotros", + "¿Aceptar la suposición?", + "Cuenta", + "Se supondría que la cuenta #0", + "Índice de la cuenta", + "¿Añadir o cambiar passphrase de la cartera?", + "Se requiere entropía adicional de la cámara para el modo AES-CBC", + "Dirección", + "Alinea la cámara y la placa de respaldo correctamente.", + "¡Permitir en la configuración primero!", + "Anti-reflejo desactivado", + "Anti-reflejo habilitado", + "Apariencia", + "¿Estás seguro?", + "Colores BGR", + "Mnemónico BIP39", + "Atrás", + "Volver al Menú", + "Backup del Mnemónico", + "Firma incorrecta", + "Contraseña Base64", + "Baudrate", + "Cuadrícula binaria", + "Grosor del Borde", + "Brillo", + "Botones", + "Rebote de Botones", + "Captura cancelada", + "Cambio", + "Direcciones de Cambio", + "¿Cambiar de tema y reiniciar?", + "Cambio:", + "Los cambios durarán hasta que el dispositivo se apague.", + "Verifica Tarjeta SD", + "¿Verificar que la dirección pertenece a esta cartera?", + "Comprobado %d direcciones sin coincidencias.", + "Comprobación de la tarjeta SD..", + "Confirmar el código de verificación", + "Crear Código QR", + "¿Crear código QR desde texto?", + "Creado:", + "Código de verificación actual", + "Código QR Personalizado", + "Personalizar", + "Personalizar tu cartera generará una nueva clave", + "Profundidad de Corte", + "Método de Corte", + "Decimal", + "¿Descifrar?", + "Cartera Predeterminada", + "Profundidad por Pasada", + "¿Derivar entropía BIP85?", + "Direcciones del descriptor", + "Pantalla", + "No apagues el dispositivo, puede tardar un tiempo en completarse.", + "¿Listo?", + "Doble mnemónico", + "Operador", + "Vacío", + "Habilitar aplicaciones Krux", + "Cifrado", + "Código QR Cifrado", + "Mnemónico cifrado no se almacenó", + "Mnemónico cifrado fue almacenado con ID:", + "Cifrado", + "Modo de Cifrado", + "Ingrese %d palabras BIP-39.", + "Introduzca un código de verificación de más de 6 caracteres", + "Ingresa cada palabra de tu mnemónico BIP-39 como un número del 1 al 2048.", + "Ingresa cada palabra de tu mnemónico BIP-39 como un número en hexadecimal del 1 al 800.", + "Ingresa cada palabra de tu mnemónico BIP-39 como un número en octal del 1 al 4000.", + "Ingresa cada palabra de tu mnemónico BIP-39.", + "Borrar datos de usuario", + "Borrando los datos del usuario..", + "Error:", + "Esc", + "¿Ejecutar una aplicación Krux firmada?", + "¿Explorar archivos?", + "Exportando a la tarjeta SD..", + "Clave Pública Extendida", + "Ajustes de Fábrica", + "Error al descifrar", + "No se pudo cargar la PSBT", + "No se pudo cargar la dirección", + "No se pudo cargar la clave", + "No se pudo cargar el mensaje", + "No se pudo importar el mnemónico", + "No se pudo cargar el descriptor de salida", + "No se pudo cargar el passphrase", + "No pudo almacenar mnemónico", + "Comisión:", + "Feed Rate", + "Nombre del Archivo", + "El nombre de archivo %s existe en la tarjeta SD, ¿sobrescribir?", + "¿Llenar el flash con entropía de la cámara?", + "Llenando Flash", + "Huella dactilar no establecida en PSBT", + "El firmware supera el tamaño máximo: %d", + "Mapa Flash", + "Flash Tools", + "Flash lleno de entropía de cámara", + "Coordenadas X Invertidas", + "Diámetro de la Flauta", + "Libre:", + "Desde el Almacenamiento", + "Borra completamente su tarjeta SD en otro dispositivo para asegurarse de que los datos sean irrecuperables", + "Generar Mnemónico", + "¿Darle a este mnemónico una identificación personalizada? De lo contrario se utilizará el fingerprint actual", + "Ir", + "Buena entropía", + "Hardware", + "Clave Pública Hexadecimal", + "Hexadecimal", + "Ocultar Mnemónicos", + "¡Tarifas altas!", + "ID ya existe", + "Índice", + "Índice: %s", + "Entradas (%d):", + "¿Instalar?", + "¡Entropía Insuficiente!", + "Entropía insuficiente", + "Código de verificación no válido", + "Dirección inválida", + "Bootloader inválido", + "Longitud mnemónica no válida", + "Clave pública inválida", + "Cartera inválida:", + "Invertir", + "Colores Invertidos", + "Clave", + "No se proporcionó la clave", + "Test de impresión QR", + "Tipo de LCD", + "Idioma", + "Déjalo en blanco si quieres que Krux elija una última palabra válida", + "Izquierda", + "Longitud: %s", + "Retraso de Línea", + "Línea:", + "Cargar aplicación Krux", + "Importar Mnemónico", + "Cargar Cartera", + "¿Cargar un descriptor de monedero de confianza para ver las direcciones?", + "Cargar desde tarjeta SD", + "¿Cargar desde la tarjeta SD?", + "Cargar desde la cámara", + "¿Cargar algo?", + "¿Cargar?", + "Cargando Camara..", + "Cargando direcciones de cambio..", + "Cargando impresora..", + "Cargando direcciones de recepción..", + "Cargando..", + "Idioma", + "Ubicación", + "Longitud máxima excedida (%s)", + "Mensaje", + "Mensaje:", + "Falta archivo de firma", + "Mnemónico", + "Identificación del Mnemónico", + "Mnemónico y passphrase se mantendrán.", + "Mnemónico no fue descifrado", + "Modificado:", + "Multisig", + "Segwit nativo - 84 se supondría", + "Red", + "Nuevo Mnemónico", + "Nuevo firmware detectado.", + "No", + "Sin Passphrase", + "¡No hay suficientes tiradas!", + "Números", + "Octales", + "Otros Formatos", + "Iter. PBKDF2", + "Pinte los puntos perforados de negro para que puedan ser detectados.", + "Ancho del Papel", + "Parte", + "Tamaño de la Pieza", + "Passphrase", + "Longitud", + "La ruta no coincide", + "¡Patrón detectado!", + "¿Eliminar permanentemente todos los mnemónicos y configuraciones cifradas almacenadas del flash?", + "Guardar", + "Índice de desviación de píxeles:", + "QR de Texto", + "Carga un descriptor de cartera", + "Tasa de Caída", + "Baja entropía", + "Mala entropía detectada!", + "Prueba de Impresión QR", + "¿Imprimir Tiny Seed?", + "Imprimir como Código QR", + "¿Imprimir con Codigo QR?", + "¿Impresión?", + "Impresora", + "¡El controlador de impresora no está configurado!", + "Imprimiendo..", + "¿Proceder de todas maneras?", + "¿Continuar?", + "Procesando..", + "Código QR", + "RX Pin", + "Reiniciar", + "Recepción", + "Direcciones de Recepción", + "Región:", + "Eliminar %s?", + "Eliminar Mnemónico", + "¿Eliminar archivos de firmware de la tarjeta SD?", + "Res. - Formato", + "¿Restablecer a la configuración de fábrica y reiniciar?", + "Volver al QR", + "Revisa los datos escaneados, edítalos si es necesario", + "Derecha", + "Tira el dado al menos %d veces para generar un mnemónico.", + "Distribución de tiradas:", + "Tiradas:", + "Tarjeta SD", + "Tarjeta SD no detectada.", + "SHA256 de las tiradas:", + "SHA256 de la instantánea:", + "Guardar Imagen QR en la Tarjeta SD", + "Guardar en tarjeta SD", + "¿Guardar en la tarjeta SD?", + "Guardado en la tarjeta SD", + "Escala", + "Escanear Dirección", + "Escanear Passphrase BIP39", + "Escanear el Código QR", + "Escaneo de palabras 1-12 de nuevo", + "Escaneo de palabras 13-24", + "Tiempo de Espera del Protector de Pantalla", + "Tipo de Script", + "Seguridad", + "Autotransferencia o Cambio (%d):", + "Autotransferencia:", + "Establezca primero un código de verificación", + "Ajustes", + "Ajustes almacenados internamente en flash.", + "Configuración almacenada en la tarjeta SD.", + "Entropía de Shannon:", + "Apagar", + "Tiempo de Apagado", + "Apagando..", + "Firmar", + "Firmar en Código QR", + "Firmar en la Tarjeta SD", + "¿Firmar?", + "Firma", + "Mensaje Firmado", + "PSBT Firmado", + "Firmando..", + "Single-sig", + "Tamaño:", + "Algunas comprobaciones no se pueden realizar.", + "Gastos (%d):", + "Gasto:", + "Estadísticas para Entendidos", + "Almacenar en Flash", + "Almacenar en la Tarjeta SD", + "Deslizar para cambiar de modo", + "TC Hash Flash", + "TC Flash Hash al arranque", + "TOCA o ENTER para capturar", + "TX Pin", + "Código de verificación", + "Código de verificación establecido con éxito", + "Los códigos de verificación no coinciden", + "Texto", + "The app will be copied to user's flash ", + "Tema", + "Térmico", + "Para garantizar que los datos no se puedan recuperar, utiliza la función de borrar dispositivo", + "Alternar Brillo", + "Herramientas", + "Umbral Táctil", + "Pantalla Táctil", + "¿Intentar con mas?", + "Escribe la Passphrase BIP39", + "Introduce la clave", + "Unidad", + "Actualización completa.", + "Usa una superficie de fondo negra.", + "Usa la entropía de la cámara para crear una nueva mnemónica", + "Usado:", + "Usuario", + "Valor %s fuera del rango: [ %s, %s]", + "El valor debe ser múltiple de %s", + "Verificando..", + "Versión", + "Desde Cámara", + "Vía D20", + "Vía D6", + "Introducción Manual", + "A Través de Palabras", + "Espera la captura", + "Cartera", + "Descriptor de Cartera", + "Descriptor de salida de cartera", + "¡Se ha cargado el descriptor de salida de la cartera!", + "No se encontró el descriptor de salida de la cartera.", + "Advertencia:", + "Palabra %d", + "Números de Palabra", + "Palabras", + "Sí", + "es una dirección válida!", + "NO FUE ENCONTRADO en las primeras %d direcciones", +] diff --git a/src/krux/translations/fr.py b/src/krux/translations/fr.py index adaa2ff3b..275598351 100644 --- a/src/krux/translations/fr.py +++ b/src/krux/translations/fr.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['% du montant.', '%d de %d multisignature', '%d à %d', '%s supprimé.', '(%d au total)', '(Expérimental)', '(consultation)', '12 mots', '24 mots', 'À propos', 'Accepter supposition\u2009?', 'Compte', 'Le compte n °0 serait supposé', 'Index du compte', 'Ajoutez ou modifiez la phrase secrète\u2009?', 'Entropie supplémentaire de la caméra requise pour le mode AES-CBC', 'Adresse', 'Alignez correctement la caméra et plaque de sauvegarde.', "Autoriser d'abord dans les paramètres !", 'Anti-éblouissement désactivé', 'Anti-éblouissement activé', 'Apparence', 'Es-tu sûr\u2009?', 'Couleurs BGR', 'Mnémonique BIP39', 'Retour', 'Retour au menu', 'Sauvegarde mnémonique', 'Signature non valide', 'Mot de passe Base64', 'Débit en bauds', 'Grille binaire', 'Rembourrage de bordure', 'Luminosité', 'Boutons', 'Anti-rebond des boutons', 'Capture annulée', 'Monnaie', 'Adresses de Monnaie', 'Changer de thème et redémarrer\u2009?', 'La monnaie\u2009:', "Les modifications dureront jusqu'à l'arrêt.", 'Vérifiez la carte SD', "Vérifiez que l'adresse appartient à ce portefeuille\u2009?", '%d adresses vérifiées sans correspondance.', 'Vérification de la carte SD..', 'Confirmer le code de non compromis', 'Créer un code QR', "Créer un code QR à partir d'un texte\u2009?", 'Créé\u2009:', 'Code de non compromis actuel', 'Code QR personnalisé', 'Personnaliser', 'La personnalisation de votre portefeuille générera une nouvelle clé.', 'Profondeur de coupe', 'Méthode de coupe', 'Décimal', 'Déchiffrer ?', 'Portefeuille par défaut', 'Profondeur par passage', "Dériver l'entropie BIP85 ?", 'Adresses du descripteur', 'Affichage', 'Ne pas éteindre, cela peut prendre un certain temps.', 'Terminé\u2009?', 'Double mnémonique', 'Pilote', 'Vide', 'Activer les applications Krux', 'Chiffré', 'Code QR chiffré', "Le mnémonique chiffré n'a pas été stocké", 'Mnémonique chiffré a été stocké avec ID\u2009:', 'Chiffrement', 'Mode de chiffrement', 'Entrez %d mots BIP-39.', 'Saisissez un code de non compromis de plus de 6 caractères', "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre de 1 à 2048.", "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en hexadécimal de 1 à 800.", "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en octal de 1 à 4000.", 'Entrez chaque mot de votre mnémonique BIP-39.', "Effacer les données de l'utilisateur", "Effacement des données de l'utilisateur...", 'Erreur\u2009:', 'Esc', 'Exécuter une application Krux signée ?', 'Explorer des fichiers\u2009?', 'Exportation vers la carte SD..', 'Clé publique', "Paramètres d'usine", 'Échec du déchiffrement', 'Échec du chargement PSBT', "Échec du chargement d'adresse", 'Échec du chargement de la clé', 'Échec du chargement du message', 'Échec du chargement mnémonique', 'Échec du chargement du descripteur de sortie', 'Échec du chargement de la phrase secrète', 'Échec du stockage mnémonique', 'Frais\u2009:', "Taux d'alimentation", 'Nom de fichier', 'Le nom de fichier %s existe sur la carte SD, écraser\u2009?', "Remplir le flash avec l'entropie de la caméra ?", 'Remplissage du Flash', 'Empreinte digitale manquante dans PSBT', 'Le micrologiciel dépasse la taille maximale\u2009: %d', 'Plan du Flash', 'Outils Flash', "Flash rempli par l'entropie de la caméra", 'Coordonnées X inversées', 'Diamètre de flûte', 'Libre\u2009:', 'Du stockage', 'Effacez complètement votre carte SD dans un autre appareil pour assurer que les données soient irrécupérables', 'Générer un mnémonique', "Donnez à ce mnémonique un identifiant personnalisé\u2009? Sinon l'empreinte actuelle sera utilisée", 'OK', 'Bonne entropie', 'Matériel', 'Clé publique hexadécimale', 'Hexadécimal', 'Masquer les mnémoniques', 'Frais élevés\u2009!', 'Id existe déjà', 'Index', 'Index : %s', 'Entrées (%d)\u2009:', 'Installer\u2009?', 'Entropie insuffisante\u2009!', 'Entropie insuffisante', 'Code de non compromis non valide', 'Adresse invalide', 'Chargeur de démarrage invalide', 'Longueur mnémonique invalide', 'Clé publique non valide', 'Portefeuille invalide\u2009:', 'Inverser', 'Couleurs inversées', 'Clé', "La clé n'a pas été fournie", "Test de l'imprimante Krux QR", "Type d'écran LCD", 'Langue', 'Laissez vide si vous souhaitez que Krux choisisse un dernier mot valide', 'Gauche', 'Longueur : %s', 'Délai de Ligne', 'Ligne\u2009:', "Charger l'application Krux", 'Charger Mnémonique', 'Charger le portefeuille', 'Charger un descripteur de portefeuille de confiance pour afficher les adresses\u2009?', 'Charger depuis la carte SD', 'Charger depuis la carte SD\u2009?', 'Charger depuis la caméra', 'Charger\u2009?', 'Charger\u2009?', 'Activation de la Caméra..', 'Chargement des adresses de monnaie..', "Activation de l'imprimante..", 'Chargement des adresses de réception ..', 'Chargement..', 'Paramètres régionaux', 'Emplacement', 'Longueur maximale dépassée (%s)', 'Message', 'Message\u2009:', 'Fichier de signature manquant', 'Mnémonique', 'ID Mnémonique', 'Mnémonique et phrase secrète seront conservés.', "Mnémonique n'était pas chiffré", 'Modifié\u2009:', 'Multi\nsignature', 'Native Segwit - 84 serait supposé', 'Réseau', 'Nouveau Mnémonique', 'Nouveau micrologiciel détecté.', 'Non', 'Pas de phrase secrète', 'Pas assez de jets\u2009!', 'Nombres', 'Octale', 'Autres formats', 'Itér. PBKDF2', "Noircissez les points perforés afin qu'ils puissent être détectés.", 'Largeur du papier', 'Partie', 'Taille de la pièce', 'Phrase secréte', 'Longueur du mot de passe', 'Inadéquation du chemin', 'Pattern détecté\u2009!', 'Supprimer définitivement tous les mnémoniques et paramètres chiffrés stockés dans le flash\u2009?', 'Persistance', 'Indice de déviation des pixels\u2009:', 'QR en Texte Brut', 'Veuillez charger un descripteur de sortie de portefeuille', 'Taux de plongée', 'Entropie faible', 'Entropie faible détectée\u2009!', 'Impression Test QR', 'Imprimer Tiny Seed\u2009?', 'Imprimer Code QR', 'Imprimer Code QR\u2009?', 'Imprimer\u2009?', 'Imprimante', "Le pilote d'imprimante n'est pas défini\u2009!", 'Impression..', 'Procéder quand même\u2009?', 'Procéder\u2009?', 'Traitement..', 'Code QR', 'RX Fiche', 'Redémarrer', 'Recevoir', 'Adresses de Réception', 'Région\u2009:', 'Supprimer %s\u2009?', 'Supprimer mnémonique', 'Supprimer les fichiers micrologiciel de la carte SD\u2009?', 'Rés. - Format', "Restaurer les paramètres d'usine et redémarrer\u2009?", 'Retour au visualiseur QR', 'Examinez les données numérisées, modifiez-les si nécessaire', 'À droite', 'Lancez le dé au moins %d fois pour générer un mnémonique.', 'Distribution des jets\u2009:', 'Jets\u2009:', 'Carte SD', 'Carte SD non détectée.', 'SHA256 de jets\u2009:', 'SHA256 de snapshot\u2009:', "Enregistrer l'image QR sur la carte SD", 'Enregistrer sur la carte SD', 'Enregistrer sur la carte SD\u2009?', 'Enregistré sur la carte SD', "L'échelle", "Scannez l'adresse", 'Scannez la phrase secrète BIP-39', 'Scannez le Code QR de la clé', 'Analyser à nouveau les mots 1 à 12', 'Analyser les mots 13 à 24', "Delai d'Inactivité", 'Type de Script', 'Sécurité', 'Auto-transfert ou monnaie (%d)\u2009:', 'Auto-transfert\u2009:', "Définissez d'abord un code de non compromis", 'Paramètres', 'Paramètres stockés en interne sur flash.', 'Paramètres stockés sur la carte SD.', 'Entropie de Shannon\u2009:', 'Éteindre', "Delai d'Arrêt", 'Arrêt en cours..', 'Signer', 'Signer avec le code QR', 'Signer sur la carte SD', 'Signer\u2009?', 'Signature', 'Message signé', 'PSBT signé', 'Signature..', 'Clé unique', 'Capacité\u2009:', 'Certains vérifications ne peuvent pas être effectués.', 'Dépense (%d)\u2009:', 'Dépense\u2009:', 'Statistiques pour les geeks', 'Stocker sur flash', 'Stocker sur la carte SD', 'Faites glisser pour changer de mode', 'TC Flash Hash', 'TC Flash Hash au démarrage', 'TOUCHEZ ou ENTRER pour capturer', 'TX Fiche', 'Code de non compromis', 'Code de non compromis défini avec succès', 'Les codes de non compromis ne correspondent pas', 'Texte', "The app will be copied to user's flash ", 'Thème', 'Thermique', "Pour assurer que les données soient irrécupérables, utilisez la fonctionnalité 'Effacer l'appareil'", 'Ajuster la luminosité', 'Outils', 'Sensibilité', 'Écran Tactile', 'Réessayer\u2009?', 'Entrez la phrase secrète BIP-39', 'Taper clé', 'Unité', 'Mise à jour complète.', 'Utilisez une surface de fond noire.', "Utilisez l'entropie de la caméra pour créer un nouveau mnémonique", 'Utilisé\u2009:', 'Utilisateur', 'Valeur %s hors de portée: [%s, %s]', 'La valeur doit être un multiple de %s', 'Vérification..', 'Version', 'Par caméra', 'Via D20', 'Via D6', 'Par saisie manuelle', 'Via Mots', 'Attendez la capture', 'Portefeuille', 'Descripteur de Portefeuille', 'Descripteur de sortie du portefeuille', 'Descripteur de sortie du portefeuille chargé\u2009!', 'Descripteur de sortie du portefeuille introuvable.', 'Avertissement\u2009:', 'Mot %d', 'Numéros de mots', 'Mots', 'Oui', 'Adresse non valide\u2009!', 'INTROUVABLE dans les %d premières adresses'] +translation_array = [ + "% du montant.", + "%d de %d multisignature", + "%d à %d", + "%s supprimé.", + "(%d au total)", + "(Expérimental)", + "(consultation)", + "12 mots", + "24 mots", + "À propos", + "Accepter supposition\u2009?", + "Compte", + "Le compte n °0 serait supposé", + "Index du compte", + "Ajoutez ou modifiez la phrase secrète\u2009?", + "Entropie supplémentaire de la caméra requise pour le mode AES-CBC", + "Adresse", + "Alignez correctement la caméra et plaque de sauvegarde.", + "Autoriser d'abord dans les paramètres !", + "Anti-éblouissement désactivé", + "Anti-éblouissement activé", + "Apparence", + "Es-tu sûr\u2009?", + "Couleurs BGR", + "Mnémonique BIP39", + "Retour", + "Retour au menu", + "Sauvegarde mnémonique", + "Signature non valide", + "Mot de passe Base64", + "Débit en bauds", + "Grille binaire", + "Rembourrage de bordure", + "Luminosité", + "Boutons", + "Anti-rebond des boutons", + "Capture annulée", + "Monnaie", + "Adresses de Monnaie", + "Changer de thème et redémarrer\u2009?", + "La monnaie\u2009:", + "Les modifications dureront jusqu'à l'arrêt.", + "Vérifiez la carte SD", + "Vérifiez que l'adresse appartient à ce portefeuille\u2009?", + "%d adresses vérifiées sans correspondance.", + "Vérification de la carte SD..", + "Confirmer le code de non compromis", + "Créer un code QR", + "Créer un code QR à partir d'un texte\u2009?", + "Créé\u2009:", + "Code de non compromis actuel", + "Code QR personnalisé", + "Personnaliser", + "La personnalisation de votre portefeuille générera une nouvelle clé.", + "Profondeur de coupe", + "Méthode de coupe", + "Décimal", + "Déchiffrer ?", + "Portefeuille par défaut", + "Profondeur par passage", + "Dériver l'entropie BIP85 ?", + "Adresses du descripteur", + "Affichage", + "Ne pas éteindre, cela peut prendre un certain temps.", + "Terminé\u2009?", + "Double mnémonique", + "Pilote", + "Vide", + "Activer les applications Krux", + "Chiffré", + "Code QR chiffré", + "Le mnémonique chiffré n'a pas été stocké", + "Mnémonique chiffré a été stocké avec ID\u2009:", + "Chiffrement", + "Mode de chiffrement", + "Entrez %d mots BIP-39.", + "Saisissez un code de non compromis de plus de 6 caractères", + "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre de 1 à 2048.", + "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en hexadécimal de 1 à 800.", + "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en octal de 1 à 4000.", + "Entrez chaque mot de votre mnémonique BIP-39.", + "Effacer les données de l'utilisateur", + "Effacement des données de l'utilisateur...", + "Erreur\u2009:", + "Esc", + "Exécuter une application Krux signée ?", + "Explorer des fichiers\u2009?", + "Exportation vers la carte SD..", + "Clé publique", + "Paramètres d'usine", + "Échec du déchiffrement", + "Échec du chargement PSBT", + "Échec du chargement d'adresse", + "Échec du chargement de la clé", + "Échec du chargement du message", + "Échec du chargement mnémonique", + "Échec du chargement du descripteur de sortie", + "Échec du chargement de la phrase secrète", + "Échec du stockage mnémonique", + "Frais\u2009:", + "Taux d'alimentation", + "Nom de fichier", + "Le nom de fichier %s existe sur la carte SD, écraser\u2009?", + "Remplir le flash avec l'entropie de la caméra ?", + "Remplissage du Flash", + "Empreinte digitale manquante dans PSBT", + "Le micrologiciel dépasse la taille maximale\u2009: %d", + "Plan du Flash", + "Outils Flash", + "Flash rempli par l'entropie de la caméra", + "Coordonnées X inversées", + "Diamètre de flûte", + "Libre\u2009:", + "Du stockage", + "Effacez complètement votre carte SD dans un autre appareil pour assurer que les données soient irrécupérables", + "Générer un mnémonique", + "Donnez à ce mnémonique un identifiant personnalisé\u2009? Sinon l'empreinte actuelle sera utilisée", + "OK", + "Bonne entropie", + "Matériel", + "Clé publique hexadécimale", + "Hexadécimal", + "Masquer les mnémoniques", + "Frais élevés\u2009!", + "Id existe déjà", + "Index", + "Index : %s", + "Entrées (%d)\u2009:", + "Installer\u2009?", + "Entropie insuffisante\u2009!", + "Entropie insuffisante", + "Code de non compromis non valide", + "Adresse invalide", + "Chargeur de démarrage invalide", + "Longueur mnémonique invalide", + "Clé publique non valide", + "Portefeuille invalide\u2009:", + "Inverser", + "Couleurs inversées", + "Clé", + "La clé n'a pas été fournie", + "Test de l'imprimante Krux QR", + "Type d'écran LCD", + "Langue", + "Laissez vide si vous souhaitez que Krux choisisse un dernier mot valide", + "Gauche", + "Longueur : %s", + "Délai de Ligne", + "Ligne\u2009:", + "Charger l'application Krux", + "Charger Mnémonique", + "Charger le portefeuille", + "Charger un descripteur de portefeuille de confiance pour afficher les adresses\u2009?", + "Charger depuis la carte SD", + "Charger depuis la carte SD\u2009?", + "Charger depuis la caméra", + "Charger\u2009?", + "Charger\u2009?", + "Activation de la Caméra..", + "Chargement des adresses de monnaie..", + "Activation de l'imprimante..", + "Chargement des adresses de réception ..", + "Chargement..", + "Paramètres régionaux", + "Emplacement", + "Longueur maximale dépassée (%s)", + "Message", + "Message\u2009:", + "Fichier de signature manquant", + "Mnémonique", + "ID Mnémonique", + "Mnémonique et phrase secrète seront conservés.", + "Mnémonique n'était pas chiffré", + "Modifié\u2009:", + "Multi\nsignature", + "Native Segwit - 84 serait supposé", + "Réseau", + "Nouveau Mnémonique", + "Nouveau micrologiciel détecté.", + "Non", + "Pas de phrase secrète", + "Pas assez de jets\u2009!", + "Nombres", + "Octale", + "Autres formats", + "Itér. PBKDF2", + "Noircissez les points perforés afin qu'ils puissent être détectés.", + "Largeur du papier", + "Partie", + "Taille de la pièce", + "Phrase secréte", + "Longueur du mot de passe", + "Inadéquation du chemin", + "Pattern détecté\u2009!", + "Supprimer définitivement tous les mnémoniques et paramètres chiffrés stockés dans le flash\u2009?", + "Persistance", + "Indice de déviation des pixels\u2009:", + "QR en Texte Brut", + "Veuillez charger un descripteur de sortie de portefeuille", + "Taux de plongée", + "Entropie faible", + "Entropie faible détectée\u2009!", + "Impression Test QR", + "Imprimer Tiny Seed\u2009?", + "Imprimer Code QR", + "Imprimer Code QR\u2009?", + "Imprimer\u2009?", + "Imprimante", + "Le pilote d'imprimante n'est pas défini\u2009!", + "Impression..", + "Procéder quand même\u2009?", + "Procéder\u2009?", + "Traitement..", + "Code QR", + "RX Fiche", + "Redémarrer", + "Recevoir", + "Adresses de Réception", + "Région\u2009:", + "Supprimer %s\u2009?", + "Supprimer mnémonique", + "Supprimer les fichiers micrologiciel de la carte SD\u2009?", + "Rés. - Format", + "Restaurer les paramètres d'usine et redémarrer\u2009?", + "Retour au visualiseur QR", + "Examinez les données numérisées, modifiez-les si nécessaire", + "À droite", + "Lancez le dé au moins %d fois pour générer un mnémonique.", + "Distribution des jets\u2009:", + "Jets\u2009:", + "Carte SD", + "Carte SD non détectée.", + "SHA256 de jets\u2009:", + "SHA256 de snapshot\u2009:", + "Enregistrer l'image QR sur la carte SD", + "Enregistrer sur la carte SD", + "Enregistrer sur la carte SD\u2009?", + "Enregistré sur la carte SD", + "L'échelle", + "Scannez l'adresse", + "Scannez la phrase secrète BIP-39", + "Scannez le Code QR de la clé", + "Analyser à nouveau les mots 1 à 12", + "Analyser les mots 13 à 24", + "Delai d'Inactivité", + "Type de Script", + "Sécurité", + "Auto-transfert ou monnaie (%d)\u2009:", + "Auto-transfert\u2009:", + "Définissez d'abord un code de non compromis", + "Paramètres", + "Paramètres stockés en interne sur flash.", + "Paramètres stockés sur la carte SD.", + "Entropie de Shannon\u2009:", + "Éteindre", + "Delai d'Arrêt", + "Arrêt en cours..", + "Signer", + "Signer avec le code QR", + "Signer sur la carte SD", + "Signer\u2009?", + "Signature", + "Message signé", + "PSBT signé", + "Signature..", + "Clé unique", + "Capacité\u2009:", + "Certains vérifications ne peuvent pas être effectués.", + "Dépense (%d)\u2009:", + "Dépense\u2009:", + "Statistiques pour les geeks", + "Stocker sur flash", + "Stocker sur la carte SD", + "Faites glisser pour changer de mode", + "TC Flash Hash", + "TC Flash Hash au démarrage", + "TOUCHEZ ou ENTRER pour capturer", + "TX Fiche", + "Code de non compromis", + "Code de non compromis défini avec succès", + "Les codes de non compromis ne correspondent pas", + "Texte", + "The app will be copied to user's flash ", + "Thème", + "Thermique", + "Pour assurer que les données soient irrécupérables, utilisez la fonctionnalité 'Effacer l'appareil'", + "Ajuster la luminosité", + "Outils", + "Sensibilité", + "Écran Tactile", + "Réessayer\u2009?", + "Entrez la phrase secrète BIP-39", + "Taper clé", + "Unité", + "Mise à jour complète.", + "Utilisez une surface de fond noire.", + "Utilisez l'entropie de la caméra pour créer un nouveau mnémonique", + "Utilisé\u2009:", + "Utilisateur", + "Valeur %s hors de portée: [%s, %s]", + "La valeur doit être un multiple de %s", + "Vérification..", + "Version", + "Par caméra", + "Via D20", + "Via D6", + "Par saisie manuelle", + "Via Mots", + "Attendez la capture", + "Portefeuille", + "Descripteur de Portefeuille", + "Descripteur de sortie du portefeuille", + "Descripteur de sortie du portefeuille chargé\u2009!", + "Descripteur de sortie du portefeuille introuvable.", + "Avertissement\u2009:", + "Mot %d", + "Numéros de mots", + "Mots", + "Oui", + "Adresse non valide\u2009!", + "INTROUVABLE dans les %d premières adresses", +] diff --git a/src/krux/translations/ja.py b/src/krux/translations/ja.py index dba82e696..e9abcb767 100644 --- a/src/krux/translations/ja.py +++ b/src/krux/translations/ja.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['% の金額.', '%d の%d マルチシグネチャ', '%d へ %d', '%s 削除されました.', '(%d トータル)', '(実験的)', '(閲覧専用)', '12の単語', '24の単語', '概要', '仮定を受け入れますか?', 'アカウント', 'アカウント#0は仮定されます', 'アカウントインデックス', 'ウォレットのパスフレーズを追加または変更しますか?', 'AES-CBCモードにはカメラからの追加エントロピーが必要です', 'アドレス', 'カメラとバックプレートを正しく整列させてください.', '最初に設定で許可してください!', 'アンチグレアが無効', 'アンチグレアが有効', '外観', 'よろしいですか?', 'BGRカラー', 'BIP39 Mnemonic', '戻る', 'メニューへ戻る', 'ニーモニックのバックアップ', '無効なサイン', 'Base64パスワード', 'Baudrate', 'バイナリグリッド', 'ボーダーパディング', '明るさ', 'ボタン', 'ボタンのデバウンス', 'キャプチャがキャンセルされました', 'お釣り', 'アドレス変更', 'テーマの変更と再起動しますか?', 'お釣り:', '変更はシャットダウンするまで持続します.', 'SDカードを確認する', 'このアドレスがこのウォレットに属しているか確認しますか?', '%d のアドレスを確認しましたが、一致するものはありませんでした.', 'SDカードを確認中..', '改ざんチェックコードの確認', 'QRコードを生成する', 'テキストからQRコードを作成しますか?', '作成されました:', '現在の改ざんチェックコード', 'カスタムQRコード', 'カスタマイズする', 'ウォレットをカスタマイズすると、新しいキーが生成されます.', 'カットの深さ', 'カット方法', 'デシマル', 'デクリプト?', 'デフォルトの財布', 'パスごとの深さ', 'BIP85エントロピーを導出しますか?', 'ディスクリプタアドレス', 'ディスプレイ', '完了するまで電源を切らないでください', '完了?', 'ダブルニーモニック', 'ドライバー', '空', 'Kruxアプリを有効にする', '暗号化されました', '暗号化されたQRコード', '暗号化されたニーモニックが保存されませんでした', '暗号化されたニーモニックがIDとともに保存されました:', '暗号化', '暗号化モード', '%d のBIP-39ワードを入力してください.', '6文字以上の改ざんチェックコードを入力してください', 'あなたのBIP-39ニーモニックの各単語を1から2048の番号で入力してください.', 'あなたのBIP-39ニーモニックの各単語を1から800の16進数で入力してください.', 'あなたのBIP-39ニーモニックの各単語を1から4000の8進数で入力してください.', 'あなたのBIP-39ニーモニックの各単語を入力してください.', 'ユーザーのデータを消去する', 'ユーザーのデータを消去しています..', 'エラー:', 'エスク', '署名入りのKruxアプリを実行しますか?', 'アーカイブ探索?', 'SDカードへのエクスポート..', '拡張公開キー', '初期設定', '復号化に失敗しました', 'PSBTのロードに失敗しました', 'アドレスの読み込みに失敗しました', 'キーのロードに失敗しました', 'メッセージの読み込みに失敗しました', 'mnemonicのロードに失敗しました', '出力記述子のロードに失敗しました', 'パスフレーズのロードに失敗しました', 'mnemonicの保存に失敗しました', '手数料:', 'フィードレート', 'ファイル名', 'ファイル名 %s が SD カードに存在します、上書きしますか?', 'カメラからのエントロピーでフラッシュを埋めますか?', 'フラッシュを充填中', 'PSBTでデジタル指紋が未設定', 'ファームウェアが最大サイズを超えました: %d', 'フラッシュマップ', 'Flashツール', 'カメラエントロピーで満たされたフラッシュ', 'X座標が反転しました', 'フルートディアメーター', 'フリー:', 'ストレージから', 'データが復元できないように、他のデバイスでSDカードを完全に消去してください', 'Mnemonicを生成する', 'このニーモニックにカスタムIDを付けますか?付けない場合は現在のフィンガープリントが使用されます', '行く', '良いentropy', 'ハードウェア', 'Hex公開キー', 'エクサデシマル', 'Mnemonicsを隠す', '高い手数料!', 'IDはすでに存在します', 'インデックス', 'インデックス:%s', 'インプット(%d):', 'インストールしますか?', '不十分なエントロピー!', '不十分なエントロピー', '無効な改ざんチェックコード', '無効なアドレス', '無効なブートローダー', '無効なニーモニックの長さ', '無効な公開キー', '無効なウォレット:', '反転する', '反転した色', 'キー', 'キーが提供されていません', 'KruxプリンターテストQR', 'LCDタイプ', '言語 ', '有効な最終単語をKruxに選んでもらいたい場合は、空白のままにしてください', '左', '長さ:%s', 'ライン遅延', 'ライン:', 'Kruxアプリを読み込む', 'ニーモニックをロード', 'ウォレットをロード', '信頼できるウォレット記述子をロードしてアドレスを表示しますか?', 'SDカードからロード ', 'SDカードからロードしますか?', 'カメラからロード', '1つをロードしますか?', 'ロードしますか?', 'カメラを読み込み中..', '変更アドレスを読み込み中..', 'プリンターを読み込み中..', '受信アドレスを読み込み中 ..', '読み込み中..', 'ロケール', '場所', '最大長を超えました (%s)', 'メッセージ', 'メッセージ:', '署名ファイルが欠落しています', 'Mnemonic', 'Mnemonic ID', 'Mnemonicとパスフレーズは保持されます.', 'Mnemonicは暗号化されていませんでした', '修正されました:', 'マルチシグ', 'ネイティブSegwit - 84が仮定されます', 'ネットワーク', '新しい Mnemonic', '新しいファームウェアが検出されました.', 'いいえ', 'パスフレーズなし', 'ロールが足りません!', '数字', 'Octal', '他のフォーマット', 'PBKDF2イテレーション', '検出できるように、穴あけされた点を黒く塗ってください.', '用紙幅 ', 'パーツ', 'パーツサイズ', 'パスワード', 'パスワードの長さ', 'パスの不一致', 'パターンが検出されました!', 'フラッシュからすべての保存された暗号化mnemonicsと設定を永久に削除しますか?', '永続させる', 'ピクセル偏差指数:', 'プレーンテキストQR', 'ウォレットの出力記述子をロードしてください', '沈下率', '低品質なエントロピー', '低品質なエントロピーが検出されました!', 'テストQRを印刷', '小さなシードを印刷しますか?', 'QRを印刷', 'QRを印刷しますか?', '印刷?', 'プリンター ', 'プリンタードライバーが設定されていません!', '印刷中..', 'そのまま進みますか?', '進みますか?', '処理中..', 'QRコード', 'RXピン', '再起動', '受け取る', '受取アドレス', '地域:', '%sを削除しますか?', 'ニーモニックを削除', 'SDカードからファームウェアファイルを削除しますか?', 'Res. - フォーマット', '初期化を復元して再起動しますか?', 'QRビューワーに戻る', 'スキャンしたデータを確認し、必要に応じて編集します', '右', 'mnemonicを生成するには、少なくとも%d回サイコロを振ってください.', 'ロールの分布:', 'ロール:', 'SDカード', 'SDカードが検出されません.', 'ロールのSHA256:', '画像のSHA256:', 'QR画像をSDカードに保存する', 'SDカードに保存する', 'SDカードに保存しますか?', 'SDカードに保存しました', 'スケール', 'アドレススキャン', 'BIP39パスフレーズをスキャンする', 'キーのQRコードをスキャンする', '単語1-12を再度スキャン中', '単語13-24をスキャン中', 'スクリーンセーバーの時間', 'スクリプトタイプ', 'セキュリティa', '自己転送または変更(%d):', '自己転送:', '最初に改ざんチェックコードを設定する', '設定', '設定はフラッシュメモリに内部保存されています.', '設定はSDカードに保存されています.', 'シャノンのエントロピー:', 'シャットダウン', 'シャットダウン時間', 'シャットダウン中..', '署名', 'QRコードにサインする', 'SDカードにサインする', 'サインしますか?', 'サイン', 'サイン付きメッセージ', 'サインされたPSBT', 'サインしてます..', 'シングルサイン', 'サイズ:', '一部のチェックを実行できません.', '支出(%d):', '支出:', 'オタクのための統計', 'フラッシュに保存する', 'SDカードに保存する', 'スワイプしてモードを変更する', 'TCフラッシュハッシュ', '起動時のTCフラッシュハッシュ', 'タッチまたはENTERでキャプチャする', 'TXピン', '改ざんチェックコード', '改ざんチェックコードが正常に設定されました', '改ざんチェックコードが一致しません', 'テキスト', "The app will be copied to user's flash ", 'テーマ', 'サーマル', 'データが復元不可能であることを確実にするには、デバイス消去機能を使用してください', '明るさを切り替える', 'ツール', 'タッチスレッショルド', 'タッチスクリーン', 'もっと試してみますか?', 'BIP39パスフレーズを入力してください', 'キーを入力する', 'ユニット', 'アップグレードが完了しました.', '黒い背景面を使用してください.', 'カメラのエントロピーを使用して新しいmnemonicを作成してください', '使用済み:', 'ユーザーのデータ', '値%sが範囲外です: [ %s, %s]', '値は%sの倍数でなければなりません', '確認中..', 'バージョン', 'カメラ経由', 'D20経由', 'D6経由', '手動入力経由', '言葉経由', 'キャプチャを待ってください', 'ワレット', 'ウォレットディスクリプター', 'ウォレット出力ディスクリプター', 'ウォレット出力ディスクリプターがロードされました!', 'ウォレット出力ディスクリプターが見つかりません.', '警告:', '単語 %d', '単語番号', '単語', 'はい', '有効なアドレスです!', '最初の%dアドレスに見つかりませんでした'] +translation_array = [ + "% の金額.", + "%d の%d マルチシグネチャ", + "%d へ %d", + "%s 削除されました.", + "(%d トータル)", + "(実験的)", + "(閲覧専用)", + "12の単語", + "24の単語", + "概要", + "仮定を受け入れますか?", + "アカウント", + "アカウント#0は仮定されます", + "アカウントインデックス", + "ウォレットのパスフレーズを追加または変更しますか?", + "AES-CBCモードにはカメラからの追加エントロピーが必要です", + "アドレス", + "カメラとバックプレートを正しく整列させてください.", + "最初に設定で許可してください!", + "アンチグレアが無効", + "アンチグレアが有効", + "外観", + "よろしいですか?", + "BGRカラー", + "BIP39 Mnemonic", + "戻る", + "メニューへ戻る", + "ニーモニックのバックアップ", + "無効なサイン", + "Base64パスワード", + "Baudrate", + "バイナリグリッド", + "ボーダーパディング", + "明るさ", + "ボタン", + "ボタンのデバウンス", + "キャプチャがキャンセルされました", + "お釣り", + "アドレス変更", + "テーマの変更と再起動しますか?", + "お釣り:", + "変更はシャットダウンするまで持続します.", + "SDカードを確認する", + "このアドレスがこのウォレットに属しているか確認しますか?", + "%d のアドレスを確認しましたが、一致するものはありませんでした.", + "SDカードを確認中..", + "改ざんチェックコードの確認", + "QRコードを生成する", + "テキストからQRコードを作成しますか?", + "作成されました:", + "現在の改ざんチェックコード", + "カスタムQRコード", + "カスタマイズする", + "ウォレットをカスタマイズすると、新しいキーが生成されます.", + "カットの深さ", + "カット方法", + "デシマル", + "デクリプト?", + "デフォルトの財布", + "パスごとの深さ", + "BIP85エントロピーを導出しますか?", + "ディスクリプタアドレス", + "ディスプレイ", + "完了するまで電源を切らないでください", + "完了?", + "ダブルニーモニック", + "ドライバー", + "空", + "Kruxアプリを有効にする", + "暗号化されました", + "暗号化されたQRコード", + "暗号化されたニーモニックが保存されませんでした", + "暗号化されたニーモニックがIDとともに保存されました:", + "暗号化", + "暗号化モード", + "%d のBIP-39ワードを入力してください.", + "6文字以上の改ざんチェックコードを入力してください", + "あなたのBIP-39ニーモニックの各単語を1から2048の番号で入力してください.", + "あなたのBIP-39ニーモニックの各単語を1から800の16進数で入力してください.", + "あなたのBIP-39ニーモニックの各単語を1から4000の8進数で入力してください.", + "あなたのBIP-39ニーモニックの各単語を入力してください.", + "ユーザーのデータを消去する", + "ユーザーのデータを消去しています..", + "エラー:", + "エスク", + "署名入りのKruxアプリを実行しますか?", + "アーカイブ探索?", + "SDカードへのエクスポート..", + "拡張公開キー", + "初期設定", + "復号化に失敗しました", + "PSBTのロードに失敗しました", + "アドレスの読み込みに失敗しました", + "キーのロードに失敗しました", + "メッセージの読み込みに失敗しました", + "mnemonicのロードに失敗しました", + "出力記述子のロードに失敗しました", + "パスフレーズのロードに失敗しました", + "mnemonicの保存に失敗しました", + "手数料:", + "フィードレート", + "ファイル名", + "ファイル名 %s が SD カードに存在します、上書きしますか?", + "カメラからのエントロピーでフラッシュを埋めますか?", + "フラッシュを充填中", + "PSBTでデジタル指紋が未設定", + "ファームウェアが最大サイズを超えました: %d", + "フラッシュマップ", + "Flashツール", + "カメラエントロピーで満たされたフラッシュ", + "X座標が反転しました", + "フルートディアメーター", + "フリー:", + "ストレージから", + "データが復元できないように、他のデバイスでSDカードを完全に消去してください", + "Mnemonicを生成する", + "このニーモニックにカスタムIDを付けますか?付けない場合は現在のフィンガープリントが使用されます", + "行く", + "良いentropy", + "ハードウェア", + "Hex公開キー", + "エクサデシマル", + "Mnemonicsを隠す", + "高い手数料!", + "IDはすでに存在します", + "インデックス", + "インデックス:%s", + "インプット(%d):", + "インストールしますか?", + "不十分なエントロピー!", + "不十分なエントロピー", + "無効な改ざんチェックコード", + "無効なアドレス", + "無効なブートローダー", + "無効なニーモニックの長さ", + "無効な公開キー", + "無効なウォレット:", + "反転する", + "反転した色", + "キー", + "キーが提供されていません", + "KruxプリンターテストQR", + "LCDタイプ", + "言語 ", + "有効な最終単語をKruxに選んでもらいたい場合は、空白のままにしてください", + "左", + "長さ:%s", + "ライン遅延", + "ライン:", + "Kruxアプリを読み込む", + "ニーモニックをロード", + "ウォレットをロード", + "信頼できるウォレット記述子をロードしてアドレスを表示しますか?", + "SDカードからロード ", + "SDカードからロードしますか?", + "カメラからロード", + "1つをロードしますか?", + "ロードしますか?", + "カメラを読み込み中..", + "変更アドレスを読み込み中..", + "プリンターを読み込み中..", + "受信アドレスを読み込み中 ..", + "読み込み中..", + "ロケール", + "場所", + "最大長を超えました (%s)", + "メッセージ", + "メッセージ:", + "署名ファイルが欠落しています", + "Mnemonic", + "Mnemonic ID", + "Mnemonicとパスフレーズは保持されます.", + "Mnemonicは暗号化されていませんでした", + "修正されました:", + "マルチシグ", + "ネイティブSegwit - 84が仮定されます", + "ネットワーク", + "新しい Mnemonic", + "新しいファームウェアが検出されました.", + "いいえ", + "パスフレーズなし", + "ロールが足りません!", + "数字", + "Octal", + "他のフォーマット", + "PBKDF2イテレーション", + "検出できるように、穴あけされた点を黒く塗ってください.", + "用紙幅 ", + "パーツ", + "パーツサイズ", + "パスワード", + "パスワードの長さ", + "パスの不一致", + "パターンが検出されました!", + "フラッシュからすべての保存された暗号化mnemonicsと設定を永久に削除しますか?", + "永続させる", + "ピクセル偏差指数:", + "プレーンテキストQR", + "ウォレットの出力記述子をロードしてください", + "沈下率", + "低品質なエントロピー", + "低品質なエントロピーが検出されました!", + "テストQRを印刷", + "小さなシードを印刷しますか?", + "QRを印刷", + "QRを印刷しますか?", + "印刷?", + "プリンター ", + "プリンタードライバーが設定されていません!", + "印刷中..", + "そのまま進みますか?", + "進みますか?", + "処理中..", + "QRコード", + "RXピン", + "再起動", + "受け取る", + "受取アドレス", + "地域:", + "%sを削除しますか?", + "ニーモニックを削除", + "SDカードからファームウェアファイルを削除しますか?", + "Res. - フォーマット", + "初期化を復元して再起動しますか?", + "QRビューワーに戻る", + "スキャンしたデータを確認し、必要に応じて編集します", + "右", + "mnemonicを生成するには、少なくとも%d回サイコロを振ってください.", + "ロールの分布:", + "ロール:", + "SDカード", + "SDカードが検出されません.", + "ロールのSHA256:", + "画像のSHA256:", + "QR画像をSDカードに保存する", + "SDカードに保存する", + "SDカードに保存しますか?", + "SDカードに保存しました", + "スケール", + "アドレススキャン", + "BIP39パスフレーズをスキャンする", + "キーのQRコードをスキャンする", + "単語1-12を再度スキャン中", + "単語13-24をスキャン中", + "スクリーンセーバーの時間", + "スクリプトタイプ", + "セキュリティa", + "自己転送または変更(%d):", + "自己転送:", + "最初に改ざんチェックコードを設定する", + "設定", + "設定はフラッシュメモリに内部保存されています.", + "設定はSDカードに保存されています.", + "シャノンのエントロピー:", + "シャットダウン", + "シャットダウン時間", + "シャットダウン中..", + "署名", + "QRコードにサインする", + "SDカードにサインする", + "サインしますか?", + "サイン", + "サイン付きメッセージ", + "サインされたPSBT", + "サインしてます..", + "シングルサイン", + "サイズ:", + "一部のチェックを実行できません.", + "支出(%d):", + "支出:", + "オタクのための統計", + "フラッシュに保存する", + "SDカードに保存する", + "スワイプしてモードを変更する", + "TCフラッシュハッシュ", + "起動時のTCフラッシュハッシュ", + "タッチまたはENTERでキャプチャする", + "TXピン", + "改ざんチェックコード", + "改ざんチェックコードが正常に設定されました", + "改ざんチェックコードが一致しません", + "テキスト", + "The app will be copied to user's flash ", + "テーマ", + "サーマル", + "データが復元不可能であることを確実にするには、デバイス消去機能を使用してください", + "明るさを切り替える", + "ツール", + "タッチスレッショルド", + "タッチスクリーン", + "もっと試してみますか?", + "BIP39パスフレーズを入力してください", + "キーを入力する", + "ユニット", + "アップグレードが完了しました.", + "黒い背景面を使用してください.", + "カメラのエントロピーを使用して新しいmnemonicを作成してください", + "使用済み:", + "ユーザーのデータ", + "値%sが範囲外です: [ %s, %s]", + "値は%sの倍数でなければなりません", + "確認中..", + "バージョン", + "カメラ経由", + "D20経由", + "D6経由", + "手動入力経由", + "言葉経由", + "キャプチャを待ってください", + "ワレット", + "ウォレットディスクリプター", + "ウォレット出力ディスクリプター", + "ウォレット出力ディスクリプターがロードされました!", + "ウォレット出力ディスクリプターが見つかりません.", + "警告:", + "単語 %d", + "単語番号", + "単語", + "はい", + "有効なアドレスです!", + "最初の%dアドレスに見つかりませんでした", +] diff --git a/src/krux/translations/ko.py b/src/krux/translations/ko.py index c10435048..e9b4adda1 100644 --- a/src/krux/translations/ko.py +++ b/src/krux/translations/ko.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['수량: %', '%d의 %d 멀티시그', '%d 부터 %d', '%s 제거되었습니다.', '(총 %d)', '(실험적 기능)', '(잔액조회 전용)', '12단어', '24단어', '기본 정보', '가정을 수락하시겠습니까?', '계정', '계정 #0이 가정됩니다', '계정 인덱스', '패스프레이즈를 추가하거나 변경하시겠습니까?', 'AES-CBC 모드를 위해 카메라의 추가 엔트로피가 필요합니다', '주소', '카메라와 보조 플레이트를 올바르게 정렬하십시오.', '먼저 설정에서 허용하세요!', '눈부심방지 비활성화', '눈부심방지 활성화', '디스플레이', '계속하시겠습니까?', 'BGR 색상', 'BIP39 니뫠닉', '뒤로', '메뉴로 돌아가기', '니모닉 백업', '잘못된 서명', 'Base64 비밀번호', 'Baudrate', '이진수 그리드', '테두리 여백', '밝기', '버튼', '버튼 바운스 방지', '캡처 취소됨', '잔돈', '잔돈 주소', '테마를 변경하고 재부팅하시겠습니까?', '변경', '변경 사항은 종료될때까지 유지됩니다.', 'SD카드 확인', '해당 주소가 이 지갑에 속하는지 확인하시겠습니까?', '일치하는 주소가 없는 %d 개를 확인했습니다.', 'SD카드 확인 중..', '탬퍼 체크 코드 확인', 'QR 코드 생성', '텍스트로부터 QR코드를 생성하시겠습니까?', '생성됨:', '현재 탬퍼 체크 코드', '사용자 정의 QR코드', '사용자 정의', '지갑을 커스터마이징하면 새로운 비밀키가 생성됩니다.', 'Cut Depth', 'Cut Method', '10진수', '복호화하시겠습니까?', '지갑 기본설정', 'Depth Per Pass', 'BIP85 엔트로피를 유독하시겠습니까?', '디스크립터 주소', '디스플레이', '전원을 끄지 마십시오. 완료하는 데 시간이 걸릴 수 있습니다.', '완료되었습니까?', '이중 니모닉', '드라이버', '비어 있음', 'Krux 앱 활성화', '암호화 후 저장', '암호화된 QR 코드', '암호화된 니모닉을 저장하지 못했습니다', '암호화된 니모닉을 다음 아이디와 함께 저장했습니다:', '암호화', '암호화 모드', '%d개의 BIP-39 단어를 입력하십시오.', '6자 이상의 탬퍼 체크 코드를 입력하세요', 'BIP-39 니모닉의 각 단어를 1에서 2048 사이의 숫자로 입력하십시오.', 'BIP-39 니모닉의 각 단어를 1에서 800 사이의 16진수 숫자로 입력하십시오.', 'BIP-39 니모닉의 각 단어를 1에서 4000 사이의 8진수 숫자로 입력하십시오.', 'BIP-39 니모닉의 각 단어를 입력하십시오.', '사용자 데이터 지우기', '사용자의 데이터를 지우는 중...', '오류:', 'Esc', '서명된 Krux 앱을 실행하시겠습니까?', '파일을 탐색하시겠습니까?', 'SD카드로 내보내는 중..', 'XPUB 내보내기', '공장 초기 설정', '복호화에 실패했습니다', 'PSBT를 불러오지 못했습니다', '주소를 불러오지 못했습니다', '키 로드에 실패했습니다', '메시지를 불러오지 못했습니다', '니모닉을 불러오지 못했습니다', '아웃풋 디스크립터를 불러오지 못했습니다', '패스프레이즈를 불러오지 못했습니다', '니모닉을 저장하지 못했습니다', '수수료:', 'Feed Rate', '파일명', '%s 파일명이 SD카드에 이미 존재합니다. 덮어쓰시겠습니까?', '카메라의 엔트로피로 플래시를 채우시겠습니까?', '플래시 채우기', 'PSBT에서 지문이 설정되지 않았습니다', '펌웨어가 최대 크기를 초과했습니다: %d', '플래시 맵', '플래시 도구', '카메라 엔트로피로 가득 찬 플래시', 'X 좌표 반전', '플루트 직경', '여유 공간:', '저장공간에서 불러오기', '다른 장치에서 데이터 복구가 불가능하도록 SD카드를 완전히 지우십시오', '니모닉 생성', '이 니모닉에 별도 아이디를 지정하시겠습니까? 지정하지 않으면 현재 지문을 사용합니다', '선택', '엔트로피가 충분합니다', '하드웨어', '16진수 공개키', '16진수', '니모닉 숨기기', '수수료가 높습니다!', '아이디가 이미 존재합니다', '인덱스', '인덱스: %s', 'Input (%d):', '설치하시겠습니까?', '엔트로피가 충분하지 않습니다!', '엔트로피가 충분하지 않습니다', '유효하지 않은 탬퍼 체크 코드', '주소가 잘못되었습니다', '부트로더가 잘못되었습니다', '니모닉 길이가 잘못되었습니다', '공개키가 잘못되었습니다', '지갑이 잘못되었습니다:', '반전', '반전된 색상', '키', '키가 제공되지 않았습니다', 'Krux 프린터 테스트 QR', 'LCD 유형', '언어', '마지막 단어를 Krux가 선택하도록 하려면 비워두십시오', '왼쪽', '길이: %s', '줄 지연', '줄:', 'Krux 앱 로드', '니모닉 불러오기', '이대로 불러오기', '주소를 보기위해 신뢰할 수 있는 월렛 디스크립터를 불러오시겠습니까?', 'SD카드에서 불러오기', 'SD카드에서 불러오시겠습니까?', '카메라로 불러오기', '불러오시겠습니까?', '불러오시겠습니까?', '카메라를 구동 중입니다..', '잔돈 주소를 불러옵니다..', '프린터를 로딩 중입니다..', '수신 주소 불러옵니다..', '로딩 중..', '언어 설정', '기본 저장소', '최대 길이를 초과함 (%s)', '메시지', '메시지:', '서명 파일이 누락되었습니다', '니모닉', '니모닉 ID', '니모닉과 암호는 유지됩니다.', '니모닉이 암호화되지 않았습니다', '수정되었습니다:', '멀티시그', '네이티브 세그윗 - BIP84를 적용합니다', '네트워크', '새로운 니모닉', '새로운 펌웨어가 감지되었습니다.', '아니요', '패스프레이즈 없음', '주사위 횟수가 충분하지 않습니다!', '시드문구 순번', '8진수', '기타 형식', 'PBKDF2 Iter.', '카메라가 감지할 수 있도록 펀치된 점을 검게 칠하십시오.', '종이 너비', '파트', '파트 사이즈', '패스프레이즈', '비밀번호 길이', '경로 불일치', '패턴이 감지되었습니다!', '저장된 모든 니모닉 및 설정값을 영구적으로 제거하시겠습니까?', '저장', '픽셀 편차 지수:', '일반텍스트 QR', '지갑 출력 디스크립터를 불러오십시오', '침수율', '엔트로피가 부족합니다', '엔트로피가 부족합니다!', 'QR 테스트 인쇄', 'Tiny Seed를 인쇄하시겠습니까?', 'QR로 인쇄', 'QR로 인쇄하시겠습니까?', '인쇄하시겠습니까?', '프린터', '프린터 드라이버가 설정되지 않았습니다!', '출력중', '계속하시겠습니까?', '계속하시겠습니까?', '처리...', 'QR 코드', 'RX 핀', '다시 반복', '받기', '주소', '지역:', '%s을 제거하시겠습니까?', '니모닉 제거', 'SD카드에서 펌웨어 파일을 제거하시겠습니까?', 'Res. - 형식', '공장 설정을 복원하고 재부팅하시겠습니까?', 'QR 뷰어로 돌아가기', '스캔된 데이터를 검토하고 필요한 경우 수정하십시오', '오른쪽', '니모닉을 생성하려면 주사위를 최소 %d번 굴리십시오.', '주사위값 분포:', '주사위 횟수:', 'SD카드', 'SD카드가 감지되지 않았습니다.', '주사위의 SHA256:', 'SHA256 스냅샷:', 'QR 이미지를 SD카드에 저장', 'SD카드에 저장', 'SD카드에 저장하시겠습니까?', 'SD카드에 저장됨', '스케일', '주소 스캔하기', 'BIP39 패스프레이즈 스캔하기', '비밀번호 QR 스캔', '1번째부터 12번째 단어를 스캔 중입니다', '13번째부터 24번째 단어를 스캔 중입니다', '화면보호기 시간', '지갑 형식', '보안', '본인주소 전송 또는 잔돈 (%d):', '자가 이체:', '먼저 탬퍼 체크 코드를 설정하세요.', '설정', '설정은 플래시에서 내부적으로 저장됩니다.', 'SD 카드에 저장된 설정.', 'Shannon의 엔트로피:', '종료', '자동 종료시간', '종료 중..', '서명하기', 'QR코드로 내보내기', 'SD카드로 내보내기', '서명하시겠습니까?', '서명', '서명된 메시지', '서명된 PSBT', '서명 중..', '단일서명', '크기:', '일부 검사를 수행할 수 없습니다.', 'Spend (%d):', '지출', '전문가를 위한 통계', '플래시 메모리에 저장', 'SD카드에 저장', '모드를 변경하려면 화면을 옆으로 쓸어내리세요', 'TC Flash Hash', '부팅 시 플래시 탬퍼 확인 해시', '터치하거나 엔터를 눌러 캡처하십시오', 'TX 핀', '탬퍼 체크 코드', '탬퍼 검사 코드가 성공적으로 설정되었습니다', '탬퍼 검사 코드가 일치하지 않습니다', '텍스트', "The app will be copied to user's flash ", '테마', 'Thermal', '데이터 복구가 불가능하도록 장치 전체지우기 기능을 사용하십시오', '밝기 전환', '도구', '터치 민감도', '터치스크린', '더 하시겠습니까?', 'BIP39 패스프레이즈 입력', '비밀번호 입력', '단위', '업그레이드가 완료되었습니다', '검은색 배경 화면을 사용하십시오.', '카메라의 엔트로피를 사용하여 새로운 니모닉을 생성하십시오', '이미 사용됨:', '사용자 데이터', '%s는 [%s, %s] 범위를 벗어났습니다', '값은 %s의 배수여야 합니다', '검증 중..', '버전', '카메라', '20면체 주사위', '일반 주사위', '직접 입력', '니모닉 단어 입력', '캡처될때까지 기다리십시오', '지갑 설정', '지갑 디스크립터', '지갑 출력 디스크립터', '지갑 출력 디스크립터가 로드되었습니다!', '지갑 출력 디스크립터를 찾을 수 없습니다.', '경고:', '%d 단어', '단어 번호(1-2048)', '시드문구', '예', '는 유효한 주소입니다!', '첫 번째 %d개의 주소에서 찾을 수 없습니다'] +translation_array = [ + "수량: %", + "%d의 %d 멀티시그", + "%d 부터 %d", + "%s 제거되었습니다.", + "(총 %d)", + "(실험적 기능)", + "(잔액조회 전용)", + "12단어", + "24단어", + "기본 정보", + "가정을 수락하시겠습니까?", + "계정", + "계정 #0이 가정됩니다", + "계정 인덱스", + "패스프레이즈를 추가하거나 변경하시겠습니까?", + "AES-CBC 모드를 위해 카메라의 추가 엔트로피가 필요합니다", + "주소", + "카메라와 보조 플레이트를 올바르게 정렬하십시오.", + "먼저 설정에서 허용하세요!", + "눈부심방지 비활성화", + "눈부심방지 활성화", + "디스플레이", + "계속하시겠습니까?", + "BGR 색상", + "BIP39 니뫠닉", + "뒤로", + "메뉴로 돌아가기", + "니모닉 백업", + "잘못된 서명", + "Base64 비밀번호", + "Baudrate", + "이진수 그리드", + "테두리 여백", + "밝기", + "버튼", + "버튼 바운스 방지", + "캡처 취소됨", + "잔돈", + "잔돈 주소", + "테마를 변경하고 재부팅하시겠습니까?", + "변경", + "변경 사항은 종료될때까지 유지됩니다.", + "SD카드 확인", + "해당 주소가 이 지갑에 속하는지 확인하시겠습니까?", + "일치하는 주소가 없는 %d 개를 확인했습니다.", + "SD카드 확인 중..", + "탬퍼 체크 코드 확인", + "QR 코드 생성", + "텍스트로부터 QR코드를 생성하시겠습니까?", + "생성됨:", + "현재 탬퍼 체크 코드", + "사용자 정의 QR코드", + "사용자 정의", + "지갑을 커스터마이징하면 새로운 비밀키가 생성됩니다.", + "Cut Depth", + "Cut Method", + "10진수", + "복호화하시겠습니까?", + "지갑 기본설정", + "Depth Per Pass", + "BIP85 엔트로피를 유독하시겠습니까?", + "디스크립터 주소", + "디스플레이", + "전원을 끄지 마십시오. 완료하는 데 시간이 걸릴 수 있습니다.", + "완료되었습니까?", + "이중 니모닉", + "드라이버", + "비어 있음", + "Krux 앱 활성화", + "암호화 후 저장", + "암호화된 QR 코드", + "암호화된 니모닉을 저장하지 못했습니다", + "암호화된 니모닉을 다음 아이디와 함께 저장했습니다:", + "암호화", + "암호화 모드", + "%d개의 BIP-39 단어를 입력하십시오.", + "6자 이상의 탬퍼 체크 코드를 입력하세요", + "BIP-39 니모닉의 각 단어를 1에서 2048 사이의 숫자로 입력하십시오.", + "BIP-39 니모닉의 각 단어를 1에서 800 사이의 16진수 숫자로 입력하십시오.", + "BIP-39 니모닉의 각 단어를 1에서 4000 사이의 8진수 숫자로 입력하십시오.", + "BIP-39 니모닉의 각 단어를 입력하십시오.", + "사용자 데이터 지우기", + "사용자의 데이터를 지우는 중...", + "오류:", + "Esc", + "서명된 Krux 앱을 실행하시겠습니까?", + "파일을 탐색하시겠습니까?", + "SD카드로 내보내는 중..", + "XPUB 내보내기", + "공장 초기 설정", + "복호화에 실패했습니다", + "PSBT를 불러오지 못했습니다", + "주소를 불러오지 못했습니다", + "키 로드에 실패했습니다", + "메시지를 불러오지 못했습니다", + "니모닉을 불러오지 못했습니다", + "아웃풋 디스크립터를 불러오지 못했습니다", + "패스프레이즈를 불러오지 못했습니다", + "니모닉을 저장하지 못했습니다", + "수수료:", + "Feed Rate", + "파일명", + "%s 파일명이 SD카드에 이미 존재합니다. 덮어쓰시겠습니까?", + "카메라의 엔트로피로 플래시를 채우시겠습니까?", + "플래시 채우기", + "PSBT에서 지문이 설정되지 않았습니다", + "펌웨어가 최대 크기를 초과했습니다: %d", + "플래시 맵", + "플래시 도구", + "카메라 엔트로피로 가득 찬 플래시", + "X 좌표 반전", + "플루트 직경", + "여유 공간:", + "저장공간에서 불러오기", + "다른 장치에서 데이터 복구가 불가능하도록 SD카드를 완전히 지우십시오", + "니모닉 생성", + "이 니모닉에 별도 아이디를 지정하시겠습니까? 지정하지 않으면 현재 지문을 사용합니다", + "선택", + "엔트로피가 충분합니다", + "하드웨어", + "16진수 공개키", + "16진수", + "니모닉 숨기기", + "수수료가 높습니다!", + "아이디가 이미 존재합니다", + "인덱스", + "인덱스: %s", + "Input (%d):", + "설치하시겠습니까?", + "엔트로피가 충분하지 않습니다!", + "엔트로피가 충분하지 않습니다", + "유효하지 않은 탬퍼 체크 코드", + "주소가 잘못되었습니다", + "부트로더가 잘못되었습니다", + "니모닉 길이가 잘못되었습니다", + "공개키가 잘못되었습니다", + "지갑이 잘못되었습니다:", + "반전", + "반전된 색상", + "키", + "키가 제공되지 않았습니다", + "Krux 프린터 테스트 QR", + "LCD 유형", + "언어", + "마지막 단어를 Krux가 선택하도록 하려면 비워두십시오", + "왼쪽", + "길이: %s", + "줄 지연", + "줄:", + "Krux 앱 로드", + "니모닉 불러오기", + "이대로 불러오기", + "주소를 보기위해 신뢰할 수 있는 월렛 디스크립터를 불러오시겠습니까?", + "SD카드에서 불러오기", + "SD카드에서 불러오시겠습니까?", + "카메라로 불러오기", + "불러오시겠습니까?", + "불러오시겠습니까?", + "카메라를 구동 중입니다..", + "잔돈 주소를 불러옵니다..", + "프린터를 로딩 중입니다..", + "수신 주소 불러옵니다..", + "로딩 중..", + "언어 설정", + "기본 저장소", + "최대 길이를 초과함 (%s)", + "메시지", + "메시지:", + "서명 파일이 누락되었습니다", + "니모닉", + "니모닉 ID", + "니모닉과 암호는 유지됩니다.", + "니모닉이 암호화되지 않았습니다", + "수정되었습니다:", + "멀티시그", + "네이티브 세그윗 - BIP84를 적용합니다", + "네트워크", + "새로운 니모닉", + "새로운 펌웨어가 감지되었습니다.", + "아니요", + "패스프레이즈 없음", + "주사위 횟수가 충분하지 않습니다!", + "시드문구 순번", + "8진수", + "기타 형식", + "PBKDF2 Iter.", + "카메라가 감지할 수 있도록 펀치된 점을 검게 칠하십시오.", + "종이 너비", + "파트", + "파트 사이즈", + "패스프레이즈", + "비밀번호 길이", + "경로 불일치", + "패턴이 감지되었습니다!", + "저장된 모든 니모닉 및 설정값을 영구적으로 제거하시겠습니까?", + "저장", + "픽셀 편차 지수:", + "일반텍스트 QR", + "지갑 출력 디스크립터를 불러오십시오", + "침수율", + "엔트로피가 부족합니다", + "엔트로피가 부족합니다!", + "QR 테스트 인쇄", + "Tiny Seed를 인쇄하시겠습니까?", + "QR로 인쇄", + "QR로 인쇄하시겠습니까?", + "인쇄하시겠습니까?", + "프린터", + "프린터 드라이버가 설정되지 않았습니다!", + "출력중", + "계속하시겠습니까?", + "계속하시겠습니까?", + "처리...", + "QR 코드", + "RX 핀", + "다시 반복", + "받기", + "주소", + "지역:", + "%s을 제거하시겠습니까?", + "니모닉 제거", + "SD카드에서 펌웨어 파일을 제거하시겠습니까?", + "Res. - 형식", + "공장 설정을 복원하고 재부팅하시겠습니까?", + "QR 뷰어로 돌아가기", + "스캔된 데이터를 검토하고 필요한 경우 수정하십시오", + "오른쪽", + "니모닉을 생성하려면 주사위를 최소 %d번 굴리십시오.", + "주사위값 분포:", + "주사위 횟수:", + "SD카드", + "SD카드가 감지되지 않았습니다.", + "주사위의 SHA256:", + "SHA256 스냅샷:", + "QR 이미지를 SD카드에 저장", + "SD카드에 저장", + "SD카드에 저장하시겠습니까?", + "SD카드에 저장됨", + "스케일", + "주소 스캔하기", + "BIP39 패스프레이즈 스캔하기", + "비밀번호 QR 스캔", + "1번째부터 12번째 단어를 스캔 중입니다", + "13번째부터 24번째 단어를 스캔 중입니다", + "화면보호기 시간", + "지갑 형식", + "보안", + "본인주소 전송 또는 잔돈 (%d):", + "자가 이체:", + "먼저 탬퍼 체크 코드를 설정하세요.", + "설정", + "설정은 플래시에서 내부적으로 저장됩니다.", + "SD 카드에 저장된 설정.", + "Shannon의 엔트로피:", + "종료", + "자동 종료시간", + "종료 중..", + "서명하기", + "QR코드로 내보내기", + "SD카드로 내보내기", + "서명하시겠습니까?", + "서명", + "서명된 메시지", + "서명된 PSBT", + "서명 중..", + "단일서명", + "크기:", + "일부 검사를 수행할 수 없습니다.", + "Spend (%d):", + "지출", + "전문가를 위한 통계", + "플래시 메모리에 저장", + "SD카드에 저장", + "모드를 변경하려면 화면을 옆으로 쓸어내리세요", + "TC Flash Hash", + "부팅 시 플래시 탬퍼 확인 해시", + "터치하거나 엔터를 눌러 캡처하십시오", + "TX 핀", + "탬퍼 체크 코드", + "탬퍼 검사 코드가 성공적으로 설정되었습니다", + "탬퍼 검사 코드가 일치하지 않습니다", + "텍스트", + "The app will be copied to user's flash ", + "테마", + "Thermal", + "데이터 복구가 불가능하도록 장치 전체지우기 기능을 사용하십시오", + "밝기 전환", + "도구", + "터치 민감도", + "터치스크린", + "더 하시겠습니까?", + "BIP39 패스프레이즈 입력", + "비밀번호 입력", + "단위", + "업그레이드가 완료되었습니다", + "검은색 배경 화면을 사용하십시오.", + "카메라의 엔트로피를 사용하여 새로운 니모닉을 생성하십시오", + "이미 사용됨:", + "사용자 데이터", + "%s는 [%s, %s] 범위를 벗어났습니다", + "값은 %s의 배수여야 합니다", + "검증 중..", + "버전", + "카메라", + "20면체 주사위", + "일반 주사위", + "직접 입력", + "니모닉 단어 입력", + "캡처될때까지 기다리십시오", + "지갑 설정", + "지갑 디스크립터", + "지갑 출력 디스크립터", + "지갑 출력 디스크립터가 로드되었습니다!", + "지갑 출력 디스크립터를 찾을 수 없습니다.", + "경고:", + "%d 단어", + "단어 번호(1-2048)", + "시드문구", + "예", + "는 유효한 주소입니다!", + "첫 번째 %d개의 주소에서 찾을 수 없습니다", +] diff --git a/src/krux/translations/nl.py b/src/krux/translations/nl.py index 6db4fca42..0ff481863 100644 --- a/src/krux/translations/nl.py +++ b/src/krux/translations/nl.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['% van het bedrag.', '%d van %d multisig', '%d tot %d', '%s verwijderd.', '(%d totaal)', '(Experimenteel)', '(alleen inzien)', '12 woorden', '24 woorden', 'Over', 'Aanname accepteren?', 'Account', 'Account #0 zou worden aangenomen', 'Accountindex', 'Wachtwoordzin voor portemonnee toevoegen of wijzigen?', 'Extra entropie van de camera vereist voor AES-CBC-modus', 'Adres', 'Richt de camera en back-upplaat op de juiste manier.', 'Sta eerst instellingen toe!', 'Anti reflecterend uitgeschakeld', 'Anti reflecterend ingeschakeld', 'Uiterlijk', 'Weet je het zeker?', 'BGR-kleuren', 'BIP39 Mnemonic', 'Terug', 'Terug naar menu', 'Backup geheugensteun', 'Ongeldige handtekening', 'Base64-wachtwoord', 'Baudratio', 'Binair raster', 'Rand opvulling', 'Helderheid', 'Knoppen', 'Debounce van knoppen', 'Opname geannuleerd', 'Change', 'Wisselgeldadres', 'Thema veranderen en opnieuw opstarten?', 'Wisselgeld:', 'Wijzigingen blijven van kracht tot afsluiten.', 'Controleer SD kaart', 'Controleer of dit adres bij deze portemonnee hoort?', '%d adressen gecontroleerd zonder overeenkomsten.', 'SD kaart controleren..', 'Bevestig de sabotagecontrolecode', 'QR code maken', 'QR code maken van tekst?', 'Aangemaakt:', 'Huidige sabotagecontrolecode', 'Aangepaste QR code', 'Aanpassen', 'Bij aanpassen van de portemonnee zal er een nieuwe sleutel gegenereerd worden.', 'Snijdiepte', 'Snijmethode', 'Decimaal', 'Ontsleutelen?', 'Standaard portemonnee', 'Diepte per pas', 'BIP85-entropie afleiden?', 'Descriptoradressen', 'Weergave', 'Schakel het apparaat niet uit, het kan even duren voordat het klaar is.', 'Klaar?', 'Dubbel geheugensteuntje', 'Driver', 'Leeg', 'Krux-apps inschakelen', 'Versleuteld', 'Versleutelde QR code', 'Versleutelde geheugensteun was niet opgeslagen', 'Versleutelde geheugensteun is opgeslagen met ID:', 'Versleutelen', 'Versleutel modus', 'Voer %d BIP-39 woorden in.', 'Voer een sabotagecontrolecode van 6 of meer tekens in', 'Voer elk woord van jouw BIP-39 geheugensteun in als een nummer van 1 tot 2048.', 'Voer elk woord van jouw BIP-39 geheugensteun in als een hexadecimaal van 1 tot 800.', 'Voer elk woord van jouw BIP-39 geheugensteun in als een octaal van 1 tot 4000.', 'Voer elk woord van jouw BIP-39 geheugensteun in.', 'Gegevens van gebruiker wissen', 'Gegevens van gebruiker wissen..', 'Fout:', 'Esc', 'Een ondertekende Krux-app uitvoeren?', 'Bestanden verkennen?', 'Exporteren naar SD kaart..', 'Uitgebreide publieke sleutel', 'Fabrieksinstellingen', 'Ontsleutelen is niet gelukt', 'PSBT laden is niet gelukt', 'Adres laden is niet gelukt', 'Sleutel laden is niet gelukt', 'Bericht laden is niet gelukt', 'Geheugensteun laden is niet gelukt', 'Descriptor laden is niet gelukt', 'Wachtwoord laden is niet gelukt', 'Geheugensteun opslaan is niet gelukt', 'Tarief:', 'Voedingssnelheid', 'Bestandsnaam', 'Bestandsnaam %s OVERSCHRIJVEN op SD kaart?', 'De flash vullen met entropie van de camera?', 'Flash vullen', 'Vingerafdruk niet ingesteld in PSBT', 'Firmware overschrijdt de maximale grootte: %d', 'Flash Map', 'Flash Tools', 'Flash gevuld met camera-entropie', 'Geflipte X-coördinaten', 'Fluit diameter', 'Vrij:', 'Uit data-opslag', 'Wis uw SD kaart volledig in een ander apparaat om te zorgen dat de gegevens onherstelbaar zijn', 'Geheugensteun genereren', 'Eigen ID gebruiken voor geheugensteun? Anders vingerafdruk gebruiken', 'Ga', 'Goede entropie', 'Hardware', 'Hex publieke sleutel', 'Hexadecimaal', 'Verberg geheugensteunen', 'Hoge kosten!', 'ID bestaat al', 'Index', 'Index: %s', 'Invoer (%d):', 'Installeren?', 'Onvoldoende Entropie!', 'Onvoldoende entropie', 'Ongeldige sabotagecontrolecode', 'Ongeldig adres', 'Ongeldige bootloader', 'Ongeldige geheugensteun lengte', 'Ongeldige publieke sleutel', 'Ongeldige portemonnee:', 'Omkeren', 'Omgekeerde kleuren', 'Sleutel', 'Sleutel niet verstrekt', 'Krux printer test QR', 'LCD-type', 'Taal', 'Laat leeg als je wilt dat Krux een geldig laatste woord kiest', 'Links', 'Lengte: %s', 'Lijn vertraging', 'Lijn:', 'Krux-app laden', 'Geheugensteun laden', 'Portemonnee laden', 'Een vertrouwde portemonnee descriptor laden om adressen te bekijken?', 'Laden vanaf SD kaart', 'Laden vanaf SD kaart?', 'Laden van camera', 'Laden?', 'Laden?', 'Camera laden..', 'Wijzigingsadressen laden..', 'Laadprinter..', 'Ontvangstadressen laden..', 'Laden..', 'Taal', 'Opslaglocatie', 'Maximale lengte overschreden (%s)', 'Bericht', 'Bericht:', 'Handtekening bestand mist', 'Geheugensteun', 'Geheugensteun ID', 'Geheugensteun en wachtwoord worden bewaard.', 'Geheugensteun is niet versleuteld', 'Aangepast:', 'Multisig', 'Native Segwit - 84 zal worden gebruikt', 'Netwerk', 'Geheugensteun aanmaken', 'Nieuwe firmware gevonden.', 'Nee', 'Geen wachtwoordzin', 'Niet genoeg gedobbeld!', 'Nummers', 'Octaal', 'Andere indelingen', 'PBKDF2 iter.', 'Maak geperforeerde stippen zwart zodat ze worden gedetecteerd.', 'Papier breedte', 'Deel', 'Deel grootte', 'Wachtwoord', 'Wachtwoordlengte:', 'Pad komt niet overeen', 'Patroon gevonden!', 'Alle opgeslagen versleutelde mnemonics en instellingen permanent uit het flashgeheugen verwijderen?', 'Opslag', 'Pixelafwijkingsindex:', 'Platte tekst QR', 'Laadt een portemonnee descriptor in', 'Duik tarief', 'Slechte entropie', 'Lage entropie gedetecteerd!', 'Test QR afdrukken', 'Tiny Seed afdrukken?', 'Afdrukken naar QR', 'Afdrukken naar QR?', 'Afdrukken?', 'Printer', 'Printer driver niet ingesteld!', 'Afdrukken..', 'Toch doorgaan?', 'Doorgaan?', 'Verwerken..', 'QR code', 'RX pin', 'Opnieuw opstarten', 'Ontvangen', 'Ontvangstadres', 'Regio:', 'Verwijderen %s?', 'Geheugensteun verwijderen', 'Firmwarebestanden van SD kaart verwijderen?', 'Res. - Formaat', 'Fabrieksinstellingen herstellen en opnieuw opstarten?', 'Terug naar QR-lezer', 'Controleer gescande gegevens en bewerk indien nodig', 'Rechts', 'Dobbel een dobbelsteen minstens %d keer voor het genereren van een geheugensteun.', 'Roldistributie:', 'Gedobbeld:', 'SD kaart', 'SD kaart niet gedetecteerd.', 'Gedobbelde SHA256:', 'Momentopname van SHA256:', 'QR-afbeelding opslaan op SD kaart', 'Opslaan op SD kaart', 'Opslaan op SD kaart?', 'Opgeslagen op SD kaart', 'Schaal', 'Adres scannen', 'BIP-39 Wachtwoord Scannen', 'QR Code Sleutel Scannen', 'Woorden 1 t/m 12 opnieuw scannen', 'Woorden 13 t/m 24 scannen', 'Schermbeveiligingstijd', 'Scripttype', 'Beveiliging', 'Overschrijving naar jezelf, of wisselgeld (%d):', 'Zelf overschrijving:', 'Stel eerst een sabotagecontrolecode in', 'Instellingen', 'Instellingen intern opgeslagen op flitser.', 'Instellingen opgeslagen op SD kaart.', "Shannon's entropie:", 'Afsluiten', 'Uitschakelingstijd:', 'Bezig met afsluiten..', 'Ondertekenen', 'Teken op QR-code', 'Teken op SD kaart', 'Ondertekenen?', 'Handtekening', 'Bericht ondertekend', 'PSBT ondertekend', 'Ondertekenen..', 'Enkele sleutel', 'Grootte:', 'Sommige controles kunnen niet worden uitgevoerd.', 'Uitgaven (%d):', 'Uitgaven:', 'Statistieken voor nerds', 'Opslaan op apparaat', 'Opslaan op SD kaart', 'Verander modus', 'TC Flash Hash', 'Hash Flash bij het opstarten', 'TIK of ENTER voor opname', 'TX pin', 'Sabotagecontrolecode', 'Sabotagecontrolecode succesvol ingesteld', 'Sabotagecontrolecodes komen niet overeen', 'Tekst', "The app will be copied to user's flash ", 'Thema', 'Thermisch', "Gebruik de functie 'Apparaat wissen' om te zorgen dat de gegevens onherstelbaar zijn", 'Helderheid schakelen', 'Hulpmiddelen', 'Aanraak gevoeligheid', 'Aanraakscherm', 'Meer proberen?', 'Voer een BIP-39 wachtwoord in', 'Voer sleutel in', 'Eenheid', 'Upgrade afgerond.', 'Gebruik een donker achergrond.', 'Gebruik de camera als entropie voor het aanmaken van een nieuwe geheugensteun', 'Gebruikt:', 'Gebruiker', 'Waarde %s is buiten bereik: [%s, %s]', 'Waarde moet meerdere van %s zijn', 'Bezig met verifiëren..', 'Versie', 'Via camera', 'Via D20', 'Via D6', 'Via handmatige invoer', 'Via woorden', 'Wacht op opname', 'Portemonnee', 'Descriptor', 'Portemonnee descriptor', 'Portemonnee descriptor geladen!', 'Portemonnee descriptor niet gevonden.', 'Waarschuwing:', 'Woord %d', 'Woord nummers', 'Woorden', 'Yes', 'is geen geldig adres', 'werd NIET GEVONDEN in de eerste %d adressen'] +translation_array = [ + "% van het bedrag.", + "%d van %d multisig", + "%d tot %d", + "%s verwijderd.", + "(%d totaal)", + "(Experimenteel)", + "(alleen inzien)", + "12 woorden", + "24 woorden", + "Over", + "Aanname accepteren?", + "Account", + "Account #0 zou worden aangenomen", + "Accountindex", + "Wachtwoordzin voor portemonnee toevoegen of wijzigen?", + "Extra entropie van de camera vereist voor AES-CBC-modus", + "Adres", + "Richt de camera en back-upplaat op de juiste manier.", + "Sta eerst instellingen toe!", + "Anti reflecterend uitgeschakeld", + "Anti reflecterend ingeschakeld", + "Uiterlijk", + "Weet je het zeker?", + "BGR-kleuren", + "BIP39 Mnemonic", + "Terug", + "Terug naar menu", + "Backup geheugensteun", + "Ongeldige handtekening", + "Base64-wachtwoord", + "Baudratio", + "Binair raster", + "Rand opvulling", + "Helderheid", + "Knoppen", + "Debounce van knoppen", + "Opname geannuleerd", + "Change", + "Wisselgeldadres", + "Thema veranderen en opnieuw opstarten?", + "Wisselgeld:", + "Wijzigingen blijven van kracht tot afsluiten.", + "Controleer SD kaart", + "Controleer of dit adres bij deze portemonnee hoort?", + "%d adressen gecontroleerd zonder overeenkomsten.", + "SD kaart controleren..", + "Bevestig de sabotagecontrolecode", + "QR code maken", + "QR code maken van tekst?", + "Aangemaakt:", + "Huidige sabotagecontrolecode", + "Aangepaste QR code", + "Aanpassen", + "Bij aanpassen van de portemonnee zal er een nieuwe sleutel gegenereerd worden.", + "Snijdiepte", + "Snijmethode", + "Decimaal", + "Ontsleutelen?", + "Standaard portemonnee", + "Diepte per pas", + "BIP85-entropie afleiden?", + "Descriptoradressen", + "Weergave", + "Schakel het apparaat niet uit, het kan even duren voordat het klaar is.", + "Klaar?", + "Dubbel geheugensteuntje", + "Driver", + "Leeg", + "Krux-apps inschakelen", + "Versleuteld", + "Versleutelde QR code", + "Versleutelde geheugensteun was niet opgeslagen", + "Versleutelde geheugensteun is opgeslagen met ID:", + "Versleutelen", + "Versleutel modus", + "Voer %d BIP-39 woorden in.", + "Voer een sabotagecontrolecode van 6 of meer tekens in", + "Voer elk woord van jouw BIP-39 geheugensteun in als een nummer van 1 tot 2048.", + "Voer elk woord van jouw BIP-39 geheugensteun in als een hexadecimaal van 1 tot 800.", + "Voer elk woord van jouw BIP-39 geheugensteun in als een octaal van 1 tot 4000.", + "Voer elk woord van jouw BIP-39 geheugensteun in.", + "Gegevens van gebruiker wissen", + "Gegevens van gebruiker wissen..", + "Fout:", + "Esc", + "Een ondertekende Krux-app uitvoeren?", + "Bestanden verkennen?", + "Exporteren naar SD kaart..", + "Uitgebreide publieke sleutel", + "Fabrieksinstellingen", + "Ontsleutelen is niet gelukt", + "PSBT laden is niet gelukt", + "Adres laden is niet gelukt", + "Sleutel laden is niet gelukt", + "Bericht laden is niet gelukt", + "Geheugensteun laden is niet gelukt", + "Descriptor laden is niet gelukt", + "Wachtwoord laden is niet gelukt", + "Geheugensteun opslaan is niet gelukt", + "Tarief:", + "Voedingssnelheid", + "Bestandsnaam", + "Bestandsnaam %s OVERSCHRIJVEN op SD kaart?", + "De flash vullen met entropie van de camera?", + "Flash vullen", + "Vingerafdruk niet ingesteld in PSBT", + "Firmware overschrijdt de maximale grootte: %d", + "Flash Map", + "Flash Tools", + "Flash gevuld met camera-entropie", + "Geflipte X-coördinaten", + "Fluit diameter", + "Vrij:", + "Uit data-opslag", + "Wis uw SD kaart volledig in een ander apparaat om te zorgen dat de gegevens onherstelbaar zijn", + "Geheugensteun genereren", + "Eigen ID gebruiken voor geheugensteun? Anders vingerafdruk gebruiken", + "Ga", + "Goede entropie", + "Hardware", + "Hex publieke sleutel", + "Hexadecimaal", + "Verberg geheugensteunen", + "Hoge kosten!", + "ID bestaat al", + "Index", + "Index: %s", + "Invoer (%d):", + "Installeren?", + "Onvoldoende Entropie!", + "Onvoldoende entropie", + "Ongeldige sabotagecontrolecode", + "Ongeldig adres", + "Ongeldige bootloader", + "Ongeldige geheugensteun lengte", + "Ongeldige publieke sleutel", + "Ongeldige portemonnee:", + "Omkeren", + "Omgekeerde kleuren", + "Sleutel", + "Sleutel niet verstrekt", + "Krux printer test QR", + "LCD-type", + "Taal", + "Laat leeg als je wilt dat Krux een geldig laatste woord kiest", + "Links", + "Lengte: %s", + "Lijn vertraging", + "Lijn:", + "Krux-app laden", + "Geheugensteun laden", + "Portemonnee laden", + "Een vertrouwde portemonnee descriptor laden om adressen te bekijken?", + "Laden vanaf SD kaart", + "Laden vanaf SD kaart?", + "Laden van camera", + "Laden?", + "Laden?", + "Camera laden..", + "Wijzigingsadressen laden..", + "Laadprinter..", + "Ontvangstadressen laden..", + "Laden..", + "Taal", + "Opslaglocatie", + "Maximale lengte overschreden (%s)", + "Bericht", + "Bericht:", + "Handtekening bestand mist", + "Geheugensteun", + "Geheugensteun ID", + "Geheugensteun en wachtwoord worden bewaard.", + "Geheugensteun is niet versleuteld", + "Aangepast:", + "Multisig", + "Native Segwit - 84 zal worden gebruikt", + "Netwerk", + "Geheugensteun aanmaken", + "Nieuwe firmware gevonden.", + "Nee", + "Geen wachtwoordzin", + "Niet genoeg gedobbeld!", + "Nummers", + "Octaal", + "Andere indelingen", + "PBKDF2 iter.", + "Maak geperforeerde stippen zwart zodat ze worden gedetecteerd.", + "Papier breedte", + "Deel", + "Deel grootte", + "Wachtwoord", + "Wachtwoordlengte:", + "Pad komt niet overeen", + "Patroon gevonden!", + "Alle opgeslagen versleutelde mnemonics en instellingen permanent uit het flashgeheugen verwijderen?", + "Opslag", + "Pixelafwijkingsindex:", + "Platte tekst QR", + "Laadt een portemonnee descriptor in", + "Duik tarief", + "Slechte entropie", + "Lage entropie gedetecteerd!", + "Test QR afdrukken", + "Tiny Seed afdrukken?", + "Afdrukken naar QR", + "Afdrukken naar QR?", + "Afdrukken?", + "Printer", + "Printer driver niet ingesteld!", + "Afdrukken..", + "Toch doorgaan?", + "Doorgaan?", + "Verwerken..", + "QR code", + "RX pin", + "Opnieuw opstarten", + "Ontvangen", + "Ontvangstadres", + "Regio:", + "Verwijderen %s?", + "Geheugensteun verwijderen", + "Firmwarebestanden van SD kaart verwijderen?", + "Res. - Formaat", + "Fabrieksinstellingen herstellen en opnieuw opstarten?", + "Terug naar QR-lezer", + "Controleer gescande gegevens en bewerk indien nodig", + "Rechts", + "Dobbel een dobbelsteen minstens %d keer voor het genereren van een geheugensteun.", + "Roldistributie:", + "Gedobbeld:", + "SD kaart", + "SD kaart niet gedetecteerd.", + "Gedobbelde SHA256:", + "Momentopname van SHA256:", + "QR-afbeelding opslaan op SD kaart", + "Opslaan op SD kaart", + "Opslaan op SD kaart?", + "Opgeslagen op SD kaart", + "Schaal", + "Adres scannen", + "BIP-39 Wachtwoord Scannen", + "QR Code Sleutel Scannen", + "Woorden 1 t/m 12 opnieuw scannen", + "Woorden 13 t/m 24 scannen", + "Schermbeveiligingstijd", + "Scripttype", + "Beveiliging", + "Overschrijving naar jezelf, of wisselgeld (%d):", + "Zelf overschrijving:", + "Stel eerst een sabotagecontrolecode in", + "Instellingen", + "Instellingen intern opgeslagen op flitser.", + "Instellingen opgeslagen op SD kaart.", + "Shannon's entropie:", + "Afsluiten", + "Uitschakelingstijd:", + "Bezig met afsluiten..", + "Ondertekenen", + "Teken op QR-code", + "Teken op SD kaart", + "Ondertekenen?", + "Handtekening", + "Bericht ondertekend", + "PSBT ondertekend", + "Ondertekenen..", + "Enkele sleutel", + "Grootte:", + "Sommige controles kunnen niet worden uitgevoerd.", + "Uitgaven (%d):", + "Uitgaven:", + "Statistieken voor nerds", + "Opslaan op apparaat", + "Opslaan op SD kaart", + "Verander modus", + "TC Flash Hash", + "Hash Flash bij het opstarten", + "TIK of ENTER voor opname", + "TX pin", + "Sabotagecontrolecode", + "Sabotagecontrolecode succesvol ingesteld", + "Sabotagecontrolecodes komen niet overeen", + "Tekst", + "The app will be copied to user's flash ", + "Thema", + "Thermisch", + "Gebruik de functie 'Apparaat wissen' om te zorgen dat de gegevens onherstelbaar zijn", + "Helderheid schakelen", + "Hulpmiddelen", + "Aanraak gevoeligheid", + "Aanraakscherm", + "Meer proberen?", + "Voer een BIP-39 wachtwoord in", + "Voer sleutel in", + "Eenheid", + "Upgrade afgerond.", + "Gebruik een donker achergrond.", + "Gebruik de camera als entropie voor het aanmaken van een nieuwe geheugensteun", + "Gebruikt:", + "Gebruiker", + "Waarde %s is buiten bereik: [%s, %s]", + "Waarde moet meerdere van %s zijn", + "Bezig met verifiëren..", + "Versie", + "Via camera", + "Via D20", + "Via D6", + "Via handmatige invoer", + "Via woorden", + "Wacht op opname", + "Portemonnee", + "Descriptor", + "Portemonnee descriptor", + "Portemonnee descriptor geladen!", + "Portemonnee descriptor niet gevonden.", + "Waarschuwing:", + "Woord %d", + "Woord nummers", + "Woorden", + "Yes", + "is geen geldig adres", + "werd NIET GEVONDEN in de eerste %d adressen", +] diff --git a/src/krux/translations/pt.py b/src/krux/translations/pt.py index ca000953c..144159f0a 100644 --- a/src/krux/translations/pt.py +++ b/src/krux/translations/pt.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['% do valor.', '%d da %d multisig', '%d a %d', '%s removido.', '(%d total)', '(Experimental)', '(Somente visualização)', '12 palavras', '24 palavras', 'Sobre', 'Aceitar suposições?', 'Conta', 'A conta #0 seria assumida', 'Índice da Conta', 'Adicionar ou alterar senha da carteira?', 'Entropia adicional da câmera necessária para o modo AES-CBC', 'Endereço', 'Alinhe a câmera e a placa de backup corretamente.', 'Permita nas configurações primeiro!', 'Antirreflexo desativado', 'Antirreflexo ativado', 'Aparência', 'Tem certeza?', 'Cores BGR', 'Mnemônico BIP39', 'Voltar', 'Voltar ao Menu', 'Backup de Mnemônico', 'Assinatura Inválida', 'Senha Base64', 'Baudrate', 'Grade binária', 'Borda', 'Brilho', 'Botões', 'Debounce dos Botões', 'Captura cancelada', 'Troco', 'Endereços de Troco', 'Mudar o tema e reiniciar?', 'Troco:', 'Alterações só durarão até o desligamento.', 'Verifique o cartão SD', 'Verificar se este endereço pertence a carteira?', 'Verificado %d endereços sem correspondências.', 'Verificando o cartão SD..', 'Confirmar Código', 'Gerar Código QR', 'Gerar código QR do texto?', 'Criado:', 'Código Atual', 'Código QR Customizado', 'Customizar', 'Personalizar sua carteira gerará uma nova chave.', 'Profundidade de Corte', 'Método de Corte', 'Decimal', 'Descriptografar?', 'Carteira Padrão', 'Profundidade da Passagem', 'Derivar entropia BIP85?', 'Endereços do Descritor', 'Display', 'Não desligue, pode demorar um pouco para concluir.', 'Feito?', 'Duplo mnemônico', 'Driver', 'Vazio', 'Ativar Krux app', 'Criptografado', 'Código QR Criptografado', 'Mnemonic criptografado não foi armazenado', 'Mnemônico criptografado foi armazenado com ID:', 'Criptografia', 'Modo de Criptografia', 'Insira %d palavras BIP-39.', 'Insira um código de verificação com mais de 6 caracteres', 'Digite o número de cada palavra do seu mnemônico BIP-39, de 1 a 2048.', 'Digite o número de cada palavra do seu mnemônico BIP-39 como um número em hexadecimal, de 1 a 800.', 'Digite o número de cada palavra do seu mnemônico BIP-39 como um número em octal, de 1 a 4000.', 'Digite cada palavra do seu mnemônico BIP-39.', 'Apagar Dados do Usuário', 'Apagando os dados do usuário..', 'Erro:', 'Esc', 'Executar um Krux app assinado?', 'Explorar arquivos?', 'Exportando para o cartão SD..', 'Chave Pública Estendida', 'Configurações de Fábrica', 'Falhou em descriptografar', 'Falhou ao carregar PSBT', 'Falhou ao carregar endereço', 'Falha ao carregar a chave', 'Falhou ao carregar mensagem', 'Falhou ao carregar mnemônico', 'Falha ao carregar o descritor de saída', 'Falha ao carregar a senha', 'Falhou ao armazenar mnemônico', 'Taxa:', 'Taxa de Alimentação', 'Nome do arquivo', 'O nome do arquivo %s existe no cartão SD, substituir?', 'Preencher a flash com entropia da câmera?', 'Preenchendo a Flash', 'Impressão digital não definida no PSBT', 'Firmware excede o tamanho máximo: %d', 'Mapa da Flash', 'Ferramentas da Flash', 'Flash preenchida com entropia da câmera', 'Coordenadas X invertidas', 'Diâmetro da Fresa', 'Livre:', 'Do Armazenamento', 'Apague totalmente seu cartão SD em outro dispositivo para garantir que os dados sejam irrecuperáveis', 'Gerar Mnemônico', 'Dê a este mnemônico um ID personalizado? Caso contrário, a impressão digital atual será usada', 'Ir', 'Boa entropia', 'Hardware', 'Chave pública hexadecimal', 'Hexadecimal', 'Ocultar Mnemônicos', 'Taxas altas!', 'Id já existe', 'Índice', 'Índice: %s', 'Entradas (%d):', 'Instalar?', 'Entropia insuficiente!', 'Entropia insuficiente', 'Código de verificação inválido', 'Endereço inválido', 'Bootloader inválido', 'Comprimento de mnemônico inválido', 'Chave pública inválida', 'Carteira inválida:', 'Invertido', 'Cores invertidas', 'Chave', 'A chave não foi fornecida', 'Teste de impressão de QR krux', 'Tipo de LCD', 'Língua', 'Deixe em branco se quiser que o Krux escolha uma palavra final válida', 'Esquerda', 'Comprimento: %s', 'Atraso de Linha', 'Linha:', 'Carregar Krux app', 'Carregar Mnemônico', 'Carregar Carteira', 'Carregar um descritor de carteira confiável para visualizar endereços?', 'Carregar do cartão SD', 'Carregar do cartão SD?', 'Carregar da câmera', 'Carregar um?', 'Carregar?', 'Carregando Câmera..', 'Carregando endereços de troco..', 'Carregando impressora..', 'Carregando endereços de recebimento..', 'Carregando..', 'Idioma', 'Local', 'Comprimento máximo excedido (%s)', 'Mensagem', 'Mensagem:', 'Arquivo de assinatura faltando', 'Mnemônico', 'ID do mnemônico', 'Mnemônico e senha serão mantidos.', 'Mnemônico não foi criptografado', 'Modificado:', 'Multisig', 'Segwit nativo - 84 seria assumido', 'Rede', 'Novo Mnemônico', 'Novo firmware detectado.', 'Não', 'Sem Senha', 'Jogadas insuficientes!', 'Números', 'Octal', 'Outros Formatos', 'Iter. PBKDF2', 'Pinte os pontos perfurados de preto para que possam ser detectados.', 'Largura do papel', 'Parte', 'Tamanho da peça', 'Senha', 'Comprimento da Senha', 'Incompatibilidade de caminho', 'Padrão detectado!', 'Remover permanentemente todos os mnemônicos criptografados e configurações armazenados da memória flash?', 'Salvar', 'Índice de desvio de pixels:', 'QR em Texto', 'Carregue um descritor da carteira', 'Taxa de Mergulho', 'Entropia fraca', 'Baixa entropia detectada!', 'Imprimir QR de teste', 'Imprimir Tiny Seed?', 'Imprimir QR', 'Imprimir QR?', 'Imprimir?', 'Impressora', 'Driver de impressora não está definido!', 'Imprimindo..', 'Continuar mesmo assim?', 'Seguir?', 'Processando..', 'Código QR', 'Pino RX', 'Reiniciar', 'Recebimento', 'Endereços de Recebimento', 'Região:', 'Excluir %s?', 'Excluir Mnemônico', 'Remover arquivos de firmware do cartão SD?', 'Res. - Formato', 'Restaurar as configurações de fábrica e reiniciar?', 'Retornar ao Visualizador de QR', 'Revise os dados, edite se necessário', 'Direita', 'Role o dado pelo menos %d vezes para gerar um mnemônico.', 'Distribuição de jogadas:', 'Jogadas:', 'Cartão SD', 'Cartão SD não detectado.', 'SHA256 de jogadas:', 'Sha256 da imagem:', 'Salvar imagem do QR no cartão SD', 'Salvar no cartão SD', 'Salvar no cartão SD?', 'Salvo no cartão SD', 'Escala', 'Escanear Endereço', 'Escanear a senha BIP39', 'Escanear Código QR da Chave', 'Escaneando as palavras 1-12 novamente', 'Escaneando as palavras 13-24', 'Tempo para protetor de tela', 'Tipo de Script', 'Segurança', 'Autotransferência ou Troco (%d):', 'Autotransferência:', 'Defina um código de verificação primeiro', 'Configurações', 'Configurações armazenadas internamente no flash.', 'Configurações armazenadas no cartão SD.', 'Entropia de Shannon:', 'Desligar', 'Tempo de desligamento', 'Desligando..', 'Assinar', 'Assinar para código QR', 'Assinar para cartão SD', 'Assinar?', 'Assinatura', 'Mensagem Assinada', 'PSBT Assinada', 'Assinando..', 'Single-sig', 'Total:', 'Algumas verificações não podem ser realizadas.', 'Gastos (%d):', 'Gasto:', 'Estatísticas para Nerds', 'Armazene na Flash', 'Armazene no Cartão SD', 'Deslize para mudar de modo', 'TC Flash Hash', 'TC Hash Flash na Inicialização', 'TOQUE ou ENTER para capturar', 'Pino TX', 'Código de Verificação', 'Código de verificação definido com sucesso', 'Os códigos de verificação não correspondem', 'Texto', "The app will be copied to user's flash ", 'Tema', 'Térmica', 'Para garantir que os dados sejam irrecuperáveis, use o recurso Limpar Dispositivo', 'Alternar brilho', 'Ferramentas', 'Limiar de Toque', 'Touchscreen', 'Tentar mais?', 'Digitar a senha BIP39', 'Digite a Chave', 'Unidade', 'Atualização completa.', 'Use uma superfície de fundo preta.', 'Use a entropia da câmera para criar um novo mnemônico', 'Usado:', 'Usuário', 'Valor %s fora do alcance: [ %s, %s]', 'O valor deve ser múltiplo de %s', 'Verificando..', 'Versão', 'Pela Câmera', 'Via D20', 'Via D6', 'Por entrada manual', 'Via Palavras', 'Aguarde a captura', 'Carteira', 'Descritor de Carteira', 'Descritor da carteira', 'Descritor de saída da carteira carregado!', 'O descritor de saída da carteira não foi encontrado.', 'Aviso:', 'Palavra %d', 'Números das Palavras', 'Palavras', 'Sim', 'é um endereço válido!', 'NÃO FOI ENCONTRADO nos primeiros %d endereços'] +translation_array = [ + "% do valor.", + "%d da %d multisig", + "%d a %d", + "%s removido.", + "(%d total)", + "(Experimental)", + "(Somente visualização)", + "12 palavras", + "24 palavras", + "Sobre", + "Aceitar suposições?", + "Conta", + "A conta #0 seria assumida", + "Índice da Conta", + "Adicionar ou alterar senha da carteira?", + "Entropia adicional da câmera necessária para o modo AES-CBC", + "Endereço", + "Alinhe a câmera e a placa de backup corretamente.", + "Permita nas configurações primeiro!", + "Antirreflexo desativado", + "Antirreflexo ativado", + "Aparência", + "Tem certeza?", + "Cores BGR", + "Mnemônico BIP39", + "Voltar", + "Voltar ao Menu", + "Backup de Mnemônico", + "Assinatura Inválida", + "Senha Base64", + "Baudrate", + "Grade binária", + "Borda", + "Brilho", + "Botões", + "Debounce dos Botões", + "Captura cancelada", + "Troco", + "Endereços de Troco", + "Mudar o tema e reiniciar?", + "Troco:", + "Alterações só durarão até o desligamento.", + "Verifique o cartão SD", + "Verificar se este endereço pertence a carteira?", + "Verificado %d endereços sem correspondências.", + "Verificando o cartão SD..", + "Confirmar Código", + "Gerar Código QR", + "Gerar código QR do texto?", + "Criado:", + "Código Atual", + "Código QR Customizado", + "Customizar", + "Personalizar sua carteira gerará uma nova chave.", + "Profundidade de Corte", + "Método de Corte", + "Decimal", + "Descriptografar?", + "Carteira Padrão", + "Profundidade da Passagem", + "Derivar entropia BIP85?", + "Endereços do Descritor", + "Display", + "Não desligue, pode demorar um pouco para concluir.", + "Feito?", + "Duplo mnemônico", + "Driver", + "Vazio", + "Ativar Krux app", + "Criptografado", + "Código QR Criptografado", + "Mnemonic criptografado não foi armazenado", + "Mnemônico criptografado foi armazenado com ID:", + "Criptografia", + "Modo de Criptografia", + "Insira %d palavras BIP-39.", + "Insira um código de verificação com mais de 6 caracteres", + "Digite o número de cada palavra do seu mnemônico BIP-39, de 1 a 2048.", + "Digite o número de cada palavra do seu mnemônico BIP-39 como um número em hexadecimal, de 1 a 800.", + "Digite o número de cada palavra do seu mnemônico BIP-39 como um número em octal, de 1 a 4000.", + "Digite cada palavra do seu mnemônico BIP-39.", + "Apagar Dados do Usuário", + "Apagando os dados do usuário..", + "Erro:", + "Esc", + "Executar um Krux app assinado?", + "Explorar arquivos?", + "Exportando para o cartão SD..", + "Chave Pública Estendida", + "Configurações de Fábrica", + "Falhou em descriptografar", + "Falhou ao carregar PSBT", + "Falhou ao carregar endereço", + "Falha ao carregar a chave", + "Falhou ao carregar mensagem", + "Falhou ao carregar mnemônico", + "Falha ao carregar o descritor de saída", + "Falha ao carregar a senha", + "Falhou ao armazenar mnemônico", + "Taxa:", + "Taxa de Alimentação", + "Nome do arquivo", + "O nome do arquivo %s existe no cartão SD, substituir?", + "Preencher a flash com entropia da câmera?", + "Preenchendo a Flash", + "Impressão digital não definida no PSBT", + "Firmware excede o tamanho máximo: %d", + "Mapa da Flash", + "Ferramentas da Flash", + "Flash preenchida com entropia da câmera", + "Coordenadas X invertidas", + "Diâmetro da Fresa", + "Livre:", + "Do Armazenamento", + "Apague totalmente seu cartão SD em outro dispositivo para garantir que os dados sejam irrecuperáveis", + "Gerar Mnemônico", + "Dê a este mnemônico um ID personalizado? Caso contrário, a impressão digital atual será usada", + "Ir", + "Boa entropia", + "Hardware", + "Chave pública hexadecimal", + "Hexadecimal", + "Ocultar Mnemônicos", + "Taxas altas!", + "Id já existe", + "Índice", + "Índice: %s", + "Entradas (%d):", + "Instalar?", + "Entropia insuficiente!", + "Entropia insuficiente", + "Código de verificação inválido", + "Endereço inválido", + "Bootloader inválido", + "Comprimento de mnemônico inválido", + "Chave pública inválida", + "Carteira inválida:", + "Invertido", + "Cores invertidas", + "Chave", + "A chave não foi fornecida", + "Teste de impressão de QR krux", + "Tipo de LCD", + "Língua", + "Deixe em branco se quiser que o Krux escolha uma palavra final válida", + "Esquerda", + "Comprimento: %s", + "Atraso de Linha", + "Linha:", + "Carregar Krux app", + "Carregar Mnemônico", + "Carregar Carteira", + "Carregar um descritor de carteira confiável para visualizar endereços?", + "Carregar do cartão SD", + "Carregar do cartão SD?", + "Carregar da câmera", + "Carregar um?", + "Carregar?", + "Carregando Câmera..", + "Carregando endereços de troco..", + "Carregando impressora..", + "Carregando endereços de recebimento..", + "Carregando..", + "Idioma", + "Local", + "Comprimento máximo excedido (%s)", + "Mensagem", + "Mensagem:", + "Arquivo de assinatura faltando", + "Mnemônico", + "ID do mnemônico", + "Mnemônico e senha serão mantidos.", + "Mnemônico não foi criptografado", + "Modificado:", + "Multisig", + "Segwit nativo - 84 seria assumido", + "Rede", + "Novo Mnemônico", + "Novo firmware detectado.", + "Não", + "Sem Senha", + "Jogadas insuficientes!", + "Números", + "Octal", + "Outros Formatos", + "Iter. PBKDF2", + "Pinte os pontos perfurados de preto para que possam ser detectados.", + "Largura do papel", + "Parte", + "Tamanho da peça", + "Senha", + "Comprimento da Senha", + "Incompatibilidade de caminho", + "Padrão detectado!", + "Remover permanentemente todos os mnemônicos criptografados e configurações armazenados da memória flash?", + "Salvar", + "Índice de desvio de pixels:", + "QR em Texto", + "Carregue um descritor da carteira", + "Taxa de Mergulho", + "Entropia fraca", + "Baixa entropia detectada!", + "Imprimir QR de teste", + "Imprimir Tiny Seed?", + "Imprimir QR", + "Imprimir QR?", + "Imprimir?", + "Impressora", + "Driver de impressora não está definido!", + "Imprimindo..", + "Continuar mesmo assim?", + "Seguir?", + "Processando..", + "Código QR", + "Pino RX", + "Reiniciar", + "Recebimento", + "Endereços de Recebimento", + "Região:", + "Excluir %s?", + "Excluir Mnemônico", + "Remover arquivos de firmware do cartão SD?", + "Res. - Formato", + "Restaurar as configurações de fábrica e reiniciar?", + "Retornar ao Visualizador de QR", + "Revise os dados, edite se necessário", + "Direita", + "Role o dado pelo menos %d vezes para gerar um mnemônico.", + "Distribuição de jogadas:", + "Jogadas:", + "Cartão SD", + "Cartão SD não detectado.", + "SHA256 de jogadas:", + "Sha256 da imagem:", + "Salvar imagem do QR no cartão SD", + "Salvar no cartão SD", + "Salvar no cartão SD?", + "Salvo no cartão SD", + "Escala", + "Escanear Endereço", + "Escanear a senha BIP39", + "Escanear Código QR da Chave", + "Escaneando as palavras 1-12 novamente", + "Escaneando as palavras 13-24", + "Tempo para protetor de tela", + "Tipo de Script", + "Segurança", + "Autotransferência ou Troco (%d):", + "Autotransferência:", + "Defina um código de verificação primeiro", + "Configurações", + "Configurações armazenadas internamente no flash.", + "Configurações armazenadas no cartão SD.", + "Entropia de Shannon:", + "Desligar", + "Tempo de desligamento", + "Desligando..", + "Assinar", + "Assinar para código QR", + "Assinar para cartão SD", + "Assinar?", + "Assinatura", + "Mensagem Assinada", + "PSBT Assinada", + "Assinando..", + "Single-sig", + "Total:", + "Algumas verificações não podem ser realizadas.", + "Gastos (%d):", + "Gasto:", + "Estatísticas para Nerds", + "Armazene na Flash", + "Armazene no Cartão SD", + "Deslize para mudar de modo", + "TC Flash Hash", + "TC Hash Flash na Inicialização", + "TOQUE ou ENTER para capturar", + "Pino TX", + "Código de Verificação", + "Código de verificação definido com sucesso", + "Os códigos de verificação não correspondem", + "Texto", + "The app will be copied to user's flash ", + "Tema", + "Térmica", + "Para garantir que os dados sejam irrecuperáveis, use o recurso Limpar Dispositivo", + "Alternar brilho", + "Ferramentas", + "Limiar de Toque", + "Touchscreen", + "Tentar mais?", + "Digitar a senha BIP39", + "Digite a Chave", + "Unidade", + "Atualização completa.", + "Use uma superfície de fundo preta.", + "Use a entropia da câmera para criar um novo mnemônico", + "Usado:", + "Usuário", + "Valor %s fora do alcance: [ %s, %s]", + "O valor deve ser múltiplo de %s", + "Verificando..", + "Versão", + "Pela Câmera", + "Via D20", + "Via D6", + "Por entrada manual", + "Via Palavras", + "Aguarde a captura", + "Carteira", + "Descritor de Carteira", + "Descritor da carteira", + "Descritor de saída da carteira carregado!", + "O descritor de saída da carteira não foi encontrado.", + "Aviso:", + "Palavra %d", + "Números das Palavras", + "Palavras", + "Sim", + "é um endereço válido!", + "NÃO FOI ENCONTRADO nos primeiros %d endereços", +] diff --git a/src/krux/translations/ru.py b/src/krux/translations/ru.py index 21dd2466f..0c3d1acfd 100644 --- a/src/krux/translations/ru.py +++ b/src/krux/translations/ru.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['% от суммы.', '%d из %d мультиподпись', '%d к %d', '%s удален.', '(%d всего)', '(Эксперементальный)', '(Только часы)', '12 слов', '24 слова', 'О Программе', 'Принять предположение?', 'Учетная запись', 'Будет принят счет №0', 'Индекс счета', 'Добавить или изменить пароль кошелька?', 'Для режима AES-CBC требуется дополнительная энтропия от камеры', 'Адрес', 'Правильно совместите камеру и резервную пластину.', 'Сначала разрешите в настройках!', 'Антиблик отключен', 'Антиблик включен', 'Внешний Вид', 'Вы уверены?', 'Цвета BGR', 'BIP39 Мнемоника', 'Назад', 'Назад в Mеню', 'Резервная мнемоника', 'Плохая подпись', 'Пароль Base64', 'Скорость Передачи Данных', 'Двоичная сетка', 'Заполнение Границ', 'Яркость', 'Кнопки', 'Антидребезг кнопок', 'Захват отменен', 'Сдача', 'Адрес Сдачи', 'Сменить тему и перезагрузить?', 'Сдача:', 'Изменения будут храниться до выключения.', 'Проверить SD Карту', 'Проверить, что адрес принадлежит этому кошельку?', 'Проверено %d адресов без совпадений.', 'Проверка SD карты..', 'Подтвердите код проверки вскрытия', 'Создать QR Код', 'Создать QR код из текста?', 'Создано:', 'Текущий код проверки вскрытия', 'Пользовательский QR Код', 'Настроить', 'Настройка вашего кошелька создаст новый ключ.', 'Глубина Резки', 'Метод Резки', 'Десятичный', 'Расшифровать?', 'Кошелек по умолчанию', 'Глубина за Проход', 'Вывести энтропию BIP85?', 'Адреса дескрипторов', 'Дисплеи', 'Не выключайте питание, это может занять некоторое время.', 'Готово?', 'Двойная мнемоника', 'Драйвер', 'Пустой', 'Включить приложения Krux', 'Зашифровано', 'Зашифрованный QR Код', 'Зашифрованная мнемоника не была сохранена', 'Зашифрованная мнемоника была сохранена с ID:', 'Шифрование', 'Метод Шифрования', 'Введите %d слов BIP-39.', 'Введите более 6 символов кода проверки вскрытия', 'Введите каждое слово вашей мнемоники BIP-39 в виде числа от 1 до 2048.', 'Введите каждое слово вашей мнемоники BIP-39 в виде шестнадцатеричного числа от 1 до 800.', 'Введите каждое слово вашей мнемоники BIP-39 в виде восьмеричного числа от 1 до 4000.', 'Введите каждое слово вашей BIP-39 мнемоники.', 'Удалить данные пользователя', 'Удаление данных пользователя..', 'Ошибка:', 'Выйти', 'Выполнить подписанное приложение Krux?', 'Исследовать файлы?', 'Экспортирование на SD карту..', 'Расширенный Публичный Ключ', 'Заводские Настройки', 'Не удалось расшифровать', 'Не удалось загрузить PSBT', 'Не удалось загрузить адрес', 'Не удалось загрузить ключ', 'Не удалось загрузить сообщение', 'Не удалось загрузить мнемонику', 'Не удалось загрузить выходной дескриптор', 'Не удалось загрузить фразу-пароль', 'Не удалось сохранить мнемонику', 'Комиссия:', 'Скорость Подачи', 'Имя файла', 'Файл %s существует на SD карте, перезаписать?', 'Заполнить флэш энтропией с камеры?', 'Заполнение флэша', 'Отпечаток пальца не установлен в PSBT', 'Прошивка превышает максимальный размер: %d', 'Карта флэша', 'Flash Tools', 'Флэш заполнен энтропией камеры', 'Перевернутые координаты X', 'Диаметр Флюта', 'Свободно:', 'Из Памяти', 'Полностью стерите SD-карту в другом устройстве, чтобы убедиться, что данные не восстановимы', 'Создать Мнемонику', 'Назначить этой мнемоники кастомный ID? В ином случае будет использован текущий фингерпринт', 'OK', 'Хорошая энтропия', 'Аппаратное Обеспечение', 'Шестнадцатеричный Публичный Ключ', 'Шестнадцатеричный', 'Скрыть мнемоники', 'Высокие комиссии!', 'ID уже существует', 'Индекс', 'Индекс: %s', 'Входы (%d):', 'Установить?', 'Недостаточная Энтропия!', 'Недостаточная энтропия', 'Недействительный код проверки вскрытия', 'Неверный адрес', 'Неверный загрузчик', 'Неверная длина мнемоники', 'Неверный публичный ключ', 'Неверный кошелек:', 'Инвертировать', 'Перевернутые цвета', 'Ключ', 'Ключ не предоставлен', 'Тестовый QR Принтера Krux', 'Тип ЖК-дисплея', 'Язык', 'Оставьте пустым, если хотите, чтобы Krux выбрал подходящее последнее слово', 'Влево', 'Длина: %s', 'Задержка Линии', 'Линия:', 'Загрузить приложение Krux', 'Загрузить Мнемонику', 'Загрузить кошелек', 'Загрузить дескриптор доверенного кошелька для просмотра адресов?', 'Загрузка с SD-карты', 'Загрузить с SD карты?', 'Из камеры', 'Загрузить один?', 'Загрузить?', 'Загрузка Камеры..', 'Загрузка адресов изменения..', 'Загрузка принтера..', 'Загрузка адресов получения..', 'Загрузка..', 'Локаль', 'Расположение', 'Максимальная длина превышена (%s)', 'Сообщение', 'Сообщение:', 'Отсутствует файл подписи', 'Мнемоника', 'ID Мнемоники', 'Мнемоника и парольная фраза будут сохранены.', 'Мнемоника не была зашифрована', 'Изменено:', 'Мультиподпись', 'Native Segwit - 84 будет принято', 'Сеть', 'Новая Мнемоника', 'Обнаружена новая прошивка.', 'Нет', 'Нет Фраза-пароль', 'Недостаточно бросков!', 'Числа', 'Восьмеричный', 'Другие форматы', 'PBKDF2 Итерации', 'Закрасьте перфорированные точки черным цветом, чтобы их можно было обнаружить.', 'Ширина Бумаги', 'Часть', 'Размер Части', 'Фраза-пароль', 'Длина пароля', 'Несоответствие пути', 'Образец обнаружен!', 'Окончательно удалить все сохраненные зашифрованные мнемоники и настройки из флеш-памяти?', 'Постоянная Память', 'Индекс отклонения пикселей:', 'QR Открытым Текстом', 'Пожалуйста загрузите выходной дескриптор кошелька', 'Скорость Погружения', 'Плохая энтропия', 'Обнаружена плохая энтропия!', 'Напечатать Тестовый QR', 'Распечатать Tiny Seed?', 'Печать в QR', 'Напечатать в виде QR?', 'Печатать?', 'Принтер', 'Драйвер Принтера не установлен!', 'Идет печать..', 'Все равно продолжить?', 'Продолжить?', 'Обработка..', 'QR Код', 'RX Пин', 'Перезагрузить', 'Получить', 'Адрес Получения', 'Регион:', 'Удалить %s?', 'Удалить Мнемонику', 'Удалить файлы прошивки с SD-карты?', 'Разреш. - Формат', 'Восстановить заводские настройки и перезагрузить?', 'Вернуться к QR-просмотрщику', 'Просмотрите отсканированные данные, отредактируйте при необходимости', 'Вправо', 'Бросьте кубик не менее %d раз, чтобы сгенерировать мнемонику.', 'Распределение бросков:', 'Броски:', 'SD карта', 'SD карта не обнаружена.', 'SHA256 бросков:', 'SHA256 снэпшота:', 'Сохранить QR-изображение на SD-карту', 'Сохранить на SD-карту', 'Сохранить на SD карту?', 'Сохранено на SD карту', 'Шкала', 'Отсканировать Адрес', 'Отсканировать BIP39 фразу-пароль', 'Отсканировать Ключ QR код', 'Сканирование слов 1-12 снова', 'Сканирование слов 13-24', 'Время Экранной Заставки', 'Тип скрипта', 'Охрана', 'Трансфер самому себе или Сдача (%d):', 'Перевод самому себе:', 'Сначала установите код проверки вскрытия', 'Настройки', 'Настройки хранятся во флэш-памяти.', 'Настройки сохранены на SD-карте.', 'Энтропия Шеннона:', 'Выключить', 'Время выключения', 'Выключение..', 'Подписать', 'Подписать QR-код', 'Подписать на SD-карте', 'Подписать?', 'Подпись', 'Подписанное Сообщение', 'Подписанное PSBT', 'Подписание..', 'Одна подпись', 'Размер:', 'Некоторые проверки не могут быть выполнены.', 'Расход (%d):', 'Расход:', 'Статистика для Гиков', 'Сохранить на Флэш Память', 'Сохранить на SD Карту', 'Свайпните, чтобы сменить режим', 'TC Flash Hash', 'Проверка хэша Flash при загрузке', 'ПРИКОСНИТЕСЬ или нажмите ВВОД, чтобы захватить', 'TX Пин', 'Код проверки вскрытия', 'Код проверки вскрытия успешно установлен', 'Коды проверки вскрытия не совпадают', 'Текст', "The app will be copied to user's flash ", 'Тема', 'Термальный', 'Для гарантии невосстановления данных используйте функцию Очистки Устройства', 'Регулировка Яркости', 'Инструменты', 'Чувствительность', 'Тачскрин', 'Попробовать ещё?', 'Ввести BIP39 фразу-пароль', 'Ввести Ключ', 'Единица Измерения', 'Обновление завершено.', 'Использовать черную фоновую поверхность.', 'Использовать энтропию камеры, чтобы создать новую мнемонику', 'Использовано:', 'Пользователь', 'Значение %s вне диапозона: [%s, %s]', 'Значение должно быть кратным %s', 'Проверка..', 'Версия', 'С Помощью Камеры', 'С Помощью D20', 'С Помощью D6', 'С Помощью Ручного Ввода', 'Через Слово', 'Дождитесь Захвата', 'Кошелек', 'Дескриптор Кошелька', 'Выходной дескриптор кошелька', 'Выходной дескриптор кошелька загружен!', 'Выходной дескриптор кошелька не найден.', 'Предупреждение:', 'Слово %d', 'Числа Слов', 'Слова', 'Да', 'некорректный адрес', 'нЕ НАЙДЕНО в первых %d адресах'] +translation_array = [ + "% от суммы.", + "%d из %d мультиподпись", + "%d к %d", + "%s удален.", + "(%d всего)", + "(Эксперементальный)", + "(Только часы)", + "12 слов", + "24 слова", + "О Программе", + "Принять предположение?", + "Учетная запись", + "Будет принят счет №0", + "Индекс счета", + "Добавить или изменить пароль кошелька?", + "Для режима AES-CBC требуется дополнительная энтропия от камеры", + "Адрес", + "Правильно совместите камеру и резервную пластину.", + "Сначала разрешите в настройках!", + "Антиблик отключен", + "Антиблик включен", + "Внешний Вид", + "Вы уверены?", + "Цвета BGR", + "BIP39 Мнемоника", + "Назад", + "Назад в Mеню", + "Резервная мнемоника", + "Плохая подпись", + "Пароль Base64", + "Скорость Передачи Данных", + "Двоичная сетка", + "Заполнение Границ", + "Яркость", + "Кнопки", + "Антидребезг кнопок", + "Захват отменен", + "Сдача", + "Адрес Сдачи", + "Сменить тему и перезагрузить?", + "Сдача:", + "Изменения будут храниться до выключения.", + "Проверить SD Карту", + "Проверить, что адрес принадлежит этому кошельку?", + "Проверено %d адресов без совпадений.", + "Проверка SD карты..", + "Подтвердите код проверки вскрытия", + "Создать QR Код", + "Создать QR код из текста?", + "Создано:", + "Текущий код проверки вскрытия", + "Пользовательский QR Код", + "Настроить", + "Настройка вашего кошелька создаст новый ключ.", + "Глубина Резки", + "Метод Резки", + "Десятичный", + "Расшифровать?", + "Кошелек по умолчанию", + "Глубина за Проход", + "Вывести энтропию BIP85?", + "Адреса дескрипторов", + "Дисплеи", + "Не выключайте питание, это может занять некоторое время.", + "Готово?", + "Двойная мнемоника", + "Драйвер", + "Пустой", + "Включить приложения Krux", + "Зашифровано", + "Зашифрованный QR Код", + "Зашифрованная мнемоника не была сохранена", + "Зашифрованная мнемоника была сохранена с ID:", + "Шифрование", + "Метод Шифрования", + "Введите %d слов BIP-39.", + "Введите более 6 символов кода проверки вскрытия", + "Введите каждое слово вашей мнемоники BIP-39 в виде числа от 1 до 2048.", + "Введите каждое слово вашей мнемоники BIP-39 в виде шестнадцатеричного числа от 1 до 800.", + "Введите каждое слово вашей мнемоники BIP-39 в виде восьмеричного числа от 1 до 4000.", + "Введите каждое слово вашей BIP-39 мнемоники.", + "Удалить данные пользователя", + "Удаление данных пользователя..", + "Ошибка:", + "Выйти", + "Выполнить подписанное приложение Krux?", + "Исследовать файлы?", + "Экспортирование на SD карту..", + "Расширенный Публичный Ключ", + "Заводские Настройки", + "Не удалось расшифровать", + "Не удалось загрузить PSBT", + "Не удалось загрузить адрес", + "Не удалось загрузить ключ", + "Не удалось загрузить сообщение", + "Не удалось загрузить мнемонику", + "Не удалось загрузить выходной дескриптор", + "Не удалось загрузить фразу-пароль", + "Не удалось сохранить мнемонику", + "Комиссия:", + "Скорость Подачи", + "Имя файла", + "Файл %s существует на SD карте, перезаписать?", + "Заполнить флэш энтропией с камеры?", + "Заполнение флэша", + "Отпечаток пальца не установлен в PSBT", + "Прошивка превышает максимальный размер: %d", + "Карта флэша", + "Flash Tools", + "Флэш заполнен энтропией камеры", + "Перевернутые координаты X", + "Диаметр Флюта", + "Свободно:", + "Из Памяти", + "Полностью стерите SD-карту в другом устройстве, чтобы убедиться, что данные не восстановимы", + "Создать Мнемонику", + "Назначить этой мнемоники кастомный ID? В ином случае будет использован текущий фингерпринт", + "OK", + "Хорошая энтропия", + "Аппаратное Обеспечение", + "Шестнадцатеричный Публичный Ключ", + "Шестнадцатеричный", + "Скрыть мнемоники", + "Высокие комиссии!", + "ID уже существует", + "Индекс", + "Индекс: %s", + "Входы (%d):", + "Установить?", + "Недостаточная Энтропия!", + "Недостаточная энтропия", + "Недействительный код проверки вскрытия", + "Неверный адрес", + "Неверный загрузчик", + "Неверная длина мнемоники", + "Неверный публичный ключ", + "Неверный кошелек:", + "Инвертировать", + "Перевернутые цвета", + "Ключ", + "Ключ не предоставлен", + "Тестовый QR Принтера Krux", + "Тип ЖК-дисплея", + "Язык", + "Оставьте пустым, если хотите, чтобы Krux выбрал подходящее последнее слово", + "Влево", + "Длина: %s", + "Задержка Линии", + "Линия:", + "Загрузить приложение Krux", + "Загрузить Мнемонику", + "Загрузить кошелек", + "Загрузить дескриптор доверенного кошелька для просмотра адресов?", + "Загрузка с SD-карты", + "Загрузить с SD карты?", + "Из камеры", + "Загрузить один?", + "Загрузить?", + "Загрузка Камеры..", + "Загрузка адресов изменения..", + "Загрузка принтера..", + "Загрузка адресов получения..", + "Загрузка..", + "Локаль", + "Расположение", + "Максимальная длина превышена (%s)", + "Сообщение", + "Сообщение:", + "Отсутствует файл подписи", + "Мнемоника", + "ID Мнемоники", + "Мнемоника и парольная фраза будут сохранены.", + "Мнемоника не была зашифрована", + "Изменено:", + "Мультиподпись", + "Native Segwit - 84 будет принято", + "Сеть", + "Новая Мнемоника", + "Обнаружена новая прошивка.", + "Нет", + "Нет Фраза-пароль", + "Недостаточно бросков!", + "Числа", + "Восьмеричный", + "Другие форматы", + "PBKDF2 Итерации", + "Закрасьте перфорированные точки черным цветом, чтобы их можно было обнаружить.", + "Ширина Бумаги", + "Часть", + "Размер Части", + "Фраза-пароль", + "Длина пароля", + "Несоответствие пути", + "Образец обнаружен!", + "Окончательно удалить все сохраненные зашифрованные мнемоники и настройки из флеш-памяти?", + "Постоянная Память", + "Индекс отклонения пикселей:", + "QR Открытым Текстом", + "Пожалуйста загрузите выходной дескриптор кошелька", + "Скорость Погружения", + "Плохая энтропия", + "Обнаружена плохая энтропия!", + "Напечатать Тестовый QR", + "Распечатать Tiny Seed?", + "Печать в QR", + "Напечатать в виде QR?", + "Печатать?", + "Принтер", + "Драйвер Принтера не установлен!", + "Идет печать..", + "Все равно продолжить?", + "Продолжить?", + "Обработка..", + "QR Код", + "RX Пин", + "Перезагрузить", + "Получить", + "Адрес Получения", + "Регион:", + "Удалить %s?", + "Удалить Мнемонику", + "Удалить файлы прошивки с SD-карты?", + "Разреш. - Формат", + "Восстановить заводские настройки и перезагрузить?", + "Вернуться к QR-просмотрщику", + "Просмотрите отсканированные данные, отредактируйте при необходимости", + "Вправо", + "Бросьте кубик не менее %d раз, чтобы сгенерировать мнемонику.", + "Распределение бросков:", + "Броски:", + "SD карта", + "SD карта не обнаружена.", + "SHA256 бросков:", + "SHA256 снэпшота:", + "Сохранить QR-изображение на SD-карту", + "Сохранить на SD-карту", + "Сохранить на SD карту?", + "Сохранено на SD карту", + "Шкала", + "Отсканировать Адрес", + "Отсканировать BIP39 фразу-пароль", + "Отсканировать Ключ QR код", + "Сканирование слов 1-12 снова", + "Сканирование слов 13-24", + "Время Экранной Заставки", + "Тип скрипта", + "Охрана", + "Трансфер самому себе или Сдача (%d):", + "Перевод самому себе:", + "Сначала установите код проверки вскрытия", + "Настройки", + "Настройки хранятся во флэш-памяти.", + "Настройки сохранены на SD-карте.", + "Энтропия Шеннона:", + "Выключить", + "Время выключения", + "Выключение..", + "Подписать", + "Подписать QR-код", + "Подписать на SD-карте", + "Подписать?", + "Подпись", + "Подписанное Сообщение", + "Подписанное PSBT", + "Подписание..", + "Одна подпись", + "Размер:", + "Некоторые проверки не могут быть выполнены.", + "Расход (%d):", + "Расход:", + "Статистика для Гиков", + "Сохранить на Флэш Память", + "Сохранить на SD Карту", + "Свайпните, чтобы сменить режим", + "TC Flash Hash", + "Проверка хэша Flash при загрузке", + "ПРИКОСНИТЕСЬ или нажмите ВВОД, чтобы захватить", + "TX Пин", + "Код проверки вскрытия", + "Код проверки вскрытия успешно установлен", + "Коды проверки вскрытия не совпадают", + "Текст", + "The app will be copied to user's flash ", + "Тема", + "Термальный", + "Для гарантии невосстановления данных используйте функцию Очистки Устройства", + "Регулировка Яркости", + "Инструменты", + "Чувствительность", + "Тачскрин", + "Попробовать ещё?", + "Ввести BIP39 фразу-пароль", + "Ввести Ключ", + "Единица Измерения", + "Обновление завершено.", + "Использовать черную фоновую поверхность.", + "Использовать энтропию камеры, чтобы создать новую мнемонику", + "Использовано:", + "Пользователь", + "Значение %s вне диапозона: [%s, %s]", + "Значение должно быть кратным %s", + "Проверка..", + "Версия", + "С Помощью Камеры", + "С Помощью D20", + "С Помощью D6", + "С Помощью Ручного Ввода", + "Через Слово", + "Дождитесь Захвата", + "Кошелек", + "Дескриптор Кошелька", + "Выходной дескриптор кошелька", + "Выходной дескриптор кошелька загружен!", + "Выходной дескриптор кошелька не найден.", + "Предупреждение:", + "Слово %d", + "Числа Слов", + "Слова", + "Да", + "некорректный адрес", + "нЕ НАЙДЕНО в первых %d адресах", +] diff --git a/src/krux/translations/tr.py b/src/krux/translations/tr.py index f040cddf4..c15f5c91d 100644 --- a/src/krux/translations/tr.py +++ b/src/krux/translations/tr.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ["tutarın %'si.", '%d / %d çoklu imza', '%d to %d', '%s kaldırıldı.', '(toplam %d)', '(Deneysel)', '(sadece izle)', '12 kelime', '24 kelime', 'Hakkında', 'Varsayım kabul edilsin mi?', 'Hesap', '#0 numaralı hesap varsayılacaktır', 'Hesap Endeksi', 'Cüzdan parolası eklensin mi veya değiştirilsin mi?', 'AES-CBC modu için kameradan ek entropi gereklidir', 'Adres', "Kamerayı ve yedek plakay'ı düzgün bir şekilde hizalayın.", 'Önce ayarlarda izin ver!', 'Parlama önleyici devre dışı', 'Parlama önleyici etkin', 'Görünüm', 'Emin misiniz?', 'BGR Renkleri', 'BIP39 Anımsatıcı', 'Geri', 'Menüye Dön', 'Yedek Mnemonic', 'Geçersiz imza', 'Base64 Parola', 'Baud Hızı', 'İkili Izgara', 'Kenarlık Dolgusu', 'Parlaklık', 'Butonlar', 'Buton Geri-sekmesi', 'Yakalama iptal edildi', 'Para Üstü', 'Para Üstü Adresleri', 'Temayı değiştir ve yeniden başlat?', 'Para Üstü:', 'Değişiklikler kapanışa kadar devam edecek.', 'SD Kartı Kontrol Et', 'Bu adresin, bu cüzdana ait olduğunu kontrol et?', 'Eşleşmeyen %d adres kontrol edildi.', 'SD kart kontrol ediliyor..', 'Kurcalama Kontrol Kodunu Onayla', 'QR Kodu Oluştur', 'Metinden QR kodu oluşturulsun mu?', 'Oluşturuldu:', 'Mevcut Kurcalama Kontrol Kodu', 'Özel QR Kodu', 'Özelleştir', 'Cüzdanınızı özelleştirmek yeni bir Anahtar oluşturacaktır.', 'Kesim Derinliği', 'Kesim Yöntemi', 'Ondalık', 'Şifre çözülsün mü?', 'Varsayılan Cüzdan', 'Geçiş Başına Derinlik', 'BIP85 entropisi türetilsin mi?', 'Tanımlayıcı Adresler', 'Ekran', 'Kapatmayın, tamamlanması biraz zaman alabilir.', 'Tamamlandı mı?', 'Çifte anımsatıcı', 'Sürücü', 'Boş', 'Krux uygulamalarını etkinleştir', 'Şifrelenmiş', 'Şifrelenmiş QR Kodu', 'Şifrelenmiş mnemonic depolanmadı', 'Şifrelenmiş mnemonic ID ile depolandı:', 'Şifreleme', 'Şifreleme Modu', '%d BIP-39 kelime girin.', '6+ karakterlik bir Kurcalama Kontrol Kodu girin', "BIP-39 mnemonic'inizin her kelimesini 1'den 2048'e kadar bir sayı olarak girin.", "BIP-39 mnemonic'inizin her kelimesini 1'den 800'e kadar onaltılık bir sayı olarak girin.", "BIP-39 mnemonic'inizin her kelimesini 1'den 4000'e kadar sekizlik bir sayı olarak girin.", "BIP-39 mnemonic'inizin her kelimesini girin.", 'Kullanıcı Verilerini Sil', 'Kullanıcının verileri siliniyor..', 'Hata:', 'Çıkış', 'İmzalı bir Krux uygulaması çalıştırılsın mı?', 'Dosyaları ara?', 'SD karta aktarılıyor..', 'Genişletilmiş Public Key', 'Fabrika Ayarları', 'Şifre çözme başarısız', 'PSBT yükleme başarısız', 'Adres yükleme başarısız', 'Anahtar yükleme başarısız', 'Mesaj yükleme başarısız', 'Mnemonic yükleme başarısız', 'Çıktı tanımlayıcısı yüklemesi başarısız', 'Parola yükleme başarısız', 'Mnemonic depolama başarısız', 'Ücret:', 'Besleme Hızı', 'Dosya adı', '%s dosya adı SD kartta var, üzerine yazılsın mı?', "Flash'ı kameradan gelen entropi ile doldur?", 'Flash Dolduruluyor', "PSBT'de parmak izi ayarı kaldırıldı", 'Donanım yazılımı maksimum boyutu aşıyor: %d', 'Flash Haritası', 'Flash Araçları', 'Flash kamera entropisi ile dolduruldu', 'X Koordinatları Tersine Çevrildi', 'Flute Çapı', 'Boş:', 'Depolamadan Seç', 'Verilerin geri kullanılamaz olduğundan emin olmak için SD kartınızı başka bir cihazda tamamen silin', 'Mnemonic Oluştur', "Bu mnemonic'e özel bir ID verilsin mi? Aksi takdirde mevcut parmak izi kullanılacaktır", 'Seç', 'Yeterli entropi', 'Donanım', 'Hex Public Key', 'Onaltılık', "Mnemonic'leri Gizle", 'Yüksek ücret!', 'ID zaten var', 'Dizin', 'Dizin: %s', 'Girişler (%d):', 'Yükle?', 'Yetersiz Entropi!', 'Yetersiz entropi', 'Geçersiz Kurcalama Kontrol Kodu', 'Geçersiz adres', 'Geçersiz önyükleyici', 'Geçersiz mnemonic uzunluğu', 'Geçersiz public key', 'Geçersiz cüzdan:', 'Ters Çevir', 'Ters Renkler', 'Anahtar', 'Anahtar sağlanmadı', "Krux Yazıcı Test QR'ı", 'LCD Tipi', 'Dil', "Krux'un geçerli bir son kelime seçmesini istiyorsanız boş bırakın", 'Sol', 'Uzunluk: %s', 'Satır Gecikmesi', 'Satır:', 'Krux uygulamasını yükle', 'Mnemonic Yükle', 'Cüzdan Yükle', 'Adresleri görüntülemek için güvenilir bir cüzdan tanımlayıcısı yüklensin mi?', 'SD karttan yükle', 'SD karttan yüklensin mi?', 'Kameradan yükle', 'Bir tane mi yüklensin?', 'Yüklensin mi?', 'Kamera Yükleniyor..', 'Para üstü adresler yükleniyor..', 'Yazıcı yükleniyor..', 'Alım adresler yükleniyor..', 'Yükleniyor..', 'Yerel', 'Konum', 'Maksimum uzunluk aşıldı (%s)', 'Mesaj', 'Mesaj:', 'İmza dosyası eksik', 'Mnemonic', 'Mnemonic ID', 'Mnemonik ve parola tutulacaktır.', 'Mnemonic şifrelenmedi', 'Değiştirildi:', 'Çoklu imza', 'Yerel Segwit - 84 varsayılacaktır', 'Ağ', 'Yeni Mnemonic', 'Yeni donanım yazılımı tespit edildi.', 'Hayır', 'Parola Yok', 'Yeterli zar atışı yok!', 'Numaralar', 'Sekizlik', 'Diğer Formatlar', 'PBKDF2 Yinelemesi', 'İşaretlenmiş noktaları siyaha boyayın ki tespit edilebilsinler.', 'Kağıt Genişliği', 'Parça', 'Parça Boyutu', 'Parola', 'Parola Uzunluğu', 'Yol uyuşmazlığı', 'Örüntü algılandı!', "Tüm depolanmış ve şifrelenmiş mnemonic'ler ve ayarlar flash'tan kalıcı olarak kaldırılsın mı?", 'Kalıcı Depolama', 'Piksel sapma indeksi:', "Düz Metin QR'ı", 'Lütfen bir cüzdan çıktı tanımlayıcısı yükleyin', 'Dalış Hızı', 'Düşük entropi', 'Düşük entropi tespit edildi!', "Test QR'ını Yazdır", 'Tiny Seed Yazdırılsın mı?', "QR'a Yazdır", "QR'a yazdırılsın mı?", 'Yazdırılsın mı?', 'Yazıcı', 'Yazıcı Sürücüsü ayarlanmadı!', 'Yazdırılıyor..', 'Yine de devam edilsin mi?', 'Devam edilsin mi?', 'İşleniyor..', 'QR Kodu', 'RX Pini', 'Yeniden Başlat', 'Al', 'Adresleri Al', 'Bölge:', '%s kaldırılsın mı?', "Mnemonic'i Kaldır", 'SD Karttan donanım yazılımı dosyaları kaldırılsın mı?', 'Çözünürlüğü Sıfırla', 'Fabrika ayarlarına geri dönüp ve yeniden başlatılsın mı?', 'QR Görüntüleyiciye Dön', 'Taranan verileri gözden geçirin, gerekirse düzenleyin', 'Sağ', 'Bir mnemonic oluşturmak için zarı en az %d kez atın.', 'Zar atış dağılımı:', 'Zar atışları:', 'SD kart', 'SD kart algılanmadı.', "Zar atışlarının SHA256'sı:", "Snapshot'ın SHA256'sı:", 'QR Görüntüsünü SD Karta Kaydet', 'SD karta kaydet', 'SD karta kaydedilsin mi?', 'SD karta kaydedildi', 'Ölçek', 'Adresi Tara', 'BIP39 Parolasını Tara', 'Anahtar QR Kodunu Tara', '1-12 kelimeleri tekrar taranıyor', '13-24 kelimeleri taranıyor', 'Ekran Koruyucu Süresi', 'Betik Türü', 'Güvenlik', 'Kendine-transfer veya Para Üstü (%d):', 'Kendine-transfer:', 'Önce bir kurcalama kontrol kodu ayarlayın', 'Ayarlar', 'Ayarlar dahili olarak flaşta saklanır.', 'Ayarlar SD karta kaydedildi.', 'Shannon Entropisi:', 'Kapat', 'Kapanma Süresi', 'Kapatılıyor..', 'İmzala', 'QR koduna imzala', 'SD karta imzala', 'İmzalansın mı?', 'İmza', 'İmzalı Mesaj', 'İmzalı PSBT', 'İmzalanıyor..', 'Tek-imza', 'Boyut:', 'Bazı kontroller yerine getirilemedi.', 'Harcama (%d):', 'Harcama:', 'İnekler İçin İstatistikler', "Flash'ta Sakla", 'SD Kartta Sakla', 'Modu değiştirmek için kaydırın', 'TC Flash Hash', 'Önyüklemede TC Flash Hash', 'Yakalamak için DOKUN veya GİR', 'TX Pini', 'Kurcalama Kontrol Kodu', 'Kurcalama kontrol kodu başarıyla ayarlandı', 'Kurcalama kontrol kodları eşleşmiyor', 'Metin', "The app will be copied to user's flash ", 'Tema', 'Termal', 'Verilerin geri kullanılamaz olduğundan emin olmak için Cihazı Sil özelliğini kullanın', 'Parlaklığı Değiştir', 'Araçlar', 'Dokunma Eşiği', 'Dokunmatik ekran', 'Daha fazla kez denensin mi?', 'BIP39 parolasını yazın', 'Anahtar Yaz', 'Birim', 'Güncelleme tamamlandı.', 'Siyah bir arka plan yüzeyi kullanın.', 'Yeni bir mnemonic oluşturmak için kameranın entropisini kullanın', 'Kullanılan:', 'Kullanıcı', '%s değeri aralık dışında: [%s, %s]', "Değer %s'nin katı olmalıdır", 'Doğrulanıyor..', 'Sürüm', 'Kamera Aracılığıyla', 'D20 Aracılığıyla', 'D6 Aracılığıyla', 'Manuel Giriş Aracılığıyla', 'Sözcüklerle', 'Yakalamanın tamamlanmasını bekleyin', 'Cüzdan', 'Cüzdan Tanımlayıcısı', 'Cüzdan çıktı tanımlayıcısı', 'Cüzdan çıktı tanımlayıcısı yüklendi!', 'Cüzdan çıktı tanımlayıcısı bulunamadı.', 'Uyarı:', 'Kelime %d', 'Kelime Numaraları', 'Kelimeler', 'Evet', 'geçerli bir adres!', 'ilk %d adreste BULUNAMADI'] +translation_array = [ + "tutarın %'si.", + "%d / %d çoklu imza", + "%d to %d", + "%s kaldırıldı.", + "(toplam %d)", + "(Deneysel)", + "(sadece izle)", + "12 kelime", + "24 kelime", + "Hakkında", + "Varsayım kabul edilsin mi?", + "Hesap", + "#0 numaralı hesap varsayılacaktır", + "Hesap Endeksi", + "Cüzdan parolası eklensin mi veya değiştirilsin mi?", + "AES-CBC modu için kameradan ek entropi gereklidir", + "Adres", + "Kamerayı ve yedek plakay'ı düzgün bir şekilde hizalayın.", + "Önce ayarlarda izin ver!", + "Parlama önleyici devre dışı", + "Parlama önleyici etkin", + "Görünüm", + "Emin misiniz?", + "BGR Renkleri", + "BIP39 Anımsatıcı", + "Geri", + "Menüye Dön", + "Yedek Mnemonic", + "Geçersiz imza", + "Base64 Parola", + "Baud Hızı", + "İkili Izgara", + "Kenarlık Dolgusu", + "Parlaklık", + "Butonlar", + "Buton Geri-sekmesi", + "Yakalama iptal edildi", + "Para Üstü", + "Para Üstü Adresleri", + "Temayı değiştir ve yeniden başlat?", + "Para Üstü:", + "Değişiklikler kapanışa kadar devam edecek.", + "SD Kartı Kontrol Et", + "Bu adresin, bu cüzdana ait olduğunu kontrol et?", + "Eşleşmeyen %d adres kontrol edildi.", + "SD kart kontrol ediliyor..", + "Kurcalama Kontrol Kodunu Onayla", + "QR Kodu Oluştur", + "Metinden QR kodu oluşturulsun mu?", + "Oluşturuldu:", + "Mevcut Kurcalama Kontrol Kodu", + "Özel QR Kodu", + "Özelleştir", + "Cüzdanınızı özelleştirmek yeni bir Anahtar oluşturacaktır.", + "Kesim Derinliği", + "Kesim Yöntemi", + "Ondalık", + "Şifre çözülsün mü?", + "Varsayılan Cüzdan", + "Geçiş Başına Derinlik", + "BIP85 entropisi türetilsin mi?", + "Tanımlayıcı Adresler", + "Ekran", + "Kapatmayın, tamamlanması biraz zaman alabilir.", + "Tamamlandı mı?", + "Çifte anımsatıcı", + "Sürücü", + "Boş", + "Krux uygulamalarını etkinleştir", + "Şifrelenmiş", + "Şifrelenmiş QR Kodu", + "Şifrelenmiş mnemonic depolanmadı", + "Şifrelenmiş mnemonic ID ile depolandı:", + "Şifreleme", + "Şifreleme Modu", + "%d BIP-39 kelime girin.", + "6+ karakterlik bir Kurcalama Kontrol Kodu girin", + "BIP-39 mnemonic'inizin her kelimesini 1'den 2048'e kadar bir sayı olarak girin.", + "BIP-39 mnemonic'inizin her kelimesini 1'den 800'e kadar onaltılık bir sayı olarak girin.", + "BIP-39 mnemonic'inizin her kelimesini 1'den 4000'e kadar sekizlik bir sayı olarak girin.", + "BIP-39 mnemonic'inizin her kelimesini girin.", + "Kullanıcı Verilerini Sil", + "Kullanıcının verileri siliniyor..", + "Hata:", + "Çıkış", + "İmzalı bir Krux uygulaması çalıştırılsın mı?", + "Dosyaları ara?", + "SD karta aktarılıyor..", + "Genişletilmiş Public Key", + "Fabrika Ayarları", + "Şifre çözme başarısız", + "PSBT yükleme başarısız", + "Adres yükleme başarısız", + "Anahtar yükleme başarısız", + "Mesaj yükleme başarısız", + "Mnemonic yükleme başarısız", + "Çıktı tanımlayıcısı yüklemesi başarısız", + "Parola yükleme başarısız", + "Mnemonic depolama başarısız", + "Ücret:", + "Besleme Hızı", + "Dosya adı", + "%s dosya adı SD kartta var, üzerine yazılsın mı?", + "Flash'ı kameradan gelen entropi ile doldur?", + "Flash Dolduruluyor", + "PSBT'de parmak izi ayarı kaldırıldı", + "Donanım yazılımı maksimum boyutu aşıyor: %d", + "Flash Haritası", + "Flash Araçları", + "Flash kamera entropisi ile dolduruldu", + "X Koordinatları Tersine Çevrildi", + "Flute Çapı", + "Boş:", + "Depolamadan Seç", + "Verilerin geri kullanılamaz olduğundan emin olmak için SD kartınızı başka bir cihazda tamamen silin", + "Mnemonic Oluştur", + "Bu mnemonic'e özel bir ID verilsin mi? Aksi takdirde mevcut parmak izi kullanılacaktır", + "Seç", + "Yeterli entropi", + "Donanım", + "Hex Public Key", + "Onaltılık", + "Mnemonic'leri Gizle", + "Yüksek ücret!", + "ID zaten var", + "Dizin", + "Dizin: %s", + "Girişler (%d):", + "Yükle?", + "Yetersiz Entropi!", + "Yetersiz entropi", + "Geçersiz Kurcalama Kontrol Kodu", + "Geçersiz adres", + "Geçersiz önyükleyici", + "Geçersiz mnemonic uzunluğu", + "Geçersiz public key", + "Geçersiz cüzdan:", + "Ters Çevir", + "Ters Renkler", + "Anahtar", + "Anahtar sağlanmadı", + "Krux Yazıcı Test QR'ı", + "LCD Tipi", + "Dil", + "Krux'un geçerli bir son kelime seçmesini istiyorsanız boş bırakın", + "Sol", + "Uzunluk: %s", + "Satır Gecikmesi", + "Satır:", + "Krux uygulamasını yükle", + "Mnemonic Yükle", + "Cüzdan Yükle", + "Adresleri görüntülemek için güvenilir bir cüzdan tanımlayıcısı yüklensin mi?", + "SD karttan yükle", + "SD karttan yüklensin mi?", + "Kameradan yükle", + "Bir tane mi yüklensin?", + "Yüklensin mi?", + "Kamera Yükleniyor..", + "Para üstü adresler yükleniyor..", + "Yazıcı yükleniyor..", + "Alım adresler yükleniyor..", + "Yükleniyor..", + "Yerel", + "Konum", + "Maksimum uzunluk aşıldı (%s)", + "Mesaj", + "Mesaj:", + "İmza dosyası eksik", + "Mnemonic", + "Mnemonic ID", + "Mnemonik ve parola tutulacaktır.", + "Mnemonic şifrelenmedi", + "Değiştirildi:", + "Çoklu imza", + "Yerel Segwit - 84 varsayılacaktır", + "Ağ", + "Yeni Mnemonic", + "Yeni donanım yazılımı tespit edildi.", + "Hayır", + "Parola Yok", + "Yeterli zar atışı yok!", + "Numaralar", + "Sekizlik", + "Diğer Formatlar", + "PBKDF2 Yinelemesi", + "İşaretlenmiş noktaları siyaha boyayın ki tespit edilebilsinler.", + "Kağıt Genişliği", + "Parça", + "Parça Boyutu", + "Parola", + "Parola Uzunluğu", + "Yol uyuşmazlığı", + "Örüntü algılandı!", + "Tüm depolanmış ve şifrelenmiş mnemonic'ler ve ayarlar flash'tan kalıcı olarak kaldırılsın mı?", + "Kalıcı Depolama", + "Piksel sapma indeksi:", + "Düz Metin QR'ı", + "Lütfen bir cüzdan çıktı tanımlayıcısı yükleyin", + "Dalış Hızı", + "Düşük entropi", + "Düşük entropi tespit edildi!", + "Test QR'ını Yazdır", + "Tiny Seed Yazdırılsın mı?", + "QR'a Yazdır", + "QR'a yazdırılsın mı?", + "Yazdırılsın mı?", + "Yazıcı", + "Yazıcı Sürücüsü ayarlanmadı!", + "Yazdırılıyor..", + "Yine de devam edilsin mi?", + "Devam edilsin mi?", + "İşleniyor..", + "QR Kodu", + "RX Pini", + "Yeniden Başlat", + "Al", + "Adresleri Al", + "Bölge:", + "%s kaldırılsın mı?", + "Mnemonic'i Kaldır", + "SD Karttan donanım yazılımı dosyaları kaldırılsın mı?", + "Çözünürlüğü Sıfırla", + "Fabrika ayarlarına geri dönüp ve yeniden başlatılsın mı?", + "QR Görüntüleyiciye Dön", + "Taranan verileri gözden geçirin, gerekirse düzenleyin", + "Sağ", + "Bir mnemonic oluşturmak için zarı en az %d kez atın.", + "Zar atış dağılımı:", + "Zar atışları:", + "SD kart", + "SD kart algılanmadı.", + "Zar atışlarının SHA256'sı:", + "Snapshot'ın SHA256'sı:", + "QR Görüntüsünü SD Karta Kaydet", + "SD karta kaydet", + "SD karta kaydedilsin mi?", + "SD karta kaydedildi", + "Ölçek", + "Adresi Tara", + "BIP39 Parolasını Tara", + "Anahtar QR Kodunu Tara", + "1-12 kelimeleri tekrar taranıyor", + "13-24 kelimeleri taranıyor", + "Ekran Koruyucu Süresi", + "Betik Türü", + "Güvenlik", + "Kendine-transfer veya Para Üstü (%d):", + "Kendine-transfer:", + "Önce bir kurcalama kontrol kodu ayarlayın", + "Ayarlar", + "Ayarlar dahili olarak flaşta saklanır.", + "Ayarlar SD karta kaydedildi.", + "Shannon Entropisi:", + "Kapat", + "Kapanma Süresi", + "Kapatılıyor..", + "İmzala", + "QR koduna imzala", + "SD karta imzala", + "İmzalansın mı?", + "İmza", + "İmzalı Mesaj", + "İmzalı PSBT", + "İmzalanıyor..", + "Tek-imza", + "Boyut:", + "Bazı kontroller yerine getirilemedi.", + "Harcama (%d):", + "Harcama:", + "İnekler İçin İstatistikler", + "Flash'ta Sakla", + "SD Kartta Sakla", + "Modu değiştirmek için kaydırın", + "TC Flash Hash", + "Önyüklemede TC Flash Hash", + "Yakalamak için DOKUN veya GİR", + "TX Pini", + "Kurcalama Kontrol Kodu", + "Kurcalama kontrol kodu başarıyla ayarlandı", + "Kurcalama kontrol kodları eşleşmiyor", + "Metin", + "The app will be copied to user's flash ", + "Tema", + "Termal", + "Verilerin geri kullanılamaz olduğundan emin olmak için Cihazı Sil özelliğini kullanın", + "Parlaklığı Değiştir", + "Araçlar", + "Dokunma Eşiği", + "Dokunmatik ekran", + "Daha fazla kez denensin mi?", + "BIP39 parolasını yazın", + "Anahtar Yaz", + "Birim", + "Güncelleme tamamlandı.", + "Siyah bir arka plan yüzeyi kullanın.", + "Yeni bir mnemonic oluşturmak için kameranın entropisini kullanın", + "Kullanılan:", + "Kullanıcı", + "%s değeri aralık dışında: [%s, %s]", + "Değer %s'nin katı olmalıdır", + "Doğrulanıyor..", + "Sürüm", + "Kamera Aracılığıyla", + "D20 Aracılığıyla", + "D6 Aracılığıyla", + "Manuel Giriş Aracılığıyla", + "Sözcüklerle", + "Yakalamanın tamamlanmasını bekleyin", + "Cüzdan", + "Cüzdan Tanımlayıcısı", + "Cüzdan çıktı tanımlayıcısı", + "Cüzdan çıktı tanımlayıcısı yüklendi!", + "Cüzdan çıktı tanımlayıcısı bulunamadı.", + "Uyarı:", + "Kelime %d", + "Kelime Numaraları", + "Kelimeler", + "Evet", + "geçerli bir adres!", + "ilk %d adreste BULUNAMADI", +] diff --git a/src/krux/translations/vi.py b/src/krux/translations/vi.py index 9ab9d6cad..1f93aee07 100644 --- a/src/krux/translations/vi.py +++ b/src/krux/translations/vi.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['% của số tiền.', '%d của %d đa chữ kí', '%d đến %d', '%s Đã bỏ.', '(tổng cộng %d)', '(Thực nghiệm)', '(chỉ xem)', '12 từ', '24 từ', 'Về chúng tôi', 'Chấp nhận giả định?', 'Tài khoản', 'Tài khoản #0 sẽ được giả định', 'Chỉ mục tài khoản', 'Thêm hoặc thay đổi cụm mật khẩu ví?', 'Cần thêm entropy từ camera cho chế độ AES-CBC', 'Địa chỉ', 'Căn chỉnh camera và tấm dự phòng đúng cách.', 'Cho phép cài đặt trước!', 'Chống lóa bị vô hiệu hóa', 'Đã bật chống lóa', 'Giao diện', 'Bạn có chắc không?', 'Màu BGR', 'Từ gợi nhớ BIP39', 'Trở lại', 'Quay lại Menu', 'Sao lưu Mnemonic', 'Chữ ký xấu', 'Mật khẩu Base64', 'Tốc độ baud', 'Lưới nhị phân', 'Đệm viền', 'Độ sáng', 'Nút', 'Loại bỏ nhiễu nút', 'Hủy chụp hình', 'Thay đổi', 'Các địa chỉ tiền thối', 'Thay đổi giao diện và khởi động lại?', 'Thay đổi:', 'Thay đổi sẽ kéo dài cho đến khi tắt máy.', 'Kiểm tra thẻ SD', 'Kiểm tra địa chỉ đó có thuộc về ví này không?', 'Đã kiểm tra %d địa chỉ không khớp.', 'Kiểm tra thẻ SD..', 'Xác nhận mã kiểm tra giả mạo', 'Tạo mã QR', 'Tạo mã QR từ văn bản?', 'Tạo:', 'Mã kiểm tra giả mạo hiện tại', 'Mã QR tùy chỉnh', 'Tùy chỉnh', 'Tùy chỉnh ví của bạn sẽ tạo một Khóa mới.', 'Chiều sâu cắt', 'Phương pháp cắt', 'Số thập phân', 'Giải mã?', 'Ví mặc định', 'Độ sâu mỗi lần cắt CNC', 'Suy ra entropy BIP85?', 'Địa chỉ người mô tả', 'Hiển thị', 'Không được tắt máy, có thể mất một lúc để hoàn thành.', 'Hoàn tất?', 'Từ gợi nhớ kép', 'Driver', 'Trống', 'Bật ứng dụng Krux', 'Đã mã hóa', 'Mã QR được mã hóa', 'Mnemonic được mã hóa không được lưu trữ', 'Mnemonic được mã hóa không được lưu trữ với ID:', 'Mã hóa', 'Chế độ mã hóa', 'Nhập %d từ BIP-39.', 'Nhập mã kiểm tra giả mạo gồm hơn 6 ký tự', 'Nhập từng từ của Mnemonic BIP-39 của bạn dưới dạng số từ 1 đến 2048.', 'Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số thập lục phân từ 1 đến 800.', 'Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số bát phân từ 1 đến 4000.', 'Nhập từng từ của Mnemonic BIP-39 của bạn.', 'Xóa dữ liệu của người dùng', 'Đang xóa dữ liệu của người dùng..', 'Lỗi:', 'Esc', 'Thực thi một ứng dụng Krux đã ký?', 'Khám phá các tập tin?', 'Xuất vào thẻ SD ..', 'Khóa công cộng', 'Cài đặt Gốc', 'Không giải mã được', 'Tải PSBT thất bại', 'Tải địa chỉ thất bại', 'Không tải được khóa', 'Không tải được tin nhắn', 'Tải mã Mnemonic thất bại', 'Không tải được bộ mô tả đầu ra', 'Không tải được cụm mật khẩu', 'Không lưu trữ Mnemonic được', 'Phí:', 'Tốc độ cắt CNC', 'Tên tệp', 'Tên tệp %s tồn tại trên thẻ SD, ghi đè lên?', 'Điền vào flash với entropy từ máy ảnh?', 'Đèn Flash Đổ Đầy', 'Bỏ dấu vân tay trong PSBT', 'Phần mềm vượt quá kích thước tối đa: %d', 'Bản đồ Flash', 'Công cụ Flash', 'Đèn flash chứa đầy entropy của máy ảnh', 'Tọa độ X bị lật', 'Đường kính mũi cắt CNC', 'Khả dụng:', 'Từ bộ lưu trữ', 'Xóa hoàn toàn thẻ SD trong một thiết bị khác để đảm bảo dữ liệu không thể phục hồi', 'Tạo Mnemonic', 'Cung cấp cho Mnemonic này một ID tùy chỉnh? Nếu không thì fingerprint hiện tại sẽ được sử dụng', 'Chọn', 'Entropy tốt', 'Phần cứng', 'Khóa công cộng Hex', 'Thập lục phân', 'Ẩn Mnemonics', 'Phí cao!', 'Id đã tồn tại', 'Chỉ mục', 'Chỉ mục: %s', 'Đầu vào (%d):', 'Cài đặt phần mềm?', 'Entropy không đủ!', 'Không đủ entropy', 'Mã kiểm tra giả mạo không hợp lệ', 'Địa chỉ không hợp lệ', 'Bộ tải khởi động không hợp lệ', 'Độ dài mã Mnemonic không hợp lệ', 'Khóa công cộng không hợp lệ', 'Ví không hợp lệ:', 'Đảo ngược', 'Màu đảo ngược', 'Chìa khóa', 'Khóa không được cung cấp', 'QR kiểm tra máy in Krux', 'Loại LCD', 'Ngôn ngữ', 'Để trống nếu bạn muốn Krux chọn một từ cuối cùng hợp lệ', 'Trái', 'Độ dài: %s', 'Độ trễ Dòng', 'Đường kẻ:', 'Tải ứng dụng Krux', 'Tải mã mnemonic', 'Nạp Ví', 'Tải mô tả ví đáng tin cậy để xem địa chỉ?', 'Tải từ thẻ SD', 'Tải từ thẻ SD?', 'Tải từ máy ảnh', 'Tải một?', 'Tải?', 'Đang tải máy ảnh..', 'Đang tải địa chỉ tiền thối..', 'Đang tải máy in ..', 'Đang tải địa chỉ nhận..', 'Đang tải..', 'Ngôn ngữ', 'Vị trí lưu', 'Chiều dài tối đa vượt quá (%s)', 'Tin nhắn', 'Tin nhắn:', 'Thiếu tập tin chữ ký', 'Mã mnemonic', 'Mnemonic ID ', 'Từ gợi nhớ và cụm mật khẩu sẽ được lưu giữ.', 'Mnemonic không được mã hóa', 'Đã sửa đổi:', 'Đa chữ kí', 'Native Segwit - 84 sẽ được giả định', 'Mạng lưới', 'Mnemonic mới', 'Phát hiện phần sụn mới.', 'Không', 'Không có cụm mật khẩu', 'Không đủ số lần quay!', 'Số', 'Bát phân', 'Các định dạng khác', 'Lặp lại PBKDF2', 'Tô các chấm đục lỗ màu đen để chúng có thể được phát hiện.', 'Chiều rộng giấy', 'Phần', 'Kích thước một phần', 'Cụm mật khẩu', 'Độ dài mật khẩu tối thiểu:', 'Đường dẫn không khớp', 'Đã phát hiện mẫu!', 'Xóa vĩnh viễn mọi Mnemonics và cài đặt được mã hóa lưu trữ trong flash?', 'Vị trí lưu', 'Chỉ số độ lệch điểm ảnh:', 'QR dạng văn bản', 'Vui lòng tải bộ mô tả đầu ra ví', 'Tỷ lệ sụt giảm', 'Entropy kém', 'Phát hiện entropy yếu!', 'In kiểm tra QR', 'In Tiny Seed?', 'In ra QR', 'In ra mã QR?', 'In?', 'Máy in', 'Trình điều khiển máy in chưa được cài đặt!', 'Đang in..', 'Vẫn tiếp tục?', 'Thực hiện?', 'Đang xử lý..', 'Mã QR', 'RX Pin', 'Khởi động lại', 'Nhận được', 'Các địa chỉ nhận', 'Vùng:', 'Xóa %s?', 'Xóa Mnemonic', 'Xóa các tệp firmware khỏi Thẻ SD?', 'Độ phân giải - Định dạng', 'Khôi phục cài đặt gốc và khởi động lại?', 'Quay lại Trình xem QR', 'Xem lại dữ liệu đã quét, chỉnh sửa nếu cần', 'Phải', 'Lăn xúc xắc ít nhất %d lần để tạo Mnemonic.', 'Phân bổ xúc xắc:', 'Tổng số lần quay xúc xắc:', 'Thẻ SD', 'Thẻ SD không được phát hiện.', 'SHA256 của xúc xắc:', 'Sha256 của ảnh chụp:', 'Lưu Ảnh QR vào Thẻ SD', 'Lưu vào thẻ SD', 'Lưu vào thẻ SD?', 'Đã lưu vào thẻ SD', 'Tỉ lệ', 'Quét địa chỉ', 'Quét cụm mật khẩu BIP39', 'Quét mã QR khóa', 'Đang quét lại từ 1-12', 'Đang quét từ 13-24', 'Thời gian chế độ bảo vệ màn hình', 'Kiểu văn lệnh', 'Bảo mật', 'Tự chuyển nhượng hoặc giao dịch (%d):', 'Tự chuyển nhượng:', 'Đặt mã kiểm tra giả mạo trước', 'Cài đặt', 'Cài đặt được lưu trữ nội bộ trên đèn flash.', 'Cài đặt được lưu trên thẻ SD.', 'Entropy của Shannon:', 'Tắt máy', 'Thời gian tắt máy', 'Đang tắt..', 'Chữ kí', 'Ký vào mã QR', 'Ký vào thẻ SD', 'Kí?', 'Chữ ký', 'Tin nhắn đã ký', 'Đã ký PSBT', 'Đang ký..', 'Khóa đơn', 'Dung lượng:', 'Một số kiểm tra không thể được thực hiện.', 'Chi tiêu (%d):', 'Chi tiêu:', 'Số liệu thống kê cho Mọt sách', 'Lưu trữ trên flash', 'Lưu trữ trên thẻ SD', 'Vuốt để thay đổi chế độ', 'TC Flash Hash', 'Hash Flash TC khi khởi động', 'Chạm màn hình hoặc nhấn nút ENTER để chụp', 'TX Pin', 'Mã kiểm tra giả mạo', 'Đã đặt mã kiểm tra giả mạo thành công', 'Mã kiểm tra giả mạo không khớp', 'Chữ', "The app will be copied to user's flash ", 'Chủ đề', 'Nhiệt', 'Sử dụng tính năng Xóa dữ liệu trên thiết bị để đảm bảo dữ liệu không thể phục hồi', 'Chuyển đổi độ sáng', 'Công cụ', 'Ngưỡng cảm ứng', 'Màn hình cảm ứng', 'Thử thêm nữa?', 'Nhập cụm mật khẩu BIP39', 'Nhập khóa', 'Đơn vị', 'Nâng cấp hoàn tất.', 'Sử dụng bề mặt nền đen.', 'Sử dụng sự ngẫu nhiên của máy ảnh để tạo ra một Mnemonic mới', 'Đã sử dụng:', 'Người dùng', 'Giá trị %s ngoài phạm vi: [ %s, %s]', 'Giá trị phải là bội của %s', 'Đang xác minh..', 'Phiên Bản', 'Qua máy ảnh', 'Qua xúc xắc 20 mặt', 'Qua xúc xắc 6 mặt', 'Thông qua đầu vào thủ công', 'Thông qua từ ngữ', 'Chờ bắt', 'Ví', 'Trình mô tả ví', 'Ví đầu ra mô tả', 'Đã tải bộ mô tả đầu ra của ví!', 'Không tìm thấy bộ mô tả đầu ra ví.', 'Cảnh báo:', 'Kí tự %d', 'Từ số', 'Từ ngữ', 'Đúng', 'là một địa chỉ hợp lệ!', 'kHÔNG TÌM THẤY trong %d địa chỉ đầu tiên'] +translation_array = [ + "% của số tiền.", + "%d của %d đa chữ kí", + "%d đến %d", + "%s Đã bỏ.", + "(tổng cộng %d)", + "(Thực nghiệm)", + "(chỉ xem)", + "12 từ", + "24 từ", + "Về chúng tôi", + "Chấp nhận giả định?", + "Tài khoản", + "Tài khoản #0 sẽ được giả định", + "Chỉ mục tài khoản", + "Thêm hoặc thay đổi cụm mật khẩu ví?", + "Cần thêm entropy từ camera cho chế độ AES-CBC", + "Địa chỉ", + "Căn chỉnh camera và tấm dự phòng đúng cách.", + "Cho phép cài đặt trước!", + "Chống lóa bị vô hiệu hóa", + "Đã bật chống lóa", + "Giao diện", + "Bạn có chắc không?", + "Màu BGR", + "Từ gợi nhớ BIP39", + "Trở lại", + "Quay lại Menu", + "Sao lưu Mnemonic", + "Chữ ký xấu", + "Mật khẩu Base64", + "Tốc độ baud", + "Lưới nhị phân", + "Đệm viền", + "Độ sáng", + "Nút", + "Loại bỏ nhiễu nút", + "Hủy chụp hình", + "Thay đổi", + "Các địa chỉ tiền thối", + "Thay đổi giao diện và khởi động lại?", + "Thay đổi:", + "Thay đổi sẽ kéo dài cho đến khi tắt máy.", + "Kiểm tra thẻ SD", + "Kiểm tra địa chỉ đó có thuộc về ví này không?", + "Đã kiểm tra %d địa chỉ không khớp.", + "Kiểm tra thẻ SD..", + "Xác nhận mã kiểm tra giả mạo", + "Tạo mã QR", + "Tạo mã QR từ văn bản?", + "Tạo:", + "Mã kiểm tra giả mạo hiện tại", + "Mã QR tùy chỉnh", + "Tùy chỉnh", + "Tùy chỉnh ví của bạn sẽ tạo một Khóa mới.", + "Chiều sâu cắt", + "Phương pháp cắt", + "Số thập phân", + "Giải mã?", + "Ví mặc định", + "Độ sâu mỗi lần cắt CNC", + "Suy ra entropy BIP85?", + "Địa chỉ người mô tả", + "Hiển thị", + "Không được tắt máy, có thể mất một lúc để hoàn thành.", + "Hoàn tất?", + "Từ gợi nhớ kép", + "Driver", + "Trống", + "Bật ứng dụng Krux", + "Đã mã hóa", + "Mã QR được mã hóa", + "Mnemonic được mã hóa không được lưu trữ", + "Mnemonic được mã hóa không được lưu trữ với ID:", + "Mã hóa", + "Chế độ mã hóa", + "Nhập %d từ BIP-39.", + "Nhập mã kiểm tra giả mạo gồm hơn 6 ký tự", + "Nhập từng từ của Mnemonic BIP-39 của bạn dưới dạng số từ 1 đến 2048.", + "Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số thập lục phân từ 1 đến 800.", + "Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số bát phân từ 1 đến 4000.", + "Nhập từng từ của Mnemonic BIP-39 của bạn.", + "Xóa dữ liệu của người dùng", + "Đang xóa dữ liệu của người dùng..", + "Lỗi:", + "Esc", + "Thực thi một ứng dụng Krux đã ký?", + "Khám phá các tập tin?", + "Xuất vào thẻ SD ..", + "Khóa công cộng", + "Cài đặt Gốc", + "Không giải mã được", + "Tải PSBT thất bại", + "Tải địa chỉ thất bại", + "Không tải được khóa", + "Không tải được tin nhắn", + "Tải mã Mnemonic thất bại", + "Không tải được bộ mô tả đầu ra", + "Không tải được cụm mật khẩu", + "Không lưu trữ Mnemonic được", + "Phí:", + "Tốc độ cắt CNC", + "Tên tệp", + "Tên tệp %s tồn tại trên thẻ SD, ghi đè lên?", + "Điền vào flash với entropy từ máy ảnh?", + "Đèn Flash Đổ Đầy", + "Bỏ dấu vân tay trong PSBT", + "Phần mềm vượt quá kích thước tối đa: %d", + "Bản đồ Flash", + "Công cụ Flash", + "Đèn flash chứa đầy entropy của máy ảnh", + "Tọa độ X bị lật", + "Đường kính mũi cắt CNC", + "Khả dụng:", + "Từ bộ lưu trữ", + "Xóa hoàn toàn thẻ SD trong một thiết bị khác để đảm bảo dữ liệu không thể phục hồi", + "Tạo Mnemonic", + "Cung cấp cho Mnemonic này một ID tùy chỉnh? Nếu không thì fingerprint hiện tại sẽ được sử dụng", + "Chọn", + "Entropy tốt", + "Phần cứng", + "Khóa công cộng Hex", + "Thập lục phân", + "Ẩn Mnemonics", + "Phí cao!", + "Id đã tồn tại", + "Chỉ mục", + "Chỉ mục: %s", + "Đầu vào (%d):", + "Cài đặt phần mềm?", + "Entropy không đủ!", + "Không đủ entropy", + "Mã kiểm tra giả mạo không hợp lệ", + "Địa chỉ không hợp lệ", + "Bộ tải khởi động không hợp lệ", + "Độ dài mã Mnemonic không hợp lệ", + "Khóa công cộng không hợp lệ", + "Ví không hợp lệ:", + "Đảo ngược", + "Màu đảo ngược", + "Chìa khóa", + "Khóa không được cung cấp", + "QR kiểm tra máy in Krux", + "Loại LCD", + "Ngôn ngữ", + "Để trống nếu bạn muốn Krux chọn một từ cuối cùng hợp lệ", + "Trái", + "Độ dài: %s", + "Độ trễ Dòng", + "Đường kẻ:", + "Tải ứng dụng Krux", + "Tải mã mnemonic", + "Nạp Ví", + "Tải mô tả ví đáng tin cậy để xem địa chỉ?", + "Tải từ thẻ SD", + "Tải từ thẻ SD?", + "Tải từ máy ảnh", + "Tải một?", + "Tải?", + "Đang tải máy ảnh..", + "Đang tải địa chỉ tiền thối..", + "Đang tải máy in ..", + "Đang tải địa chỉ nhận..", + "Đang tải..", + "Ngôn ngữ", + "Vị trí lưu", + "Chiều dài tối đa vượt quá (%s)", + "Tin nhắn", + "Tin nhắn:", + "Thiếu tập tin chữ ký", + "Mã mnemonic", + "Mnemonic ID ", + "Từ gợi nhớ và cụm mật khẩu sẽ được lưu giữ.", + "Mnemonic không được mã hóa", + "Đã sửa đổi:", + "Đa chữ kí", + "Native Segwit - 84 sẽ được giả định", + "Mạng lưới", + "Mnemonic mới", + "Phát hiện phần sụn mới.", + "Không", + "Không có cụm mật khẩu", + "Không đủ số lần quay!", + "Số", + "Bát phân", + "Các định dạng khác", + "Lặp lại PBKDF2", + "Tô các chấm đục lỗ màu đen để chúng có thể được phát hiện.", + "Chiều rộng giấy", + "Phần", + "Kích thước một phần", + "Cụm mật khẩu", + "Độ dài mật khẩu tối thiểu:", + "Đường dẫn không khớp", + "Đã phát hiện mẫu!", + "Xóa vĩnh viễn mọi Mnemonics và cài đặt được mã hóa lưu trữ trong flash?", + "Vị trí lưu", + "Chỉ số độ lệch điểm ảnh:", + "QR dạng văn bản", + "Vui lòng tải bộ mô tả đầu ra ví", + "Tỷ lệ sụt giảm", + "Entropy kém", + "Phát hiện entropy yếu!", + "In kiểm tra QR", + "In Tiny Seed?", + "In ra QR", + "In ra mã QR?", + "In?", + "Máy in", + "Trình điều khiển máy in chưa được cài đặt!", + "Đang in..", + "Vẫn tiếp tục?", + "Thực hiện?", + "Đang xử lý..", + "Mã QR", + "RX Pin", + "Khởi động lại", + "Nhận được", + "Các địa chỉ nhận", + "Vùng:", + "Xóa %s?", + "Xóa Mnemonic", + "Xóa các tệp firmware khỏi Thẻ SD?", + "Độ phân giải - Định dạng", + "Khôi phục cài đặt gốc và khởi động lại?", + "Quay lại Trình xem QR", + "Xem lại dữ liệu đã quét, chỉnh sửa nếu cần", + "Phải", + "Lăn xúc xắc ít nhất %d lần để tạo Mnemonic.", + "Phân bổ xúc xắc:", + "Tổng số lần quay xúc xắc:", + "Thẻ SD", + "Thẻ SD không được phát hiện.", + "SHA256 của xúc xắc:", + "Sha256 của ảnh chụp:", + "Lưu Ảnh QR vào Thẻ SD", + "Lưu vào thẻ SD", + "Lưu vào thẻ SD?", + "Đã lưu vào thẻ SD", + "Tỉ lệ", + "Quét địa chỉ", + "Quét cụm mật khẩu BIP39", + "Quét mã QR khóa", + "Đang quét lại từ 1-12", + "Đang quét từ 13-24", + "Thời gian chế độ bảo vệ màn hình", + "Kiểu văn lệnh", + "Bảo mật", + "Tự chuyển nhượng hoặc giao dịch (%d):", + "Tự chuyển nhượng:", + "Đặt mã kiểm tra giả mạo trước", + "Cài đặt", + "Cài đặt được lưu trữ nội bộ trên đèn flash.", + "Cài đặt được lưu trên thẻ SD.", + "Entropy của Shannon:", + "Tắt máy", + "Thời gian tắt máy", + "Đang tắt..", + "Chữ kí", + "Ký vào mã QR", + "Ký vào thẻ SD", + "Kí?", + "Chữ ký", + "Tin nhắn đã ký", + "Đã ký PSBT", + "Đang ký..", + "Khóa đơn", + "Dung lượng:", + "Một số kiểm tra không thể được thực hiện.", + "Chi tiêu (%d):", + "Chi tiêu:", + "Số liệu thống kê cho Mọt sách", + "Lưu trữ trên flash", + "Lưu trữ trên thẻ SD", + "Vuốt để thay đổi chế độ", + "TC Flash Hash", + "Hash Flash TC khi khởi động", + "Chạm màn hình hoặc nhấn nút ENTER để chụp", + "TX Pin", + "Mã kiểm tra giả mạo", + "Đã đặt mã kiểm tra giả mạo thành công", + "Mã kiểm tra giả mạo không khớp", + "Chữ", + "The app will be copied to user's flash ", + "Chủ đề", + "Nhiệt", + "Sử dụng tính năng Xóa dữ liệu trên thiết bị để đảm bảo dữ liệu không thể phục hồi", + "Chuyển đổi độ sáng", + "Công cụ", + "Ngưỡng cảm ứng", + "Màn hình cảm ứng", + "Thử thêm nữa?", + "Nhập cụm mật khẩu BIP39", + "Nhập khóa", + "Đơn vị", + "Nâng cấp hoàn tất.", + "Sử dụng bề mặt nền đen.", + "Sử dụng sự ngẫu nhiên của máy ảnh để tạo ra một Mnemonic mới", + "Đã sử dụng:", + "Người dùng", + "Giá trị %s ngoài phạm vi: [ %s, %s]", + "Giá trị phải là bội của %s", + "Đang xác minh..", + "Phiên Bản", + "Qua máy ảnh", + "Qua xúc xắc 20 mặt", + "Qua xúc xắc 6 mặt", + "Thông qua đầu vào thủ công", + "Thông qua từ ngữ", + "Chờ bắt", + "Ví", + "Trình mô tả ví", + "Ví đầu ra mô tả", + "Đã tải bộ mô tả đầu ra của ví!", + "Không tìm thấy bộ mô tả đầu ra ví.", + "Cảnh báo:", + "Kí tự %d", + "Từ số", + "Từ ngữ", + "Đúng", + "là một địa chỉ hợp lệ!", + "kHÔNG TÌM THẤY trong %d địa chỉ đầu tiên", +] diff --git a/src/krux/translations/zh.py b/src/krux/translations/zh.py index 6396160c7..65fdba2b3 100644 --- a/src/krux/translations/zh.py +++ b/src/krux/translations/zh.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['% 的金额。', '%d/%d 多签', '%d到%d', '已移除%s', '(总计 %d)', '(实验性)', '(仅观察)', '12 单词', '24 单词', '关于', '接受假设?', '账户', '将假定为账户 #0', '账户索引', '添加或更改钱包密码?', 'AES-CBC 模式需要相机的额外熵', '地址', '正确对齐摄像头和背板。', '首先在设置中允许!', '防眩光已禁用', '防眩光已启用', '界面', '确定?', 'BGR 颜色', 'BIP39助记符', '返回', '返回菜单', '备份助记词', '签名无效', 'Base64密码', '波特率', '二进制网格', '边框填充', '亮度', '按钮', '按钮去抖动', '截取已取消', '找零', '找零地址', '更改主题并重新启动?', '找零', '更改将在关机前保持。', '检查 SD 卡', '检查该地址是否属于此钱包?', '已检查 %d 个不匹配的地址。', '检查 SD 卡..', '确认防篡改检查码', '创建二维码', '从文本创建二维码?', '已创建:', '当前防篡改检查码', '自定义二维码', '自定义', '自定义您的钱包将生成新私钥。', '切割深度', '切割方法', '十进制', '解密?', '默认钱包', '每次通过的深度', '导出BIP85熵?', '描述符地址', '显示', '请勿断电,可能需要一段时间完成。', '完成了吗?', '双重助记词', '驱动程序', '为空', '启用Krux应用程序', '已加密', '加密二维码', '加密助记词未存储', '加密助记词已存储,ID 为:', '加密', '加密模式', '输入 %d 个 BIP-39 词。', '输入6个以上字符的防篡改检查码', '将 BIP-39 助记词的每个词作为 1 到 2048 的数字输入。', '将 BIP-39 助记词的每个词作为 1 到 800 的十六进制数输入。', '将 BIP-39 助记词的每个词作为 1 到 4000 的八进制数输入。', '输入每个 BIP-39 助记词。', '清除用户数据', '正在擦除用户数据..', '错误:', '退出', '是否执行签名的Krux应用程序?', '浏览文件?', '导出到 SD 卡..', '扩展公钥', '出厂设置', '解密失败', '加载 PSBT 失败', '加载地址失败', '加载密钥失败', '加载消息失败', '加载助记词失败', '加载输出描述符失败', '加载密码失败', '存储助记词失败', '费用:', '进给速度', '文件名', '文件名 %s 存在于 SD 卡上,覆盖?', '用摄像头的熵填充Flash?', '填充Flash', 'PSBT 中未设置指纹', '固件超过最大尺寸:%d', 'Flash地图', 'Flash工具', 'Flash已用摄像头熵填充', '翻转 X 坐标', '刀具直径', '空闲:', '从存储中', '在其他设备中完全擦除您的 SD 卡以确保数据不可恢复', '生成助记词', '为此助记词设置自定义 ID?否则将使用当前指纹', '去', '良好的熵', '硬件', '十六进制公钥', '十六进制', '隐藏助记词', '高费用!', 'ID 已存在', '索引', '索引: %s', '输入 (%d):', '安装?', '熵不足!', '熵不足', '无效的防篡改检查码', '无效地址', '无效的 ootloader ', '助记词长度无效', '无效公钥', '无效钱包:', '反转', '反转颜色', '密钥', '未提供密钥', 'Krux 打印机测试二维码', 'LCD 类型', '语言', '如果希望 Krux 自动计算最后一位 Checksum,请留空', '左', '长度: %s', '行延迟', '行:', '加载Krux应用', '加载助记词', '加载钱包', '加载受信任的钱包描述符以查看地址?', '从 SD 卡加载', '从 SD 卡加载?', '从相机加载', '加载一个?', '加载?', '加载相机..', '加载找零地址..', '加载打印机..', '加载接收地址..', '加载中..', '语言环境', '位置', '超过最大长度(%s)', '消息', '消息:', '缺少签名文件', '助记词', '助记词 ID', '助记词和密码将被保留。', '助记词未加密', '修改时间:', '多签', '假定为原生 Segwit - 84', '网络', '新助记词', '检测到新固件。', '否', '无 Passphrase ', '投掷次数不足!', '数字', '八进制', '其他格式', 'PBKDF2 迭代', '将打孔点涂黑,以便它们能被检测到。', '纸张宽度', '部分', '部件尺寸', 'Passphrase', '密码长度:', '路径不匹配', '检测到模式!', '从 Flash 中永久删除所有存储的加密助记词和设置?', '保存', '像素偏差指数:', '明文二维码', '请加载钱包输出描述符', '下刀速度', '熵值低', '检测到低熵!', '打印测试二维码', '打印 Tiny Seed?', '打印到二维码', '打印到二维码?', '打印?', '打印机', '打印机驱动程序未设置!', '正在打印', '继续吗?', '继续?', '正在处理..', '二维码', 'RX 引脚', '重启', '接收', '接收地址', '区域:', '删除 %s?', '删除助记词', '从 SD 卡中删除固件文件?', '分辨率 - 格式', '恢复出厂设置并重新设备?', '返回二维码查看器', '请检查扫描的数据,如有必要请编辑', '右', '掷骰子至少 %d 次以生成助记词。', '掷骰子分布:', '掷骰子:', 'SD 卡', '未检测到 SD 卡。', '掷骰子的 SHA256:', '快照的 SHA256:', '将二维码图像保存到 SD 卡', '保存到 SD 卡', '保存到 SD 卡?', '保存到 SD 卡', '缩放', '扫描地址', '扫描 BIP39 Passphrase', '扫描私钥二维码', '重新扫扫描第 1-12 个单词', '扫描第 13-24 个单词', '屏保时间', '脚本类型', '安全', '自转或找零 (%d):', '自行转账:', '请先设置防篡改检查码', '设置', '设置存储在 Flash 内部。', '设置存储在SD卡上。', '香农熵:', '关机', '关机时间', '关机中..', '签名', '二维码签名', ' SD 卡签名', '是否签名?', '签名', '签名消息', '已签名 PSBT', '签名中..', '单签', '大小:', '无法执行某些检查。', '花费 (%d):', '花费', '极客统计数据', '存储到 Flash', '存储到 SD 卡', '滑动切换模式', 'TC Flash Hash', '启动时的 TC Flash Hash', '点击或按下 ENTER 截图', 'TX 引脚', '防篡改检查码', '防篡改检查码设置成功', '防篡改检查码不匹配', '文本', "The app will be copied to user's flash ", '主题', '热敏', '要确保数据不可恢复,请使用擦除设备功能', '调整亮度', '工具', '触摸阈值', '触摸屏', '再次尝试?', '输入 BIP39 Phrasephrase', '输入私钥', '单位', '升级已完成。', '使用黑色背景界面。', '使用摄像头的熵创建新助记词', '已用:', '用户数据', '值 %s 超出范围:[ %s,%s ]', '值必须是 %s 的倍数', '验证中..', '版本', '通过摄像头', '通过 D20', '通过 D6', '通过手动输入', '通过单词', '等待截取', '钱包', '钱包描述', '钱包输出描述符', '钱包输出描述符加载重复!', '未找到钱包输出描述符。', '警告:', '词 %d', '单词序号', '单词', '是', ' 非有效地址', '在前 %d 个地址中未找到'] +translation_array = [ + "% 的金额。", + "%d/%d 多签", + "%d到%d", + "已移除%s", + "(总计 %d)", + "(实验性)", + "(仅观察)", + "12 单词", + "24 单词", + "关于", + "接受假设?", + "账户", + "将假定为账户 #0", + "账户索引", + "添加或更改钱包密码?", + "AES-CBC 模式需要相机的额外熵", + "地址", + "正确对齐摄像头和背板。", + "首先在设置中允许!", + "防眩光已禁用", + "防眩光已启用", + "界面", + "确定?", + "BGR 颜色", + "BIP39助记符", + "返回", + "返回菜单", + "备份助记词", + "签名无效", + "Base64密码", + "波特率", + "二进制网格", + "边框填充", + "亮度", + "按钮", + "按钮去抖动", + "截取已取消", + "找零", + "找零地址", + "更改主题并重新启动?", + "找零", + "更改将在关机前保持。", + "检查 SD 卡", + "检查该地址是否属于此钱包?", + "已检查 %d 个不匹配的地址。", + "检查 SD 卡..", + "确认防篡改检查码", + "创建二维码", + "从文本创建二维码?", + "已创建:", + "当前防篡改检查码", + "自定义二维码", + "自定义", + "自定义您的钱包将生成新私钥。", + "切割深度", + "切割方法", + "十进制", + "解密?", + "默认钱包", + "每次通过的深度", + "导出BIP85熵?", + "描述符地址", + "显示", + "请勿断电,可能需要一段时间完成。", + "完成了吗?", + "双重助记词", + "驱动程序", + "为空", + "启用Krux应用程序", + "已加密", + "加密二维码", + "加密助记词未存储", + "加密助记词已存储,ID 为:", + "加密", + "加密模式", + "输入 %d 个 BIP-39 词。", + "输入6个以上字符的防篡改检查码", + "将 BIP-39 助记词的每个词作为 1 到 2048 的数字输入。", + "将 BIP-39 助记词的每个词作为 1 到 800 的十六进制数输入。", + "将 BIP-39 助记词的每个词作为 1 到 4000 的八进制数输入。", + "输入每个 BIP-39 助记词。", + "清除用户数据", + "正在擦除用户数据..", + "错误:", + "退出", + "是否执行签名的Krux应用程序?", + "浏览文件?", + "导出到 SD 卡..", + "扩展公钥", + "出厂设置", + "解密失败", + "加载 PSBT 失败", + "加载地址失败", + "加载密钥失败", + "加载消息失败", + "加载助记词失败", + "加载输出描述符失败", + "加载密码失败", + "存储助记词失败", + "费用:", + "进给速度", + "文件名", + "文件名 %s 存在于 SD 卡上,覆盖?", + "用摄像头的熵填充Flash?", + "填充Flash", + "PSBT 中未设置指纹", + "固件超过最大尺寸:%d", + "Flash地图", + "Flash工具", + "Flash已用摄像头熵填充", + "翻转 X 坐标", + "刀具直径", + "空闲:", + "从存储中", + "在其他设备中完全擦除您的 SD 卡以确保数据不可恢复", + "生成助记词", + "为此助记词设置自定义 ID?否则将使用当前指纹", + "去", + "良好的熵", + "硬件", + "十六进制公钥", + "十六进制", + "隐藏助记词", + "高费用!", + "ID 已存在", + "索引", + "索引: %s", + "输入 (%d):", + "安装?", + "熵不足!", + "熵不足", + "无效的防篡改检查码", + "无效地址", + "无效的 ootloader ", + "助记词长度无效", + "无效公钥", + "无效钱包:", + "反转", + "反转颜色", + "密钥", + "未提供密钥", + "Krux 打印机测试二维码", + "LCD 类型", + "语言", + "如果希望 Krux 自动计算最后一位 Checksum,请留空", + "左", + "长度: %s", + "行延迟", + "行:", + "加载Krux应用", + "加载助记词", + "加载钱包", + "加载受信任的钱包描述符以查看地址?", + "从 SD 卡加载", + "从 SD 卡加载?", + "从相机加载", + "加载一个?", + "加载?", + "加载相机..", + "加载找零地址..", + "加载打印机..", + "加载接收地址..", + "加载中..", + "语言环境", + "位置", + "超过最大长度(%s)", + "消息", + "消息:", + "缺少签名文件", + "助记词", + "助记词 ID", + "助记词和密码将被保留。", + "助记词未加密", + "修改时间:", + "多签", + "假定为原生 Segwit - 84", + "网络", + "新助记词", + "检测到新固件。", + "否", + "无 Passphrase ", + "投掷次数不足!", + "数字", + "八进制", + "其他格式", + "PBKDF2 迭代", + "将打孔点涂黑,以便它们能被检测到。", + "纸张宽度", + "部分", + "部件尺寸", + "Passphrase", + "密码长度:", + "路径不匹配", + "检测到模式!", + "从 Flash 中永久删除所有存储的加密助记词和设置?", + "保存", + "像素偏差指数:", + "明文二维码", + "请加载钱包输出描述符", + "下刀速度", + "熵值低", + "检测到低熵!", + "打印测试二维码", + "打印 Tiny Seed?", + "打印到二维码", + "打印到二维码?", + "打印?", + "打印机", + "打印机驱动程序未设置!", + "正在打印", + "继续吗?", + "继续?", + "正在处理..", + "二维码", + "RX 引脚", + "重启", + "接收", + "接收地址", + "区域:", + "删除 %s?", + "删除助记词", + "从 SD 卡中删除固件文件?", + "分辨率 - 格式", + "恢复出厂设置并重新设备?", + "返回二维码查看器", + "请检查扫描的数据,如有必要请编辑", + "右", + "掷骰子至少 %d 次以生成助记词。", + "掷骰子分布:", + "掷骰子:", + "SD 卡", + "未检测到 SD 卡。", + "掷骰子的 SHA256:", + "快照的 SHA256:", + "将二维码图像保存到 SD 卡", + "保存到 SD 卡", + "保存到 SD 卡?", + "保存到 SD 卡", + "缩放", + "扫描地址", + "扫描 BIP39 Passphrase", + "扫描私钥二维码", + "重新扫扫描第 1-12 个单词", + "扫描第 13-24 个单词", + "屏保时间", + "脚本类型", + "安全", + "自转或找零 (%d):", + "自行转账:", + "请先设置防篡改检查码", + "设置", + "设置存储在 Flash 内部。", + "设置存储在SD卡上。", + "香农熵:", + "关机", + "关机时间", + "关机中..", + "签名", + "二维码签名", + " SD 卡签名", + "是否签名?", + "签名", + "签名消息", + "已签名 PSBT", + "签名中..", + "单签", + "大小:", + "无法执行某些检查。", + "花费 (%d):", + "花费", + "极客统计数据", + "存储到 Flash", + "存储到 SD 卡", + "滑动切换模式", + "TC Flash Hash", + "启动时的 TC Flash Hash", + "点击或按下 ENTER 截图", + "TX 引脚", + "防篡改检查码", + "防篡改检查码设置成功", + "防篡改检查码不匹配", + "文本", + "The app will be copied to user's flash ", + "主题", + "热敏", + "要确保数据不可恢复,请使用擦除设备功能", + "调整亮度", + "工具", + "触摸阈值", + "触摸屏", + "再次尝试?", + "输入 BIP39 Phrasephrase", + "输入私钥", + "单位", + "升级已完成。", + "使用黑色背景界面。", + "使用摄像头的熵创建新助记词", + "已用:", + "用户数据", + "值 %s 超出范围:[ %s,%s ]", + "值必须是 %s 的倍数", + "验证中..", + "版本", + "通过摄像头", + "通过 D20", + "通过 D6", + "通过手动输入", + "通过单词", + "等待截取", + "钱包", + "钱包描述", + "钱包输出描述符", + "钱包输出描述符加载重复!", + "未找到钱包输出描述符。", + "警告:", + "词 %d", + "单词序号", + "单词", + "是", + " 非有效地址", + "在前 %d 个地址中未找到", +] From b2220ffe486ea3d16b10819159db28749a30be9f Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sun, 8 Dec 2024 01:27:04 -0300 Subject: [PATCH 24/86] translations --- src/krux/translations/__init__.py | 338 +++++++++++++++++++++++++++++- src/krux/translations/de.py | 324 +++++++++++++++++++++++++++- src/krux/translations/es.py | 324 +++++++++++++++++++++++++++- src/krux/translations/fr.py | 324 +++++++++++++++++++++++++++- src/krux/translations/ja.py | 324 +++++++++++++++++++++++++++- src/krux/translations/ko.py | 324 +++++++++++++++++++++++++++- src/krux/translations/nl.py | 324 +++++++++++++++++++++++++++- src/krux/translations/pt.py | 324 +++++++++++++++++++++++++++- src/krux/translations/ru.py | 324 +++++++++++++++++++++++++++- src/krux/translations/tr.py | 324 +++++++++++++++++++++++++++- src/krux/translations/vi.py | 324 +++++++++++++++++++++++++++- src/krux/translations/zh.py | 324 +++++++++++++++++++++++++++- 12 files changed, 3889 insertions(+), 13 deletions(-) diff --git a/src/krux/translations/__init__.py b/src/krux/translations/__init__.py index e00b05a22..7d57c2aef 100644 --- a/src/krux/translations/__init__.py +++ b/src/krux/translations/__init__.py @@ -19,5 +19,339 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -available_languages = ["de-DE", "es-MX", "fr-FR", "ja-JP", "ko-KR", "nl-NL", "pt-BR", "ru-RU", "tr-TR", "vi-VN", "zh-CN"] -ref_array = [232475068, 1185266064, 1503087751, 1178563089, 1092222515, 3348584292, 1099786887, 2739590230, 1310058127, 1949634023, 4287534872, 2995482424, 2415648848, 1043817877, 3439746594, 2143824150, 3270727197, 900375497, 276039542, 88746165, 1521033296, 3857613120, 1056821534, 1868069640, 3247612282, 3455872521, 4151330982, 2756316330, 2256777600, 2568189522, 3937333362, 2046615409, 928727036, 2519455027, 2363604010, 2038226551, 3138204438, 1207696150, 3126552510, 1583186953, 3768416405, 388908871, 3442025874, 3119547911, 1187826970, 2470115694, 422237057, 4094072796, 167798282, 678449760, 1347214433, 3513215254, 3585411775, 534274978, 124617190, 597912140, 2504034831, 2751113454, 1272005728, 4102535566, 2940689088, 1712856005, 3278654271, 3895447625, 3836852788, 690625786, 382368239, 2835747520, 807457043, 3582575312, 1244124409, 2968548114, 781419966, 350279787, 2601598799, 1821513079, 2325729718, 3504179008, 1100685007, 4090266642, 2780625730, 3625557340, 3706575164, 889040671, 1505332462, 2731446492, 3838465623, 4170881190, 1711312434, 3981762528, 383371114, 3048830188, 4192663412, 1996021743, 1108715658, 1081425878, 928667220, 1620572516, 2946146830, 262248294, 104500973, 3313339187, 1982637349, 4014189410, 3804482397, 4006602858, 2542772894, 828589330, 2777318640, 1384661010, 3748840176, 1406590538, 1077771640, 1893243331, 1871146425, 3549015533, 299338213, 602716148, 1198393582, 133139382, 3580020863, 2691246967, 3903754133, 3876651191, 2880010062, 1102202885, 958390318, 3242179508, 3034883011, 3755547839, 2032416055, 3248804547, 2585599782, 2874529150, 4093416954, 1422874211, 237577215, 4122897393, 640219121, 3000888649, 3264569915, 3835918229, 911419226, 766317539, 4180141032, 3663022166, 1163744846, 972436696, 2176866982, 2993872092, 2820726296, 2369474953, 2256441194, 237136240, 879727077, 1936877965, 669106195, 3330705289, 2596531078, 2488179069, 336702608, 1201104769, 3159494909, 1177338798, 2817059741, 2917810189, 2030045667, 762611188, 3928301843, 1948316555, 2123991188, 1443208255, 1746030071, 1237332019, 1845376098, 4265479636, 2939797024, 73574491, 3634967631, 4063104189, 2325721074, 4092516657, 3089363813, 1577637745, 391304453, 3312581301, 995862913, 2987800462, 3913146360, 3559456868, 4249903283, 433951968, 3745269737, 500286397, 3040011773, 140802882, 2578106186, 1703779997, 3561756278, 784609464, 3761518438, 3639136476, 3037062877, 2362732578, 3123770978, 3345150514, 3339507095, 1123106929, 3903571079, 3586624216, 3593149291, 2580599003, 3108881025, 1848310591, 710709610, 3338633658, 2697857197, 1746677167, 1658501467, 3739634002, 1476462492, 1557093280, 2817311427, 2365886561, 3091105710, 1662254634, 1963678224, 770350922, 3271055013, 432366011, 3976793317, 2736513298, 1166743226, 817419367, 699906428, 2163347007, 3531742595, 2940025484, 763824768, 4117455079, 4038076821, 923277590, 4006316572, 2736506158, 2029624154, 289960586, 1022211991, 4255182430, 3753172956, 2186790517, 473154195, 563836138, 712533907, 2377955518, 1825881236, 3656120779, 2120776272, 1061961408, 2293863356, 2879966040, 4282338366, 746161122, 1988416729, 3672006076, 3406791302, 2281377987, 2019512665, 2344747135, 2090568351, 1260825919, 1232757391, 3303592908, 720041451, 3514476519, 2596024031, 2440924821, 1898550184, 4228215415, 2336603177, 3679411849, 1820163048, 2612594937, 1531842997, 1454688268, 1180180513, 2258131455, 2700207481, 725348723, 3684696112, 2978718564, 2732611775, 401829098, 2061556020, 2089395053, 2786714360, 2674953168, 2402455261, 3336226318, 3984160815, 4003084591, 989428076, 3429519584, 1889659487, 4191058607, 1254681955, 525309547, 590330112, 1947603760, 2504354847, 2076481321, 2297028319, 4232654916, 2587172867, 2499782468, 2671738224, 797660533, 3742424146, 2965123464, 1303016265, 2171149824, 1875891934] +available_languages = [ + "de-DE", + "es-MX", + "fr-FR", + "ja-JP", + "ko-KR", + "nl-NL", + "pt-BR", + "ru-RU", + "tr-TR", + "vi-VN", + "zh-CN", +] +ref_array = [ + 232475068, + 1185266064, + 1503087751, + 1178563089, + 1092222515, + 3348584292, + 1099786887, + 2739590230, + 1310058127, + 1949634023, + 4287534872, + 2995482424, + 2415648848, + 1043817877, + 3439746594, + 2143824150, + 3270727197, + 900375497, + 276039542, + 88746165, + 1521033296, + 3857613120, + 1056821534, + 1868069640, + 3247612282, + 3455872521, + 4151330982, + 2756316330, + 2256777600, + 2568189522, + 3937333362, + 2046615409, + 928727036, + 2519455027, + 2363604010, + 2038226551, + 3138204438, + 1207696150, + 3126552510, + 1583186953, + 3768416405, + 388908871, + 3442025874, + 3119547911, + 1187826970, + 2470115694, + 422237057, + 4094072796, + 167798282, + 678449760, + 1347214433, + 3513215254, + 3585411775, + 534274978, + 124617190, + 597912140, + 2504034831, + 2751113454, + 1272005728, + 4102535566, + 2940689088, + 1712856005, + 3278654271, + 3895447625, + 3836852788, + 690625786, + 382368239, + 2835747520, + 807457043, + 3582575312, + 1244124409, + 2968548114, + 781419966, + 350279787, + 2601598799, + 1821513079, + 2325729718, + 3504179008, + 1100685007, + 4090266642, + 2780625730, + 3625557340, + 3706575164, + 889040671, + 1505332462, + 2731446492, + 3838465623, + 4170881190, + 1711312434, + 3981762528, + 383371114, + 3048830188, + 4192663412, + 1996021743, + 1108715658, + 1081425878, + 928667220, + 1620572516, + 2946146830, + 262248294, + 104500973, + 3313339187, + 1982637349, + 4014189410, + 3804482397, + 4006602858, + 2542772894, + 828589330, + 2777318640, + 1384661010, + 3748840176, + 1406590538, + 1077771640, + 1893243331, + 1871146425, + 3549015533, + 299338213, + 602716148, + 1198393582, + 133139382, + 3580020863, + 2691246967, + 3903754133, + 3876651191, + 2880010062, + 1102202885, + 958390318, + 3242179508, + 3034883011, + 3755547839, + 2032416055, + 3248804547, + 2585599782, + 2874529150, + 4093416954, + 1422874211, + 237577215, + 4122897393, + 640219121, + 3000888649, + 3264569915, + 3835918229, + 911419226, + 766317539, + 4180141032, + 3663022166, + 1163744846, + 972436696, + 2176866982, + 2993872092, + 2820726296, + 2369474953, + 2256441194, + 237136240, + 879727077, + 1936877965, + 669106195, + 3330705289, + 2596531078, + 2488179069, + 336702608, + 1201104769, + 3159494909, + 1177338798, + 2817059741, + 2917810189, + 2030045667, + 762611188, + 3928301843, + 1948316555, + 2123991188, + 1443208255, + 1746030071, + 1237332019, + 1845376098, + 4265479636, + 2939797024, + 73574491, + 3634967631, + 4063104189, + 2325721074, + 4092516657, + 3089363813, + 1577637745, + 391304453, + 3312581301, + 995862913, + 2987800462, + 3913146360, + 3559456868, + 4249903283, + 433951968, + 3745269737, + 500286397, + 3040011773, + 140802882, + 2578106186, + 1703779997, + 3561756278, + 784609464, + 3761518438, + 3639136476, + 3037062877, + 2362732578, + 3123770978, + 3345150514, + 3339507095, + 1123106929, + 3903571079, + 3586624216, + 3593149291, + 2580599003, + 3108881025, + 1848310591, + 710709610, + 3338633658, + 2697857197, + 1746677167, + 1658501467, + 3739634002, + 1476462492, + 1557093280, + 2817311427, + 2365886561, + 3091105710, + 1662254634, + 1963678224, + 770350922, + 3271055013, + 432366011, + 3976793317, + 2736513298, + 1166743226, + 817419367, + 699906428, + 2163347007, + 3531742595, + 2940025484, + 763824768, + 4117455079, + 4038076821, + 923277590, + 4006316572, + 2736506158, + 2029624154, + 289960586, + 1022211991, + 4255182430, + 3753172956, + 2186790517, + 473154195, + 563836138, + 712533907, + 2377955518, + 1825881236, + 3656120779, + 2120776272, + 1061961408, + 2293863356, + 2879966040, + 4282338366, + 746161122, + 1988416729, + 3672006076, + 3406791302, + 2281377987, + 2019512665, + 2344747135, + 2090568351, + 1260825919, + 1232757391, + 3303592908, + 720041451, + 3514476519, + 2596024031, + 2440924821, + 1898550184, + 4228215415, + 2336603177, + 3679411849, + 1820163048, + 2612594937, + 1531842997, + 1454688268, + 1180180513, + 2258131455, + 2700207481, + 725348723, + 3684696112, + 2978718564, + 2732611775, + 401829098, + 2061556020, + 2089395053, + 2786714360, + 2674953168, + 2402455261, + 3336226318, + 3984160815, + 4003084591, + 989428076, + 3429519584, + 1889659487, + 4191058607, + 1254681955, + 525309547, + 590330112, + 1947603760, + 2504354847, + 2076481321, + 2297028319, + 4232654916, + 2587172867, + 2499782468, + 2671738224, + 797660533, + 3742424146, + 2965123464, + 1303016265, + 2171149824, + 1875891934, +] diff --git a/src/krux/translations/de.py b/src/krux/translations/de.py index 8335b5f35..d8918c6c0 100644 --- a/src/krux/translations/de.py +++ b/src/krux/translations/de.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['% des Betrags.', '%d von %d Multisig', '%d bis %d ', '%s wurde entfernt.', '(%d insgesamt)', '(Experimental)', '(nur zur Betrachtung)', '12 Wörter', '24 Wörter', 'Über', 'Annahme akzeptieren?', 'Konto', 'Konto #0 würde angenommen', 'Kontoindex', 'Wallet-Passphrase hinzufügen oder ändern?', 'Zusätzliche Entropie von der Kamera für den AES-CBC-Modus erforderlich', 'Adresse', 'Richte Kamera und Sicherungsplatte richtig aus.', 'Erlaube zuerst Einstellungen!', 'Blendschutz deaktiviert', 'Blendschutz aktiviert', 'Aussehen', 'Bist Du sicher?', 'BGR-Farben', 'BIP39-Mnemonik', 'Zurück', 'Zurück zum Menü', 'Mnemonik-Backup', 'Ungültige Signatur', 'Base64-Passwort', 'Baudrate', 'Binäres Gitter', 'Randpolsterung', 'Helligkeit', 'Tasten', 'Entprellung der Tasten', 'Aufnahme abgebrochen', 'Change Adresse', 'Change Adressen', 'Thema ändern und neu starten?', 'Change:', 'Änderungen bleiben bis zum Herunterfahren bestehen.', 'Prüfe SD-Karte', 'Überprüfen, ob diese Adresse zu dieser Wallet gehört?', 'Überprüfte %d Adresse ohne Übereinstimmungen.', 'Suche nach SD-Karte..', 'Bestätigen Sie den Tamper Check Code', 'Erstelle QR-Code', 'QR-Code aus Text erzeugen?', 'Erstellt:', 'Aktueller Tamper Check Code', 'Benutzerdefinierte QR-Code', 'Anpassen', 'Wenn Sie Ihr Wallet anpassen, wird ein neuer Schlüssel generiert.', 'Schnitttiefe', 'Cut-Methode', 'Dezimal', 'Entschlüsseln?', 'Standard-Wallet', 'Tiefe pro Durchgang', 'BIP85-Entropie ableiten?', 'Deskriptor-Adressen', 'Bildschirm', 'Schalten Sie das Gerät nicht aus, es kann eine Weile dauern.', 'Fertig?', 'Doppelte Gedächtnisstütze', 'Driver', 'Leer', 'Krux-Apps aktivieren', 'Verschlüsselt', 'Verschlüsselter QR-Code', 'Verschlüsselte Mnemonic wurde nicht gespeichert', 'Speicherung der verschlüsselten Mnemonic mit ID:', 'Verschlüsselung', 'Verschlüsselungsmodus', 'Geben Sie %d BIP-39 Wörter ein.', 'Geben Sie einen Tamper Check Code mit 6+ Zeichen ein', 'Gib jedes Wort Deiner BIP-39 Mnemonic als Zahl von 1 bis 2048 ein.', 'Gib jedes Wort Deiner BIP-39 Mnemonic als Hexadezimalzahl von 1 bis 800 ein.', 'Gib jedes Wort Deiner BIP-39 Mnemonic als Oktalzahl von 1 bis 4000 ein.', 'Gib jedes Wort Deiner BIP-39 Mnemonic ein.', 'Benutzerdaten löschen', 'Benutzerdaten werden gelöscht..', 'Fehler:', 'Esc', 'Eine signierte Krux-App ausführen?', 'Dateien durchsuchen?', 'Auf SD-Karte exportieren..', 'Öffentlicher Schlüssel', 'Werkeinstellungen', 'Entschlüsselung fehlgeschlagen', 'PSBT konnte nicht geladen werden', 'Adresse konnte nicht geladen werden', 'Schlüssel konnte nicht geladen werden', 'Nachricht konnte nicht geladen werden', 'Mnemonic konnte nicht geladen werden', 'Ausgabedeskriptor konnte nicht geladen werden', 'Passphrase konnte nicht geladen werden', 'Mnemonic konnte nicht gespeichert werden', 'Gebühr:', 'Vorschubgeschwindigkeit', 'Dateiname', 'Dateiname %s existiert auf SD-Karte, überschreiben?', 'Den Flash mit Entropie von der Kamera füllen?', 'Flash wird gefüllt', 'Fingerabdruck in PSBT deaktiviert', 'Die Firmware übersteigt die maximale Größe: %d', 'Flash-Karte', 'Flash-Tools', 'Flash gefüllt mit Kameraentropie', 'Umgedrehte X-Koordinaten', 'Flötendurchmesser', 'Frei:', 'Vom Speicher', 'Löschen Sie Ihre SD-Karte vollständig in einem anderen Gerät, um sicherzustellen, dass die Daten nicht wiederhergestellt werden können', 'Mnemonik erzeugen', 'Dieser Mnemonic eine benutzerdefinierte ID zuteilen? Andernfalls wird der aktuelle Fingerabdruck verwendet', 'Go', 'Gute Entropie', 'Hardware', 'Hex öffentlicher Schlüssel', 'Hexadezimal', 'Mnemonics ausblenden', 'Hohe Gebühren!', 'ID existiert bereits', 'Index', 'Index: %s', 'Input (%d):', 'Installieren?', 'Unzureichende Entropie!', 'Unzureichende Entropie', 'Ungültiger Tamper Check Code', 'Ungültige Adresse', 'Ungültiger Bootloader', 'Ungültige mnemonische Lange', 'Ungültiger öffentlicher Schlüssel', 'Ungültige Wallet:', 'Umkehren', 'Invertierte Farben', 'Schlüssel', 'Schlüssel wurde nicht zur Verfügung gestellt', 'Krux Drucker Test-QR', 'LCD-Typ', 'Sprache', 'Lassen Sie das Feld leer, wenn Sie möchten, dass Krux ein gültiges letztes Wort auswählt', 'Links', 'Länge: %s', 'Leitungsverzögerung', 'Linie:', 'Krux-App laden', 'Mnemonic laden', 'Wallet laden', 'Einen vertrauenswürdigen Wallet-Deskriptor laden, um Adressen anzuzeigen?', 'Von SD-Karte laden', 'Von SD-Karte laden?', 'Von der Kamera laden', 'Eine laden?', 'Laden?', 'Lade Kamera..', 'Lade Change Adressen..', 'Drucker wird geladen..', 'Lade Empfangsadressen..', 'Wird geladen..', 'Spracheinstellung', 'Speicherort', 'Maximale Länge überschritten (%s)', 'Nachricht', 'Nachricht:', 'Fehlende Signaturdatei', 'Mnemonic', 'Mnemonische ID', 'Mnemotechnik und Passphrase werden beibehalten.', 'Mnemonic wurde nicht verschlüsselt', 'Geändert:', 'Multisig', 'Native Segwit - 84 würde angenommen', 'Netzwerk', 'Neue Mnemonic', 'Neue Firmware erkannt.', 'Nein', 'Keine Passphrase', 'Nicht genug Würfe!', 'Zahlen', 'Oktal', 'Andere Formate', 'PBKDF2-Iter.', 'Male gestanzte Punkte schwarz an, damit sie erkannt werden können.', 'Papierbreite', 'Teil', 'Teilegröße', 'Passphrase', 'Passwortlänge', 'Pfad stimmt nicht überein', 'Muster erkannt!', 'Alle gespeicherten verschlüsselten Mnemoniken und Einstellungen dauerhaft vom Flash-Speicher entfernen?', 'Speicher', 'Pixelabweichungsindex:', 'Klartext-QR', 'Bitte lade einen Wallet Ausgabedeskriptor', 'Tauchrate', 'Schlechte Entropie', 'Schlechte Entropie erkannt!', 'Drucke Test-QR', 'Tiny Seed drucken?', 'Als QR-Code drucken', 'Als QR-Code drucken?', 'Drucken?', 'Drucker', 'Druckertreiber nicht gesetzt!', 'Wird gedruckt..', 'Trotzdem fortfahren?', 'Weiter?', 'Wird bearbeitet..', 'QR-Code', 'RX Pin', 'Neustart', 'Empfangen', 'Empfangsadresse', 'Region:', 'Löschen %s?', 'Mnemonic löschen', 'Firmware-Dateien von der SD-Karte entfernen?', 'Res. - Format', 'Werkseinstellungen wiederherstellen und neu starten?', 'Zurück zum QR-Viewer', 'Überprüfe gescannte Daten und bearbeite sie bei Bedarf', 'Rechts', 'Würfel mindestens %d Mal, um eine Mnemonic zu erzeugen.', 'Rollenverteilung:', 'Würfe:', 'SD-Karte', 'SD-Karte nicht erkannt.', 'SHA256 der Würfe:', 'SHA256 des Snapshots:', 'QR-Bild auf SD-Karte speichern', 'Auf SD-Karte speichern?', 'Auf SD-Karte speichern?', 'Auf SD-Karte gespeichert', 'Skala', 'Adresse\nscannen', 'Scan BIP39 Passphrase', 'Schlüssel QR-Code Scannen', 'Wörter 1-12 erneut scannen', 'Wörter 13-24 scannen', 'Bildschirmschonerzeit', 'Script-Art', 'Sicherheit', 'Selbstübertragung oder Change (%d):', 'Selbstübertragung:', 'Legen Sie zuerst einen Tamper Check Code fest', 'Einstellungen', 'Die Einstellungen werden intern auf Flash gespeichert.', 'Einstellungen auf SD-Karte gespeichert.', 'Shannons Entropie:', 'Ausschalten', 'Abschaltzeit:', 'Herunterfahren..', 'Signieren', 'Am QR-Code unterschreiben', 'Auf SD-Karte signieren', 'Signieren?', 'Signatur', 'Signierte Nachricht', 'Signierte PSBT', 'Unterschreiben..', 'Single-Sig', 'Größe:', 'Einige Schecks können nicht durchgeführt werden.', 'Ausgabe (%d):', 'Ausgaben:', 'Statistiken für Nerds', 'Auf Flash speichern', 'Auf der SD-Karte speichern', 'Wischen um den Modus zu ändern', 'TC Flash-Hash', 'TC Flash-Hash beim Start', 'TOUCH oder ENTER zum Erfassen', 'TX Pin', 'Tamper Check Code', 'Tamper Check Code erfolgreich gesetzt', 'Tamper Check Codes stimmen nicht überein', 'Text', "The app will be copied to user's flash ", 'Thema', 'Thermisch', "Um sicherzustellen, dass die Daten nicht wiederhergestellt werden können, verwenden Sie die Funktion 'Gerät löschen'", 'Helligkeit umschalten', 'Werkzeuge', 'Berühre Schwellenwert', 'Touchscreen', 'Weiter versuchen?', 'BIP39 Passphrase eingeben', 'Schlüssel eingeben', 'Einheit', 'Upgrade abgeschlossen.', 'Verwende eine schwarze Hintergrundfläche.', 'Verwende die Entropie der Kamera, um eine neue Mnemonic zu erstellen', 'Belegt:', 'Benutzerdaten', 'Wert %S außerhalb des Bereichs: [ %s, %s]', 'Der Wert muss ein Vielfaches von %s sein', 'Überprüfung..', 'Version', 'Via Kamera', 'Via D20', 'Via D6', 'Via manueller Eingabe', 'Via Wörter', 'Warte auf die Erfassung', 'Wallet', 'Wallet-Deskriptor', 'Wallet Ausgabedeskriptor', 'Wallet Ausgabedeskriptor geladen!', 'Wallet Ausgabedeskriptor nicht gefunden.', 'Warnung:', 'Wort %d', 'Wortnummern', 'Wörter', 'Ja', 'ist eine gültige Adresse!', 'wurde in den ersten %d Adressen nicht gefunden'] +translation_array = [ + "% des Betrags.", + "%d von %d Multisig", + "%d bis %d ", + "%s wurde entfernt.", + "(%d insgesamt)", + "(Experimental)", + "(nur zur Betrachtung)", + "12 Wörter", + "24 Wörter", + "Über", + "Annahme akzeptieren?", + "Konto", + "Konto #0 würde angenommen", + "Kontoindex", + "Wallet-Passphrase hinzufügen oder ändern?", + "Zusätzliche Entropie von der Kamera für den AES-CBC-Modus erforderlich", + "Adresse", + "Richte Kamera und Sicherungsplatte richtig aus.", + "Erlaube zuerst Einstellungen!", + "Blendschutz deaktiviert", + "Blendschutz aktiviert", + "Aussehen", + "Bist Du sicher?", + "BGR-Farben", + "BIP39-Mnemonik", + "Zurück", + "Zurück zum Menü", + "Mnemonik-Backup", + "Ungültige Signatur", + "Base64-Passwort", + "Baudrate", + "Binäres Gitter", + "Randpolsterung", + "Helligkeit", + "Tasten", + "Entprellung der Tasten", + "Aufnahme abgebrochen", + "Change Adresse", + "Change Adressen", + "Thema ändern und neu starten?", + "Change:", + "Änderungen bleiben bis zum Herunterfahren bestehen.", + "Prüfe SD-Karte", + "Überprüfen, ob diese Adresse zu dieser Wallet gehört?", + "Überprüfte %d Adresse ohne Übereinstimmungen.", + "Suche nach SD-Karte..", + "Bestätigen Sie den Tamper Check Code", + "Erstelle QR-Code", + "QR-Code aus Text erzeugen?", + "Erstellt:", + "Aktueller Tamper Check Code", + "Benutzerdefinierte QR-Code", + "Anpassen", + "Wenn Sie Ihr Wallet anpassen, wird ein neuer Schlüssel generiert.", + "Schnitttiefe", + "Cut-Methode", + "Dezimal", + "Entschlüsseln?", + "Standard-Wallet", + "Tiefe pro Durchgang", + "BIP85-Entropie ableiten?", + "Deskriptor-Adressen", + "Bildschirm", + "Schalten Sie das Gerät nicht aus, es kann eine Weile dauern.", + "Fertig?", + "Doppelte Gedächtnisstütze", + "Driver", + "Leer", + "Krux-Apps aktivieren", + "Verschlüsselt", + "Verschlüsselter QR-Code", + "Verschlüsselte Mnemonic wurde nicht gespeichert", + "Speicherung der verschlüsselten Mnemonic mit ID:", + "Verschlüsselung", + "Verschlüsselungsmodus", + "Geben Sie %d BIP-39 Wörter ein.", + "Geben Sie einen Tamper Check Code mit 6+ Zeichen ein", + "Gib jedes Wort Deiner BIP-39 Mnemonic als Zahl von 1 bis 2048 ein.", + "Gib jedes Wort Deiner BIP-39 Mnemonic als Hexadezimalzahl von 1 bis 800 ein.", + "Gib jedes Wort Deiner BIP-39 Mnemonic als Oktalzahl von 1 bis 4000 ein.", + "Gib jedes Wort Deiner BIP-39 Mnemonic ein.", + "Benutzerdaten löschen", + "Benutzerdaten werden gelöscht..", + "Fehler:", + "Esc", + "Eine signierte Krux-App ausführen?", + "Dateien durchsuchen?", + "Auf SD-Karte exportieren..", + "Öffentlicher Schlüssel", + "Werkeinstellungen", + "Entschlüsselung fehlgeschlagen", + "PSBT konnte nicht geladen werden", + "Adresse konnte nicht geladen werden", + "Schlüssel konnte nicht geladen werden", + "Nachricht konnte nicht geladen werden", + "Mnemonic konnte nicht geladen werden", + "Ausgabedeskriptor konnte nicht geladen werden", + "Passphrase konnte nicht geladen werden", + "Mnemonic konnte nicht gespeichert werden", + "Gebühr:", + "Vorschubgeschwindigkeit", + "Dateiname", + "Dateiname %s existiert auf SD-Karte, überschreiben?", + "Den Flash mit Entropie von der Kamera füllen?", + "Flash wird gefüllt", + "Fingerabdruck in PSBT deaktiviert", + "Die Firmware übersteigt die maximale Größe: %d", + "Flash-Karte", + "Flash-Tools", + "Flash gefüllt mit Kameraentropie", + "Umgedrehte X-Koordinaten", + "Flötendurchmesser", + "Frei:", + "Vom Speicher", + "Löschen Sie Ihre SD-Karte vollständig in einem anderen Gerät, um sicherzustellen, dass die Daten nicht wiederhergestellt werden können", + "Mnemonik erzeugen", + "Dieser Mnemonic eine benutzerdefinierte ID zuteilen? Andernfalls wird der aktuelle Fingerabdruck verwendet", + "Go", + "Gute Entropie", + "Hardware", + "Hex öffentlicher Schlüssel", + "Hexadezimal", + "Mnemonics ausblenden", + "Hohe Gebühren!", + "ID existiert bereits", + "Index", + "Index: %s", + "Input (%d):", + "Installieren?", + "Unzureichende Entropie!", + "Unzureichende Entropie", + "Ungültiger Tamper Check Code", + "Ungültige Adresse", + "Ungültiger Bootloader", + "Ungültige mnemonische Lange", + "Ungültiger öffentlicher Schlüssel", + "Ungültige Wallet:", + "Umkehren", + "Invertierte Farben", + "Schlüssel", + "Schlüssel wurde nicht zur Verfügung gestellt", + "Krux Drucker Test-QR", + "LCD-Typ", + "Sprache", + "Lassen Sie das Feld leer, wenn Sie möchten, dass Krux ein gültiges letztes Wort auswählt", + "Links", + "Länge: %s", + "Leitungsverzögerung", + "Linie:", + "Krux-App laden", + "Mnemonic laden", + "Wallet laden", + "Einen vertrauenswürdigen Wallet-Deskriptor laden, um Adressen anzuzeigen?", + "Von SD-Karte laden", + "Von SD-Karte laden?", + "Von der Kamera laden", + "Eine laden?", + "Laden?", + "Lade Kamera..", + "Lade Change Adressen..", + "Drucker wird geladen..", + "Lade Empfangsadressen..", + "Wird geladen..", + "Spracheinstellung", + "Speicherort", + "Maximale Länge überschritten (%s)", + "Nachricht", + "Nachricht:", + "Fehlende Signaturdatei", + "Mnemonic", + "Mnemonische ID", + "Mnemotechnik und Passphrase werden beibehalten.", + "Mnemonic wurde nicht verschlüsselt", + "Geändert:", + "Multisig", + "Native Segwit - 84 würde angenommen", + "Netzwerk", + "Neue Mnemonic", + "Neue Firmware erkannt.", + "Nein", + "Keine Passphrase", + "Nicht genug Würfe!", + "Zahlen", + "Oktal", + "Andere Formate", + "PBKDF2-Iter.", + "Male gestanzte Punkte schwarz an, damit sie erkannt werden können.", + "Papierbreite", + "Teil", + "Teilegröße", + "Passphrase", + "Passwortlänge", + "Pfad stimmt nicht überein", + "Muster erkannt!", + "Alle gespeicherten verschlüsselten Mnemoniken und Einstellungen dauerhaft vom Flash-Speicher entfernen?", + "Speicher", + "Pixelabweichungsindex:", + "Klartext-QR", + "Bitte lade einen Wallet Ausgabedeskriptor", + "Tauchrate", + "Schlechte Entropie", + "Schlechte Entropie erkannt!", + "Drucke Test-QR", + "Tiny Seed drucken?", + "Als QR-Code drucken", + "Als QR-Code drucken?", + "Drucken?", + "Drucker", + "Druckertreiber nicht gesetzt!", + "Wird gedruckt..", + "Trotzdem fortfahren?", + "Weiter?", + "Wird bearbeitet..", + "QR-Code", + "RX Pin", + "Neustart", + "Empfangen", + "Empfangsadresse", + "Region:", + "Löschen %s?", + "Mnemonic löschen", + "Firmware-Dateien von der SD-Karte entfernen?", + "Res. - Format", + "Werkseinstellungen wiederherstellen und neu starten?", + "Zurück zum QR-Viewer", + "Überprüfe gescannte Daten und bearbeite sie bei Bedarf", + "Rechts", + "Würfel mindestens %d Mal, um eine Mnemonic zu erzeugen.", + "Rollenverteilung:", + "Würfe:", + "SD-Karte", + "SD-Karte nicht erkannt.", + "SHA256 der Würfe:", + "SHA256 des Snapshots:", + "QR-Bild auf SD-Karte speichern", + "Auf SD-Karte speichern?", + "Auf SD-Karte speichern?", + "Auf SD-Karte gespeichert", + "Skala", + "Adresse\nscannen", + "Scan BIP39 Passphrase", + "Schlüssel QR-Code Scannen", + "Wörter 1-12 erneut scannen", + "Wörter 13-24 scannen", + "Bildschirmschonerzeit", + "Script-Art", + "Sicherheit", + "Selbstübertragung oder Change (%d):", + "Selbstübertragung:", + "Legen Sie zuerst einen Tamper Check Code fest", + "Einstellungen", + "Die Einstellungen werden intern auf Flash gespeichert.", + "Einstellungen auf SD-Karte gespeichert.", + "Shannons Entropie:", + "Ausschalten", + "Abschaltzeit:", + "Herunterfahren..", + "Signieren", + "Am QR-Code unterschreiben", + "Auf SD-Karte signieren", + "Signieren?", + "Signatur", + "Signierte Nachricht", + "Signierte PSBT", + "Unterschreiben..", + "Single-Sig", + "Größe:", + "Einige Schecks können nicht durchgeführt werden.", + "Ausgabe (%d):", + "Ausgaben:", + "Statistiken für Nerds", + "Auf Flash speichern", + "Auf der SD-Karte speichern", + "Wischen um den Modus zu ändern", + "TC Flash-Hash", + "TC Flash-Hash beim Start", + "TOUCH oder ENTER zum Erfassen", + "TX Pin", + "Tamper Check Code", + "Tamper Check Code erfolgreich gesetzt", + "Tamper Check Codes stimmen nicht überein", + "Text", + "The app will be copied to user's flash ", + "Thema", + "Thermisch", + "Um sicherzustellen, dass die Daten nicht wiederhergestellt werden können, verwenden Sie die Funktion 'Gerät löschen'", + "Helligkeit umschalten", + "Werkzeuge", + "Berühre Schwellenwert", + "Touchscreen", + "Weiter versuchen?", + "BIP39 Passphrase eingeben", + "Schlüssel eingeben", + "Einheit", + "Upgrade abgeschlossen.", + "Verwende eine schwarze Hintergrundfläche.", + "Verwende die Entropie der Kamera, um eine neue Mnemonic zu erstellen", + "Belegt:", + "Benutzerdaten", + "Wert %S außerhalb des Bereichs: [ %s, %s]", + "Der Wert muss ein Vielfaches von %s sein", + "Überprüfung..", + "Version", + "Via Kamera", + "Via D20", + "Via D6", + "Via manueller Eingabe", + "Via Wörter", + "Warte auf die Erfassung", + "Wallet", + "Wallet-Deskriptor", + "Wallet Ausgabedeskriptor", + "Wallet Ausgabedeskriptor geladen!", + "Wallet Ausgabedeskriptor nicht gefunden.", + "Warnung:", + "Wort %d", + "Wortnummern", + "Wörter", + "Ja", + "ist eine gültige Adresse!", + "wurde in den ersten %d Adressen nicht gefunden", +] diff --git a/src/krux/translations/es.py b/src/krux/translations/es.py index 37d7751c5..11184a56a 100644 --- a/src/krux/translations/es.py +++ b/src/krux/translations/es.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['% del monto.', '%d de %d multisig', '%d a %d', '%s eliminado.', '(%d total)', '(Experimental)', '(Solo para observación)', '12 palabras', '24 palabras', 'Nosotros', '¿Aceptar la suposición?', 'Cuenta', 'Se supondría que la cuenta #0', 'Índice de la cuenta', '¿Añadir o cambiar passphrase de la cartera?', 'Se requiere entropía adicional de la cámara para el modo AES-CBC', 'Dirección', 'Alinea la cámara y la placa de respaldo correctamente.', '¡Permitir en la configuración primero!', 'Anti-reflejo desactivado', 'Anti-reflejo habilitado', 'Apariencia', '¿Estás seguro?', 'Colores BGR', 'Mnemónico BIP39', 'Atrás', 'Volver al Menú', 'Backup del Mnemónico', 'Firma incorrecta', 'Contraseña Base64', 'Baudrate', 'Cuadrícula binaria', 'Grosor del Borde', 'Brillo', 'Botones', 'Rebote de Botones', 'Captura cancelada', 'Cambio', 'Direcciones de Cambio', '¿Cambiar de tema y reiniciar?', 'Cambio:', 'Los cambios durarán hasta que el dispositivo se apague.', 'Verifica Tarjeta SD', '¿Verificar que la dirección pertenece a esta cartera?', 'Comprobado %d direcciones sin coincidencias.', 'Comprobación de la tarjeta SD..', 'Confirmar el código de verificación', 'Crear Código QR', '¿Crear código QR desde texto?', 'Creado:', 'Código de verificación actual', 'Código QR Personalizado', 'Personalizar', 'Personalizar tu cartera generará una nueva clave', 'Profundidad de Corte', 'Método de Corte', 'Decimal', '¿Descifrar?', 'Cartera Predeterminada', 'Profundidad por Pasada', '¿Derivar entropía BIP85?', 'Direcciones del descriptor', 'Pantalla', 'No apagues el dispositivo, puede tardar un tiempo en completarse.', '¿Listo?', 'Doble mnemónico', 'Operador', 'Vacío', 'Habilitar aplicaciones Krux', 'Cifrado', 'Código QR Cifrado', 'Mnemónico cifrado no se almacenó', 'Mnemónico cifrado fue almacenado con ID:', 'Cifrado', 'Modo de Cifrado', 'Ingrese %d palabras BIP-39.', 'Introduzca un código de verificación de más de 6 caracteres', 'Ingresa cada palabra de tu mnemónico BIP-39 como un número del 1 al 2048.', 'Ingresa cada palabra de tu mnemónico BIP-39 como un número en hexadecimal del 1 al 800.', 'Ingresa cada palabra de tu mnemónico BIP-39 como un número en octal del 1 al 4000.', 'Ingresa cada palabra de tu mnemónico BIP-39.', 'Borrar datos de usuario', 'Borrando los datos del usuario..', 'Error:', 'Esc', '¿Ejecutar una aplicación Krux firmada?', '¿Explorar archivos?', 'Exportando a la tarjeta SD..', 'Clave Pública Extendida', 'Ajustes de Fábrica', 'Error al descifrar', 'No se pudo cargar la PSBT', 'No se pudo cargar la dirección', 'No se pudo cargar la clave', 'No se pudo cargar el mensaje', 'No se pudo importar el mnemónico', 'No se pudo cargar el descriptor de salida', 'No se pudo cargar el passphrase', 'No pudo almacenar mnemónico', 'Comisión:', 'Feed Rate', 'Nombre del Archivo', 'El nombre de archivo %s existe en la tarjeta SD, ¿sobrescribir?', '¿Llenar el flash con entropía de la cámara?', 'Llenando Flash', 'Huella dactilar no establecida en PSBT', 'El firmware supera el tamaño máximo: %d', 'Mapa Flash', 'Flash Tools', 'Flash lleno de entropía de cámara', 'Coordenadas X Invertidas', 'Diámetro de la Flauta', 'Libre:', 'Desde el Almacenamiento', 'Borra completamente su tarjeta SD en otro dispositivo para asegurarse de que los datos sean irrecuperables', 'Generar Mnemónico', '¿Darle a este mnemónico una identificación personalizada? De lo contrario se utilizará el fingerprint actual', 'Ir', 'Buena entropía', 'Hardware', 'Clave Pública Hexadecimal', 'Hexadecimal', 'Ocultar Mnemónicos', '¡Tarifas altas!', 'ID ya existe', 'Índice', 'Índice: %s', 'Entradas (%d):', '¿Instalar?', '¡Entropía Insuficiente!', 'Entropía insuficiente', 'Código de verificación no válido', 'Dirección inválida', 'Bootloader inválido', 'Longitud mnemónica no válida', 'Clave pública inválida', 'Cartera inválida:', 'Invertir', 'Colores Invertidos', 'Clave', 'No se proporcionó la clave', 'Test de impresión QR', 'Tipo de LCD', 'Idioma', 'Déjalo en blanco si quieres que Krux elija una última palabra válida', 'Izquierda', 'Longitud: %s', 'Retraso de Línea', 'Línea:', 'Cargar aplicación Krux', 'Importar Mnemónico', 'Cargar Cartera', '¿Cargar un descriptor de monedero de confianza para ver las direcciones?', 'Cargar desde tarjeta SD', '¿Cargar desde la tarjeta SD?', 'Cargar desde la cámara', '¿Cargar algo?', '¿Cargar?', 'Cargando Camara..', 'Cargando direcciones de cambio..', 'Cargando impresora..', 'Cargando direcciones de recepción..', 'Cargando..', 'Idioma', 'Ubicación', 'Longitud máxima excedida (%s)', 'Mensaje', 'Mensaje:', 'Falta archivo de firma', 'Mnemónico', 'Identificación del Mnemónico', 'Mnemónico y passphrase se mantendrán.', 'Mnemónico no fue descifrado', 'Modificado:', 'Multisig', 'Segwit nativo - 84 se supondría', 'Red', 'Nuevo Mnemónico', 'Nuevo firmware detectado.', 'No', 'Sin Passphrase', '¡No hay suficientes tiradas!', 'Números', 'Octales', 'Otros Formatos', 'Iter. PBKDF2', 'Pinte los puntos perforados de negro para que puedan ser detectados.', 'Ancho del Papel', 'Parte', 'Tamaño de la Pieza', 'Passphrase', 'Longitud', 'La ruta no coincide', '¡Patrón detectado!', '¿Eliminar permanentemente todos los mnemónicos y configuraciones cifradas almacenadas del flash?', 'Guardar', 'Índice de desviación de píxeles:', 'QR de Texto', 'Carga un descriptor de cartera', 'Tasa de Caída', 'Baja entropía', 'Mala entropía detectada!', 'Prueba de Impresión QR', '¿Imprimir Tiny Seed?', 'Imprimir como Código QR', '¿Imprimir con Codigo QR?', '¿Impresión?', 'Impresora', '¡El controlador de impresora no está configurado!', 'Imprimiendo..', '¿Proceder de todas maneras?', '¿Continuar?', 'Procesando..', 'Código QR', 'RX Pin', 'Reiniciar', 'Recepción', 'Direcciones de Recepción', 'Región:', 'Eliminar %s?', 'Eliminar Mnemónico', '¿Eliminar archivos de firmware de la tarjeta SD?', 'Res. - Formato', '¿Restablecer a la configuración de fábrica y reiniciar?', 'Volver al QR', 'Revisa los datos escaneados, edítalos si es necesario', 'Derecha', 'Tira el dado al menos %d veces para generar un mnemónico.', 'Distribución de tiradas:', 'Tiradas:', 'Tarjeta SD', 'Tarjeta SD no detectada.', 'SHA256 de las tiradas:', 'SHA256 de la instantánea:', 'Guardar Imagen QR en la Tarjeta SD', 'Guardar en tarjeta SD', '¿Guardar en la tarjeta SD?', 'Guardado en la tarjeta SD', 'Escala', 'Escanear Dirección', 'Escanear Passphrase BIP39', 'Escanear el Código QR', 'Escaneo de palabras 1-12 de nuevo', 'Escaneo de palabras 13-24', 'Tiempo de Espera del Protector de Pantalla', 'Tipo de Script', 'Seguridad', 'Autotransferencia o Cambio (%d):', 'Autotransferencia:', 'Establezca primero un código de verificación', 'Ajustes', 'Ajustes almacenados internamente en flash.', 'Configuración almacenada en la tarjeta SD.', 'Entropía de Shannon:', 'Apagar', 'Tiempo de Apagado', 'Apagando..', 'Firmar', 'Firmar en Código QR', 'Firmar en la Tarjeta SD', '¿Firmar?', 'Firma', 'Mensaje Firmado', 'PSBT Firmado', 'Firmando..', 'Single-sig', 'Tamaño:', 'Algunas comprobaciones no se pueden realizar.', 'Gastos (%d):', 'Gasto:', 'Estadísticas para Entendidos', 'Almacenar en Flash', 'Almacenar en la Tarjeta SD', 'Deslizar para cambiar de modo', 'TC Hash Flash', 'TC Flash Hash al arranque', 'TOCA o ENTER para capturar', 'TX Pin', 'Código de verificación', 'Código de verificación establecido con éxito', 'Los códigos de verificación no coinciden', 'Texto', "The app will be copied to user's flash ", 'Tema', 'Térmico', 'Para garantizar que los datos no se puedan recuperar, utiliza la función de borrar dispositivo', 'Alternar Brillo', 'Herramientas', 'Umbral Táctil', 'Pantalla Táctil', '¿Intentar con mas?', 'Escribe la Passphrase BIP39', 'Introduce la clave', 'Unidad', 'Actualización completa.', 'Usa una superficie de fondo negra.', 'Usa la entropía de la cámara para crear una nueva mnemónica', 'Usado:', 'Usuario', 'Valor %s fuera del rango: [ %s, %s]', 'El valor debe ser múltiple de %s', 'Verificando..', 'Versión', 'Desde Cámara', 'Vía D20', 'Vía D6', 'Introducción Manual', 'A Través de Palabras', 'Espera la captura', 'Cartera', 'Descriptor de Cartera', 'Descriptor de salida de cartera', '¡Se ha cargado el descriptor de salida de la cartera!', 'No se encontró el descriptor de salida de la cartera.', 'Advertencia:', 'Palabra %d', 'Números de Palabra', 'Palabras', 'Sí', 'es una dirección válida!', 'NO FUE ENCONTRADO en las primeras %d direcciones'] +translation_array = [ + "% del monto.", + "%d de %d multisig", + "%d a %d", + "%s eliminado.", + "(%d total)", + "(Experimental)", + "(Solo para observación)", + "12 palabras", + "24 palabras", + "Nosotros", + "¿Aceptar la suposición?", + "Cuenta", + "Se supondría que la cuenta #0", + "Índice de la cuenta", + "¿Añadir o cambiar passphrase de la cartera?", + "Se requiere entropía adicional de la cámara para el modo AES-CBC", + "Dirección", + "Alinea la cámara y la placa de respaldo correctamente.", + "¡Permitir en la configuración primero!", + "Anti-reflejo desactivado", + "Anti-reflejo habilitado", + "Apariencia", + "¿Estás seguro?", + "Colores BGR", + "Mnemónico BIP39", + "Atrás", + "Volver al Menú", + "Backup del Mnemónico", + "Firma incorrecta", + "Contraseña Base64", + "Baudrate", + "Cuadrícula binaria", + "Grosor del Borde", + "Brillo", + "Botones", + "Rebote de Botones", + "Captura cancelada", + "Cambio", + "Direcciones de Cambio", + "¿Cambiar de tema y reiniciar?", + "Cambio:", + "Los cambios durarán hasta que el dispositivo se apague.", + "Verifica Tarjeta SD", + "¿Verificar que la dirección pertenece a esta cartera?", + "Comprobado %d direcciones sin coincidencias.", + "Comprobación de la tarjeta SD..", + "Confirmar el código de verificación", + "Crear Código QR", + "¿Crear código QR desde texto?", + "Creado:", + "Código de verificación actual", + "Código QR Personalizado", + "Personalizar", + "Personalizar tu cartera generará una nueva clave", + "Profundidad de Corte", + "Método de Corte", + "Decimal", + "¿Descifrar?", + "Cartera Predeterminada", + "Profundidad por Pasada", + "¿Derivar entropía BIP85?", + "Direcciones del descriptor", + "Pantalla", + "No apagues el dispositivo, puede tardar un tiempo en completarse.", + "¿Listo?", + "Doble mnemónico", + "Operador", + "Vacío", + "Habilitar aplicaciones Krux", + "Cifrado", + "Código QR Cifrado", + "Mnemónico cifrado no se almacenó", + "Mnemónico cifrado fue almacenado con ID:", + "Cifrado", + "Modo de Cifrado", + "Ingrese %d palabras BIP-39.", + "Introduzca un código de verificación de más de 6 caracteres", + "Ingresa cada palabra de tu mnemónico BIP-39 como un número del 1 al 2048.", + "Ingresa cada palabra de tu mnemónico BIP-39 como un número en hexadecimal del 1 al 800.", + "Ingresa cada palabra de tu mnemónico BIP-39 como un número en octal del 1 al 4000.", + "Ingresa cada palabra de tu mnemónico BIP-39.", + "Borrar datos de usuario", + "Borrando los datos del usuario..", + "Error:", + "Esc", + "¿Ejecutar una aplicación Krux firmada?", + "¿Explorar archivos?", + "Exportando a la tarjeta SD..", + "Clave Pública Extendida", + "Ajustes de Fábrica", + "Error al descifrar", + "No se pudo cargar la PSBT", + "No se pudo cargar la dirección", + "No se pudo cargar la clave", + "No se pudo cargar el mensaje", + "No se pudo importar el mnemónico", + "No se pudo cargar el descriptor de salida", + "No se pudo cargar el passphrase", + "No pudo almacenar mnemónico", + "Comisión:", + "Feed Rate", + "Nombre del Archivo", + "El nombre de archivo %s existe en la tarjeta SD, ¿sobrescribir?", + "¿Llenar el flash con entropía de la cámara?", + "Llenando Flash", + "Huella dactilar no establecida en PSBT", + "El firmware supera el tamaño máximo: %d", + "Mapa Flash", + "Flash Tools", + "Flash lleno de entropía de cámara", + "Coordenadas X Invertidas", + "Diámetro de la Flauta", + "Libre:", + "Desde el Almacenamiento", + "Borra completamente su tarjeta SD en otro dispositivo para asegurarse de que los datos sean irrecuperables", + "Generar Mnemónico", + "¿Darle a este mnemónico una identificación personalizada? De lo contrario se utilizará el fingerprint actual", + "Ir", + "Buena entropía", + "Hardware", + "Clave Pública Hexadecimal", + "Hexadecimal", + "Ocultar Mnemónicos", + "¡Tarifas altas!", + "ID ya existe", + "Índice", + "Índice: %s", + "Entradas (%d):", + "¿Instalar?", + "¡Entropía Insuficiente!", + "Entropía insuficiente", + "Código de verificación no válido", + "Dirección inválida", + "Bootloader inválido", + "Longitud mnemónica no válida", + "Clave pública inválida", + "Cartera inválida:", + "Invertir", + "Colores Invertidos", + "Clave", + "No se proporcionó la clave", + "Test de impresión QR", + "Tipo de LCD", + "Idioma", + "Déjalo en blanco si quieres que Krux elija una última palabra válida", + "Izquierda", + "Longitud: %s", + "Retraso de Línea", + "Línea:", + "Cargar aplicación Krux", + "Importar Mnemónico", + "Cargar Cartera", + "¿Cargar un descriptor de monedero de confianza para ver las direcciones?", + "Cargar desde tarjeta SD", + "¿Cargar desde la tarjeta SD?", + "Cargar desde la cámara", + "¿Cargar algo?", + "¿Cargar?", + "Cargando Camara..", + "Cargando direcciones de cambio..", + "Cargando impresora..", + "Cargando direcciones de recepción..", + "Cargando..", + "Idioma", + "Ubicación", + "Longitud máxima excedida (%s)", + "Mensaje", + "Mensaje:", + "Falta archivo de firma", + "Mnemónico", + "Identificación del Mnemónico", + "Mnemónico y passphrase se mantendrán.", + "Mnemónico no fue descifrado", + "Modificado:", + "Multisig", + "Segwit nativo - 84 se supondría", + "Red", + "Nuevo Mnemónico", + "Nuevo firmware detectado.", + "No", + "Sin Passphrase", + "¡No hay suficientes tiradas!", + "Números", + "Octales", + "Otros Formatos", + "Iter. PBKDF2", + "Pinte los puntos perforados de negro para que puedan ser detectados.", + "Ancho del Papel", + "Parte", + "Tamaño de la Pieza", + "Passphrase", + "Longitud", + "La ruta no coincide", + "¡Patrón detectado!", + "¿Eliminar permanentemente todos los mnemónicos y configuraciones cifradas almacenadas del flash?", + "Guardar", + "Índice de desviación de píxeles:", + "QR de Texto", + "Carga un descriptor de cartera", + "Tasa de Caída", + "Baja entropía", + "Mala entropía detectada!", + "Prueba de Impresión QR", + "¿Imprimir Tiny Seed?", + "Imprimir como Código QR", + "¿Imprimir con Codigo QR?", + "¿Impresión?", + "Impresora", + "¡El controlador de impresora no está configurado!", + "Imprimiendo..", + "¿Proceder de todas maneras?", + "¿Continuar?", + "Procesando..", + "Código QR", + "RX Pin", + "Reiniciar", + "Recepción", + "Direcciones de Recepción", + "Región:", + "Eliminar %s?", + "Eliminar Mnemónico", + "¿Eliminar archivos de firmware de la tarjeta SD?", + "Res. - Formato", + "¿Restablecer a la configuración de fábrica y reiniciar?", + "Volver al QR", + "Revisa los datos escaneados, edítalos si es necesario", + "Derecha", + "Tira el dado al menos %d veces para generar un mnemónico.", + "Distribución de tiradas:", + "Tiradas:", + "Tarjeta SD", + "Tarjeta SD no detectada.", + "SHA256 de las tiradas:", + "SHA256 de la instantánea:", + "Guardar Imagen QR en la Tarjeta SD", + "Guardar en tarjeta SD", + "¿Guardar en la tarjeta SD?", + "Guardado en la tarjeta SD", + "Escala", + "Escanear Dirección", + "Escanear Passphrase BIP39", + "Escanear el Código QR", + "Escaneo de palabras 1-12 de nuevo", + "Escaneo de palabras 13-24", + "Tiempo de Espera del Protector de Pantalla", + "Tipo de Script", + "Seguridad", + "Autotransferencia o Cambio (%d):", + "Autotransferencia:", + "Establezca primero un código de verificación", + "Ajustes", + "Ajustes almacenados internamente en flash.", + "Configuración almacenada en la tarjeta SD.", + "Entropía de Shannon:", + "Apagar", + "Tiempo de Apagado", + "Apagando..", + "Firmar", + "Firmar en Código QR", + "Firmar en la Tarjeta SD", + "¿Firmar?", + "Firma", + "Mensaje Firmado", + "PSBT Firmado", + "Firmando..", + "Single-sig", + "Tamaño:", + "Algunas comprobaciones no se pueden realizar.", + "Gastos (%d):", + "Gasto:", + "Estadísticas para Entendidos", + "Almacenar en Flash", + "Almacenar en la Tarjeta SD", + "Deslizar para cambiar de modo", + "TC Hash Flash", + "TC Flash Hash al arranque", + "TOCA o ENTER para capturar", + "TX Pin", + "Código de verificación", + "Código de verificación establecido con éxito", + "Los códigos de verificación no coinciden", + "Texto", + "The app will be copied to user's flash ", + "Tema", + "Térmico", + "Para garantizar que los datos no se puedan recuperar, utiliza la función de borrar dispositivo", + "Alternar Brillo", + "Herramientas", + "Umbral Táctil", + "Pantalla Táctil", + "¿Intentar con mas?", + "Escribe la Passphrase BIP39", + "Introduce la clave", + "Unidad", + "Actualización completa.", + "Usa una superficie de fondo negra.", + "Usa la entropía de la cámara para crear una nueva mnemónica", + "Usado:", + "Usuario", + "Valor %s fuera del rango: [ %s, %s]", + "El valor debe ser múltiple de %s", + "Verificando..", + "Versión", + "Desde Cámara", + "Vía D20", + "Vía D6", + "Introducción Manual", + "A Través de Palabras", + "Espera la captura", + "Cartera", + "Descriptor de Cartera", + "Descriptor de salida de cartera", + "¡Se ha cargado el descriptor de salida de la cartera!", + "No se encontró el descriptor de salida de la cartera.", + "Advertencia:", + "Palabra %d", + "Números de Palabra", + "Palabras", + "Sí", + "es una dirección válida!", + "NO FUE ENCONTRADO en las primeras %d direcciones", +] diff --git a/src/krux/translations/fr.py b/src/krux/translations/fr.py index adaa2ff3b..275598351 100644 --- a/src/krux/translations/fr.py +++ b/src/krux/translations/fr.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['% du montant.', '%d de %d multisignature', '%d à %d', '%s supprimé.', '(%d au total)', '(Expérimental)', '(consultation)', '12 mots', '24 mots', 'À propos', 'Accepter supposition\u2009?', 'Compte', 'Le compte n °0 serait supposé', 'Index du compte', 'Ajoutez ou modifiez la phrase secrète\u2009?', 'Entropie supplémentaire de la caméra requise pour le mode AES-CBC', 'Adresse', 'Alignez correctement la caméra et plaque de sauvegarde.', "Autoriser d'abord dans les paramètres !", 'Anti-éblouissement désactivé', 'Anti-éblouissement activé', 'Apparence', 'Es-tu sûr\u2009?', 'Couleurs BGR', 'Mnémonique BIP39', 'Retour', 'Retour au menu', 'Sauvegarde mnémonique', 'Signature non valide', 'Mot de passe Base64', 'Débit en bauds', 'Grille binaire', 'Rembourrage de bordure', 'Luminosité', 'Boutons', 'Anti-rebond des boutons', 'Capture annulée', 'Monnaie', 'Adresses de Monnaie', 'Changer de thème et redémarrer\u2009?', 'La monnaie\u2009:', "Les modifications dureront jusqu'à l'arrêt.", 'Vérifiez la carte SD', "Vérifiez que l'adresse appartient à ce portefeuille\u2009?", '%d adresses vérifiées sans correspondance.', 'Vérification de la carte SD..', 'Confirmer le code de non compromis', 'Créer un code QR', "Créer un code QR à partir d'un texte\u2009?", 'Créé\u2009:', 'Code de non compromis actuel', 'Code QR personnalisé', 'Personnaliser', 'La personnalisation de votre portefeuille générera une nouvelle clé.', 'Profondeur de coupe', 'Méthode de coupe', 'Décimal', 'Déchiffrer ?', 'Portefeuille par défaut', 'Profondeur par passage', "Dériver l'entropie BIP85 ?", 'Adresses du descripteur', 'Affichage', 'Ne pas éteindre, cela peut prendre un certain temps.', 'Terminé\u2009?', 'Double mnémonique', 'Pilote', 'Vide', 'Activer les applications Krux', 'Chiffré', 'Code QR chiffré', "Le mnémonique chiffré n'a pas été stocké", 'Mnémonique chiffré a été stocké avec ID\u2009:', 'Chiffrement', 'Mode de chiffrement', 'Entrez %d mots BIP-39.', 'Saisissez un code de non compromis de plus de 6 caractères', "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre de 1 à 2048.", "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en hexadécimal de 1 à 800.", "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en octal de 1 à 4000.", 'Entrez chaque mot de votre mnémonique BIP-39.', "Effacer les données de l'utilisateur", "Effacement des données de l'utilisateur...", 'Erreur\u2009:', 'Esc', 'Exécuter une application Krux signée ?', 'Explorer des fichiers\u2009?', 'Exportation vers la carte SD..', 'Clé publique', "Paramètres d'usine", 'Échec du déchiffrement', 'Échec du chargement PSBT', "Échec du chargement d'adresse", 'Échec du chargement de la clé', 'Échec du chargement du message', 'Échec du chargement mnémonique', 'Échec du chargement du descripteur de sortie', 'Échec du chargement de la phrase secrète', 'Échec du stockage mnémonique', 'Frais\u2009:', "Taux d'alimentation", 'Nom de fichier', 'Le nom de fichier %s existe sur la carte SD, écraser\u2009?', "Remplir le flash avec l'entropie de la caméra ?", 'Remplissage du Flash', 'Empreinte digitale manquante dans PSBT', 'Le micrologiciel dépasse la taille maximale\u2009: %d', 'Plan du Flash', 'Outils Flash', "Flash rempli par l'entropie de la caméra", 'Coordonnées X inversées', 'Diamètre de flûte', 'Libre\u2009:', 'Du stockage', 'Effacez complètement votre carte SD dans un autre appareil pour assurer que les données soient irrécupérables', 'Générer un mnémonique', "Donnez à ce mnémonique un identifiant personnalisé\u2009? Sinon l'empreinte actuelle sera utilisée", 'OK', 'Bonne entropie', 'Matériel', 'Clé publique hexadécimale', 'Hexadécimal', 'Masquer les mnémoniques', 'Frais élevés\u2009!', 'Id existe déjà', 'Index', 'Index : %s', 'Entrées (%d)\u2009:', 'Installer\u2009?', 'Entropie insuffisante\u2009!', 'Entropie insuffisante', 'Code de non compromis non valide', 'Adresse invalide', 'Chargeur de démarrage invalide', 'Longueur mnémonique invalide', 'Clé publique non valide', 'Portefeuille invalide\u2009:', 'Inverser', 'Couleurs inversées', 'Clé', "La clé n'a pas été fournie", "Test de l'imprimante Krux QR", "Type d'écran LCD", 'Langue', 'Laissez vide si vous souhaitez que Krux choisisse un dernier mot valide', 'Gauche', 'Longueur : %s', 'Délai de Ligne', 'Ligne\u2009:', "Charger l'application Krux", 'Charger Mnémonique', 'Charger le portefeuille', 'Charger un descripteur de portefeuille de confiance pour afficher les adresses\u2009?', 'Charger depuis la carte SD', 'Charger depuis la carte SD\u2009?', 'Charger depuis la caméra', 'Charger\u2009?', 'Charger\u2009?', 'Activation de la Caméra..', 'Chargement des adresses de monnaie..', "Activation de l'imprimante..", 'Chargement des adresses de réception ..', 'Chargement..', 'Paramètres régionaux', 'Emplacement', 'Longueur maximale dépassée (%s)', 'Message', 'Message\u2009:', 'Fichier de signature manquant', 'Mnémonique', 'ID Mnémonique', 'Mnémonique et phrase secrète seront conservés.', "Mnémonique n'était pas chiffré", 'Modifié\u2009:', 'Multi\nsignature', 'Native Segwit - 84 serait supposé', 'Réseau', 'Nouveau Mnémonique', 'Nouveau micrologiciel détecté.', 'Non', 'Pas de phrase secrète', 'Pas assez de jets\u2009!', 'Nombres', 'Octale', 'Autres formats', 'Itér. PBKDF2', "Noircissez les points perforés afin qu'ils puissent être détectés.", 'Largeur du papier', 'Partie', 'Taille de la pièce', 'Phrase secréte', 'Longueur du mot de passe', 'Inadéquation du chemin', 'Pattern détecté\u2009!', 'Supprimer définitivement tous les mnémoniques et paramètres chiffrés stockés dans le flash\u2009?', 'Persistance', 'Indice de déviation des pixels\u2009:', 'QR en Texte Brut', 'Veuillez charger un descripteur de sortie de portefeuille', 'Taux de plongée', 'Entropie faible', 'Entropie faible détectée\u2009!', 'Impression Test QR', 'Imprimer Tiny Seed\u2009?', 'Imprimer Code QR', 'Imprimer Code QR\u2009?', 'Imprimer\u2009?', 'Imprimante', "Le pilote d'imprimante n'est pas défini\u2009!", 'Impression..', 'Procéder quand même\u2009?', 'Procéder\u2009?', 'Traitement..', 'Code QR', 'RX Fiche', 'Redémarrer', 'Recevoir', 'Adresses de Réception', 'Région\u2009:', 'Supprimer %s\u2009?', 'Supprimer mnémonique', 'Supprimer les fichiers micrologiciel de la carte SD\u2009?', 'Rés. - Format', "Restaurer les paramètres d'usine et redémarrer\u2009?", 'Retour au visualiseur QR', 'Examinez les données numérisées, modifiez-les si nécessaire', 'À droite', 'Lancez le dé au moins %d fois pour générer un mnémonique.', 'Distribution des jets\u2009:', 'Jets\u2009:', 'Carte SD', 'Carte SD non détectée.', 'SHA256 de jets\u2009:', 'SHA256 de snapshot\u2009:', "Enregistrer l'image QR sur la carte SD", 'Enregistrer sur la carte SD', 'Enregistrer sur la carte SD\u2009?', 'Enregistré sur la carte SD', "L'échelle", "Scannez l'adresse", 'Scannez la phrase secrète BIP-39', 'Scannez le Code QR de la clé', 'Analyser à nouveau les mots 1 à 12', 'Analyser les mots 13 à 24', "Delai d'Inactivité", 'Type de Script', 'Sécurité', 'Auto-transfert ou monnaie (%d)\u2009:', 'Auto-transfert\u2009:', "Définissez d'abord un code de non compromis", 'Paramètres', 'Paramètres stockés en interne sur flash.', 'Paramètres stockés sur la carte SD.', 'Entropie de Shannon\u2009:', 'Éteindre', "Delai d'Arrêt", 'Arrêt en cours..', 'Signer', 'Signer avec le code QR', 'Signer sur la carte SD', 'Signer\u2009?', 'Signature', 'Message signé', 'PSBT signé', 'Signature..', 'Clé unique', 'Capacité\u2009:', 'Certains vérifications ne peuvent pas être effectués.', 'Dépense (%d)\u2009:', 'Dépense\u2009:', 'Statistiques pour les geeks', 'Stocker sur flash', 'Stocker sur la carte SD', 'Faites glisser pour changer de mode', 'TC Flash Hash', 'TC Flash Hash au démarrage', 'TOUCHEZ ou ENTRER pour capturer', 'TX Fiche', 'Code de non compromis', 'Code de non compromis défini avec succès', 'Les codes de non compromis ne correspondent pas', 'Texte', "The app will be copied to user's flash ", 'Thème', 'Thermique', "Pour assurer que les données soient irrécupérables, utilisez la fonctionnalité 'Effacer l'appareil'", 'Ajuster la luminosité', 'Outils', 'Sensibilité', 'Écran Tactile', 'Réessayer\u2009?', 'Entrez la phrase secrète BIP-39', 'Taper clé', 'Unité', 'Mise à jour complète.', 'Utilisez une surface de fond noire.', "Utilisez l'entropie de la caméra pour créer un nouveau mnémonique", 'Utilisé\u2009:', 'Utilisateur', 'Valeur %s hors de portée: [%s, %s]', 'La valeur doit être un multiple de %s', 'Vérification..', 'Version', 'Par caméra', 'Via D20', 'Via D6', 'Par saisie manuelle', 'Via Mots', 'Attendez la capture', 'Portefeuille', 'Descripteur de Portefeuille', 'Descripteur de sortie du portefeuille', 'Descripteur de sortie du portefeuille chargé\u2009!', 'Descripteur de sortie du portefeuille introuvable.', 'Avertissement\u2009:', 'Mot %d', 'Numéros de mots', 'Mots', 'Oui', 'Adresse non valide\u2009!', 'INTROUVABLE dans les %d premières adresses'] +translation_array = [ + "% du montant.", + "%d de %d multisignature", + "%d à %d", + "%s supprimé.", + "(%d au total)", + "(Expérimental)", + "(consultation)", + "12 mots", + "24 mots", + "À propos", + "Accepter supposition\u2009?", + "Compte", + "Le compte n °0 serait supposé", + "Index du compte", + "Ajoutez ou modifiez la phrase secrète\u2009?", + "Entropie supplémentaire de la caméra requise pour le mode AES-CBC", + "Adresse", + "Alignez correctement la caméra et plaque de sauvegarde.", + "Autoriser d'abord dans les paramètres !", + "Anti-éblouissement désactivé", + "Anti-éblouissement activé", + "Apparence", + "Es-tu sûr\u2009?", + "Couleurs BGR", + "Mnémonique BIP39", + "Retour", + "Retour au menu", + "Sauvegarde mnémonique", + "Signature non valide", + "Mot de passe Base64", + "Débit en bauds", + "Grille binaire", + "Rembourrage de bordure", + "Luminosité", + "Boutons", + "Anti-rebond des boutons", + "Capture annulée", + "Monnaie", + "Adresses de Monnaie", + "Changer de thème et redémarrer\u2009?", + "La monnaie\u2009:", + "Les modifications dureront jusqu'à l'arrêt.", + "Vérifiez la carte SD", + "Vérifiez que l'adresse appartient à ce portefeuille\u2009?", + "%d adresses vérifiées sans correspondance.", + "Vérification de la carte SD..", + "Confirmer le code de non compromis", + "Créer un code QR", + "Créer un code QR à partir d'un texte\u2009?", + "Créé\u2009:", + "Code de non compromis actuel", + "Code QR personnalisé", + "Personnaliser", + "La personnalisation de votre portefeuille générera une nouvelle clé.", + "Profondeur de coupe", + "Méthode de coupe", + "Décimal", + "Déchiffrer ?", + "Portefeuille par défaut", + "Profondeur par passage", + "Dériver l'entropie BIP85 ?", + "Adresses du descripteur", + "Affichage", + "Ne pas éteindre, cela peut prendre un certain temps.", + "Terminé\u2009?", + "Double mnémonique", + "Pilote", + "Vide", + "Activer les applications Krux", + "Chiffré", + "Code QR chiffré", + "Le mnémonique chiffré n'a pas été stocké", + "Mnémonique chiffré a été stocké avec ID\u2009:", + "Chiffrement", + "Mode de chiffrement", + "Entrez %d mots BIP-39.", + "Saisissez un code de non compromis de plus de 6 caractères", + "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre de 1 à 2048.", + "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en hexadécimal de 1 à 800.", + "Entrez chaque mot de votre mnémonique BIP-39 sous la forme d'un nombre en octal de 1 à 4000.", + "Entrez chaque mot de votre mnémonique BIP-39.", + "Effacer les données de l'utilisateur", + "Effacement des données de l'utilisateur...", + "Erreur\u2009:", + "Esc", + "Exécuter une application Krux signée ?", + "Explorer des fichiers\u2009?", + "Exportation vers la carte SD..", + "Clé publique", + "Paramètres d'usine", + "Échec du déchiffrement", + "Échec du chargement PSBT", + "Échec du chargement d'adresse", + "Échec du chargement de la clé", + "Échec du chargement du message", + "Échec du chargement mnémonique", + "Échec du chargement du descripteur de sortie", + "Échec du chargement de la phrase secrète", + "Échec du stockage mnémonique", + "Frais\u2009:", + "Taux d'alimentation", + "Nom de fichier", + "Le nom de fichier %s existe sur la carte SD, écraser\u2009?", + "Remplir le flash avec l'entropie de la caméra ?", + "Remplissage du Flash", + "Empreinte digitale manquante dans PSBT", + "Le micrologiciel dépasse la taille maximale\u2009: %d", + "Plan du Flash", + "Outils Flash", + "Flash rempli par l'entropie de la caméra", + "Coordonnées X inversées", + "Diamètre de flûte", + "Libre\u2009:", + "Du stockage", + "Effacez complètement votre carte SD dans un autre appareil pour assurer que les données soient irrécupérables", + "Générer un mnémonique", + "Donnez à ce mnémonique un identifiant personnalisé\u2009? Sinon l'empreinte actuelle sera utilisée", + "OK", + "Bonne entropie", + "Matériel", + "Clé publique hexadécimale", + "Hexadécimal", + "Masquer les mnémoniques", + "Frais élevés\u2009!", + "Id existe déjà", + "Index", + "Index : %s", + "Entrées (%d)\u2009:", + "Installer\u2009?", + "Entropie insuffisante\u2009!", + "Entropie insuffisante", + "Code de non compromis non valide", + "Adresse invalide", + "Chargeur de démarrage invalide", + "Longueur mnémonique invalide", + "Clé publique non valide", + "Portefeuille invalide\u2009:", + "Inverser", + "Couleurs inversées", + "Clé", + "La clé n'a pas été fournie", + "Test de l'imprimante Krux QR", + "Type d'écran LCD", + "Langue", + "Laissez vide si vous souhaitez que Krux choisisse un dernier mot valide", + "Gauche", + "Longueur : %s", + "Délai de Ligne", + "Ligne\u2009:", + "Charger l'application Krux", + "Charger Mnémonique", + "Charger le portefeuille", + "Charger un descripteur de portefeuille de confiance pour afficher les adresses\u2009?", + "Charger depuis la carte SD", + "Charger depuis la carte SD\u2009?", + "Charger depuis la caméra", + "Charger\u2009?", + "Charger\u2009?", + "Activation de la Caméra..", + "Chargement des adresses de monnaie..", + "Activation de l'imprimante..", + "Chargement des adresses de réception ..", + "Chargement..", + "Paramètres régionaux", + "Emplacement", + "Longueur maximale dépassée (%s)", + "Message", + "Message\u2009:", + "Fichier de signature manquant", + "Mnémonique", + "ID Mnémonique", + "Mnémonique et phrase secrète seront conservés.", + "Mnémonique n'était pas chiffré", + "Modifié\u2009:", + "Multi\nsignature", + "Native Segwit - 84 serait supposé", + "Réseau", + "Nouveau Mnémonique", + "Nouveau micrologiciel détecté.", + "Non", + "Pas de phrase secrète", + "Pas assez de jets\u2009!", + "Nombres", + "Octale", + "Autres formats", + "Itér. PBKDF2", + "Noircissez les points perforés afin qu'ils puissent être détectés.", + "Largeur du papier", + "Partie", + "Taille de la pièce", + "Phrase secréte", + "Longueur du mot de passe", + "Inadéquation du chemin", + "Pattern détecté\u2009!", + "Supprimer définitivement tous les mnémoniques et paramètres chiffrés stockés dans le flash\u2009?", + "Persistance", + "Indice de déviation des pixels\u2009:", + "QR en Texte Brut", + "Veuillez charger un descripteur de sortie de portefeuille", + "Taux de plongée", + "Entropie faible", + "Entropie faible détectée\u2009!", + "Impression Test QR", + "Imprimer Tiny Seed\u2009?", + "Imprimer Code QR", + "Imprimer Code QR\u2009?", + "Imprimer\u2009?", + "Imprimante", + "Le pilote d'imprimante n'est pas défini\u2009!", + "Impression..", + "Procéder quand même\u2009?", + "Procéder\u2009?", + "Traitement..", + "Code QR", + "RX Fiche", + "Redémarrer", + "Recevoir", + "Adresses de Réception", + "Région\u2009:", + "Supprimer %s\u2009?", + "Supprimer mnémonique", + "Supprimer les fichiers micrologiciel de la carte SD\u2009?", + "Rés. - Format", + "Restaurer les paramètres d'usine et redémarrer\u2009?", + "Retour au visualiseur QR", + "Examinez les données numérisées, modifiez-les si nécessaire", + "À droite", + "Lancez le dé au moins %d fois pour générer un mnémonique.", + "Distribution des jets\u2009:", + "Jets\u2009:", + "Carte SD", + "Carte SD non détectée.", + "SHA256 de jets\u2009:", + "SHA256 de snapshot\u2009:", + "Enregistrer l'image QR sur la carte SD", + "Enregistrer sur la carte SD", + "Enregistrer sur la carte SD\u2009?", + "Enregistré sur la carte SD", + "L'échelle", + "Scannez l'adresse", + "Scannez la phrase secrète BIP-39", + "Scannez le Code QR de la clé", + "Analyser à nouveau les mots 1 à 12", + "Analyser les mots 13 à 24", + "Delai d'Inactivité", + "Type de Script", + "Sécurité", + "Auto-transfert ou monnaie (%d)\u2009:", + "Auto-transfert\u2009:", + "Définissez d'abord un code de non compromis", + "Paramètres", + "Paramètres stockés en interne sur flash.", + "Paramètres stockés sur la carte SD.", + "Entropie de Shannon\u2009:", + "Éteindre", + "Delai d'Arrêt", + "Arrêt en cours..", + "Signer", + "Signer avec le code QR", + "Signer sur la carte SD", + "Signer\u2009?", + "Signature", + "Message signé", + "PSBT signé", + "Signature..", + "Clé unique", + "Capacité\u2009:", + "Certains vérifications ne peuvent pas être effectués.", + "Dépense (%d)\u2009:", + "Dépense\u2009:", + "Statistiques pour les geeks", + "Stocker sur flash", + "Stocker sur la carte SD", + "Faites glisser pour changer de mode", + "TC Flash Hash", + "TC Flash Hash au démarrage", + "TOUCHEZ ou ENTRER pour capturer", + "TX Fiche", + "Code de non compromis", + "Code de non compromis défini avec succès", + "Les codes de non compromis ne correspondent pas", + "Texte", + "The app will be copied to user's flash ", + "Thème", + "Thermique", + "Pour assurer que les données soient irrécupérables, utilisez la fonctionnalité 'Effacer l'appareil'", + "Ajuster la luminosité", + "Outils", + "Sensibilité", + "Écran Tactile", + "Réessayer\u2009?", + "Entrez la phrase secrète BIP-39", + "Taper clé", + "Unité", + "Mise à jour complète.", + "Utilisez une surface de fond noire.", + "Utilisez l'entropie de la caméra pour créer un nouveau mnémonique", + "Utilisé\u2009:", + "Utilisateur", + "Valeur %s hors de portée: [%s, %s]", + "La valeur doit être un multiple de %s", + "Vérification..", + "Version", + "Par caméra", + "Via D20", + "Via D6", + "Par saisie manuelle", + "Via Mots", + "Attendez la capture", + "Portefeuille", + "Descripteur de Portefeuille", + "Descripteur de sortie du portefeuille", + "Descripteur de sortie du portefeuille chargé\u2009!", + "Descripteur de sortie du portefeuille introuvable.", + "Avertissement\u2009:", + "Mot %d", + "Numéros de mots", + "Mots", + "Oui", + "Adresse non valide\u2009!", + "INTROUVABLE dans les %d premières adresses", +] diff --git a/src/krux/translations/ja.py b/src/krux/translations/ja.py index dba82e696..e9abcb767 100644 --- a/src/krux/translations/ja.py +++ b/src/krux/translations/ja.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['% の金額.', '%d の%d マルチシグネチャ', '%d へ %d', '%s 削除されました.', '(%d トータル)', '(実験的)', '(閲覧専用)', '12の単語', '24の単語', '概要', '仮定を受け入れますか?', 'アカウント', 'アカウント#0は仮定されます', 'アカウントインデックス', 'ウォレットのパスフレーズを追加または変更しますか?', 'AES-CBCモードにはカメラからの追加エントロピーが必要です', 'アドレス', 'カメラとバックプレートを正しく整列させてください.', '最初に設定で許可してください!', 'アンチグレアが無効', 'アンチグレアが有効', '外観', 'よろしいですか?', 'BGRカラー', 'BIP39 Mnemonic', '戻る', 'メニューへ戻る', 'ニーモニックのバックアップ', '無効なサイン', 'Base64パスワード', 'Baudrate', 'バイナリグリッド', 'ボーダーパディング', '明るさ', 'ボタン', 'ボタンのデバウンス', 'キャプチャがキャンセルされました', 'お釣り', 'アドレス変更', 'テーマの変更と再起動しますか?', 'お釣り:', '変更はシャットダウンするまで持続します.', 'SDカードを確認する', 'このアドレスがこのウォレットに属しているか確認しますか?', '%d のアドレスを確認しましたが、一致するものはありませんでした.', 'SDカードを確認中..', '改ざんチェックコードの確認', 'QRコードを生成する', 'テキストからQRコードを作成しますか?', '作成されました:', '現在の改ざんチェックコード', 'カスタムQRコード', 'カスタマイズする', 'ウォレットをカスタマイズすると、新しいキーが生成されます.', 'カットの深さ', 'カット方法', 'デシマル', 'デクリプト?', 'デフォルトの財布', 'パスごとの深さ', 'BIP85エントロピーを導出しますか?', 'ディスクリプタアドレス', 'ディスプレイ', '完了するまで電源を切らないでください', '完了?', 'ダブルニーモニック', 'ドライバー', '空', 'Kruxアプリを有効にする', '暗号化されました', '暗号化されたQRコード', '暗号化されたニーモニックが保存されませんでした', '暗号化されたニーモニックがIDとともに保存されました:', '暗号化', '暗号化モード', '%d のBIP-39ワードを入力してください.', '6文字以上の改ざんチェックコードを入力してください', 'あなたのBIP-39ニーモニックの各単語を1から2048の番号で入力してください.', 'あなたのBIP-39ニーモニックの各単語を1から800の16進数で入力してください.', 'あなたのBIP-39ニーモニックの各単語を1から4000の8進数で入力してください.', 'あなたのBIP-39ニーモニックの各単語を入力してください.', 'ユーザーのデータを消去する', 'ユーザーのデータを消去しています..', 'エラー:', 'エスク', '署名入りのKruxアプリを実行しますか?', 'アーカイブ探索?', 'SDカードへのエクスポート..', '拡張公開キー', '初期設定', '復号化に失敗しました', 'PSBTのロードに失敗しました', 'アドレスの読み込みに失敗しました', 'キーのロードに失敗しました', 'メッセージの読み込みに失敗しました', 'mnemonicのロードに失敗しました', '出力記述子のロードに失敗しました', 'パスフレーズのロードに失敗しました', 'mnemonicの保存に失敗しました', '手数料:', 'フィードレート', 'ファイル名', 'ファイル名 %s が SD カードに存在します、上書きしますか?', 'カメラからのエントロピーでフラッシュを埋めますか?', 'フラッシュを充填中', 'PSBTでデジタル指紋が未設定', 'ファームウェアが最大サイズを超えました: %d', 'フラッシュマップ', 'Flashツール', 'カメラエントロピーで満たされたフラッシュ', 'X座標が反転しました', 'フルートディアメーター', 'フリー:', 'ストレージから', 'データが復元できないように、他のデバイスでSDカードを完全に消去してください', 'Mnemonicを生成する', 'このニーモニックにカスタムIDを付けますか?付けない場合は現在のフィンガープリントが使用されます', '行く', '良いentropy', 'ハードウェア', 'Hex公開キー', 'エクサデシマル', 'Mnemonicsを隠す', '高い手数料!', 'IDはすでに存在します', 'インデックス', 'インデックス:%s', 'インプット(%d):', 'インストールしますか?', '不十分なエントロピー!', '不十分なエントロピー', '無効な改ざんチェックコード', '無効なアドレス', '無効なブートローダー', '無効なニーモニックの長さ', '無効な公開キー', '無効なウォレット:', '反転する', '反転した色', 'キー', 'キーが提供されていません', 'KruxプリンターテストQR', 'LCDタイプ', '言語 ', '有効な最終単語をKruxに選んでもらいたい場合は、空白のままにしてください', '左', '長さ:%s', 'ライン遅延', 'ライン:', 'Kruxアプリを読み込む', 'ニーモニックをロード', 'ウォレットをロード', '信頼できるウォレット記述子をロードしてアドレスを表示しますか?', 'SDカードからロード ', 'SDカードからロードしますか?', 'カメラからロード', '1つをロードしますか?', 'ロードしますか?', 'カメラを読み込み中..', '変更アドレスを読み込み中..', 'プリンターを読み込み中..', '受信アドレスを読み込み中 ..', '読み込み中..', 'ロケール', '場所', '最大長を超えました (%s)', 'メッセージ', 'メッセージ:', '署名ファイルが欠落しています', 'Mnemonic', 'Mnemonic ID', 'Mnemonicとパスフレーズは保持されます.', 'Mnemonicは暗号化されていませんでした', '修正されました:', 'マルチシグ', 'ネイティブSegwit - 84が仮定されます', 'ネットワーク', '新しい Mnemonic', '新しいファームウェアが検出されました.', 'いいえ', 'パスフレーズなし', 'ロールが足りません!', '数字', 'Octal', '他のフォーマット', 'PBKDF2イテレーション', '検出できるように、穴あけされた点を黒く塗ってください.', '用紙幅 ', 'パーツ', 'パーツサイズ', 'パスワード', 'パスワードの長さ', 'パスの不一致', 'パターンが検出されました!', 'フラッシュからすべての保存された暗号化mnemonicsと設定を永久に削除しますか?', '永続させる', 'ピクセル偏差指数:', 'プレーンテキストQR', 'ウォレットの出力記述子をロードしてください', '沈下率', '低品質なエントロピー', '低品質なエントロピーが検出されました!', 'テストQRを印刷', '小さなシードを印刷しますか?', 'QRを印刷', 'QRを印刷しますか?', '印刷?', 'プリンター ', 'プリンタードライバーが設定されていません!', '印刷中..', 'そのまま進みますか?', '進みますか?', '処理中..', 'QRコード', 'RXピン', '再起動', '受け取る', '受取アドレス', '地域:', '%sを削除しますか?', 'ニーモニックを削除', 'SDカードからファームウェアファイルを削除しますか?', 'Res. - フォーマット', '初期化を復元して再起動しますか?', 'QRビューワーに戻る', 'スキャンしたデータを確認し、必要に応じて編集します', '右', 'mnemonicを生成するには、少なくとも%d回サイコロを振ってください.', 'ロールの分布:', 'ロール:', 'SDカード', 'SDカードが検出されません.', 'ロールのSHA256:', '画像のSHA256:', 'QR画像をSDカードに保存する', 'SDカードに保存する', 'SDカードに保存しますか?', 'SDカードに保存しました', 'スケール', 'アドレススキャン', 'BIP39パスフレーズをスキャンする', 'キーのQRコードをスキャンする', '単語1-12を再度スキャン中', '単語13-24をスキャン中', 'スクリーンセーバーの時間', 'スクリプトタイプ', 'セキュリティa', '自己転送または変更(%d):', '自己転送:', '最初に改ざんチェックコードを設定する', '設定', '設定はフラッシュメモリに内部保存されています.', '設定はSDカードに保存されています.', 'シャノンのエントロピー:', 'シャットダウン', 'シャットダウン時間', 'シャットダウン中..', '署名', 'QRコードにサインする', 'SDカードにサインする', 'サインしますか?', 'サイン', 'サイン付きメッセージ', 'サインされたPSBT', 'サインしてます..', 'シングルサイン', 'サイズ:', '一部のチェックを実行できません.', '支出(%d):', '支出:', 'オタクのための統計', 'フラッシュに保存する', 'SDカードに保存する', 'スワイプしてモードを変更する', 'TCフラッシュハッシュ', '起動時のTCフラッシュハッシュ', 'タッチまたはENTERでキャプチャする', 'TXピン', '改ざんチェックコード', '改ざんチェックコードが正常に設定されました', '改ざんチェックコードが一致しません', 'テキスト', "The app will be copied to user's flash ", 'テーマ', 'サーマル', 'データが復元不可能であることを確実にするには、デバイス消去機能を使用してください', '明るさを切り替える', 'ツール', 'タッチスレッショルド', 'タッチスクリーン', 'もっと試してみますか?', 'BIP39パスフレーズを入力してください', 'キーを入力する', 'ユニット', 'アップグレードが完了しました.', '黒い背景面を使用してください.', 'カメラのエントロピーを使用して新しいmnemonicを作成してください', '使用済み:', 'ユーザーのデータ', '値%sが範囲外です: [ %s, %s]', '値は%sの倍数でなければなりません', '確認中..', 'バージョン', 'カメラ経由', 'D20経由', 'D6経由', '手動入力経由', '言葉経由', 'キャプチャを待ってください', 'ワレット', 'ウォレットディスクリプター', 'ウォレット出力ディスクリプター', 'ウォレット出力ディスクリプターがロードされました!', 'ウォレット出力ディスクリプターが見つかりません.', '警告:', '単語 %d', '単語番号', '単語', 'はい', '有効なアドレスです!', '最初の%dアドレスに見つかりませんでした'] +translation_array = [ + "% の金額.", + "%d の%d マルチシグネチャ", + "%d へ %d", + "%s 削除されました.", + "(%d トータル)", + "(実験的)", + "(閲覧専用)", + "12の単語", + "24の単語", + "概要", + "仮定を受け入れますか?", + "アカウント", + "アカウント#0は仮定されます", + "アカウントインデックス", + "ウォレットのパスフレーズを追加または変更しますか?", + "AES-CBCモードにはカメラからの追加エントロピーが必要です", + "アドレス", + "カメラとバックプレートを正しく整列させてください.", + "最初に設定で許可してください!", + "アンチグレアが無効", + "アンチグレアが有効", + "外観", + "よろしいですか?", + "BGRカラー", + "BIP39 Mnemonic", + "戻る", + "メニューへ戻る", + "ニーモニックのバックアップ", + "無効なサイン", + "Base64パスワード", + "Baudrate", + "バイナリグリッド", + "ボーダーパディング", + "明るさ", + "ボタン", + "ボタンのデバウンス", + "キャプチャがキャンセルされました", + "お釣り", + "アドレス変更", + "テーマの変更と再起動しますか?", + "お釣り:", + "変更はシャットダウンするまで持続します.", + "SDカードを確認する", + "このアドレスがこのウォレットに属しているか確認しますか?", + "%d のアドレスを確認しましたが、一致するものはありませんでした.", + "SDカードを確認中..", + "改ざんチェックコードの確認", + "QRコードを生成する", + "テキストからQRコードを作成しますか?", + "作成されました:", + "現在の改ざんチェックコード", + "カスタムQRコード", + "カスタマイズする", + "ウォレットをカスタマイズすると、新しいキーが生成されます.", + "カットの深さ", + "カット方法", + "デシマル", + "デクリプト?", + "デフォルトの財布", + "パスごとの深さ", + "BIP85エントロピーを導出しますか?", + "ディスクリプタアドレス", + "ディスプレイ", + "完了するまで電源を切らないでください", + "完了?", + "ダブルニーモニック", + "ドライバー", + "空", + "Kruxアプリを有効にする", + "暗号化されました", + "暗号化されたQRコード", + "暗号化されたニーモニックが保存されませんでした", + "暗号化されたニーモニックがIDとともに保存されました:", + "暗号化", + "暗号化モード", + "%d のBIP-39ワードを入力してください.", + "6文字以上の改ざんチェックコードを入力してください", + "あなたのBIP-39ニーモニックの各単語を1から2048の番号で入力してください.", + "あなたのBIP-39ニーモニックの各単語を1から800の16進数で入力してください.", + "あなたのBIP-39ニーモニックの各単語を1から4000の8進数で入力してください.", + "あなたのBIP-39ニーモニックの各単語を入力してください.", + "ユーザーのデータを消去する", + "ユーザーのデータを消去しています..", + "エラー:", + "エスク", + "署名入りのKruxアプリを実行しますか?", + "アーカイブ探索?", + "SDカードへのエクスポート..", + "拡張公開キー", + "初期設定", + "復号化に失敗しました", + "PSBTのロードに失敗しました", + "アドレスの読み込みに失敗しました", + "キーのロードに失敗しました", + "メッセージの読み込みに失敗しました", + "mnemonicのロードに失敗しました", + "出力記述子のロードに失敗しました", + "パスフレーズのロードに失敗しました", + "mnemonicの保存に失敗しました", + "手数料:", + "フィードレート", + "ファイル名", + "ファイル名 %s が SD カードに存在します、上書きしますか?", + "カメラからのエントロピーでフラッシュを埋めますか?", + "フラッシュを充填中", + "PSBTでデジタル指紋が未設定", + "ファームウェアが最大サイズを超えました: %d", + "フラッシュマップ", + "Flashツール", + "カメラエントロピーで満たされたフラッシュ", + "X座標が反転しました", + "フルートディアメーター", + "フリー:", + "ストレージから", + "データが復元できないように、他のデバイスでSDカードを完全に消去してください", + "Mnemonicを生成する", + "このニーモニックにカスタムIDを付けますか?付けない場合は現在のフィンガープリントが使用されます", + "行く", + "良いentropy", + "ハードウェア", + "Hex公開キー", + "エクサデシマル", + "Mnemonicsを隠す", + "高い手数料!", + "IDはすでに存在します", + "インデックス", + "インデックス:%s", + "インプット(%d):", + "インストールしますか?", + "不十分なエントロピー!", + "不十分なエントロピー", + "無効な改ざんチェックコード", + "無効なアドレス", + "無効なブートローダー", + "無効なニーモニックの長さ", + "無効な公開キー", + "無効なウォレット:", + "反転する", + "反転した色", + "キー", + "キーが提供されていません", + "KruxプリンターテストQR", + "LCDタイプ", + "言語 ", + "有効な最終単語をKruxに選んでもらいたい場合は、空白のままにしてください", + "左", + "長さ:%s", + "ライン遅延", + "ライン:", + "Kruxアプリを読み込む", + "ニーモニックをロード", + "ウォレットをロード", + "信頼できるウォレット記述子をロードしてアドレスを表示しますか?", + "SDカードからロード ", + "SDカードからロードしますか?", + "カメラからロード", + "1つをロードしますか?", + "ロードしますか?", + "カメラを読み込み中..", + "変更アドレスを読み込み中..", + "プリンターを読み込み中..", + "受信アドレスを読み込み中 ..", + "読み込み中..", + "ロケール", + "場所", + "最大長を超えました (%s)", + "メッセージ", + "メッセージ:", + "署名ファイルが欠落しています", + "Mnemonic", + "Mnemonic ID", + "Mnemonicとパスフレーズは保持されます.", + "Mnemonicは暗号化されていませんでした", + "修正されました:", + "マルチシグ", + "ネイティブSegwit - 84が仮定されます", + "ネットワーク", + "新しい Mnemonic", + "新しいファームウェアが検出されました.", + "いいえ", + "パスフレーズなし", + "ロールが足りません!", + "数字", + "Octal", + "他のフォーマット", + "PBKDF2イテレーション", + "検出できるように、穴あけされた点を黒く塗ってください.", + "用紙幅 ", + "パーツ", + "パーツサイズ", + "パスワード", + "パスワードの長さ", + "パスの不一致", + "パターンが検出されました!", + "フラッシュからすべての保存された暗号化mnemonicsと設定を永久に削除しますか?", + "永続させる", + "ピクセル偏差指数:", + "プレーンテキストQR", + "ウォレットの出力記述子をロードしてください", + "沈下率", + "低品質なエントロピー", + "低品質なエントロピーが検出されました!", + "テストQRを印刷", + "小さなシードを印刷しますか?", + "QRを印刷", + "QRを印刷しますか?", + "印刷?", + "プリンター ", + "プリンタードライバーが設定されていません!", + "印刷中..", + "そのまま進みますか?", + "進みますか?", + "処理中..", + "QRコード", + "RXピン", + "再起動", + "受け取る", + "受取アドレス", + "地域:", + "%sを削除しますか?", + "ニーモニックを削除", + "SDカードからファームウェアファイルを削除しますか?", + "Res. - フォーマット", + "初期化を復元して再起動しますか?", + "QRビューワーに戻る", + "スキャンしたデータを確認し、必要に応じて編集します", + "右", + "mnemonicを生成するには、少なくとも%d回サイコロを振ってください.", + "ロールの分布:", + "ロール:", + "SDカード", + "SDカードが検出されません.", + "ロールのSHA256:", + "画像のSHA256:", + "QR画像をSDカードに保存する", + "SDカードに保存する", + "SDカードに保存しますか?", + "SDカードに保存しました", + "スケール", + "アドレススキャン", + "BIP39パスフレーズをスキャンする", + "キーのQRコードをスキャンする", + "単語1-12を再度スキャン中", + "単語13-24をスキャン中", + "スクリーンセーバーの時間", + "スクリプトタイプ", + "セキュリティa", + "自己転送または変更(%d):", + "自己転送:", + "最初に改ざんチェックコードを設定する", + "設定", + "設定はフラッシュメモリに内部保存されています.", + "設定はSDカードに保存されています.", + "シャノンのエントロピー:", + "シャットダウン", + "シャットダウン時間", + "シャットダウン中..", + "署名", + "QRコードにサインする", + "SDカードにサインする", + "サインしますか?", + "サイン", + "サイン付きメッセージ", + "サインされたPSBT", + "サインしてます..", + "シングルサイン", + "サイズ:", + "一部のチェックを実行できません.", + "支出(%d):", + "支出:", + "オタクのための統計", + "フラッシュに保存する", + "SDカードに保存する", + "スワイプしてモードを変更する", + "TCフラッシュハッシュ", + "起動時のTCフラッシュハッシュ", + "タッチまたはENTERでキャプチャする", + "TXピン", + "改ざんチェックコード", + "改ざんチェックコードが正常に設定されました", + "改ざんチェックコードが一致しません", + "テキスト", + "The app will be copied to user's flash ", + "テーマ", + "サーマル", + "データが復元不可能であることを確実にするには、デバイス消去機能を使用してください", + "明るさを切り替える", + "ツール", + "タッチスレッショルド", + "タッチスクリーン", + "もっと試してみますか?", + "BIP39パスフレーズを入力してください", + "キーを入力する", + "ユニット", + "アップグレードが完了しました.", + "黒い背景面を使用してください.", + "カメラのエントロピーを使用して新しいmnemonicを作成してください", + "使用済み:", + "ユーザーのデータ", + "値%sが範囲外です: [ %s, %s]", + "値は%sの倍数でなければなりません", + "確認中..", + "バージョン", + "カメラ経由", + "D20経由", + "D6経由", + "手動入力経由", + "言葉経由", + "キャプチャを待ってください", + "ワレット", + "ウォレットディスクリプター", + "ウォレット出力ディスクリプター", + "ウォレット出力ディスクリプターがロードされました!", + "ウォレット出力ディスクリプターが見つかりません.", + "警告:", + "単語 %d", + "単語番号", + "単語", + "はい", + "有効なアドレスです!", + "最初の%dアドレスに見つかりませんでした", +] diff --git a/src/krux/translations/ko.py b/src/krux/translations/ko.py index c10435048..e9b4adda1 100644 --- a/src/krux/translations/ko.py +++ b/src/krux/translations/ko.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['수량: %', '%d의 %d 멀티시그', '%d 부터 %d', '%s 제거되었습니다.', '(총 %d)', '(실험적 기능)', '(잔액조회 전용)', '12단어', '24단어', '기본 정보', '가정을 수락하시겠습니까?', '계정', '계정 #0이 가정됩니다', '계정 인덱스', '패스프레이즈를 추가하거나 변경하시겠습니까?', 'AES-CBC 모드를 위해 카메라의 추가 엔트로피가 필요합니다', '주소', '카메라와 보조 플레이트를 올바르게 정렬하십시오.', '먼저 설정에서 허용하세요!', '눈부심방지 비활성화', '눈부심방지 활성화', '디스플레이', '계속하시겠습니까?', 'BGR 색상', 'BIP39 니뫠닉', '뒤로', '메뉴로 돌아가기', '니모닉 백업', '잘못된 서명', 'Base64 비밀번호', 'Baudrate', '이진수 그리드', '테두리 여백', '밝기', '버튼', '버튼 바운스 방지', '캡처 취소됨', '잔돈', '잔돈 주소', '테마를 변경하고 재부팅하시겠습니까?', '변경', '변경 사항은 종료될때까지 유지됩니다.', 'SD카드 확인', '해당 주소가 이 지갑에 속하는지 확인하시겠습니까?', '일치하는 주소가 없는 %d 개를 확인했습니다.', 'SD카드 확인 중..', '탬퍼 체크 코드 확인', 'QR 코드 생성', '텍스트로부터 QR코드를 생성하시겠습니까?', '생성됨:', '현재 탬퍼 체크 코드', '사용자 정의 QR코드', '사용자 정의', '지갑을 커스터마이징하면 새로운 비밀키가 생성됩니다.', 'Cut Depth', 'Cut Method', '10진수', '복호화하시겠습니까?', '지갑 기본설정', 'Depth Per Pass', 'BIP85 엔트로피를 유독하시겠습니까?', '디스크립터 주소', '디스플레이', '전원을 끄지 마십시오. 완료하는 데 시간이 걸릴 수 있습니다.', '완료되었습니까?', '이중 니모닉', '드라이버', '비어 있음', 'Krux 앱 활성화', '암호화 후 저장', '암호화된 QR 코드', '암호화된 니모닉을 저장하지 못했습니다', '암호화된 니모닉을 다음 아이디와 함께 저장했습니다:', '암호화', '암호화 모드', '%d개의 BIP-39 단어를 입력하십시오.', '6자 이상의 탬퍼 체크 코드를 입력하세요', 'BIP-39 니모닉의 각 단어를 1에서 2048 사이의 숫자로 입력하십시오.', 'BIP-39 니모닉의 각 단어를 1에서 800 사이의 16진수 숫자로 입력하십시오.', 'BIP-39 니모닉의 각 단어를 1에서 4000 사이의 8진수 숫자로 입력하십시오.', 'BIP-39 니모닉의 각 단어를 입력하십시오.', '사용자 데이터 지우기', '사용자의 데이터를 지우는 중...', '오류:', 'Esc', '서명된 Krux 앱을 실행하시겠습니까?', '파일을 탐색하시겠습니까?', 'SD카드로 내보내는 중..', 'XPUB 내보내기', '공장 초기 설정', '복호화에 실패했습니다', 'PSBT를 불러오지 못했습니다', '주소를 불러오지 못했습니다', '키 로드에 실패했습니다', '메시지를 불러오지 못했습니다', '니모닉을 불러오지 못했습니다', '아웃풋 디스크립터를 불러오지 못했습니다', '패스프레이즈를 불러오지 못했습니다', '니모닉을 저장하지 못했습니다', '수수료:', 'Feed Rate', '파일명', '%s 파일명이 SD카드에 이미 존재합니다. 덮어쓰시겠습니까?', '카메라의 엔트로피로 플래시를 채우시겠습니까?', '플래시 채우기', 'PSBT에서 지문이 설정되지 않았습니다', '펌웨어가 최대 크기를 초과했습니다: %d', '플래시 맵', '플래시 도구', '카메라 엔트로피로 가득 찬 플래시', 'X 좌표 반전', '플루트 직경', '여유 공간:', '저장공간에서 불러오기', '다른 장치에서 데이터 복구가 불가능하도록 SD카드를 완전히 지우십시오', '니모닉 생성', '이 니모닉에 별도 아이디를 지정하시겠습니까? 지정하지 않으면 현재 지문을 사용합니다', '선택', '엔트로피가 충분합니다', '하드웨어', '16진수 공개키', '16진수', '니모닉 숨기기', '수수료가 높습니다!', '아이디가 이미 존재합니다', '인덱스', '인덱스: %s', 'Input (%d):', '설치하시겠습니까?', '엔트로피가 충분하지 않습니다!', '엔트로피가 충분하지 않습니다', '유효하지 않은 탬퍼 체크 코드', '주소가 잘못되었습니다', '부트로더가 잘못되었습니다', '니모닉 길이가 잘못되었습니다', '공개키가 잘못되었습니다', '지갑이 잘못되었습니다:', '반전', '반전된 색상', '키', '키가 제공되지 않았습니다', 'Krux 프린터 테스트 QR', 'LCD 유형', '언어', '마지막 단어를 Krux가 선택하도록 하려면 비워두십시오', '왼쪽', '길이: %s', '줄 지연', '줄:', 'Krux 앱 로드', '니모닉 불러오기', '이대로 불러오기', '주소를 보기위해 신뢰할 수 있는 월렛 디스크립터를 불러오시겠습니까?', 'SD카드에서 불러오기', 'SD카드에서 불러오시겠습니까?', '카메라로 불러오기', '불러오시겠습니까?', '불러오시겠습니까?', '카메라를 구동 중입니다..', '잔돈 주소를 불러옵니다..', '프린터를 로딩 중입니다..', '수신 주소 불러옵니다..', '로딩 중..', '언어 설정', '기본 저장소', '최대 길이를 초과함 (%s)', '메시지', '메시지:', '서명 파일이 누락되었습니다', '니모닉', '니모닉 ID', '니모닉과 암호는 유지됩니다.', '니모닉이 암호화되지 않았습니다', '수정되었습니다:', '멀티시그', '네이티브 세그윗 - BIP84를 적용합니다', '네트워크', '새로운 니모닉', '새로운 펌웨어가 감지되었습니다.', '아니요', '패스프레이즈 없음', '주사위 횟수가 충분하지 않습니다!', '시드문구 순번', '8진수', '기타 형식', 'PBKDF2 Iter.', '카메라가 감지할 수 있도록 펀치된 점을 검게 칠하십시오.', '종이 너비', '파트', '파트 사이즈', '패스프레이즈', '비밀번호 길이', '경로 불일치', '패턴이 감지되었습니다!', '저장된 모든 니모닉 및 설정값을 영구적으로 제거하시겠습니까?', '저장', '픽셀 편차 지수:', '일반텍스트 QR', '지갑 출력 디스크립터를 불러오십시오', '침수율', '엔트로피가 부족합니다', '엔트로피가 부족합니다!', 'QR 테스트 인쇄', 'Tiny Seed를 인쇄하시겠습니까?', 'QR로 인쇄', 'QR로 인쇄하시겠습니까?', '인쇄하시겠습니까?', '프린터', '프린터 드라이버가 설정되지 않았습니다!', '출력중', '계속하시겠습니까?', '계속하시겠습니까?', '처리...', 'QR 코드', 'RX 핀', '다시 반복', '받기', '주소', '지역:', '%s을 제거하시겠습니까?', '니모닉 제거', 'SD카드에서 펌웨어 파일을 제거하시겠습니까?', 'Res. - 형식', '공장 설정을 복원하고 재부팅하시겠습니까?', 'QR 뷰어로 돌아가기', '스캔된 데이터를 검토하고 필요한 경우 수정하십시오', '오른쪽', '니모닉을 생성하려면 주사위를 최소 %d번 굴리십시오.', '주사위값 분포:', '주사위 횟수:', 'SD카드', 'SD카드가 감지되지 않았습니다.', '주사위의 SHA256:', 'SHA256 스냅샷:', 'QR 이미지를 SD카드에 저장', 'SD카드에 저장', 'SD카드에 저장하시겠습니까?', 'SD카드에 저장됨', '스케일', '주소 스캔하기', 'BIP39 패스프레이즈 스캔하기', '비밀번호 QR 스캔', '1번째부터 12번째 단어를 스캔 중입니다', '13번째부터 24번째 단어를 스캔 중입니다', '화면보호기 시간', '지갑 형식', '보안', '본인주소 전송 또는 잔돈 (%d):', '자가 이체:', '먼저 탬퍼 체크 코드를 설정하세요.', '설정', '설정은 플래시에서 내부적으로 저장됩니다.', 'SD 카드에 저장된 설정.', 'Shannon의 엔트로피:', '종료', '자동 종료시간', '종료 중..', '서명하기', 'QR코드로 내보내기', 'SD카드로 내보내기', '서명하시겠습니까?', '서명', '서명된 메시지', '서명된 PSBT', '서명 중..', '단일서명', '크기:', '일부 검사를 수행할 수 없습니다.', 'Spend (%d):', '지출', '전문가를 위한 통계', '플래시 메모리에 저장', 'SD카드에 저장', '모드를 변경하려면 화면을 옆으로 쓸어내리세요', 'TC Flash Hash', '부팅 시 플래시 탬퍼 확인 해시', '터치하거나 엔터를 눌러 캡처하십시오', 'TX 핀', '탬퍼 체크 코드', '탬퍼 검사 코드가 성공적으로 설정되었습니다', '탬퍼 검사 코드가 일치하지 않습니다', '텍스트', "The app will be copied to user's flash ", '테마', 'Thermal', '데이터 복구가 불가능하도록 장치 전체지우기 기능을 사용하십시오', '밝기 전환', '도구', '터치 민감도', '터치스크린', '더 하시겠습니까?', 'BIP39 패스프레이즈 입력', '비밀번호 입력', '단위', '업그레이드가 완료되었습니다', '검은색 배경 화면을 사용하십시오.', '카메라의 엔트로피를 사용하여 새로운 니모닉을 생성하십시오', '이미 사용됨:', '사용자 데이터', '%s는 [%s, %s] 범위를 벗어났습니다', '값은 %s의 배수여야 합니다', '검증 중..', '버전', '카메라', '20면체 주사위', '일반 주사위', '직접 입력', '니모닉 단어 입력', '캡처될때까지 기다리십시오', '지갑 설정', '지갑 디스크립터', '지갑 출력 디스크립터', '지갑 출력 디스크립터가 로드되었습니다!', '지갑 출력 디스크립터를 찾을 수 없습니다.', '경고:', '%d 단어', '단어 번호(1-2048)', '시드문구', '예', '는 유효한 주소입니다!', '첫 번째 %d개의 주소에서 찾을 수 없습니다'] +translation_array = [ + "수량: %", + "%d의 %d 멀티시그", + "%d 부터 %d", + "%s 제거되었습니다.", + "(총 %d)", + "(실험적 기능)", + "(잔액조회 전용)", + "12단어", + "24단어", + "기본 정보", + "가정을 수락하시겠습니까?", + "계정", + "계정 #0이 가정됩니다", + "계정 인덱스", + "패스프레이즈를 추가하거나 변경하시겠습니까?", + "AES-CBC 모드를 위해 카메라의 추가 엔트로피가 필요합니다", + "주소", + "카메라와 보조 플레이트를 올바르게 정렬하십시오.", + "먼저 설정에서 허용하세요!", + "눈부심방지 비활성화", + "눈부심방지 활성화", + "디스플레이", + "계속하시겠습니까?", + "BGR 색상", + "BIP39 니뫠닉", + "뒤로", + "메뉴로 돌아가기", + "니모닉 백업", + "잘못된 서명", + "Base64 비밀번호", + "Baudrate", + "이진수 그리드", + "테두리 여백", + "밝기", + "버튼", + "버튼 바운스 방지", + "캡처 취소됨", + "잔돈", + "잔돈 주소", + "테마를 변경하고 재부팅하시겠습니까?", + "변경", + "변경 사항은 종료될때까지 유지됩니다.", + "SD카드 확인", + "해당 주소가 이 지갑에 속하는지 확인하시겠습니까?", + "일치하는 주소가 없는 %d 개를 확인했습니다.", + "SD카드 확인 중..", + "탬퍼 체크 코드 확인", + "QR 코드 생성", + "텍스트로부터 QR코드를 생성하시겠습니까?", + "생성됨:", + "현재 탬퍼 체크 코드", + "사용자 정의 QR코드", + "사용자 정의", + "지갑을 커스터마이징하면 새로운 비밀키가 생성됩니다.", + "Cut Depth", + "Cut Method", + "10진수", + "복호화하시겠습니까?", + "지갑 기본설정", + "Depth Per Pass", + "BIP85 엔트로피를 유독하시겠습니까?", + "디스크립터 주소", + "디스플레이", + "전원을 끄지 마십시오. 완료하는 데 시간이 걸릴 수 있습니다.", + "완료되었습니까?", + "이중 니모닉", + "드라이버", + "비어 있음", + "Krux 앱 활성화", + "암호화 후 저장", + "암호화된 QR 코드", + "암호화된 니모닉을 저장하지 못했습니다", + "암호화된 니모닉을 다음 아이디와 함께 저장했습니다:", + "암호화", + "암호화 모드", + "%d개의 BIP-39 단어를 입력하십시오.", + "6자 이상의 탬퍼 체크 코드를 입력하세요", + "BIP-39 니모닉의 각 단어를 1에서 2048 사이의 숫자로 입력하십시오.", + "BIP-39 니모닉의 각 단어를 1에서 800 사이의 16진수 숫자로 입력하십시오.", + "BIP-39 니모닉의 각 단어를 1에서 4000 사이의 8진수 숫자로 입력하십시오.", + "BIP-39 니모닉의 각 단어를 입력하십시오.", + "사용자 데이터 지우기", + "사용자의 데이터를 지우는 중...", + "오류:", + "Esc", + "서명된 Krux 앱을 실행하시겠습니까?", + "파일을 탐색하시겠습니까?", + "SD카드로 내보내는 중..", + "XPUB 내보내기", + "공장 초기 설정", + "복호화에 실패했습니다", + "PSBT를 불러오지 못했습니다", + "주소를 불러오지 못했습니다", + "키 로드에 실패했습니다", + "메시지를 불러오지 못했습니다", + "니모닉을 불러오지 못했습니다", + "아웃풋 디스크립터를 불러오지 못했습니다", + "패스프레이즈를 불러오지 못했습니다", + "니모닉을 저장하지 못했습니다", + "수수료:", + "Feed Rate", + "파일명", + "%s 파일명이 SD카드에 이미 존재합니다. 덮어쓰시겠습니까?", + "카메라의 엔트로피로 플래시를 채우시겠습니까?", + "플래시 채우기", + "PSBT에서 지문이 설정되지 않았습니다", + "펌웨어가 최대 크기를 초과했습니다: %d", + "플래시 맵", + "플래시 도구", + "카메라 엔트로피로 가득 찬 플래시", + "X 좌표 반전", + "플루트 직경", + "여유 공간:", + "저장공간에서 불러오기", + "다른 장치에서 데이터 복구가 불가능하도록 SD카드를 완전히 지우십시오", + "니모닉 생성", + "이 니모닉에 별도 아이디를 지정하시겠습니까? 지정하지 않으면 현재 지문을 사용합니다", + "선택", + "엔트로피가 충분합니다", + "하드웨어", + "16진수 공개키", + "16진수", + "니모닉 숨기기", + "수수료가 높습니다!", + "아이디가 이미 존재합니다", + "인덱스", + "인덱스: %s", + "Input (%d):", + "설치하시겠습니까?", + "엔트로피가 충분하지 않습니다!", + "엔트로피가 충분하지 않습니다", + "유효하지 않은 탬퍼 체크 코드", + "주소가 잘못되었습니다", + "부트로더가 잘못되었습니다", + "니모닉 길이가 잘못되었습니다", + "공개키가 잘못되었습니다", + "지갑이 잘못되었습니다:", + "반전", + "반전된 색상", + "키", + "키가 제공되지 않았습니다", + "Krux 프린터 테스트 QR", + "LCD 유형", + "언어", + "마지막 단어를 Krux가 선택하도록 하려면 비워두십시오", + "왼쪽", + "길이: %s", + "줄 지연", + "줄:", + "Krux 앱 로드", + "니모닉 불러오기", + "이대로 불러오기", + "주소를 보기위해 신뢰할 수 있는 월렛 디스크립터를 불러오시겠습니까?", + "SD카드에서 불러오기", + "SD카드에서 불러오시겠습니까?", + "카메라로 불러오기", + "불러오시겠습니까?", + "불러오시겠습니까?", + "카메라를 구동 중입니다..", + "잔돈 주소를 불러옵니다..", + "프린터를 로딩 중입니다..", + "수신 주소 불러옵니다..", + "로딩 중..", + "언어 설정", + "기본 저장소", + "최대 길이를 초과함 (%s)", + "메시지", + "메시지:", + "서명 파일이 누락되었습니다", + "니모닉", + "니모닉 ID", + "니모닉과 암호는 유지됩니다.", + "니모닉이 암호화되지 않았습니다", + "수정되었습니다:", + "멀티시그", + "네이티브 세그윗 - BIP84를 적용합니다", + "네트워크", + "새로운 니모닉", + "새로운 펌웨어가 감지되었습니다.", + "아니요", + "패스프레이즈 없음", + "주사위 횟수가 충분하지 않습니다!", + "시드문구 순번", + "8진수", + "기타 형식", + "PBKDF2 Iter.", + "카메라가 감지할 수 있도록 펀치된 점을 검게 칠하십시오.", + "종이 너비", + "파트", + "파트 사이즈", + "패스프레이즈", + "비밀번호 길이", + "경로 불일치", + "패턴이 감지되었습니다!", + "저장된 모든 니모닉 및 설정값을 영구적으로 제거하시겠습니까?", + "저장", + "픽셀 편차 지수:", + "일반텍스트 QR", + "지갑 출력 디스크립터를 불러오십시오", + "침수율", + "엔트로피가 부족합니다", + "엔트로피가 부족합니다!", + "QR 테스트 인쇄", + "Tiny Seed를 인쇄하시겠습니까?", + "QR로 인쇄", + "QR로 인쇄하시겠습니까?", + "인쇄하시겠습니까?", + "프린터", + "프린터 드라이버가 설정되지 않았습니다!", + "출력중", + "계속하시겠습니까?", + "계속하시겠습니까?", + "처리...", + "QR 코드", + "RX 핀", + "다시 반복", + "받기", + "주소", + "지역:", + "%s을 제거하시겠습니까?", + "니모닉 제거", + "SD카드에서 펌웨어 파일을 제거하시겠습니까?", + "Res. - 형식", + "공장 설정을 복원하고 재부팅하시겠습니까?", + "QR 뷰어로 돌아가기", + "스캔된 데이터를 검토하고 필요한 경우 수정하십시오", + "오른쪽", + "니모닉을 생성하려면 주사위를 최소 %d번 굴리십시오.", + "주사위값 분포:", + "주사위 횟수:", + "SD카드", + "SD카드가 감지되지 않았습니다.", + "주사위의 SHA256:", + "SHA256 스냅샷:", + "QR 이미지를 SD카드에 저장", + "SD카드에 저장", + "SD카드에 저장하시겠습니까?", + "SD카드에 저장됨", + "스케일", + "주소 스캔하기", + "BIP39 패스프레이즈 스캔하기", + "비밀번호 QR 스캔", + "1번째부터 12번째 단어를 스캔 중입니다", + "13번째부터 24번째 단어를 스캔 중입니다", + "화면보호기 시간", + "지갑 형식", + "보안", + "본인주소 전송 또는 잔돈 (%d):", + "자가 이체:", + "먼저 탬퍼 체크 코드를 설정하세요.", + "설정", + "설정은 플래시에서 내부적으로 저장됩니다.", + "SD 카드에 저장된 설정.", + "Shannon의 엔트로피:", + "종료", + "자동 종료시간", + "종료 중..", + "서명하기", + "QR코드로 내보내기", + "SD카드로 내보내기", + "서명하시겠습니까?", + "서명", + "서명된 메시지", + "서명된 PSBT", + "서명 중..", + "단일서명", + "크기:", + "일부 검사를 수행할 수 없습니다.", + "Spend (%d):", + "지출", + "전문가를 위한 통계", + "플래시 메모리에 저장", + "SD카드에 저장", + "모드를 변경하려면 화면을 옆으로 쓸어내리세요", + "TC Flash Hash", + "부팅 시 플래시 탬퍼 확인 해시", + "터치하거나 엔터를 눌러 캡처하십시오", + "TX 핀", + "탬퍼 체크 코드", + "탬퍼 검사 코드가 성공적으로 설정되었습니다", + "탬퍼 검사 코드가 일치하지 않습니다", + "텍스트", + "The app will be copied to user's flash ", + "테마", + "Thermal", + "데이터 복구가 불가능하도록 장치 전체지우기 기능을 사용하십시오", + "밝기 전환", + "도구", + "터치 민감도", + "터치스크린", + "더 하시겠습니까?", + "BIP39 패스프레이즈 입력", + "비밀번호 입력", + "단위", + "업그레이드가 완료되었습니다", + "검은색 배경 화면을 사용하십시오.", + "카메라의 엔트로피를 사용하여 새로운 니모닉을 생성하십시오", + "이미 사용됨:", + "사용자 데이터", + "%s는 [%s, %s] 범위를 벗어났습니다", + "값은 %s의 배수여야 합니다", + "검증 중..", + "버전", + "카메라", + "20면체 주사위", + "일반 주사위", + "직접 입력", + "니모닉 단어 입력", + "캡처될때까지 기다리십시오", + "지갑 설정", + "지갑 디스크립터", + "지갑 출력 디스크립터", + "지갑 출력 디스크립터가 로드되었습니다!", + "지갑 출력 디스크립터를 찾을 수 없습니다.", + "경고:", + "%d 단어", + "단어 번호(1-2048)", + "시드문구", + "예", + "는 유효한 주소입니다!", + "첫 번째 %d개의 주소에서 찾을 수 없습니다", +] diff --git a/src/krux/translations/nl.py b/src/krux/translations/nl.py index 6db4fca42..0ff481863 100644 --- a/src/krux/translations/nl.py +++ b/src/krux/translations/nl.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['% van het bedrag.', '%d van %d multisig', '%d tot %d', '%s verwijderd.', '(%d totaal)', '(Experimenteel)', '(alleen inzien)', '12 woorden', '24 woorden', 'Over', 'Aanname accepteren?', 'Account', 'Account #0 zou worden aangenomen', 'Accountindex', 'Wachtwoordzin voor portemonnee toevoegen of wijzigen?', 'Extra entropie van de camera vereist voor AES-CBC-modus', 'Adres', 'Richt de camera en back-upplaat op de juiste manier.', 'Sta eerst instellingen toe!', 'Anti reflecterend uitgeschakeld', 'Anti reflecterend ingeschakeld', 'Uiterlijk', 'Weet je het zeker?', 'BGR-kleuren', 'BIP39 Mnemonic', 'Terug', 'Terug naar menu', 'Backup geheugensteun', 'Ongeldige handtekening', 'Base64-wachtwoord', 'Baudratio', 'Binair raster', 'Rand opvulling', 'Helderheid', 'Knoppen', 'Debounce van knoppen', 'Opname geannuleerd', 'Change', 'Wisselgeldadres', 'Thema veranderen en opnieuw opstarten?', 'Wisselgeld:', 'Wijzigingen blijven van kracht tot afsluiten.', 'Controleer SD kaart', 'Controleer of dit adres bij deze portemonnee hoort?', '%d adressen gecontroleerd zonder overeenkomsten.', 'SD kaart controleren..', 'Bevestig de sabotagecontrolecode', 'QR code maken', 'QR code maken van tekst?', 'Aangemaakt:', 'Huidige sabotagecontrolecode', 'Aangepaste QR code', 'Aanpassen', 'Bij aanpassen van de portemonnee zal er een nieuwe sleutel gegenereerd worden.', 'Snijdiepte', 'Snijmethode', 'Decimaal', 'Ontsleutelen?', 'Standaard portemonnee', 'Diepte per pas', 'BIP85-entropie afleiden?', 'Descriptoradressen', 'Weergave', 'Schakel het apparaat niet uit, het kan even duren voordat het klaar is.', 'Klaar?', 'Dubbel geheugensteuntje', 'Driver', 'Leeg', 'Krux-apps inschakelen', 'Versleuteld', 'Versleutelde QR code', 'Versleutelde geheugensteun was niet opgeslagen', 'Versleutelde geheugensteun is opgeslagen met ID:', 'Versleutelen', 'Versleutel modus', 'Voer %d BIP-39 woorden in.', 'Voer een sabotagecontrolecode van 6 of meer tekens in', 'Voer elk woord van jouw BIP-39 geheugensteun in als een nummer van 1 tot 2048.', 'Voer elk woord van jouw BIP-39 geheugensteun in als een hexadecimaal van 1 tot 800.', 'Voer elk woord van jouw BIP-39 geheugensteun in als een octaal van 1 tot 4000.', 'Voer elk woord van jouw BIP-39 geheugensteun in.', 'Gegevens van gebruiker wissen', 'Gegevens van gebruiker wissen..', 'Fout:', 'Esc', 'Een ondertekende Krux-app uitvoeren?', 'Bestanden verkennen?', 'Exporteren naar SD kaart..', 'Uitgebreide publieke sleutel', 'Fabrieksinstellingen', 'Ontsleutelen is niet gelukt', 'PSBT laden is niet gelukt', 'Adres laden is niet gelukt', 'Sleutel laden is niet gelukt', 'Bericht laden is niet gelukt', 'Geheugensteun laden is niet gelukt', 'Descriptor laden is niet gelukt', 'Wachtwoord laden is niet gelukt', 'Geheugensteun opslaan is niet gelukt', 'Tarief:', 'Voedingssnelheid', 'Bestandsnaam', 'Bestandsnaam %s OVERSCHRIJVEN op SD kaart?', 'De flash vullen met entropie van de camera?', 'Flash vullen', 'Vingerafdruk niet ingesteld in PSBT', 'Firmware overschrijdt de maximale grootte: %d', 'Flash Map', 'Flash Tools', 'Flash gevuld met camera-entropie', 'Geflipte X-coördinaten', 'Fluit diameter', 'Vrij:', 'Uit data-opslag', 'Wis uw SD kaart volledig in een ander apparaat om te zorgen dat de gegevens onherstelbaar zijn', 'Geheugensteun genereren', 'Eigen ID gebruiken voor geheugensteun? Anders vingerafdruk gebruiken', 'Ga', 'Goede entropie', 'Hardware', 'Hex publieke sleutel', 'Hexadecimaal', 'Verberg geheugensteunen', 'Hoge kosten!', 'ID bestaat al', 'Index', 'Index: %s', 'Invoer (%d):', 'Installeren?', 'Onvoldoende Entropie!', 'Onvoldoende entropie', 'Ongeldige sabotagecontrolecode', 'Ongeldig adres', 'Ongeldige bootloader', 'Ongeldige geheugensteun lengte', 'Ongeldige publieke sleutel', 'Ongeldige portemonnee:', 'Omkeren', 'Omgekeerde kleuren', 'Sleutel', 'Sleutel niet verstrekt', 'Krux printer test QR', 'LCD-type', 'Taal', 'Laat leeg als je wilt dat Krux een geldig laatste woord kiest', 'Links', 'Lengte: %s', 'Lijn vertraging', 'Lijn:', 'Krux-app laden', 'Geheugensteun laden', 'Portemonnee laden', 'Een vertrouwde portemonnee descriptor laden om adressen te bekijken?', 'Laden vanaf SD kaart', 'Laden vanaf SD kaart?', 'Laden van camera', 'Laden?', 'Laden?', 'Camera laden..', 'Wijzigingsadressen laden..', 'Laadprinter..', 'Ontvangstadressen laden..', 'Laden..', 'Taal', 'Opslaglocatie', 'Maximale lengte overschreden (%s)', 'Bericht', 'Bericht:', 'Handtekening bestand mist', 'Geheugensteun', 'Geheugensteun ID', 'Geheugensteun en wachtwoord worden bewaard.', 'Geheugensteun is niet versleuteld', 'Aangepast:', 'Multisig', 'Native Segwit - 84 zal worden gebruikt', 'Netwerk', 'Geheugensteun aanmaken', 'Nieuwe firmware gevonden.', 'Nee', 'Geen wachtwoordzin', 'Niet genoeg gedobbeld!', 'Nummers', 'Octaal', 'Andere indelingen', 'PBKDF2 iter.', 'Maak geperforeerde stippen zwart zodat ze worden gedetecteerd.', 'Papier breedte', 'Deel', 'Deel grootte', 'Wachtwoord', 'Wachtwoordlengte:', 'Pad komt niet overeen', 'Patroon gevonden!', 'Alle opgeslagen versleutelde mnemonics en instellingen permanent uit het flashgeheugen verwijderen?', 'Opslag', 'Pixelafwijkingsindex:', 'Platte tekst QR', 'Laadt een portemonnee descriptor in', 'Duik tarief', 'Slechte entropie', 'Lage entropie gedetecteerd!', 'Test QR afdrukken', 'Tiny Seed afdrukken?', 'Afdrukken naar QR', 'Afdrukken naar QR?', 'Afdrukken?', 'Printer', 'Printer driver niet ingesteld!', 'Afdrukken..', 'Toch doorgaan?', 'Doorgaan?', 'Verwerken..', 'QR code', 'RX pin', 'Opnieuw opstarten', 'Ontvangen', 'Ontvangstadres', 'Regio:', 'Verwijderen %s?', 'Geheugensteun verwijderen', 'Firmwarebestanden van SD kaart verwijderen?', 'Res. - Formaat', 'Fabrieksinstellingen herstellen en opnieuw opstarten?', 'Terug naar QR-lezer', 'Controleer gescande gegevens en bewerk indien nodig', 'Rechts', 'Dobbel een dobbelsteen minstens %d keer voor het genereren van een geheugensteun.', 'Roldistributie:', 'Gedobbeld:', 'SD kaart', 'SD kaart niet gedetecteerd.', 'Gedobbelde SHA256:', 'Momentopname van SHA256:', 'QR-afbeelding opslaan op SD kaart', 'Opslaan op SD kaart', 'Opslaan op SD kaart?', 'Opgeslagen op SD kaart', 'Schaal', 'Adres scannen', 'BIP-39 Wachtwoord Scannen', 'QR Code Sleutel Scannen', 'Woorden 1 t/m 12 opnieuw scannen', 'Woorden 13 t/m 24 scannen', 'Schermbeveiligingstijd', 'Scripttype', 'Beveiliging', 'Overschrijving naar jezelf, of wisselgeld (%d):', 'Zelf overschrijving:', 'Stel eerst een sabotagecontrolecode in', 'Instellingen', 'Instellingen intern opgeslagen op flitser.', 'Instellingen opgeslagen op SD kaart.', "Shannon's entropie:", 'Afsluiten', 'Uitschakelingstijd:', 'Bezig met afsluiten..', 'Ondertekenen', 'Teken op QR-code', 'Teken op SD kaart', 'Ondertekenen?', 'Handtekening', 'Bericht ondertekend', 'PSBT ondertekend', 'Ondertekenen..', 'Enkele sleutel', 'Grootte:', 'Sommige controles kunnen niet worden uitgevoerd.', 'Uitgaven (%d):', 'Uitgaven:', 'Statistieken voor nerds', 'Opslaan op apparaat', 'Opslaan op SD kaart', 'Verander modus', 'TC Flash Hash', 'Hash Flash bij het opstarten', 'TIK of ENTER voor opname', 'TX pin', 'Sabotagecontrolecode', 'Sabotagecontrolecode succesvol ingesteld', 'Sabotagecontrolecodes komen niet overeen', 'Tekst', "The app will be copied to user's flash ", 'Thema', 'Thermisch', "Gebruik de functie 'Apparaat wissen' om te zorgen dat de gegevens onherstelbaar zijn", 'Helderheid schakelen', 'Hulpmiddelen', 'Aanraak gevoeligheid', 'Aanraakscherm', 'Meer proberen?', 'Voer een BIP-39 wachtwoord in', 'Voer sleutel in', 'Eenheid', 'Upgrade afgerond.', 'Gebruik een donker achergrond.', 'Gebruik de camera als entropie voor het aanmaken van een nieuwe geheugensteun', 'Gebruikt:', 'Gebruiker', 'Waarde %s is buiten bereik: [%s, %s]', 'Waarde moet meerdere van %s zijn', 'Bezig met verifiëren..', 'Versie', 'Via camera', 'Via D20', 'Via D6', 'Via handmatige invoer', 'Via woorden', 'Wacht op opname', 'Portemonnee', 'Descriptor', 'Portemonnee descriptor', 'Portemonnee descriptor geladen!', 'Portemonnee descriptor niet gevonden.', 'Waarschuwing:', 'Woord %d', 'Woord nummers', 'Woorden', 'Yes', 'is geen geldig adres', 'werd NIET GEVONDEN in de eerste %d adressen'] +translation_array = [ + "% van het bedrag.", + "%d van %d multisig", + "%d tot %d", + "%s verwijderd.", + "(%d totaal)", + "(Experimenteel)", + "(alleen inzien)", + "12 woorden", + "24 woorden", + "Over", + "Aanname accepteren?", + "Account", + "Account #0 zou worden aangenomen", + "Accountindex", + "Wachtwoordzin voor portemonnee toevoegen of wijzigen?", + "Extra entropie van de camera vereist voor AES-CBC-modus", + "Adres", + "Richt de camera en back-upplaat op de juiste manier.", + "Sta eerst instellingen toe!", + "Anti reflecterend uitgeschakeld", + "Anti reflecterend ingeschakeld", + "Uiterlijk", + "Weet je het zeker?", + "BGR-kleuren", + "BIP39 Mnemonic", + "Terug", + "Terug naar menu", + "Backup geheugensteun", + "Ongeldige handtekening", + "Base64-wachtwoord", + "Baudratio", + "Binair raster", + "Rand opvulling", + "Helderheid", + "Knoppen", + "Debounce van knoppen", + "Opname geannuleerd", + "Change", + "Wisselgeldadres", + "Thema veranderen en opnieuw opstarten?", + "Wisselgeld:", + "Wijzigingen blijven van kracht tot afsluiten.", + "Controleer SD kaart", + "Controleer of dit adres bij deze portemonnee hoort?", + "%d adressen gecontroleerd zonder overeenkomsten.", + "SD kaart controleren..", + "Bevestig de sabotagecontrolecode", + "QR code maken", + "QR code maken van tekst?", + "Aangemaakt:", + "Huidige sabotagecontrolecode", + "Aangepaste QR code", + "Aanpassen", + "Bij aanpassen van de portemonnee zal er een nieuwe sleutel gegenereerd worden.", + "Snijdiepte", + "Snijmethode", + "Decimaal", + "Ontsleutelen?", + "Standaard portemonnee", + "Diepte per pas", + "BIP85-entropie afleiden?", + "Descriptoradressen", + "Weergave", + "Schakel het apparaat niet uit, het kan even duren voordat het klaar is.", + "Klaar?", + "Dubbel geheugensteuntje", + "Driver", + "Leeg", + "Krux-apps inschakelen", + "Versleuteld", + "Versleutelde QR code", + "Versleutelde geheugensteun was niet opgeslagen", + "Versleutelde geheugensteun is opgeslagen met ID:", + "Versleutelen", + "Versleutel modus", + "Voer %d BIP-39 woorden in.", + "Voer een sabotagecontrolecode van 6 of meer tekens in", + "Voer elk woord van jouw BIP-39 geheugensteun in als een nummer van 1 tot 2048.", + "Voer elk woord van jouw BIP-39 geheugensteun in als een hexadecimaal van 1 tot 800.", + "Voer elk woord van jouw BIP-39 geheugensteun in als een octaal van 1 tot 4000.", + "Voer elk woord van jouw BIP-39 geheugensteun in.", + "Gegevens van gebruiker wissen", + "Gegevens van gebruiker wissen..", + "Fout:", + "Esc", + "Een ondertekende Krux-app uitvoeren?", + "Bestanden verkennen?", + "Exporteren naar SD kaart..", + "Uitgebreide publieke sleutel", + "Fabrieksinstellingen", + "Ontsleutelen is niet gelukt", + "PSBT laden is niet gelukt", + "Adres laden is niet gelukt", + "Sleutel laden is niet gelukt", + "Bericht laden is niet gelukt", + "Geheugensteun laden is niet gelukt", + "Descriptor laden is niet gelukt", + "Wachtwoord laden is niet gelukt", + "Geheugensteun opslaan is niet gelukt", + "Tarief:", + "Voedingssnelheid", + "Bestandsnaam", + "Bestandsnaam %s OVERSCHRIJVEN op SD kaart?", + "De flash vullen met entropie van de camera?", + "Flash vullen", + "Vingerafdruk niet ingesteld in PSBT", + "Firmware overschrijdt de maximale grootte: %d", + "Flash Map", + "Flash Tools", + "Flash gevuld met camera-entropie", + "Geflipte X-coördinaten", + "Fluit diameter", + "Vrij:", + "Uit data-opslag", + "Wis uw SD kaart volledig in een ander apparaat om te zorgen dat de gegevens onherstelbaar zijn", + "Geheugensteun genereren", + "Eigen ID gebruiken voor geheugensteun? Anders vingerafdruk gebruiken", + "Ga", + "Goede entropie", + "Hardware", + "Hex publieke sleutel", + "Hexadecimaal", + "Verberg geheugensteunen", + "Hoge kosten!", + "ID bestaat al", + "Index", + "Index: %s", + "Invoer (%d):", + "Installeren?", + "Onvoldoende Entropie!", + "Onvoldoende entropie", + "Ongeldige sabotagecontrolecode", + "Ongeldig adres", + "Ongeldige bootloader", + "Ongeldige geheugensteun lengte", + "Ongeldige publieke sleutel", + "Ongeldige portemonnee:", + "Omkeren", + "Omgekeerde kleuren", + "Sleutel", + "Sleutel niet verstrekt", + "Krux printer test QR", + "LCD-type", + "Taal", + "Laat leeg als je wilt dat Krux een geldig laatste woord kiest", + "Links", + "Lengte: %s", + "Lijn vertraging", + "Lijn:", + "Krux-app laden", + "Geheugensteun laden", + "Portemonnee laden", + "Een vertrouwde portemonnee descriptor laden om adressen te bekijken?", + "Laden vanaf SD kaart", + "Laden vanaf SD kaart?", + "Laden van camera", + "Laden?", + "Laden?", + "Camera laden..", + "Wijzigingsadressen laden..", + "Laadprinter..", + "Ontvangstadressen laden..", + "Laden..", + "Taal", + "Opslaglocatie", + "Maximale lengte overschreden (%s)", + "Bericht", + "Bericht:", + "Handtekening bestand mist", + "Geheugensteun", + "Geheugensteun ID", + "Geheugensteun en wachtwoord worden bewaard.", + "Geheugensteun is niet versleuteld", + "Aangepast:", + "Multisig", + "Native Segwit - 84 zal worden gebruikt", + "Netwerk", + "Geheugensteun aanmaken", + "Nieuwe firmware gevonden.", + "Nee", + "Geen wachtwoordzin", + "Niet genoeg gedobbeld!", + "Nummers", + "Octaal", + "Andere indelingen", + "PBKDF2 iter.", + "Maak geperforeerde stippen zwart zodat ze worden gedetecteerd.", + "Papier breedte", + "Deel", + "Deel grootte", + "Wachtwoord", + "Wachtwoordlengte:", + "Pad komt niet overeen", + "Patroon gevonden!", + "Alle opgeslagen versleutelde mnemonics en instellingen permanent uit het flashgeheugen verwijderen?", + "Opslag", + "Pixelafwijkingsindex:", + "Platte tekst QR", + "Laadt een portemonnee descriptor in", + "Duik tarief", + "Slechte entropie", + "Lage entropie gedetecteerd!", + "Test QR afdrukken", + "Tiny Seed afdrukken?", + "Afdrukken naar QR", + "Afdrukken naar QR?", + "Afdrukken?", + "Printer", + "Printer driver niet ingesteld!", + "Afdrukken..", + "Toch doorgaan?", + "Doorgaan?", + "Verwerken..", + "QR code", + "RX pin", + "Opnieuw opstarten", + "Ontvangen", + "Ontvangstadres", + "Regio:", + "Verwijderen %s?", + "Geheugensteun verwijderen", + "Firmwarebestanden van SD kaart verwijderen?", + "Res. - Formaat", + "Fabrieksinstellingen herstellen en opnieuw opstarten?", + "Terug naar QR-lezer", + "Controleer gescande gegevens en bewerk indien nodig", + "Rechts", + "Dobbel een dobbelsteen minstens %d keer voor het genereren van een geheugensteun.", + "Roldistributie:", + "Gedobbeld:", + "SD kaart", + "SD kaart niet gedetecteerd.", + "Gedobbelde SHA256:", + "Momentopname van SHA256:", + "QR-afbeelding opslaan op SD kaart", + "Opslaan op SD kaart", + "Opslaan op SD kaart?", + "Opgeslagen op SD kaart", + "Schaal", + "Adres scannen", + "BIP-39 Wachtwoord Scannen", + "QR Code Sleutel Scannen", + "Woorden 1 t/m 12 opnieuw scannen", + "Woorden 13 t/m 24 scannen", + "Schermbeveiligingstijd", + "Scripttype", + "Beveiliging", + "Overschrijving naar jezelf, of wisselgeld (%d):", + "Zelf overschrijving:", + "Stel eerst een sabotagecontrolecode in", + "Instellingen", + "Instellingen intern opgeslagen op flitser.", + "Instellingen opgeslagen op SD kaart.", + "Shannon's entropie:", + "Afsluiten", + "Uitschakelingstijd:", + "Bezig met afsluiten..", + "Ondertekenen", + "Teken op QR-code", + "Teken op SD kaart", + "Ondertekenen?", + "Handtekening", + "Bericht ondertekend", + "PSBT ondertekend", + "Ondertekenen..", + "Enkele sleutel", + "Grootte:", + "Sommige controles kunnen niet worden uitgevoerd.", + "Uitgaven (%d):", + "Uitgaven:", + "Statistieken voor nerds", + "Opslaan op apparaat", + "Opslaan op SD kaart", + "Verander modus", + "TC Flash Hash", + "Hash Flash bij het opstarten", + "TIK of ENTER voor opname", + "TX pin", + "Sabotagecontrolecode", + "Sabotagecontrolecode succesvol ingesteld", + "Sabotagecontrolecodes komen niet overeen", + "Tekst", + "The app will be copied to user's flash ", + "Thema", + "Thermisch", + "Gebruik de functie 'Apparaat wissen' om te zorgen dat de gegevens onherstelbaar zijn", + "Helderheid schakelen", + "Hulpmiddelen", + "Aanraak gevoeligheid", + "Aanraakscherm", + "Meer proberen?", + "Voer een BIP-39 wachtwoord in", + "Voer sleutel in", + "Eenheid", + "Upgrade afgerond.", + "Gebruik een donker achergrond.", + "Gebruik de camera als entropie voor het aanmaken van een nieuwe geheugensteun", + "Gebruikt:", + "Gebruiker", + "Waarde %s is buiten bereik: [%s, %s]", + "Waarde moet meerdere van %s zijn", + "Bezig met verifiëren..", + "Versie", + "Via camera", + "Via D20", + "Via D6", + "Via handmatige invoer", + "Via woorden", + "Wacht op opname", + "Portemonnee", + "Descriptor", + "Portemonnee descriptor", + "Portemonnee descriptor geladen!", + "Portemonnee descriptor niet gevonden.", + "Waarschuwing:", + "Woord %d", + "Woord nummers", + "Woorden", + "Yes", + "is geen geldig adres", + "werd NIET GEVONDEN in de eerste %d adressen", +] diff --git a/src/krux/translations/pt.py b/src/krux/translations/pt.py index ca000953c..144159f0a 100644 --- a/src/krux/translations/pt.py +++ b/src/krux/translations/pt.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['% do valor.', '%d da %d multisig', '%d a %d', '%s removido.', '(%d total)', '(Experimental)', '(Somente visualização)', '12 palavras', '24 palavras', 'Sobre', 'Aceitar suposições?', 'Conta', 'A conta #0 seria assumida', 'Índice da Conta', 'Adicionar ou alterar senha da carteira?', 'Entropia adicional da câmera necessária para o modo AES-CBC', 'Endereço', 'Alinhe a câmera e a placa de backup corretamente.', 'Permita nas configurações primeiro!', 'Antirreflexo desativado', 'Antirreflexo ativado', 'Aparência', 'Tem certeza?', 'Cores BGR', 'Mnemônico BIP39', 'Voltar', 'Voltar ao Menu', 'Backup de Mnemônico', 'Assinatura Inválida', 'Senha Base64', 'Baudrate', 'Grade binária', 'Borda', 'Brilho', 'Botões', 'Debounce dos Botões', 'Captura cancelada', 'Troco', 'Endereços de Troco', 'Mudar o tema e reiniciar?', 'Troco:', 'Alterações só durarão até o desligamento.', 'Verifique o cartão SD', 'Verificar se este endereço pertence a carteira?', 'Verificado %d endereços sem correspondências.', 'Verificando o cartão SD..', 'Confirmar Código', 'Gerar Código QR', 'Gerar código QR do texto?', 'Criado:', 'Código Atual', 'Código QR Customizado', 'Customizar', 'Personalizar sua carteira gerará uma nova chave.', 'Profundidade de Corte', 'Método de Corte', 'Decimal', 'Descriptografar?', 'Carteira Padrão', 'Profundidade da Passagem', 'Derivar entropia BIP85?', 'Endereços do Descritor', 'Display', 'Não desligue, pode demorar um pouco para concluir.', 'Feito?', 'Duplo mnemônico', 'Driver', 'Vazio', 'Ativar Krux app', 'Criptografado', 'Código QR Criptografado', 'Mnemonic criptografado não foi armazenado', 'Mnemônico criptografado foi armazenado com ID:', 'Criptografia', 'Modo de Criptografia', 'Insira %d palavras BIP-39.', 'Insira um código de verificação com mais de 6 caracteres', 'Digite o número de cada palavra do seu mnemônico BIP-39, de 1 a 2048.', 'Digite o número de cada palavra do seu mnemônico BIP-39 como um número em hexadecimal, de 1 a 800.', 'Digite o número de cada palavra do seu mnemônico BIP-39 como um número em octal, de 1 a 4000.', 'Digite cada palavra do seu mnemônico BIP-39.', 'Apagar Dados do Usuário', 'Apagando os dados do usuário..', 'Erro:', 'Esc', 'Executar um Krux app assinado?', 'Explorar arquivos?', 'Exportando para o cartão SD..', 'Chave Pública Estendida', 'Configurações de Fábrica', 'Falhou em descriptografar', 'Falhou ao carregar PSBT', 'Falhou ao carregar endereço', 'Falha ao carregar a chave', 'Falhou ao carregar mensagem', 'Falhou ao carregar mnemônico', 'Falha ao carregar o descritor de saída', 'Falha ao carregar a senha', 'Falhou ao armazenar mnemônico', 'Taxa:', 'Taxa de Alimentação', 'Nome do arquivo', 'O nome do arquivo %s existe no cartão SD, substituir?', 'Preencher a flash com entropia da câmera?', 'Preenchendo a Flash', 'Impressão digital não definida no PSBT', 'Firmware excede o tamanho máximo: %d', 'Mapa da Flash', 'Ferramentas da Flash', 'Flash preenchida com entropia da câmera', 'Coordenadas X invertidas', 'Diâmetro da Fresa', 'Livre:', 'Do Armazenamento', 'Apague totalmente seu cartão SD em outro dispositivo para garantir que os dados sejam irrecuperáveis', 'Gerar Mnemônico', 'Dê a este mnemônico um ID personalizado? Caso contrário, a impressão digital atual será usada', 'Ir', 'Boa entropia', 'Hardware', 'Chave pública hexadecimal', 'Hexadecimal', 'Ocultar Mnemônicos', 'Taxas altas!', 'Id já existe', 'Índice', 'Índice: %s', 'Entradas (%d):', 'Instalar?', 'Entropia insuficiente!', 'Entropia insuficiente', 'Código de verificação inválido', 'Endereço inválido', 'Bootloader inválido', 'Comprimento de mnemônico inválido', 'Chave pública inválida', 'Carteira inválida:', 'Invertido', 'Cores invertidas', 'Chave', 'A chave não foi fornecida', 'Teste de impressão de QR krux', 'Tipo de LCD', 'Língua', 'Deixe em branco se quiser que o Krux escolha uma palavra final válida', 'Esquerda', 'Comprimento: %s', 'Atraso de Linha', 'Linha:', 'Carregar Krux app', 'Carregar Mnemônico', 'Carregar Carteira', 'Carregar um descritor de carteira confiável para visualizar endereços?', 'Carregar do cartão SD', 'Carregar do cartão SD?', 'Carregar da câmera', 'Carregar um?', 'Carregar?', 'Carregando Câmera..', 'Carregando endereços de troco..', 'Carregando impressora..', 'Carregando endereços de recebimento..', 'Carregando..', 'Idioma', 'Local', 'Comprimento máximo excedido (%s)', 'Mensagem', 'Mensagem:', 'Arquivo de assinatura faltando', 'Mnemônico', 'ID do mnemônico', 'Mnemônico e senha serão mantidos.', 'Mnemônico não foi criptografado', 'Modificado:', 'Multisig', 'Segwit nativo - 84 seria assumido', 'Rede', 'Novo Mnemônico', 'Novo firmware detectado.', 'Não', 'Sem Senha', 'Jogadas insuficientes!', 'Números', 'Octal', 'Outros Formatos', 'Iter. PBKDF2', 'Pinte os pontos perfurados de preto para que possam ser detectados.', 'Largura do papel', 'Parte', 'Tamanho da peça', 'Senha', 'Comprimento da Senha', 'Incompatibilidade de caminho', 'Padrão detectado!', 'Remover permanentemente todos os mnemônicos criptografados e configurações armazenados da memória flash?', 'Salvar', 'Índice de desvio de pixels:', 'QR em Texto', 'Carregue um descritor da carteira', 'Taxa de Mergulho', 'Entropia fraca', 'Baixa entropia detectada!', 'Imprimir QR de teste', 'Imprimir Tiny Seed?', 'Imprimir QR', 'Imprimir QR?', 'Imprimir?', 'Impressora', 'Driver de impressora não está definido!', 'Imprimindo..', 'Continuar mesmo assim?', 'Seguir?', 'Processando..', 'Código QR', 'Pino RX', 'Reiniciar', 'Recebimento', 'Endereços de Recebimento', 'Região:', 'Excluir %s?', 'Excluir Mnemônico', 'Remover arquivos de firmware do cartão SD?', 'Res. - Formato', 'Restaurar as configurações de fábrica e reiniciar?', 'Retornar ao Visualizador de QR', 'Revise os dados, edite se necessário', 'Direita', 'Role o dado pelo menos %d vezes para gerar um mnemônico.', 'Distribuição de jogadas:', 'Jogadas:', 'Cartão SD', 'Cartão SD não detectado.', 'SHA256 de jogadas:', 'Sha256 da imagem:', 'Salvar imagem do QR no cartão SD', 'Salvar no cartão SD', 'Salvar no cartão SD?', 'Salvo no cartão SD', 'Escala', 'Escanear Endereço', 'Escanear a senha BIP39', 'Escanear Código QR da Chave', 'Escaneando as palavras 1-12 novamente', 'Escaneando as palavras 13-24', 'Tempo para protetor de tela', 'Tipo de Script', 'Segurança', 'Autotransferência ou Troco (%d):', 'Autotransferência:', 'Defina um código de verificação primeiro', 'Configurações', 'Configurações armazenadas internamente no flash.', 'Configurações armazenadas no cartão SD.', 'Entropia de Shannon:', 'Desligar', 'Tempo de desligamento', 'Desligando..', 'Assinar', 'Assinar para código QR', 'Assinar para cartão SD', 'Assinar?', 'Assinatura', 'Mensagem Assinada', 'PSBT Assinada', 'Assinando..', 'Single-sig', 'Total:', 'Algumas verificações não podem ser realizadas.', 'Gastos (%d):', 'Gasto:', 'Estatísticas para Nerds', 'Armazene na Flash', 'Armazene no Cartão SD', 'Deslize para mudar de modo', 'TC Flash Hash', 'TC Hash Flash na Inicialização', 'TOQUE ou ENTER para capturar', 'Pino TX', 'Código de Verificação', 'Código de verificação definido com sucesso', 'Os códigos de verificação não correspondem', 'Texto', "The app will be copied to user's flash ", 'Tema', 'Térmica', 'Para garantir que os dados sejam irrecuperáveis, use o recurso Limpar Dispositivo', 'Alternar brilho', 'Ferramentas', 'Limiar de Toque', 'Touchscreen', 'Tentar mais?', 'Digitar a senha BIP39', 'Digite a Chave', 'Unidade', 'Atualização completa.', 'Use uma superfície de fundo preta.', 'Use a entropia da câmera para criar um novo mnemônico', 'Usado:', 'Usuário', 'Valor %s fora do alcance: [ %s, %s]', 'O valor deve ser múltiplo de %s', 'Verificando..', 'Versão', 'Pela Câmera', 'Via D20', 'Via D6', 'Por entrada manual', 'Via Palavras', 'Aguarde a captura', 'Carteira', 'Descritor de Carteira', 'Descritor da carteira', 'Descritor de saída da carteira carregado!', 'O descritor de saída da carteira não foi encontrado.', 'Aviso:', 'Palavra %d', 'Números das Palavras', 'Palavras', 'Sim', 'é um endereço válido!', 'NÃO FOI ENCONTRADO nos primeiros %d endereços'] +translation_array = [ + "% do valor.", + "%d da %d multisig", + "%d a %d", + "%s removido.", + "(%d total)", + "(Experimental)", + "(Somente visualização)", + "12 palavras", + "24 palavras", + "Sobre", + "Aceitar suposições?", + "Conta", + "A conta #0 seria assumida", + "Índice da Conta", + "Adicionar ou alterar senha da carteira?", + "Entropia adicional da câmera necessária para o modo AES-CBC", + "Endereço", + "Alinhe a câmera e a placa de backup corretamente.", + "Permita nas configurações primeiro!", + "Antirreflexo desativado", + "Antirreflexo ativado", + "Aparência", + "Tem certeza?", + "Cores BGR", + "Mnemônico BIP39", + "Voltar", + "Voltar ao Menu", + "Backup de Mnemônico", + "Assinatura Inválida", + "Senha Base64", + "Baudrate", + "Grade binária", + "Borda", + "Brilho", + "Botões", + "Debounce dos Botões", + "Captura cancelada", + "Troco", + "Endereços de Troco", + "Mudar o tema e reiniciar?", + "Troco:", + "Alterações só durarão até o desligamento.", + "Verifique o cartão SD", + "Verificar se este endereço pertence a carteira?", + "Verificado %d endereços sem correspondências.", + "Verificando o cartão SD..", + "Confirmar Código", + "Gerar Código QR", + "Gerar código QR do texto?", + "Criado:", + "Código Atual", + "Código QR Customizado", + "Customizar", + "Personalizar sua carteira gerará uma nova chave.", + "Profundidade de Corte", + "Método de Corte", + "Decimal", + "Descriptografar?", + "Carteira Padrão", + "Profundidade da Passagem", + "Derivar entropia BIP85?", + "Endereços do Descritor", + "Display", + "Não desligue, pode demorar um pouco para concluir.", + "Feito?", + "Duplo mnemônico", + "Driver", + "Vazio", + "Ativar Krux app", + "Criptografado", + "Código QR Criptografado", + "Mnemonic criptografado não foi armazenado", + "Mnemônico criptografado foi armazenado com ID:", + "Criptografia", + "Modo de Criptografia", + "Insira %d palavras BIP-39.", + "Insira um código de verificação com mais de 6 caracteres", + "Digite o número de cada palavra do seu mnemônico BIP-39, de 1 a 2048.", + "Digite o número de cada palavra do seu mnemônico BIP-39 como um número em hexadecimal, de 1 a 800.", + "Digite o número de cada palavra do seu mnemônico BIP-39 como um número em octal, de 1 a 4000.", + "Digite cada palavra do seu mnemônico BIP-39.", + "Apagar Dados do Usuário", + "Apagando os dados do usuário..", + "Erro:", + "Esc", + "Executar um Krux app assinado?", + "Explorar arquivos?", + "Exportando para o cartão SD..", + "Chave Pública Estendida", + "Configurações de Fábrica", + "Falhou em descriptografar", + "Falhou ao carregar PSBT", + "Falhou ao carregar endereço", + "Falha ao carregar a chave", + "Falhou ao carregar mensagem", + "Falhou ao carregar mnemônico", + "Falha ao carregar o descritor de saída", + "Falha ao carregar a senha", + "Falhou ao armazenar mnemônico", + "Taxa:", + "Taxa de Alimentação", + "Nome do arquivo", + "O nome do arquivo %s existe no cartão SD, substituir?", + "Preencher a flash com entropia da câmera?", + "Preenchendo a Flash", + "Impressão digital não definida no PSBT", + "Firmware excede o tamanho máximo: %d", + "Mapa da Flash", + "Ferramentas da Flash", + "Flash preenchida com entropia da câmera", + "Coordenadas X invertidas", + "Diâmetro da Fresa", + "Livre:", + "Do Armazenamento", + "Apague totalmente seu cartão SD em outro dispositivo para garantir que os dados sejam irrecuperáveis", + "Gerar Mnemônico", + "Dê a este mnemônico um ID personalizado? Caso contrário, a impressão digital atual será usada", + "Ir", + "Boa entropia", + "Hardware", + "Chave pública hexadecimal", + "Hexadecimal", + "Ocultar Mnemônicos", + "Taxas altas!", + "Id já existe", + "Índice", + "Índice: %s", + "Entradas (%d):", + "Instalar?", + "Entropia insuficiente!", + "Entropia insuficiente", + "Código de verificação inválido", + "Endereço inválido", + "Bootloader inválido", + "Comprimento de mnemônico inválido", + "Chave pública inválida", + "Carteira inválida:", + "Invertido", + "Cores invertidas", + "Chave", + "A chave não foi fornecida", + "Teste de impressão de QR krux", + "Tipo de LCD", + "Língua", + "Deixe em branco se quiser que o Krux escolha uma palavra final válida", + "Esquerda", + "Comprimento: %s", + "Atraso de Linha", + "Linha:", + "Carregar Krux app", + "Carregar Mnemônico", + "Carregar Carteira", + "Carregar um descritor de carteira confiável para visualizar endereços?", + "Carregar do cartão SD", + "Carregar do cartão SD?", + "Carregar da câmera", + "Carregar um?", + "Carregar?", + "Carregando Câmera..", + "Carregando endereços de troco..", + "Carregando impressora..", + "Carregando endereços de recebimento..", + "Carregando..", + "Idioma", + "Local", + "Comprimento máximo excedido (%s)", + "Mensagem", + "Mensagem:", + "Arquivo de assinatura faltando", + "Mnemônico", + "ID do mnemônico", + "Mnemônico e senha serão mantidos.", + "Mnemônico não foi criptografado", + "Modificado:", + "Multisig", + "Segwit nativo - 84 seria assumido", + "Rede", + "Novo Mnemônico", + "Novo firmware detectado.", + "Não", + "Sem Senha", + "Jogadas insuficientes!", + "Números", + "Octal", + "Outros Formatos", + "Iter. PBKDF2", + "Pinte os pontos perfurados de preto para que possam ser detectados.", + "Largura do papel", + "Parte", + "Tamanho da peça", + "Senha", + "Comprimento da Senha", + "Incompatibilidade de caminho", + "Padrão detectado!", + "Remover permanentemente todos os mnemônicos criptografados e configurações armazenados da memória flash?", + "Salvar", + "Índice de desvio de pixels:", + "QR em Texto", + "Carregue um descritor da carteira", + "Taxa de Mergulho", + "Entropia fraca", + "Baixa entropia detectada!", + "Imprimir QR de teste", + "Imprimir Tiny Seed?", + "Imprimir QR", + "Imprimir QR?", + "Imprimir?", + "Impressora", + "Driver de impressora não está definido!", + "Imprimindo..", + "Continuar mesmo assim?", + "Seguir?", + "Processando..", + "Código QR", + "Pino RX", + "Reiniciar", + "Recebimento", + "Endereços de Recebimento", + "Região:", + "Excluir %s?", + "Excluir Mnemônico", + "Remover arquivos de firmware do cartão SD?", + "Res. - Formato", + "Restaurar as configurações de fábrica e reiniciar?", + "Retornar ao Visualizador de QR", + "Revise os dados, edite se necessário", + "Direita", + "Role o dado pelo menos %d vezes para gerar um mnemônico.", + "Distribuição de jogadas:", + "Jogadas:", + "Cartão SD", + "Cartão SD não detectado.", + "SHA256 de jogadas:", + "Sha256 da imagem:", + "Salvar imagem do QR no cartão SD", + "Salvar no cartão SD", + "Salvar no cartão SD?", + "Salvo no cartão SD", + "Escala", + "Escanear Endereço", + "Escanear a senha BIP39", + "Escanear Código QR da Chave", + "Escaneando as palavras 1-12 novamente", + "Escaneando as palavras 13-24", + "Tempo para protetor de tela", + "Tipo de Script", + "Segurança", + "Autotransferência ou Troco (%d):", + "Autotransferência:", + "Defina um código de verificação primeiro", + "Configurações", + "Configurações armazenadas internamente no flash.", + "Configurações armazenadas no cartão SD.", + "Entropia de Shannon:", + "Desligar", + "Tempo de desligamento", + "Desligando..", + "Assinar", + "Assinar para código QR", + "Assinar para cartão SD", + "Assinar?", + "Assinatura", + "Mensagem Assinada", + "PSBT Assinada", + "Assinando..", + "Single-sig", + "Total:", + "Algumas verificações não podem ser realizadas.", + "Gastos (%d):", + "Gasto:", + "Estatísticas para Nerds", + "Armazene na Flash", + "Armazene no Cartão SD", + "Deslize para mudar de modo", + "TC Flash Hash", + "TC Hash Flash na Inicialização", + "TOQUE ou ENTER para capturar", + "Pino TX", + "Código de Verificação", + "Código de verificação definido com sucesso", + "Os códigos de verificação não correspondem", + "Texto", + "The app will be copied to user's flash ", + "Tema", + "Térmica", + "Para garantir que os dados sejam irrecuperáveis, use o recurso Limpar Dispositivo", + "Alternar brilho", + "Ferramentas", + "Limiar de Toque", + "Touchscreen", + "Tentar mais?", + "Digitar a senha BIP39", + "Digite a Chave", + "Unidade", + "Atualização completa.", + "Use uma superfície de fundo preta.", + "Use a entropia da câmera para criar um novo mnemônico", + "Usado:", + "Usuário", + "Valor %s fora do alcance: [ %s, %s]", + "O valor deve ser múltiplo de %s", + "Verificando..", + "Versão", + "Pela Câmera", + "Via D20", + "Via D6", + "Por entrada manual", + "Via Palavras", + "Aguarde a captura", + "Carteira", + "Descritor de Carteira", + "Descritor da carteira", + "Descritor de saída da carteira carregado!", + "O descritor de saída da carteira não foi encontrado.", + "Aviso:", + "Palavra %d", + "Números das Palavras", + "Palavras", + "Sim", + "é um endereço válido!", + "NÃO FOI ENCONTRADO nos primeiros %d endereços", +] diff --git a/src/krux/translations/ru.py b/src/krux/translations/ru.py index 21dd2466f..0c3d1acfd 100644 --- a/src/krux/translations/ru.py +++ b/src/krux/translations/ru.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['% от суммы.', '%d из %d мультиподпись', '%d к %d', '%s удален.', '(%d всего)', '(Эксперементальный)', '(Только часы)', '12 слов', '24 слова', 'О Программе', 'Принять предположение?', 'Учетная запись', 'Будет принят счет №0', 'Индекс счета', 'Добавить или изменить пароль кошелька?', 'Для режима AES-CBC требуется дополнительная энтропия от камеры', 'Адрес', 'Правильно совместите камеру и резервную пластину.', 'Сначала разрешите в настройках!', 'Антиблик отключен', 'Антиблик включен', 'Внешний Вид', 'Вы уверены?', 'Цвета BGR', 'BIP39 Мнемоника', 'Назад', 'Назад в Mеню', 'Резервная мнемоника', 'Плохая подпись', 'Пароль Base64', 'Скорость Передачи Данных', 'Двоичная сетка', 'Заполнение Границ', 'Яркость', 'Кнопки', 'Антидребезг кнопок', 'Захват отменен', 'Сдача', 'Адрес Сдачи', 'Сменить тему и перезагрузить?', 'Сдача:', 'Изменения будут храниться до выключения.', 'Проверить SD Карту', 'Проверить, что адрес принадлежит этому кошельку?', 'Проверено %d адресов без совпадений.', 'Проверка SD карты..', 'Подтвердите код проверки вскрытия', 'Создать QR Код', 'Создать QR код из текста?', 'Создано:', 'Текущий код проверки вскрытия', 'Пользовательский QR Код', 'Настроить', 'Настройка вашего кошелька создаст новый ключ.', 'Глубина Резки', 'Метод Резки', 'Десятичный', 'Расшифровать?', 'Кошелек по умолчанию', 'Глубина за Проход', 'Вывести энтропию BIP85?', 'Адреса дескрипторов', 'Дисплеи', 'Не выключайте питание, это может занять некоторое время.', 'Готово?', 'Двойная мнемоника', 'Драйвер', 'Пустой', 'Включить приложения Krux', 'Зашифровано', 'Зашифрованный QR Код', 'Зашифрованная мнемоника не была сохранена', 'Зашифрованная мнемоника была сохранена с ID:', 'Шифрование', 'Метод Шифрования', 'Введите %d слов BIP-39.', 'Введите более 6 символов кода проверки вскрытия', 'Введите каждое слово вашей мнемоники BIP-39 в виде числа от 1 до 2048.', 'Введите каждое слово вашей мнемоники BIP-39 в виде шестнадцатеричного числа от 1 до 800.', 'Введите каждое слово вашей мнемоники BIP-39 в виде восьмеричного числа от 1 до 4000.', 'Введите каждое слово вашей BIP-39 мнемоники.', 'Удалить данные пользователя', 'Удаление данных пользователя..', 'Ошибка:', 'Выйти', 'Выполнить подписанное приложение Krux?', 'Исследовать файлы?', 'Экспортирование на SD карту..', 'Расширенный Публичный Ключ', 'Заводские Настройки', 'Не удалось расшифровать', 'Не удалось загрузить PSBT', 'Не удалось загрузить адрес', 'Не удалось загрузить ключ', 'Не удалось загрузить сообщение', 'Не удалось загрузить мнемонику', 'Не удалось загрузить выходной дескриптор', 'Не удалось загрузить фразу-пароль', 'Не удалось сохранить мнемонику', 'Комиссия:', 'Скорость Подачи', 'Имя файла', 'Файл %s существует на SD карте, перезаписать?', 'Заполнить флэш энтропией с камеры?', 'Заполнение флэша', 'Отпечаток пальца не установлен в PSBT', 'Прошивка превышает максимальный размер: %d', 'Карта флэша', 'Flash Tools', 'Флэш заполнен энтропией камеры', 'Перевернутые координаты X', 'Диаметр Флюта', 'Свободно:', 'Из Памяти', 'Полностью стерите SD-карту в другом устройстве, чтобы убедиться, что данные не восстановимы', 'Создать Мнемонику', 'Назначить этой мнемоники кастомный ID? В ином случае будет использован текущий фингерпринт', 'OK', 'Хорошая энтропия', 'Аппаратное Обеспечение', 'Шестнадцатеричный Публичный Ключ', 'Шестнадцатеричный', 'Скрыть мнемоники', 'Высокие комиссии!', 'ID уже существует', 'Индекс', 'Индекс: %s', 'Входы (%d):', 'Установить?', 'Недостаточная Энтропия!', 'Недостаточная энтропия', 'Недействительный код проверки вскрытия', 'Неверный адрес', 'Неверный загрузчик', 'Неверная длина мнемоники', 'Неверный публичный ключ', 'Неверный кошелек:', 'Инвертировать', 'Перевернутые цвета', 'Ключ', 'Ключ не предоставлен', 'Тестовый QR Принтера Krux', 'Тип ЖК-дисплея', 'Язык', 'Оставьте пустым, если хотите, чтобы Krux выбрал подходящее последнее слово', 'Влево', 'Длина: %s', 'Задержка Линии', 'Линия:', 'Загрузить приложение Krux', 'Загрузить Мнемонику', 'Загрузить кошелек', 'Загрузить дескриптор доверенного кошелька для просмотра адресов?', 'Загрузка с SD-карты', 'Загрузить с SD карты?', 'Из камеры', 'Загрузить один?', 'Загрузить?', 'Загрузка Камеры..', 'Загрузка адресов изменения..', 'Загрузка принтера..', 'Загрузка адресов получения..', 'Загрузка..', 'Локаль', 'Расположение', 'Максимальная длина превышена (%s)', 'Сообщение', 'Сообщение:', 'Отсутствует файл подписи', 'Мнемоника', 'ID Мнемоники', 'Мнемоника и парольная фраза будут сохранены.', 'Мнемоника не была зашифрована', 'Изменено:', 'Мультиподпись', 'Native Segwit - 84 будет принято', 'Сеть', 'Новая Мнемоника', 'Обнаружена новая прошивка.', 'Нет', 'Нет Фраза-пароль', 'Недостаточно бросков!', 'Числа', 'Восьмеричный', 'Другие форматы', 'PBKDF2 Итерации', 'Закрасьте перфорированные точки черным цветом, чтобы их можно было обнаружить.', 'Ширина Бумаги', 'Часть', 'Размер Части', 'Фраза-пароль', 'Длина пароля', 'Несоответствие пути', 'Образец обнаружен!', 'Окончательно удалить все сохраненные зашифрованные мнемоники и настройки из флеш-памяти?', 'Постоянная Память', 'Индекс отклонения пикселей:', 'QR Открытым Текстом', 'Пожалуйста загрузите выходной дескриптор кошелька', 'Скорость Погружения', 'Плохая энтропия', 'Обнаружена плохая энтропия!', 'Напечатать Тестовый QR', 'Распечатать Tiny Seed?', 'Печать в QR', 'Напечатать в виде QR?', 'Печатать?', 'Принтер', 'Драйвер Принтера не установлен!', 'Идет печать..', 'Все равно продолжить?', 'Продолжить?', 'Обработка..', 'QR Код', 'RX Пин', 'Перезагрузить', 'Получить', 'Адрес Получения', 'Регион:', 'Удалить %s?', 'Удалить Мнемонику', 'Удалить файлы прошивки с SD-карты?', 'Разреш. - Формат', 'Восстановить заводские настройки и перезагрузить?', 'Вернуться к QR-просмотрщику', 'Просмотрите отсканированные данные, отредактируйте при необходимости', 'Вправо', 'Бросьте кубик не менее %d раз, чтобы сгенерировать мнемонику.', 'Распределение бросков:', 'Броски:', 'SD карта', 'SD карта не обнаружена.', 'SHA256 бросков:', 'SHA256 снэпшота:', 'Сохранить QR-изображение на SD-карту', 'Сохранить на SD-карту', 'Сохранить на SD карту?', 'Сохранено на SD карту', 'Шкала', 'Отсканировать Адрес', 'Отсканировать BIP39 фразу-пароль', 'Отсканировать Ключ QR код', 'Сканирование слов 1-12 снова', 'Сканирование слов 13-24', 'Время Экранной Заставки', 'Тип скрипта', 'Охрана', 'Трансфер самому себе или Сдача (%d):', 'Перевод самому себе:', 'Сначала установите код проверки вскрытия', 'Настройки', 'Настройки хранятся во флэш-памяти.', 'Настройки сохранены на SD-карте.', 'Энтропия Шеннона:', 'Выключить', 'Время выключения', 'Выключение..', 'Подписать', 'Подписать QR-код', 'Подписать на SD-карте', 'Подписать?', 'Подпись', 'Подписанное Сообщение', 'Подписанное PSBT', 'Подписание..', 'Одна подпись', 'Размер:', 'Некоторые проверки не могут быть выполнены.', 'Расход (%d):', 'Расход:', 'Статистика для Гиков', 'Сохранить на Флэш Память', 'Сохранить на SD Карту', 'Свайпните, чтобы сменить режим', 'TC Flash Hash', 'Проверка хэша Flash при загрузке', 'ПРИКОСНИТЕСЬ или нажмите ВВОД, чтобы захватить', 'TX Пин', 'Код проверки вскрытия', 'Код проверки вскрытия успешно установлен', 'Коды проверки вскрытия не совпадают', 'Текст', "The app will be copied to user's flash ", 'Тема', 'Термальный', 'Для гарантии невосстановления данных используйте функцию Очистки Устройства', 'Регулировка Яркости', 'Инструменты', 'Чувствительность', 'Тачскрин', 'Попробовать ещё?', 'Ввести BIP39 фразу-пароль', 'Ввести Ключ', 'Единица Измерения', 'Обновление завершено.', 'Использовать черную фоновую поверхность.', 'Использовать энтропию камеры, чтобы создать новую мнемонику', 'Использовано:', 'Пользователь', 'Значение %s вне диапозона: [%s, %s]', 'Значение должно быть кратным %s', 'Проверка..', 'Версия', 'С Помощью Камеры', 'С Помощью D20', 'С Помощью D6', 'С Помощью Ручного Ввода', 'Через Слово', 'Дождитесь Захвата', 'Кошелек', 'Дескриптор Кошелька', 'Выходной дескриптор кошелька', 'Выходной дескриптор кошелька загружен!', 'Выходной дескриптор кошелька не найден.', 'Предупреждение:', 'Слово %d', 'Числа Слов', 'Слова', 'Да', 'некорректный адрес', 'нЕ НАЙДЕНО в первых %d адресах'] +translation_array = [ + "% от суммы.", + "%d из %d мультиподпись", + "%d к %d", + "%s удален.", + "(%d всего)", + "(Эксперементальный)", + "(Только часы)", + "12 слов", + "24 слова", + "О Программе", + "Принять предположение?", + "Учетная запись", + "Будет принят счет №0", + "Индекс счета", + "Добавить или изменить пароль кошелька?", + "Для режима AES-CBC требуется дополнительная энтропия от камеры", + "Адрес", + "Правильно совместите камеру и резервную пластину.", + "Сначала разрешите в настройках!", + "Антиблик отключен", + "Антиблик включен", + "Внешний Вид", + "Вы уверены?", + "Цвета BGR", + "BIP39 Мнемоника", + "Назад", + "Назад в Mеню", + "Резервная мнемоника", + "Плохая подпись", + "Пароль Base64", + "Скорость Передачи Данных", + "Двоичная сетка", + "Заполнение Границ", + "Яркость", + "Кнопки", + "Антидребезг кнопок", + "Захват отменен", + "Сдача", + "Адрес Сдачи", + "Сменить тему и перезагрузить?", + "Сдача:", + "Изменения будут храниться до выключения.", + "Проверить SD Карту", + "Проверить, что адрес принадлежит этому кошельку?", + "Проверено %d адресов без совпадений.", + "Проверка SD карты..", + "Подтвердите код проверки вскрытия", + "Создать QR Код", + "Создать QR код из текста?", + "Создано:", + "Текущий код проверки вскрытия", + "Пользовательский QR Код", + "Настроить", + "Настройка вашего кошелька создаст новый ключ.", + "Глубина Резки", + "Метод Резки", + "Десятичный", + "Расшифровать?", + "Кошелек по умолчанию", + "Глубина за Проход", + "Вывести энтропию BIP85?", + "Адреса дескрипторов", + "Дисплеи", + "Не выключайте питание, это может занять некоторое время.", + "Готово?", + "Двойная мнемоника", + "Драйвер", + "Пустой", + "Включить приложения Krux", + "Зашифровано", + "Зашифрованный QR Код", + "Зашифрованная мнемоника не была сохранена", + "Зашифрованная мнемоника была сохранена с ID:", + "Шифрование", + "Метод Шифрования", + "Введите %d слов BIP-39.", + "Введите более 6 символов кода проверки вскрытия", + "Введите каждое слово вашей мнемоники BIP-39 в виде числа от 1 до 2048.", + "Введите каждое слово вашей мнемоники BIP-39 в виде шестнадцатеричного числа от 1 до 800.", + "Введите каждое слово вашей мнемоники BIP-39 в виде восьмеричного числа от 1 до 4000.", + "Введите каждое слово вашей BIP-39 мнемоники.", + "Удалить данные пользователя", + "Удаление данных пользователя..", + "Ошибка:", + "Выйти", + "Выполнить подписанное приложение Krux?", + "Исследовать файлы?", + "Экспортирование на SD карту..", + "Расширенный Публичный Ключ", + "Заводские Настройки", + "Не удалось расшифровать", + "Не удалось загрузить PSBT", + "Не удалось загрузить адрес", + "Не удалось загрузить ключ", + "Не удалось загрузить сообщение", + "Не удалось загрузить мнемонику", + "Не удалось загрузить выходной дескриптор", + "Не удалось загрузить фразу-пароль", + "Не удалось сохранить мнемонику", + "Комиссия:", + "Скорость Подачи", + "Имя файла", + "Файл %s существует на SD карте, перезаписать?", + "Заполнить флэш энтропией с камеры?", + "Заполнение флэша", + "Отпечаток пальца не установлен в PSBT", + "Прошивка превышает максимальный размер: %d", + "Карта флэша", + "Flash Tools", + "Флэш заполнен энтропией камеры", + "Перевернутые координаты X", + "Диаметр Флюта", + "Свободно:", + "Из Памяти", + "Полностью стерите SD-карту в другом устройстве, чтобы убедиться, что данные не восстановимы", + "Создать Мнемонику", + "Назначить этой мнемоники кастомный ID? В ином случае будет использован текущий фингерпринт", + "OK", + "Хорошая энтропия", + "Аппаратное Обеспечение", + "Шестнадцатеричный Публичный Ключ", + "Шестнадцатеричный", + "Скрыть мнемоники", + "Высокие комиссии!", + "ID уже существует", + "Индекс", + "Индекс: %s", + "Входы (%d):", + "Установить?", + "Недостаточная Энтропия!", + "Недостаточная энтропия", + "Недействительный код проверки вскрытия", + "Неверный адрес", + "Неверный загрузчик", + "Неверная длина мнемоники", + "Неверный публичный ключ", + "Неверный кошелек:", + "Инвертировать", + "Перевернутые цвета", + "Ключ", + "Ключ не предоставлен", + "Тестовый QR Принтера Krux", + "Тип ЖК-дисплея", + "Язык", + "Оставьте пустым, если хотите, чтобы Krux выбрал подходящее последнее слово", + "Влево", + "Длина: %s", + "Задержка Линии", + "Линия:", + "Загрузить приложение Krux", + "Загрузить Мнемонику", + "Загрузить кошелек", + "Загрузить дескриптор доверенного кошелька для просмотра адресов?", + "Загрузка с SD-карты", + "Загрузить с SD карты?", + "Из камеры", + "Загрузить один?", + "Загрузить?", + "Загрузка Камеры..", + "Загрузка адресов изменения..", + "Загрузка принтера..", + "Загрузка адресов получения..", + "Загрузка..", + "Локаль", + "Расположение", + "Максимальная длина превышена (%s)", + "Сообщение", + "Сообщение:", + "Отсутствует файл подписи", + "Мнемоника", + "ID Мнемоники", + "Мнемоника и парольная фраза будут сохранены.", + "Мнемоника не была зашифрована", + "Изменено:", + "Мультиподпись", + "Native Segwit - 84 будет принято", + "Сеть", + "Новая Мнемоника", + "Обнаружена новая прошивка.", + "Нет", + "Нет Фраза-пароль", + "Недостаточно бросков!", + "Числа", + "Восьмеричный", + "Другие форматы", + "PBKDF2 Итерации", + "Закрасьте перфорированные точки черным цветом, чтобы их можно было обнаружить.", + "Ширина Бумаги", + "Часть", + "Размер Части", + "Фраза-пароль", + "Длина пароля", + "Несоответствие пути", + "Образец обнаружен!", + "Окончательно удалить все сохраненные зашифрованные мнемоники и настройки из флеш-памяти?", + "Постоянная Память", + "Индекс отклонения пикселей:", + "QR Открытым Текстом", + "Пожалуйста загрузите выходной дескриптор кошелька", + "Скорость Погружения", + "Плохая энтропия", + "Обнаружена плохая энтропия!", + "Напечатать Тестовый QR", + "Распечатать Tiny Seed?", + "Печать в QR", + "Напечатать в виде QR?", + "Печатать?", + "Принтер", + "Драйвер Принтера не установлен!", + "Идет печать..", + "Все равно продолжить?", + "Продолжить?", + "Обработка..", + "QR Код", + "RX Пин", + "Перезагрузить", + "Получить", + "Адрес Получения", + "Регион:", + "Удалить %s?", + "Удалить Мнемонику", + "Удалить файлы прошивки с SD-карты?", + "Разреш. - Формат", + "Восстановить заводские настройки и перезагрузить?", + "Вернуться к QR-просмотрщику", + "Просмотрите отсканированные данные, отредактируйте при необходимости", + "Вправо", + "Бросьте кубик не менее %d раз, чтобы сгенерировать мнемонику.", + "Распределение бросков:", + "Броски:", + "SD карта", + "SD карта не обнаружена.", + "SHA256 бросков:", + "SHA256 снэпшота:", + "Сохранить QR-изображение на SD-карту", + "Сохранить на SD-карту", + "Сохранить на SD карту?", + "Сохранено на SD карту", + "Шкала", + "Отсканировать Адрес", + "Отсканировать BIP39 фразу-пароль", + "Отсканировать Ключ QR код", + "Сканирование слов 1-12 снова", + "Сканирование слов 13-24", + "Время Экранной Заставки", + "Тип скрипта", + "Охрана", + "Трансфер самому себе или Сдача (%d):", + "Перевод самому себе:", + "Сначала установите код проверки вскрытия", + "Настройки", + "Настройки хранятся во флэш-памяти.", + "Настройки сохранены на SD-карте.", + "Энтропия Шеннона:", + "Выключить", + "Время выключения", + "Выключение..", + "Подписать", + "Подписать QR-код", + "Подписать на SD-карте", + "Подписать?", + "Подпись", + "Подписанное Сообщение", + "Подписанное PSBT", + "Подписание..", + "Одна подпись", + "Размер:", + "Некоторые проверки не могут быть выполнены.", + "Расход (%d):", + "Расход:", + "Статистика для Гиков", + "Сохранить на Флэш Память", + "Сохранить на SD Карту", + "Свайпните, чтобы сменить режим", + "TC Flash Hash", + "Проверка хэша Flash при загрузке", + "ПРИКОСНИТЕСЬ или нажмите ВВОД, чтобы захватить", + "TX Пин", + "Код проверки вскрытия", + "Код проверки вскрытия успешно установлен", + "Коды проверки вскрытия не совпадают", + "Текст", + "The app will be copied to user's flash ", + "Тема", + "Термальный", + "Для гарантии невосстановления данных используйте функцию Очистки Устройства", + "Регулировка Яркости", + "Инструменты", + "Чувствительность", + "Тачскрин", + "Попробовать ещё?", + "Ввести BIP39 фразу-пароль", + "Ввести Ключ", + "Единица Измерения", + "Обновление завершено.", + "Использовать черную фоновую поверхность.", + "Использовать энтропию камеры, чтобы создать новую мнемонику", + "Использовано:", + "Пользователь", + "Значение %s вне диапозона: [%s, %s]", + "Значение должно быть кратным %s", + "Проверка..", + "Версия", + "С Помощью Камеры", + "С Помощью D20", + "С Помощью D6", + "С Помощью Ручного Ввода", + "Через Слово", + "Дождитесь Захвата", + "Кошелек", + "Дескриптор Кошелька", + "Выходной дескриптор кошелька", + "Выходной дескриптор кошелька загружен!", + "Выходной дескриптор кошелька не найден.", + "Предупреждение:", + "Слово %d", + "Числа Слов", + "Слова", + "Да", + "некорректный адрес", + "нЕ НАЙДЕНО в первых %d адресах", +] diff --git a/src/krux/translations/tr.py b/src/krux/translations/tr.py index f040cddf4..c15f5c91d 100644 --- a/src/krux/translations/tr.py +++ b/src/krux/translations/tr.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ["tutarın %'si.", '%d / %d çoklu imza', '%d to %d', '%s kaldırıldı.', '(toplam %d)', '(Deneysel)', '(sadece izle)', '12 kelime', '24 kelime', 'Hakkında', 'Varsayım kabul edilsin mi?', 'Hesap', '#0 numaralı hesap varsayılacaktır', 'Hesap Endeksi', 'Cüzdan parolası eklensin mi veya değiştirilsin mi?', 'AES-CBC modu için kameradan ek entropi gereklidir', 'Adres', "Kamerayı ve yedek plakay'ı düzgün bir şekilde hizalayın.", 'Önce ayarlarda izin ver!', 'Parlama önleyici devre dışı', 'Parlama önleyici etkin', 'Görünüm', 'Emin misiniz?', 'BGR Renkleri', 'BIP39 Anımsatıcı', 'Geri', 'Menüye Dön', 'Yedek Mnemonic', 'Geçersiz imza', 'Base64 Parola', 'Baud Hızı', 'İkili Izgara', 'Kenarlık Dolgusu', 'Parlaklık', 'Butonlar', 'Buton Geri-sekmesi', 'Yakalama iptal edildi', 'Para Üstü', 'Para Üstü Adresleri', 'Temayı değiştir ve yeniden başlat?', 'Para Üstü:', 'Değişiklikler kapanışa kadar devam edecek.', 'SD Kartı Kontrol Et', 'Bu adresin, bu cüzdana ait olduğunu kontrol et?', 'Eşleşmeyen %d adres kontrol edildi.', 'SD kart kontrol ediliyor..', 'Kurcalama Kontrol Kodunu Onayla', 'QR Kodu Oluştur', 'Metinden QR kodu oluşturulsun mu?', 'Oluşturuldu:', 'Mevcut Kurcalama Kontrol Kodu', 'Özel QR Kodu', 'Özelleştir', 'Cüzdanınızı özelleştirmek yeni bir Anahtar oluşturacaktır.', 'Kesim Derinliği', 'Kesim Yöntemi', 'Ondalık', 'Şifre çözülsün mü?', 'Varsayılan Cüzdan', 'Geçiş Başına Derinlik', 'BIP85 entropisi türetilsin mi?', 'Tanımlayıcı Adresler', 'Ekran', 'Kapatmayın, tamamlanması biraz zaman alabilir.', 'Tamamlandı mı?', 'Çifte anımsatıcı', 'Sürücü', 'Boş', 'Krux uygulamalarını etkinleştir', 'Şifrelenmiş', 'Şifrelenmiş QR Kodu', 'Şifrelenmiş mnemonic depolanmadı', 'Şifrelenmiş mnemonic ID ile depolandı:', 'Şifreleme', 'Şifreleme Modu', '%d BIP-39 kelime girin.', '6+ karakterlik bir Kurcalama Kontrol Kodu girin', "BIP-39 mnemonic'inizin her kelimesini 1'den 2048'e kadar bir sayı olarak girin.", "BIP-39 mnemonic'inizin her kelimesini 1'den 800'e kadar onaltılık bir sayı olarak girin.", "BIP-39 mnemonic'inizin her kelimesini 1'den 4000'e kadar sekizlik bir sayı olarak girin.", "BIP-39 mnemonic'inizin her kelimesini girin.", 'Kullanıcı Verilerini Sil', 'Kullanıcının verileri siliniyor..', 'Hata:', 'Çıkış', 'İmzalı bir Krux uygulaması çalıştırılsın mı?', 'Dosyaları ara?', 'SD karta aktarılıyor..', 'Genişletilmiş Public Key', 'Fabrika Ayarları', 'Şifre çözme başarısız', 'PSBT yükleme başarısız', 'Adres yükleme başarısız', 'Anahtar yükleme başarısız', 'Mesaj yükleme başarısız', 'Mnemonic yükleme başarısız', 'Çıktı tanımlayıcısı yüklemesi başarısız', 'Parola yükleme başarısız', 'Mnemonic depolama başarısız', 'Ücret:', 'Besleme Hızı', 'Dosya adı', '%s dosya adı SD kartta var, üzerine yazılsın mı?', "Flash'ı kameradan gelen entropi ile doldur?", 'Flash Dolduruluyor', "PSBT'de parmak izi ayarı kaldırıldı", 'Donanım yazılımı maksimum boyutu aşıyor: %d', 'Flash Haritası', 'Flash Araçları', 'Flash kamera entropisi ile dolduruldu', 'X Koordinatları Tersine Çevrildi', 'Flute Çapı', 'Boş:', 'Depolamadan Seç', 'Verilerin geri kullanılamaz olduğundan emin olmak için SD kartınızı başka bir cihazda tamamen silin', 'Mnemonic Oluştur', "Bu mnemonic'e özel bir ID verilsin mi? Aksi takdirde mevcut parmak izi kullanılacaktır", 'Seç', 'Yeterli entropi', 'Donanım', 'Hex Public Key', 'Onaltılık', "Mnemonic'leri Gizle", 'Yüksek ücret!', 'ID zaten var', 'Dizin', 'Dizin: %s', 'Girişler (%d):', 'Yükle?', 'Yetersiz Entropi!', 'Yetersiz entropi', 'Geçersiz Kurcalama Kontrol Kodu', 'Geçersiz adres', 'Geçersiz önyükleyici', 'Geçersiz mnemonic uzunluğu', 'Geçersiz public key', 'Geçersiz cüzdan:', 'Ters Çevir', 'Ters Renkler', 'Anahtar', 'Anahtar sağlanmadı', "Krux Yazıcı Test QR'ı", 'LCD Tipi', 'Dil', "Krux'un geçerli bir son kelime seçmesini istiyorsanız boş bırakın", 'Sol', 'Uzunluk: %s', 'Satır Gecikmesi', 'Satır:', 'Krux uygulamasını yükle', 'Mnemonic Yükle', 'Cüzdan Yükle', 'Adresleri görüntülemek için güvenilir bir cüzdan tanımlayıcısı yüklensin mi?', 'SD karttan yükle', 'SD karttan yüklensin mi?', 'Kameradan yükle', 'Bir tane mi yüklensin?', 'Yüklensin mi?', 'Kamera Yükleniyor..', 'Para üstü adresler yükleniyor..', 'Yazıcı yükleniyor..', 'Alım adresler yükleniyor..', 'Yükleniyor..', 'Yerel', 'Konum', 'Maksimum uzunluk aşıldı (%s)', 'Mesaj', 'Mesaj:', 'İmza dosyası eksik', 'Mnemonic', 'Mnemonic ID', 'Mnemonik ve parola tutulacaktır.', 'Mnemonic şifrelenmedi', 'Değiştirildi:', 'Çoklu imza', 'Yerel Segwit - 84 varsayılacaktır', 'Ağ', 'Yeni Mnemonic', 'Yeni donanım yazılımı tespit edildi.', 'Hayır', 'Parola Yok', 'Yeterli zar atışı yok!', 'Numaralar', 'Sekizlik', 'Diğer Formatlar', 'PBKDF2 Yinelemesi', 'İşaretlenmiş noktaları siyaha boyayın ki tespit edilebilsinler.', 'Kağıt Genişliği', 'Parça', 'Parça Boyutu', 'Parola', 'Parola Uzunluğu', 'Yol uyuşmazlığı', 'Örüntü algılandı!', "Tüm depolanmış ve şifrelenmiş mnemonic'ler ve ayarlar flash'tan kalıcı olarak kaldırılsın mı?", 'Kalıcı Depolama', 'Piksel sapma indeksi:', "Düz Metin QR'ı", 'Lütfen bir cüzdan çıktı tanımlayıcısı yükleyin', 'Dalış Hızı', 'Düşük entropi', 'Düşük entropi tespit edildi!', "Test QR'ını Yazdır", 'Tiny Seed Yazdırılsın mı?', "QR'a Yazdır", "QR'a yazdırılsın mı?", 'Yazdırılsın mı?', 'Yazıcı', 'Yazıcı Sürücüsü ayarlanmadı!', 'Yazdırılıyor..', 'Yine de devam edilsin mi?', 'Devam edilsin mi?', 'İşleniyor..', 'QR Kodu', 'RX Pini', 'Yeniden Başlat', 'Al', 'Adresleri Al', 'Bölge:', '%s kaldırılsın mı?', "Mnemonic'i Kaldır", 'SD Karttan donanım yazılımı dosyaları kaldırılsın mı?', 'Çözünürlüğü Sıfırla', 'Fabrika ayarlarına geri dönüp ve yeniden başlatılsın mı?', 'QR Görüntüleyiciye Dön', 'Taranan verileri gözden geçirin, gerekirse düzenleyin', 'Sağ', 'Bir mnemonic oluşturmak için zarı en az %d kez atın.', 'Zar atış dağılımı:', 'Zar atışları:', 'SD kart', 'SD kart algılanmadı.', "Zar atışlarının SHA256'sı:", "Snapshot'ın SHA256'sı:", 'QR Görüntüsünü SD Karta Kaydet', 'SD karta kaydet', 'SD karta kaydedilsin mi?', 'SD karta kaydedildi', 'Ölçek', 'Adresi Tara', 'BIP39 Parolasını Tara', 'Anahtar QR Kodunu Tara', '1-12 kelimeleri tekrar taranıyor', '13-24 kelimeleri taranıyor', 'Ekran Koruyucu Süresi', 'Betik Türü', 'Güvenlik', 'Kendine-transfer veya Para Üstü (%d):', 'Kendine-transfer:', 'Önce bir kurcalama kontrol kodu ayarlayın', 'Ayarlar', 'Ayarlar dahili olarak flaşta saklanır.', 'Ayarlar SD karta kaydedildi.', 'Shannon Entropisi:', 'Kapat', 'Kapanma Süresi', 'Kapatılıyor..', 'İmzala', 'QR koduna imzala', 'SD karta imzala', 'İmzalansın mı?', 'İmza', 'İmzalı Mesaj', 'İmzalı PSBT', 'İmzalanıyor..', 'Tek-imza', 'Boyut:', 'Bazı kontroller yerine getirilemedi.', 'Harcama (%d):', 'Harcama:', 'İnekler İçin İstatistikler', "Flash'ta Sakla", 'SD Kartta Sakla', 'Modu değiştirmek için kaydırın', 'TC Flash Hash', 'Önyüklemede TC Flash Hash', 'Yakalamak için DOKUN veya GİR', 'TX Pini', 'Kurcalama Kontrol Kodu', 'Kurcalama kontrol kodu başarıyla ayarlandı', 'Kurcalama kontrol kodları eşleşmiyor', 'Metin', "The app will be copied to user's flash ", 'Tema', 'Termal', 'Verilerin geri kullanılamaz olduğundan emin olmak için Cihazı Sil özelliğini kullanın', 'Parlaklığı Değiştir', 'Araçlar', 'Dokunma Eşiği', 'Dokunmatik ekran', 'Daha fazla kez denensin mi?', 'BIP39 parolasını yazın', 'Anahtar Yaz', 'Birim', 'Güncelleme tamamlandı.', 'Siyah bir arka plan yüzeyi kullanın.', 'Yeni bir mnemonic oluşturmak için kameranın entropisini kullanın', 'Kullanılan:', 'Kullanıcı', '%s değeri aralık dışında: [%s, %s]', "Değer %s'nin katı olmalıdır", 'Doğrulanıyor..', 'Sürüm', 'Kamera Aracılığıyla', 'D20 Aracılığıyla', 'D6 Aracılığıyla', 'Manuel Giriş Aracılığıyla', 'Sözcüklerle', 'Yakalamanın tamamlanmasını bekleyin', 'Cüzdan', 'Cüzdan Tanımlayıcısı', 'Cüzdan çıktı tanımlayıcısı', 'Cüzdan çıktı tanımlayıcısı yüklendi!', 'Cüzdan çıktı tanımlayıcısı bulunamadı.', 'Uyarı:', 'Kelime %d', 'Kelime Numaraları', 'Kelimeler', 'Evet', 'geçerli bir adres!', 'ilk %d adreste BULUNAMADI'] +translation_array = [ + "tutarın %'si.", + "%d / %d çoklu imza", + "%d to %d", + "%s kaldırıldı.", + "(toplam %d)", + "(Deneysel)", + "(sadece izle)", + "12 kelime", + "24 kelime", + "Hakkında", + "Varsayım kabul edilsin mi?", + "Hesap", + "#0 numaralı hesap varsayılacaktır", + "Hesap Endeksi", + "Cüzdan parolası eklensin mi veya değiştirilsin mi?", + "AES-CBC modu için kameradan ek entropi gereklidir", + "Adres", + "Kamerayı ve yedek plakay'ı düzgün bir şekilde hizalayın.", + "Önce ayarlarda izin ver!", + "Parlama önleyici devre dışı", + "Parlama önleyici etkin", + "Görünüm", + "Emin misiniz?", + "BGR Renkleri", + "BIP39 Anımsatıcı", + "Geri", + "Menüye Dön", + "Yedek Mnemonic", + "Geçersiz imza", + "Base64 Parola", + "Baud Hızı", + "İkili Izgara", + "Kenarlık Dolgusu", + "Parlaklık", + "Butonlar", + "Buton Geri-sekmesi", + "Yakalama iptal edildi", + "Para Üstü", + "Para Üstü Adresleri", + "Temayı değiştir ve yeniden başlat?", + "Para Üstü:", + "Değişiklikler kapanışa kadar devam edecek.", + "SD Kartı Kontrol Et", + "Bu adresin, bu cüzdana ait olduğunu kontrol et?", + "Eşleşmeyen %d adres kontrol edildi.", + "SD kart kontrol ediliyor..", + "Kurcalama Kontrol Kodunu Onayla", + "QR Kodu Oluştur", + "Metinden QR kodu oluşturulsun mu?", + "Oluşturuldu:", + "Mevcut Kurcalama Kontrol Kodu", + "Özel QR Kodu", + "Özelleştir", + "Cüzdanınızı özelleştirmek yeni bir Anahtar oluşturacaktır.", + "Kesim Derinliği", + "Kesim Yöntemi", + "Ondalık", + "Şifre çözülsün mü?", + "Varsayılan Cüzdan", + "Geçiş Başına Derinlik", + "BIP85 entropisi türetilsin mi?", + "Tanımlayıcı Adresler", + "Ekran", + "Kapatmayın, tamamlanması biraz zaman alabilir.", + "Tamamlandı mı?", + "Çifte anımsatıcı", + "Sürücü", + "Boş", + "Krux uygulamalarını etkinleştir", + "Şifrelenmiş", + "Şifrelenmiş QR Kodu", + "Şifrelenmiş mnemonic depolanmadı", + "Şifrelenmiş mnemonic ID ile depolandı:", + "Şifreleme", + "Şifreleme Modu", + "%d BIP-39 kelime girin.", + "6+ karakterlik bir Kurcalama Kontrol Kodu girin", + "BIP-39 mnemonic'inizin her kelimesini 1'den 2048'e kadar bir sayı olarak girin.", + "BIP-39 mnemonic'inizin her kelimesini 1'den 800'e kadar onaltılık bir sayı olarak girin.", + "BIP-39 mnemonic'inizin her kelimesini 1'den 4000'e kadar sekizlik bir sayı olarak girin.", + "BIP-39 mnemonic'inizin her kelimesini girin.", + "Kullanıcı Verilerini Sil", + "Kullanıcının verileri siliniyor..", + "Hata:", + "Çıkış", + "İmzalı bir Krux uygulaması çalıştırılsın mı?", + "Dosyaları ara?", + "SD karta aktarılıyor..", + "Genişletilmiş Public Key", + "Fabrika Ayarları", + "Şifre çözme başarısız", + "PSBT yükleme başarısız", + "Adres yükleme başarısız", + "Anahtar yükleme başarısız", + "Mesaj yükleme başarısız", + "Mnemonic yükleme başarısız", + "Çıktı tanımlayıcısı yüklemesi başarısız", + "Parola yükleme başarısız", + "Mnemonic depolama başarısız", + "Ücret:", + "Besleme Hızı", + "Dosya adı", + "%s dosya adı SD kartta var, üzerine yazılsın mı?", + "Flash'ı kameradan gelen entropi ile doldur?", + "Flash Dolduruluyor", + "PSBT'de parmak izi ayarı kaldırıldı", + "Donanım yazılımı maksimum boyutu aşıyor: %d", + "Flash Haritası", + "Flash Araçları", + "Flash kamera entropisi ile dolduruldu", + "X Koordinatları Tersine Çevrildi", + "Flute Çapı", + "Boş:", + "Depolamadan Seç", + "Verilerin geri kullanılamaz olduğundan emin olmak için SD kartınızı başka bir cihazda tamamen silin", + "Mnemonic Oluştur", + "Bu mnemonic'e özel bir ID verilsin mi? Aksi takdirde mevcut parmak izi kullanılacaktır", + "Seç", + "Yeterli entropi", + "Donanım", + "Hex Public Key", + "Onaltılık", + "Mnemonic'leri Gizle", + "Yüksek ücret!", + "ID zaten var", + "Dizin", + "Dizin: %s", + "Girişler (%d):", + "Yükle?", + "Yetersiz Entropi!", + "Yetersiz entropi", + "Geçersiz Kurcalama Kontrol Kodu", + "Geçersiz adres", + "Geçersiz önyükleyici", + "Geçersiz mnemonic uzunluğu", + "Geçersiz public key", + "Geçersiz cüzdan:", + "Ters Çevir", + "Ters Renkler", + "Anahtar", + "Anahtar sağlanmadı", + "Krux Yazıcı Test QR'ı", + "LCD Tipi", + "Dil", + "Krux'un geçerli bir son kelime seçmesini istiyorsanız boş bırakın", + "Sol", + "Uzunluk: %s", + "Satır Gecikmesi", + "Satır:", + "Krux uygulamasını yükle", + "Mnemonic Yükle", + "Cüzdan Yükle", + "Adresleri görüntülemek için güvenilir bir cüzdan tanımlayıcısı yüklensin mi?", + "SD karttan yükle", + "SD karttan yüklensin mi?", + "Kameradan yükle", + "Bir tane mi yüklensin?", + "Yüklensin mi?", + "Kamera Yükleniyor..", + "Para üstü adresler yükleniyor..", + "Yazıcı yükleniyor..", + "Alım adresler yükleniyor..", + "Yükleniyor..", + "Yerel", + "Konum", + "Maksimum uzunluk aşıldı (%s)", + "Mesaj", + "Mesaj:", + "İmza dosyası eksik", + "Mnemonic", + "Mnemonic ID", + "Mnemonik ve parola tutulacaktır.", + "Mnemonic şifrelenmedi", + "Değiştirildi:", + "Çoklu imza", + "Yerel Segwit - 84 varsayılacaktır", + "Ağ", + "Yeni Mnemonic", + "Yeni donanım yazılımı tespit edildi.", + "Hayır", + "Parola Yok", + "Yeterli zar atışı yok!", + "Numaralar", + "Sekizlik", + "Diğer Formatlar", + "PBKDF2 Yinelemesi", + "İşaretlenmiş noktaları siyaha boyayın ki tespit edilebilsinler.", + "Kağıt Genişliği", + "Parça", + "Parça Boyutu", + "Parola", + "Parola Uzunluğu", + "Yol uyuşmazlığı", + "Örüntü algılandı!", + "Tüm depolanmış ve şifrelenmiş mnemonic'ler ve ayarlar flash'tan kalıcı olarak kaldırılsın mı?", + "Kalıcı Depolama", + "Piksel sapma indeksi:", + "Düz Metin QR'ı", + "Lütfen bir cüzdan çıktı tanımlayıcısı yükleyin", + "Dalış Hızı", + "Düşük entropi", + "Düşük entropi tespit edildi!", + "Test QR'ını Yazdır", + "Tiny Seed Yazdırılsın mı?", + "QR'a Yazdır", + "QR'a yazdırılsın mı?", + "Yazdırılsın mı?", + "Yazıcı", + "Yazıcı Sürücüsü ayarlanmadı!", + "Yazdırılıyor..", + "Yine de devam edilsin mi?", + "Devam edilsin mi?", + "İşleniyor..", + "QR Kodu", + "RX Pini", + "Yeniden Başlat", + "Al", + "Adresleri Al", + "Bölge:", + "%s kaldırılsın mı?", + "Mnemonic'i Kaldır", + "SD Karttan donanım yazılımı dosyaları kaldırılsın mı?", + "Çözünürlüğü Sıfırla", + "Fabrika ayarlarına geri dönüp ve yeniden başlatılsın mı?", + "QR Görüntüleyiciye Dön", + "Taranan verileri gözden geçirin, gerekirse düzenleyin", + "Sağ", + "Bir mnemonic oluşturmak için zarı en az %d kez atın.", + "Zar atış dağılımı:", + "Zar atışları:", + "SD kart", + "SD kart algılanmadı.", + "Zar atışlarının SHA256'sı:", + "Snapshot'ın SHA256'sı:", + "QR Görüntüsünü SD Karta Kaydet", + "SD karta kaydet", + "SD karta kaydedilsin mi?", + "SD karta kaydedildi", + "Ölçek", + "Adresi Tara", + "BIP39 Parolasını Tara", + "Anahtar QR Kodunu Tara", + "1-12 kelimeleri tekrar taranıyor", + "13-24 kelimeleri taranıyor", + "Ekran Koruyucu Süresi", + "Betik Türü", + "Güvenlik", + "Kendine-transfer veya Para Üstü (%d):", + "Kendine-transfer:", + "Önce bir kurcalama kontrol kodu ayarlayın", + "Ayarlar", + "Ayarlar dahili olarak flaşta saklanır.", + "Ayarlar SD karta kaydedildi.", + "Shannon Entropisi:", + "Kapat", + "Kapanma Süresi", + "Kapatılıyor..", + "İmzala", + "QR koduna imzala", + "SD karta imzala", + "İmzalansın mı?", + "İmza", + "İmzalı Mesaj", + "İmzalı PSBT", + "İmzalanıyor..", + "Tek-imza", + "Boyut:", + "Bazı kontroller yerine getirilemedi.", + "Harcama (%d):", + "Harcama:", + "İnekler İçin İstatistikler", + "Flash'ta Sakla", + "SD Kartta Sakla", + "Modu değiştirmek için kaydırın", + "TC Flash Hash", + "Önyüklemede TC Flash Hash", + "Yakalamak için DOKUN veya GİR", + "TX Pini", + "Kurcalama Kontrol Kodu", + "Kurcalama kontrol kodu başarıyla ayarlandı", + "Kurcalama kontrol kodları eşleşmiyor", + "Metin", + "The app will be copied to user's flash ", + "Tema", + "Termal", + "Verilerin geri kullanılamaz olduğundan emin olmak için Cihazı Sil özelliğini kullanın", + "Parlaklığı Değiştir", + "Araçlar", + "Dokunma Eşiği", + "Dokunmatik ekran", + "Daha fazla kez denensin mi?", + "BIP39 parolasını yazın", + "Anahtar Yaz", + "Birim", + "Güncelleme tamamlandı.", + "Siyah bir arka plan yüzeyi kullanın.", + "Yeni bir mnemonic oluşturmak için kameranın entropisini kullanın", + "Kullanılan:", + "Kullanıcı", + "%s değeri aralık dışında: [%s, %s]", + "Değer %s'nin katı olmalıdır", + "Doğrulanıyor..", + "Sürüm", + "Kamera Aracılığıyla", + "D20 Aracılığıyla", + "D6 Aracılığıyla", + "Manuel Giriş Aracılığıyla", + "Sözcüklerle", + "Yakalamanın tamamlanmasını bekleyin", + "Cüzdan", + "Cüzdan Tanımlayıcısı", + "Cüzdan çıktı tanımlayıcısı", + "Cüzdan çıktı tanımlayıcısı yüklendi!", + "Cüzdan çıktı tanımlayıcısı bulunamadı.", + "Uyarı:", + "Kelime %d", + "Kelime Numaraları", + "Kelimeler", + "Evet", + "geçerli bir adres!", + "ilk %d adreste BULUNAMADI", +] diff --git a/src/krux/translations/vi.py b/src/krux/translations/vi.py index 9ab9d6cad..1f93aee07 100644 --- a/src/krux/translations/vi.py +++ b/src/krux/translations/vi.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['% của số tiền.', '%d của %d đa chữ kí', '%d đến %d', '%s Đã bỏ.', '(tổng cộng %d)', '(Thực nghiệm)', '(chỉ xem)', '12 từ', '24 từ', 'Về chúng tôi', 'Chấp nhận giả định?', 'Tài khoản', 'Tài khoản #0 sẽ được giả định', 'Chỉ mục tài khoản', 'Thêm hoặc thay đổi cụm mật khẩu ví?', 'Cần thêm entropy từ camera cho chế độ AES-CBC', 'Địa chỉ', 'Căn chỉnh camera và tấm dự phòng đúng cách.', 'Cho phép cài đặt trước!', 'Chống lóa bị vô hiệu hóa', 'Đã bật chống lóa', 'Giao diện', 'Bạn có chắc không?', 'Màu BGR', 'Từ gợi nhớ BIP39', 'Trở lại', 'Quay lại Menu', 'Sao lưu Mnemonic', 'Chữ ký xấu', 'Mật khẩu Base64', 'Tốc độ baud', 'Lưới nhị phân', 'Đệm viền', 'Độ sáng', 'Nút', 'Loại bỏ nhiễu nút', 'Hủy chụp hình', 'Thay đổi', 'Các địa chỉ tiền thối', 'Thay đổi giao diện và khởi động lại?', 'Thay đổi:', 'Thay đổi sẽ kéo dài cho đến khi tắt máy.', 'Kiểm tra thẻ SD', 'Kiểm tra địa chỉ đó có thuộc về ví này không?', 'Đã kiểm tra %d địa chỉ không khớp.', 'Kiểm tra thẻ SD..', 'Xác nhận mã kiểm tra giả mạo', 'Tạo mã QR', 'Tạo mã QR từ văn bản?', 'Tạo:', 'Mã kiểm tra giả mạo hiện tại', 'Mã QR tùy chỉnh', 'Tùy chỉnh', 'Tùy chỉnh ví của bạn sẽ tạo một Khóa mới.', 'Chiều sâu cắt', 'Phương pháp cắt', 'Số thập phân', 'Giải mã?', 'Ví mặc định', 'Độ sâu mỗi lần cắt CNC', 'Suy ra entropy BIP85?', 'Địa chỉ người mô tả', 'Hiển thị', 'Không được tắt máy, có thể mất một lúc để hoàn thành.', 'Hoàn tất?', 'Từ gợi nhớ kép', 'Driver', 'Trống', 'Bật ứng dụng Krux', 'Đã mã hóa', 'Mã QR được mã hóa', 'Mnemonic được mã hóa không được lưu trữ', 'Mnemonic được mã hóa không được lưu trữ với ID:', 'Mã hóa', 'Chế độ mã hóa', 'Nhập %d từ BIP-39.', 'Nhập mã kiểm tra giả mạo gồm hơn 6 ký tự', 'Nhập từng từ của Mnemonic BIP-39 của bạn dưới dạng số từ 1 đến 2048.', 'Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số thập lục phân từ 1 đến 800.', 'Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số bát phân từ 1 đến 4000.', 'Nhập từng từ của Mnemonic BIP-39 của bạn.', 'Xóa dữ liệu của người dùng', 'Đang xóa dữ liệu của người dùng..', 'Lỗi:', 'Esc', 'Thực thi một ứng dụng Krux đã ký?', 'Khám phá các tập tin?', 'Xuất vào thẻ SD ..', 'Khóa công cộng', 'Cài đặt Gốc', 'Không giải mã được', 'Tải PSBT thất bại', 'Tải địa chỉ thất bại', 'Không tải được khóa', 'Không tải được tin nhắn', 'Tải mã Mnemonic thất bại', 'Không tải được bộ mô tả đầu ra', 'Không tải được cụm mật khẩu', 'Không lưu trữ Mnemonic được', 'Phí:', 'Tốc độ cắt CNC', 'Tên tệp', 'Tên tệp %s tồn tại trên thẻ SD, ghi đè lên?', 'Điền vào flash với entropy từ máy ảnh?', 'Đèn Flash Đổ Đầy', 'Bỏ dấu vân tay trong PSBT', 'Phần mềm vượt quá kích thước tối đa: %d', 'Bản đồ Flash', 'Công cụ Flash', 'Đèn flash chứa đầy entropy của máy ảnh', 'Tọa độ X bị lật', 'Đường kính mũi cắt CNC', 'Khả dụng:', 'Từ bộ lưu trữ', 'Xóa hoàn toàn thẻ SD trong một thiết bị khác để đảm bảo dữ liệu không thể phục hồi', 'Tạo Mnemonic', 'Cung cấp cho Mnemonic này một ID tùy chỉnh? Nếu không thì fingerprint hiện tại sẽ được sử dụng', 'Chọn', 'Entropy tốt', 'Phần cứng', 'Khóa công cộng Hex', 'Thập lục phân', 'Ẩn Mnemonics', 'Phí cao!', 'Id đã tồn tại', 'Chỉ mục', 'Chỉ mục: %s', 'Đầu vào (%d):', 'Cài đặt phần mềm?', 'Entropy không đủ!', 'Không đủ entropy', 'Mã kiểm tra giả mạo không hợp lệ', 'Địa chỉ không hợp lệ', 'Bộ tải khởi động không hợp lệ', 'Độ dài mã Mnemonic không hợp lệ', 'Khóa công cộng không hợp lệ', 'Ví không hợp lệ:', 'Đảo ngược', 'Màu đảo ngược', 'Chìa khóa', 'Khóa không được cung cấp', 'QR kiểm tra máy in Krux', 'Loại LCD', 'Ngôn ngữ', 'Để trống nếu bạn muốn Krux chọn một từ cuối cùng hợp lệ', 'Trái', 'Độ dài: %s', 'Độ trễ Dòng', 'Đường kẻ:', 'Tải ứng dụng Krux', 'Tải mã mnemonic', 'Nạp Ví', 'Tải mô tả ví đáng tin cậy để xem địa chỉ?', 'Tải từ thẻ SD', 'Tải từ thẻ SD?', 'Tải từ máy ảnh', 'Tải một?', 'Tải?', 'Đang tải máy ảnh..', 'Đang tải địa chỉ tiền thối..', 'Đang tải máy in ..', 'Đang tải địa chỉ nhận..', 'Đang tải..', 'Ngôn ngữ', 'Vị trí lưu', 'Chiều dài tối đa vượt quá (%s)', 'Tin nhắn', 'Tin nhắn:', 'Thiếu tập tin chữ ký', 'Mã mnemonic', 'Mnemonic ID ', 'Từ gợi nhớ và cụm mật khẩu sẽ được lưu giữ.', 'Mnemonic không được mã hóa', 'Đã sửa đổi:', 'Đa chữ kí', 'Native Segwit - 84 sẽ được giả định', 'Mạng lưới', 'Mnemonic mới', 'Phát hiện phần sụn mới.', 'Không', 'Không có cụm mật khẩu', 'Không đủ số lần quay!', 'Số', 'Bát phân', 'Các định dạng khác', 'Lặp lại PBKDF2', 'Tô các chấm đục lỗ màu đen để chúng có thể được phát hiện.', 'Chiều rộng giấy', 'Phần', 'Kích thước một phần', 'Cụm mật khẩu', 'Độ dài mật khẩu tối thiểu:', 'Đường dẫn không khớp', 'Đã phát hiện mẫu!', 'Xóa vĩnh viễn mọi Mnemonics và cài đặt được mã hóa lưu trữ trong flash?', 'Vị trí lưu', 'Chỉ số độ lệch điểm ảnh:', 'QR dạng văn bản', 'Vui lòng tải bộ mô tả đầu ra ví', 'Tỷ lệ sụt giảm', 'Entropy kém', 'Phát hiện entropy yếu!', 'In kiểm tra QR', 'In Tiny Seed?', 'In ra QR', 'In ra mã QR?', 'In?', 'Máy in', 'Trình điều khiển máy in chưa được cài đặt!', 'Đang in..', 'Vẫn tiếp tục?', 'Thực hiện?', 'Đang xử lý..', 'Mã QR', 'RX Pin', 'Khởi động lại', 'Nhận được', 'Các địa chỉ nhận', 'Vùng:', 'Xóa %s?', 'Xóa Mnemonic', 'Xóa các tệp firmware khỏi Thẻ SD?', 'Độ phân giải - Định dạng', 'Khôi phục cài đặt gốc và khởi động lại?', 'Quay lại Trình xem QR', 'Xem lại dữ liệu đã quét, chỉnh sửa nếu cần', 'Phải', 'Lăn xúc xắc ít nhất %d lần để tạo Mnemonic.', 'Phân bổ xúc xắc:', 'Tổng số lần quay xúc xắc:', 'Thẻ SD', 'Thẻ SD không được phát hiện.', 'SHA256 của xúc xắc:', 'Sha256 của ảnh chụp:', 'Lưu Ảnh QR vào Thẻ SD', 'Lưu vào thẻ SD', 'Lưu vào thẻ SD?', 'Đã lưu vào thẻ SD', 'Tỉ lệ', 'Quét địa chỉ', 'Quét cụm mật khẩu BIP39', 'Quét mã QR khóa', 'Đang quét lại từ 1-12', 'Đang quét từ 13-24', 'Thời gian chế độ bảo vệ màn hình', 'Kiểu văn lệnh', 'Bảo mật', 'Tự chuyển nhượng hoặc giao dịch (%d):', 'Tự chuyển nhượng:', 'Đặt mã kiểm tra giả mạo trước', 'Cài đặt', 'Cài đặt được lưu trữ nội bộ trên đèn flash.', 'Cài đặt được lưu trên thẻ SD.', 'Entropy của Shannon:', 'Tắt máy', 'Thời gian tắt máy', 'Đang tắt..', 'Chữ kí', 'Ký vào mã QR', 'Ký vào thẻ SD', 'Kí?', 'Chữ ký', 'Tin nhắn đã ký', 'Đã ký PSBT', 'Đang ký..', 'Khóa đơn', 'Dung lượng:', 'Một số kiểm tra không thể được thực hiện.', 'Chi tiêu (%d):', 'Chi tiêu:', 'Số liệu thống kê cho Mọt sách', 'Lưu trữ trên flash', 'Lưu trữ trên thẻ SD', 'Vuốt để thay đổi chế độ', 'TC Flash Hash', 'Hash Flash TC khi khởi động', 'Chạm màn hình hoặc nhấn nút ENTER để chụp', 'TX Pin', 'Mã kiểm tra giả mạo', 'Đã đặt mã kiểm tra giả mạo thành công', 'Mã kiểm tra giả mạo không khớp', 'Chữ', "The app will be copied to user's flash ", 'Chủ đề', 'Nhiệt', 'Sử dụng tính năng Xóa dữ liệu trên thiết bị để đảm bảo dữ liệu không thể phục hồi', 'Chuyển đổi độ sáng', 'Công cụ', 'Ngưỡng cảm ứng', 'Màn hình cảm ứng', 'Thử thêm nữa?', 'Nhập cụm mật khẩu BIP39', 'Nhập khóa', 'Đơn vị', 'Nâng cấp hoàn tất.', 'Sử dụng bề mặt nền đen.', 'Sử dụng sự ngẫu nhiên của máy ảnh để tạo ra một Mnemonic mới', 'Đã sử dụng:', 'Người dùng', 'Giá trị %s ngoài phạm vi: [ %s, %s]', 'Giá trị phải là bội của %s', 'Đang xác minh..', 'Phiên Bản', 'Qua máy ảnh', 'Qua xúc xắc 20 mặt', 'Qua xúc xắc 6 mặt', 'Thông qua đầu vào thủ công', 'Thông qua từ ngữ', 'Chờ bắt', 'Ví', 'Trình mô tả ví', 'Ví đầu ra mô tả', 'Đã tải bộ mô tả đầu ra của ví!', 'Không tìm thấy bộ mô tả đầu ra ví.', 'Cảnh báo:', 'Kí tự %d', 'Từ số', 'Từ ngữ', 'Đúng', 'là một địa chỉ hợp lệ!', 'kHÔNG TÌM THẤY trong %d địa chỉ đầu tiên'] +translation_array = [ + "% của số tiền.", + "%d của %d đa chữ kí", + "%d đến %d", + "%s Đã bỏ.", + "(tổng cộng %d)", + "(Thực nghiệm)", + "(chỉ xem)", + "12 từ", + "24 từ", + "Về chúng tôi", + "Chấp nhận giả định?", + "Tài khoản", + "Tài khoản #0 sẽ được giả định", + "Chỉ mục tài khoản", + "Thêm hoặc thay đổi cụm mật khẩu ví?", + "Cần thêm entropy từ camera cho chế độ AES-CBC", + "Địa chỉ", + "Căn chỉnh camera và tấm dự phòng đúng cách.", + "Cho phép cài đặt trước!", + "Chống lóa bị vô hiệu hóa", + "Đã bật chống lóa", + "Giao diện", + "Bạn có chắc không?", + "Màu BGR", + "Từ gợi nhớ BIP39", + "Trở lại", + "Quay lại Menu", + "Sao lưu Mnemonic", + "Chữ ký xấu", + "Mật khẩu Base64", + "Tốc độ baud", + "Lưới nhị phân", + "Đệm viền", + "Độ sáng", + "Nút", + "Loại bỏ nhiễu nút", + "Hủy chụp hình", + "Thay đổi", + "Các địa chỉ tiền thối", + "Thay đổi giao diện và khởi động lại?", + "Thay đổi:", + "Thay đổi sẽ kéo dài cho đến khi tắt máy.", + "Kiểm tra thẻ SD", + "Kiểm tra địa chỉ đó có thuộc về ví này không?", + "Đã kiểm tra %d địa chỉ không khớp.", + "Kiểm tra thẻ SD..", + "Xác nhận mã kiểm tra giả mạo", + "Tạo mã QR", + "Tạo mã QR từ văn bản?", + "Tạo:", + "Mã kiểm tra giả mạo hiện tại", + "Mã QR tùy chỉnh", + "Tùy chỉnh", + "Tùy chỉnh ví của bạn sẽ tạo một Khóa mới.", + "Chiều sâu cắt", + "Phương pháp cắt", + "Số thập phân", + "Giải mã?", + "Ví mặc định", + "Độ sâu mỗi lần cắt CNC", + "Suy ra entropy BIP85?", + "Địa chỉ người mô tả", + "Hiển thị", + "Không được tắt máy, có thể mất một lúc để hoàn thành.", + "Hoàn tất?", + "Từ gợi nhớ kép", + "Driver", + "Trống", + "Bật ứng dụng Krux", + "Đã mã hóa", + "Mã QR được mã hóa", + "Mnemonic được mã hóa không được lưu trữ", + "Mnemonic được mã hóa không được lưu trữ với ID:", + "Mã hóa", + "Chế độ mã hóa", + "Nhập %d từ BIP-39.", + "Nhập mã kiểm tra giả mạo gồm hơn 6 ký tự", + "Nhập từng từ của Mnemonic BIP-39 của bạn dưới dạng số từ 1 đến 2048.", + "Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số thập lục phân từ 1 đến 800.", + "Nhập từng từ trong Mnemonic BIP-39 của bạn dưới dạng số bát phân từ 1 đến 4000.", + "Nhập từng từ của Mnemonic BIP-39 của bạn.", + "Xóa dữ liệu của người dùng", + "Đang xóa dữ liệu của người dùng..", + "Lỗi:", + "Esc", + "Thực thi một ứng dụng Krux đã ký?", + "Khám phá các tập tin?", + "Xuất vào thẻ SD ..", + "Khóa công cộng", + "Cài đặt Gốc", + "Không giải mã được", + "Tải PSBT thất bại", + "Tải địa chỉ thất bại", + "Không tải được khóa", + "Không tải được tin nhắn", + "Tải mã Mnemonic thất bại", + "Không tải được bộ mô tả đầu ra", + "Không tải được cụm mật khẩu", + "Không lưu trữ Mnemonic được", + "Phí:", + "Tốc độ cắt CNC", + "Tên tệp", + "Tên tệp %s tồn tại trên thẻ SD, ghi đè lên?", + "Điền vào flash với entropy từ máy ảnh?", + "Đèn Flash Đổ Đầy", + "Bỏ dấu vân tay trong PSBT", + "Phần mềm vượt quá kích thước tối đa: %d", + "Bản đồ Flash", + "Công cụ Flash", + "Đèn flash chứa đầy entropy của máy ảnh", + "Tọa độ X bị lật", + "Đường kính mũi cắt CNC", + "Khả dụng:", + "Từ bộ lưu trữ", + "Xóa hoàn toàn thẻ SD trong một thiết bị khác để đảm bảo dữ liệu không thể phục hồi", + "Tạo Mnemonic", + "Cung cấp cho Mnemonic này một ID tùy chỉnh? Nếu không thì fingerprint hiện tại sẽ được sử dụng", + "Chọn", + "Entropy tốt", + "Phần cứng", + "Khóa công cộng Hex", + "Thập lục phân", + "Ẩn Mnemonics", + "Phí cao!", + "Id đã tồn tại", + "Chỉ mục", + "Chỉ mục: %s", + "Đầu vào (%d):", + "Cài đặt phần mềm?", + "Entropy không đủ!", + "Không đủ entropy", + "Mã kiểm tra giả mạo không hợp lệ", + "Địa chỉ không hợp lệ", + "Bộ tải khởi động không hợp lệ", + "Độ dài mã Mnemonic không hợp lệ", + "Khóa công cộng không hợp lệ", + "Ví không hợp lệ:", + "Đảo ngược", + "Màu đảo ngược", + "Chìa khóa", + "Khóa không được cung cấp", + "QR kiểm tra máy in Krux", + "Loại LCD", + "Ngôn ngữ", + "Để trống nếu bạn muốn Krux chọn một từ cuối cùng hợp lệ", + "Trái", + "Độ dài: %s", + "Độ trễ Dòng", + "Đường kẻ:", + "Tải ứng dụng Krux", + "Tải mã mnemonic", + "Nạp Ví", + "Tải mô tả ví đáng tin cậy để xem địa chỉ?", + "Tải từ thẻ SD", + "Tải từ thẻ SD?", + "Tải từ máy ảnh", + "Tải một?", + "Tải?", + "Đang tải máy ảnh..", + "Đang tải địa chỉ tiền thối..", + "Đang tải máy in ..", + "Đang tải địa chỉ nhận..", + "Đang tải..", + "Ngôn ngữ", + "Vị trí lưu", + "Chiều dài tối đa vượt quá (%s)", + "Tin nhắn", + "Tin nhắn:", + "Thiếu tập tin chữ ký", + "Mã mnemonic", + "Mnemonic ID ", + "Từ gợi nhớ và cụm mật khẩu sẽ được lưu giữ.", + "Mnemonic không được mã hóa", + "Đã sửa đổi:", + "Đa chữ kí", + "Native Segwit - 84 sẽ được giả định", + "Mạng lưới", + "Mnemonic mới", + "Phát hiện phần sụn mới.", + "Không", + "Không có cụm mật khẩu", + "Không đủ số lần quay!", + "Số", + "Bát phân", + "Các định dạng khác", + "Lặp lại PBKDF2", + "Tô các chấm đục lỗ màu đen để chúng có thể được phát hiện.", + "Chiều rộng giấy", + "Phần", + "Kích thước một phần", + "Cụm mật khẩu", + "Độ dài mật khẩu tối thiểu:", + "Đường dẫn không khớp", + "Đã phát hiện mẫu!", + "Xóa vĩnh viễn mọi Mnemonics và cài đặt được mã hóa lưu trữ trong flash?", + "Vị trí lưu", + "Chỉ số độ lệch điểm ảnh:", + "QR dạng văn bản", + "Vui lòng tải bộ mô tả đầu ra ví", + "Tỷ lệ sụt giảm", + "Entropy kém", + "Phát hiện entropy yếu!", + "In kiểm tra QR", + "In Tiny Seed?", + "In ra QR", + "In ra mã QR?", + "In?", + "Máy in", + "Trình điều khiển máy in chưa được cài đặt!", + "Đang in..", + "Vẫn tiếp tục?", + "Thực hiện?", + "Đang xử lý..", + "Mã QR", + "RX Pin", + "Khởi động lại", + "Nhận được", + "Các địa chỉ nhận", + "Vùng:", + "Xóa %s?", + "Xóa Mnemonic", + "Xóa các tệp firmware khỏi Thẻ SD?", + "Độ phân giải - Định dạng", + "Khôi phục cài đặt gốc và khởi động lại?", + "Quay lại Trình xem QR", + "Xem lại dữ liệu đã quét, chỉnh sửa nếu cần", + "Phải", + "Lăn xúc xắc ít nhất %d lần để tạo Mnemonic.", + "Phân bổ xúc xắc:", + "Tổng số lần quay xúc xắc:", + "Thẻ SD", + "Thẻ SD không được phát hiện.", + "SHA256 của xúc xắc:", + "Sha256 của ảnh chụp:", + "Lưu Ảnh QR vào Thẻ SD", + "Lưu vào thẻ SD", + "Lưu vào thẻ SD?", + "Đã lưu vào thẻ SD", + "Tỉ lệ", + "Quét địa chỉ", + "Quét cụm mật khẩu BIP39", + "Quét mã QR khóa", + "Đang quét lại từ 1-12", + "Đang quét từ 13-24", + "Thời gian chế độ bảo vệ màn hình", + "Kiểu văn lệnh", + "Bảo mật", + "Tự chuyển nhượng hoặc giao dịch (%d):", + "Tự chuyển nhượng:", + "Đặt mã kiểm tra giả mạo trước", + "Cài đặt", + "Cài đặt được lưu trữ nội bộ trên đèn flash.", + "Cài đặt được lưu trên thẻ SD.", + "Entropy của Shannon:", + "Tắt máy", + "Thời gian tắt máy", + "Đang tắt..", + "Chữ kí", + "Ký vào mã QR", + "Ký vào thẻ SD", + "Kí?", + "Chữ ký", + "Tin nhắn đã ký", + "Đã ký PSBT", + "Đang ký..", + "Khóa đơn", + "Dung lượng:", + "Một số kiểm tra không thể được thực hiện.", + "Chi tiêu (%d):", + "Chi tiêu:", + "Số liệu thống kê cho Mọt sách", + "Lưu trữ trên flash", + "Lưu trữ trên thẻ SD", + "Vuốt để thay đổi chế độ", + "TC Flash Hash", + "Hash Flash TC khi khởi động", + "Chạm màn hình hoặc nhấn nút ENTER để chụp", + "TX Pin", + "Mã kiểm tra giả mạo", + "Đã đặt mã kiểm tra giả mạo thành công", + "Mã kiểm tra giả mạo không khớp", + "Chữ", + "The app will be copied to user's flash ", + "Chủ đề", + "Nhiệt", + "Sử dụng tính năng Xóa dữ liệu trên thiết bị để đảm bảo dữ liệu không thể phục hồi", + "Chuyển đổi độ sáng", + "Công cụ", + "Ngưỡng cảm ứng", + "Màn hình cảm ứng", + "Thử thêm nữa?", + "Nhập cụm mật khẩu BIP39", + "Nhập khóa", + "Đơn vị", + "Nâng cấp hoàn tất.", + "Sử dụng bề mặt nền đen.", + "Sử dụng sự ngẫu nhiên của máy ảnh để tạo ra một Mnemonic mới", + "Đã sử dụng:", + "Người dùng", + "Giá trị %s ngoài phạm vi: [ %s, %s]", + "Giá trị phải là bội của %s", + "Đang xác minh..", + "Phiên Bản", + "Qua máy ảnh", + "Qua xúc xắc 20 mặt", + "Qua xúc xắc 6 mặt", + "Thông qua đầu vào thủ công", + "Thông qua từ ngữ", + "Chờ bắt", + "Ví", + "Trình mô tả ví", + "Ví đầu ra mô tả", + "Đã tải bộ mô tả đầu ra của ví!", + "Không tìm thấy bộ mô tả đầu ra ví.", + "Cảnh báo:", + "Kí tự %d", + "Từ số", + "Từ ngữ", + "Đúng", + "là một địa chỉ hợp lệ!", + "kHÔNG TÌM THẤY trong %d địa chỉ đầu tiên", +] diff --git a/src/krux/translations/zh.py b/src/krux/translations/zh.py index 6396160c7..65fdba2b3 100644 --- a/src/krux/translations/zh.py +++ b/src/krux/translations/zh.py @@ -20,4 +20,326 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # pylint: disable=C0301 -translation_array = ['% 的金额。', '%d/%d 多签', '%d到%d', '已移除%s', '(总计 %d)', '(实验性)', '(仅观察)', '12 单词', '24 单词', '关于', '接受假设?', '账户', '将假定为账户 #0', '账户索引', '添加或更改钱包密码?', 'AES-CBC 模式需要相机的额外熵', '地址', '正确对齐摄像头和背板。', '首先在设置中允许!', '防眩光已禁用', '防眩光已启用', '界面', '确定?', 'BGR 颜色', 'BIP39助记符', '返回', '返回菜单', '备份助记词', '签名无效', 'Base64密码', '波特率', '二进制网格', '边框填充', '亮度', '按钮', '按钮去抖动', '截取已取消', '找零', '找零地址', '更改主题并重新启动?', '找零', '更改将在关机前保持。', '检查 SD 卡', '检查该地址是否属于此钱包?', '已检查 %d 个不匹配的地址。', '检查 SD 卡..', '确认防篡改检查码', '创建二维码', '从文本创建二维码?', '已创建:', '当前防篡改检查码', '自定义二维码', '自定义', '自定义您的钱包将生成新私钥。', '切割深度', '切割方法', '十进制', '解密?', '默认钱包', '每次通过的深度', '导出BIP85熵?', '描述符地址', '显示', '请勿断电,可能需要一段时间完成。', '完成了吗?', '双重助记词', '驱动程序', '为空', '启用Krux应用程序', '已加密', '加密二维码', '加密助记词未存储', '加密助记词已存储,ID 为:', '加密', '加密模式', '输入 %d 个 BIP-39 词。', '输入6个以上字符的防篡改检查码', '将 BIP-39 助记词的每个词作为 1 到 2048 的数字输入。', '将 BIP-39 助记词的每个词作为 1 到 800 的十六进制数输入。', '将 BIP-39 助记词的每个词作为 1 到 4000 的八进制数输入。', '输入每个 BIP-39 助记词。', '清除用户数据', '正在擦除用户数据..', '错误:', '退出', '是否执行签名的Krux应用程序?', '浏览文件?', '导出到 SD 卡..', '扩展公钥', '出厂设置', '解密失败', '加载 PSBT 失败', '加载地址失败', '加载密钥失败', '加载消息失败', '加载助记词失败', '加载输出描述符失败', '加载密码失败', '存储助记词失败', '费用:', '进给速度', '文件名', '文件名 %s 存在于 SD 卡上,覆盖?', '用摄像头的熵填充Flash?', '填充Flash', 'PSBT 中未设置指纹', '固件超过最大尺寸:%d', 'Flash地图', 'Flash工具', 'Flash已用摄像头熵填充', '翻转 X 坐标', '刀具直径', '空闲:', '从存储中', '在其他设备中完全擦除您的 SD 卡以确保数据不可恢复', '生成助记词', '为此助记词设置自定义 ID?否则将使用当前指纹', '去', '良好的熵', '硬件', '十六进制公钥', '十六进制', '隐藏助记词', '高费用!', 'ID 已存在', '索引', '索引: %s', '输入 (%d):', '安装?', '熵不足!', '熵不足', '无效的防篡改检查码', '无效地址', '无效的 ootloader ', '助记词长度无效', '无效公钥', '无效钱包:', '反转', '反转颜色', '密钥', '未提供密钥', 'Krux 打印机测试二维码', 'LCD 类型', '语言', '如果希望 Krux 自动计算最后一位 Checksum,请留空', '左', '长度: %s', '行延迟', '行:', '加载Krux应用', '加载助记词', '加载钱包', '加载受信任的钱包描述符以查看地址?', '从 SD 卡加载', '从 SD 卡加载?', '从相机加载', '加载一个?', '加载?', '加载相机..', '加载找零地址..', '加载打印机..', '加载接收地址..', '加载中..', '语言环境', '位置', '超过最大长度(%s)', '消息', '消息:', '缺少签名文件', '助记词', '助记词 ID', '助记词和密码将被保留。', '助记词未加密', '修改时间:', '多签', '假定为原生 Segwit - 84', '网络', '新助记词', '检测到新固件。', '否', '无 Passphrase ', '投掷次数不足!', '数字', '八进制', '其他格式', 'PBKDF2 迭代', '将打孔点涂黑,以便它们能被检测到。', '纸张宽度', '部分', '部件尺寸', 'Passphrase', '密码长度:', '路径不匹配', '检测到模式!', '从 Flash 中永久删除所有存储的加密助记词和设置?', '保存', '像素偏差指数:', '明文二维码', '请加载钱包输出描述符', '下刀速度', '熵值低', '检测到低熵!', '打印测试二维码', '打印 Tiny Seed?', '打印到二维码', '打印到二维码?', '打印?', '打印机', '打印机驱动程序未设置!', '正在打印', '继续吗?', '继续?', '正在处理..', '二维码', 'RX 引脚', '重启', '接收', '接收地址', '区域:', '删除 %s?', '删除助记词', '从 SD 卡中删除固件文件?', '分辨率 - 格式', '恢复出厂设置并重新设备?', '返回二维码查看器', '请检查扫描的数据,如有必要请编辑', '右', '掷骰子至少 %d 次以生成助记词。', '掷骰子分布:', '掷骰子:', 'SD 卡', '未检测到 SD 卡。', '掷骰子的 SHA256:', '快照的 SHA256:', '将二维码图像保存到 SD 卡', '保存到 SD 卡', '保存到 SD 卡?', '保存到 SD 卡', '缩放', '扫描地址', '扫描 BIP39 Passphrase', '扫描私钥二维码', '重新扫扫描第 1-12 个单词', '扫描第 13-24 个单词', '屏保时间', '脚本类型', '安全', '自转或找零 (%d):', '自行转账:', '请先设置防篡改检查码', '设置', '设置存储在 Flash 内部。', '设置存储在SD卡上。', '香农熵:', '关机', '关机时间', '关机中..', '签名', '二维码签名', ' SD 卡签名', '是否签名?', '签名', '签名消息', '已签名 PSBT', '签名中..', '单签', '大小:', '无法执行某些检查。', '花费 (%d):', '花费', '极客统计数据', '存储到 Flash', '存储到 SD 卡', '滑动切换模式', 'TC Flash Hash', '启动时的 TC Flash Hash', '点击或按下 ENTER 截图', 'TX 引脚', '防篡改检查码', '防篡改检查码设置成功', '防篡改检查码不匹配', '文本', "The app will be copied to user's flash ", '主题', '热敏', '要确保数据不可恢复,请使用擦除设备功能', '调整亮度', '工具', '触摸阈值', '触摸屏', '再次尝试?', '输入 BIP39 Phrasephrase', '输入私钥', '单位', '升级已完成。', '使用黑色背景界面。', '使用摄像头的熵创建新助记词', '已用:', '用户数据', '值 %s 超出范围:[ %s,%s ]', '值必须是 %s 的倍数', '验证中..', '版本', '通过摄像头', '通过 D20', '通过 D6', '通过手动输入', '通过单词', '等待截取', '钱包', '钱包描述', '钱包输出描述符', '钱包输出描述符加载重复!', '未找到钱包输出描述符。', '警告:', '词 %d', '单词序号', '单词', '是', ' 非有效地址', '在前 %d 个地址中未找到'] +translation_array = [ + "% 的金额。", + "%d/%d 多签", + "%d到%d", + "已移除%s", + "(总计 %d)", + "(实验性)", + "(仅观察)", + "12 单词", + "24 单词", + "关于", + "接受假设?", + "账户", + "将假定为账户 #0", + "账户索引", + "添加或更改钱包密码?", + "AES-CBC 模式需要相机的额外熵", + "地址", + "正确对齐摄像头和背板。", + "首先在设置中允许!", + "防眩光已禁用", + "防眩光已启用", + "界面", + "确定?", + "BGR 颜色", + "BIP39助记符", + "返回", + "返回菜单", + "备份助记词", + "签名无效", + "Base64密码", + "波特率", + "二进制网格", + "边框填充", + "亮度", + "按钮", + "按钮去抖动", + "截取已取消", + "找零", + "找零地址", + "更改主题并重新启动?", + "找零", + "更改将在关机前保持。", + "检查 SD 卡", + "检查该地址是否属于此钱包?", + "已检查 %d 个不匹配的地址。", + "检查 SD 卡..", + "确认防篡改检查码", + "创建二维码", + "从文本创建二维码?", + "已创建:", + "当前防篡改检查码", + "自定义二维码", + "自定义", + "自定义您的钱包将生成新私钥。", + "切割深度", + "切割方法", + "十进制", + "解密?", + "默认钱包", + "每次通过的深度", + "导出BIP85熵?", + "描述符地址", + "显示", + "请勿断电,可能需要一段时间完成。", + "完成了吗?", + "双重助记词", + "驱动程序", + "为空", + "启用Krux应用程序", + "已加密", + "加密二维码", + "加密助记词未存储", + "加密助记词已存储,ID 为:", + "加密", + "加密模式", + "输入 %d 个 BIP-39 词。", + "输入6个以上字符的防篡改检查码", + "将 BIP-39 助记词的每个词作为 1 到 2048 的数字输入。", + "将 BIP-39 助记词的每个词作为 1 到 800 的十六进制数输入。", + "将 BIP-39 助记词的每个词作为 1 到 4000 的八进制数输入。", + "输入每个 BIP-39 助记词。", + "清除用户数据", + "正在擦除用户数据..", + "错误:", + "退出", + "是否执行签名的Krux应用程序?", + "浏览文件?", + "导出到 SD 卡..", + "扩展公钥", + "出厂设置", + "解密失败", + "加载 PSBT 失败", + "加载地址失败", + "加载密钥失败", + "加载消息失败", + "加载助记词失败", + "加载输出描述符失败", + "加载密码失败", + "存储助记词失败", + "费用:", + "进给速度", + "文件名", + "文件名 %s 存在于 SD 卡上,覆盖?", + "用摄像头的熵填充Flash?", + "填充Flash", + "PSBT 中未设置指纹", + "固件超过最大尺寸:%d", + "Flash地图", + "Flash工具", + "Flash已用摄像头熵填充", + "翻转 X 坐标", + "刀具直径", + "空闲:", + "从存储中", + "在其他设备中完全擦除您的 SD 卡以确保数据不可恢复", + "生成助记词", + "为此助记词设置自定义 ID?否则将使用当前指纹", + "去", + "良好的熵", + "硬件", + "十六进制公钥", + "十六进制", + "隐藏助记词", + "高费用!", + "ID 已存在", + "索引", + "索引: %s", + "输入 (%d):", + "安装?", + "熵不足!", + "熵不足", + "无效的防篡改检查码", + "无效地址", + "无效的 ootloader ", + "助记词长度无效", + "无效公钥", + "无效钱包:", + "反转", + "反转颜色", + "密钥", + "未提供密钥", + "Krux 打印机测试二维码", + "LCD 类型", + "语言", + "如果希望 Krux 自动计算最后一位 Checksum,请留空", + "左", + "长度: %s", + "行延迟", + "行:", + "加载Krux应用", + "加载助记词", + "加载钱包", + "加载受信任的钱包描述符以查看地址?", + "从 SD 卡加载", + "从 SD 卡加载?", + "从相机加载", + "加载一个?", + "加载?", + "加载相机..", + "加载找零地址..", + "加载打印机..", + "加载接收地址..", + "加载中..", + "语言环境", + "位置", + "超过最大长度(%s)", + "消息", + "消息:", + "缺少签名文件", + "助记词", + "助记词 ID", + "助记词和密码将被保留。", + "助记词未加密", + "修改时间:", + "多签", + "假定为原生 Segwit - 84", + "网络", + "新助记词", + "检测到新固件。", + "否", + "无 Passphrase ", + "投掷次数不足!", + "数字", + "八进制", + "其他格式", + "PBKDF2 迭代", + "将打孔点涂黑,以便它们能被检测到。", + "纸张宽度", + "部分", + "部件尺寸", + "Passphrase", + "密码长度:", + "路径不匹配", + "检测到模式!", + "从 Flash 中永久删除所有存储的加密助记词和设置?", + "保存", + "像素偏差指数:", + "明文二维码", + "请加载钱包输出描述符", + "下刀速度", + "熵值低", + "检测到低熵!", + "打印测试二维码", + "打印 Tiny Seed?", + "打印到二维码", + "打印到二维码?", + "打印?", + "打印机", + "打印机驱动程序未设置!", + "正在打印", + "继续吗?", + "继续?", + "正在处理..", + "二维码", + "RX 引脚", + "重启", + "接收", + "接收地址", + "区域:", + "删除 %s?", + "删除助记词", + "从 SD 卡中删除固件文件?", + "分辨率 - 格式", + "恢复出厂设置并重新设备?", + "返回二维码查看器", + "请检查扫描的数据,如有必要请编辑", + "右", + "掷骰子至少 %d 次以生成助记词。", + "掷骰子分布:", + "掷骰子:", + "SD 卡", + "未检测到 SD 卡。", + "掷骰子的 SHA256:", + "快照的 SHA256:", + "将二维码图像保存到 SD 卡", + "保存到 SD 卡", + "保存到 SD 卡?", + "保存到 SD 卡", + "缩放", + "扫描地址", + "扫描 BIP39 Passphrase", + "扫描私钥二维码", + "重新扫扫描第 1-12 个单词", + "扫描第 13-24 个单词", + "屏保时间", + "脚本类型", + "安全", + "自转或找零 (%d):", + "自行转账:", + "请先设置防篡改检查码", + "设置", + "设置存储在 Flash 内部。", + "设置存储在SD卡上。", + "香农熵:", + "关机", + "关机时间", + "关机中..", + "签名", + "二维码签名", + " SD 卡签名", + "是否签名?", + "签名", + "签名消息", + "已签名 PSBT", + "签名中..", + "单签", + "大小:", + "无法执行某些检查。", + "花费 (%d):", + "花费", + "极客统计数据", + "存储到 Flash", + "存储到 SD 卡", + "滑动切换模式", + "TC Flash Hash", + "启动时的 TC Flash Hash", + "点击或按下 ENTER 截图", + "TX 引脚", + "防篡改检查码", + "防篡改检查码设置成功", + "防篡改检查码不匹配", + "文本", + "The app will be copied to user's flash ", + "主题", + "热敏", + "要确保数据不可恢复,请使用擦除设备功能", + "调整亮度", + "工具", + "触摸阈值", + "触摸屏", + "再次尝试?", + "输入 BIP39 Phrasephrase", + "输入私钥", + "单位", + "升级已完成。", + "使用黑色背景界面。", + "使用摄像头的熵创建新助记词", + "已用:", + "用户数据", + "值 %s 超出范围:[ %s,%s ]", + "值必须是 %s 的倍数", + "验证中..", + "版本", + "通过摄像头", + "通过 D20", + "通过 D6", + "通过手动输入", + "通过单词", + "等待截取", + "钱包", + "钱包描述", + "钱包输出描述符", + "钱包输出描述符加载重复!", + "未找到钱包输出描述符。", + "警告:", + "词 %d", + "单词序号", + "单词", + "是", + " 非有效地址", + "在前 %d 个地址中未找到", +] From e031d6d07b94c3842bdb5b8b9fcb38ee48a383c3 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sun, 8 Dec 2024 23:26:49 -0300 Subject: [PATCH 25/86] Allow multiple apps installed in flash --- i18n/translations/de-DE.json | 4 +- i18n/translations/es-MX.json | 4 +- i18n/translations/fr-FR.json | 4 +- i18n/translations/ja-JP.json | 4 +- i18n/translations/ko-KR.json | 4 +- i18n/translations/nl-NL.json | 4 +- i18n/translations/pt-BR.json | 4 +- i18n/translations/ru-RU.json | 4 +- i18n/translations/tr-TR.json | 4 +- i18n/translations/vi-VN.json | 4 +- i18n/translations/zh-CN.json | 4 +- pyproject.toml | 2 +- src/boot.py | 3 - src/krux/pages/kapps.py | 203 +++++++++++++++++++----------- src/krux/pages/tools.py | 17 ++- src/krux/translations/__init__.py | 5 +- src/krux/translations/de.py | 5 +- src/krux/translations/es.py | 5 +- src/krux/translations/fr.py | 5 +- src/krux/translations/ja.py | 5 +- src/krux/translations/ko.py | 5 +- src/krux/translations/nl.py | 5 +- src/krux/translations/pt.py | 5 +- src/krux/translations/ru.py | 5 +- src/krux/translations/tr.py | 5 +- src/krux/translations/vi.py | 5 +- src/krux/translations/zh.py | 5 +- 27 files changed, 216 insertions(+), 113 deletions(-) diff --git a/i18n/translations/de-DE.json b/i18n/translations/de-DE.json index ce4d00637..774a95637 100644 --- a/i18n/translations/de-DE.json +++ b/i18n/translations/de-DE.json @@ -20,6 +20,7 @@ "Allow in settings first!": "Erlaube zuerst Einstellungen!", "Anti-glare disabled": "Blendschutz deaktiviert", "Anti-glare enabled": "Blendschutz aktiviert", + "App will be stored internally on flash.": "Die App wird intern auf Flash gespeichert.", "Appearance": "Aussehen", "Are you sure?": "Bist Du sicher?", "BGR Colors": "BGR-Farben", @@ -84,7 +85,7 @@ "Erasing user's data..": "Benutzerdaten werden gelöscht..", "Error:": "Fehler:", "Esc": "Esc", - "Execute a signed Krux app?": "Eine signierte Krux-App ausführen?", + "Execute %s Krux app?": "%s Krux-App ausführen?", "Explore files?": "Dateien durchsuchen?", "Exporting to SD card..": "Auf SD-Karte exportieren..", "Extended Public Key": "Öffentlicher Schlüssel", @@ -292,6 +293,7 @@ "Type BIP39 Passphrase": "BIP39 Passphrase eingeben", "Type Key": "Schlüssel eingeben", "Unit": "Einheit", + "Unsigned apps found in flash will be deleted.": "Nicht signierte Apps, die in Flash gefunden wurden, werden gelöscht.", "Upgrade complete.": "Upgrade abgeschlossen.", "Use a black background surface.": "Verwende eine schwarze Hintergrundfläche.", "Use camera's entropy to create a new mnemonic": "Verwende die Entropie der Kamera, um eine neue Mnemonic zu erstellen", diff --git a/i18n/translations/es-MX.json b/i18n/translations/es-MX.json index 9836fe256..437848ed0 100644 --- a/i18n/translations/es-MX.json +++ b/i18n/translations/es-MX.json @@ -20,6 +20,7 @@ "Allow in settings first!": "¡Permitir en la configuración primero!", "Anti-glare disabled": "Anti-reflejo desactivado", "Anti-glare enabled": "Anti-reflejo habilitado", + "App will be stored internally on flash.": "La aplicación se almacenará internamente en flash.", "Appearance": "Apariencia", "Are you sure?": "¿Estás seguro?", "BGR Colors": "Colores BGR", @@ -84,7 +85,7 @@ "Erasing user's data..": "Borrando los datos del usuario..", "Error:": "Error:", "Esc": "Esc", - "Execute a signed Krux app?": "¿Ejecutar una aplicación Krux firmada?", + "Execute %s Krux app?": "¿Ejecutar %s aplicación Krux?", "Explore files?": "¿Explorar archivos?", "Exporting to SD card..": "Exportando a la tarjeta SD..", "Extended Public Key": "Clave Pública Extendida", @@ -292,6 +293,7 @@ "Type BIP39 Passphrase": "Escribe la Passphrase BIP39", "Type Key": "Introduce la clave", "Unit": "Unidad", + "Unsigned apps found in flash will be deleted.": "Se eliminarán las aplicaciones sin firmar que se encuentren en Flash.", "Upgrade complete.": "Actualización completa.", "Use a black background surface.": "Usa una superficie de fondo negra.", "Use camera's entropy to create a new mnemonic": "Usa la entropía de la cámara para crear una nueva mnemónica", diff --git a/i18n/translations/fr-FR.json b/i18n/translations/fr-FR.json index 28dbd7244..6ed521535 100644 --- a/i18n/translations/fr-FR.json +++ b/i18n/translations/fr-FR.json @@ -20,6 +20,7 @@ "Allow in settings first!": "Autoriser d'abord dans les paramètres !", "Anti-glare disabled": "Anti-éblouissement désactivé", "Anti-glare enabled": "Anti-éblouissement activé", + "App will be stored internally on flash.": "L'application sera stockée en interne sur flash.", "Appearance": "Apparence", "Are you sure?": "Es-tu sûr ?", "BGR Colors": "Couleurs BGR", @@ -84,7 +85,7 @@ "Erasing user's data..": "Effacement des données de l'utilisateur...", "Error:": "Erreur :", "Esc": "Esc", - "Execute a signed Krux app?": "Exécuter une application Krux signée ?", + "Execute %s Krux app?": "Exécuter l'application %s Krux ?", "Explore files?": "Explorer des fichiers ?", "Exporting to SD card..": "Exportation vers la carte SD..", "Extended Public Key": "Clé publique", @@ -292,6 +293,7 @@ "Type BIP39 Passphrase": "Entrez la phrase secrète BIP-39", "Type Key": "Taper clé", "Unit": "Unité", + "Unsigned apps found in flash will be deleted.": "Les applications non signées trouvées dans Flash seront supprimées.", "Upgrade complete.": "Mise à jour complète.", "Use a black background surface.": "Utilisez une surface de fond noire.", "Use camera's entropy to create a new mnemonic": "Utilisez l'entropie de la caméra pour créer un nouveau mnémonique", diff --git a/i18n/translations/ja-JP.json b/i18n/translations/ja-JP.json index 4a46d6f22..71ea50e4b 100644 --- a/i18n/translations/ja-JP.json +++ b/i18n/translations/ja-JP.json @@ -20,6 +20,7 @@ "Allow in settings first!": "最初に設定で許可してください!", "Anti-glare disabled": "アンチグレアが無効", "Anti-glare enabled": "アンチグレアが有効", + "App will be stored internally on flash.": "アプリはフラッシュに内部保存されます。", "Appearance": "外観", "Are you sure?": "よろしいですか?", "BGR Colors": "BGRカラー", @@ -84,7 +85,7 @@ "Erasing user's data..": "ユーザーのデータを消去しています..", "Error:": "エラー:", "Esc": "エスク", - "Execute a signed Krux app?": "署名入りのKruxアプリを実行しますか?", + "Execute %s Krux app?": "%s Kruxアプリを実行しますか?", "Explore files?": "アーカイブ探索?", "Exporting to SD card..": "SDカードへのエクスポート..", "Extended Public Key": "拡張公開キー", @@ -292,6 +293,7 @@ "Type BIP39 Passphrase": "BIP39パスフレーズを入力してください", "Type Key": "キーを入力する", "Unit": "ユニット", + "Unsigned apps found in flash will be deleted.": "Flashで見つかった署名されていないアプリは削除されます。", "Upgrade complete.": "アップグレードが完了しました.", "Use a black background surface.": "黒い背景面を使用してください.", "Use camera's entropy to create a new mnemonic": "カメラのエントロピーを使用して新しいmnemonicを作成してください", diff --git a/i18n/translations/ko-KR.json b/i18n/translations/ko-KR.json index a46df3713..23f4f85c4 100644 --- a/i18n/translations/ko-KR.json +++ b/i18n/translations/ko-KR.json @@ -20,6 +20,7 @@ "Allow in settings first!": "먼저 설정에서 허용하세요!", "Anti-glare disabled": "눈부심방지 비활성화", "Anti-glare enabled": "눈부심방지 활성화", + "App will be stored internally on flash.": "앱은 내부적으로 플래시로 저장됩니다.", "Appearance": "디스플레이", "Are you sure?": "계속하시겠습니까?", "BGR Colors": "BGR 색상", @@ -84,7 +85,7 @@ "Erasing user's data..": "사용자의 데이터를 지우는 중...", "Error:": "오류:", "Esc": "Esc", - "Execute a signed Krux app?": "서명된 Krux 앱을 실행하시겠습니까?", + "Execute %s Krux app?": "%s KRUX 앱을 실행하시겠습니까?", "Explore files?": "파일을 탐색하시겠습니까?", "Exporting to SD card..": "SD카드로 내보내는 중..", "Extended Public Key": "XPUB 내보내기", @@ -292,6 +293,7 @@ "Type BIP39 Passphrase": "BIP39 패스프레이즈 입력", "Type Key": "비밀번호 입력", "Unit": "단위", + "Unsigned apps found in flash will be deleted.": "플래시에서 찾은 서명되지 않은 앱은 삭제됩니다.", "Upgrade complete.": "업그레이드가 완료되었습니다", "Use a black background surface.": "검은색 배경 화면을 사용하십시오.", "Use camera's entropy to create a new mnemonic": "카메라의 엔트로피를 사용하여 새로운 니모닉을 생성하십시오", diff --git a/i18n/translations/nl-NL.json b/i18n/translations/nl-NL.json index cf30ccdcd..b02c5dd88 100644 --- a/i18n/translations/nl-NL.json +++ b/i18n/translations/nl-NL.json @@ -20,6 +20,7 @@ "Allow in settings first!": "Sta eerst instellingen toe!", "Anti-glare disabled": "Anti reflecterend uitgeschakeld", "Anti-glare enabled": "Anti reflecterend ingeschakeld", + "App will be stored internally on flash.": "De app wordt intern opgeslagen op de flitser.", "Appearance": "Uiterlijk", "Are you sure?": "Weet je het zeker?", "BGR Colors": "BGR-kleuren", @@ -84,7 +85,7 @@ "Erasing user's data..": "Gegevens van gebruiker wissen..", "Error:": "Fout:", "Esc": "Esc", - "Execute a signed Krux app?": "Een ondertekende Krux-app uitvoeren?", + "Execute %s Krux app?": "%s Krux-app uitvoeren?", "Explore files?": "Bestanden verkennen?", "Exporting to SD card..": "Exporteren naar SD kaart..", "Extended Public Key": "Uitgebreide publieke sleutel", @@ -292,6 +293,7 @@ "Type BIP39 Passphrase": "Voer een BIP-39 wachtwoord in", "Type Key": "Voer sleutel in", "Unit": "Eenheid", + "Unsigned apps found in flash will be deleted.": "Niet-ondertekende apps die in Flash worden gevonden, worden verwijderd.", "Upgrade complete.": "Upgrade afgerond.", "Use a black background surface.": "Gebruik een donker achergrond.", "Use camera's entropy to create a new mnemonic": "Gebruik de camera als entropie voor het aanmaken van een nieuwe geheugensteun", diff --git a/i18n/translations/pt-BR.json b/i18n/translations/pt-BR.json index d4b8d3925..5d766c020 100644 --- a/i18n/translations/pt-BR.json +++ b/i18n/translations/pt-BR.json @@ -20,6 +20,7 @@ "Allow in settings first!": "Permita nas configurações primeiro!", "Anti-glare disabled": "Antirreflexo desativado", "Anti-glare enabled": "Antirreflexo ativado", + "App will be stored internally on flash.": "O aplicativo será armazenado internamente em flash.", "Appearance": "Aparência", "Are you sure?": "Tem certeza?", "BGR Colors": "Cores BGR", @@ -84,7 +85,7 @@ "Erasing user's data..": "Apagando os dados do usuário..", "Error:": "Erro:", "Esc": "Esc", - "Execute a signed Krux app?": "Executar um Krux app assinado?", + "Execute %s Krux app?": "Executar %s aplicativo Krux?", "Explore files?": "Explorar arquivos?", "Exporting to SD card..": "Exportando para o cartão SD..", "Extended Public Key": "Chave Pública Estendida", @@ -292,6 +293,7 @@ "Type BIP39 Passphrase": "Digitar a senha BIP39", "Type Key": "Digite a Chave", "Unit": "Unidade", + "Unsigned apps found in flash will be deleted.": "Aplicativos não assinados encontrados em flash serão excluídos.", "Upgrade complete.": "Atualização completa.", "Use a black background surface.": "Use uma superfície de fundo preta.", "Use camera's entropy to create a new mnemonic": "Use a entropia da câmera para criar um novo mnemônico", diff --git a/i18n/translations/ru-RU.json b/i18n/translations/ru-RU.json index de1c994e3..20f2189ba 100644 --- a/i18n/translations/ru-RU.json +++ b/i18n/translations/ru-RU.json @@ -20,6 +20,7 @@ "Allow in settings first!": "Сначала разрешите в настройках!", "Anti-glare disabled": "Антиблик отключен", "Anti-glare enabled": "Антиблик включен", + "App will be stored internally on flash.": "Приложение будет храниться во флэш-памяти.", "Appearance": "Внешний Вид", "Are you sure?": "Вы уверены?", "BGR Colors": "Цвета BGR", @@ -84,7 +85,7 @@ "Erasing user's data..": "Удаление данных пользователя..", "Error:": "Ошибка:", "Esc": "Выйти", - "Execute a signed Krux app?": "Выполнить подписанное приложение Krux?", + "Execute %s Krux app?": "Запустить приложение %s Krux?", "Explore files?": "Исследовать файлы?", "Exporting to SD card..": "Экспортирование на SD карту..", "Extended Public Key": "Расширенный Публичный Ключ", @@ -292,6 +293,7 @@ "Type BIP39 Passphrase": "Ввести BIP39 фразу-пароль", "Type Key": "Ввести Ключ", "Unit": "Единица Измерения", + "Unsigned apps found in flash will be deleted.": "Неподписанные приложения, найденные во флэш-памяти, будут удалены.", "Upgrade complete.": "Обновление завершено.", "Use a black background surface.": "Использовать черную фоновую поверхность.", "Use camera's entropy to create a new mnemonic": "Использовать энтропию камеры, чтобы создать новую мнемонику", diff --git a/i18n/translations/tr-TR.json b/i18n/translations/tr-TR.json index 9c30b883c..d2ae9db0c 100644 --- a/i18n/translations/tr-TR.json +++ b/i18n/translations/tr-TR.json @@ -20,6 +20,7 @@ "Allow in settings first!": "Önce ayarlarda izin ver!", "Anti-glare disabled": "Parlama önleyici devre dışı", "Anti-glare enabled": "Parlama önleyici etkin", + "App will be stored internally on flash.": "Uygulama flaşta dahili olarak depolanacaktır.", "Appearance": "Görünüm", "Are you sure?": "Emin misiniz?", "BGR Colors": "BGR Renkleri", @@ -84,7 +85,7 @@ "Erasing user's data..": "Kullanıcının verileri siliniyor..", "Error:": "Hata:", "Esc": "Çıkış", - "Execute a signed Krux app?": "İmzalı bir Krux uygulaması çalıştırılsın mı?", + "Execute %s Krux app?": "%s Krux uygulaması çalıştırılsın mı?", "Explore files?": "Dosyaları ara?", "Exporting to SD card..": "SD karta aktarılıyor..", "Extended Public Key": "Genişletilmiş Public Key", @@ -292,6 +293,7 @@ "Type BIP39 Passphrase": "BIP39 parolasını yazın", "Type Key": "Anahtar Yaz", "Unit": "Birim", + "Unsigned apps found in flash will be deleted.": "Flash'ta bulunan imzasız uygulamalar silinecek.", "Upgrade complete.": "Güncelleme tamamlandı.", "Use a black background surface.": "Siyah bir arka plan yüzeyi kullanın.", "Use camera's entropy to create a new mnemonic": "Yeni bir mnemonic oluşturmak için kameranın entropisini kullanın", diff --git a/i18n/translations/vi-VN.json b/i18n/translations/vi-VN.json index 63d689358..291f1957e 100644 --- a/i18n/translations/vi-VN.json +++ b/i18n/translations/vi-VN.json @@ -20,6 +20,7 @@ "Allow in settings first!": "Cho phép cài đặt trước!", "Anti-glare disabled": "Chống lóa bị vô hiệu hóa", "Anti-glare enabled": "Đã bật chống lóa", + "App will be stored internally on flash.": "Ứng dụng sẽ được lưu trữ nội bộ trên flash.", "Appearance": "Giao diện", "Are you sure?": "Bạn có chắc không?", "BGR Colors": "Màu BGR", @@ -84,7 +85,7 @@ "Erasing user's data..": "Đang xóa dữ liệu của người dùng..", "Error:": "Lỗi:", "Esc": "Esc", - "Execute a signed Krux app?": "Thực thi một ứng dụng Krux đã ký?", + "Execute %s Krux app?": "Thực thi %s ứng dụng Krux?", "Explore files?": "Khám phá các tập tin?", "Exporting to SD card..": "Xuất vào thẻ SD ..", "Extended Public Key": "Khóa công cộng", @@ -292,6 +293,7 @@ "Type BIP39 Passphrase": "Nhập cụm mật khẩu BIP39", "Type Key": "Nhập khóa", "Unit": "Đơn vị", + "Unsigned apps found in flash will be deleted.": "Các ứng dụng chưa ký được tìm thấy trong flash sẽ bị xóa.", "Upgrade complete.": "Nâng cấp hoàn tất.", "Use a black background surface.": "Sử dụng bề mặt nền đen.", "Use camera's entropy to create a new mnemonic": "Sử dụng sự ngẫu nhiên của máy ảnh để tạo ra một Mnemonic mới", diff --git a/i18n/translations/zh-CN.json b/i18n/translations/zh-CN.json index e5502512e..99d5cdfaa 100644 --- a/i18n/translations/zh-CN.json +++ b/i18n/translations/zh-CN.json @@ -20,6 +20,7 @@ "Allow in settings first!": "首先在设置中允许!", "Anti-glare disabled": "防眩光已禁用", "Anti-glare enabled": "防眩光已启用", + "App will be stored internally on flash.": "应用程序将内部存储在闪存中。", "Appearance": "界面", "Are you sure?": "确定?", "BGR Colors": "BGR 颜色", @@ -84,7 +85,7 @@ "Erasing user's data..": "正在擦除用户数据..", "Error:": "错误:", "Esc": "退出", - "Execute a signed Krux app?": "是否执行签名的Krux应用程序?", + "Execute %s Krux app?": "是否执行%s Krux应用程序?", "Explore files?": "浏览文件?", "Exporting to SD card..": "导出到 SD 卡..", "Extended Public Key": "扩展公钥", @@ -292,6 +293,7 @@ "Type BIP39 Passphrase": "输入 BIP39 Phrasephrase", "Type Key": "输入私钥", "Unit": "单位", + "Unsigned apps found in flash will be deleted.": "在Flash中找到的未签名应用将被删除。", "Upgrade complete.": "升级已完成。", "Use a black background surface.": "使用黑色背景界面。", "Use camera's entropy to create a new mnemonic": "使用摄像头的熵创建新助记词", diff --git a/pyproject.toml b/pyproject.toml index 56ab0327e..828b279dc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -103,7 +103,7 @@ docs = "poetry run mkdocs serve" # translations tasks i18n = "python i18n/i18n.py" i18n-bake = "python i18n/i18n.py clean prettify bake" -format-translations = "black src/krux/translations.py" +format-translations = "black src/krux/translations/*.py" i18n-build = ["i18n-bake", "format-translations", "i18n validate"] # aliases translations.ref = "i18n-build" diff --git a/src/boot.py b/src/boot.py index 09c5b1f38..f359ea5b6 100644 --- a/src/boot.py +++ b/src/boot.py @@ -26,9 +26,6 @@ import gc import os -sys.path.append("") -sys.path.append(".") - from krux.power import power_manager MIN_SPLASH_WAIT_TIME = 1000 diff --git a/src/krux/pages/kapps.py b/src/krux/pages/kapps.py index b866ce6b9..d82e3090c 100644 --- a/src/krux/pages/kapps.py +++ b/src/krux/pages/kapps.py @@ -22,10 +22,14 @@ from krux.pages import ( Page, + Menu, MENU_CONTINUE, ) from krux.krux_settings import t from krux.display import BOTTOM_PROMPT_LINE +from krux.sd_card import MPY_FILE_EXTENSION, SIGNATURE_FILE_EXTENSION, SD_PATH +from krux.settings import FLASH_PATH +import os READABLEBUFFER_SIZE = 128 @@ -33,7 +37,73 @@ class Kapps(Page): """Krux standalone apps manager""" - def _check_signature(self, sig, data_hash): + def __init__(self, ctx): + self.ctx = ctx + + items = [] + signed_apps = self._parse_all_flash_apps() + for app_name in signed_apps: + clean_name = app_name[:-4] + items += [ + (clean_name, lambda name=clean_name: self.execute_flash_kapp(name)) + ] + items += [ + ( + t("Load from SD card"), + None if not self.has_sd_card() else self.load_sd_kapp, + ) + ] + + super().__init__( + ctx, + Menu(ctx, items), + ) + + def _parse_all_flash_apps(self): + """Check if any .mpy app present in flash is signed. + If not, ask for deletion to prevent importing and executing malicious code""" + + from krux.firmware import sha256 + + unsigned_apps = [] + signed_apps = [] + flash_path_prefix = "/%s/" % FLASH_PATH + for file in os.listdir(flash_path_prefix): + if file.endswith(MPY_FILE_EXTENSION): + # Check if signature file exists for the .mpy file + try: + sig_data = open( + flash_path_prefix + file + SIGNATURE_FILE_EXTENSION, "rb" + ).read() + if self._valid_signature( + sig_data, sha256(flash_path_prefix + file) + ): + signed_apps += [file] + else: + unsigned_apps += [file] + except: + unsigned_apps += [file] + + if len(unsigned_apps) > 0: + # Prompts user about deleting as it will change flash memory and TC hash + self.ctx.display.clear() + if not self.prompt( + t("Unsigned apps found in flash will be deleted.") + + "\n\n" + + t("Proceed?"), + self.ctx.display.height() // 2, + ): + raise ValueError("Unsigned apps found in flash") + + # Delete any .mpy files from flash VFS to avoid malicious code import/execution + for app in unsigned_apps: + os.remove(flash_path_prefix + app) + + return signed_apps + + def _valid_signature(self, sig, data_hash): + """Return if signature of data_hash is valid""" + from embit import ec from ..metadata import SIGNER_PUBKEY @@ -48,27 +118,52 @@ def _check_signature(self, sig, data_hash): sig = ec.Signature.parse(ec.Signature.parse(sig).serialize()) if not pubkey.verify(sig, data_hash): - self.flash_error(t("Bad signature")) return False except: - self.flash_error(t("Bad signature")) return False return True - def load_kapp(self): # pylint: disable=R1710 + def execute_flash_kapp(self, app_name): # pylint: disable=R1710 """Prompt user to load and 'execute' a .mpy Krux app""" + + self.ctx.display.clear() if not self.prompt( - t("Execute a signed Krux app?"), self.ctx.display.height() // 2 + t("Execute %s Krux app?") % app_name, self.ctx.display.height() // 2 ): return MENU_CONTINUE - # Check if Krux app is enabled - from krux.krux_settings import Settings + # Allows import of files in flash VFS + # TODO: Dinamically enable vsf->execution + os.chdir("/" + FLASH_PATH) - if not Settings().security.allow_kapp: - self.flash_error(t("Allow in settings first!")) - return MENU_CONTINUE + # Import and exec the kapp + i_kapp = None + try: + i_kapp = __import__(app_name) + i_kapp.run(self.ctx) + except: + # avoids importing from flash VSF + os.chdir("/") + + # unimport module + import sys + + del i_kapp + del sys.modules[app_name] + + raise ValueError("Could not execute %s" % app_name) + + # avoids importing from flash VSF + os.chdir("/") + + # After execution restart Krux (better safe than sorry) + from ..power import power_manager + + power_manager.shutdown() + + def load_sd_kapp(self): # pylint: disable=R1710 + """Loads kapp from SD to flash, then executes""" if not self.has_sd_card(): self.flash_error(t("SD card not detected.")) @@ -76,7 +171,6 @@ def load_kapp(self): # pylint: disable=R1710 # Prompt user for .mpy file from krux.pages.utils import Utils - from krux.sd_card import MPY_FILE_EXTENSION, SIGNATURE_FILE_EXTENSION, SD_PATH filename, _ = Utils(self.ctx).load_file( MPY_FILE_EXTENSION, prompt=False, only_get_filename=True @@ -85,14 +179,13 @@ def load_kapp(self): # pylint: disable=R1710 if not filename: return MENU_CONTINUE - # Confirm hash string - sd_path_prefix = "/%s/" % SD_PATH from krux.firmware import sha256 + import binascii + sd_path_prefix = "/%s/" % SD_PATH data_hash = sha256(sd_path_prefix + filename) - import binascii - + # Confirm hash string self.ctx.display.clear() self.ctx.display.draw_hcentered_text( filename + "\n\n" + "SHA256:\n" + binascii.hexlify(data_hash).decode() @@ -110,52 +203,44 @@ def load_kapp(self): # pylint: disable=R1710 self.flash_error(t("Missing signature file")) return MENU_CONTINUE - if not self._check_signature(sig_data, data_hash): - return MENU_CONTINUE - - # Warns user about changing users's flash internal memory region - self.ctx.display.clear() - if not self.prompt( - t("App will be stored internally on flash.") + "\n\n" + t("Proceed?"), - self.ctx.display.height() // 2, - ): + if not self._valid_signature(sig_data, data_hash): + self.flash_error(t("Bad signature")) return MENU_CONTINUE - # Delete any .mpy files from flash VFS to avoid malicious code import/execution - import os - from krux.settings import FLASH_PATH - + # Check if app is already installed in flash found_in_flash_vfs = False flash_path_prefix = "/%s/" % FLASH_PATH for file in os.listdir(flash_path_prefix): if file.endswith(MPY_FILE_EXTENSION): - # Only remove .mpy different from what was loaded from SD - if sha256(flash_path_prefix + file) != data_hash: - os.remove(flash_path_prefix + file) - else: + if sha256(flash_path_prefix + file) == data_hash: found_in_flash_vfs = True - # Copy kapp + sig from SD to flash VFS if not found - # sig file will allow the check and execution of the kapp at startup (opsec) - kapp_filename = "kapp" + # Copy kapp + sig from SD to flash VFS, if app not found if not found_in_flash_vfs: + # Warns user about changing users's flash internal memory region + self.ctx.display.clear() + if not self.prompt( + t("App will be stored internally on flash.") + "\n\n" + t("Proceed?"), + self.ctx.display.height() // 2, + ): + return MENU_CONTINUE + + # Save APP .mpy with open( - flash_path_prefix + kapp_filename + MPY_FILE_EXTENSION, + flash_path_prefix + filename, "wb", buffering=0, - ) as kapp_file: - with open(sd_path_prefix + filename, "rb", buffering=0) as file: + ) as flash_file: + with open(sd_path_prefix + filename, "rb", buffering=0) as sd_file: while True: - chunk = file.read(READABLEBUFFER_SIZE) + chunk = sd_file.read(READABLEBUFFER_SIZE) if not chunk: break - kapp_file.write(chunk) + flash_file.write(chunk) + # Save SIG .mpy.sig with open( - flash_path_prefix - + kapp_filename - + MPY_FILE_EXTENSION - + SIGNATURE_FILE_EXTENSION, + flash_path_prefix + filename + SIGNATURE_FILE_EXTENSION, "wb", ) as kapp_sig_file: kapp_sig_file.write(sig_data) @@ -165,31 +250,5 @@ def load_kapp(self): # pylint: disable=R1710 gc.collect() - # Allows import of files in flash VFS - # TODO: Dinamically enable vsf->execution - os.chdir("/" + FLASH_PATH) - - # Import and exec the kapp - i_kapp = None - try: - i_kapp = __import__(kapp_filename) - i_kapp.run(self.ctx) - except: - # avoids importing from flash VSF - os.chdir("/") - - # unimport module - import sys - - del i_kapp - del sys.modules[kapp_filename] - - raise ValueError("Could not execute %s" % filename) - - # avoids importing from flash VSF - os.chdir("/") - - # After execution restart Krux (better safe than sorry) - from ..power import power_manager - - power_manager.shutdown() + clean_name = filename[:-4] + return self.execute_flash_kapp(clean_name) diff --git a/src/krux/pages/tools.py b/src/krux/pages/tools.py index 4bb22cd64..82d753a00 100644 --- a/src/krux/pages/tools.py +++ b/src/krux/pages/tools.py @@ -37,6 +37,7 @@ from ..display import BOTTOM_PROMPT_LINE from ..krux_settings import t from ..qr import FORMAT_NONE +import sys class Tools(Page): @@ -64,10 +65,22 @@ def __init__(self, ctx): def load_krux_app(self): """Handler for the 'Load Krux app' menu item""" + # Check if Krux app is enabled + from krux.krux_settings import Settings + + if not Settings().security.allow_kapp: + self.flash_error(t("Allow in settings first!")) + return MENU_CONTINUE + from krux.pages.kapps import Kapps - kapps = Kapps(self.ctx) - return kapps.load_kapp() + Kapps(self.ctx).run() + + # Unimport kapps + sys.modules.pop("krux.pages.kapps") + del sys.modules["krux.pages"].kapps + + return MENU_CONTINUE def flash_tools(self): """Handler for the 'Flash Tools' menu item""" diff --git a/src/krux/translations/__init__.py b/src/krux/translations/__init__.py index 7d57c2aef..032c19dc7 100644 --- a/src/krux/translations/__init__.py +++ b/src/krux/translations/__init__.py @@ -54,6 +54,7 @@ 276039542, 88746165, 1521033296, + 2041172833, 3857613120, 1056821534, 1868069640, @@ -118,7 +119,7 @@ 3706575164, 889040671, 1505332462, - 2731446492, + 502721119, 3838465623, 4170881190, 1711312434, @@ -315,7 +316,6 @@ 3679411849, 1820163048, 2612594937, - 1531842997, 1454688268, 1180180513, 2258131455, @@ -327,6 +327,7 @@ 401829098, 2061556020, 2089395053, + 3448560703, 2786714360, 2674953168, 2402455261, diff --git a/src/krux/translations/de.py b/src/krux/translations/de.py index d8918c6c0..b5d608e45 100644 --- a/src/krux/translations/de.py +++ b/src/krux/translations/de.py @@ -42,6 +42,7 @@ "Erlaube zuerst Einstellungen!", "Blendschutz deaktiviert", "Blendschutz aktiviert", + "Die App wird intern auf Flash gespeichert.", "Aussehen", "Bist Du sicher?", "BGR-Farben", @@ -106,7 +107,7 @@ "Benutzerdaten werden gelöscht..", "Fehler:", "Esc", - "Eine signierte Krux-App ausführen?", + "%s Krux-App ausführen?", "Dateien durchsuchen?", "Auf SD-Karte exportieren..", "Öffentlicher Schlüssel", @@ -303,7 +304,6 @@ "Tamper Check Code erfolgreich gesetzt", "Tamper Check Codes stimmen nicht überein", "Text", - "The app will be copied to user's flash ", "Thema", "Thermisch", "Um sicherzustellen, dass die Daten nicht wiederhergestellt werden können, verwenden Sie die Funktion 'Gerät löschen'", @@ -315,6 +315,7 @@ "BIP39 Passphrase eingeben", "Schlüssel eingeben", "Einheit", + "Nicht signierte Apps, die in Flash gefunden wurden, werden gelöscht.", "Upgrade abgeschlossen.", "Verwende eine schwarze Hintergrundfläche.", "Verwende die Entropie der Kamera, um eine neue Mnemonic zu erstellen", diff --git a/src/krux/translations/es.py b/src/krux/translations/es.py index 11184a56a..9b5f13b14 100644 --- a/src/krux/translations/es.py +++ b/src/krux/translations/es.py @@ -42,6 +42,7 @@ "¡Permitir en la configuración primero!", "Anti-reflejo desactivado", "Anti-reflejo habilitado", + "La aplicación se almacenará internamente en flash.", "Apariencia", "¿Estás seguro?", "Colores BGR", @@ -106,7 +107,7 @@ "Borrando los datos del usuario..", "Error:", "Esc", - "¿Ejecutar una aplicación Krux firmada?", + "¿Ejecutar %s aplicación Krux?", "¿Explorar archivos?", "Exportando a la tarjeta SD..", "Clave Pública Extendida", @@ -303,7 +304,6 @@ "Código de verificación establecido con éxito", "Los códigos de verificación no coinciden", "Texto", - "The app will be copied to user's flash ", "Tema", "Térmico", "Para garantizar que los datos no se puedan recuperar, utiliza la función de borrar dispositivo", @@ -315,6 +315,7 @@ "Escribe la Passphrase BIP39", "Introduce la clave", "Unidad", + "Se eliminarán las aplicaciones sin firmar que se encuentren en Flash.", "Actualización completa.", "Usa una superficie de fondo negra.", "Usa la entropía de la cámara para crear una nueva mnemónica", diff --git a/src/krux/translations/fr.py b/src/krux/translations/fr.py index 275598351..3e9d7256f 100644 --- a/src/krux/translations/fr.py +++ b/src/krux/translations/fr.py @@ -42,6 +42,7 @@ "Autoriser d'abord dans les paramètres !", "Anti-éblouissement désactivé", "Anti-éblouissement activé", + "L'application sera stockée en interne sur flash.", "Apparence", "Es-tu sûr\u2009?", "Couleurs BGR", @@ -106,7 +107,7 @@ "Effacement des données de l'utilisateur...", "Erreur\u2009:", "Esc", - "Exécuter une application Krux signée ?", + "Exécuter l'application %s Krux ?", "Explorer des fichiers\u2009?", "Exportation vers la carte SD..", "Clé publique", @@ -303,7 +304,6 @@ "Code de non compromis défini avec succès", "Les codes de non compromis ne correspondent pas", "Texte", - "The app will be copied to user's flash ", "Thème", "Thermique", "Pour assurer que les données soient irrécupérables, utilisez la fonctionnalité 'Effacer l'appareil'", @@ -315,6 +315,7 @@ "Entrez la phrase secrète BIP-39", "Taper clé", "Unité", + "Les applications non signées trouvées dans Flash seront supprimées.", "Mise à jour complète.", "Utilisez une surface de fond noire.", "Utilisez l'entropie de la caméra pour créer un nouveau mnémonique", diff --git a/src/krux/translations/ja.py b/src/krux/translations/ja.py index e9abcb767..e5a21e265 100644 --- a/src/krux/translations/ja.py +++ b/src/krux/translations/ja.py @@ -42,6 +42,7 @@ "最初に設定で許可してください!", "アンチグレアが無効", "アンチグレアが有効", + "アプリはフラッシュに内部保存されます。", "外観", "よろしいですか?", "BGRカラー", @@ -106,7 +107,7 @@ "ユーザーのデータを消去しています..", "エラー:", "エスク", - "署名入りのKruxアプリを実行しますか?", + "%s Kruxアプリを実行しますか?", "アーカイブ探索?", "SDカードへのエクスポート..", "拡張公開キー", @@ -303,7 +304,6 @@ "改ざんチェックコードが正常に設定されました", "改ざんチェックコードが一致しません", "テキスト", - "The app will be copied to user's flash ", "テーマ", "サーマル", "データが復元不可能であることを確実にするには、デバイス消去機能を使用してください", @@ -315,6 +315,7 @@ "BIP39パスフレーズを入力してください", "キーを入力する", "ユニット", + "Flashで見つかった署名されていないアプリは削除されます。", "アップグレードが完了しました.", "黒い背景面を使用してください.", "カメラのエントロピーを使用して新しいmnemonicを作成してください", diff --git a/src/krux/translations/ko.py b/src/krux/translations/ko.py index e9b4adda1..3490eaa06 100644 --- a/src/krux/translations/ko.py +++ b/src/krux/translations/ko.py @@ -42,6 +42,7 @@ "먼저 설정에서 허용하세요!", "눈부심방지 비활성화", "눈부심방지 활성화", + "앱은 내부적으로 플래시로 저장됩니다.", "디스플레이", "계속하시겠습니까?", "BGR 색상", @@ -106,7 +107,7 @@ "사용자의 데이터를 지우는 중...", "오류:", "Esc", - "서명된 Krux 앱을 실행하시겠습니까?", + "%s KRUX 앱을 실행하시겠습니까?", "파일을 탐색하시겠습니까?", "SD카드로 내보내는 중..", "XPUB 내보내기", @@ -303,7 +304,6 @@ "탬퍼 검사 코드가 성공적으로 설정되었습니다", "탬퍼 검사 코드가 일치하지 않습니다", "텍스트", - "The app will be copied to user's flash ", "테마", "Thermal", "데이터 복구가 불가능하도록 장치 전체지우기 기능을 사용하십시오", @@ -315,6 +315,7 @@ "BIP39 패스프레이즈 입력", "비밀번호 입력", "단위", + "플래시에서 찾은 서명되지 않은 앱은 삭제됩니다.", "업그레이드가 완료되었습니다", "검은색 배경 화면을 사용하십시오.", "카메라의 엔트로피를 사용하여 새로운 니모닉을 생성하십시오", diff --git a/src/krux/translations/nl.py b/src/krux/translations/nl.py index 0ff481863..72041f957 100644 --- a/src/krux/translations/nl.py +++ b/src/krux/translations/nl.py @@ -42,6 +42,7 @@ "Sta eerst instellingen toe!", "Anti reflecterend uitgeschakeld", "Anti reflecterend ingeschakeld", + "De app wordt intern opgeslagen op de flitser.", "Uiterlijk", "Weet je het zeker?", "BGR-kleuren", @@ -106,7 +107,7 @@ "Gegevens van gebruiker wissen..", "Fout:", "Esc", - "Een ondertekende Krux-app uitvoeren?", + "%s Krux-app uitvoeren?", "Bestanden verkennen?", "Exporteren naar SD kaart..", "Uitgebreide publieke sleutel", @@ -303,7 +304,6 @@ "Sabotagecontrolecode succesvol ingesteld", "Sabotagecontrolecodes komen niet overeen", "Tekst", - "The app will be copied to user's flash ", "Thema", "Thermisch", "Gebruik de functie 'Apparaat wissen' om te zorgen dat de gegevens onherstelbaar zijn", @@ -315,6 +315,7 @@ "Voer een BIP-39 wachtwoord in", "Voer sleutel in", "Eenheid", + "Niet-ondertekende apps die in Flash worden gevonden, worden verwijderd.", "Upgrade afgerond.", "Gebruik een donker achergrond.", "Gebruik de camera als entropie voor het aanmaken van een nieuwe geheugensteun", diff --git a/src/krux/translations/pt.py b/src/krux/translations/pt.py index 144159f0a..6055f9e0a 100644 --- a/src/krux/translations/pt.py +++ b/src/krux/translations/pt.py @@ -42,6 +42,7 @@ "Permita nas configurações primeiro!", "Antirreflexo desativado", "Antirreflexo ativado", + "O aplicativo será armazenado internamente em flash.", "Aparência", "Tem certeza?", "Cores BGR", @@ -106,7 +107,7 @@ "Apagando os dados do usuário..", "Erro:", "Esc", - "Executar um Krux app assinado?", + "Executar %s aplicativo Krux?", "Explorar arquivos?", "Exportando para o cartão SD..", "Chave Pública Estendida", @@ -303,7 +304,6 @@ "Código de verificação definido com sucesso", "Os códigos de verificação não correspondem", "Texto", - "The app will be copied to user's flash ", "Tema", "Térmica", "Para garantir que os dados sejam irrecuperáveis, use o recurso Limpar Dispositivo", @@ -315,6 +315,7 @@ "Digitar a senha BIP39", "Digite a Chave", "Unidade", + "Aplicativos não assinados encontrados em flash serão excluídos.", "Atualização completa.", "Use uma superfície de fundo preta.", "Use a entropia da câmera para criar um novo mnemônico", diff --git a/src/krux/translations/ru.py b/src/krux/translations/ru.py index 0c3d1acfd..5577afe1f 100644 --- a/src/krux/translations/ru.py +++ b/src/krux/translations/ru.py @@ -42,6 +42,7 @@ "Сначала разрешите в настройках!", "Антиблик отключен", "Антиблик включен", + "Приложение будет храниться во флэш-памяти.", "Внешний Вид", "Вы уверены?", "Цвета BGR", @@ -106,7 +107,7 @@ "Удаление данных пользователя..", "Ошибка:", "Выйти", - "Выполнить подписанное приложение Krux?", + "Запустить приложение %s Krux?", "Исследовать файлы?", "Экспортирование на SD карту..", "Расширенный Публичный Ключ", @@ -303,7 +304,6 @@ "Код проверки вскрытия успешно установлен", "Коды проверки вскрытия не совпадают", "Текст", - "The app will be copied to user's flash ", "Тема", "Термальный", "Для гарантии невосстановления данных используйте функцию Очистки Устройства", @@ -315,6 +315,7 @@ "Ввести BIP39 фразу-пароль", "Ввести Ключ", "Единица Измерения", + "Неподписанные приложения, найденные во флэш-памяти, будут удалены.", "Обновление завершено.", "Использовать черную фоновую поверхность.", "Использовать энтропию камеры, чтобы создать новую мнемонику", diff --git a/src/krux/translations/tr.py b/src/krux/translations/tr.py index c15f5c91d..ba16af21e 100644 --- a/src/krux/translations/tr.py +++ b/src/krux/translations/tr.py @@ -42,6 +42,7 @@ "Önce ayarlarda izin ver!", "Parlama önleyici devre dışı", "Parlama önleyici etkin", + "Uygulama flaşta dahili olarak depolanacaktır.", "Görünüm", "Emin misiniz?", "BGR Renkleri", @@ -106,7 +107,7 @@ "Kullanıcının verileri siliniyor..", "Hata:", "Çıkış", - "İmzalı bir Krux uygulaması çalıştırılsın mı?", + "%s Krux uygulaması çalıştırılsın mı?", "Dosyaları ara?", "SD karta aktarılıyor..", "Genişletilmiş Public Key", @@ -303,7 +304,6 @@ "Kurcalama kontrol kodu başarıyla ayarlandı", "Kurcalama kontrol kodları eşleşmiyor", "Metin", - "The app will be copied to user's flash ", "Tema", "Termal", "Verilerin geri kullanılamaz olduğundan emin olmak için Cihazı Sil özelliğini kullanın", @@ -315,6 +315,7 @@ "BIP39 parolasını yazın", "Anahtar Yaz", "Birim", + "Flash'ta bulunan imzasız uygulamalar silinecek.", "Güncelleme tamamlandı.", "Siyah bir arka plan yüzeyi kullanın.", "Yeni bir mnemonic oluşturmak için kameranın entropisini kullanın", diff --git a/src/krux/translations/vi.py b/src/krux/translations/vi.py index 1f93aee07..1173c5e78 100644 --- a/src/krux/translations/vi.py +++ b/src/krux/translations/vi.py @@ -42,6 +42,7 @@ "Cho phép cài đặt trước!", "Chống lóa bị vô hiệu hóa", "Đã bật chống lóa", + "Ứng dụng sẽ được lưu trữ nội bộ trên flash.", "Giao diện", "Bạn có chắc không?", "Màu BGR", @@ -106,7 +107,7 @@ "Đang xóa dữ liệu của người dùng..", "Lỗi:", "Esc", - "Thực thi một ứng dụng Krux đã ký?", + "Thực thi %s ứng dụng Krux?", "Khám phá các tập tin?", "Xuất vào thẻ SD ..", "Khóa công cộng", @@ -303,7 +304,6 @@ "Đã đặt mã kiểm tra giả mạo thành công", "Mã kiểm tra giả mạo không khớp", "Chữ", - "The app will be copied to user's flash ", "Chủ đề", "Nhiệt", "Sử dụng tính năng Xóa dữ liệu trên thiết bị để đảm bảo dữ liệu không thể phục hồi", @@ -315,6 +315,7 @@ "Nhập cụm mật khẩu BIP39", "Nhập khóa", "Đơn vị", + "Các ứng dụng chưa ký được tìm thấy trong flash sẽ bị xóa.", "Nâng cấp hoàn tất.", "Sử dụng bề mặt nền đen.", "Sử dụng sự ngẫu nhiên của máy ảnh để tạo ra một Mnemonic mới", diff --git a/src/krux/translations/zh.py b/src/krux/translations/zh.py index 65fdba2b3..9bad5a028 100644 --- a/src/krux/translations/zh.py +++ b/src/krux/translations/zh.py @@ -42,6 +42,7 @@ "首先在设置中允许!", "防眩光已禁用", "防眩光已启用", + "应用程序将内部存储在闪存中。", "界面", "确定?", "BGR 颜色", @@ -106,7 +107,7 @@ "正在擦除用户数据..", "错误:", "退出", - "是否执行签名的Krux应用程序?", + "是否执行%s Krux应用程序?", "浏览文件?", "导出到 SD 卡..", "扩展公钥", @@ -303,7 +304,6 @@ "防篡改检查码设置成功", "防篡改检查码不匹配", "文本", - "The app will be copied to user's flash ", "主题", "热敏", "要确保数据不可恢复,请使用擦除设备功能", @@ -315,6 +315,7 @@ "输入 BIP39 Phrasephrase", "输入私钥", "单位", + "在Flash中找到的未签名应用将被删除。", "升级已完成。", "使用黑色背景界面。", "使用摄像头的熵创建新助记词", From 49705bbdf1c358c170c797929449222979dc2318 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Mon, 9 Dec 2024 00:30:02 -0300 Subject: [PATCH 26/86] Fixed file not being closed() --- src/krux/pages/kapps.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/krux/pages/kapps.py b/src/krux/pages/kapps.py index d82e3090c..d72214bc3 100644 --- a/src/krux/pages/kapps.py +++ b/src/krux/pages/kapps.py @@ -72,9 +72,13 @@ def _parse_all_flash_apps(self): if file.endswith(MPY_FILE_EXTENSION): # Check if signature file exists for the .mpy file try: - sig_data = open( - flash_path_prefix + file + SIGNATURE_FILE_EXTENSION, "rb" - ).read() + sig_data = None + with open( + flash_path_prefix + file + SIGNATURE_FILE_EXTENSION, + "rb", + buffering=0, + ) as sigfile: + sig_data = sigfile.read() if self._valid_signature( sig_data, sha256(flash_path_prefix + file) ): @@ -196,9 +200,10 @@ def load_sd_kapp(self): # pylint: disable=R1710 # Check signature of .mpy file in SD sig_data = None try: - sig_data = open( - sd_path_prefix + filename + SIGNATURE_FILE_EXTENSION, "rb" - ).read() + with open( + sd_path_prefix + filename + SIGNATURE_FILE_EXTENSION, "rb", buffering=0 + ) as sigfile: + sig_data = sigfile.read() except: self.flash_error(t("Missing signature file")) return MENU_CONTINUE @@ -242,6 +247,7 @@ def load_sd_kapp(self): # pylint: disable=R1710 with open( flash_path_prefix + filename + SIGNATURE_FILE_EXTENSION, "wb", + buffering=0, ) as kapp_sig_file: kapp_sig_file.write(sig_data) From 823fe59a51210e83b3f1687d9f7ab54c992ee4f3 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Tue, 10 Dec 2024 09:34:03 -0300 Subject: [PATCH 27/86] reuse of pubkey and signature firmware functions --- src/krux/firmware.py | 37 ++++++++++++++++++++++++++----------- src/krux/pages/kapps.py | 15 ++++----------- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/krux/firmware.py b/src/krux/firmware.py index 03bdf9693..81e042b34 100644 --- a/src/krux/firmware.py +++ b/src/krux/firmware.py @@ -172,6 +172,29 @@ def sha256(firmware_filename, firmware_size=None): return hasher.digest() +def check_signature(pubkey, sig, file_hash): + """Return if signature of the file_hash is valid for the pubkey""" + + try: + # Parse, serialize, and reparse to ensure signature is compact prior to verification + sig = ec.Signature.parse(ec.Signature.parse(sig).serialize()) + if not pubkey.verify(sig, file_hash): + return False + except: + return False + + return True + + +def get_pubkey(): + """Construct the pubkey based on Krux metadata pubkey string""" + + try: + return ec.PublicKey.from_string(SIGNER_PUBKEY) + except: + return None + + def upgrade(): """Installs new firmware from SD card""" @@ -220,10 +243,8 @@ def status_text(text): display.flash_text("Firmware exceeds max size: %d" % MAX_FIRMWARE_SIZE) return False - pubkey = None - try: - pubkey = ec.PublicKey.from_string(SIGNER_PUBKEY) - except: + pubkey = get_pubkey() + if pubkey is None: display.flash_text("Invalid public key") return False @@ -234,13 +255,7 @@ def status_text(text): display.flash_text(t("Missing signature file")) return False - try: - # Parse, serialize, and reparse to ensure signature is compact prior to verification - sig = ec.Signature.parse(ec.Signature.parse(sig).serialize()) - if not pubkey.verify(sig, firmware_hash): - display.flash_text(t("Bad signature")) - return False - except: + if not check_signature(pubkey, sig, firmware_hash): display.flash_text(t("Bad signature")) return False diff --git a/src/krux/pages/kapps.py b/src/krux/pages/kapps.py index d72214bc3..029982291 100644 --- a/src/krux/pages/kapps.py +++ b/src/krux/pages/kapps.py @@ -110,20 +110,13 @@ def _valid_signature(self, sig, data_hash): from embit import ec from ..metadata import SIGNER_PUBKEY + from krux.firmware import get_pubkey, check_signature - pubkey = None - try: - pubkey = ec.PublicKey.from_string(SIGNER_PUBKEY) - except: + pubkey = get_pubkey() + if pubkey is None: raise ValueError("Invalid public key") - try: - # Parse, serialize, and reparse to ensure signature is compact prior to verification - sig = ec.Signature.parse(ec.Signature.parse(sig).serialize()) - - if not pubkey.verify(sig, data_hash): - return False - except: + if not check_signature(pubkey, sig, data_hash): return False return True From 9a31b6aaaffc110f4ad70d497c3fe0d8f1b68279 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Tue, 10 Dec 2024 09:35:31 -0300 Subject: [PATCH 28/86] reuse function for shutdown btn --- src/krux/pages/__init__.py | 5 +++++ src/krux/pages/home_pages/home.py | 5 +---- src/krux/pages/login.py | 5 +---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/krux/pages/__init__.py b/src/krux/pages/__init__.py index 59e86860b..e95638dcd 100644 --- a/src/krux/pages/__init__.py +++ b/src/krux/pages/__init__.py @@ -450,6 +450,11 @@ def has_sd_card(self): except: return False + def shutdown_menu_item(self, ctx): + """Returns the Shutdown or Reboot Menu item""" + label = t("Shutdown") if ctx.power_manager.has_battery() else t("Reboot") + return (label, self.shutdown) + def shutdown(self): """Handler for the 'shutdown' menu item""" if self.prompt(t("Are you sure?"), self.ctx.display.height() // 2): diff --git a/src/krux/pages/home_pages/home.py b/src/krux/pages/home_pages/home.py index 8285e9933..243288e92 100644 --- a/src/krux/pages/home_pages/home.py +++ b/src/krux/pages/home_pages/home.py @@ -41,9 +41,6 @@ class Home(Page): """Home is the main menu page of the app""" def __init__(self, ctx): - shtn_reboot_label = ( - t("Shutdown") if ctx.power_manager.has_battery() else t("Reboot") - ) super().__init__( ctx, Menu( @@ -61,7 +58,7 @@ def __init__(self, ctx): (t("Wallet"), self.wallet), (t("Address"), self.addresses_menu), (t("Sign"), self.sign), - (shtn_reboot_label, self.shutdown), + self.shutdown_menu_item(ctx), ], back_label=None, ), diff --git a/src/krux/pages/login.py b/src/krux/pages/login.py index 84b473e6d..d8ea4d2b0 100644 --- a/src/krux/pages/login.py +++ b/src/krux/pages/login.py @@ -50,9 +50,6 @@ class Login(Page): SETTINGS_MENU_INDEX = 2 def __init__(self, ctx): - shtn_reboot_label = ( - t("Shutdown") if ctx.power_manager.has_battery() else t("Reboot") - ) super().__init__( ctx, Menu( @@ -63,7 +60,7 @@ def __init__(self, ctx): (t("Settings"), self.settings), (t("Tools"), self.tools), (t("About"), self.about), - (shtn_reboot_label, self.shutdown), + self.shutdown_menu_item(ctx), ], back_label=None, ), From 347798e1cd7df1db5ea7d80e16ec36e7bcc87b1a Mon Sep 17 00:00:00 2001 From: tadeubas Date: Tue, 10 Dec 2024 18:10:01 -0300 Subject: [PATCH 29/86] refactor Login._load_key_from_words() --- src/krux/pages/login.py | 70 ++++++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/src/krux/pages/login.py b/src/krux/pages/login.py index d8ea4d2b0..15b9e4b6a 100644 --- a/src/krux/pages/login.py +++ b/src/krux/pages/login.py @@ -230,38 +230,37 @@ def new_key_from_snapshot(self): return self._load_key_from_words(entropy_mnemonic.split(), new=True) return MENU_CONTINUE - def _load_key_from_words(self, words, charset=LETTERS, new=False): - mnemonic = " ".join(words) - - if charset != LETTERS: - from .utils import Utils - - charset_type = { - DIGITS: Utils.BASE_DEC, - DIGITS_HEX: Utils.BASE_HEX, - DIGITS_OCT: Utils.BASE_OCT, - } - suffix_dict = { - DIGITS: Utils.BASE_DEC_SUFFIX, - DIGITS_HEX: Utils.BASE_HEX_SUFFIX, - DIGITS_OCT: Utils.BASE_OCT_SUFFIX, - } - numbers_str = Utils.get_mnemonic_numbers(mnemonic, charset_type[charset]) - self.display_mnemonic(numbers_str, suffix_dict[charset]) - if not self.prompt(t("Proceed?"), BOTTOM_PROMPT_LINE): - return MENU_CONTINUE - self.ctx.display.clear() + def _confirm_mnemonic_numbers(self, mnemonic, charset): + from .utils import Utils + + charset_type = { + DIGITS: Utils.BASE_DEC, + DIGITS_HEX: Utils.BASE_HEX, + DIGITS_OCT: Utils.BASE_OCT, + } + suffix_dict = { + DIGITS: Utils.BASE_DEC_SUFFIX, + DIGITS_HEX: Utils.BASE_HEX_SUFFIX, + DIGITS_OCT: Utils.BASE_OCT_SUFFIX, + } + numbers_str = Utils.get_mnemonic_numbers(mnemonic, charset_type[charset]) + self.display_mnemonic(numbers_str, suffix_dict[charset]) + if not self.prompt(t("Proceed?"), BOTTOM_PROMPT_LINE): + return False + return True + + def _confirm_mnemonic_letters(self, mnemonic, new): from .mnemonic_editor import MnemonicEditor # If the mnemonic is not hidden, show the mnemonic editor if not Settings().security.hide_mnemonic: mnemonic_editor = MnemonicEditor(self.ctx, mnemonic, new) mnemonic = mnemonic_editor.edit() - if mnemonic is None: - return MENU_CONTINUE - self.ctx.display.clear() + return mnemonic + + def _confirm_wallet_key(self, mnemonic): passphrase = "" multisig = Settings().wallet.multisig network = NETWORKS[Settings().wallet.network] @@ -270,7 +269,6 @@ def _load_key_from_words(self, words, charset=LETTERS, new=False): script_type = P2WSH else: script_type = SCRIPT_LONG_NAMES.get(Settings().wallet.script_type) - from ..wallet import Wallet while True: key = Key(mnemonic, multisig, network, passphrase, account, script_type) @@ -304,7 +302,7 @@ def _load_key_from_words(self, words, charset=LETTERS, new=False): if index == len(submenu.menu) - 1: if self.prompt(t("Are you sure?"), self.ctx.display.height() // 2): del key - return MENU_CONTINUE + return None if index == 0: break if index == 1: @@ -321,10 +319,30 @@ def _load_key_from_words(self, words, charset=LETTERS, new=False): network, multisig, script_type, account = ( wallet_settings.customize_wallet(key) ) + + return key + def _load_key_from_words(self, words, charset=LETTERS, new=False): + mnemonic = " ".join(words) + + if charset != LETTERS: + if not self._confirm_mnemonic_numbers(mnemonic, charset): + return MENU_CONTINUE + self.ctx.display.clear() + + mnemonic = self._confirm_mnemonic_letters(mnemonic, new) + if mnemonic is None: + return MENU_CONTINUE + self.ctx.display.clear() + + key = self._confirm_wallet_key(mnemonic) + if key is None: + return MENU_CONTINUE self.ctx.display.clear() self.ctx.display.draw_centered_text(t("Loading..")) + from ..wallet import Wallet + self.ctx.wallet = Wallet(key) return MENU_EXIT From 030279b4f8157d7a9a703c72c6a9b5ac6917772a Mon Sep 17 00:00:00 2001 From: tadeubas Date: Tue, 10 Dec 2024 22:35:41 -0300 Subject: [PATCH 30/86] kapps lint --- src/krux/pages/kapps.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/krux/pages/kapps.py b/src/krux/pages/kapps.py index 029982291..a5c656c44 100644 --- a/src/krux/pages/kapps.py +++ b/src/krux/pages/kapps.py @@ -41,7 +41,7 @@ def __init__(self, ctx): self.ctx = ctx items = [] - signed_apps = self._parse_all_flash_apps() + signed_apps = self.parse_all_flash_apps() for app_name in signed_apps: clean_name = app_name[:-4] items += [ @@ -59,7 +59,7 @@ def __init__(self, ctx): Menu(ctx, items), ) - def _parse_all_flash_apps(self): + def parse_all_flash_apps(self): """Check if any .mpy app present in flash is signed. If not, ask for deletion to prevent importing and executing malicious code""" @@ -79,9 +79,7 @@ def _parse_all_flash_apps(self): buffering=0, ) as sigfile: sig_data = sigfile.read() - if self._valid_signature( - sig_data, sha256(flash_path_prefix + file) - ): + if self.valid_signature(sig_data, sha256(flash_path_prefix + file)): signed_apps += [file] else: unsigned_apps += [file] @@ -105,11 +103,9 @@ def _parse_all_flash_apps(self): return signed_apps - def _valid_signature(self, sig, data_hash): + def valid_signature(self, sig, data_hash): """Return if signature of data_hash is valid""" - from embit import ec - from ..metadata import SIGNER_PUBKEY from krux.firmware import get_pubkey, check_signature pubkey = get_pubkey() @@ -201,7 +197,7 @@ def load_sd_kapp(self): # pylint: disable=R1710 self.flash_error(t("Missing signature file")) return MENU_CONTINUE - if not self._valid_signature(sig_data, data_hash): + if not self.valid_signature(sig_data, data_hash): self.flash_error(t("Bad signature")) return MENU_CONTINUE From d061b68fbaf558d031e6a0b1b19c8a5ceff9926b Mon Sep 17 00:00:00 2001 From: tadeubas Date: Tue, 10 Dec 2024 23:04:54 -0300 Subject: [PATCH 31/86] kapps case kapp is inside a folder --- src/krux/pages/kapps.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/krux/pages/kapps.py b/src/krux/pages/kapps.py index a5c656c44..69a21b779 100644 --- a/src/krux/pages/kapps.py +++ b/src/krux/pages/kapps.py @@ -220,8 +220,9 @@ def load_sd_kapp(self): # pylint: disable=R1710 return MENU_CONTINUE # Save APP .mpy + filename_flash = filename.split("/")[-1] with open( - flash_path_prefix + filename, + flash_path_prefix + filename_flash, "wb", buffering=0, ) as flash_file: @@ -234,7 +235,7 @@ def load_sd_kapp(self): # pylint: disable=R1710 # Save SIG .mpy.sig with open( - flash_path_prefix + filename + SIGNATURE_FILE_EXTENSION, + flash_path_prefix + filename_flash + SIGNATURE_FILE_EXTENSION, "wb", buffering=0, ) as kapp_sig_file: @@ -245,5 +246,5 @@ def load_sd_kapp(self): # pylint: disable=R1710 gc.collect() - clean_name = filename[:-4] + clean_name = filename_flash[:-4] return self.execute_flash_kapp(clean_name) From 925c120df556613764100f0e233c52d2620cdf5c Mon Sep 17 00:00:00 2001 From: tadeubas Date: Thu, 12 Dec 2024 01:28:32 -0300 Subject: [PATCH 32/86] First Nostr app version, convert 24w mnemonic to nsec --- kapps/kapp.mpy | Bin 1156 -> 1133 bytes kapps/kapp.py | 3 - kapps/nostr.mpy | Bin 0 -> 4564 bytes kapps/nostr.py | 300 +++++++++++++++++++++++++++++++++++++++++++++ simulator/kapp.py | 3 - simulator/nostr.py | 300 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 600 insertions(+), 6 deletions(-) create mode 100644 kapps/nostr.mpy create mode 100644 kapps/nostr.py create mode 100644 simulator/nostr.py diff --git a/kapps/kapp.mpy b/kapps/kapp.mpy index 4b98c25a2b803050c73371fb1915f3d9a5a21a51..8eb8d508b6303fa02c180fd80af2b7148762e884 100644 GIT binary patch delta 149 zcmZqSe9JLGiBWE&at)KK1rvh-0|Nt3E@L2LpN&Ji0Fd)vnn7HJK}<|hg+XdV5(A?O zgJ1%q3RhxMerd^uXl7Ohre*~m1_5RU1_42aK*mP<$-kL&84V|EGOIIcPYz_Zm(^}6 xU}F$qWMJSc0h-(B@1Uy{uM0GIgDj)0_T;t9+Kif$Z!)K_)q!NACOfk@0s!*_AS(a> delta 172 zcmaFM(ZV@FiBWN*at%|A4-fPndKWjVB8+t263OwqmxI)om(ZV-R3uVBjkSTGtrlpsN+H3$$*7ETgRM UjM|eAF{iNAgJfeT>##Ti0RGS>^#A|> diff --git a/kapps/kapp.py b/kapps/kapp.py index 25891506b..a73b9f141 100644 --- a/kapps/kapp.py +++ b/kapps/kapp.py @@ -60,9 +60,6 @@ def draw_wallet_indicator(self): class Kapp(Page): """Represents the page of the kapp""" - # Used on boot.py when changing the locale on Settings - SETTINGS_MENU_INDEX = 2 - def __init__(self, ctx): shtn_reboot_label = ( t("Shutdown") if ctx.power_manager.has_battery() else t("Reboot") diff --git a/kapps/nostr.mpy b/kapps/nostr.mpy new file mode 100644 index 0000000000000000000000000000000000000000..25759b620beed46a8fe28e04c73e3476e8c59306 GIT binary patch literal 4564 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 X%c6G}e{=&LL~;-OA#*nk_jUgld?YLY literal 0 HcmV?d00001 diff --git a/kapps/nostr.py b/kapps/nostr.py new file mode 100644 index 000000000..5281e2b5d --- /dev/null +++ b/kapps/nostr.py @@ -0,0 +1,300 @@ +# The MIT License (MIT) + +# Copyright (c) 2021-2024 Krux contributors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +import os + +# avoids importing from flash VSF +os.chdir("/") + +VERSION = "0.1" +NAME = "Nostr app" + +from krux.pages import Menu, MENU_CONTINUE, MENU_EXIT +from krux.pages.login import Login +from krux.pages.home_pages.home import Home +from krux.krux_settings import t, Settings +from krux.display import NARROW_SCREEN_WITH, STATUS_BAR_HEIGHT, FONT_HEIGHT +from krux.themes import theme + + +NSEC = "nsec" +PRIV_HEX = "priv_hex" +NPUB = "npub" +PUB_HEX = "pub_hex" + +FILE_SUFFIX = "-key" +FILE_EXTENSION = ".txt" + +class KMenu(Menu): + """Customizes the page's menu""" + + def draw_wallet_indicator(self): + """Customize the top bar""" + if self.ctx.is_logged_in(): + super().draw_wallet_indicator() + else: + if self.ctx.display.width() > NARROW_SCREEN_WITH: + self.ctx.display.draw_hcentered_text( + NAME, + STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, + theme.highlight_color, + theme.info_bg_color, + ) + else: + self.ctx.display.draw_string( + 24, + STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, + NAME, + theme.highlight_color, + theme.info_bg_color, + ) + + +class Klogin(Login): + """The page to insert the Key""" + + def __init__(self, ctx): + super().__init__(ctx) + self.menu = KMenu( + ctx, + [ + (t("Load Mnemonic"), self.load_key), + (t("New Mnemonic"), self.new_key), + (t("Load nsec or hex"), self.load_nsec), + (t("About"), self.about), + self.shutdown_menu_item(ctx), + ], + back_label=None, + ) + + # Follow NIP-06 ? + # Basic key derivation from mnemonic seed phrase + # https://github.com/nostr-protocol/nips/blob/master/06.md + def _confirm_wallet_key(self, mnemonic): + from krux.key import Key + from embit.networks import NETWORKS + from krux.settings import MAIN_TXT + + return Key(mnemonic, False, NETWORKS[MAIN_TXT]) + + def load_nsec(self): + submenu = Menu( + self.ctx, + [ + (t("Via Camera"), self.load_nostr_priv_cam), + (t("Via Manual Input"), self.load_nostr_priv_manual), + (t("From Storage"), self.load_nostr_priv_storage), + ], + ) + index, status = submenu.run_loop() + if index == len(submenu.menu) - 1: + return MENU_CONTINUE + return status + + def load_nostr_priv_cam(self): + print("Todo load_nsec QR / manual input") + + def load_nostr_priv_manual(self): + print("TODO load_nostr_priv_manual") + + def load_nostr_priv_storage(self): + print("TODO load_nost_priv_storage") + + def about(self): + """Handler for the 'about' menu item""" + + self.ctx.display.clear() + self.ctx.display.draw_centered_text( + "Krux app\n" + NAME + "\n\n" + t("Version") + "\n%s" % VERSION + ) + self.ctx.input.wait_for_button() + return MENU_CONTINUE + + +class Khome(Home): + """The page after loading the Key""" + + def __init__(self, ctx): + super().__init__(ctx) + + self.menu = Menu( + ctx, + [ + ( + t("Backup Mnemonic"), + ( + self.backup_mnemonic + if not Settings().security.hide_mnemonic + else None + ), + ), + (t("Nostr Keys"), self.nostr_keys), + ("BIP85", self.bip85), + (t("Sign Event"), self.sign_message), + self.shutdown_menu_item(ctx), + ], + back_label=None, + ) + + def nostr_keys(self): + """Handler for Nostr Keys menu item""" + + if len(self.ctx.wallet.key.mnemonic.split(" ")) < 24: + self.flash_error(t("Mnemonic must have 24 words!")) + return MENU_CONTINUE + else: + try: + self._get_private_key() + except: + raise ValueError("This mnemonic cannot be converted, try another") + + + submenu = Menu( + self.ctx, + [ + ( + t("Private Key"), + ( + None if Settings().security.hide_mnemonic + else lambda: self.show_key_formats([NSEC, PRIV_HEX]) + ) + ), + (t("Public Key"), lambda: self.show_key_formats([NPUB, PUB_HEX])), + ], + ) + index, status = submenu.run_loop() + if index == len(submenu.menu) - 1: + return MENU_CONTINUE + return status + + def show_key_formats(self, versions): + def _nostr_key_text(version): + def _save_nostr_to_sd(version): + from krux.pages.file_operations import SaveFile + + save_page = SaveFile(self.ctx) + title = version + FILE_SUFFIX + save_page.save_file( + self._get_nostr_key(version), + title, + title, + title + ":", + FILE_EXTENSION, + save_as_binary=False, + ) + + nostr_text_menu_items = [ + ( + t("Save to SD card"), + ( + None + if not self.has_sd_card() + else lambda ver=version: _save_nostr_to_sd(ver) + ), + ), + ] + full_nostr_key = self._get_nostr_title(version) + ":\n\n" + str(self._get_nostr_key(version)) + menu_offset = 5 + len(self.ctx.display.to_lines(full_nostr_key)) + menu_offset *= FONT_HEIGHT + nostr_key_menu = Menu(self.ctx, nostr_text_menu_items, offset=menu_offset) + self.ctx.display.clear() + self.ctx.display.draw_hcentered_text( + full_nostr_key, + offset_y=FONT_HEIGHT, + info_box=True, + ) + nostr_key_menu.run_loop() + + def _nostr_key_qr(version): + title = self._get_nostr_title(version) + nostr_key = str(self._get_nostr_key(version)) + from krux.pages.qr_view import SeedQRView + + seed_qr_view = SeedQRView(self.ctx, data=nostr_key, title=title) + seed_qr_view.display_qr(allow_export=True, transcript_tools=False) + + pub_key_menu_items = [] + for version in versions: + title = version if version not in (PRIV_HEX, PUB_HEX) else "hex" + pub_key_menu_items.append( + (title + " - " + t("Text"), lambda ver=version: _nostr_key_text(ver)) + ) + pub_key_menu_items.append( + (title + " - " + t("QR Code"), lambda ver=version: _nostr_key_qr(ver)) + ) + pub_key_menu = Menu(self.ctx, pub_key_menu_items) + while True: + _, status = pub_key_menu.run_loop() + if status == MENU_EXIT: + break + + return MENU_CONTINUE + + + def _get_nostr_title(self, version): + if version == NPUB: + return "Public Key npub" + elif version == PUB_HEX: + return "Public Key hex" + elif version == NSEC: + return "Private Key nsec" + return "Private Key hex" + + def _get_nostr_key(self, version): + + def _encode_nostr_key(bits, version): + from embit import bech32 + + converted_bits = bech32.convertbits(bits, 8, 5) + return bech32.bech32_encode(bech32.Encoding.BECH32, version, converted_bits) + + if version in (NPUB, PUB_HEX): + pub_key = self._get_private_key().get_public_key().serialize()[1:] + if version == NPUB: + return _encode_nostr_key(pub_key, version) + return pub_key.hex() + else: + if version == NSEC: + return _encode_nostr_key(self._get_mnemonic_bytes(), version) + return self._get_mnemonic_bytes().hex() + + def _get_mnemonic_bytes(self): + from embit import bip39 + + mnemonic = self.ctx.wallet.key.mnemonic + return bip39.mnemonic_to_bytes(mnemonic, ignore_checksum=True) + + def _get_private_key(self): + from embit import ec + + return ec.PrivateKey(self._get_mnemonic_bytes()) + +def run(ctx): + """Runs this kapp""" + + Klogin(ctx).run() + + if ctx.is_logged_in(): + while True: + if not Khome(ctx).run(): + break + + print("Exited!!!!") diff --git a/simulator/kapp.py b/simulator/kapp.py index 25891506b..a73b9f141 100644 --- a/simulator/kapp.py +++ b/simulator/kapp.py @@ -60,9 +60,6 @@ def draw_wallet_indicator(self): class Kapp(Page): """Represents the page of the kapp""" - # Used on boot.py when changing the locale on Settings - SETTINGS_MENU_INDEX = 2 - def __init__(self, ctx): shtn_reboot_label = ( t("Shutdown") if ctx.power_manager.has_battery() else t("Reboot") diff --git a/simulator/nostr.py b/simulator/nostr.py new file mode 100644 index 000000000..5281e2b5d --- /dev/null +++ b/simulator/nostr.py @@ -0,0 +1,300 @@ +# The MIT License (MIT) + +# Copyright (c) 2021-2024 Krux contributors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +import os + +# avoids importing from flash VSF +os.chdir("/") + +VERSION = "0.1" +NAME = "Nostr app" + +from krux.pages import Menu, MENU_CONTINUE, MENU_EXIT +from krux.pages.login import Login +from krux.pages.home_pages.home import Home +from krux.krux_settings import t, Settings +from krux.display import NARROW_SCREEN_WITH, STATUS_BAR_HEIGHT, FONT_HEIGHT +from krux.themes import theme + + +NSEC = "nsec" +PRIV_HEX = "priv_hex" +NPUB = "npub" +PUB_HEX = "pub_hex" + +FILE_SUFFIX = "-key" +FILE_EXTENSION = ".txt" + +class KMenu(Menu): + """Customizes the page's menu""" + + def draw_wallet_indicator(self): + """Customize the top bar""" + if self.ctx.is_logged_in(): + super().draw_wallet_indicator() + else: + if self.ctx.display.width() > NARROW_SCREEN_WITH: + self.ctx.display.draw_hcentered_text( + NAME, + STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, + theme.highlight_color, + theme.info_bg_color, + ) + else: + self.ctx.display.draw_string( + 24, + STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, + NAME, + theme.highlight_color, + theme.info_bg_color, + ) + + +class Klogin(Login): + """The page to insert the Key""" + + def __init__(self, ctx): + super().__init__(ctx) + self.menu = KMenu( + ctx, + [ + (t("Load Mnemonic"), self.load_key), + (t("New Mnemonic"), self.new_key), + (t("Load nsec or hex"), self.load_nsec), + (t("About"), self.about), + self.shutdown_menu_item(ctx), + ], + back_label=None, + ) + + # Follow NIP-06 ? + # Basic key derivation from mnemonic seed phrase + # https://github.com/nostr-protocol/nips/blob/master/06.md + def _confirm_wallet_key(self, mnemonic): + from krux.key import Key + from embit.networks import NETWORKS + from krux.settings import MAIN_TXT + + return Key(mnemonic, False, NETWORKS[MAIN_TXT]) + + def load_nsec(self): + submenu = Menu( + self.ctx, + [ + (t("Via Camera"), self.load_nostr_priv_cam), + (t("Via Manual Input"), self.load_nostr_priv_manual), + (t("From Storage"), self.load_nostr_priv_storage), + ], + ) + index, status = submenu.run_loop() + if index == len(submenu.menu) - 1: + return MENU_CONTINUE + return status + + def load_nostr_priv_cam(self): + print("Todo load_nsec QR / manual input") + + def load_nostr_priv_manual(self): + print("TODO load_nostr_priv_manual") + + def load_nostr_priv_storage(self): + print("TODO load_nost_priv_storage") + + def about(self): + """Handler for the 'about' menu item""" + + self.ctx.display.clear() + self.ctx.display.draw_centered_text( + "Krux app\n" + NAME + "\n\n" + t("Version") + "\n%s" % VERSION + ) + self.ctx.input.wait_for_button() + return MENU_CONTINUE + + +class Khome(Home): + """The page after loading the Key""" + + def __init__(self, ctx): + super().__init__(ctx) + + self.menu = Menu( + ctx, + [ + ( + t("Backup Mnemonic"), + ( + self.backup_mnemonic + if not Settings().security.hide_mnemonic + else None + ), + ), + (t("Nostr Keys"), self.nostr_keys), + ("BIP85", self.bip85), + (t("Sign Event"), self.sign_message), + self.shutdown_menu_item(ctx), + ], + back_label=None, + ) + + def nostr_keys(self): + """Handler for Nostr Keys menu item""" + + if len(self.ctx.wallet.key.mnemonic.split(" ")) < 24: + self.flash_error(t("Mnemonic must have 24 words!")) + return MENU_CONTINUE + else: + try: + self._get_private_key() + except: + raise ValueError("This mnemonic cannot be converted, try another") + + + submenu = Menu( + self.ctx, + [ + ( + t("Private Key"), + ( + None if Settings().security.hide_mnemonic + else lambda: self.show_key_formats([NSEC, PRIV_HEX]) + ) + ), + (t("Public Key"), lambda: self.show_key_formats([NPUB, PUB_HEX])), + ], + ) + index, status = submenu.run_loop() + if index == len(submenu.menu) - 1: + return MENU_CONTINUE + return status + + def show_key_formats(self, versions): + def _nostr_key_text(version): + def _save_nostr_to_sd(version): + from krux.pages.file_operations import SaveFile + + save_page = SaveFile(self.ctx) + title = version + FILE_SUFFIX + save_page.save_file( + self._get_nostr_key(version), + title, + title, + title + ":", + FILE_EXTENSION, + save_as_binary=False, + ) + + nostr_text_menu_items = [ + ( + t("Save to SD card"), + ( + None + if not self.has_sd_card() + else lambda ver=version: _save_nostr_to_sd(ver) + ), + ), + ] + full_nostr_key = self._get_nostr_title(version) + ":\n\n" + str(self._get_nostr_key(version)) + menu_offset = 5 + len(self.ctx.display.to_lines(full_nostr_key)) + menu_offset *= FONT_HEIGHT + nostr_key_menu = Menu(self.ctx, nostr_text_menu_items, offset=menu_offset) + self.ctx.display.clear() + self.ctx.display.draw_hcentered_text( + full_nostr_key, + offset_y=FONT_HEIGHT, + info_box=True, + ) + nostr_key_menu.run_loop() + + def _nostr_key_qr(version): + title = self._get_nostr_title(version) + nostr_key = str(self._get_nostr_key(version)) + from krux.pages.qr_view import SeedQRView + + seed_qr_view = SeedQRView(self.ctx, data=nostr_key, title=title) + seed_qr_view.display_qr(allow_export=True, transcript_tools=False) + + pub_key_menu_items = [] + for version in versions: + title = version if version not in (PRIV_HEX, PUB_HEX) else "hex" + pub_key_menu_items.append( + (title + " - " + t("Text"), lambda ver=version: _nostr_key_text(ver)) + ) + pub_key_menu_items.append( + (title + " - " + t("QR Code"), lambda ver=version: _nostr_key_qr(ver)) + ) + pub_key_menu = Menu(self.ctx, pub_key_menu_items) + while True: + _, status = pub_key_menu.run_loop() + if status == MENU_EXIT: + break + + return MENU_CONTINUE + + + def _get_nostr_title(self, version): + if version == NPUB: + return "Public Key npub" + elif version == PUB_HEX: + return "Public Key hex" + elif version == NSEC: + return "Private Key nsec" + return "Private Key hex" + + def _get_nostr_key(self, version): + + def _encode_nostr_key(bits, version): + from embit import bech32 + + converted_bits = bech32.convertbits(bits, 8, 5) + return bech32.bech32_encode(bech32.Encoding.BECH32, version, converted_bits) + + if version in (NPUB, PUB_HEX): + pub_key = self._get_private_key().get_public_key().serialize()[1:] + if version == NPUB: + return _encode_nostr_key(pub_key, version) + return pub_key.hex() + else: + if version == NSEC: + return _encode_nostr_key(self._get_mnemonic_bytes(), version) + return self._get_mnemonic_bytes().hex() + + def _get_mnemonic_bytes(self): + from embit import bip39 + + mnemonic = self.ctx.wallet.key.mnemonic + return bip39.mnemonic_to_bytes(mnemonic, ignore_checksum=True) + + def _get_private_key(self): + from embit import ec + + return ec.PrivateKey(self._get_mnemonic_bytes()) + +def run(ctx): + """Runs this kapp""" + + Klogin(ctx).run() + + if ctx.is_logged_in(): + while True: + if not Khome(ctx).run(): + break + + print("Exited!!!!") From 9b7c51af07d05ed39904f2968a73d702d9590ac0 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Thu, 12 Dec 2024 01:52:54 -0300 Subject: [PATCH 33/86] format black --- src/krux/pages/__init__.py | 2 +- src/krux/pages/login.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/krux/pages/__init__.py b/src/krux/pages/__init__.py index e95638dcd..932af286a 100644 --- a/src/krux/pages/__init__.py +++ b/src/krux/pages/__init__.py @@ -454,7 +454,7 @@ def shutdown_menu_item(self, ctx): """Returns the Shutdown or Reboot Menu item""" label = t("Shutdown") if ctx.power_manager.has_battery() else t("Reboot") return (label, self.shutdown) - + def shutdown(self): """Handler for the 'shutdown' menu item""" if self.prompt(t("Are you sure?"), self.ctx.display.height() // 2): diff --git a/src/krux/pages/login.py b/src/krux/pages/login.py index 2e417d21e..bd1805f33 100644 --- a/src/krux/pages/login.py +++ b/src/krux/pages/login.py @@ -257,7 +257,7 @@ def _confirm_mnemonic_numbers(self, mnemonic, charset): return False return True - + def _confirm_mnemonic_letters(self, mnemonic, new): from .mnemonic_editor import MnemonicEditor @@ -341,7 +341,7 @@ def _confirm_wallet_key(self, mnemonic): network, policy_type, script_type, account = ( wallet_settings.customize_wallet(key) ) - + return key def _load_key_from_words(self, words, charset=LETTERS, new=False): From 59b00f48ebc2b355937827f20dce236596126cf3 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Thu, 12 Dec 2024 02:06:27 -0300 Subject: [PATCH 34/86] lint --- kapps/nostr.py | 120 ++++++++++++++++++++++------------------ simulator/nostr.py | 39 +++++++------ src/krux/pages/kapps.py | 2 +- src/krux/pages/login.py | 1 - 4 files changed, 88 insertions(+), 74 deletions(-) diff --git a/kapps/nostr.py b/kapps/nostr.py index 5281e2b5d..368eeb33d 100644 --- a/kapps/nostr.py +++ b/kapps/nostr.py @@ -43,6 +43,7 @@ FILE_SUFFIX = "-key" FILE_EXTENSION = ".txt" + class KMenu(Menu): """Customizes the page's menu""" @@ -74,17 +75,17 @@ class Klogin(Login): def __init__(self, ctx): super().__init__(ctx) self.menu = KMenu( - ctx, - [ - (t("Load Mnemonic"), self.load_key), - (t("New Mnemonic"), self.new_key), - (t("Load nsec or hex"), self.load_nsec), - (t("About"), self.about), - self.shutdown_menu_item(ctx), - ], - back_label=None, - ) - + ctx, + [ + (t("Load Mnemonic"), self.load_key), + (t("New Mnemonic"), self.new_key), + (t("Load nsec or hex"), self.load_nsec), + (t("About"), self.about), + self.shutdown_menu_item(ctx), + ], + back_label=None, + ) + # Follow NIP-06 ? # Basic key derivation from mnemonic seed phrase # https://github.com/nostr-protocol/nips/blob/master/06.md @@ -94,29 +95,34 @@ def _confirm_wallet_key(self, mnemonic): from krux.settings import MAIN_TXT return Key(mnemonic, False, NETWORKS[MAIN_TXT]) - + def load_nsec(self): + """Load nsec or hex menu item""" + submenu = Menu( self.ctx, [ - (t("Via Camera"), self.load_nostr_priv_cam), - (t("Via Manual Input"), self.load_nostr_priv_manual), - (t("From Storage"), self.load_nostr_priv_storage), + (t("Via Camera"), self._load_nostr_priv_cam), + (t("Via Manual Input"), self._load_nostr_priv_manual), + (t("From Storage"), self._load_nostr_priv_storage), ], ) index, status = submenu.run_loop() if index == len(submenu.menu) - 1: return MENU_CONTINUE return status - - def load_nostr_priv_cam(self): + + def _load_nostr_priv_cam(self): print("Todo load_nsec QR / manual input") + return MENU_CONTINUE - def load_nostr_priv_manual(self): + def _load_nostr_priv_manual(self): print("TODO load_nostr_priv_manual") + return MENU_CONTINUE - def load_nostr_priv_storage(self): + def _load_nostr_priv_storage(self): print("TODO load_nost_priv_storage") + return MENU_CONTINUE def about(self): """Handler for the 'about' menu item""" @@ -134,38 +140,36 @@ class Khome(Home): def __init__(self, ctx): super().__init__(ctx) - + self.menu = Menu( - ctx, - [ + ctx, + [ + ( + t("Backup Mnemonic"), ( - t("Backup Mnemonic"), - ( - self.backup_mnemonic - if not Settings().security.hide_mnemonic - else None - ), + self.backup_mnemonic + if not Settings().security.hide_mnemonic + else None ), - (t("Nostr Keys"), self.nostr_keys), - ("BIP85", self.bip85), - (t("Sign Event"), self.sign_message), - self.shutdown_menu_item(ctx), - ], - back_label=None, - ) - + ), + (t("Nostr Keys"), self.nostr_keys), + ("BIP85", self.bip85), + (t("Sign Event"), self.sign_message), + self.shutdown_menu_item(ctx), + ], + back_label=None, + ) + def nostr_keys(self): """Handler for Nostr Keys menu item""" if len(self.ctx.wallet.key.mnemonic.split(" ")) < 24: self.flash_error(t("Mnemonic must have 24 words!")) return MENU_CONTINUE - else: - try: - self._get_private_key() - except: - raise ValueError("This mnemonic cannot be converted, try another") - + try: + self._get_private_key() + except: + raise ValueError("This mnemonic cannot be converted, try another") submenu = Menu( self.ctx, @@ -173,9 +177,10 @@ def nostr_keys(self): ( t("Private Key"), ( - None if Settings().security.hide_mnemonic + None + if Settings().security.hide_mnemonic else lambda: self.show_key_formats([NSEC, PRIV_HEX]) - ) + ), ), (t("Public Key"), lambda: self.show_key_formats([NPUB, PUB_HEX])), ], @@ -186,6 +191,8 @@ def nostr_keys(self): return status def show_key_formats(self, versions): + """Create menu to select Nostr keys in text or QR""" + def _nostr_key_text(version): def _save_nostr_to_sd(version): from krux.pages.file_operations import SaveFile @@ -211,7 +218,11 @@ def _save_nostr_to_sd(version): ), ), ] - full_nostr_key = self._get_nostr_title(version) + ":\n\n" + str(self._get_nostr_key(version)) + full_nostr_key = ( + self._get_nostr_title(version) + + ":\n\n" + + str(self._get_nostr_key(version)) + ) menu_offset = 5 + len(self.ctx.display.to_lines(full_nostr_key)) menu_offset *= FONT_HEIGHT nostr_key_menu = Menu(self.ctx, nostr_text_menu_items, offset=menu_offset) @@ -222,7 +233,7 @@ def _save_nostr_to_sd(version): info_box=True, ) nostr_key_menu.run_loop() - + def _nostr_key_qr(version): title = self._get_nostr_title(version) nostr_key = str(self._get_nostr_key(version)) @@ -248,16 +259,15 @@ def _nostr_key_qr(version): return MENU_CONTINUE - def _get_nostr_title(self, version): if version == NPUB: return "Public Key npub" - elif version == PUB_HEX: + if version == PUB_HEX: return "Public Key hex" - elif version == NSEC: + if version == NSEC: return "Private Key nsec" return "Private Key hex" - + def _get_nostr_key(self, version): def _encode_nostr_key(bits, version): @@ -271,22 +281,22 @@ def _encode_nostr_key(bits, version): if version == NPUB: return _encode_nostr_key(pub_key, version) return pub_key.hex() - else: - if version == NSEC: - return _encode_nostr_key(self._get_mnemonic_bytes(), version) - return self._get_mnemonic_bytes().hex() + if version == NSEC: + return _encode_nostr_key(self._get_mnemonic_bytes(), version) + return self._get_mnemonic_bytes().hex() def _get_mnemonic_bytes(self): from embit import bip39 mnemonic = self.ctx.wallet.key.mnemonic return bip39.mnemonic_to_bytes(mnemonic, ignore_checksum=True) - + def _get_private_key(self): from embit import ec return ec.PrivateKey(self._get_mnemonic_bytes()) + def run(ctx): """Runs this kapp""" diff --git a/simulator/nostr.py b/simulator/nostr.py index 5281e2b5d..c5d778d5f 100644 --- a/simulator/nostr.py +++ b/simulator/nostr.py @@ -96,12 +96,14 @@ def _confirm_wallet_key(self, mnemonic): return Key(mnemonic, False, NETWORKS[MAIN_TXT]) def load_nsec(self): + """Load nsec or hex menu item""" + submenu = Menu( self.ctx, [ - (t("Via Camera"), self.load_nostr_priv_cam), - (t("Via Manual Input"), self.load_nostr_priv_manual), - (t("From Storage"), self.load_nostr_priv_storage), + (t("Via Camera"), self._load_nostr_priv_cam), + (t("Via Manual Input"), self._load_nostr_priv_manual), + (t("From Storage"), self._load_nostr_priv_storage), ], ) index, status = submenu.run_loop() @@ -109,14 +111,17 @@ def load_nsec(self): return MENU_CONTINUE return status - def load_nostr_priv_cam(self): + def _load_nostr_priv_cam(self): print("Todo load_nsec QR / manual input") + return MENU_CONTINUE - def load_nostr_priv_manual(self): + def _load_nostr_priv_manual(self): print("TODO load_nostr_priv_manual") + return MENU_CONTINUE - def load_nostr_priv_storage(self): + def _load_nostr_priv_storage(self): print("TODO load_nost_priv_storage") + return MENU_CONTINUE def about(self): """Handler for the 'about' menu item""" @@ -160,11 +165,10 @@ def nostr_keys(self): if len(self.ctx.wallet.key.mnemonic.split(" ")) < 24: self.flash_error(t("Mnemonic must have 24 words!")) return MENU_CONTINUE - else: - try: - self._get_private_key() - except: - raise ValueError("This mnemonic cannot be converted, try another") + try: + self._get_private_key() + except: + raise ValueError("This mnemonic cannot be converted, try another") submenu = Menu( @@ -186,6 +190,8 @@ def nostr_keys(self): return status def show_key_formats(self, versions): + """Create menu to select Nostr keys in text or QR""" + def _nostr_key_text(version): def _save_nostr_to_sd(version): from krux.pages.file_operations import SaveFile @@ -252,9 +258,9 @@ def _nostr_key_qr(version): def _get_nostr_title(self, version): if version == NPUB: return "Public Key npub" - elif version == PUB_HEX: + if version == PUB_HEX: return "Public Key hex" - elif version == NSEC: + if version == NSEC: return "Private Key nsec" return "Private Key hex" @@ -271,10 +277,9 @@ def _encode_nostr_key(bits, version): if version == NPUB: return _encode_nostr_key(pub_key, version) return pub_key.hex() - else: - if version == NSEC: - return _encode_nostr_key(self._get_mnemonic_bytes(), version) - return self._get_mnemonic_bytes().hex() + if version == NSEC: + return _encode_nostr_key(self._get_mnemonic_bytes(), version) + return self._get_mnemonic_bytes().hex() def _get_mnemonic_bytes(self): from embit import bip39 diff --git a/src/krux/pages/kapps.py b/src/krux/pages/kapps.py index 69a21b779..926e236f3 100644 --- a/src/krux/pages/kapps.py +++ b/src/krux/pages/kapps.py @@ -220,7 +220,7 @@ def load_sd_kapp(self): # pylint: disable=R1710 return MENU_CONTINUE # Save APP .mpy - filename_flash = filename.split("/")[-1] + filename_flash = filename.rsplit("/", maxsplit=1)[-1] with open( flash_path_prefix + filename_flash, "wb", diff --git a/src/krux/pages/login.py b/src/krux/pages/login.py index bd1805f33..76b177ecd 100644 --- a/src/krux/pages/login.py +++ b/src/krux/pages/login.py @@ -287,7 +287,6 @@ def _confirm_wallet_key(self, mnemonic): script_type = SCRIPT_LONG_NAMES.get(Settings().wallet.script_type) else: script_type = P2WSH - from ..wallet import Wallet while True: key = Key(mnemonic, policy_type, network, passphrase, account, script_type) From 673b1d7bf15056b3a71844627f90d4d4d7e7a239 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Thu, 12 Dec 2024 16:38:44 -0300 Subject: [PATCH 35/86] when Kapp presents error, inform user and shutdown --- src/krux/pages/kapps.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/krux/pages/kapps.py b/src/krux/pages/kapps.py index 926e236f3..1536f67fd 100644 --- a/src/krux/pages/kapps.py +++ b/src/krux/pages/kapps.py @@ -139,13 +139,14 @@ def execute_flash_kapp(self, app_name): # pylint: disable=R1710 # avoids importing from flash VSF os.chdir("/") - # unimport module - import sys + from krux.themes import theme - del i_kapp - del sys.modules[app_name] - - raise ValueError("Could not execute %s" % app_name) + self.ctx.display.to_portrait() + self.ctx.display.clear() + self.ctx.display.draw_centered_text( + t("Error:") + "\n" +"Could not execute %s" % app_name, theme.error_color + ) + self.ctx.input.wait_for_button() # avoids importing from flash VSF os.chdir("/") From 8f57de521a321ae139df263cc398f1cb5a1e7844 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Thu, 12 Dec 2024 17:22:20 -0300 Subject: [PATCH 36/86] Nostr app load from nsec or hex --- kapps/nostr.py | 153 ++++++++++++++++++++++---- simulator/nostr.py | 234 ++++++++++++++++++++++++++++++---------- src/krux/pages/kapps.py | 11 +- 3 files changed, 317 insertions(+), 81 deletions(-) diff --git a/kapps/nostr.py b/kapps/nostr.py index 368eeb33d..b31cf1350 100644 --- a/kapps/nostr.py +++ b/kapps/nostr.py @@ -27,20 +27,29 @@ VERSION = "0.1" NAME = "Nostr app" -from krux.pages import Menu, MENU_CONTINUE, MENU_EXIT -from krux.pages.login import Login +from krux.pages import Menu, MENU_CONTINUE, MENU_EXIT, LETTERS +from krux.pages.login import Login, DIGITS_HEX, DIGITS from krux.pages.home_pages.home import Home from krux.krux_settings import t, Settings -from krux.display import NARROW_SCREEN_WITH, STATUS_BAR_HEIGHT, FONT_HEIGHT +from krux.display import ( + NARROW_SCREEN_WITH, + STATUS_BAR_HEIGHT, + FONT_HEIGHT, + BOTTOM_PROMPT_LINE, +) from krux.themes import theme +NSEC_SIZE = 63 +HEX_SIZE = 64 + NSEC = "nsec" -PRIV_HEX = "priv_hex" +PRIV_HEX = "priv-hex" NPUB = "npub" -PUB_HEX = "pub_hex" +PUB_HEX = "pub-hex" +HEX = "hex" -FILE_SUFFIX = "-key" +FILE_SUFFIX = "-nostr" FILE_EXTENSION = ".txt" @@ -102,9 +111,25 @@ def load_nsec(self): submenu = Menu( self.ctx, [ - (t("Via Camera"), self._load_nostr_priv_cam), - (t("Via Manual Input"), self._load_nostr_priv_manual), - (t("From Storage"), self._load_nostr_priv_storage), + (t("QR Code"), self._load_nostr_priv_cam), + (t("Via Manual Input"), self._pre_load_nostr_priv_manual), + ( + t("Load from SD card"), + None if not self.has_sd_card() else self._load_nostr_priv_sd, + ), + ], + ) + index, status = submenu.run_loop() + if index == len(submenu.menu) - 1: + return MENU_CONTINUE + return status + + def _pre_load_nostr_priv_manual(self): + submenu = Menu( + self.ctx, + [ + (NSEC, lambda ver=NSEC: self._load_nostr_priv_manual(ver)), + (HEX, lambda ver=HEX: self._load_nostr_priv_manual(ver)), ], ) index, status = submenu.run_loop() @@ -113,16 +138,108 @@ def load_nsec(self): return status def _load_nostr_priv_cam(self): - print("Todo load_nsec QR / manual input") - return MENU_CONTINUE + from krux.pages.qr_capture import QRCodeCapture - def _load_nostr_priv_manual(self): - print("TODO load_nostr_priv_manual") - return MENU_CONTINUE + qr_capture = QRCodeCapture(self.ctx) + data, _ = qr_capture.qr_capture_loop() + if data is None: + self.flash_error(t("Failed to load")) + return MENU_CONTINUE - def _load_nostr_priv_storage(self): - print("TODO load_nost_priv_storage") - return MENU_CONTINUE + try: + data_str = data.decode() if not isinstance(data, str) else data + mnemonic = self._create_mnemonic_from_nostr_priv_key(data_str) + if len(mnemonic.split(" ")) != 24: + raise ValueError("Mnemonic must have 24 words") + except: + self.flash_error(t("Failed to load")) + return MENU_CONTINUE + + from krux.wallet import Wallet + + self.ctx.wallet = Wallet(self._confirm_wallet_key(mnemonic)) + + return MENU_EXIT + + def _load_nostr_priv_manual(self, version): + title = t("Private Key") + + data = "" + if version == NSEC: + data = self.capture_from_keypad( + title, [LETTERS, DIGITS], starting_buffer=NSEC + ) + else: + data = self.capture_from_keypad(title, [DIGITS_HEX]) + + data = str(data) + if len(data) > HEX_SIZE: + raise ValueError("Maximum length exceeded (%s)" % HEX_SIZE) + if version == NSEC and len(data) > NSEC_SIZE: + raise ValueError("Maximum length exceeded (%s)" % NSEC_SIZE) + + self.ctx.display.clear() + self.ctx.display.draw_hcentered_text(t("Private Key") + ":\n\n" + data) + if not self.prompt( + t("Proceed?"), + BOTTOM_PROMPT_LINE, + ): + return MENU_CONTINUE + + try: + mnemonic = self._create_mnemonic_from_nostr_priv_key(data) + if len(mnemonic.split(" ")) != 24: + raise ValueError("Mnemonic must have 24 words") + except: + self.flash_error(t("Failed to load")) + return MENU_CONTINUE + + from krux.wallet import Wallet + + self.ctx.wallet = Wallet(self._confirm_wallet_key(mnemonic)) + + return MENU_EXIT + + def _load_nostr_priv_sd(self): + from krux.pages.utils import Utils + + # Prompt user for file + filename, _ = Utils(self.ctx).load_file(prompt=False, only_get_filename=True) + + if not filename: + return MENU_CONTINUE + + from krux.sd_card import SDHandler + + data = None + mnemonic = "" + try: + with SDHandler() as sd: + data = sd.read(filename) + + data = data.replace("\r\n", "").replace("\n", "") + mnemonic = self._create_mnemonic_from_nostr_priv_key(data) + except: + self.flash_error(t("Failed to load")) + return MENU_CONTINUE + + from krux.wallet import Wallet + + self.ctx.wallet = Wallet(self._confirm_wallet_key(mnemonic)) + + return MENU_EXIT + + def _create_mnemonic_from_nostr_priv_key(self, data): + from embit import bech32, bip39 + + if data.startswith(NSEC) and len(data) == NSEC_SIZE: + _, _, data = bech32.bech32_decode(data) + decoded = bech32.convertbits(data, 5, 8, False) + return bip39.mnemonic_from_bytes(bytes(decoded)) + if len(data) == HEX_SIZE: + return bip39.mnemonic_from_bytes(bytes.fromhex(data)) + + return "" def about(self): """Handler for the 'about' menu item""" @@ -244,7 +361,7 @@ def _nostr_key_qr(version): pub_key_menu_items = [] for version in versions: - title = version if version not in (PRIV_HEX, PUB_HEX) else "hex" + title = version if version not in (PRIV_HEX, PUB_HEX) else HEX pub_key_menu_items.append( (title + " - " + t("Text"), lambda ver=version: _nostr_key_text(ver)) ) diff --git a/simulator/nostr.py b/simulator/nostr.py index c5d778d5f..b31cf1350 100644 --- a/simulator/nostr.py +++ b/simulator/nostr.py @@ -27,22 +27,32 @@ VERSION = "0.1" NAME = "Nostr app" -from krux.pages import Menu, MENU_CONTINUE, MENU_EXIT -from krux.pages.login import Login +from krux.pages import Menu, MENU_CONTINUE, MENU_EXIT, LETTERS +from krux.pages.login import Login, DIGITS_HEX, DIGITS from krux.pages.home_pages.home import Home from krux.krux_settings import t, Settings -from krux.display import NARROW_SCREEN_WITH, STATUS_BAR_HEIGHT, FONT_HEIGHT +from krux.display import ( + NARROW_SCREEN_WITH, + STATUS_BAR_HEIGHT, + FONT_HEIGHT, + BOTTOM_PROMPT_LINE, +) from krux.themes import theme +NSEC_SIZE = 63 +HEX_SIZE = 64 + NSEC = "nsec" -PRIV_HEX = "priv_hex" +PRIV_HEX = "priv-hex" NPUB = "npub" -PUB_HEX = "pub_hex" +PUB_HEX = "pub-hex" +HEX = "hex" -FILE_SUFFIX = "-key" +FILE_SUFFIX = "-nostr" FILE_EXTENSION = ".txt" + class KMenu(Menu): """Customizes the page's menu""" @@ -74,17 +84,17 @@ class Klogin(Login): def __init__(self, ctx): super().__init__(ctx) self.menu = KMenu( - ctx, - [ - (t("Load Mnemonic"), self.load_key), - (t("New Mnemonic"), self.new_key), - (t("Load nsec or hex"), self.load_nsec), - (t("About"), self.about), - self.shutdown_menu_item(ctx), - ], - back_label=None, - ) - + ctx, + [ + (t("Load Mnemonic"), self.load_key), + (t("New Mnemonic"), self.new_key), + (t("Load nsec or hex"), self.load_nsec), + (t("About"), self.about), + self.shutdown_menu_item(ctx), + ], + back_label=None, + ) + # Follow NIP-06 ? # Basic key derivation from mnemonic seed phrase # https://github.com/nostr-protocol/nips/blob/master/06.md @@ -94,34 +104,142 @@ def _confirm_wallet_key(self, mnemonic): from krux.settings import MAIN_TXT return Key(mnemonic, False, NETWORKS[MAIN_TXT]) - + def load_nsec(self): """Load nsec or hex menu item""" submenu = Menu( self.ctx, [ - (t("Via Camera"), self._load_nostr_priv_cam), - (t("Via Manual Input"), self._load_nostr_priv_manual), - (t("From Storage"), self._load_nostr_priv_storage), + (t("QR Code"), self._load_nostr_priv_cam), + (t("Via Manual Input"), self._pre_load_nostr_priv_manual), + ( + t("Load from SD card"), + None if not self.has_sd_card() else self._load_nostr_priv_sd, + ), + ], + ) + index, status = submenu.run_loop() + if index == len(submenu.menu) - 1: + return MENU_CONTINUE + return status + + def _pre_load_nostr_priv_manual(self): + submenu = Menu( + self.ctx, + [ + (NSEC, lambda ver=NSEC: self._load_nostr_priv_manual(ver)), + (HEX, lambda ver=HEX: self._load_nostr_priv_manual(ver)), ], ) index, status = submenu.run_loop() if index == len(submenu.menu) - 1: return MENU_CONTINUE return status - + def _load_nostr_priv_cam(self): - print("Todo load_nsec QR / manual input") - return MENU_CONTINUE + from krux.pages.qr_capture import QRCodeCapture - def _load_nostr_priv_manual(self): - print("TODO load_nostr_priv_manual") - return MENU_CONTINUE + qr_capture = QRCodeCapture(self.ctx) + data, _ = qr_capture.qr_capture_loop() + if data is None: + self.flash_error(t("Failed to load")) + return MENU_CONTINUE - def _load_nostr_priv_storage(self): - print("TODO load_nost_priv_storage") - return MENU_CONTINUE + try: + data_str = data.decode() if not isinstance(data, str) else data + mnemonic = self._create_mnemonic_from_nostr_priv_key(data_str) + if len(mnemonic.split(" ")) != 24: + raise ValueError("Mnemonic must have 24 words") + except: + self.flash_error(t("Failed to load")) + return MENU_CONTINUE + + from krux.wallet import Wallet + + self.ctx.wallet = Wallet(self._confirm_wallet_key(mnemonic)) + + return MENU_EXIT + + def _load_nostr_priv_manual(self, version): + title = t("Private Key") + + data = "" + if version == NSEC: + data = self.capture_from_keypad( + title, [LETTERS, DIGITS], starting_buffer=NSEC + ) + else: + data = self.capture_from_keypad(title, [DIGITS_HEX]) + + data = str(data) + if len(data) > HEX_SIZE: + raise ValueError("Maximum length exceeded (%s)" % HEX_SIZE) + if version == NSEC and len(data) > NSEC_SIZE: + raise ValueError("Maximum length exceeded (%s)" % NSEC_SIZE) + + self.ctx.display.clear() + self.ctx.display.draw_hcentered_text(t("Private Key") + ":\n\n" + data) + if not self.prompt( + t("Proceed?"), + BOTTOM_PROMPT_LINE, + ): + return MENU_CONTINUE + + try: + mnemonic = self._create_mnemonic_from_nostr_priv_key(data) + if len(mnemonic.split(" ")) != 24: + raise ValueError("Mnemonic must have 24 words") + except: + self.flash_error(t("Failed to load")) + return MENU_CONTINUE + + from krux.wallet import Wallet + + self.ctx.wallet = Wallet(self._confirm_wallet_key(mnemonic)) + + return MENU_EXIT + + def _load_nostr_priv_sd(self): + from krux.pages.utils import Utils + + # Prompt user for file + filename, _ = Utils(self.ctx).load_file(prompt=False, only_get_filename=True) + + if not filename: + return MENU_CONTINUE + + from krux.sd_card import SDHandler + + data = None + mnemonic = "" + try: + with SDHandler() as sd: + data = sd.read(filename) + + data = data.replace("\r\n", "").replace("\n", "") + mnemonic = self._create_mnemonic_from_nostr_priv_key(data) + except: + self.flash_error(t("Failed to load")) + return MENU_CONTINUE + + from krux.wallet import Wallet + + self.ctx.wallet = Wallet(self._confirm_wallet_key(mnemonic)) + + return MENU_EXIT + + def _create_mnemonic_from_nostr_priv_key(self, data): + from embit import bech32, bip39 + + if data.startswith(NSEC) and len(data) == NSEC_SIZE: + _, _, data = bech32.bech32_decode(data) + decoded = bech32.convertbits(data, 5, 8, False) + return bip39.mnemonic_from_bytes(bytes(decoded)) + if len(data) == HEX_SIZE: + return bip39.mnemonic_from_bytes(bytes.fromhex(data)) + + return "" def about(self): """Handler for the 'about' menu item""" @@ -139,26 +257,26 @@ class Khome(Home): def __init__(self, ctx): super().__init__(ctx) - + self.menu = Menu( - ctx, - [ + ctx, + [ + ( + t("Backup Mnemonic"), ( - t("Backup Mnemonic"), - ( - self.backup_mnemonic - if not Settings().security.hide_mnemonic - else None - ), + self.backup_mnemonic + if not Settings().security.hide_mnemonic + else None ), - (t("Nostr Keys"), self.nostr_keys), - ("BIP85", self.bip85), - (t("Sign Event"), self.sign_message), - self.shutdown_menu_item(ctx), - ], - back_label=None, - ) - + ), + (t("Nostr Keys"), self.nostr_keys), + ("BIP85", self.bip85), + (t("Sign Event"), self.sign_message), + self.shutdown_menu_item(ctx), + ], + back_label=None, + ) + def nostr_keys(self): """Handler for Nostr Keys menu item""" @@ -170,16 +288,16 @@ def nostr_keys(self): except: raise ValueError("This mnemonic cannot be converted, try another") - submenu = Menu( self.ctx, [ ( t("Private Key"), ( - None if Settings().security.hide_mnemonic + None + if Settings().security.hide_mnemonic else lambda: self.show_key_formats([NSEC, PRIV_HEX]) - ) + ), ), (t("Public Key"), lambda: self.show_key_formats([NPUB, PUB_HEX])), ], @@ -217,7 +335,11 @@ def _save_nostr_to_sd(version): ), ), ] - full_nostr_key = self._get_nostr_title(version) + ":\n\n" + str(self._get_nostr_key(version)) + full_nostr_key = ( + self._get_nostr_title(version) + + ":\n\n" + + str(self._get_nostr_key(version)) + ) menu_offset = 5 + len(self.ctx.display.to_lines(full_nostr_key)) menu_offset *= FONT_HEIGHT nostr_key_menu = Menu(self.ctx, nostr_text_menu_items, offset=menu_offset) @@ -228,7 +350,7 @@ def _save_nostr_to_sd(version): info_box=True, ) nostr_key_menu.run_loop() - + def _nostr_key_qr(version): title = self._get_nostr_title(version) nostr_key = str(self._get_nostr_key(version)) @@ -239,7 +361,7 @@ def _nostr_key_qr(version): pub_key_menu_items = [] for version in versions: - title = version if version not in (PRIV_HEX, PUB_HEX) else "hex" + title = version if version not in (PRIV_HEX, PUB_HEX) else HEX pub_key_menu_items.append( (title + " - " + t("Text"), lambda ver=version: _nostr_key_text(ver)) ) @@ -254,7 +376,6 @@ def _nostr_key_qr(version): return MENU_CONTINUE - def _get_nostr_title(self, version): if version == NPUB: return "Public Key npub" @@ -263,7 +384,7 @@ def _get_nostr_title(self, version): if version == NSEC: return "Private Key nsec" return "Private Key hex" - + def _get_nostr_key(self, version): def _encode_nostr_key(bits, version): @@ -286,12 +407,13 @@ def _get_mnemonic_bytes(self): mnemonic = self.ctx.wallet.key.mnemonic return bip39.mnemonic_to_bytes(mnemonic, ignore_checksum=True) - + def _get_private_key(self): from embit import ec return ec.PrivateKey(self._get_mnemonic_bytes()) + def run(ctx): """Runs this kapp""" diff --git a/src/krux/pages/kapps.py b/src/krux/pages/kapps.py index 1536f67fd..20e4a6310 100644 --- a/src/krux/pages/kapps.py +++ b/src/krux/pages/kapps.py @@ -117,7 +117,7 @@ def valid_signature(self, sig, data_hash): return True - def execute_flash_kapp(self, app_name): # pylint: disable=R1710 + def execute_flash_kapp(self, app_name): """Prompt user to load and 'execute' a .mpy Krux app""" self.ctx.display.clear() @@ -144,7 +144,8 @@ def execute_flash_kapp(self, app_name): # pylint: disable=R1710 self.ctx.display.to_portrait() self.ctx.display.clear() self.ctx.display.draw_centered_text( - t("Error:") + "\n" +"Could not execute %s" % app_name, theme.error_color + t("Error:") + "\n" + "Could not execute %s" % app_name, + theme.error_color, ) self.ctx.input.wait_for_button() @@ -156,13 +157,9 @@ def execute_flash_kapp(self, app_name): # pylint: disable=R1710 power_manager.shutdown() - def load_sd_kapp(self): # pylint: disable=R1710 + def load_sd_kapp(self): """Loads kapp from SD to flash, then executes""" - if not self.has_sd_card(): - self.flash_error(t("SD card not detected.")) - return MENU_CONTINUE - # Prompt user for .mpy file from krux.pages.utils import Utils From 2b6a464df41fcf8f8358e723172c6df950dc86a5 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Thu, 12 Dec 2024 17:34:21 -0300 Subject: [PATCH 37/86] translations --- i18n/translations/de-DE.json | 2 +- i18n/translations/es-MX.json | 2 +- i18n/translations/fr-FR.json | 4 ++-- i18n/translations/ja-JP.json | 4 ++-- i18n/translations/ko-KR.json | 2 +- i18n/translations/nl-NL.json | 2 +- i18n/translations/pt-BR.json | 2 +- i18n/translations/ru-RU.json | 2 +- i18n/translations/tr-TR.json | 2 +- i18n/translations/vi-VN.json | 2 +- i18n/translations/zh-CN.json | 2 +- src/krux/translations/__init__.py | 2 +- src/krux/translations/de.py | 2 +- src/krux/translations/es.py | 2 +- src/krux/translations/fr.py | 4 ++-- src/krux/translations/ja.py | 4 ++-- src/krux/translations/ko.py | 2 +- src/krux/translations/nl.py | 2 +- src/krux/translations/pt.py | 2 +- src/krux/translations/ru.py | 2 +- src/krux/translations/tr.py | 2 +- src/krux/translations/vi.py | 2 +- src/krux/translations/zh.py | 2 +- 23 files changed, 27 insertions(+), 27 deletions(-) diff --git a/i18n/translations/de-DE.json b/i18n/translations/de-DE.json index 576e2f56f..87f8155f1 100644 --- a/i18n/translations/de-DE.json +++ b/i18n/translations/de-DE.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "Zusätzliche Entropie von der Kamera für den AES-CBC-Modus erforderlich", "Address": "Adresse", "Align camera and backup plate properly.": "Richte Kamera und Sicherungsplatte richtig aus.", + "Allow Krux apps": "Krux-Apps zulassen", "Allow in settings first!": "Erlaube zuerst Einstellungen!", "Anti-glare disabled": "Blendschutz deaktiviert", "Anti-glare enabled": "Blendschutz aktiviert", @@ -69,7 +70,6 @@ "Driver": "Driver", "Empty": "Leer", "Enable?": "Aktivieren?", - "Enable Krux apps": "Krux-Apps aktivieren", "Encrypted": "Verschlüsselt", "Encrypted QR Code": "Verschlüsselter QR-Code", "Encrypted mnemonic was not stored": "Verschlüsselte Mnemonic wurde nicht gespeichert", diff --git a/i18n/translations/es-MX.json b/i18n/translations/es-MX.json index 7e16b1f76..84f1c2ace 100644 --- a/i18n/translations/es-MX.json +++ b/i18n/translations/es-MX.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "Se requiere entropía adicional de la cámara para el modo AES-CBC", "Address": "Dirección", "Align camera and backup plate properly.": "Alinea la cámara y la placa de respaldo correctamente.", + "Allow Krux apps": "Permitir aplicaciones Krux", "Allow in settings first!": "¡Permitir en la configuración primero!", "Anti-glare disabled": "Anti-reflejo desactivado", "Anti-glare enabled": "Anti-reflejo habilitado", @@ -69,7 +70,6 @@ "Driver": "Operador", "Empty": "Vacío", "Enable?": "¿Permitir?", - "Enable Krux apps": "Habilitar aplicaciones Krux", "Encrypted": "Cifrado", "Encrypted QR Code": "Código QR Cifrado", "Encrypted mnemonic was not stored": "Mnemónico cifrado no se almacenó", diff --git a/i18n/translations/fr-FR.json b/i18n/translations/fr-FR.json index 039acd7ec..74ea424ec 100644 --- a/i18n/translations/fr-FR.json +++ b/i18n/translations/fr-FR.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "Entropie supplémentaire de la caméra requise pour le mode AES-CBC", "Address": "Adresse", "Align camera and backup plate properly.": "Alignez correctement la caméra et plaque de sauvegarde.", + "Allow Krux apps": "Autoriser les applications Krux", "Allow in settings first!": "Autoriser d'abord dans les paramètres !", "Anti-glare disabled": "Anti-éblouissement désactivé", "Anti-glare enabled": "Anti-éblouissement activé", @@ -68,8 +69,7 @@ "Double mnemonic": "Double mnémonique", "Driver": "Pilote", "Empty": "Vide", - "Enable?": "Activer ?", - "Enable Krux apps": "Activer les applications Krux", + "Enable?": "Activer ?", "Encrypted": "Chiffré", "Encrypted QR Code": "Code QR chiffré", "Encrypted mnemonic was not stored": "Le mnémonique chiffré n'a pas été stocké", diff --git a/i18n/translations/ja-JP.json b/i18n/translations/ja-JP.json index f8d5dde7b..4a88fe618 100644 --- a/i18n/translations/ja-JP.json +++ b/i18n/translations/ja-JP.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "AES-CBCモードにはカメラからの追加エントロピーが必要です", "Address": "アドレス", "Align camera and backup plate properly.": "カメラとバックプレートを正しく整列させてください.", + "Allow Krux apps": "Kruxアプリを許可する", "Allow in settings first!": "最初に設定で許可してください!", "Anti-glare disabled": "アンチグレアが無効", "Anti-glare enabled": "アンチグレアが有効", @@ -68,8 +69,7 @@ "Double mnemonic": "ダブルニーモニック", "Driver": "ドライバー", "Empty": "空", - "Enable?": "有効化:", - "Enable Krux apps": "Kruxアプリを有効にする", + "Enable?": "有効化?", "Encrypted": "暗号化されました", "Encrypted QR Code": "暗号化されたQRコード", "Encrypted mnemonic was not stored": "暗号化されたニーモニックが保存されませんでした", diff --git a/i18n/translations/ko-KR.json b/i18n/translations/ko-KR.json index 582a37d6d..1a751da79 100644 --- a/i18n/translations/ko-KR.json +++ b/i18n/translations/ko-KR.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "AES-CBC 모드를 위해 카메라의 추가 엔트로피가 필요합니다", "Address": "주소", "Align camera and backup plate properly.": "카메라와 보조 플레이트를 올바르게 정렬하십시오.", + "Allow Krux apps": "Krux 앱 허용", "Allow in settings first!": "먼저 설정에서 허용하세요!", "Anti-glare disabled": "눈부심방지 비활성화", "Anti-glare enabled": "눈부심방지 활성화", @@ -69,7 +70,6 @@ "Driver": "드라이버", "Empty": "비어 있음", "Enable?": "활성화?", - "Enable Krux apps": "Krux 앱 활성화", "Encrypted": "암호화 후 저장", "Encrypted QR Code": "암호화된 QR 코드", "Encrypted mnemonic was not stored": "암호화된 니모닉을 저장하지 못했습니다", diff --git a/i18n/translations/nl-NL.json b/i18n/translations/nl-NL.json index 72c711c5a..3a4dbf55d 100644 --- a/i18n/translations/nl-NL.json +++ b/i18n/translations/nl-NL.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "Extra entropie van de camera vereist voor AES-CBC-modus", "Address": "Adres", "Align camera and backup plate properly.": "Richt de camera en back-upplaat op de juiste manier.", + "Allow Krux apps": "Krux-apps toestaan", "Allow in settings first!": "Sta eerst instellingen toe!", "Anti-glare disabled": "Anti reflecterend uitgeschakeld", "Anti-glare enabled": "Anti reflecterend ingeschakeld", @@ -69,7 +70,6 @@ "Driver": "Driver", "Empty": "Leeg", "Enable?": "Inschakelen?", - "Enable Krux apps": "Krux-apps inschakelen", "Encrypted": "Versleuteld", "Encrypted QR Code": "Versleutelde QR code", "Encrypted mnemonic was not stored": "Versleutelde geheugensteun was niet opgeslagen", diff --git a/i18n/translations/pt-BR.json b/i18n/translations/pt-BR.json index 954ca60dd..8b0f3e59a 100644 --- a/i18n/translations/pt-BR.json +++ b/i18n/translations/pt-BR.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "Entropia adicional da câmera necessária para o modo AES-CBC", "Address": "Endereço", "Align camera and backup plate properly.": "Alinhe a câmera e a placa de backup corretamente.", + "Allow Krux apps": "Permitir aplicativos Krux", "Allow in settings first!": "Permita nas configurações primeiro!", "Anti-glare disabled": "Antirreflexo desativado", "Anti-glare enabled": "Antirreflexo ativado", @@ -69,7 +70,6 @@ "Driver": "Driver", "Empty": "Vazio", "Enable?": "Ativar?", - "Enable Krux apps": "Ativar Krux app", "Encrypted": "Criptografado", "Encrypted QR Code": "Código QR Criptografado", "Encrypted mnemonic was not stored": "Mnemonic criptografado não foi armazenado", diff --git a/i18n/translations/ru-RU.json b/i18n/translations/ru-RU.json index f90ef6ca0..ef6e97f67 100644 --- a/i18n/translations/ru-RU.json +++ b/i18n/translations/ru-RU.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "Для режима AES-CBC требуется дополнительная энтропия от камеры", "Address": "Адрес", "Align camera and backup plate properly.": "Правильно совместите камеру и резервную пластину.", + "Allow Krux apps": "Разрешить приложения Krux", "Allow in settings first!": "Сначала разрешите в настройках!", "Anti-glare disabled": "Антиблик отключен", "Anti-glare enabled": "Антиблик включен", @@ -69,7 +70,6 @@ "Driver": "Драйвер", "Empty": "Пустой", "Enable?": "Включить?", - "Enable Krux apps": "Включить приложения Krux", "Encrypted": "Зашифровано", "Encrypted QR Code": "Зашифрованный QR Код", "Encrypted mnemonic was not stored": "Зашифрованная мнемоника не была сохранена", diff --git a/i18n/translations/tr-TR.json b/i18n/translations/tr-TR.json index be7b3f0bb..db4beb448 100644 --- a/i18n/translations/tr-TR.json +++ b/i18n/translations/tr-TR.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "AES-CBC modu için kameradan ek entropi gereklidir", "Address": "Adres", "Align camera and backup plate properly.": "Kamerayı ve yedek plakay'ı düzgün bir şekilde hizalayın.", + "Allow Krux apps": "Krux uygulamalarına izin ver", "Allow in settings first!": "Önce ayarlarda izin ver!", "Anti-glare disabled": "Parlama önleyici devre dışı", "Anti-glare enabled": "Parlama önleyici etkin", @@ -69,7 +70,6 @@ "Driver": "Sürücü", "Empty": "Boş", "Enable?": "Etkinleştir?", - "Enable Krux apps": "Krux uygulamalarını etkinleştir", "Encrypted": "Şifrelenmiş", "Encrypted QR Code": "Şifrelenmiş QR Kodu", "Encrypted mnemonic was not stored": "Şifrelenmiş mnemonic depolanmadı", diff --git a/i18n/translations/vi-VN.json b/i18n/translations/vi-VN.json index 702fb0ab4..47946a022 100644 --- a/i18n/translations/vi-VN.json +++ b/i18n/translations/vi-VN.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "Cần thêm entropy từ camera cho chế độ AES-CBC", "Address": "Địa chỉ", "Align camera and backup plate properly.": "Căn chỉnh camera và tấm dự phòng đúng cách.", + "Allow Krux apps": "Cho phép ứng dụng Krux", "Allow in settings first!": "Cho phép cài đặt trước!", "Anti-glare disabled": "Chống lóa bị vô hiệu hóa", "Anti-glare enabled": "Đã bật chống lóa", @@ -69,7 +70,6 @@ "Driver": "Driver", "Empty": "Trống", "Enable?": "Kích hoạt?", - "Enable Krux apps": "Bật ứng dụng Krux", "Encrypted": "Đã mã hóa", "Encrypted QR Code": "Mã QR được mã hóa", "Encrypted mnemonic was not stored": "Mnemonic được mã hóa không được lưu trữ", diff --git a/i18n/translations/zh-CN.json b/i18n/translations/zh-CN.json index 53dc07453..adcdc8067 100644 --- a/i18n/translations/zh-CN.json +++ b/i18n/translations/zh-CN.json @@ -17,6 +17,7 @@ "Additional entropy from camera required for AES-CBC mode": "AES-CBC 模式需要相机的额外熵", "Address": "地址", "Align camera and backup plate properly.": "正确对齐摄像头和背板。", + "Allow Krux apps": "允许Krux应用程序", "Allow in settings first!": "首先在设置中允许!", "Anti-glare disabled": "防眩光已禁用", "Anti-glare enabled": "防眩光已启用", @@ -69,7 +70,6 @@ "Driver": "驱动程序", "Empty": "为空", "Enable?": "启用?", - "Enable Krux apps": "启用Krux应用程序", "Encrypted": "已加密", "Encrypted QR Code": "加密二维码", "Encrypted mnemonic was not stored": "加密助记词未存储", diff --git a/src/krux/translations/__init__.py b/src/krux/translations/__init__.py index 64e83b6fc..2845acad4 100644 --- a/src/krux/translations/__init__.py +++ b/src/krux/translations/__init__.py @@ -51,6 +51,7 @@ 2143824150, 3270727197, 900375497, + 1329241183, 276039542, 88746165, 1521033296, @@ -103,7 +104,6 @@ 382368239, 2835747520, 1677527652, - 807457043, 3582575312, 1244124409, 2968548114, diff --git a/src/krux/translations/de.py b/src/krux/translations/de.py index c3bdd820e..42014d79d 100644 --- a/src/krux/translations/de.py +++ b/src/krux/translations/de.py @@ -39,6 +39,7 @@ "Zusätzliche Entropie von der Kamera für den AES-CBC-Modus erforderlich", "Adresse", "Richte Kamera und Sicherungsplatte richtig aus.", + "Krux-Apps zulassen", "Erlaube zuerst Einstellungen!", "Blendschutz deaktiviert", "Blendschutz aktiviert", @@ -91,7 +92,6 @@ "Driver", "Leer", "Aktivieren?", - "Krux-Apps aktivieren", "Verschlüsselt", "Verschlüsselter QR-Code", "Verschlüsselte Mnemonic wurde nicht gespeichert", diff --git a/src/krux/translations/es.py b/src/krux/translations/es.py index 14ed703b1..27d71c7c8 100644 --- a/src/krux/translations/es.py +++ b/src/krux/translations/es.py @@ -39,6 +39,7 @@ "Se requiere entropía adicional de la cámara para el modo AES-CBC", "Dirección", "Alinea la cámara y la placa de respaldo correctamente.", + "Permitir aplicaciones Krux", "¡Permitir en la configuración primero!", "Anti-reflejo desactivado", "Anti-reflejo habilitado", @@ -91,7 +92,6 @@ "Operador", "Vacío", "¿Permitir?", - "Habilitar aplicaciones Krux", "Cifrado", "Código QR Cifrado", "Mnemónico cifrado no se almacenó", diff --git a/src/krux/translations/fr.py b/src/krux/translations/fr.py index badd4be8c..df218b3b9 100644 --- a/src/krux/translations/fr.py +++ b/src/krux/translations/fr.py @@ -39,6 +39,7 @@ "Entropie supplémentaire de la caméra requise pour le mode AES-CBC", "Adresse", "Alignez correctement la caméra et plaque de sauvegarde.", + "Autoriser les applications Krux", "Autoriser d'abord dans les paramètres !", "Anti-éblouissement désactivé", "Anti-éblouissement activé", @@ -90,8 +91,7 @@ "Double mnémonique", "Pilote", "Vide", - "Activer ?", - "Activer les applications Krux", + "Activer\u2009?", "Chiffré", "Code QR chiffré", "Le mnémonique chiffré n'a pas été stocké", diff --git a/src/krux/translations/ja.py b/src/krux/translations/ja.py index 84adf3839..7b483b421 100644 --- a/src/krux/translations/ja.py +++ b/src/krux/translations/ja.py @@ -39,6 +39,7 @@ "AES-CBCモードにはカメラからの追加エントロピーが必要です", "アドレス", "カメラとバックプレートを正しく整列させてください.", + "Kruxアプリを許可する", "最初に設定で許可してください!", "アンチグレアが無効", "アンチグレアが有効", @@ -90,8 +91,7 @@ "ダブルニーモニック", "ドライバー", "空", - "有効化:", - "Kruxアプリを有効にする", + "有効化?", "暗号化されました", "暗号化されたQRコード", "暗号化されたニーモニックが保存されませんでした", diff --git a/src/krux/translations/ko.py b/src/krux/translations/ko.py index 99775f1a6..050f20919 100644 --- a/src/krux/translations/ko.py +++ b/src/krux/translations/ko.py @@ -39,6 +39,7 @@ "AES-CBC 모드를 위해 카메라의 추가 엔트로피가 필요합니다", "주소", "카메라와 보조 플레이트를 올바르게 정렬하십시오.", + "Krux 앱 허용", "먼저 설정에서 허용하세요!", "눈부심방지 비활성화", "눈부심방지 활성화", @@ -91,7 +92,6 @@ "드라이버", "비어 있음", "활성화?", - "Krux 앱 활성화", "암호화 후 저장", "암호화된 QR 코드", "암호화된 니모닉을 저장하지 못했습니다", diff --git a/src/krux/translations/nl.py b/src/krux/translations/nl.py index 0d548518e..3158d34c7 100644 --- a/src/krux/translations/nl.py +++ b/src/krux/translations/nl.py @@ -39,6 +39,7 @@ "Extra entropie van de camera vereist voor AES-CBC-modus", "Adres", "Richt de camera en back-upplaat op de juiste manier.", + "Krux-apps toestaan", "Sta eerst instellingen toe!", "Anti reflecterend uitgeschakeld", "Anti reflecterend ingeschakeld", @@ -91,7 +92,6 @@ "Driver", "Leeg", "Inschakelen?", - "Krux-apps inschakelen", "Versleuteld", "Versleutelde QR code", "Versleutelde geheugensteun was niet opgeslagen", diff --git a/src/krux/translations/pt.py b/src/krux/translations/pt.py index 8412c85d0..02991f6fa 100644 --- a/src/krux/translations/pt.py +++ b/src/krux/translations/pt.py @@ -39,6 +39,7 @@ "Entropia adicional da câmera necessária para o modo AES-CBC", "Endereço", "Alinhe a câmera e a placa de backup corretamente.", + "Permitir aplicativos Krux", "Permita nas configurações primeiro!", "Antirreflexo desativado", "Antirreflexo ativado", @@ -91,7 +92,6 @@ "Driver", "Vazio", "Ativar?", - "Ativar Krux app", "Criptografado", "Código QR Criptografado", "Mnemonic criptografado não foi armazenado", diff --git a/src/krux/translations/ru.py b/src/krux/translations/ru.py index 90b1c9ac4..ae214fc92 100644 --- a/src/krux/translations/ru.py +++ b/src/krux/translations/ru.py @@ -39,6 +39,7 @@ "Для режима AES-CBC требуется дополнительная энтропия от камеры", "Адрес", "Правильно совместите камеру и резервную пластину.", + "Разрешить приложения Krux", "Сначала разрешите в настройках!", "Антиблик отключен", "Антиблик включен", @@ -91,7 +92,6 @@ "Драйвер", "Пустой", "Включить?", - "Включить приложения Krux", "Зашифровано", "Зашифрованный QR Код", "Зашифрованная мнемоника не была сохранена", diff --git a/src/krux/translations/tr.py b/src/krux/translations/tr.py index 5087de3f1..c97978667 100644 --- a/src/krux/translations/tr.py +++ b/src/krux/translations/tr.py @@ -39,6 +39,7 @@ "AES-CBC modu için kameradan ek entropi gereklidir", "Adres", "Kamerayı ve yedek plakay'ı düzgün bir şekilde hizalayın.", + "Krux uygulamalarına izin ver", "Önce ayarlarda izin ver!", "Parlama önleyici devre dışı", "Parlama önleyici etkin", @@ -91,7 +92,6 @@ "Sürücü", "Boş", "Etkinleştir?", - "Krux uygulamalarını etkinleştir", "Şifrelenmiş", "Şifrelenmiş QR Kodu", "Şifrelenmiş mnemonic depolanmadı", diff --git a/src/krux/translations/vi.py b/src/krux/translations/vi.py index 0b00d7967..f107b3c6b 100644 --- a/src/krux/translations/vi.py +++ b/src/krux/translations/vi.py @@ -39,6 +39,7 @@ "Cần thêm entropy từ camera cho chế độ AES-CBC", "Địa chỉ", "Căn chỉnh camera và tấm dự phòng đúng cách.", + "Cho phép ứng dụng Krux", "Cho phép cài đặt trước!", "Chống lóa bị vô hiệu hóa", "Đã bật chống lóa", @@ -91,7 +92,6 @@ "Driver", "Trống", "Kích hoạt?", - "Bật ứng dụng Krux", "Đã mã hóa", "Mã QR được mã hóa", "Mnemonic được mã hóa không được lưu trữ", diff --git a/src/krux/translations/zh.py b/src/krux/translations/zh.py index f91e8a345..d41454791 100644 --- a/src/krux/translations/zh.py +++ b/src/krux/translations/zh.py @@ -39,6 +39,7 @@ "AES-CBC 模式需要相机的额外熵", "地址", "正确对齐摄像头和背板。", + "允许Krux应用程序", "首先在设置中允许!", "防眩光已禁用", "防眩光已启用", @@ -91,7 +92,6 @@ "驱动程序", "为空", "启用?", - "启用Krux应用程序", "已加密", "加密二维码", "加密助记词未存储", From 190a089b06a854dd31478567976580cab3b0b57f Mon Sep 17 00:00:00 2001 From: tadeubas Date: Thu, 12 Dec 2024 19:58:03 -0300 Subject: [PATCH 38/86] remove simulator files --- simulator/kapp.py | 94 ---------- simulator/nostr.py | 427 --------------------------------------------- 2 files changed, 521 deletions(-) delete mode 100644 simulator/kapp.py delete mode 100644 simulator/nostr.py diff --git a/simulator/kapp.py b/simulator/kapp.py deleted file mode 100644 index a73b9f141..000000000 --- a/simulator/kapp.py +++ /dev/null @@ -1,94 +0,0 @@ -# The MIT License (MIT) - -# Copyright (c) 2021-2024 Krux contributors - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. - -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -import os - -# avoids importing from flash VSF -os.chdir("/") - -VERSION = "1.0" -NAME = "Test app" - -print("Print executed inside kapp.py") - -from krux.pages import Page, Menu, MENU_CONTINUE -from krux.krux_settings import t -from krux.display import NARROW_SCREEN_WITH, STATUS_BAR_HEIGHT, FONT_HEIGHT -from krux.themes import theme - - -class KMenu(Menu): - """Customizes the page's menu""" - - def draw_wallet_indicator(self): - """Customize the top bar""" - if self.ctx.display.width() > NARROW_SCREEN_WITH: - self.ctx.display.draw_hcentered_text( - NAME, - STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, - theme.highlight_color, - theme.info_bg_color, - ) - else: - self.ctx.display.draw_string( - 24, - STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, - NAME, - theme.highlight_color, - theme.info_bg_color, - ) - - -class Kapp(Page): - """Represents the page of the kapp""" - - def __init__(self, ctx): - shtn_reboot_label = ( - t("Shutdown") if ctx.power_manager.has_battery() else t("Reboot") - ) - super().__init__( - ctx, - KMenu( - ctx, - [ - (t("About"), self.about), - (shtn_reboot_label, self.shutdown), - ], - back_label=None, - ), - ) - - def about(self): - """Handler for the 'about' menu item""" - - self.ctx.display.clear() - self.ctx.display.draw_centered_text( - "Krux app\n" + NAME + "\n\n" + t("Version") + "\n%s" % VERSION - ) - self.ctx.input.wait_for_button() - return MENU_CONTINUE - - -def run(ctx): - """Runs this kapp""" - print("run() func executed on kapp.py") - - Kapp(ctx).run() diff --git a/simulator/nostr.py b/simulator/nostr.py deleted file mode 100644 index b31cf1350..000000000 --- a/simulator/nostr.py +++ /dev/null @@ -1,427 +0,0 @@ -# The MIT License (MIT) - -# Copyright (c) 2021-2024 Krux contributors - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. - -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -import os - -# avoids importing from flash VSF -os.chdir("/") - -VERSION = "0.1" -NAME = "Nostr app" - -from krux.pages import Menu, MENU_CONTINUE, MENU_EXIT, LETTERS -from krux.pages.login import Login, DIGITS_HEX, DIGITS -from krux.pages.home_pages.home import Home -from krux.krux_settings import t, Settings -from krux.display import ( - NARROW_SCREEN_WITH, - STATUS_BAR_HEIGHT, - FONT_HEIGHT, - BOTTOM_PROMPT_LINE, -) -from krux.themes import theme - - -NSEC_SIZE = 63 -HEX_SIZE = 64 - -NSEC = "nsec" -PRIV_HEX = "priv-hex" -NPUB = "npub" -PUB_HEX = "pub-hex" -HEX = "hex" - -FILE_SUFFIX = "-nostr" -FILE_EXTENSION = ".txt" - - -class KMenu(Menu): - """Customizes the page's menu""" - - def draw_wallet_indicator(self): - """Customize the top bar""" - if self.ctx.is_logged_in(): - super().draw_wallet_indicator() - else: - if self.ctx.display.width() > NARROW_SCREEN_WITH: - self.ctx.display.draw_hcentered_text( - NAME, - STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, - theme.highlight_color, - theme.info_bg_color, - ) - else: - self.ctx.display.draw_string( - 24, - STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, - NAME, - theme.highlight_color, - theme.info_bg_color, - ) - - -class Klogin(Login): - """The page to insert the Key""" - - def __init__(self, ctx): - super().__init__(ctx) - self.menu = KMenu( - ctx, - [ - (t("Load Mnemonic"), self.load_key), - (t("New Mnemonic"), self.new_key), - (t("Load nsec or hex"), self.load_nsec), - (t("About"), self.about), - self.shutdown_menu_item(ctx), - ], - back_label=None, - ) - - # Follow NIP-06 ? - # Basic key derivation from mnemonic seed phrase - # https://github.com/nostr-protocol/nips/blob/master/06.md - def _confirm_wallet_key(self, mnemonic): - from krux.key import Key - from embit.networks import NETWORKS - from krux.settings import MAIN_TXT - - return Key(mnemonic, False, NETWORKS[MAIN_TXT]) - - def load_nsec(self): - """Load nsec or hex menu item""" - - submenu = Menu( - self.ctx, - [ - (t("QR Code"), self._load_nostr_priv_cam), - (t("Via Manual Input"), self._pre_load_nostr_priv_manual), - ( - t("Load from SD card"), - None if not self.has_sd_card() else self._load_nostr_priv_sd, - ), - ], - ) - index, status = submenu.run_loop() - if index == len(submenu.menu) - 1: - return MENU_CONTINUE - return status - - def _pre_load_nostr_priv_manual(self): - submenu = Menu( - self.ctx, - [ - (NSEC, lambda ver=NSEC: self._load_nostr_priv_manual(ver)), - (HEX, lambda ver=HEX: self._load_nostr_priv_manual(ver)), - ], - ) - index, status = submenu.run_loop() - if index == len(submenu.menu) - 1: - return MENU_CONTINUE - return status - - def _load_nostr_priv_cam(self): - from krux.pages.qr_capture import QRCodeCapture - - qr_capture = QRCodeCapture(self.ctx) - data, _ = qr_capture.qr_capture_loop() - if data is None: - self.flash_error(t("Failed to load")) - return MENU_CONTINUE - - try: - data_str = data.decode() if not isinstance(data, str) else data - mnemonic = self._create_mnemonic_from_nostr_priv_key(data_str) - if len(mnemonic.split(" ")) != 24: - raise ValueError("Mnemonic must have 24 words") - except: - self.flash_error(t("Failed to load")) - return MENU_CONTINUE - - from krux.wallet import Wallet - - self.ctx.wallet = Wallet(self._confirm_wallet_key(mnemonic)) - - return MENU_EXIT - - def _load_nostr_priv_manual(self, version): - title = t("Private Key") - - data = "" - if version == NSEC: - data = self.capture_from_keypad( - title, [LETTERS, DIGITS], starting_buffer=NSEC - ) - else: - data = self.capture_from_keypad(title, [DIGITS_HEX]) - - data = str(data) - if len(data) > HEX_SIZE: - raise ValueError("Maximum length exceeded (%s)" % HEX_SIZE) - if version == NSEC and len(data) > NSEC_SIZE: - raise ValueError("Maximum length exceeded (%s)" % NSEC_SIZE) - - self.ctx.display.clear() - self.ctx.display.draw_hcentered_text(t("Private Key") + ":\n\n" + data) - if not self.prompt( - t("Proceed?"), - BOTTOM_PROMPT_LINE, - ): - return MENU_CONTINUE - - try: - mnemonic = self._create_mnemonic_from_nostr_priv_key(data) - if len(mnemonic.split(" ")) != 24: - raise ValueError("Mnemonic must have 24 words") - except: - self.flash_error(t("Failed to load")) - return MENU_CONTINUE - - from krux.wallet import Wallet - - self.ctx.wallet = Wallet(self._confirm_wallet_key(mnemonic)) - - return MENU_EXIT - - def _load_nostr_priv_sd(self): - from krux.pages.utils import Utils - - # Prompt user for file - filename, _ = Utils(self.ctx).load_file(prompt=False, only_get_filename=True) - - if not filename: - return MENU_CONTINUE - - from krux.sd_card import SDHandler - - data = None - mnemonic = "" - try: - with SDHandler() as sd: - data = sd.read(filename) - - data = data.replace("\r\n", "").replace("\n", "") - mnemonic = self._create_mnemonic_from_nostr_priv_key(data) - except: - self.flash_error(t("Failed to load")) - return MENU_CONTINUE - - from krux.wallet import Wallet - - self.ctx.wallet = Wallet(self._confirm_wallet_key(mnemonic)) - - return MENU_EXIT - - def _create_mnemonic_from_nostr_priv_key(self, data): - from embit import bech32, bip39 - - if data.startswith(NSEC) and len(data) == NSEC_SIZE: - _, _, data = bech32.bech32_decode(data) - decoded = bech32.convertbits(data, 5, 8, False) - return bip39.mnemonic_from_bytes(bytes(decoded)) - if len(data) == HEX_SIZE: - return bip39.mnemonic_from_bytes(bytes.fromhex(data)) - - return "" - - def about(self): - """Handler for the 'about' menu item""" - - self.ctx.display.clear() - self.ctx.display.draw_centered_text( - "Krux app\n" + NAME + "\n\n" + t("Version") + "\n%s" % VERSION - ) - self.ctx.input.wait_for_button() - return MENU_CONTINUE - - -class Khome(Home): - """The page after loading the Key""" - - def __init__(self, ctx): - super().__init__(ctx) - - self.menu = Menu( - ctx, - [ - ( - t("Backup Mnemonic"), - ( - self.backup_mnemonic - if not Settings().security.hide_mnemonic - else None - ), - ), - (t("Nostr Keys"), self.nostr_keys), - ("BIP85", self.bip85), - (t("Sign Event"), self.sign_message), - self.shutdown_menu_item(ctx), - ], - back_label=None, - ) - - def nostr_keys(self): - """Handler for Nostr Keys menu item""" - - if len(self.ctx.wallet.key.mnemonic.split(" ")) < 24: - self.flash_error(t("Mnemonic must have 24 words!")) - return MENU_CONTINUE - try: - self._get_private_key() - except: - raise ValueError("This mnemonic cannot be converted, try another") - - submenu = Menu( - self.ctx, - [ - ( - t("Private Key"), - ( - None - if Settings().security.hide_mnemonic - else lambda: self.show_key_formats([NSEC, PRIV_HEX]) - ), - ), - (t("Public Key"), lambda: self.show_key_formats([NPUB, PUB_HEX])), - ], - ) - index, status = submenu.run_loop() - if index == len(submenu.menu) - 1: - return MENU_CONTINUE - return status - - def show_key_formats(self, versions): - """Create menu to select Nostr keys in text or QR""" - - def _nostr_key_text(version): - def _save_nostr_to_sd(version): - from krux.pages.file_operations import SaveFile - - save_page = SaveFile(self.ctx) - title = version + FILE_SUFFIX - save_page.save_file( - self._get_nostr_key(version), - title, - title, - title + ":", - FILE_EXTENSION, - save_as_binary=False, - ) - - nostr_text_menu_items = [ - ( - t("Save to SD card"), - ( - None - if not self.has_sd_card() - else lambda ver=version: _save_nostr_to_sd(ver) - ), - ), - ] - full_nostr_key = ( - self._get_nostr_title(version) - + ":\n\n" - + str(self._get_nostr_key(version)) - ) - menu_offset = 5 + len(self.ctx.display.to_lines(full_nostr_key)) - menu_offset *= FONT_HEIGHT - nostr_key_menu = Menu(self.ctx, nostr_text_menu_items, offset=menu_offset) - self.ctx.display.clear() - self.ctx.display.draw_hcentered_text( - full_nostr_key, - offset_y=FONT_HEIGHT, - info_box=True, - ) - nostr_key_menu.run_loop() - - def _nostr_key_qr(version): - title = self._get_nostr_title(version) - nostr_key = str(self._get_nostr_key(version)) - from krux.pages.qr_view import SeedQRView - - seed_qr_view = SeedQRView(self.ctx, data=nostr_key, title=title) - seed_qr_view.display_qr(allow_export=True, transcript_tools=False) - - pub_key_menu_items = [] - for version in versions: - title = version if version not in (PRIV_HEX, PUB_HEX) else HEX - pub_key_menu_items.append( - (title + " - " + t("Text"), lambda ver=version: _nostr_key_text(ver)) - ) - pub_key_menu_items.append( - (title + " - " + t("QR Code"), lambda ver=version: _nostr_key_qr(ver)) - ) - pub_key_menu = Menu(self.ctx, pub_key_menu_items) - while True: - _, status = pub_key_menu.run_loop() - if status == MENU_EXIT: - break - - return MENU_CONTINUE - - def _get_nostr_title(self, version): - if version == NPUB: - return "Public Key npub" - if version == PUB_HEX: - return "Public Key hex" - if version == NSEC: - return "Private Key nsec" - return "Private Key hex" - - def _get_nostr_key(self, version): - - def _encode_nostr_key(bits, version): - from embit import bech32 - - converted_bits = bech32.convertbits(bits, 8, 5) - return bech32.bech32_encode(bech32.Encoding.BECH32, version, converted_bits) - - if version in (NPUB, PUB_HEX): - pub_key = self._get_private_key().get_public_key().serialize()[1:] - if version == NPUB: - return _encode_nostr_key(pub_key, version) - return pub_key.hex() - if version == NSEC: - return _encode_nostr_key(self._get_mnemonic_bytes(), version) - return self._get_mnemonic_bytes().hex() - - def _get_mnemonic_bytes(self): - from embit import bip39 - - mnemonic = self.ctx.wallet.key.mnemonic - return bip39.mnemonic_to_bytes(mnemonic, ignore_checksum=True) - - def _get_private_key(self): - from embit import ec - - return ec.PrivateKey(self._get_mnemonic_bytes()) - - -def run(ctx): - """Runs this kapp""" - - Klogin(ctx).run() - - if ctx.is_logged_in(): - while True: - if not Khome(ctx).run(): - break - - print("Exited!!!!") From ac3fc962c4e0f42aa0615d21fc3199568f19f89a Mon Sep 17 00:00:00 2001 From: tadeubas Date: Thu, 12 Dec 2024 19:59:43 -0300 Subject: [PATCH 39/86] symlinks kapps in simulator --- simulator/kapp.py | 1 + simulator/nostr.py | 1 + 2 files changed, 2 insertions(+) create mode 120000 simulator/kapp.py create mode 120000 simulator/nostr.py diff --git a/simulator/kapp.py b/simulator/kapp.py new file mode 120000 index 000000000..3dccdf87a --- /dev/null +++ b/simulator/kapp.py @@ -0,0 +1 @@ +../kapps/kapp.py \ No newline at end of file diff --git a/simulator/nostr.py b/simulator/nostr.py new file mode 120000 index 000000000..4236c05d5 --- /dev/null +++ b/simulator/nostr.py @@ -0,0 +1 @@ +../kapps/nostr.py \ No newline at end of file From 89ca832f9f2176a91be04bb5038e7e9edf3a8ba0 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Thu, 12 Dec 2024 20:06:22 -0300 Subject: [PATCH 40/86] fr translations --- i18n/translations/fr-FR.json | 4 ++-- src/krux/translations/fr.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/i18n/translations/fr-FR.json b/i18n/translations/fr-FR.json index 2fe3995c3..227a642ab 100644 --- a/i18n/translations/fr-FR.json +++ b/i18n/translations/fr-FR.json @@ -18,7 +18,7 @@ "Address": "Adresse", "Align camera and backup plate properly.": "Alignez correctement la caméra et plaque de sauvegarde.", "Allow Krux apps": "Autoriser les applications Krux", - "Allow in settings first!": "Autoriser d'abord dans les paramètres !", + "Allow in settings first!": "Autoriser d'abord dans les paramètres !", "Anti-glare disabled": "Anti-éblouissement désactivé", "Anti-glare enabled": "Anti-éblouissement activé", "App will be stored internally on flash.": "L'application sera stockée en interne sur flash.", @@ -86,7 +86,7 @@ "Erasing user's data..": "Effacement des données de l'utilisateur...", "Error:": "Erreur :", "Esc": "Esc", - "Execute %s Krux app?": "Exécuter l'application %s Krux ?", + "Execute %s Krux app?": "Exécuter l'application %s Krux ?", "Explore files?": "Explorer des fichiers ?", "Exporting to SD card..": "Exportation vers la carte SD..", "Extended Public Key": "Clé publique", diff --git a/src/krux/translations/fr.py b/src/krux/translations/fr.py index 52b212147..57bb0e6a5 100644 --- a/src/krux/translations/fr.py +++ b/src/krux/translations/fr.py @@ -40,7 +40,7 @@ "Adresse", "Alignez correctement la caméra et plaque de sauvegarde.", "Autoriser les applications Krux", - "Autoriser d'abord dans les paramètres !", + "Autoriser d'abord dans les paramètres\u2009!", "Anti-éblouissement désactivé", "Anti-éblouissement activé", "L'application sera stockée en interne sur flash.", @@ -108,7 +108,7 @@ "Effacement des données de l'utilisateur...", "Erreur\u2009:", "Esc", - "Exécuter l'application %s Krux ?", + "Exécuter l'application %s Krux\u2009?", "Explorer des fichiers\u2009?", "Exportation vers la carte SD..", "Clé publique", From 7c59eae4b78051cccb989a9006a4b31eb0976ff7 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Thu, 12 Dec 2024 20:08:19 -0300 Subject: [PATCH 41/86] changed enable to Allow krux apps text in settings --- src/krux/krux_settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/krux/krux_settings.py b/src/krux/krux_settings.py index 1ae57a711..287fe674d 100644 --- a/src/krux/krux_settings.py +++ b/src/krux/krux_settings.py @@ -431,7 +431,7 @@ def label(self, attr): "auto_shutdown": t("Shutdown Time"), "hide_mnemonic": t("Hide Mnemonics"), "boot_flash_hash": t("TC Flash Hash at Boot"), - "allow_kapp": t("Enable Krux apps"), + "allow_kapp": t("Allow Krux apps"), }[attr] From b13d9dfd9897cd7732a2f47d4e9de52d187550a1 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Thu, 12 Dec 2024 20:11:23 -0300 Subject: [PATCH 42/86] lint --- src/krux/pages/kapps.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/krux/pages/kapps.py b/src/krux/pages/kapps.py index 20e4a6310..ef91e2747 100644 --- a/src/krux/pages/kapps.py +++ b/src/krux/pages/kapps.py @@ -156,6 +156,7 @@ def execute_flash_kapp(self, app_name): from ..power import power_manager power_manager.shutdown() + return None def load_sd_kapp(self): """Loads kapp from SD to flash, then executes""" From 31dc0d256b983fa1b710ca1510d18ad338ede489 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sun, 15 Dec 2024 01:20:38 -0300 Subject: [PATCH 43/86] simulator sequence for tc-flash-hash --- .../features/tamper-detection.en.md | 4 +- .../img/maixpy_amigo/tc-flash-hash-150.en.png | Bin 0 -> 14401 bytes simulator/kruxsim/mocks/machine.py | 5 +- simulator/sequences/tc-flash-hash.txt | 43 ++++++++++++++++++ simulator/simulator.py | 2 +- 5 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 docs/img/maixpy_amigo/tc-flash-hash-150.en.png create mode 100644 simulator/sequences/tc-flash-hash.txt diff --git a/docs/getting-started/features/tamper-detection.en.md b/docs/getting-started/features/tamper-detection.en.md index 469c25538..399fc58df 100644 --- a/docs/getting-started/features/tamper-detection.en.md +++ b/docs/getting-started/features/tamper-detection.en.md @@ -50,10 +50,10 @@ The *TC Flash Hash* tool enables you to verify if the device's internal flash me - **User's Region:** The area used to stored encrypted mnemonics, settings and TC Code. It generates the last set of two words.
- TC Flash Hash + TC Flash Hash
-*Example: The blue symbol and words 'tail monkey' represent the firmware region, while 'wrestle over' user's region.* +*Example: The red symbol and words 'debate lunar' represent the firmware region, while 'renew great' user's region.* Any change in the flash content results in a different image and words: diff --git a/docs/img/maixpy_amigo/tc-flash-hash-150.en.png b/docs/img/maixpy_amigo/tc-flash-hash-150.en.png new file mode 100644 index 0000000000000000000000000000000000000000..e3b64f02ea15ea56a2c24b1e67ca42536a1aae49 GIT binary patch literal 14401 zcmV-HIKIb;P)2}-RsW&Z|m2teQ$w9Rk7C6=`3Td zMF1?I7DX^3?m~eq6HxbCtvgoO9#$121`z@GKL95FFz(ZsP!&eR-y1+dLwNyJ6i|Pe z3Mdl)Q$SHflnim#xhh=q#NS0+)r9iKV2r^QJ=B6lQGYK~v8o_oOy)0*7rVBq`u-4% z5%;_(s{VdzaaAZ-P%V7@f(VERDuSwY?Q}QBYUpR*hgK;H3tAxJt~D4y>2mUg&Q^^?7eAAS8@#@sI9vyckt)3?$-pNA;yW{aU_lWr@2Fy89oE+nuCc0-iG?#yGq&Ep=)Q0LGiurw zNqaPm7X~8+jF7i-OqQ{K|AFUz_To$bqUiOuQ-iGTV0)r<(G^#`;k##_b>=%ngkG

w{ED+4=omZ5%Yp7pWYsNCFj3t$<^O z))Tek=&nz~n_1q__7A$M7eU;gMNvuryjbA-GK`4@!c|cu@LeBX0BhacA`)IcKMNT{ zyEUI>R6l`&T@d6AJ6v635ze&_Gab3M=dJ zjM9I)R-4e7zV{t1Sl34XY*uX~01!9U)^n`112xX(VBMe>T2yFDeWB1VsKt6YEHaJ2 zfcy&)WX=J(&U0v?LU-khnGj4EgX(|}ev>EzmSa&^F9V7jJL6?eCwmI2(%ZT7XJ6X= z@+lWWBk;w20vgEB!Ux3ib{l967 zrbtDC7~k(UOl3~4bMlz~t(F0##7#+9g|+m0mR_$*q3VcBge=RLXicE1#WPR;^xyB@ zv*$lktpb4jegFH-Pn~}HX&XA74hu_5bUGb+y>5I%mY0`VSXg9Xae;-!gDfsDQuGSP zEhHfXaVxmEVhe};G3(h!Tv2-IKs-@}!LWe?MS3xQv1sC;q|_INNaHK$>NBxSkOy6X zqUbte!1w`lZ)}_*z)jy+0+R_7LRi&>X;wT7Ghr&kzrN-C0%A)+KY6amP6dn@OqL-M zt`}dg6CH?sWD%<*QWlE!*L#`B-`>5{3 zE~3!Nb6OKEjLGPByFB&eQ~&0`zI|T=$U{|cd)wRo)47|@-C%8j$qee}cn)Rn9nJA3< ziegtr&er#qrXq}%Kho6^p0makuY~eJRpNzcRZm=H8>~7`Vd84jCNh@9K2afAj3m!c zK1?EFl>H$Z%B$~_B3{zUGej~_rLa{Zk|Kn ztS!ilQ{1S+L~DXg7o7i}fAZr;ALuSG{~!mLo}Rws&2N6=*1R=AVSBWU!J3So_E_$8 z*u8rX&prP#>#caT*ew3PQ``X8WW<=B8E=L5wgvHJxqP@cPgE^r@$B%mFUC z=z@=|SvxnS>fT%<2Gr8)7VO=-m*<{;jvYI8&?^e3sH+>N>I+alWc`>9hpys#a!ADK zwE|B`USeNJ>)TsXS3ei6pyv5fsV&h?RT@0>)^#Ta?%nrh)=)#K%1Ey1r^g|EHx$Xs z<-`>M?K!#DIw8Rp1#@fGxCMq0@+`xcj5E(Vd-KnB{OlJqfNQRK=YLzXcI|vrwQu_zaS4Xe@avAw^br?lh;ehEo*3Whi@y3bx zQBkD&#fUB3BBYh)v|25)JR{F?OlHXQ3^8UVZ@1f<=H}+s^?E%}w_51-IxH_Ov48(Q zUf%gKo#jrlQaDr=)Zo}5aI}8eQAhvQL#1%H6j5~xfo@M(Trx~|XKAZnfO!Leh;aHD zXWo=gPfwq3l{HICOQ?0LpKh;9VJ(YGOB_6S@bJ0OiK4+n7AQ_aqzjXk3Z_MBr|ctW zhH6|z8WU6>N~hbQ(^B^MET-CoqGSZi7C zc34g~Uo_j`Ti#FWQiG=b^XbXmFf<0_?BP^qm+O%b+{bC~G-0 zkY9nSTkm!|9g4!+jN_&5f*g^&*DIo4$XZL$>tT!`&vV8CqXsgtc;od}isSBeQ_zvz z=VXGn28i?@E@dra4BcKgx-xm?3&9&CpP!%mWktQgk*INX`ir2w)%b66o1^n)oeW5{ z@s-0yFc@ZLXE^Qj)0v!_q9_XX?%B=mS9jA{UM|Iim7YbYF5V6otC1g9BJvfuudBmb z7gFvg;#E6%ON4W!vEIJx{LS1oxsg0BBfYLQF{}qZIHW=SjXfM8`ACWD7z*Zsux{Nt zHk`A8>DgJb%xSWxr>2;mp5>(%USN4?>DV=(4y&2^S1P}%`vmQAqE@L;npgg6Py<(0 z9wu)&&zb&dR@2HW2qU;Vpwy!z~L?jam9&(JuRqtcGm{vF1Bg6GhxuV3X$5{%%^ zHPH)F2EdRz*J4BUt{R>2j<^9s8g<+WYZPSgyP_<2y3VIR%P5K-J73<(M61QxwT`g5 z-44B8@7T5LSm1DF;hH*pWC2xH=j_a;ESX$)sH=(-4dJj@`ADc`;ow2`?cay0CChT! z?MbrCu(+^5r@PGVJ$vaz8|n$fu^5m3zD&8GXf)p-&S}9UWsN{?)jCCjB(4=B8XC+_ zwM7n9p?eZTQI?mNc;WfyF~%@CGflgdQxsh~%ggNEwVPe9zCtm?C8r)$=a!??(821D zq>k0prJn92iS|kSjg;u7WN(jIuT~iJfvnaf)y_ZKoqVjv>{!=-EDYbr5&e@! zl%&R-7wEhc3xWWu&N%w0?ht7mqd0@obg9#ePJR-C zC~di%4iU4j<$i0h0uIx}CdN2H%*Pdm6bTq1H%2_=*-}sA@8kkgBZZN~g!`JSKP$&h zB8=>_)wcIonN5zzeGUmy`B(`)H%_9<5{wEa&r0ijH4NKb<~67OfmcD=C%j`C95xQg zI+ggogpl`;asVOE@~Q?a#_;>^kxA8=JyvSqYJHR%93u=-t{oMfn@c|>nBXfDxfUpS zt2O23%EDGI@_rGcaVikSiF}6RdT*_M9rn`qsTm}AidK&jIFyJX^SQIqiwxF+N}r9; zO?e@0PJ`DfQeT%N4l$isiQr0Tu46zL+xqu1GuD`^I@_iIUgvrTC78e&+)sEwa zN=!gid0CD8D(R#?C{6=mB`Kt#G}_U{3O?0a}5B$^EueB&GA?_c_*Ut(fnf>x`=pZv+6@WBs$km>1Z02US&0NA{FGn12( zSZn#yKmF5HwR!XA&761MdCbqx^W`spnF}tsfVaKvZ7eMv32WK z=H}-3(wDyE(ny^^RAL-L{CuB8CCTx?bBx-03i2LW{>N)ep4z>8H+S82SM9kguDF7& zTeouKjW-Ux{`T8%=Z-t>VBNZPeCR_T;@5xu*V(ph8{4*R;|D+Z0RZ3o-uKwHZ5!vF zdoI^se|>E|H{N(7TeoiIiYu-F;2-|sAGqU=JGlGqyZPMbKF6>A>aWInZoBO^RFx;5 zc!F))wy}Ntc7FS}fBOh~;wWIi$Iem)scQ5XtuQ8qTxw+Z=uw)w6Ndd>UgLP^p@-PE zZQIcE8#Zj?0KWb0Z}XL}eC3eq&9aP5n>O){Z+wI4 z>1lrXmw%ZTUwo1K?z@l0#YMjGg)eaCnP(nyy(bij=`XGpy(>+&al?jBO-@Z!%Zp1C zzjyZ@cJJ9;FRPybW%=jo@P zt{i*UyWR!B6Hh$BV~;(?+O=zW``h2n{QNxk-g_@+oplyhUwt)idefV@7|!=`Q?`Zc;ST?c=gp+2k!Okv(K_;&mKgCC!c(hAN=44+<4=STz1)IJow;)?A*DN zn{U3EE3UYLXP$Y6yYIf6#l=M)d+ag5y)2JE{`j%%z7-J}QfUZ`C#Gj+S+iyh?RJ}X zyX_ZvZsRW5a^1DX-0W-;eeXO1mlhWJ=`+vp)2E+yJ4uizQPtnEiCQ`3Ar;^El&}n^ zpK&IyfBoy3o10^Hb~^g=*9$uuw zZ}8Nyy-8dlIz{Lp19Nj=Zt)ozf@mc!IjI$&e@5&;%7&wfpJSS9S$p&=J_Hm;;lVCs z@`OLf6C4N6({#s*=sr5=37A_7Y@Zwz6sFCZu)#_g)N(rQg2`e=zbag+hK8^jtO5y{ zSnu6n#AGfowYGdiSPisxB{&Ka)D3l+l7oV@L4!j<(1n^&>9-plXoKP0O6t`O0*KeV zgQ?H&-snch9-_mP0gC9bY0~AONy|nyWtwCl4Ti$08pNavzZiMr^jPICU)7Kbk*qZ7 z9QIBO4NeJ+awP7b34MawgfV#+E!9{cg!l}i@gQyB&~K>8M35}Qh~LmLJqcjM_*t=G zRSkwglL%>t!YXPDO!Rl}y8yAxvarDrlyQU-$k^`%HW%Xx6T;qumVs>ytj;=J~5=n~5Fn)i`QfT+rDSGm!oM~_Z zQD#pIL?fQS3_?E4kxx}!ZqhLjvkbz-5whg$RAuSI#$QV{RS0Aa>E02@%T#}!JB2JF zp5VrSuGq|4p5m$#-Hg{5`ebiOKZRUy+pT7lafD@RBOSc3a$p?Du7S%<#GqMFlGNOZ zci7KP)1!N{)4x!@)f1bFo# zR37zJHrbf4)On4*VT1972J4Lb85|sfsw%g*jmG0N7?oHJydR^2EE)(C3_oiqp5ru6MIjCLx=j5r33pwqn@qV#61G4 zQe4B)#sj0rc^GfW-88AyZ3$JeL-yDSH(P0=%m(9$pi9W(FQ2(DY|dnLRCZEn@;Wpa z3JW2lA3mJk3G!|ltoPF@(Gb>n!|AK~8BCCx^5D`QHXaCme?!wmYVe^rI=GkpbdHcn z-^=<_LgM=_dssMvzTH9RD7MC7=*S2ZY6tAe!CTqMSU#YlBA_29b;Ez*r6aE6S>Aq1 z5Y}(=G|wFa;y5;t!Sx(?4ZM)6s>^BQ>B{&N+-fz^tTsy12K}g~h2T14G{zN%po+dr z8d_>F1R{0GWSqtz*EsXJFOEwM@g8l6tU-X)z8&lxj1g2#a9A$&Skbr`t&0$LDX*fT zvav?Okffi&M9A?QMXMIXJXx_&69wI1I0ik81#6vh-2~;qKn$TY9I3$wcrTd1vBb+( z#uzdY@-kA|_|2lD??e1Z%+3uOc+^j20*J}T2km{fl($B4t!7W?vBoe7NsJG%x0;CR zQR`mC5RJvqGYw89)Q|D7kq=q8bDP+D>Kp|dG#EgL_8L5lvmyF`RZVma8d%rJbpIS8d$W%{ZRYTZ)$RSxOx|&5_g8}sAh^d>j z)TsBzifKZ;+l+B@r-&REy80Mr^K(oeQ60a*lSg#@8<^%_^SUFd<1cuHyV!d~b^Kp! zVDboNil5Qt(>!-XZ5W9(Xv;vI3?7o)<}uJPaw;iFv5vB&{5TqfcQtEx_YrP+`|o+` zh}yD+HAhTX4{(70!7E2p$0yjxCfbL6{Sz!6Tf#~)!nIVT5=`L^#uZ^D?2A%!I*RBT zj1{ET`BQ_#s74?6G8xFqP7RG{KR&4CAyO}61(#)Gt?dg~4FRluK3Jyj`bLj6R#*)q z31viNfLvBxi#B?!u|mDLT_e2vLwUGNvHoh~0x24X)L$Q2KJX333DW;136a1?k$gx*PD48l zhGD>xqtV7J0=X?Lab*}Hbi#JM?uzPXg9ZR7B8uStTsWAY?Tlc0ws4tc0wLMNAg#8_ zxitN2C~e#!UKtu9QU$l+6@m+5g9iPGqLpLLmwJu z)xaoIn7<~SQU@IJ6XQOQxb9ndAfi+%8HJXeU$0x|KH#@8KcL5iFQSWsN=RP$k2VnGEqcKa9GFdcP`6^bdWFjFDhaj^0t0tq%Ik z5e;A;#ffgh>JWYQs@z5e)E~>EQk2qK?bKAMj-CO6YLX_8DS`*FKw*_aEg?N*%rK)` zFJn1j-cN-M#vXN(RNV1v;JjNW8pqD+F6|?#BNKxfoGM7HFPW)J6&dop%Lv872zjbe zV~sm}bXVBbB)Dezg<^h!Ti4(<3&&cl4_>u}b&1!=fEZ%mpur)cwELCXgCN+exDb2i z>{oMPBfB?P0g;|k?ST;={?+dSBlV8*DH@s^4~#Y$d$I~2K?|>1DtZShSYd{2CeZP~ zfFp4-@M*jR5QTU|Frq%|t?4I~_%J7nzDPd~1|MQCfKhKm6hp(08jOS&rL0=i78UR0S@v${_#XN<0M7D zL!Lh>V6w!!AuuK{;OEF-6%87!h(z6<2IHt#uICt^YsLqyW;(>@-Bd%toPu>s=E?>R zDP8!PE?REN4Vc`1IwP~oG%Tz^iWPO4r6JH%lG(0MQRP&_t;P(A47C!}_9wTc%B32P z)gWTH6{cFuO^pVvp&kj+{qPzFZHo;Wl)hPJz#HBM)kBRtO^U`ra7-}Z-v9(VbUh8I z)@7UVg+s`FdAu)pwIQtWh6q{M0W5)w0JE5Zt$TxGytftBl27AZIz|`_@B+tpio&U= zBKHzE%c)I$-b;I8Fi;P_2acQf{Y&I6?^yAA^WG04Z{K`q_dNe% z^8d6ACZ`VRy4N(K3zk!eI*U!YVicEcrY~zq4Qs2bSxzEHK)K@Qk&WjeS6zeM{`W95 zi`jf50QOs7hxzrG3*La9`8xE;N70`=g1qr9$c9az7W>V=LN2`=^Umwgy?ZEjya3NU z31@G>T={lbTEKqyo3;1WryutYNG@(b-gY&5@7dsLYU%nIk+Dc zHCI~fB++BZ6>mYVzX|)TuVWv15P%~L-i`_11+AAbb<=tFK$pM4spXUKo^|HJ<6U!#kQn2&v8Rqe@s?cYM?LZGsL z{Tp!68(`A~*l&Fux$Fw$x_=7KKJD&(@BbqI)PF?Yd=;%fx&;;wx)KgY<%S*`l7lE}<)rT#t000;KNklT0OqP|kP9z$+~gm=hb}E*-ug~tb`E{)VaKW7a0T+Fx5Dc-z*9dNxV@Zz zG3Mvq1l=C`^yAq3@4(P_yCBcu@gE~==K-*P{pXku{wrkTxybY^`lEYc zX$hWv>iG8Es!;F#lIJbfuV2qZdxG{vn>=&!Rwja4kehCLcd^{*V6CH)ywyU0J^S|X z<41nX!r~&32yo()0a`_0Bk7zP90~df%TYpmYKjXlzKGemIc8^PX-`aG5He%1R>Kaf zl3eRDNLD>c{S2yUc9CKr|73&lLVv=(_*=ZXL68_`ANKUEugQO^vjrX3)PxOA5K_P5 zdecs&jCb@iAQ^&UM#accPoI0&47qE}Fux2u-9D zBL*@d7ty$M1Q5v(iF*yy-zQqHPadpUvxcj#x{6k-#TjRu!K05p$^#EPz=uElVF14W z{qM7H-#*^=zW1@XxXAwf`}wQC`YYP)HXr%ON9gr>eEZwqW@2K3xw$zWeDFaozW8F= z?KTfT{P4j2-uvG7a{B3~({8u<&Ue1Ul~-QL3opFDC6`>n&Ye5Cb zJn;l~-+ecmH*e;=^Ugy=xb@asx$?>@x%%p>Ip>^nc>ek4dE$vDj(4{m8Y)2%HMHS% zo}##juTUsegqE9O4zXY##r7TztY5#LTW-09wQJY1ZQC}sZ{N-z{^1{T-+lLS>#eu) zna_NNi!Z*IjT<+zZQC}cr>FVoM?cCJzVHRU@r`fr=YRg^eE##F=km)h=h|zXru@xs zelzcQ$Dk?brkif!vdb=G+qP}A+ifnt{Bl0`xzBO^_1Cj)+cv)W&2O@G>sDrFX4tlE z8z27ghq>gEOZeXRzQ?w0+qn1Md-?2VKg;&*+qv()`}o$kzIE~wRY1bL2Hf}*tf!ki zM6ZSVfIzxiaS1?WccoPzspy?@|F1eoO90M>Z`Bj=YRg^Sz21EOy$o#_Z*uy zZ|0nH&f#6}dKUmoOH1+m?YG~~m%sew+WTzWxRK|ctD0P%dg>`Y{pn9v%1lpBvvuoM z0NU*~pZe6Nc=5#-F~+cQijDcCcm37B0K&GIs3P!9Dlf!>(Psxccg=nV+A3 z?M#P2Yof*a)6bwaF~P*d1bLQWL@=2nEV=pS_ZGcgFTU-0o}mgmU){-LKmG|z-6b4l zmV_l(T38l4Cm+{39uSep**^545AjET^hZ4V?6W7hRmT@oGt*pj$t6tB&M-4GL%Tge zhH(UD{8U&`lJ?O`WO?2eWI}lzUvEEEjfC{Ozx%uF+O_Khx9E6aP?zP6Fy-M=l|`aE$THGtZppCLCv!o-gjx>o!eaQqf@KAB@s*+(`pj_2nql@O!-J zYCJJ?%uA;|H=&8o=;tY~0u6GNDKDB`VZlz|_VMYCqxB5Yl*xS7V67V)u)*;~xgBA@gMt&> zeRA7USCxLI^XbYdedqgEogieDLfg0Q%JH{uswf!y)-d;F@lQm@3 zAVqLn5K$x(axsR?h$kY6$sSy}5roxDpA8a3jwM2CqUBeGCc|jR93t4&#LhR1!ZAaA zY+=8$!DKmeGjrtX%`+jYQ2dtnwWv>_)nF_UY<}*S_$6az3{#VnA){Xi0t;bascT?^ z1_4_6szLqWy^8~Sy`I;+TVkXIqFz7YDKh1N4W}AoR2>h>$UyOo%Mo3t(`DDLT|R5F z5M?HX!BwJ1LstzVyr*b{Iuh#kIvm(<$@s?bS-9`q$9axS=MREBS~tqb~n@4vJ`qy$6a= ztU-f5q(RCF2U2xDSYaXP6R%N9_hAjWnt84fw8j?$P7D4Z?s%4EF2p|WVqX_t-%mgd zGaED140xFHv}P%%xa1&}gA&R&)YD)zVurM2b}Y|89&{98doU59I9Ya`XmHXZrf|^y zb)8F;Y^1`@gqj(#9u4h{H&SX!V2sep^RSD3nb4uh_t9Wgh}!mn6BLDYd6bRmE8qCV zG#CcYhoVDhi0ZI*4S#47R}$ zxj-7?8*_Nta9i~jsI>&usE7%9-W`nheXs1eT89ws+F-mOecwYwyp+k=MT9KR%Mklm zK8?;9!j>8_tU4=uoql*F(nj~4LJ_cOc{XxMA>uN!*%c5=6Af9^-$XEgx z?~^suBp7!F8@#q*WaEPvr~_q=2QR_rh{QO=pbr(}zYj^m7OA+EA*vW`;(t>{Z&+^u z4>=!dnpQa>Q2%;Rdm=vFK*Y9XG=(3MfOsgcN`Kit&yhri9d*^w)E=(3^~2_$Q7s8c zWI{6J;IyFDI$NPs9yvIfj)GS|X!+BM3;eMaCRlC>T;F+B!iq|bgh;D|l|H8RN5z>E zN)6pWz4iROu2n~h(F8G!V2iY7nIyhW$L2pqq@q!@v4XkDpMt-3@P_fNgsoRQoHUDDoaAF zn4ZF2r0;^{_QP(o8oZW`S%=c{!+lD{O?j%;k4;t2nWw!T65OtIx2hLSIgJKK`cT23 zJh95hs1fbL?qq41)#CV1K&L*8cSlzBTr2T979k|JP1NkG9(ye_j8u+?`kM9OsSM-Q zQ`S;O>UbNoi1EU^ltT8Zp~-YqgSy%@CE$JmdnGhAaxxo zT@8_GMop!CqP^F;)>U3}(a?shaK6DYfH;3E_cg8v1za$N$((mXIN=26)y{r-5Xo}Y>^{x9O z0ajF6I($KpIuX`sN-Oq-6w@*OHYznJ%i>`~(351twyH#~n1T+dFGN^4&&r=$P zLOUYN3i^xy?UU!4G?&K(PHZwhHX=CvIWy1F;u3jjh0&^Du6oFk^!=VRqAL^E08*WV zFgVrOnnpFWbleeUHTPbdxL{M1OoVf z9Pr|?wG~f?SR_nQD>=_pP*-$_;`NXSt=~d)I5c`R>S$1b7!&40ug5Zk)b1$G(a#Z3 z;VwX;BmAh9-3Vubq>$H1)M(hlPOhS0Ywn@L%svCFK*22o6M-yUsnnsFI*$Sb+ovIL zN>g!3L0WkWw;h;|ySEmR3}Xz6MSK9_K(#*nXGQTzh<;fEG!oo!=vzFb7q3VKDJu%K zG?a5p5w%1$KBuDedduXkb_)=+u+D+6(seju$@Nh4hd)U5>i z$-#Xu6&=psY8A#pO}JHq;{p-4|8uYr#y=H$-GY3gJ?ZU)j{D@T4ux8#r>AJ;Eqb<> z$XYd8`D8pZub2#k90mV=OHqU)sWKK;5%qj*6h};Tw$@)+SFl!((cnlCY=c>z6U3Du zkQkt|wDfd7H8q7XCZ>q&c3Y^z`gQABvt|vu_v{{4z5lEkHK%nQELvMo6S56%&*kqy z3ZPAO3j5$KmEXtQYC2LA0da5{~Nq^m=2@=VM86_33FIGBq8qAaMba^5Y13>(y0_? zXJ?q3n`35nj){p0=OPnU|EhGBm)N&=?+?wMJ$vJTs8wuHfWXAW1aoWFu<6`$*?7)I zTCE9;n4|8o5a#PLMs3vZ!D9hhR_L|Bh8Q|hN|wZ3g#veMbX%hp-+`fsFf%vHX{Vje z+WC1VCnr6pGR`&G78FH~9XnpyzObZw~o2FIi{zk$V}$)x#zj-Lu0Vk@{j-c$Y+)o7q{on{PdZ> z+_`h-Z?2u6pD&6YMN!c0cCkf)0u${CvOK3f*=By-JbU--q1)?GsP%G;K|*7Lt4*@M z3P@j0n^K7xa&4uhqrz6iM}QFJBDG%7_r`Hib$U17Yl@E;vDQuBL4Rh|EAuR>LYC!D zZj|zcP_cA79Y?Ua(CZc8g9O~7K;k2cf@*>KKEe}h*u!tQ7+0!AB>ma1^Ce_e)JkQV z?0h?H<_PAw@Vv3R6V99(Vnjn)P$y$&o=8B+Oh&uirrn-oW_E^FtHngCg%JY=um4ok zKw%4Bc<%WJcJJDCOMJf9ZFt@Pas3T9{MV_eNvtjCc6$`P9#)m2D6rN>(WKk!(d~3u z?sh1OqPmlX^$Ul-rN4p?5wgTRFZ^|pzyP(@6D-MIEyM>$d_7@s)OA>%d4;aEShaMP zJIu|@k>!r7Ep?VzTs+8RdlHl7v?tnhI$cDBUa!Z*@#iD@U!8Wf?_L zu(-HLW{fBHf{DD%^710q7NttXx6^uCtK*)=A1j=}Kx`}vM6Ro9UE(`01S?>p&L%#( zU!RzGd=&aQpx~E1>54rq;~GkqIqqys<~XT^)`TM{cZu=&MaB8Hw{lvo7W)qzeD(hA z+uzaccArd}XEvU@@&A42weS27)05K_*3#|tuxjabd-S?pdPNZQ_ z;#TM;DhHwO%L)kkz+|ovmz!NBD7b^ntx?=;x7u{N9p5K7#^ROGZYC8>mSJ#utSrmu z7DewzKm6gx_wU{N#q#b+OJ0BO>wo_p@3{K^nVOuIUeQB~f?lsjx7(%LD_rLkE-S7Q zwV&hb{l4q~of11~TABV3{`N!XDj50`R)(pIVBh_DQl^aSCDER7Ti4_5evNYt|= zQ;A5qs*SOg;yN>=7!dHA4~6%pB#L2Nx=^ofI7ricrMV60UwWw$VxsUKYG z;TwOi0;$JJDu%?_H;OA-X?K=oP7t@wfzKAUoFPQWJf{lLIGt{{_t>M4esb5VuYNwg zf5i~EfA9Y9?AYTFrVK@U{rdI)YQs6_{BLKRb>@u|t!xtYD>bFk;ItRw00jP;a5?pB zC&jA+!h?s-(7>g_weGDIEt8Y@*_O&pYXsH6O>H<|&d4Rv0N5xk`NFQCc!}9H$;RB8 zaViR&C~~AQE%veRq-mz&@>33`#@|(PN@dI-7MO%^u}YBs%Fgk1MIsL?%u3DiKv128 zMU+)HGho82PvmYzQE*`Yfft^8?%B`m-Lv-=V3{FU6@zKDT5p<~o;q!2cJ>2#p3miZ zMtfosL@-9Knwgoo1Tm6jdHI&A^R+UWqjdETkO4t?nTZolgVUHLERP-GsZ|QKZdY_9 z8gpFgXNhGIFY_e6(XL~m%yH>tzqrIAOkGY!vmtAWh% Date: Sun, 15 Dec 2024 01:21:44 -0300 Subject: [PATCH 44/86] screensaver bottom edge case fix --- src/krux/pages/screensaver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/krux/pages/screensaver.py b/src/krux/pages/screensaver.py index 0397933dd..987325d4c 100644 --- a/src/krux/pages/screensaver.py +++ b/src/krux/pages/screensaver.py @@ -54,7 +54,7 @@ def start(self): SPLASH[anim_frame - initial_offset], offset_y, fg_color, bg_color ) anim_frame += 1 - if anim_frame > len(SPLASH) + 2 * initial_offset: + if anim_frame > len(SPLASH) + (2 * initial_offset) + 1: anim_frame = 0 bg_color, fg_color = fg_color, bg_color # wait_duration(animation period) can be modified here From a25b0f8bd2c77c90dd2864c427ca6d9579445b75 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sun, 15 Dec 2024 02:39:32 -0300 Subject: [PATCH 45/86] added bip85-password sequence --- docs/img/flash_hash.bmp | Bin 1035338 -> 0 bytes simulator/sequences/bip85-password.txt | 30 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+) delete mode 100644 docs/img/flash_hash.bmp create mode 100644 simulator/sequences/bip85-password.txt diff --git a/docs/img/flash_hash.bmp b/docs/img/flash_hash.bmp deleted file mode 100644 index 65db41b301563d9453ef7dc4fbaf731f317ecef4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1035338 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 nd6!p4uZseWQ7%#u!CtgS$Abemu4%#A$T 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 z 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%0AVH$W9 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�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℞uO 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

1T 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%0AkV>#;$y0wb&8;*#xW}Og=o?5K^NFT}9 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 diff --git a/simulator/sequences/bip85-password.txt b/simulator/sequences/bip85-password.txt new file mode 100644 index 000000000..1868f7de8 --- /dev/null +++ b/simulator/sequences/bip85-password.txt @@ -0,0 +1,30 @@ +include _load-12-word-mnemonic.txt + +# Navigate to BIP85 +x2 press BUTTON_B +press BUTTON_A + +x2 press BUTTON_C +x2 press BUTTON_A + +# Go base64 password +BUTTON_B +BUTTON_A + +# Index 1 Go +BUTTON_A +BUTTON_C +BUTTON_A + +screenshot bip85-length-password.png + +# Length confirm +BUTTON_C +BUTTON_A + +screenshot bip85-base64-password.png + +# QR Code +BUTTON_A + +screenshot bip85-qr-base64-password.png From 914362d85cfd4627502a7bf58380ecca71b08ad8 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Fri, 20 Dec 2024 23:22:34 -0300 Subject: [PATCH 46/86] Don't convert loaded NSEC or HEX to BIP39 --- kapps/nostr.py | 86 +++++++++++++++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 33 deletions(-) diff --git a/kapps/nostr.py b/kapps/nostr.py index b31cf1350..fa3c7074a 100644 --- a/kapps/nostr.py +++ b/kapps/nostr.py @@ -48,22 +48,43 @@ NPUB = "npub" PUB_HEX = "pub-hex" HEX = "hex" +MNEMONIC = "mnemonic" +DEFAULT_MNEMONIC = "action action action action action action action action action action action action" FILE_SUFFIX = "-nostr" FILE_EXTENSION = ".txt" +class NostrKey: + + def __init__(self): + self.update() + + def update(self, key = "none", value = None): + self.key = key + self.value = value + + def loaded(self): + return self.key in (NSEC, PRIV_HEX, MNEMONIC) + + def loaded_mnemonic(self): + print("loaded_mnemonic", self.key, self.value) + return self.key == MNEMONIC + class KMenu(Menu): """Customizes the page's menu""" def draw_wallet_indicator(self): """Customize the top bar""" - if self.ctx.is_logged_in(): + text = NAME + if nostrKey.loaded_mnemonic(): super().draw_wallet_indicator() + elif nostrKey.loaded(): + text = nostrKey.key.upper() else: if self.ctx.display.width() > NARROW_SCREEN_WITH: self.ctx.display.draw_hcentered_text( - NAME, + text, STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, theme.highlight_color, theme.info_bg_color, @@ -72,7 +93,7 @@ def draw_wallet_indicator(self): self.ctx.display.draw_string( 24, STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, - NAME, + text, theme.highlight_color, theme.info_bg_color, ) @@ -98,6 +119,7 @@ def __init__(self, ctx): # Follow NIP-06 ? # Basic key derivation from mnemonic seed phrase # https://github.com/nostr-protocol/nips/blob/master/06.md + # https://github.com/vitorpamplona/amethyst/tree/main/quartz/src/main/java/com/vitorpamplona/quartz/crypto/nip06 def _confirm_wallet_key(self, mnemonic): from krux.key import Key from embit.networks import NETWORKS @@ -140,25 +162,21 @@ def _pre_load_nostr_priv_manual(self): def _load_nostr_priv_cam(self): from krux.pages.qr_capture import QRCodeCapture + error_msg = t("Failed to load") qr_capture = QRCodeCapture(self.ctx) data, _ = qr_capture.qr_capture_loop() if data is None: - self.flash_error(t("Failed to load")) + self.flash_error(error_msg) return MENU_CONTINUE try: data_str = data.decode() if not isinstance(data, str) else data - mnemonic = self._create_mnemonic_from_nostr_priv_key(data_str) - if len(mnemonic.split(" ")) != 24: - raise ValueError("Mnemonic must have 24 words") + if not self._load_nostr_priv_key(data_str): + raise ValueError() except: - self.flash_error(t("Failed to load")) + self.flash_error(error_msg) return MENU_CONTINUE - from krux.wallet import Wallet - - self.ctx.wallet = Wallet(self._confirm_wallet_key(mnemonic)) - return MENU_EXIT def _load_nostr_priv_manual(self, version): @@ -187,17 +205,12 @@ def _load_nostr_priv_manual(self, version): return MENU_CONTINUE try: - mnemonic = self._create_mnemonic_from_nostr_priv_key(data) - if len(mnemonic.split(" ")) != 24: - raise ValueError("Mnemonic must have 24 words") + if not self._load_nostr_priv_key(data): + raise ValueError() except: self.flash_error(t("Failed to load")) return MENU_CONTINUE - from krux.wallet import Wallet - - self.ctx.wallet = Wallet(self._confirm_wallet_key(mnemonic)) - return MENU_EXIT def _load_nostr_priv_sd(self): @@ -218,7 +231,8 @@ def _load_nostr_priv_sd(self): data = sd.read(filename) data = data.replace("\r\n", "").replace("\n", "") - mnemonic = self._create_mnemonic_from_nostr_priv_key(data) + if not self._load_nostr_priv_key(data): + raise ValueError() except: self.flash_error(t("Failed to load")) return MENU_CONTINUE @@ -229,17 +243,22 @@ def _load_nostr_priv_sd(self): return MENU_EXIT - def _create_mnemonic_from_nostr_priv_key(self, data): - from embit import bech32, bip39 - + def _load_nostr_priv_key(self, data): if data.startswith(NSEC) and len(data) == NSEC_SIZE: - _, _, data = bech32.bech32_decode(data) - decoded = bech32.convertbits(data, 5, 8, False) - return bip39.mnemonic_from_bytes(bytes(decoded)) + nostrKey.update(NSEC, data) + self._load_fake_mnemonic() + return True if len(data) == HEX_SIZE: - return bip39.mnemonic_from_bytes(bytes.fromhex(data)) + nostrKey.update(PRIV_HEX, data) + self._load_fake_mnemonic() + return True + + return False + + def _load_fake_mnemonic(self): + from krux.wallet import Wallet - return "" + self.ctx.wallet = Wallet(self._confirm_wallet_key(DEFAULT_MNEMONIC)) def about(self): """Handler for the 'about' menu item""" @@ -258,14 +277,15 @@ class Khome(Home): def __init__(self, ctx): super().__init__(ctx) - self.menu = Menu( + self.menu = KMenu( ctx, [ ( t("Backup Mnemonic"), ( self.backup_mnemonic - if not Settings().security.hide_mnemonic + if not Settings().security.hide_mnemonic and + nostrKey.loaded_mnemonic() else None ), ), @@ -280,9 +300,6 @@ def __init__(self, ctx): def nostr_keys(self): """Handler for Nostr Keys menu item""" - if len(self.ctx.wallet.key.mnemonic.split(" ")) < 24: - self.flash_error(t("Mnemonic must have 24 words!")) - return MENU_CONTINUE try: self._get_private_key() except: @@ -425,3 +442,6 @@ def run(ctx): break print("Exited!!!!") + + +nostrKey = NostrKey() \ No newline at end of file From c02a93e131161d706825c261bdd8a85fe6d79ab7 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sat, 21 Dec 2024 23:56:54 -0300 Subject: [PATCH 47/86] test tools k> apps menu --- tests/pages/test_tools.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/tests/pages/test_tools.py b/tests/pages/test_tools.py index c03c553af..19ffcca15 100644 --- a/tests/pages/test_tools.py +++ b/tests/pages/test_tools.py @@ -198,3 +198,37 @@ def test_load_flash_tools(m5stickv, mocker): tool = Tools(ctx) tool.flash_tools() assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) + + +def test_load_krux_app_without_allow(m5stickv, mocker): + from krux.pages.tools import Tools + from krux.pages import MENU_CONTINUE + + ctx = create_ctx(mocker, None) + tool = Tools(ctx) + + mocker.spy(tool, "flash_error") + + val = tool.load_krux_app() + assert val == MENU_CONTINUE + assert tool.flash_error.called + tool.flash_error.assert_called_with("Allow in settings first!") + assert (("Allow in settings first!",),) in tool.flash_error.call_args_list + + +def test_load_krux_app_with_allow(m5stickv, mocker): + from krux.pages.tools import Tools + from krux.pages import MENU_CONTINUE + from krux.krux_settings import Settings + + ctx = create_ctx(mocker, None) + tool = Tools(ctx) + Settings().security.allow_kapp = True + + mocker.spy(tool, "flash_error") + mocker.patch("krux.pages.kapps.Kapps", new=mocker.MagicMock()) + + val = tool.load_krux_app() + assert val == MENU_CONTINUE + assert not tool.flash_error.called + assert (("Allow in settings first!",),) not in tool.flash_error.call_args_list From 70d3421796ee6de25a2aac8ae067e9829d3eb2b8 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Wed, 25 Dec 2024 00:48:59 -0300 Subject: [PATCH 48/86] kapps tests --- tests/pages/kapps.py | 110 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 tests/pages/kapps.py diff --git a/tests/pages/kapps.py b/tests/pages/kapps.py new file mode 100644 index 000000000..cbc575a28 --- /dev/null +++ b/tests/pages/kapps.py @@ -0,0 +1,110 @@ +import pytest +from unittest.mock import patch +from . import create_ctx + + +def test_parse_all_flash_apps(m5stickv, mocker): + from krux.pages.kapps import Kapps + from krux.sd_card import MPY_FILE_EXTENSION + from krux.input import BUTTON_PAGE, BUTTON_ENTER + import os + from krux.settings import FLASH_PATH + + ################################# + print("Case 1: no file with MPY_FILE_EXTENSION") + + mocker.patch( + "os.listdir", + new=mocker.MagicMock(return_value=["somefile", "otherfile"]), + ) + + ctx = create_ctx(mocker, None) + kapps = Kapps(ctx) + + signed_apps = kapps.parse_all_flash_apps() + assert len(signed_apps) == 0 + + + ################################ + print("Case 2: unsigned file, prompt for deletion, user deny, ValueError") + + # one unsigned file + unsigned_file = "somefile" + MPY_FILE_EXTENSION + mocker.patch( + "os.listdir", + new=mocker.MagicMock(return_value=[unsigned_file]), + ) + + # User deny prompt + ctx.input.wait_for_button = mocker.MagicMock(side_effect=[BUTTON_PAGE]) + + # unsigned file + with pytest.raises(ValueError, match="Unsigned apps found in flash"): + signed_apps = kapps.parse_all_flash_apps() + assert len(signed_apps) == 0 + + + ################################ + print("Case 3: unsigned file, prompt for deletion, user allow, remove unsigned file") + + # User accept prompt + ctx.input.wait_for_button = mocker.MagicMock(side_effect=[BUTTON_ENTER]) + + # Mock file remove + mocker.patch("os.remove", new=mocker.MagicMock()) + + signed_apps = kapps.parse_all_flash_apps() + assert len(signed_apps) == 0 + + flash_path_prefix = "/%s/" % FLASH_PATH + os.remove.assert_called_with(flash_path_prefix + unsigned_file) + + + ################################ + print("Case 4: signed file") + + # one unsigned file + signed_file = "sigfile" + MPY_FILE_EXTENSION + mocker.patch( + "os.listdir", + new=mocker.MagicMock(return_value=[signed_file]), + ) + mocker.patch("builtins.open", mocker.mock_open(read_data=b"signature data")) + mocker.patch.object(kapps, "valid_signature", new=lambda data, hash: True) + + signed_apps = kapps.parse_all_flash_apps() + assert len(signed_apps) == 1 + assert signed_file in signed_apps + + +def test_valid_signature(m5stickv, mocker): + from krux.pages.kapps import Kapps + + mocker.patch( + "os.listdir", + new=mocker.MagicMock(return_value=[]), + ) + + ctx = create_ctx(mocker, None) + kapps = Kapps(ctx) + + ######################################## + print("Case 1: invalid pubkey()") + + mocker.patch("krux.firmware.get_pubkey", new=lambda: None) + + with pytest.raises(ValueError, match="Invalid public key"): + kapps.valid_signature(None, None) + + + ######################################## + print("Case 2: valid signature") + + mocker.patch("krux.firmware.get_pubkey", new=lambda: "Valid pubkey") + mocker.patch("krux.firmware.check_signature", new=lambda pubk, sig, hash: True) + + sig = kapps.valid_signature(None, None) + assert sig + + + From 6e35be8154c4608a8e6aeeba0b4694c5bde1cc10 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Wed, 25 Dec 2024 01:08:25 -0300 Subject: [PATCH 49/86] docs tc_flash_hash img for m5stickv --- .../features/tamper-detection.en.md | 3 ++- docs/getting-started/features/tools.en.md | 3 +++ .../maixpy_m5stickv/tc-flash-hash-125.en.png | Bin 0 -> 37565 bytes simulator/sequences/tc-flash-hash.txt | 6 ++++-- 4 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 docs/img/maixpy_m5stickv/tc-flash-hash-125.en.png diff --git a/docs/getting-started/features/tamper-detection.en.md b/docs/getting-started/features/tamper-detection.en.md index 399fc58df..de1b28124 100644 --- a/docs/getting-started/features/tamper-detection.en.md +++ b/docs/getting-started/features/tamper-detection.en.md @@ -50,7 +50,8 @@ The *TC Flash Hash* tool enables you to verify if the device's internal flash me - **User's Region:** The area used to stored encrypted mnemonics, settings and TC Code. It generates the last set of two words.
- TC Flash Hash + TC Flash Hash amigo + TC Flash Hash m5stickv
*Example: The red symbol and words 'debate lunar' represent the firmware region, while 'renew great' user's region.* diff --git a/docs/getting-started/features/tools.en.md b/docs/getting-started/features/tools.en.md index 8267553a4..ecc56c907 100644 --- a/docs/getting-started/features/tools.en.md +++ b/docs/getting-started/features/tools.en.md @@ -52,6 +52,9 @@ This is an interesting tool to visualize the effects of filling the memory with
#### TC Flash Hash + + + *Tamper Check Flash Hash* is a tamper detection mechanism that enables you to verify if the flash memory content has been altered. To use it first, need to create a `TC Code` on `Settings -> Security -> Tamper Check Code`. *TC Flash Hash* will hash this code, K210 chip's unique ID and the content of the whole flash memory together and produce an image. The tool generates a unique image and four tamper detection words based on a hash of your *TC Code*, the device's UID, and the flash content. The flash memory is divided into two regions: diff --git a/docs/img/maixpy_m5stickv/tc-flash-hash-125.en.png b/docs/img/maixpy_m5stickv/tc-flash-hash-125.en.png new file mode 100644 index 0000000000000000000000000000000000000000..c653fae4492199559a997f842b6040504fa42b47 GIT binary patch literal 37565 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 Date: Thu, 26 Dec 2024 01:53:27 -0300 Subject: [PATCH 50/86] tests kapp execute_flash_kapp --- tests/files/kapp.py | 3 ++ tests/pages/kapps.py | 102 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 tests/files/kapp.py diff --git a/tests/files/kapp.py b/tests/files/kapp.py new file mode 100644 index 000000000..fc583852c --- /dev/null +++ b/tests/files/kapp.py @@ -0,0 +1,3 @@ +def run(self): + return True + \ No newline at end of file diff --git a/tests/pages/kapps.py b/tests/pages/kapps.py index cbc575a28..7d727bc1b 100644 --- a/tests/pages/kapps.py +++ b/tests/pages/kapps.py @@ -107,4 +107,106 @@ def test_valid_signature(m5stickv, mocker): assert sig +def test_execute_flash_kapp(m5stickv, mocker): + from krux.pages.kapps import Kapps + from krux.pages import MENU_CONTINUE + from krux.input import BUTTON_PAGE, BUTTON_ENTER + import os, sys + from krux.settings import FLASH_PATH + from krux.themes import theme + + btn_seq = [ + BUTTON_PAGE, # case 1 skip prompt + BUTTON_ENTER, # case 2 accept prompt to execute + BUTTON_PAGE, # case 2 dismiss error msg + BUTTON_ENTER, # case 3 accept prompt to execute + ] + + ########################################## + print("Case 1: Exit when prompted to execute the app") + mocker.patch( + "os.listdir", + new=mocker.MagicMock(return_value=[]), + ) + + ctx = create_ctx(mocker, btn_seq) + kapps = Kapps(ctx) + + mocker.spy(kapps, "prompt") + + kapp_name = "anykappname" + result = kapps.execute_flash_kapp(kapp_name) + + assert result == MENU_CONTINUE + assert kapps.prompt.called + kapps.prompt.assert_called_with("Execute %s Krux app?" % kapp_name, ctx.display.height() // 2) + + + ######################################### + print("Case 2: Continue to execut the app, skip error msg") + + mocker.patch( + "os.chdir", + new=mocker.MagicMock(), + ) + + # avoid call sys.exit() after app execution otherwise will exit test and fail + mocker.patch( + "sys.exit", + new=mocker.MagicMock(), + ) + + mocker.spy(ctx.display, "draw_centered_text") + + kapps.execute_flash_kapp(kapp_name) + assert os.chdir.called + + # First changed to flash path and execut app, then return to / when error appear + os.chdir.assert_has_calls( + [ + mocker.call( + "/" + FLASH_PATH + ), + mocker.call( + "/" + ), + ] + ) + + assert sys.exit.called + + assert ctx.display.draw_centered_text.called + ctx.display.draw_centered_text.assert_called_with("Error:" + "\n" + "Could not execute %s" % kapp_name, theme.error_color) + + + ####################################### + print("Case 3: app executed") + + mocker.spy(ctx.display, "draw_centered_text") + + sys.path.append(os.getcwd() + "/tests/files") + + kapps.execute_flash_kapp("kapp") + assert os.chdir.called + + # First changed to flash path and execut app, then return to / when error appear + os.chdir.assert_has_calls( + [ + mocker.call( + "/" + FLASH_PATH + ), + mocker.call( + "/" + ), + ] + ) + + assert sys.exit.called + + assert not ctx.display.draw_centered_text.called + + +def test_load_sd_kapp(m5stickv, mocker): + # TODO: make this + assert True \ No newline at end of file From fb8711cf6ec2c89596a18f961951a4ec086c89ea Mon Sep 17 00:00:00 2001 From: tadeubas Date: Thu, 26 Dec 2024 01:53:46 -0300 Subject: [PATCH 51/86] test remove unnecessary file --- tests/firmware/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/firmware/__init__.py diff --git a/tests/firmware/__init__.py b/tests/firmware/__init__.py deleted file mode 100644 index e69de29bb..000000000 From b28a5989e4646eca1c3b0c541fcc55879bb07e13 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Tue, 7 Jan 2025 01:30:22 -0300 Subject: [PATCH 52/86] tests kapp load_sd_kapp --- src/krux/pages/kapps.py | 2 + tests/pages/kapps.py | 327 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 298 insertions(+), 31 deletions(-) diff --git a/src/krux/pages/kapps.py b/src/krux/pages/kapps.py index ef91e2747..f01516c13 100644 --- a/src/krux/pages/kapps.py +++ b/src/krux/pages/kapps.py @@ -207,6 +207,8 @@ def load_sd_kapp(self): if file.endswith(MPY_FILE_EXTENSION): if sha256(flash_path_prefix + file) == data_hash: found_in_flash_vfs = True + filename_flash = file + break # Copy kapp + sig from SD to flash VFS, if app not found if not found_in_flash_vfs: diff --git a/tests/pages/kapps.py b/tests/pages/kapps.py index 7d727bc1b..4f934414f 100644 --- a/tests/pages/kapps.py +++ b/tests/pages/kapps.py @@ -24,7 +24,6 @@ def test_parse_all_flash_apps(m5stickv, mocker): signed_apps = kapps.parse_all_flash_apps() assert len(signed_apps) == 0 - ################################ print("Case 2: unsigned file, prompt for deletion, user deny, ValueError") @@ -43,9 +42,10 @@ def test_parse_all_flash_apps(m5stickv, mocker): signed_apps = kapps.parse_all_flash_apps() assert len(signed_apps) == 0 - ################################ - print("Case 3: unsigned file, prompt for deletion, user allow, remove unsigned file") + print( + "Case 3: unsigned file, prompt for deletion, user allow, remove unsigned file" + ) # User accept prompt ctx.input.wait_for_button = mocker.MagicMock(side_effect=[BUTTON_ENTER]) @@ -59,7 +59,6 @@ def test_parse_all_flash_apps(m5stickv, mocker): flash_path_prefix = "/%s/" % FLASH_PATH os.remove.assert_called_with(flash_path_prefix + unsigned_file) - ################################ print("Case 4: signed file") @@ -96,7 +95,6 @@ def test_valid_signature(m5stickv, mocker): with pytest.raises(ValueError, match="Invalid public key"): kapps.valid_signature(None, None) - ######################################## print("Case 2: valid signature") @@ -116,11 +114,11 @@ def test_execute_flash_kapp(m5stickv, mocker): from krux.themes import theme btn_seq = [ - BUTTON_PAGE, # case 1 skip prompt - BUTTON_ENTER, # case 2 accept prompt to execute - BUTTON_PAGE, # case 2 dismiss error msg - BUTTON_ENTER, # case 3 accept prompt to execute - ] + BUTTON_PAGE, # case 1 skip prompt + BUTTON_ENTER, # case 2 accept prompt to execute + BUTTON_PAGE, # case 2 dismiss error msg + BUTTON_ENTER, # case 3 accept prompt to execute + ] ########################################## print("Case 1: Exit when prompted to execute the app") @@ -139,8 +137,9 @@ def test_execute_flash_kapp(m5stickv, mocker): assert result == MENU_CONTINUE assert kapps.prompt.called - kapps.prompt.assert_called_with("Execute %s Krux app?" % kapp_name, ctx.display.height() // 2) - + kapps.prompt.assert_called_with( + "Execute %s Krux app?" % kapp_name, ctx.display.height() // 2 + ) ######################################### print("Case 2: Continue to execut the app, skip error msg") @@ -160,24 +159,21 @@ def test_execute_flash_kapp(m5stickv, mocker): kapps.execute_flash_kapp(kapp_name) assert os.chdir.called - + # First changed to flash path and execut app, then return to / when error appear os.chdir.assert_has_calls( [ - mocker.call( - "/" + FLASH_PATH - ), - mocker.call( - "/" - ), + mocker.call("/" + FLASH_PATH), + mocker.call("/"), ] ) assert sys.exit.called assert ctx.display.draw_centered_text.called - ctx.display.draw_centered_text.assert_called_with("Error:" + "\n" + "Could not execute %s" % kapp_name, theme.error_color) - + ctx.display.draw_centered_text.assert_called_with( + "Error:" + "\n" + "Could not execute %s" % kapp_name, theme.error_color + ) ####################################### print("Case 3: app executed") @@ -188,16 +184,12 @@ def test_execute_flash_kapp(m5stickv, mocker): kapps.execute_flash_kapp("kapp") assert os.chdir.called - + # First changed to flash path and execut app, then return to / when error appear os.chdir.assert_has_calls( [ - mocker.call( - "/" + FLASH_PATH - ), - mocker.call( - "/" - ), + mocker.call("/" + FLASH_PATH), + mocker.call("/"), ] ) @@ -206,7 +198,280 @@ def test_execute_flash_kapp(m5stickv, mocker): assert not ctx.display.draw_centered_text.called -def test_load_sd_kapp(m5stickv, mocker): - # TODO: make this +def test_load_sd_kapp_none_selected(m5stickv, mocker): + from krux.pages.kapps import Kapps + from krux.pages import MENU_CONTINUE + + mocker.patch( + "os.listdir", + new=mocker.MagicMock(return_value=[]), + ) + + ctx = create_ctx(mocker, []) + kapps = Kapps(ctx) + + assert kapps.load_sd_kapp() == MENU_CONTINUE + + +def test_load_sd_kapp_negate_load_sha_prompt(m5stickv, mocker): + from krux.pages.kapps import Kapps + from krux.pages import MENU_CONTINUE + from krux.input import BUTTON_PAGE + from krux.pages.utils import Utils + + btn_seq = [BUTTON_PAGE] # cancel the load of the file + + # Used on __init__ of a new Kapps + mocker.patch( + "os.listdir", + new=mocker.MagicMock(return_value=[]), + ) + + # Used to select a file from sd + mocker.patch.object( + Utils, + "load_file", + new=lambda self, file_ext, prompt, only_get_filename: ("f_name", "f_content"), + ) + + # Used to calculate the sha of the selected file + mocker.patch( + "krux.firmware.sha256", + new=mocker.MagicMock(return_value=b"sha256hashvalue"), + ) + + ctx = create_ctx(mocker, btn_seq) + kapps = Kapps(ctx) + + assert kapps.load_sd_kapp() == MENU_CONTINUE + + +def test_load_sd_kapp_sig_file_miss(m5stickv, mocker): + from krux.pages.kapps import Kapps + from krux.pages import MENU_CONTINUE + from krux.input import BUTTON_ENTER + from krux.pages.utils import Utils + + btn_seq = [BUTTON_ENTER] # accept the load of the file + + # Used on __init__ of a new Kapps + mocker.patch( + "os.listdir", + new=mocker.MagicMock(return_value=[]), + ) + + # Used to select a file from sd + mocker.patch.object( + Utils, + "load_file", + new=lambda self, file_ext, prompt, only_get_filename: ("f_name", "f_content"), + ) + + # Used to calculate the sha of the selected file + mocker.patch( + "krux.firmware.sha256", + new=mocker.MagicMock(return_value=b"sha256hashvalue"), + ) + + ctx = create_ctx(mocker, btn_seq) + kapps = Kapps(ctx) + + mocker.spy(kapps, "flash_error") + + assert kapps.load_sd_kapp() == MENU_CONTINUE + + kapps.flash_error.assert_called_with("Missing signature file") + + +def test_load_sd_kapp_sig_file_bad(m5stickv, mocker): + from krux.pages.kapps import Kapps + from krux.pages import MENU_CONTINUE + from krux.input import BUTTON_PAGE, BUTTON_ENTER + from krux.pages.utils import Utils + + btn_seq = [BUTTON_ENTER] # accept the load of the file + + # Used on __init__ of a new Kapps + mocker.patch( + "os.listdir", + new=mocker.MagicMock(return_value=[]), + ) + + # Used to select a file from sd + mocker.patch.object( + Utils, + "load_file", + new=lambda self, file_ext, prompt, only_get_filename: ("f_name", "f_content"), + ) + + # Used to calculate the sha of the selected file + mocker.patch( + "krux.firmware.sha256", + new=mocker.MagicMock(return_value=b"sha256hashvalue"), + ) + + mocker.patch("builtins.open", mocker.mock_open(read_data=b"sigdata")) + + ctx = create_ctx(mocker, btn_seq) + kapps = Kapps(ctx) + + mocker.spy(kapps, "flash_error") + + # Used to return a invalid signature + mocker.patch.object(kapps, "valid_signature", new=lambda sig, data_hash: False) + + assert kapps.load_sd_kapp() == MENU_CONTINUE + + kapps.flash_error.assert_called_with("Bad signature") + + +def test_load_sd_kapp_found_in_flash(m5stickv, mocker): + from krux.pages.kapps import Kapps + from krux.pages import MENU_CONTINUE + from krux.input import BUTTON_PAGE, BUTTON_ENTER + from krux.pages.utils import Utils + + btn_seq = [BUTTON_ENTER] # accept the load of the file + + # Used on __init__ of a new Kapps + mocker.patch( + "os.listdir", + new=mocker.MagicMock(return_value=["one_app.mpy"]), + ) + + # Used on __init__ of a new Kapps when .mpy found + mocker.patch("builtins.open", mocker.mock_open(read_data=b"sigdata")) + + # Used on __init__ of a new Kapps when sig found + mocker.patch.object(Kapps, "valid_signature", new=lambda self, sig, data_hash: True) + + # Used to select a file from sd + mocker.patch.object( + Utils, + "load_file", + new=lambda self, file_ext, prompt, only_get_filename: ("f_name", "f_content"), + ) + + # Used to calculate the sha of the selected file + mocker.patch( + "krux.firmware.sha256", + new=mocker.MagicMock(return_value=b"sha256hashvalue"), + ) + + ctx = create_ctx(mocker, btn_seq) + kapps = Kapps(ctx) + + mocker.spy(kapps, "flash_error") + + mocker.patch.object(kapps, "execute_flash_kapp", new=lambda name: "Success") + + assert kapps.load_sd_kapp() == "Success" + + kapps.flash_error.assert_not_called() + + +def test_load_sd_kapp_not_found_not_allow_store_in_flash(m5stickv, mocker): + from krux.pages.kapps import Kapps + from krux.pages import MENU_CONTINUE + from krux.input import BUTTON_PAGE, BUTTON_ENTER + from krux.pages.utils import Utils + + btn_seq = [ + BUTTON_ENTER, # accept the load of the file + BUTTON_PAGE, # don't allow to store in flash + ] + + # Used on __init__ of a new Kapps + mocker.patch( + "os.listdir", + new=mocker.MagicMock(return_value=["one_app.mpy"]), + ) + + # Used on __init__ of a new Kapps + mocker.patch("builtins.open", mocker.mock_open(read_data=b"sigdata")) + + # Used on __init__ of a new Kapps + mocker.patch.object(Kapps, "valid_signature", new=lambda self, sig, data_hash: True) + + # Used to select a file from sd + mocker.patch.object( + Utils, + "load_file", + new=lambda self, file_ext, prompt, only_get_filename: ("f_name", "f_content"), + ) + + # Used to calculate the sha of the selected file + def sha_return(firmware_size): + return values_list.pop() + + values_list = [b"sha256hash_OTHER_value", b"sha256hashvalue", b"sha256hashvalue"] + mocker.patch( + "krux.firmware.sha256", + new=sha_return, + ) + + ctx = create_ctx(mocker, btn_seq) + kapps = Kapps(ctx) + + mocker.spy(kapps, "flash_error") + mocker.spy(kapps, "execute_flash_kapp") + + assert kapps.load_sd_kapp() == MENU_CONTINUE + + kapps.flash_error.assert_not_called() + kapps.execute_flash_kapp.assert_not_called() + + +def test_load_sd_kapp_not_found_allow_store_in_flash(m5stickv, mocker): + from krux.pages.kapps import Kapps + from krux.pages import MENU_CONTINUE + from krux.input import BUTTON_PAGE, BUTTON_ENTER + from krux.pages.utils import Utils + + btn_seq = [ + BUTTON_ENTER, # accept the load of the file + BUTTON_ENTER, # allow to store in flash + ] + + # Used on __init__ of a new Kapps + mocker.patch( + "os.listdir", + new=mocker.MagicMock(return_value=["one_app.mpy"]), + ) + + # Used on __init__ of a new Kapps + mocker.patch("builtins.open", mocker.mock_open(read_data=b"sigdata")) + + # Used on __init__ of a new Kapps + mocker.patch.object(Kapps, "valid_signature", new=lambda self, sig, data_hash: True) + + # Used to select a file from sd + mocker.patch.object( + Utils, + "load_file", + new=lambda self, file_ext, prompt, only_get_filename: ("f_name", "f_content"), + ) + + # Used to calculate the sha of the selected file + def sha_return(firmware_size): + return values_list.pop() + + values_list = [b"sha256hash_OTHER_value", b"sha256hashvalue", b"sha256hashvalue"] + mocker.patch( + "krux.firmware.sha256", + new=sha_return, + ) + + ctx = create_ctx(mocker, btn_seq) + kapps = Kapps(ctx) + + mocker.spy(kapps, "flash_error") + + mocker.patch.object(kapps, "execute_flash_kapp", new=lambda name: "Success") + + mocker.spy(kapps, "execute_flash_kapp") + + assert kapps.load_sd_kapp() == "Success" - assert True \ No newline at end of file + kapps.flash_error.assert_not_called() + kapps.execute_flash_kapp.assert_called() From db42c761019cc7d966776b7a4fd63f12ccc3f051 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Fri, 21 Feb 2025 00:37:42 -0300 Subject: [PATCH 53/86] testing nostr app --- kapps/nostr.py | 49 +- tests/files/kapp.py | 1 - tests/kapps/__init__.py | 27 + tests/kapps/test_nostr.py | 1341 +++++++++++++++++++++++++++++++++++++ 4 files changed, 1395 insertions(+), 23 deletions(-) create mode 100644 tests/kapps/__init__.py create mode 100644 tests/kapps/test_nostr.py diff --git a/kapps/nostr.py b/kapps/nostr.py index fa3c7074a..472c3fd18 100644 --- a/kapps/nostr.py +++ b/kapps/nostr.py @@ -54,18 +54,19 @@ FILE_SUFFIX = "-nostr" FILE_EXTENSION = ".txt" + class NostrKey: def __init__(self): self.update() - def update(self, key = "none", value = None): + def update(self, key="none", value=None): self.key = key self.value = value def loaded(self): return self.key in (NSEC, PRIV_HEX, MNEMONIC) - + def loaded_mnemonic(self): print("loaded_mnemonic", self.key, self.value) return self.key == MNEMONIC @@ -78,25 +79,25 @@ def draw_wallet_indicator(self): """Customize the top bar""" text = NAME if nostrKey.loaded_mnemonic(): - super().draw_wallet_indicator() + text = self.ctx.wallet.key.fingerprint_hex_str(True) elif nostrKey.loaded(): text = nostrKey.key.upper() + + if self.ctx.display.width() > NARROW_SCREEN_WITH: + self.ctx.display.draw_hcentered_text( + text, + STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, + theme.highlight_color, + theme.info_bg_color, + ) else: - if self.ctx.display.width() > NARROW_SCREEN_WITH: - self.ctx.display.draw_hcentered_text( - text, - STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, - theme.highlight_color, - theme.info_bg_color, - ) - else: - self.ctx.display.draw_string( - 24, - STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, - text, - theme.highlight_color, - theme.info_bg_color, - ) + self.ctx.display.draw_string( + 24, + STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, + text, + theme.highlight_color, + theme.info_bg_color, + ) class Klogin(Login): @@ -254,7 +255,7 @@ def _load_nostr_priv_key(self, data): return True return False - + def _load_fake_mnemonic(self): from krux.wallet import Wallet @@ -284,8 +285,8 @@ def __init__(self, ctx): t("Backup Mnemonic"), ( self.backup_mnemonic - if not Settings().security.hide_mnemonic and - nostrKey.loaded_mnemonic() + if not Settings().security.hide_mnemonic + and nostrKey.loaded_mnemonic() else None ), ), @@ -300,6 +301,10 @@ def __init__(self, ctx): def nostr_keys(self): """Handler for Nostr Keys menu item""" + if nostrKey.loaded_mnemonic: + if not self.prompt(t("Create NIP06 keys?")): + return MENU_CONTINUE + try: self._get_private_key() except: @@ -444,4 +449,4 @@ def run(ctx): print("Exited!!!!") -nostrKey = NostrKey() \ No newline at end of file +nostrKey = NostrKey() diff --git a/tests/files/kapp.py b/tests/files/kapp.py index fc583852c..d8af9618a 100644 --- a/tests/files/kapp.py +++ b/tests/files/kapp.py @@ -1,3 +1,2 @@ def run(self): return True - \ No newline at end of file diff --git a/tests/kapps/__init__.py b/tests/kapps/__init__.py new file mode 100644 index 000000000..79b366300 --- /dev/null +++ b/tests/kapps/__init__.py @@ -0,0 +1,27 @@ +from ..shared_mocks import mock_context + +def create_ctx(mocker, btn_seq, wallet=None, printer=None, touch_seq=None): + """Helper to create mocked context obj""" + from krux.krux_settings import Settings, THERMAL_ADAFRUIT_TXT + + HASHED_IMAGE_BYTES = b"3\x0fr\x7fKY\x15\t\x83\xaab\x92\x0f&\x820\xb4\x14\x87\x19\xee\x95F\x9c\x8f\x0c\xbdo\xbc\x1d\xcbT" + + ctx = mock_context(mocker) + ctx.power_manager.battery_charge_remaining.return_value = 1 + ctx.input.wait_for_button = mocker.MagicMock(side_effect=btn_seq) + ctx.camera.capture_entropy = mocker.MagicMock(return_value=HASHED_IMAGE_BYTES) + ctx.is_logged_in.return_value = False + + ctx.wallet = wallet + ctx.printer = printer + if printer is not None: + mocker.patch("krux.printers.create_printer", new=mocker.MagicMock()) + Settings().hardware.printer.driver = THERMAL_ADAFRUIT_TXT + elif Settings().hardware.printer.driver != "none": + Settings().hardware.printer.driver = "none" + + if touch_seq: + ctx.input.touch = mocker.MagicMock( + current_index=mocker.MagicMock(side_effect=touch_seq) + ) + return ctx \ No newline at end of file diff --git a/tests/kapps/test_nostr.py b/tests/kapps/test_nostr.py new file mode 100644 index 000000000..46edd6e1c --- /dev/null +++ b/tests/kapps/test_nostr.py @@ -0,0 +1,1341 @@ +import pytest +from . import create_ctx + +@pytest.fixture +def mocker_printer(mocker): + mocker.patch("krux.printers.thermal.AdafruitPrinter", new=mocker.MagicMock()) + + +################### Test menus + + + + +def test_klogin_shutdown(m5stickv, mocker): + from kapps import nostr + from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV + + BTN_SEQUENCE = ( + # Move to shutdown + BUTTON_PAGE_PREV, + # Exit (shutdown / reset) + BUTTON_ENTER, + # Are you sure? + BUTTON_ENTER + ) + + ctx = create_ctx(mocker, BTN_SEQUENCE) + nostr.run(ctx) + + assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) + + +def test_klogin_about(m5stickv, mocker): + from kapps import nostr + from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV + from krux.pages import MENU_CONTINUE + + BTN_SEQUENCE = [ + # Exit + BUTTON_ENTER + ] + + ctx = create_ctx(mocker, BTN_SEQUENCE) + klogin = nostr.Klogin(ctx) + return_status = klogin.about() + + assert return_status == MENU_CONTINUE + assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) + +def test_menu_load_from_manual(m5stickv, mocker): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV + + BTN_SEQUENCE = ( + # Load Key from Manual + [BUTTON_PAGE, BUTTON_ENTER] + + + # Load from Numbers + [BUTTON_PAGE, BUTTON_ENTER] + + + # Decimal + [BUTTON_ENTER] + ) + + TEST_VALUE = "Test value" + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + mocker.patch.object( + login, "load_key_from_digits", mocker.MagicMock(return_value=TEST_VALUE) + ) + test_status = login.load_key() + + assert test_status == TEST_VALUE + assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) + + +def test_menu_new_key(m5stickv, mocker): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER + + BTN_SEQUENCE = ( + # New Key from Snapshot + [BUTTON_ENTER] + ) + + TEST_VALUE = "Test value" + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + mocker.patch.object( + login, "new_key_from_snapshot", mocker.MagicMock(return_value=TEST_VALUE) + ) + test_status = login.new_key() + + assert test_status == TEST_VALUE + assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) + + +def test_load_new_key_from_dice_module(m5stickv, mocker): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE_PREV + + BTN_SEQUENCE = [ + BUTTON_PAGE_PREV, # Go to Back + BUTTON_ENTER, # Exit + ] + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + login.new_key_from_dice() + + assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) + + +def test_tools_menu(m5stickv, mocker): + from krux.pages.login import Login, MENU_CONTINUE + from krux.input import BUTTON_ENTER, BUTTON_PAGE + + BTN_SEQUENCE = ( + # Back + [BUTTON_PAGE] * 7 + + [BUTTON_ENTER] + ) + + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + test_tools = login.tools() + + assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) + assert test_tools == MENU_CONTINUE + + +def test_load_setting_menu(m5stickv, mocker): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE_PREV + + BTN_SEQUENCE = [ + BUTTON_PAGE_PREV, # Go to Back + BUTTON_ENTER, # Exit + ] + + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + login.settings() + + assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) + + +################### Test load from storage menu + + +def test_load_from_storage(m5stickv, mocker): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV + + BTN_SEQUENCE = ( + # Load Key from Storage + [BUTTON_PAGE] * 2 + + [BUTTON_ENTER] + + [ + BUTTON_ENTER, # 1 press to continue loading key + BUTTON_ENTER, # 1 press to load wallet + ] + ) + + MNEMONIC = "diet glad hat rural panther lawsuit act drop gallery urge where fit" + + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + mocker.patch( + "krux.pages.encryption_ui.LoadEncryptedMnemonic.load_from_storage", + mocker.MagicMock(return_value=MNEMONIC.split(" ")), + ) + login.load_key() + print(ctx.wallet.key.mnemonic) + assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) + assert ctx.wallet.key.mnemonic == MNEMONIC + + +def test_new_12w_from_snapshot(m5stickv, mocker): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE_PREV + + # mocks a result of a hashed image + mocker.patch( + "krux.pages.capture_entropy.CameraEntropy.capture", return_value=b"\x01" * 32 + ) + + BTN_SEQUENCE = ( + # 1 press to proceed to 12 words + [BUTTON_ENTER] + + + # 1 press to proceed msg + [BUTTON_ENTER] + + + # SHA256 + [BUTTON_ENTER] + + + # Words + [BUTTON_ENTER] + + + # Load Wallet + [BUTTON_ENTER] + ) + MNEMONIC = "absurd amount doctor acoustic avoid letter advice cage absurd amount doctor adjust" + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + login.new_key_from_snapshot() + + assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) + assert ctx.wallet.key.mnemonic == MNEMONIC + + +def test_new_24w_from_snapshot(m5stickv, mocker): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE + + # mocks a result of a hashed image + mocker.patch( + "krux.pages.capture_entropy.CameraEntropy.capture", return_value=b"\x01" * 32 + ) + + BTN_SEQUENCE = ( + # 1 move to select 24 words, 1 press to proceed + [BUTTON_PAGE, BUTTON_ENTER] + + + # 1 press to proceed msg + [BUTTON_ENTER] + + + # SHA256 + [BUTTON_ENTER] + + + # Words 2x + [BUTTON_ENTER, BUTTON_ENTER] + + + # Load Wallet + [BUTTON_ENTER] + ) + MNEMONIC = "absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice comic" + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + login.new_key_from_snapshot() + + assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) + assert ctx.wallet.key.mnemonic == MNEMONIC + + +def test_new_double_mnemonic_from_snapshot(m5stickv, mocker): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE + from krux.wallet import is_double_mnemonic + from krux.display import DEFAULT_PADDING + from krux.themes import WHITE, BLACK + + # mocks a result of a hashed image + mocker.patch( + "krux.pages.capture_entropy.CameraEntropy.capture", return_value=b"\x01" * 32 + ) + + BTN_SEQUENCE = ( + # 2 moves to select double mnemonic, 1 press to proceed + [BUTTON_PAGE, BUTTON_PAGE, BUTTON_ENTER] + + + # 1 press to proceed msg + [BUTTON_ENTER] + + + # SHA256 + [BUTTON_ENTER] + + + # Words 2x + [BUTTON_ENTER, BUTTON_ENTER] + + + # Load Wallet + [BUTTON_ENTER] + ) + MNEMONIC = "absurd amount doctor acoustic avoid letter advice cage absurd amount doctor adjust absurd amount doctor acoustic avoid letter advice cage absurd amount doll fancy" + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + login.new_key_from_snapshot() + + assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) + assert ctx.wallet.key.mnemonic == MNEMONIC + assert is_double_mnemonic(MNEMONIC) == True + ctx.display.draw_hcentered_text.assert_has_calls( + [mocker.call("BIP39 Mnemonic*", 5)] + ) + + +########## load words from qrcode tests + + +def test_load_12w_camera_qrcode_words(m5stickv, mocker, mocker_printer): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER + from krux.qr import FORMAT_NONE + from krux.pages.qr_capture import QRCodeCapture + + BTN_SEQUENCE = ( + # 1 press to proceed with the 12 words + [BUTTON_ENTER] + + + # Load the wallet + [BUTTON_ENTER] + ) + QR_FORMAT = FORMAT_NONE + MNEMONIC = ( + "olympic term tissue route sense program under choose bean emerge velvet absurd" + ) + + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + mocker.patch.object( + QRCodeCapture, "qr_capture_loop", new=lambda self: (MNEMONIC, QR_FORMAT) + ) + login.load_key_from_qr_code() + + assert ctx.wallet.key.mnemonic == MNEMONIC + + +def test_load_12w_camera_qrcode_numbers(m5stickv, mocker, mocker_printer): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER + from krux.qr import FORMAT_NONE + from krux.pages.qr_capture import QRCodeCapture + + BTN_SEQUENCE = ( + # 1 press to proceed with the 12 words + [BUTTON_ENTER] + + + # Load the wallet + [BUTTON_ENTER] + ) + QR_FORMAT = FORMAT_NONE + MNEMONIC = ( + "olympic term tissue route sense program under choose bean emerge velvet absurd" + ) + ENCODED_MNEMONIC = "123417871814150815661375189403220156058119360008" + + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + mocker.patch.object( + QRCodeCapture, "qr_capture_loop", new=lambda self: (ENCODED_MNEMONIC, QR_FORMAT) + ) + login.load_key_from_qr_code() + + assert ctx.wallet.key.mnemonic == MNEMONIC + + +def test_load_12w_camera_qrcode_binary(m5stickv, mocker, mocker_printer): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER + from krux.qr import FORMAT_NONE + from krux.pages.qr_capture import QRCodeCapture + + BTN_SEQUENCE = ( + # 1 press to proceed with the 12 words + [BUTTON_ENTER] + + + # Load the wallet + [BUTTON_ENTER] + ) + QR_FORMAT = FORMAT_NONE + C_SEED_QRs = [ + ( + b"[\xbd\x9dq\xa8\xecy\x90\x83\x1a\xff5\x9dBeE", + "forum undo fragile fade shy sign arrest garment culture tube off merit", + ), + ( + b"[\xbd\x9dq\xa8\xecy\x90\x83\x1a\xff5\x9dBeE".decode("latin1"), + "forum undo fragile fade shy sign arrest garment culture tube off merit", + ), + ( + b"[\xbd\x9dq\xa8\xec \x90\x83\x1a\xff5\x9dBeE".decode("latin1"), + "forum undo fragile fade search embark arrest garment culture tube off melt", + ), + ] + + for c_seed_qr in C_SEED_QRs: + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + mocker.patch.object( + QRCodeCapture, "qr_capture_loop", new=lambda self: (c_seed_qr[0], QR_FORMAT) + ) + login.load_key_from_qr_code() + + assert ctx.wallet.key.mnemonic == c_seed_qr[1] + + +def test_load_24w_camera_qrcode_words(m5stickv, mocker, mocker_printer): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER + from krux.qr import FORMAT_NONE + from krux.pages.qr_capture import QRCodeCapture + + BTN_SEQUENCE = ( + # 1 press to proceed with the 12 words + [BUTTON_ENTER] + + + # 1 press to proceed with the next 12 words + [BUTTON_ENTER] + + + # Load the wallet + [BUTTON_ENTER] + ) + QR_FORMAT = FORMAT_NONE + MNEMONIC = "brush badge sing still venue panther kitchen please help panel bundle excess sign couch stove increase human once effort candy goat top tiny major" + + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + mocker.patch.object( + QRCodeCapture, "qr_capture_loop", new=lambda self: (MNEMONIC, QR_FORMAT) + ) + login.load_key_from_qr_code() + + assert ctx.wallet.key.mnemonic == MNEMONIC + + +def test_load_24w_camera_qrcode_numbers(m5stickv, mocker, mocker_printer): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER + from krux.qr import FORMAT_NONE + from krux.pages.qr_capture import QRCodeCapture + + BTN_SEQUENCE = ( + # 1 press to proceed with the 12 words + [BUTTON_ENTER] + + + # 1 press to proceed with the next 12 words + [BUTTON_ENTER] + + + # Load the wallet + [BUTTON_ENTER] + ) + QR_FORMAT = FORMAT_NONE + MNEMONIC = "brush badge sing still venue panther kitchen please help panel bundle excess sign couch stove increase human once effort candy goat top tiny major" + ENCODED_MNEMONIC = "023301391610171019391278098413310856127602420628160203911717091708861236056502660800183118111075" + + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + mocker.patch.object( + QRCodeCapture, "qr_capture_loop", new=lambda self: (ENCODED_MNEMONIC, QR_FORMAT) + ) + login.load_key_from_qr_code() + + assert ctx.wallet.key.mnemonic == MNEMONIC + + +def test_load_24w_camera_qrcode_binary(m5stickv, mocker, mocker_printer): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER + from krux.qr import FORMAT_NONE + from krux.pages.qr_capture import QRCodeCapture + + BTN_SEQUENCE = ( + # 1 press to proceed with the 12 words + [BUTTON_ENTER] + + + # 1 press to proceed with the next 12 words + [BUTTON_ENTER] + + + # Load the wallet + [BUTTON_ENTER] + ) + QR_FORMAT = FORMAT_NONE + MNEMONIC = "attack pizza motion avocado network gather crop fresh patrol unusual wild holiday candy pony ranch winter theme error hybrid van cereal salon goddess expire" + BINARY_MNEMONIC = b"\x0et\xb6A\x07\xf9L\xc0\xcc\xfa\xe6\xa1=\xcb\xec6b\x15O\xecg\xe0\xe0\t\x99\xc0x\x92Y}\x19\n" + + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + mocker.patch.object( + QRCodeCapture, "qr_capture_loop", new=lambda self: (BINARY_MNEMONIC, QR_FORMAT) + ) + login.load_key_from_qr_code() + + assert ctx.wallet.key.mnemonic == MNEMONIC + + +def test_load_12w_camera_qrcode_format_ur(m5stickv, mocker, mocker_printer): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER + from krux.qr import FORMAT_UR + from krux.pages.qr_capture import QRCodeCapture + import binascii + from ur.ur import UR + + BTN_SEQUENCE = ( + # 1 press to proceed with the 12 words + [BUTTON_ENTER] + + + # Load the wallet + [BUTTON_ENTER] + ) + QR_FORMAT = FORMAT_UR + UR_DATA = UR( + "crypto-bip39", + bytearray( + binascii.unhexlify( + "A2018C66736869656C646567726F75706565726F6465656177616B65646C6F636B6773617573616765646361736865676C6172656477617665646372657765666C616D6565676C6F76650262656E" + ) + ), + ) + MNEMONIC = "shield group erode awake lock sausage cash glare wave crew flame glove" + + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + mocker.patch.object( + QRCodeCapture, "qr_capture_loop", new=lambda self: (UR_DATA, QR_FORMAT) + ) + login.load_key_from_qr_code() + + assert ctx.wallet.key.mnemonic == MNEMONIC + + +############### load words from text tests + + +def test_load_key_from_text(m5stickv, mocker): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE + + cases = [ + ( + [BUTTON_ENTER] + + ( + # A + [BUTTON_ENTER] + + + # B + [BUTTON_ENTER] + + + # I + [BUTTON_ENTER] + + + # Confirm + [BUTTON_ENTER] + ) + * 11 + + ( + # N + [BUTTON_PAGE for _ in range(13)] + + [BUTTON_ENTER] + + + # O + [BUTTON_ENTER] + + + # R + [BUTTON_PAGE, BUTTON_ENTER] + + + # T + [BUTTON_ENTER] + + + # Go + [BUTTON_ENTER] + ) + + [ + BUTTON_ENTER, # Done? + BUTTON_ENTER, # 12 word confirm + BUTTON_ENTER, # Load wallet + ], + "ability ability ability ability ability ability ability ability ability ability ability north", + ), + ( + [BUTTON_ENTER] + + ( + # A + [BUTTON_ENTER] + + + # B + [BUTTON_ENTER] + + + # I + [BUTTON_ENTER] + + + # Confirm + [BUTTON_ENTER] + ) + * 11 + + + # Go + Confirm word + [BUTTON_PAGE for _ in range(28)] + + [BUTTON_ENTER] # A + + [BUTTON_PAGE, BUTTON_ENTER] # C + + [BUTTON_PAGE, BUTTON_PAGE, BUTTON_ENTER] # I + + [BUTTON_ENTER] # Go + + [ + BUTTON_ENTER, # Done? + BUTTON_ENTER, # 12 word confirm + BUTTON_ENTER, # Load wallet + ], + "ability ability ability ability ability ability ability ability ability ability ability acid", + ), + ] + num = 0 + for case in cases: + print(num) + num += 1 + ctx = create_ctx(mocker, case[0]) + login = Login(ctx) + + login.load_key_from_text() + + assert ctx.input.wait_for_button.call_count == len(case[0]) + assert ctx.wallet.key.mnemonic == case[1] + + +def test_load_key_from_text_on_amigo_tft_with_touch(amigo, mocker, mocker_printer): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV, BUTTON_TOUCH + + cases = [ + ( + [BUTTON_ENTER] + + ( + # A + [BUTTON_ENTER] + + + # B + [BUTTON_ENTER] + + + # I + [BUTTON_ENTER] + + + # Confirm + [BUTTON_ENTER] + ) + * 11 + + ( + # N + [BUTTON_TOUCH] # index 13 -> "n" + + [BUTTON_TOUCH] # index 14 -> "o" + + [BUTTON_TOUCH] # index 17 -> "r" + + + # Touch on del + [BUTTON_TOUCH] # index 27 -> "Del" + + + # Invalid Position + [BUTTON_TOUCH] # index 26 "empty" + + [BUTTON_TOUCH] # index 17 -> "r" + + [BUTTON_TOUCH] # index 19 -> "t" + + + # Confirm word -> index 0 (Yes) + [BUTTON_TOUCH] + ) + + + # Done? Confirm, Words correct? Confirm, No passphrase, Single-sig + [ + BUTTON_ENTER, + BUTTON_ENTER, + BUTTON_ENTER, # Load wallet + ], + "ability ability ability ability ability ability ability ability ability ability ability north", + [13, 14, 17, 27, 26, 17, 19, 1], + ), + ] + + num = 0 + for case in cases: + num = num + 1 + print(num) + + ctx = create_ctx(mocker, case[0], touch_seq=case[2]) + + login = Login(ctx) + login.load_key_from_text() + + assert ctx.input.wait_for_button.call_count == len(case[0]) + assert ctx.wallet.key.mnemonic == case[1] + + +def test_create_key_from_text(m5stickv, mocker): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE + + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE + + cases = [ + ( + [BUTTON_ENTER] # 12 words + + [BUTTON_ENTER] # Proceed + + ( + # A + [BUTTON_ENTER] + + + # B + [BUTTON_ENTER] + + + # I + [BUTTON_ENTER] + + + # Confirm + [BUTTON_ENTER] + ) + * 11 + + [BUTTON_ENTER] # Skip blank message + + ( + # N + [BUTTON_PAGE for _ in range(13)] + + [BUTTON_ENTER] + + + # O + [BUTTON_ENTER] + + + # R + [BUTTON_ENTER] + + + # Confirm "North" + [BUTTON_ENTER] + ) + + [ + BUTTON_ENTER, # 12 word confirm + BUTTON_ENTER, # Load wallet + ], + "ability ability ability ability ability ability ability ability ability ability ability north", + ), + ] + num = 0 + for case in cases: + print(num) + num += 1 + ctx = create_ctx(mocker, case[0]) + login = Login(ctx) + + login.load_key_from_text(new=True) + + assert ctx.input.wait_for_button.call_count == len(case[0]) + assert ctx.wallet.key.mnemonic == case[1] + + +############## load words from digits tests + + +def test_load_key_from_digits(m5stickv, mocker, mocker_printer): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE + + cases = [ + ( + [BUTTON_ENTER] # 1 press confirm msg + + ( + # 1 press change to number "2" and 1 press to select + [BUTTON_PAGE, BUTTON_ENTER] + + + # 11 press to place on btn Go + [BUTTON_PAGE] * 11 + + [ + BUTTON_ENTER, + BUTTON_ENTER, + ] # 1 press to select and 1 press to confirm + ) + * 11 # repeat selection of word=2 (ability) eleven times + + ( + # 1 + [BUTTON_ENTER] + + + # 2 + [BUTTON_PAGE, BUTTON_ENTER] + + + # 0 + [BUTTON_PAGE] * 8 + + [BUTTON_ENTER] + + + # 3 + [BUTTON_PAGE] * 6 + + [BUTTON_ENTER] + # Confirm twelve word=1203 (north) + + [BUTTON_ENTER] + ) + + [ + BUTTON_ENTER, # Done? + BUTTON_ENTER, # 12 numbers confirm + BUTTON_ENTER, # 12 word confirm + BUTTON_ENTER, # Load wallet + ], + "ability ability ability ability ability ability ability ability ability ability ability north", + ), + ( + [BUTTON_ENTER] # 1 press confirm msg + + ( + # 1 press change to number "2" and 1 press to select + [BUTTON_PAGE, BUTTON_ENTER] + + + # 10 press to place on btn Go + [BUTTON_PAGE] * 11 + + [ + BUTTON_ENTER, + BUTTON_ENTER, + ] # 1 press to select and 1 press to confirm + ) + * 11 # repeat selection of word=2 (ability) eleven times + + ( + # 1 + [BUTTON_ENTER] + + + # 6 + [BUTTON_PAGE] * 5 + + [BUTTON_ENTER] + + + # Go + [BUTTON_PAGE] * 7 + + [BUTTON_ENTER] + # Confirm + + [BUTTON_ENTER] + ) + + [ + BUTTON_ENTER, # Done? + BUTTON_ENTER, # 12 numbers confirm + BUTTON_ENTER, # 12 word confirm + BUTTON_ENTER, # Load wallet + ], + "ability ability ability ability ability ability ability ability ability ability ability acid", + ), + ] + num = 0 + for case in cases: + print("case:", num) + num = num + 1 + ctx = create_ctx(mocker, case[0]) + login = Login(ctx) + + login.load_key_from_digits() + + assert ctx.input.wait_for_button.call_count == len(case[0]) + assert ctx.wallet.key.mnemonic == case[1] + + +def test_load_12w_from_hexadecimal(m5stickv, mocker, mocker_printer): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV + + BTN_SEQUENCE = ( + [BUTTON_ENTER] # 1 press confirm msg + + ( + # 4 press change to number "F" + [BUTTON_PAGE_PREV, BUTTON_PAGE_PREV, BUTTON_PAGE_PREV, BUTTON_PAGE_PREV] + + [BUTTON_ENTER] # 1 press to select F + + [BUTTON_ENTER] # 1 press to select F again + + [BUTTON_ENTER] # 1 press to confirm word=FF(255 decimal) cabin + ) + * 11 # repeat selection of word=FF(255, cabin) eleven times + + ( + [BUTTON_ENTER] # 1 press to number 1 + + [BUTTON_ENTER] # 1 press to number 1 + + [BUTTON_PAGE for _ in range(4)] # 4 press change to number 5 + + [BUTTON_ENTER] # 1 press to select 5 + + [BUTTON_ENTER] # Confirm word=115(277 decimal) card + ) + + [ + BUTTON_ENTER, # Done? + BUTTON_ENTER, # 12 numbers confirm + BUTTON_ENTER, # 12 word confirm + BUTTON_ENTER, # Load wallet + ] + ) + MNEMONIC = "cabin cabin cabin cabin cabin cabin cabin cabin cabin cabin cabin card" + + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + + login.load_key_from_hexadecimal() + + assert ctx.wallet.key.mnemonic == MNEMONIC + + +def test_possible_letters_from_hexadecimal(m5stickv, mocker, mocker_printer): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV + + BTN_SEQUENCE = ( + [BUTTON_ENTER] # 1 press confirm msg + + ( + # 7 press change to number "8" + [ + BUTTON_PAGE, + BUTTON_PAGE, + BUTTON_PAGE, + BUTTON_PAGE, + BUTTON_PAGE, + BUTTON_PAGE, + BUTTON_PAGE, + ] + + [BUTTON_ENTER] # 1 press to select 8 + + + # 8 press change to number "0" + [ + BUTTON_PAGE_PREV, + BUTTON_PAGE_PREV, + BUTTON_PAGE_PREV, + BUTTON_PAGE_PREV, + BUTTON_PAGE_PREV, + BUTTON_PAGE_PREV, + BUTTON_PAGE_PREV, + BUTTON_PAGE_PREV, + ] + + [BUTTON_ENTER] # 1 press to select 0 + + + # 3 press change to btn "Go" (all other numbers are disabled) + [ + BUTTON_PAGE, + BUTTON_PAGE, + BUTTON_PAGE, + ] + + [BUTTON_ENTER] # 1 press to select Go + + [BUTTON_ENTER] # 1 press to confirm word=80(128 decimal) avocado + ) + * 11 # repeat selection of word=80(128, avocado) eleven times + + ( + [BUTTON_PAGE] * 4 # 4 presses to change to 5 + + [BUTTON_ENTER] # 1 press to select 5 + + [BUTTON_PAGE_PREV] * 6 # 6 press change to btn Go + + [BUTTON_ENTER] # 1 press to select Go + + [BUTTON_ENTER] # Confirm "above" + ) + + [ + BUTTON_ENTER, # Done? + BUTTON_ENTER, # 12 numbers confirm + BUTTON_ENTER, # 12 word confirm + BUTTON_ENTER, # Load wallet + ] + ) + MNEMONIC = "avocado avocado avocado avocado avocado avocado avocado avocado avocado avocado avocado above" + + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + + login.load_key_from_hexadecimal() + + assert ctx.wallet.key.mnemonic == MNEMONIC + + +def test_load_12w_from_octal(m5stickv, mocker, mocker_printer): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV + + BTN_SEQUENCE = ( + [BUTTON_ENTER] # 1 press confirm msg + + ( + # 4 press change to number "7" + [BUTTON_PAGE_PREV] * 4 + + [BUTTON_ENTER] # 1 press to select 7 + + [BUTTON_ENTER] # 1 press to select 7 again + + [BUTTON_ENTER] # 1 press to select 7 again + + [BUTTON_ENTER] # 1 press to confirm word=777(511 decimal) divert + ) + * 11 # repeat selection of word=777(511, divert) eleven times + + ( + [BUTTON_ENTER] # 1 press to select 1 + + [BUTTON_PAGE] * 4 # 4 press change to number 5 + + [BUTTON_ENTER] # 1 press to number 5 + + [BUTTON_PAGE_PREV] * 3 # 3 press change to number 2 + + [BUTTON_ENTER] # 1 press to select 2 + + [BUTTON_PAGE] * 2 # 2 press change to number 4 + + [BUTTON_ENTER] # 1 press to select 4 + + [BUTTON_ENTER] # Confirm word=1524(852 decimal) heavy + ) + + [ + BUTTON_ENTER, # Done + BUTTON_ENTER, # 12 numbers confirm + BUTTON_ENTER, # 12 word confirm + BUTTON_ENTER, # Load wallet + ] + ) + MNEMONIC = "divert divert divert divert divert divert divert divert divert divert divert heavy" + + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + + login.load_key_from_octal() + + assert ctx.wallet.key.mnemonic == MNEMONIC + + +def test_possible_letters_from_octal(m5stickv, mocker, mocker_printer): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV + + BTN_SEQUENCE = ( + [BUTTON_ENTER] # 1 press confirm msg + + ( + # 3 press change to number "4" + [ + BUTTON_PAGE, + BUTTON_PAGE, + BUTTON_PAGE, + ] + + [BUTTON_ENTER] # 1 press to select 4 + + + # 4 press change to number "0" + [ + BUTTON_PAGE_PREV, + BUTTON_PAGE_PREV, + BUTTON_PAGE_PREV, + BUTTON_PAGE_PREV, + ] + + [BUTTON_ENTER] # 1 press to select 0 + + [BUTTON_ENTER] # 1 press to select 0 + + + # 3 press change to btn "Go" (all other numbers are disabled) + [ + BUTTON_PAGE, + BUTTON_PAGE, + BUTTON_PAGE, + ] + + [BUTTON_ENTER] # 1 press to select Go + + [BUTTON_ENTER] # 1 press to confirm word=400(256 decimal) cable + ) + * 11 # repeat selection of word=400(256, cable) eleven times + + ( + [BUTTON_ENTER] # 1 press select 1 + + [BUTTON_PAGE] * 5 # 5 presses to change to 6 + + [BUTTON_ENTER] # 1 press to select 6 + + [BUTTON_PAGE] * 4 # 4 presses to change to Go + + [BUTTON_ENTER] # 1 press to select Go + + [BUTTON_ENTER] # Confirm word=16(14 decimal) accuse + ) + + [ + BUTTON_ENTER, # Done? + BUTTON_ENTER, # 12 numbers confirm + BUTTON_ENTER, # 12 word confirm + BUTTON_ENTER, # Load wallet + BUTTON_ENTER, # Load wallet + ] + ) + MNEMONIC = ( + "cable cable cable cable cable cable cable cable cable cable cable accuse" + ) + + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + + login.load_key_from_octal() + + assert ctx.wallet.key.mnemonic == MNEMONIC + + +def test_leaving_keypad(mocker, amigo): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV + + BTN_SEQUENCE = [ + BUTTON_ENTER, # Proceed + BUTTON_PAGE_PREV, # Move to Go + BUTTON_PAGE_PREV, # Move to ESC + BUTTON_ENTER, # Press ESC + BUTTON_ENTER, # Leave + ] + ctx = create_ctx(mocker, BTN_SEQUENCE) + + login = Login(ctx) + login.load_key_from_text() + assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) + + +def test_no_passphrase_on_amigo(mocker, amigo): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE_PREV, BUTTON_PAGE + + case = ( + [BUTTON_ENTER] + + ( + # A + [BUTTON_ENTER] + + + # B + [BUTTON_ENTER] + + + # I + [BUTTON_ENTER] + + + # Confirm + [BUTTON_ENTER] + ) + * 11 + + [BUTTON_ENTER] # A + + [BUTTON_PAGE, BUTTON_ENTER] # C + + [BUTTON_PAGE, BUTTON_PAGE, BUTTON_ENTER] # I + + [BUTTON_ENTER] # Go + + [BUTTON_ENTER] # Done? + + [BUTTON_ENTER] # 12 word confirm + + [BUTTON_ENTER] # Load wallet + ) + + ctx = create_ctx(mocker, case) + login = Login(ctx) + login.load_key_from_text() + assert ctx.input.wait_for_button.call_count == len(case) + + +def test_passphrase(amigo, mocker, mocker_printer): + from krux.pages.login import Login + from krux.input import ( + BUTTON_ENTER, + BUTTON_PAGE, + BUTTON_PAGE_PREV, + SWIPE_LEFT, + SWIPE_RIGHT, + ) + + case = ( + [BUTTON_ENTER] + + ( + # A + [BUTTON_ENTER] + + + # B + [BUTTON_ENTER] + + + # I + [BUTTON_ENTER] + + + # Confirm + [BUTTON_ENTER] + ) + * 11 + + [BUTTON_ENTER] # A + + [BUTTON_PAGE, BUTTON_ENTER] # C + + [BUTTON_PAGE, BUTTON_PAGE, BUTTON_ENTER] # I + + [BUTTON_ENTER] # Go + + [BUTTON_ENTER] # Done? + + [BUTTON_ENTER] # 12 word confirm + + + # Passphrase, confirm + [BUTTON_PAGE, BUTTON_ENTER, BUTTON_ENTER] + + + # In passphrase keypad: + [ + SWIPE_RIGHT, # Test keypad swaping + BUTTON_ENTER, # Add "+" character + SWIPE_LEFT, # + BUTTON_ENTER, # Add "a" character + BUTTON_PAGE_PREV, # Move to Go + BUTTON_ENTER, # Press Go + BUTTON_ENTER, # Confirm passphrase + BUTTON_ENTER, # Load Wallet + ] + ) + + ctx = create_ctx(mocker, case) + login = Login(ctx) + login.load_key_from_text() + assert ctx.input.wait_for_button.call_count == len(case) + + +############### load words from tiny seed (bits) + + +def test_load_12w_from_tiny_seed(amigo, mocker, mocker_printer): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV + + BTN_SEQUENCE = ( + [BUTTON_ENTER] # 1 press 12w + + [BUTTON_PAGE_PREV] # 1 press to change to "Go" + + [BUTTON_ENTER] # 1 press to select Go + + [ + BUTTON_ENTER, # 12 word confirm + BUTTON_ENTER, # Load wallet + ] + ) + MNEMONIC = "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo daring" + + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + + login.load_key_from_tiny_seed() + + assert ctx.wallet.key.mnemonic == MNEMONIC + + +def test_load_24w_from_tiny_seed(m5stickv, mocker, mocker_printer): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV + + BTN_SEQUENCE = ( + [BUTTON_PAGE] # 1 press to change to 24w + + [BUTTON_ENTER] # 1 press select 24w + + [BUTTON_PAGE] # 1 press to change to bit 1024 + + [BUTTON_ENTER] # 1 press to select bit 1024 + + [BUTTON_PAGE_PREV for _ in range(2)] # 2 press to change to "Go" + + [BUTTON_ENTER] # 1 press to select Go screen 12w + + [BUTTON_ENTER] # 1 press to select Go screen 24w + + [ + BUTTON_ENTER, # 12 word confirm + BUTTON_ENTER, # 24 word confirm + BUTTON_ENTER, # Load wallet + ] + ) + MNEMONIC = "lend zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo blossom" + + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + + login.load_key_from_tiny_seed() + + assert ctx.wallet.key.mnemonic == MNEMONIC + + +def test_load_key_from_tiny_seed_scanner_12w(m5stickv, mocker): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV + + BTN_SEQUENCE = ( + [BUTTON_ENTER] # 12 words + + [BUTTON_ENTER] # Confirm + + [ + BUTTON_ENTER, # 12 word confirm + BUTTON_ENTER, # Load wallet + ] + ) + MNEMONIC = ( + "idle item three donate heavy auto worry mass casual wrestle shock orphan" + ) + + mocker.patch( + "krux.pages.tiny_seed.TinyScanner.scanner", + new=mocker.MagicMock(return_value=MNEMONIC.split()), + ) + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + login.load_key_from_tiny_seed_image() + + assert ctx.wallet.key.mnemonic == MNEMONIC + + +def test_load_12w_from_1248(m5stickv, mocker, mocker_printer): + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV + + BTN_SEQUENCE = ( + ( + [BUTTON_ENTER] # 1 press select first column num 1 + + [BUTTON_PAGE_PREV] # 1 press to change to "Go" + + [BUTTON_ENTER] # 1 press to select Go + + [BUTTON_ENTER] # 1 press to confirm word 1000 language + ) + * 11 # do this eleven times + + [BUTTON_PAGE for _ in range(2)] # 2 press to change second column num 1 + + [BUTTON_ENTER] # 1 press to select second column num 1 + + [BUTTON_PAGE for _ in range(5)] # 5 press to change third column num 2 + + [BUTTON_ENTER] # 1 press to select third column num 2 + + [BUTTON_PAGE for _ in range(8)] # 8 press to change to "Go" + + [BUTTON_ENTER] # 1 press to select Go + + [BUTTON_ENTER] # 1 press to confirm word 120 auction + + [ + BUTTON_ENTER, # Done? + BUTTON_ENTER, # 12 word confirm + BUTTON_ENTER, # Load wallet + ] + ) + MNEMONIC = "language language language language language language language language language language language auction" + + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + + login.load_key_from_1248() + + assert ctx.wallet.key.mnemonic == MNEMONIC + + +def test_customization_while_loading_wallet(amigo, mocker): + import sys + from krux.pages.login import Login + from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV + + BTN_SEQUENCE = ( + [BUTTON_ENTER] # Confirm words + + [BUTTON_PAGE] * 2 # Move to "Customize" + + [BUTTON_ENTER] # Select "Customize" + + [BUTTON_PAGE_PREV] # Move to Back + + [BUTTON_ENTER] # Select Back + + [BUTTON_PAGE_PREV] # Move to Back + + [BUTTON_ENTER] # Select Back to leave + + [BUTTON_ENTER] # Confirm + ) + + MNEMONIC = "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo daring" + + ctx = create_ctx(mocker, BTN_SEQUENCE) + login = Login(ctx) + login._load_key_from_words(MNEMONIC.split()) + + assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) + # Assert that the wallet settings module was loaded + assert "krux.pages.wallet_settings" in sys.modules + + +def test_about(mocker, m5stickv): + import krux + from krux.pages.login import Login + import board + from krux.metadata import VERSION + from krux.input import BUTTON_ENTER + + BTN_SEQUENCE = [BUTTON_ENTER, BUTTON_ENTER] + + ctx = create_ctx(mocker, BTN_SEQUENCE) + + login = Login(ctx) + + login.about() + + ctx.input.wait_for_button.assert_called_once() + ctx.display.draw_centered_text.assert_called_with( + "Krux\nselfcustody.github.io/krux\n\nHardware\n" + + board.config["type"] + + "\n\nVersion\n" + + VERSION + ) + + +def test_auto_complete_qr_words(m5stickv, mocker): + from krux.pages.login import Login + + ctx = create_ctx(mocker, []) + login = Login(ctx) + + # Test case where all words are valid + words = ["abandon"] * 12 + result = login.auto_complete_qr_words(words) + assert result == words + + # Test case where some words need to be autocompleted + words = ["abandon", "abil", "abl"] + ["abandon"] * 9 + expected_result = ["abandon", "ability", "able"] + ["abandon"] * 9 + result = login.auto_complete_qr_words(words) + assert result == expected_result + + # Test case where a word cannot be autocompleted + words = ["aband", "abil", "xyz"] + ["abandon"] * 9 + result = login.auto_complete_qr_words(words) + assert result == [] + + # Test case where all words need to be autocompleted + words = ["aband", "abil", "abl"] + ["abandon"] * 9 + expected_result = ["abandon", "ability", "able"] + ["abandon"] * 9 + result = login.auto_complete_qr_words(words) + assert result == expected_result + + # Test case with mixed case words + words = ["AbAnD", "aBiL", "AbL"] + ["abandon"] * 9 + expected_result = ["abandon", "ability", "able"] + ["abandon"] * 9 + result = login.auto_complete_qr_words(words) + assert result == expected_result From 592b628e3dd3adc6fb09d8191c3c389af4586cf3 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Tue, 25 Mar 2025 11:04:54 -0300 Subject: [PATCH 54/86] fix kapps on device --- src/krux/pages/kapps.py | 6 ++++-- tests/pages/{kapps.py => test_kapps.py} | 0 2 files changed, 4 insertions(+), 2 deletions(-) rename tests/pages/{kapps.py => test_kapps.py} (100%) diff --git a/src/krux/pages/kapps.py b/src/krux/pages/kapps.py index f01516c13..672b5f70b 100644 --- a/src/krux/pages/kapps.py +++ b/src/krux/pages/kapps.py @@ -180,7 +180,8 @@ def load_sd_kapp(self): # Confirm hash string self.ctx.display.clear() self.ctx.display.draw_hcentered_text( - filename + "\n\n" + "SHA256:\n" + binascii.hexlify(data_hash).decode() + filename + "\n\n" + "SHA256:\n\n" + binascii.hexlify(data_hash).decode(), + highlight_prefix=":", ) if not self.prompt(t("Proceed?"), BOTTOM_PROMPT_LINE): return MENU_CONTINUE @@ -202,6 +203,7 @@ def load_sd_kapp(self): # Check if app is already installed in flash found_in_flash_vfs = False + filename_flash = "" flash_path_prefix = "/%s/" % FLASH_PATH for file in os.listdir(flash_path_prefix): if file.endswith(MPY_FILE_EXTENSION): @@ -221,7 +223,7 @@ def load_sd_kapp(self): return MENU_CONTINUE # Save APP .mpy - filename_flash = filename.rsplit("/", maxsplit=1)[-1] + filename_flash = filename.rsplit("/", 1)[-1] with open( flash_path_prefix + filename_flash, "wb", diff --git a/tests/pages/kapps.py b/tests/pages/test_kapps.py similarity index 100% rename from tests/pages/kapps.py rename to tests/pages/test_kapps.py From 49f7a93a03cc5a5b75d0c70203f9aadc2ff7ae6b Mon Sep 17 00:00:00 2001 From: tadeubas Date: Wed, 26 Mar 2025 00:45:49 -0300 Subject: [PATCH 55/86] Dinamically enable vsf->execution --- simulator/kruxsim/mocks/vfs.py | 59 ++++++++++++++++++++++++++++++++++ simulator/simulator.py | 1 + src/krux/pages/kapps.py | 6 +++- tests/conftest.py | 1 + 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 simulator/kruxsim/mocks/vfs.py diff --git a/simulator/kruxsim/mocks/vfs.py b/simulator/kruxsim/mocks/vfs.py new file mode 100644 index 000000000..311d0b617 --- /dev/null +++ b/simulator/kruxsim/mocks/vfs.py @@ -0,0 +1,59 @@ +# The MIT License (MIT) + +# Copyright (c) 2021-2023 Krux contributors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER# The MIT License (MIT) + +# Copyright (c) 2021-2023 Krux contributors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +import sys +import math +from unittest import mock +import pygame as pg +import cv2 +from numpy import zeros_like +from kruxsim import events +from kruxsim.mocks.board import BOARD_CONFIG +from krux.krux_settings import Settings + +def exec_allowed(value): + print("exec_allowed", value) + return None + + +if "vfs" not in sys.modules: + sys.modules["vfs"] = mock.MagicMock( + exec_allowed=exec_allowed, + ) diff --git a/simulator/simulator.py b/simulator/simulator.py index 8e2b2a11f..843cd5521 100644 --- a/simulator/simulator.py +++ b/simulator/simulator.py @@ -111,6 +111,7 @@ from kruxsim.mocks import ft6x36 from kruxsim.mocks import buttons from kruxsim.mocks import rotary +from kruxsim.mocks import vfs from kruxsim.sequence import SequenceExecutor sequence_executor = None diff --git a/src/krux/pages/kapps.py b/src/krux/pages/kapps.py index 672b5f70b..fe66cdff7 100644 --- a/src/krux/pages/kapps.py +++ b/src/krux/pages/kapps.py @@ -127,7 +127,9 @@ def execute_flash_kapp(self, app_name): return MENU_CONTINUE # Allows import of files in flash VFS - # TODO: Dinamically enable vsf->execution + import vfs + + vfs.exec_allowed(True) os.chdir("/" + FLASH_PATH) # Import and exec the kapp @@ -137,6 +139,7 @@ def execute_flash_kapp(self, app_name): i_kapp.run(self.ctx) except: # avoids importing from flash VSF + vfs.exec_allowed(False) os.chdir("/") from krux.themes import theme @@ -150,6 +153,7 @@ def execute_flash_kapp(self, app_name): self.ctx.input.wait_for_button() # avoids importing from flash VSF + vfs.exec_allowed(False) os.chdir("/") # After execution restart Krux (better safe than sorry) diff --git a/tests/conftest.py b/tests/conftest.py index 8405bcd34..7f0511b17 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -60,6 +60,7 @@ def mp_modules(mocker, monkeypatch): mocker.MagicMock(statvfs=statvfs), ) monkeypatch.setitem(sys.modules, "deflate", mocker.MagicMock(DeflateIO=DeflateIO)) + monkeypatch.setitem(sys.modules, "vfs", mocker.MagicMock()) @pytest.fixture From 8d5c62edfe389391fbbcffdc65ffbbaff1c1d373 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Wed, 26 Mar 2025 00:59:04 -0300 Subject: [PATCH 56/86] fix test --- tests/pages/test_kapps.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/pages/test_kapps.py b/tests/pages/test_kapps.py index 4f934414f..80add217e 100644 --- a/tests/pages/test_kapps.py +++ b/tests/pages/test_kapps.py @@ -180,7 +180,9 @@ def test_execute_flash_kapp(m5stickv, mocker): mocker.spy(ctx.display, "draw_centered_text") - sys.path.append(os.getcwd() + "/tests/files") + dir_path = os.path.dirname(os.path.realpath(__file__)) + print(dir_path) + sys.path.append(dir_path.rsplit("/", 1)[0] + "/files") kapps.execute_flash_kapp("kapp") assert os.chdir.called From 6257e9ce9ce1a167cfe051403b7c7206a52946c4 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sat, 29 Mar 2025 04:07:32 -0300 Subject: [PATCH 57/86] simulator create flash folder if doesn't exist --- .gitignore | 5 +++-- simulator/simulator.py | 5 +++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 56fca9138..937565dd2 100644 --- a/.gitignore +++ b/.gitignore @@ -75,14 +75,15 @@ pubkey.pem simulator/krux-screenshots simulator/screenshots simulator/sd +simulator/flash # allow files: firmware.bin, .sig, .sha256.txt !tests/* !tests/files/* # ignore build-release files -krux-*/ktool* -kapps/*.sig +ktool-* +*mpy.sig # IDE files .vscode diff --git a/simulator/simulator.py b/simulator/simulator.py index bc79110b0..63110cf1a 100644 --- a/simulator/simulator.py +++ b/simulator/simulator.py @@ -138,6 +138,11 @@ def run_krux(): os.makedirs(SD_PATH) from kruxsim.mocks import sd_card +# fake flash memory, create the flash folder if not exists +from krux.settings import FLASH_PATH +if not os.path.exists(FLASH_PATH): + os.makedirs(FLASH_PATH) + t = threading.Thread(target=run_krux) t.daemon = True From 4915a2a312b2bcf7d55546f3312b4934c5d5398f Mon Sep 17 00:00:00 2001 From: tadeubas Date: Tue, 1 Apr 2025 14:36:24 -0300 Subject: [PATCH 58/86] change flash baudrate --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 1ab756b1c..0faf8f444 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -127,7 +127,7 @@ git-pull = "git pull git@github.com:selfcustody/krux.git" git-pull-https = "git pull https://github.com/selfcustody/krux.git" # flash tasks -flash-cmd = "python firmware/Kboot/build/ktool.py -b 1500000 build/kboot.kfpkg" +flash-cmd = "python firmware/Kboot/build/ktool.py -b 2000000 build/kboot.kfpkg" flash.ref = "flash-cmd -B goE" flash-dock.ref = "flash-cmd -B dan" From 11660e71edb1e990e9cbaae613a5aa24d7041e53 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sun, 1 Jun 2025 13:31:52 -0300 Subject: [PATCH 59/86] poetry task for boot --- pyproject.toml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 0faf8f444..59d06c257 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -127,9 +127,10 @@ git-pull = "git pull git@github.com:selfcustody/krux.git" git-pull-https = "git pull https://github.com/selfcustody/krux.git" # flash tasks -flash-cmd = "python firmware/Kboot/build/ktool.py -b 2000000 build/kboot.kfpkg" -flash.ref = "flash-cmd -B goE" -flash-dock.ref = "flash-cmd -B dan" +ktool-cmd = "python firmware/Kboot/build/ktool.py -b 2000000" +flash.ref = "ktool-cmd build/kboot.kfpkg -B goE" +flash-dock.ref = "ktool-cmd build/kboot.kfpkg -B dan" +boot.ref = "ktool-cmd -s firmware.bin" # kapps tasks mpy = "./firmware/MaixPy/components/micropython/core/mpy-cross/mpy-cross" From cb39f989463281a5c626801d6b18857e76c813f6 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Tue, 29 Jul 2025 19:57:08 -0300 Subject: [PATCH 60/86] post merge adjusts --- kapps/kapp.py | 5 +++-- kapps/nostr.py | 4 ++-- src/krux/firmware.py | 1 + src/krux/pages/file_manager.py | 1 + src/krux/pages/tools.py | 3 --- tests/pages/test_tools.py | 2 ++ 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/kapps/kapp.py b/kapps/kapp.py index a73b9f141..ec6351f27 100644 --- a/kapps/kapp.py +++ b/kapps/kapp.py @@ -31,8 +31,9 @@ from krux.pages import Page, Menu, MENU_CONTINUE from krux.krux_settings import t -from krux.display import NARROW_SCREEN_WITH, STATUS_BAR_HEIGHT, FONT_HEIGHT +from krux.display import STATUS_BAR_HEIGHT, FONT_HEIGHT from krux.themes import theme +from krux.kboard import kboard class KMenu(Menu): @@ -40,7 +41,7 @@ class KMenu(Menu): def draw_wallet_indicator(self): """Customize the top bar""" - if self.ctx.display.width() > NARROW_SCREEN_WITH: + if not kboard.is_m5stickv: self.ctx.display.draw_hcentered_text( NAME, STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, diff --git a/kapps/nostr.py b/kapps/nostr.py index 17ce0025b..14ec1b28f 100644 --- a/kapps/nostr.py +++ b/kapps/nostr.py @@ -33,12 +33,12 @@ from krux.pages.home_pages.home import Home from krux.krux_settings import t, Settings from krux.display import ( - NARROW_SCREEN_WITH, STATUS_BAR_HEIGHT, FONT_HEIGHT, BOTTOM_PROMPT_LINE, ) from krux.themes import theme +from krux.kboard import kboard NSEC_SIZE = 63 @@ -84,7 +84,7 @@ def draw_wallet_indicator(self): elif nostrKey.loaded(): text = nostrKey.key.upper() - if self.ctx.display.width() > NARROW_SCREEN_WITH: + if not kboard.is_m5stickv: self.ctx.display.draw_hcentered_text( text, STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, diff --git a/src/krux/firmware.py b/src/krux/firmware.py index 1bf2748f5..55069b06f 100644 --- a/src/krux/firmware.py +++ b/src/krux/firmware.py @@ -357,6 +357,7 @@ def status_text(text, highlight_prefix=""): return False # Validate signature + firmware_hash = sha256(firmware_path) if not check_signature(pubkey, sig, firmware_hash): display.flash_text(t("Bad signature"), theme.error_color) return False diff --git a/src/krux/pages/file_manager.py b/src/krux/pages/file_manager.py index d32a38a5e..404d32173 100644 --- a/src/krux/pages/file_manager.py +++ b/src/krux/pages/file_manager.py @@ -45,6 +45,7 @@ def select_file( import os path = SD_ROOT_PATH + status = 0 while True: # if is a dir then list all files in it if SDHandler.dir_exists(path): diff --git a/src/krux/pages/tools.py b/src/krux/pages/tools.py index 222f38f7c..84c86ecd7 100644 --- a/src/krux/pages/tools.py +++ b/src/krux/pages/tools.py @@ -37,7 +37,6 @@ from ..sd_card import SDHandler from ..display import BOTTOM_PROMPT_LINE from ..krux_settings import t -from ..qr import FORMAT_NONE import sys @@ -152,7 +151,6 @@ def rm_stored_mnemonic(self): def datum_tool(self): """Handler for the 'Datum Tool' menu item""" - import sys from .datum_tool import DatumToolMenu while True: @@ -196,7 +194,6 @@ def descriptor_addresses(self): def device_tests(self): """Handler for the 'Device Tests' menu item""" - import sys from .device_tests import DeviceTests page = DeviceTests(self.ctx) diff --git a/tests/pages/test_tools.py b/tests/pages/test_tools.py index c867aab9b..6ef870948 100644 --- a/tests/pages/test_tools.py +++ b/tests/pages/test_tools.py @@ -191,11 +191,13 @@ def test_access_to_device_tests(m5stickv, mocker): from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV BTN_SEQUENCE = [ + BUTTON_PAGE, # select kapps BUTTON_PAGE, # select device tests BUTTON_ENTER, # Go device tests BUTTON_PAGE_PREV, # Go to Back BUTTON_ENTER, # Leave device tests BUTTON_PAGE_PREV, + BUTTON_PAGE_PREV, BUTTON_PAGE_PREV, # select Back BUTTON_ENTER, # leave ] From d73bc690f14554c353fc083acf49ff6c2e49d248 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Wed, 6 Aug 2025 22:10:18 -0300 Subject: [PATCH 61/86] fix krux script sign --- kapps/kapp.mpy | Bin 1133 -> 1136 bytes kapps/nostr.mpy | Bin 4564 -> 6626 bytes krux | 14 +++++++++++++- src/krux/firmware.py | 2 +- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/kapps/kapp.mpy b/kapps/kapp.mpy index 8eb8d508b6303fa02c180fd80af2b7148762e884..bc1db7e50ba021429986548071dfdbf6aadf8003 100644 GIT binary patch delta 260 zcmaFM@qt6mmxW1Qp)G`k!GM8*L4utjkg-uT!$-}{Ltfdy(qN+8+==HEM42)qvWrS9 z^ind53vv=GGg(y_Gg&8dFv?pri1B16l*mxW1Qq0NGY!GM8*L4utjkg-uT!$-}{LtfcHUU{P2TwxVI$Dknp@c3Zo zAXitv_;Ak0P-7H}{KFfuR*r7;3+)l@L{)l|#z_EBSC_`gAx zExDvZmJe#U99MZ}N=ZfiRJMb$*FlIsYR(N@g=DhB{JGF wiZY6y8b8U%PxfL;Wwe>Rfys=~e)4lBT}H#nqReHC{*!x{7coXn)@N}909A8FF#rGn diff --git a/kapps/nostr.mpy b/kapps/nostr.mpy index 25759b620beed46a8fe28e04c73e3476e8c59306..a2b77d053f1257176d0a98f25a57d7bd5fb8304e 100644 GIT binary patch delta 3693 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 Date: Sat, 27 Sep 2025 19:03:36 -0300 Subject: [PATCH 62/86] small changes --- krux | 2 +- simulator/kruxsim/mocks/machine.py | 8 - src/krux/firmware.py | 2 +- src/krux/pages/__init__.py | 5 - src/krux/pages/home_pages/home.py | 2 +- tests/kapps/test_nostr.py | 1294 ---------------------------- 6 files changed, 3 insertions(+), 1310 deletions(-) diff --git a/krux b/krux index f7aba3975..84f04d0b9 100755 --- a/krux +++ b/krux @@ -239,7 +239,7 @@ elif [ "$1" == "sign" ]; then else sig_bin=$file.sig # ECDSA signatures using openssl vary in size (70–72 bytes) due to DER encoding of r and s values. - # Krux uses secp256k1 that works only with 70 bytes + # Krux uses secp256k1, which enforces strict canonical DER, expecting signatures in the minimal 70-byte form. # Loop until signature is exactly 70 bytes while true; do diff --git a/simulator/kruxsim/mocks/machine.py b/simulator/kruxsim/mocks/machine.py index b486fa6e4..f140b1524 100644 --- a/simulator/kruxsim/mocks/machine.py +++ b/simulator/kruxsim/mocks/machine.py @@ -92,14 +92,6 @@ class SDCard: def remount(): pass -def unique_id(): - return b'\xbc\x8d{%\x8e^\xc5Q\xb3N\x07f\x9f\xde\xbbG7\xddFK^\xdc\xdb\xbc\xb4E\x14A~3\x91\x12' - - -def unique_id(): - return b'\xbc\x8d{%\x8e^\xc5Q\xb3N\x07f\x9f\xde\xbbG7\xddFK^\xdc\xdb\xbc\xb4E\x14A~3\x91\x12' - - if "machine" not in sys.modules: sys.modules["machine"] = mock.MagicMock( reset=reset, UART=mock.MagicMock(wraps=UART), SDCard=SDCard, unique_id=unique_id diff --git a/src/krux/firmware.py b/src/krux/firmware.py index c6869856c..10dd73343 100644 --- a/src/krux/firmware.py +++ b/src/krux/firmware.py @@ -188,7 +188,7 @@ def check_signature(pubkey, sig, file_hash): """Return if signature of the file_hash is valid for the pubkey""" try: - # Parse, serialize, and reparse to ensure signature is compact prior to verification + # embit (via libsecp256k1) already enforces signature is compact sig = ec.Signature.parse(sig) if not pubkey.verify(sig, file_hash): return False diff --git a/src/krux/pages/__init__.py b/src/krux/pages/__init__.py index 14c27b6db..3d26bd45a 100644 --- a/src/krux/pages/__init__.py +++ b/src/krux/pages/__init__.py @@ -510,11 +510,6 @@ def has_sd_card(self): except: return False - def shutdown_menu_item(self, ctx): - """Returns the Shutdown or Reboot Menu item""" - label = t("Shutdown") if ctx.power_manager.has_battery() else t("Reboot") - return (label, self.shutdown) - def shutdown(self): """Handler for the 'shutdown' menu item""" if self.prompt(t("Are you sure?"), self.ctx.display.height() // 2): diff --git a/src/krux/pages/home_pages/home.py b/src/krux/pages/home_pages/home.py index d63ad6e1e..2354fca39 100644 --- a/src/krux/pages/home_pages/home.py +++ b/src/krux/pages/home_pages/home.py @@ -59,7 +59,7 @@ def __init__(self, ctx): (t("Wallet"), self.wallet), (t("Address"), self.addresses_menu), (t("Sign"), self.sign), - self.shutdown_menu_item(ctx), + (shtn_reboot_label, self.shutdown), ], back_label=None, ), diff --git a/tests/kapps/test_nostr.py b/tests/kapps/test_nostr.py index 6ac090511..a3ed37cb9 100644 --- a/tests/kapps/test_nostr.py +++ b/tests/kapps/test_nostr.py @@ -45,1297 +45,3 @@ def test_klogin_about(m5stickv, mocker): assert return_status == MENU_CONTINUE assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) - - -def test_menu_load_from_manual(m5stickv, mocker): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV - - BTN_SEQUENCE = ( - # Load Key from Manual - [BUTTON_PAGE, BUTTON_ENTER] - + - # Load from Numbers - [BUTTON_PAGE, BUTTON_ENTER] - + - # Decimal - [BUTTON_ENTER] - ) - - TEST_VALUE = "Test value" - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - mocker.patch.object( - login, "load_key_from_digits", mocker.MagicMock(return_value=TEST_VALUE) - ) - test_status = login.load_key() - - assert test_status == TEST_VALUE - assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) - - -def test_menu_new_key(m5stickv, mocker): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER - - BTN_SEQUENCE = ( - # New Key from Snapshot - [BUTTON_ENTER] - ) - - TEST_VALUE = "Test value" - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - mocker.patch.object( - login, "new_key_from_snapshot", mocker.MagicMock(return_value=TEST_VALUE) - ) - test_status = login.new_key() - - assert test_status == TEST_VALUE - assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) - - -def test_load_new_key_from_dice_module(m5stickv, mocker): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE_PREV - - BTN_SEQUENCE = [ - BUTTON_PAGE_PREV, # Go to Back - BUTTON_ENTER, # Exit - ] - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - login.new_key_from_dice() - - assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) - - -def test_tools_menu(m5stickv, mocker): - from krux.pages.login import Login, MENU_CONTINUE - from krux.input import BUTTON_ENTER, BUTTON_PAGE - - BTN_SEQUENCE = ( - # Back - [BUTTON_PAGE] * 7 - + [BUTTON_ENTER] - ) - - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - test_tools = login.tools() - - assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) - assert test_tools == MENU_CONTINUE - - -def test_load_setting_menu(m5stickv, mocker): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE_PREV - - BTN_SEQUENCE = [ - BUTTON_PAGE_PREV, # Go to Back - BUTTON_ENTER, # Exit - ] - - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - login.settings() - - assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) - - -################### Test load from storage menu - - -def test_load_from_storage(m5stickv, mocker): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV - - BTN_SEQUENCE = ( - # Load Key from Storage - [BUTTON_PAGE] * 2 - + [BUTTON_ENTER] - + [ - BUTTON_ENTER, # 1 press to continue loading key - BUTTON_ENTER, # 1 press to load wallet - ] - ) - - MNEMONIC = "diet glad hat rural panther lawsuit act drop gallery urge where fit" - - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - mocker.patch( - "krux.pages.encryption_ui.LoadEncryptedMnemonic.load_from_storage", - mocker.MagicMock(return_value=MNEMONIC.split(" ")), - ) - login.load_key() - print(ctx.wallet.key.mnemonic) - assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) - assert ctx.wallet.key.mnemonic == MNEMONIC - - -def test_new_12w_from_snapshot(m5stickv, mocker): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE_PREV - - # mocks a result of a hashed image - mocker.patch( - "krux.pages.capture_entropy.CameraEntropy.capture", return_value=b"\x01" * 32 - ) - - BTN_SEQUENCE = ( - # 1 press to proceed to 12 words - [BUTTON_ENTER] - + - # 1 press to proceed msg - [BUTTON_ENTER] - + - # SHA256 - [BUTTON_ENTER] - + - # Words - [BUTTON_ENTER] - + - # Load Wallet - [BUTTON_ENTER] - ) - MNEMONIC = "absurd amount doctor acoustic avoid letter advice cage absurd amount doctor adjust" - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - login.new_key_from_snapshot() - - assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) - assert ctx.wallet.key.mnemonic == MNEMONIC - - -def test_new_24w_from_snapshot(m5stickv, mocker): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE - - # mocks a result of a hashed image - mocker.patch( - "krux.pages.capture_entropy.CameraEntropy.capture", return_value=b"\x01" * 32 - ) - - BTN_SEQUENCE = ( - # 1 move to select 24 words, 1 press to proceed - [BUTTON_PAGE, BUTTON_ENTER] - + - # 1 press to proceed msg - [BUTTON_ENTER] - + - # SHA256 - [BUTTON_ENTER] - + - # Words 2x - [BUTTON_ENTER, BUTTON_ENTER] - + - # Load Wallet - [BUTTON_ENTER] - ) - MNEMONIC = "absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice comic" - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - login.new_key_from_snapshot() - - assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) - assert ctx.wallet.key.mnemonic == MNEMONIC - - -def test_new_double_mnemonic_from_snapshot(m5stickv, mocker): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE - from krux.wallet import is_double_mnemonic - from krux.display import DEFAULT_PADDING - from krux.themes import WHITE, BLACK - - # mocks a result of a hashed image - mocker.patch( - "krux.pages.capture_entropy.CameraEntropy.capture", return_value=b"\x01" * 32 - ) - - BTN_SEQUENCE = ( - # 2 moves to select double mnemonic, 1 press to proceed - [BUTTON_PAGE, BUTTON_PAGE, BUTTON_ENTER] - + - # 1 press to proceed msg - [BUTTON_ENTER] - + - # SHA256 - [BUTTON_ENTER] - + - # Words 2x - [BUTTON_ENTER, BUTTON_ENTER] - + - # Load Wallet - [BUTTON_ENTER] - ) - MNEMONIC = "absurd amount doctor acoustic avoid letter advice cage absurd amount doctor adjust absurd amount doctor acoustic avoid letter advice cage absurd amount doll fancy" - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - login.new_key_from_snapshot() - - assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) - assert ctx.wallet.key.mnemonic == MNEMONIC - assert is_double_mnemonic(MNEMONIC) == True - ctx.display.draw_hcentered_text.assert_has_calls( - [mocker.call("BIP39 Mnemonic*", 5)] - ) - - -########## load words from qrcode tests - - -def test_load_12w_camera_qrcode_words(m5stickv, mocker, mocker_printer): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER - from krux.qr import FORMAT_NONE - from krux.pages.qr_capture import QRCodeCapture - - BTN_SEQUENCE = ( - # 1 press to proceed with the 12 words - [BUTTON_ENTER] - + - # Load the wallet - [BUTTON_ENTER] - ) - QR_FORMAT = FORMAT_NONE - MNEMONIC = ( - "olympic term tissue route sense program under choose bean emerge velvet absurd" - ) - - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - mocker.patch.object( - QRCodeCapture, "qr_capture_loop", new=lambda self: (MNEMONIC, QR_FORMAT) - ) - login.load_key_from_qr_code() - - assert ctx.wallet.key.mnemonic == MNEMONIC - - -def test_load_12w_camera_qrcode_numbers(m5stickv, mocker, mocker_printer): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER - from krux.qr import FORMAT_NONE - from krux.pages.qr_capture import QRCodeCapture - - BTN_SEQUENCE = ( - # 1 press to proceed with the 12 words - [BUTTON_ENTER] - + - # Load the wallet - [BUTTON_ENTER] - ) - QR_FORMAT = FORMAT_NONE - MNEMONIC = ( - "olympic term tissue route sense program under choose bean emerge velvet absurd" - ) - ENCODED_MNEMONIC = "123417871814150815661375189403220156058119360008" - - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - mocker.patch.object( - QRCodeCapture, "qr_capture_loop", new=lambda self: (ENCODED_MNEMONIC, QR_FORMAT) - ) - login.load_key_from_qr_code() - - assert ctx.wallet.key.mnemonic == MNEMONIC - - -def test_load_12w_camera_qrcode_binary(m5stickv, mocker, mocker_printer): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER - from krux.qr import FORMAT_NONE - from krux.pages.qr_capture import QRCodeCapture - - BTN_SEQUENCE = ( - # 1 press to proceed with the 12 words - [BUTTON_ENTER] - + - # Load the wallet - [BUTTON_ENTER] - ) - QR_FORMAT = FORMAT_NONE - C_SEED_QRs = [ - ( - b"[\xbd\x9dq\xa8\xecy\x90\x83\x1a\xff5\x9dBeE", - "forum undo fragile fade shy sign arrest garment culture tube off merit", - ), - ( - b"[\xbd\x9dq\xa8\xecy\x90\x83\x1a\xff5\x9dBeE".decode("latin1"), - "forum undo fragile fade shy sign arrest garment culture tube off merit", - ), - ( - b"[\xbd\x9dq\xa8\xec \x90\x83\x1a\xff5\x9dBeE".decode("latin1"), - "forum undo fragile fade search embark arrest garment culture tube off melt", - ), - ] - - for c_seed_qr in C_SEED_QRs: - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - mocker.patch.object( - QRCodeCapture, "qr_capture_loop", new=lambda self: (c_seed_qr[0], QR_FORMAT) - ) - login.load_key_from_qr_code() - - assert ctx.wallet.key.mnemonic == c_seed_qr[1] - - -def test_load_24w_camera_qrcode_words(m5stickv, mocker, mocker_printer): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER - from krux.qr import FORMAT_NONE - from krux.pages.qr_capture import QRCodeCapture - - BTN_SEQUENCE = ( - # 1 press to proceed with the 12 words - [BUTTON_ENTER] - + - # 1 press to proceed with the next 12 words - [BUTTON_ENTER] - + - # Load the wallet - [BUTTON_ENTER] - ) - QR_FORMAT = FORMAT_NONE - MNEMONIC = "brush badge sing still venue panther kitchen please help panel bundle excess sign couch stove increase human once effort candy goat top tiny major" - - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - mocker.patch.object( - QRCodeCapture, "qr_capture_loop", new=lambda self: (MNEMONIC, QR_FORMAT) - ) - login.load_key_from_qr_code() - - assert ctx.wallet.key.mnemonic == MNEMONIC - - -def test_load_24w_camera_qrcode_numbers(m5stickv, mocker, mocker_printer): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER - from krux.qr import FORMAT_NONE - from krux.pages.qr_capture import QRCodeCapture - - BTN_SEQUENCE = ( - # 1 press to proceed with the 12 words - [BUTTON_ENTER] - + - # 1 press to proceed with the next 12 words - [BUTTON_ENTER] - + - # Load the wallet - [BUTTON_ENTER] - ) - QR_FORMAT = FORMAT_NONE - MNEMONIC = "brush badge sing still venue panther kitchen please help panel bundle excess sign couch stove increase human once effort candy goat top tiny major" - ENCODED_MNEMONIC = "023301391610171019391278098413310856127602420628160203911717091708861236056502660800183118111075" - - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - mocker.patch.object( - QRCodeCapture, "qr_capture_loop", new=lambda self: (ENCODED_MNEMONIC, QR_FORMAT) - ) - login.load_key_from_qr_code() - - assert ctx.wallet.key.mnemonic == MNEMONIC - - -def test_load_24w_camera_qrcode_binary(m5stickv, mocker, mocker_printer): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER - from krux.qr import FORMAT_NONE - from krux.pages.qr_capture import QRCodeCapture - - BTN_SEQUENCE = ( - # 1 press to proceed with the 12 words - [BUTTON_ENTER] - + - # 1 press to proceed with the next 12 words - [BUTTON_ENTER] - + - # Load the wallet - [BUTTON_ENTER] - ) - QR_FORMAT = FORMAT_NONE - MNEMONIC = "attack pizza motion avocado network gather crop fresh patrol unusual wild holiday candy pony ranch winter theme error hybrid van cereal salon goddess expire" - BINARY_MNEMONIC = b"\x0et\xb6A\x07\xf9L\xc0\xcc\xfa\xe6\xa1=\xcb\xec6b\x15O\xecg\xe0\xe0\t\x99\xc0x\x92Y}\x19\n" - - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - mocker.patch.object( - QRCodeCapture, "qr_capture_loop", new=lambda self: (BINARY_MNEMONIC, QR_FORMAT) - ) - login.load_key_from_qr_code() - - assert ctx.wallet.key.mnemonic == MNEMONIC - - -def test_load_12w_camera_qrcode_format_ur(m5stickv, mocker, mocker_printer): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER - from krux.qr import FORMAT_UR - from krux.pages.qr_capture import QRCodeCapture - import binascii - from ur.ur import UR - - BTN_SEQUENCE = ( - # 1 press to proceed with the 12 words - [BUTTON_ENTER] - + - # Load the wallet - [BUTTON_ENTER] - ) - QR_FORMAT = FORMAT_UR - UR_DATA = UR( - "crypto-bip39", - bytearray( - binascii.unhexlify( - "A2018C66736869656C646567726F75706565726F6465656177616B65646C6F636B6773617573616765646361736865676C6172656477617665646372657765666C616D6565676C6F76650262656E" - ) - ), - ) - MNEMONIC = "shield group erode awake lock sausage cash glare wave crew flame glove" - - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - mocker.patch.object( - QRCodeCapture, "qr_capture_loop", new=lambda self: (UR_DATA, QR_FORMAT) - ) - login.load_key_from_qr_code() - - assert ctx.wallet.key.mnemonic == MNEMONIC - - -############### load words from text tests - - -def test_load_key_from_text(m5stickv, mocker): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE - - cases = [ - ( - [BUTTON_ENTER] - + ( - # A - [BUTTON_ENTER] - + - # B - [BUTTON_ENTER] - + - # I - [BUTTON_ENTER] - + - # Confirm - [BUTTON_ENTER] - ) - * 11 - + ( - # N - [BUTTON_PAGE for _ in range(13)] - + [BUTTON_ENTER] - + - # O - [BUTTON_ENTER] - + - # R - [BUTTON_PAGE, BUTTON_ENTER] - + - # T - [BUTTON_ENTER] - + - # Go - [BUTTON_ENTER] - ) - + [ - BUTTON_ENTER, # Done? - BUTTON_ENTER, # 12 word confirm - BUTTON_ENTER, # Load wallet - ], - "ability ability ability ability ability ability ability ability ability ability ability north", - ), - ( - [BUTTON_ENTER] - + ( - # A - [BUTTON_ENTER] - + - # B - [BUTTON_ENTER] - + - # I - [BUTTON_ENTER] - + - # Confirm - [BUTTON_ENTER] - ) - * 11 - + - # Go + Confirm word - [BUTTON_PAGE for _ in range(28)] - + [BUTTON_ENTER] # A - + [BUTTON_PAGE, BUTTON_ENTER] # C - + [BUTTON_PAGE, BUTTON_PAGE, BUTTON_ENTER] # I - + [BUTTON_ENTER] # Go - + [ - BUTTON_ENTER, # Done? - BUTTON_ENTER, # 12 word confirm - BUTTON_ENTER, # Load wallet - ], - "ability ability ability ability ability ability ability ability ability ability ability acid", - ), - ] - num = 0 - for case in cases: - print(num) - num += 1 - ctx = create_ctx(mocker, case[0]) - login = Login(ctx) - - login.load_key_from_text() - - assert ctx.input.wait_for_button.call_count == len(case[0]) - assert ctx.wallet.key.mnemonic == case[1] - - -def test_load_key_from_text_on_amigo_tft_with_touch(amigo, mocker, mocker_printer): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV, BUTTON_TOUCH - - cases = [ - ( - [BUTTON_ENTER] - + ( - # A - [BUTTON_ENTER] - + - # B - [BUTTON_ENTER] - + - # I - [BUTTON_ENTER] - + - # Confirm - [BUTTON_ENTER] - ) - * 11 - + ( - # N - [BUTTON_TOUCH] # index 13 -> "n" - + [BUTTON_TOUCH] # index 14 -> "o" - + [BUTTON_TOUCH] # index 17 -> "r" - + - # Touch on del - [BUTTON_TOUCH] # index 27 -> "Del" - + - # Invalid Position - [BUTTON_TOUCH] # index 26 "empty" - + [BUTTON_TOUCH] # index 17 -> "r" - + [BUTTON_TOUCH] # index 19 -> "t" - + - # Confirm word -> index 0 (Yes) - [BUTTON_TOUCH] - ) - + - # Done? Confirm, Words correct? Confirm, No passphrase, Single-sig - [ - BUTTON_ENTER, - BUTTON_ENTER, - BUTTON_ENTER, # Load wallet - ], - "ability ability ability ability ability ability ability ability ability ability ability north", - [13, 14, 17, 27, 26, 17, 19, 1], - ), - ] - - num = 0 - for case in cases: - num = num + 1 - print(num) - - ctx = create_ctx(mocker, case[0], touch_seq=case[2]) - - login = Login(ctx) - login.load_key_from_text() - - assert ctx.input.wait_for_button.call_count == len(case[0]) - assert ctx.wallet.key.mnemonic == case[1] - - -def test_create_key_from_text(m5stickv, mocker): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE - - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE - - cases = [ - ( - [BUTTON_ENTER] # 12 words - + [BUTTON_ENTER] # Proceed - + ( - # A - [BUTTON_ENTER] - + - # B - [BUTTON_ENTER] - + - # I - [BUTTON_ENTER] - + - # Confirm - [BUTTON_ENTER] - ) - * 11 - + [BUTTON_ENTER] # Skip blank message - + ( - # N - [BUTTON_PAGE for _ in range(13)] - + [BUTTON_ENTER] - + - # O - [BUTTON_ENTER] - + - # R - [BUTTON_ENTER] - + - # Confirm "North" - [BUTTON_ENTER] - ) - + [ - BUTTON_ENTER, # 12 word confirm - BUTTON_ENTER, # Load wallet - ], - "ability ability ability ability ability ability ability ability ability ability ability north", - ), - ] - num = 0 - for case in cases: - print(num) - num += 1 - ctx = create_ctx(mocker, case[0]) - login = Login(ctx) - - login.load_key_from_text(new=True) - - assert ctx.input.wait_for_button.call_count == len(case[0]) - assert ctx.wallet.key.mnemonic == case[1] - - -############## load words from digits tests - - -def test_load_key_from_digits(m5stickv, mocker, mocker_printer): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE - - cases = [ - ( - [BUTTON_ENTER] # 1 press confirm msg - + ( - # 1 press change to number "2" and 1 press to select - [BUTTON_PAGE, BUTTON_ENTER] - + - # 11 press to place on btn Go - [BUTTON_PAGE] * 11 - + [ - BUTTON_ENTER, - BUTTON_ENTER, - ] # 1 press to select and 1 press to confirm - ) - * 11 # repeat selection of word=2 (ability) eleven times - + ( - # 1 - [BUTTON_ENTER] - + - # 2 - [BUTTON_PAGE, BUTTON_ENTER] - + - # 0 - [BUTTON_PAGE] * 8 - + [BUTTON_ENTER] - + - # 3 - [BUTTON_PAGE] * 6 - + [BUTTON_ENTER] - # Confirm twelve word=1203 (north) - + [BUTTON_ENTER] - ) - + [ - BUTTON_ENTER, # Done? - BUTTON_ENTER, # 12 numbers confirm - BUTTON_ENTER, # 12 word confirm - BUTTON_ENTER, # Load wallet - ], - "ability ability ability ability ability ability ability ability ability ability ability north", - ), - ( - [BUTTON_ENTER] # 1 press confirm msg - + ( - # 1 press change to number "2" and 1 press to select - [BUTTON_PAGE, BUTTON_ENTER] - + - # 10 press to place on btn Go - [BUTTON_PAGE] * 11 - + [ - BUTTON_ENTER, - BUTTON_ENTER, - ] # 1 press to select and 1 press to confirm - ) - * 11 # repeat selection of word=2 (ability) eleven times - + ( - # 1 - [BUTTON_ENTER] - + - # 6 - [BUTTON_PAGE] * 5 - + [BUTTON_ENTER] - + - # Go - [BUTTON_PAGE] * 7 - + [BUTTON_ENTER] - # Confirm - + [BUTTON_ENTER] - ) - + [ - BUTTON_ENTER, # Done? - BUTTON_ENTER, # 12 numbers confirm - BUTTON_ENTER, # 12 word confirm - BUTTON_ENTER, # Load wallet - ], - "ability ability ability ability ability ability ability ability ability ability ability acid", - ), - ] - num = 0 - for case in cases: - print("case:", num) - num = num + 1 - ctx = create_ctx(mocker, case[0]) - login = Login(ctx) - - login.load_key_from_digits() - - assert ctx.input.wait_for_button.call_count == len(case[0]) - assert ctx.wallet.key.mnemonic == case[1] - - -def test_load_12w_from_hexadecimal(m5stickv, mocker, mocker_printer): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV - - BTN_SEQUENCE = ( - [BUTTON_ENTER] # 1 press confirm msg - + ( - # 4 press change to number "F" - [BUTTON_PAGE_PREV, BUTTON_PAGE_PREV, BUTTON_PAGE_PREV, BUTTON_PAGE_PREV] - + [BUTTON_ENTER] # 1 press to select F - + [BUTTON_ENTER] # 1 press to select F again - + [BUTTON_ENTER] # 1 press to confirm word=FF(255 decimal) cabin - ) - * 11 # repeat selection of word=FF(255, cabin) eleven times - + ( - [BUTTON_ENTER] # 1 press to number 1 - + [BUTTON_ENTER] # 1 press to number 1 - + [BUTTON_PAGE for _ in range(4)] # 4 press change to number 5 - + [BUTTON_ENTER] # 1 press to select 5 - + [BUTTON_ENTER] # Confirm word=115(277 decimal) card - ) - + [ - BUTTON_ENTER, # Done? - BUTTON_ENTER, # 12 numbers confirm - BUTTON_ENTER, # 12 word confirm - BUTTON_ENTER, # Load wallet - ] - ) - MNEMONIC = "cabin cabin cabin cabin cabin cabin cabin cabin cabin cabin cabin card" - - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - - login.load_key_from_hexadecimal() - - assert ctx.wallet.key.mnemonic == MNEMONIC - - -def test_possible_letters_from_hexadecimal(m5stickv, mocker, mocker_printer): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV - - BTN_SEQUENCE = ( - [BUTTON_ENTER] # 1 press confirm msg - + ( - # 7 press change to number "8" - [ - BUTTON_PAGE, - BUTTON_PAGE, - BUTTON_PAGE, - BUTTON_PAGE, - BUTTON_PAGE, - BUTTON_PAGE, - BUTTON_PAGE, - ] - + [BUTTON_ENTER] # 1 press to select 8 - + - # 8 press change to number "0" - [ - BUTTON_PAGE_PREV, - BUTTON_PAGE_PREV, - BUTTON_PAGE_PREV, - BUTTON_PAGE_PREV, - BUTTON_PAGE_PREV, - BUTTON_PAGE_PREV, - BUTTON_PAGE_PREV, - BUTTON_PAGE_PREV, - ] - + [BUTTON_ENTER] # 1 press to select 0 - + - # 3 press change to btn "Go" (all other numbers are disabled) - [ - BUTTON_PAGE, - BUTTON_PAGE, - BUTTON_PAGE, - ] - + [BUTTON_ENTER] # 1 press to select Go - + [BUTTON_ENTER] # 1 press to confirm word=80(128 decimal) avocado - ) - * 11 # repeat selection of word=80(128, avocado) eleven times - + ( - [BUTTON_PAGE] * 4 # 4 presses to change to 5 - + [BUTTON_ENTER] # 1 press to select 5 - + [BUTTON_PAGE_PREV] * 6 # 6 press change to btn Go - + [BUTTON_ENTER] # 1 press to select Go - + [BUTTON_ENTER] # Confirm "above" - ) - + [ - BUTTON_ENTER, # Done? - BUTTON_ENTER, # 12 numbers confirm - BUTTON_ENTER, # 12 word confirm - BUTTON_ENTER, # Load wallet - ] - ) - MNEMONIC = "avocado avocado avocado avocado avocado avocado avocado avocado avocado avocado avocado above" - - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - - login.load_key_from_hexadecimal() - - assert ctx.wallet.key.mnemonic == MNEMONIC - - -def test_load_12w_from_octal(m5stickv, mocker, mocker_printer): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV - - BTN_SEQUENCE = ( - [BUTTON_ENTER] # 1 press confirm msg - + ( - # 4 press change to number "7" - [BUTTON_PAGE_PREV] * 4 - + [BUTTON_ENTER] # 1 press to select 7 - + [BUTTON_ENTER] # 1 press to select 7 again - + [BUTTON_ENTER] # 1 press to select 7 again - + [BUTTON_ENTER] # 1 press to confirm word=777(511 decimal) divert - ) - * 11 # repeat selection of word=777(511, divert) eleven times - + ( - [BUTTON_ENTER] # 1 press to select 1 - + [BUTTON_PAGE] * 4 # 4 press change to number 5 - + [BUTTON_ENTER] # 1 press to number 5 - + [BUTTON_PAGE_PREV] * 3 # 3 press change to number 2 - + [BUTTON_ENTER] # 1 press to select 2 - + [BUTTON_PAGE] * 2 # 2 press change to number 4 - + [BUTTON_ENTER] # 1 press to select 4 - + [BUTTON_ENTER] # Confirm word=1524(852 decimal) heavy - ) - + [ - BUTTON_ENTER, # Done - BUTTON_ENTER, # 12 numbers confirm - BUTTON_ENTER, # 12 word confirm - BUTTON_ENTER, # Load wallet - ] - ) - MNEMONIC = "divert divert divert divert divert divert divert divert divert divert divert heavy" - - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - - login.load_key_from_octal() - - assert ctx.wallet.key.mnemonic == MNEMONIC - - -def test_possible_letters_from_octal(m5stickv, mocker, mocker_printer): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV - - BTN_SEQUENCE = ( - [BUTTON_ENTER] # 1 press confirm msg - + ( - # 3 press change to number "4" - [ - BUTTON_PAGE, - BUTTON_PAGE, - BUTTON_PAGE, - ] - + [BUTTON_ENTER] # 1 press to select 4 - + - # 4 press change to number "0" - [ - BUTTON_PAGE_PREV, - BUTTON_PAGE_PREV, - BUTTON_PAGE_PREV, - BUTTON_PAGE_PREV, - ] - + [BUTTON_ENTER] # 1 press to select 0 - + [BUTTON_ENTER] # 1 press to select 0 - + - # 3 press change to btn "Go" (all other numbers are disabled) - [ - BUTTON_PAGE, - BUTTON_PAGE, - BUTTON_PAGE, - ] - + [BUTTON_ENTER] # 1 press to select Go - + [BUTTON_ENTER] # 1 press to confirm word=400(256 decimal) cable - ) - * 11 # repeat selection of word=400(256, cable) eleven times - + ( - [BUTTON_ENTER] # 1 press select 1 - + [BUTTON_PAGE] * 5 # 5 presses to change to 6 - + [BUTTON_ENTER] # 1 press to select 6 - + [BUTTON_PAGE] * 4 # 4 presses to change to Go - + [BUTTON_ENTER] # 1 press to select Go - + [BUTTON_ENTER] # Confirm word=16(14 decimal) accuse - ) - + [ - BUTTON_ENTER, # Done? - BUTTON_ENTER, # 12 numbers confirm - BUTTON_ENTER, # 12 word confirm - BUTTON_ENTER, # Load wallet - BUTTON_ENTER, # Load wallet - ] - ) - MNEMONIC = ( - "cable cable cable cable cable cable cable cable cable cable cable accuse" - ) - - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - - login.load_key_from_octal() - - assert ctx.wallet.key.mnemonic == MNEMONIC - - -def test_leaving_keypad(mocker, amigo): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV - - BTN_SEQUENCE = [ - BUTTON_ENTER, # Proceed - BUTTON_PAGE_PREV, # Move to Go - BUTTON_PAGE_PREV, # Move to ESC - BUTTON_ENTER, # Press ESC - BUTTON_ENTER, # Leave - ] - ctx = create_ctx(mocker, BTN_SEQUENCE) - - login = Login(ctx) - login.load_key_from_text() - assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) - - -def test_no_passphrase_on_amigo(mocker, amigo): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE_PREV, BUTTON_PAGE - - case = ( - [BUTTON_ENTER] - + ( - # A - [BUTTON_ENTER] - + - # B - [BUTTON_ENTER] - + - # I - [BUTTON_ENTER] - + - # Confirm - [BUTTON_ENTER] - ) - * 11 - + [BUTTON_ENTER] # A - + [BUTTON_PAGE, BUTTON_ENTER] # C - + [BUTTON_PAGE, BUTTON_PAGE, BUTTON_ENTER] # I - + [BUTTON_ENTER] # Go - + [BUTTON_ENTER] # Done? - + [BUTTON_ENTER] # 12 word confirm - + [BUTTON_ENTER] # Load wallet - ) - - ctx = create_ctx(mocker, case) - login = Login(ctx) - login.load_key_from_text() - assert ctx.input.wait_for_button.call_count == len(case) - - -def test_passphrase(amigo, mocker, mocker_printer): - from krux.pages.login import Login - from krux.input import ( - BUTTON_ENTER, - BUTTON_PAGE, - BUTTON_PAGE_PREV, - SWIPE_LEFT, - SWIPE_RIGHT, - ) - - case = ( - [BUTTON_ENTER] - + ( - # A - [BUTTON_ENTER] - + - # B - [BUTTON_ENTER] - + - # I - [BUTTON_ENTER] - + - # Confirm - [BUTTON_ENTER] - ) - * 11 - + [BUTTON_ENTER] # A - + [BUTTON_PAGE, BUTTON_ENTER] # C - + [BUTTON_PAGE, BUTTON_PAGE, BUTTON_ENTER] # I - + [BUTTON_ENTER] # Go - + [BUTTON_ENTER] # Done? - + [BUTTON_ENTER] # 12 word confirm - + - # Passphrase, confirm - [BUTTON_PAGE, BUTTON_ENTER, BUTTON_ENTER] - + - # In passphrase keypad: - [ - SWIPE_RIGHT, # Test keypad swaping - BUTTON_ENTER, # Add "+" character - SWIPE_LEFT, # - BUTTON_ENTER, # Add "a" character - BUTTON_PAGE_PREV, # Move to Go - BUTTON_ENTER, # Press Go - BUTTON_ENTER, # Confirm passphrase - BUTTON_ENTER, # Load Wallet - ] - ) - - ctx = create_ctx(mocker, case) - login = Login(ctx) - login.load_key_from_text() - assert ctx.input.wait_for_button.call_count == len(case) - - -############### load words from tiny seed (bits) - - -def test_load_12w_from_tiny_seed(amigo, mocker, mocker_printer): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV - - BTN_SEQUENCE = ( - [BUTTON_ENTER] # 1 press 12w - + [BUTTON_PAGE_PREV] # 1 press to change to "Go" - + [BUTTON_ENTER] # 1 press to select Go - + [ - BUTTON_ENTER, # 12 word confirm - BUTTON_ENTER, # Load wallet - ] - ) - MNEMONIC = "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo daring" - - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - - login.load_key_from_tiny_seed() - - assert ctx.wallet.key.mnemonic == MNEMONIC - - -def test_load_24w_from_tiny_seed(m5stickv, mocker, mocker_printer): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV - - BTN_SEQUENCE = ( - [BUTTON_PAGE] # 1 press to change to 24w - + [BUTTON_ENTER] # 1 press select 24w - + [BUTTON_PAGE] # 1 press to change to bit 1024 - + [BUTTON_ENTER] # 1 press to select bit 1024 - + [BUTTON_PAGE_PREV for _ in range(2)] # 2 press to change to "Go" - + [BUTTON_ENTER] # 1 press to select Go screen 12w - + [BUTTON_ENTER] # 1 press to select Go screen 24w - + [ - BUTTON_ENTER, # 12 word confirm - BUTTON_ENTER, # 24 word confirm - BUTTON_ENTER, # Load wallet - ] - ) - MNEMONIC = "lend zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo blossom" - - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - - login.load_key_from_tiny_seed() - - assert ctx.wallet.key.mnemonic == MNEMONIC - - -def test_load_key_from_tiny_seed_scanner_12w(m5stickv, mocker): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV - - BTN_SEQUENCE = ( - [BUTTON_ENTER] # 12 words - + [BUTTON_ENTER] # Confirm - + [ - BUTTON_ENTER, # 12 word confirm - BUTTON_ENTER, # Load wallet - ] - ) - MNEMONIC = ( - "idle item three donate heavy auto worry mass casual wrestle shock orphan" - ) - - mocker.patch( - "krux.pages.tiny_seed.TinyScanner.scanner", - new=mocker.MagicMock(return_value=MNEMONIC.split()), - ) - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - login.load_key_from_tiny_seed_image() - - assert ctx.wallet.key.mnemonic == MNEMONIC - - -def test_load_12w_from_1248(m5stickv, mocker, mocker_printer): - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV - - BTN_SEQUENCE = ( - ( - [BUTTON_ENTER] # 1 press select first column num 1 - + [BUTTON_PAGE_PREV] # 1 press to change to "Go" - + [BUTTON_ENTER] # 1 press to select Go - + [BUTTON_ENTER] # 1 press to confirm word 1000 language - ) - * 11 # do this eleven times - + [BUTTON_PAGE for _ in range(2)] # 2 press to change second column num 1 - + [BUTTON_ENTER] # 1 press to select second column num 1 - + [BUTTON_PAGE for _ in range(5)] # 5 press to change third column num 2 - + [BUTTON_ENTER] # 1 press to select third column num 2 - + [BUTTON_PAGE for _ in range(8)] # 8 press to change to "Go" - + [BUTTON_ENTER] # 1 press to select Go - + [BUTTON_ENTER] # 1 press to confirm word 120 auction - + [ - BUTTON_ENTER, # Done? - BUTTON_ENTER, # 12 word confirm - BUTTON_ENTER, # Load wallet - ] - ) - MNEMONIC = "language language language language language language language language language language language auction" - - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - - login.load_key_from_1248() - - assert ctx.wallet.key.mnemonic == MNEMONIC - - -def test_customization_while_loading_wallet(amigo, mocker): - import sys - from krux.pages.login import Login - from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV - - BTN_SEQUENCE = ( - [BUTTON_ENTER] # Confirm words - + [BUTTON_PAGE] * 2 # Move to "Customize" - + [BUTTON_ENTER] # Select "Customize" - + [BUTTON_PAGE_PREV] # Move to Back - + [BUTTON_ENTER] # Select Back - + [BUTTON_PAGE_PREV] # Move to Back - + [BUTTON_ENTER] # Select Back to leave - + [BUTTON_ENTER] # Confirm - ) - - MNEMONIC = "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo daring" - - ctx = create_ctx(mocker, BTN_SEQUENCE) - login = Login(ctx) - login._load_key_from_words(MNEMONIC.split()) - - assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) - # Assert that the wallet settings module was loaded - assert "krux.pages.wallet_settings" in sys.modules - - -def test_about(mocker, m5stickv): - import krux - from krux.pages.login import Login - import board - from krux.metadata import VERSION - from krux.input import BUTTON_ENTER - - BTN_SEQUENCE = [BUTTON_ENTER, BUTTON_ENTER] - - ctx = create_ctx(mocker, BTN_SEQUENCE) - - login = Login(ctx) - - login.about() - - ctx.input.wait_for_button.assert_called_once() - ctx.display.draw_centered_text.assert_called_with( - "Krux\nselfcustody.github.io/krux\n\nHardware\n" - + board.config["type"] - + "\n\nVersion\n" - + VERSION - ) - - -def test_auto_complete_qr_words(m5stickv, mocker): - from krux.pages.login import Login - - ctx = create_ctx(mocker, []) - login = Login(ctx) - - # Test case where all words are valid - words = ["abandon"] * 12 - result = login.auto_complete_qr_words(words) - assert result == words - - # Test case where some words need to be autocompleted - words = ["abandon", "abil", "abl"] + ["abandon"] * 9 - expected_result = ["abandon", "ability", "able"] + ["abandon"] * 9 - result = login.auto_complete_qr_words(words) - assert result == expected_result - - # Test case where a word cannot be autocompleted - words = ["aband", "abil", "xyz"] + ["abandon"] * 9 - result = login.auto_complete_qr_words(words) - assert result == [] - - # Test case where all words need to be autocompleted - words = ["aband", "abil", "abl"] + ["abandon"] * 9 - expected_result = ["abandon", "ability", "able"] + ["abandon"] * 9 - result = login.auto_complete_qr_words(words) - assert result == expected_result - - # Test case with mixed case words - words = ["AbAnD", "aBiL", "AbL"] + ["abandon"] * 9 - expected_result = ["abandon", "ability", "able"] + ["abandon"] * 9 - result = login.auto_complete_qr_words(words) - assert result == expected_result From 7e015c74654cf49c44bfc1152e36d8d39c461a4a Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sat, 27 Sep 2025 22:10:34 -0300 Subject: [PATCH 63/86] simplify screensaver --- simulator/sequences/bip85-password.txt | 30 ------------- src/krux/pages/__init__.py | 4 +- src/krux/pages/file_manager.py | 2 +- src/krux/pages/screensaver.py | 61 ++++++++++++-------------- tests/pages/test_screensaver.py | 5 +-- 5 files changed, 32 insertions(+), 70 deletions(-) delete mode 100644 simulator/sequences/bip85-password.txt diff --git a/simulator/sequences/bip85-password.txt b/simulator/sequences/bip85-password.txt deleted file mode 100644 index 1868f7de8..000000000 --- a/simulator/sequences/bip85-password.txt +++ /dev/null @@ -1,30 +0,0 @@ -include _load-12-word-mnemonic.txt - -# Navigate to BIP85 -x2 press BUTTON_B -press BUTTON_A - -x2 press BUTTON_C -x2 press BUTTON_A - -# Go base64 password -BUTTON_B -BUTTON_A - -# Index 1 Go -BUTTON_A -BUTTON_C -BUTTON_A - -screenshot bip85-length-password.png - -# Length confirm -BUTTON_C -BUTTON_A - -screenshot bip85-base64-password.png - -# QR Code -BUTTON_A - -screenshot bip85-qr-base64-password.png diff --git a/src/krux/pages/__init__.py b/src/krux/pages/__init__.py index 3d26bd45a..d39e36640 100644 --- a/src/krux/pages/__init__.py +++ b/src/krux/pages/__init__.py @@ -654,9 +654,9 @@ def back_index(self): def screensaver(self): """Loads and starts screensaver""" - from .screensaver import ScreenSaver + from .screensaver import screensaver_start - ScreenSaver(self.ctx).start() + screensaver_start(self.ctx) def _process_page(self, selected_item_index): selected_item_index = (selected_item_index + 1) % len(self.menu_view) diff --git a/src/krux/pages/file_manager.py b/src/krux/pages/file_manager.py index 11227bdac..c7127314e 100644 --- a/src/krux/pages/file_manager.py +++ b/src/krux/pages/file_manager.py @@ -45,7 +45,7 @@ def select_file( import os path = SD_ROOT_PATH - status = 0 + status = MENU_CONTINUE while True: # if is a dir then list all files in it if SDHandler.dir_exists(path): diff --git a/src/krux/pages/screensaver.py b/src/krux/pages/screensaver.py index 987325d4c..7bd5a46d0 100644 --- a/src/krux/pages/screensaver.py +++ b/src/krux/pages/screensaver.py @@ -20,42 +20,35 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -# from . import Page from ..display import SPLASH, FONT_HEIGHT, TOTAL_LINES from ..themes import theme -class ScreenSaver: - """Screensaver animation method""" - - def __init__(self, ctx): - self.ctx = ctx - - def start(self): - """Displays a screensaver until user presses a button or touch""" - anim_frame = 0 - initial_offset = (TOTAL_LINES - len(SPLASH)) // 2 - fg_color = theme.fg_color - bg_color = theme.bg_color - self.ctx.display.clear() - button_press = None - while button_press is None: - # show animation on the screeen - offset_y = anim_frame * FONT_HEIGHT - self.ctx.display.fill_rectangle( - 0, - offset_y, - self.ctx.display.width(), - FONT_HEIGHT, - bg_color, +def screensaver_start(ctx): + """Displays a screensaver until user presses a button or touch""" + anim_frame = 0 + initial_offset = (TOTAL_LINES - len(SPLASH)) // 2 + fg_color = theme.fg_color + bg_color = theme.bg_color + ctx.display.clear() + button_press = None + while button_press is None: + # show animation on the screeen + offset_y = anim_frame * FONT_HEIGHT + ctx.display.fill_rectangle( + 0, + offset_y, + ctx.display.width(), + FONT_HEIGHT, + bg_color, + ) + if initial_offset <= anim_frame < len(SPLASH) + initial_offset: + ctx.display.draw_hcentered_text( + SPLASH[anim_frame - initial_offset], offset_y, fg_color, bg_color ) - if initial_offset <= anim_frame < len(SPLASH) + initial_offset: - self.ctx.display.draw_hcentered_text( - SPLASH[anim_frame - initial_offset], offset_y, fg_color, bg_color - ) - anim_frame += 1 - if anim_frame > len(SPLASH) + (2 * initial_offset) + 1: - anim_frame = 0 - bg_color, fg_color = fg_color, bg_color - # wait_duration(animation period) can be modified here - button_press = self.ctx.input.wait_for_button(block=False) + anim_frame += 1 + if anim_frame > len(SPLASH) + 2 * initial_offset + 1: + anim_frame = 0 + bg_color, fg_color = fg_color, bg_color + # wait_duration(animation period) can be modified here + button_press = ctx.input.wait_for_button(block=False) diff --git a/tests/pages/test_screensaver.py b/tests/pages/test_screensaver.py index ed6264ff0..500c55b39 100644 --- a/tests/pages/test_screensaver.py +++ b/tests/pages/test_screensaver.py @@ -6,7 +6,7 @@ def test_screensaver_m5stickv(m5stickv, mocker): from krux.themes import theme from krux.input import BUTTON_ENTER, QR_ANIM_PERIOD from krux.display import SPLASH - from krux.pages.screensaver import ScreenSaver + from krux.pages.screensaver import screensaver_start import time SCREENSAVER_ANIMATION_TIME = QR_ANIM_PERIOD @@ -28,8 +28,7 @@ def test_screensaver_m5stickv(m5stickv, mocker): ctx = create_ctx(mocker, btn_seq) time.ticks_ms = mocker.MagicMock(side_effect=time_seq) - screen_saver = ScreenSaver(ctx) - screen_saver.start() + screensaver_start(ctx) ctx.display.draw_hcentered_text.assert_any_call( SPLASH[10], 182, theme.fg_color, theme.bg_color From eb4792cdbf260bf591b04d55123c05a6be7d4fca Mon Sep 17 00:00:00 2001 From: tadeubas Date: Thu, 2 Oct 2025 20:06:00 -0300 Subject: [PATCH 64/86] change kapp name to example --- kapps/example.mpy | Bin 0 -> 1182 bytes kapps/{kapp.py => example.py} | 9 +++++---- kapps/kapp.mpy | Bin 1136 -> 0 bytes simulator/example.py | 1 + simulator/kapp.py | 1 - 5 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 kapps/example.mpy rename kapps/{kapp.py => example.py} (92%) delete mode 100644 kapps/kapp.mpy create mode 120000 simulator/example.py delete mode 120000 simulator/kapp.py diff --git a/kapps/example.mpy b/kapps/example.mpy new file mode 100644 index 0000000000000000000000000000000000000000..1493bd11a729e621c454155df6d3f366a74504cb GIT binary patch literal 1182 zcmY*ZTXWh*6yBAQvpwtS9?b^6x+}lj2b{kx~1cGmQp)*2A3sM0|qg@p| zd4Xi6ojlafo&E~!{)GObT8U2wLdjDp~k+Yg=1-Q9C|4eBLBWwTUtE zhg3^9_ZqbVdYMB7YzfsVNwvR_hYQ( zFn?&AJ4qmi0muxu>4*Y3i4VlHTh_%v*E0g^zs>7uY*OuDlBq{33OP&EM71N3blvd% zLLr)VL~S7mU8#*ylZx$)XoZJXSb6H1;fT7NRs6vFiJI`k4U2|dgXxj^$^aNxgg@Dl0AF&r2oCZlEpUNFaB+hB?rOMwbpH>y^+GKo^qkfrKP_v+>GL#pzh) zQ94??o9j>No8aSI!OBJv?e|c1u84|Q)Z%Ep7x^5PAIU3Z=>-j#x(Yf-Wl5t!=O+=!$i9j`8Mc1L zsLE}JsRlgi$g}8B<(}$94Ifpv>e8_q!PxARL@esg%ShCZYCS40xD2qo0+)fjHn(u` b8?Y_4aS9`e<)LRDuc^JzH8}|Rf35!uc)3OU literal 0 HcmV?d00001 diff --git a/kapps/kapp.py b/kapps/example.py similarity index 92% rename from kapps/kapp.py rename to kapps/example.py index ec6351f27..4530f808a 100644 --- a/kapps/kapp.py +++ b/kapps/example.py @@ -25,9 +25,9 @@ os.chdir("/") VERSION = "1.0" -NAME = "Test app" +NAME = "Example" -print("Print executed inside kapp.py") +print("Print executed inside kapp", NAME) from krux.pages import Page, Menu, MENU_CONTINUE from krux.krux_settings import t @@ -82,7 +82,8 @@ def about(self): self.ctx.display.clear() self.ctx.display.draw_centered_text( - "Krux app\n" + NAME + "\n\n" + t("Version") + "\n%s" % VERSION + "Kapp %s\n%s: %s\n\n" % (NAME, t("Version"), VERSION) + + t("Use this as a model to implement new Kapps") ) self.ctx.input.wait_for_button() return MENU_CONTINUE @@ -90,6 +91,6 @@ def about(self): def run(ctx): """Runs this kapp""" - print("run() func executed on kapp.py") + print("run() function inside kapp", NAME) Kapp(ctx).run() diff --git a/kapps/kapp.mpy b/kapps/kapp.mpy deleted file mode 100644 index bc1db7e50ba021429986548071dfdbf6aadf8003..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1136 zcmY*Y%Wm676rCX@S!E1c%wrr#Bu&?h65Fuls&F5R0#+NjavdqMEoY+z#m7)&C6NL- ztZWo0^;@41g=hFevC?PSm{Lg?`VI>wie z+!y78#_Ia+*Sq5@a-|^j?^JX%L8RdlRs_qny^x@sgR3O>+0L%E^s0Vxdib(M3LP3T z)fkVpe5=;1m(b5E$i~$v$+wL@CHW@xV^VC^TW9)rFI%0%)>*yHyAKCpe7-XVkH}ll z@caObV{Pne>F?yyBg&ZP_al$j64p;oJGIW)ss3&4L~qm&zi)I1IRM@}qs_UGQ>^Vp ziLmpQ#Ek|hsy#^dnHhOjDLT+58WxD6%7&ciH3?jq;1-vG0`W+ za7dZ%`L<^nEC|IepGEjhBaZ-&?mGa!+*CK38|C5Ai!zW%%QEpIeY6)b&l>#n#k1*5 z&ROhSUb?HFQcj6o3$)OX+B&1>Oxl*#rS*50@1!+ZalO7fgu`?z7zUxl%SF$30^RI? zcyKb+y)w{>vZ#=hEMg$F|A(|JEhiizBq0J!bh1^kE0|o;CcrQPdc(Qmx%^+Yl{#!zS7SZ)85^tof8!1bK zS`yU8*Ybll_t&*ti0+_m?wBJFO~V@KL&Ky)(SFT29Oy#gBao0qZ?|5Lb7?!4SkjL6 z{`RK64JpoKEN?03z(LiS%*(u@rN#QF@Z|mx%ucdwg0yip6e(!M1* z;YlRTck`cHSl5~SKo&fI95Y3k7#`D|Ak@v6vA~B=(#M Date: Sun, 5 Oct 2025 23:17:59 -0300 Subject: [PATCH 65/86] Fix example and nostr kapp --- kapps/example.mpy | Bin 1182 -> 1419 bytes kapps/example.py | 12 +++++- kapps/nostr.py | 97 +++++++++++++++++++++++++++++++++++++++------- 3 files changed, 94 insertions(+), 15 deletions(-) diff --git a/kapps/example.mpy b/kapps/example.mpy index 1493bd11a729e621c454155df6d3f366a74504cb..6baaabdba14b2de95703f4caad9cfb9ab20c0cce 100644 GIT binary patch delta 611 zcmXw0TW`{E6#xHwfuh@NQM+5Y$hsmk>VhIZ=rRlpkV{zH5+e_#v_&d~VOutgF%CTTS1$1Ev?tTB`JDW6<#S`7M}O< z?<_elp)4A%Av94Cy4}Tqm4mH;gu58i4Y&!9qU$eBuZ{R;5zMlHrhP0}ph%i{B#5mV zs9sLqG0T3qblwNXbu9>{^C8gdE3tze<@Sm<}*+8 zTUGLbDzxj8u!aNhwnBmdNdRnyas;l#m$?_q&OZ3C0LCFeefm5(`SP{liIZb4VoMV0 zs?6(#VD$95piQWs$qOd4H0J2G-0AT=U~b?7|6!-mAWmDSB1K)((ZT;v7aLVY4i7YZEJ>i!?99~Qwv4TVHge2iq5wa zx}k`z-Fw%~QQ%Tw=AY|9&h@4#${j=2WQjNAzQGXXR4Ky*nB>{;j7bE7P33u0RjemS zp1p0W28YA@h#SS!t`kLe{lM|?e-a7n6p6ye)-U8Hf*2N!M&Uzi4UND%Rtsf3Zybux jtoP{m(7rP^!UfmJ*RznhEFp0wHj-e_qxCvgALIT4sBxoZ delta 343 zcmeC?p2w-^%fckD(3Zf$V8Fn@Ai>TM$k-^F;iKl}Ew5}~X;9E7Hc@GpSO8OoM0QbW zg(DL$6ouKWIC(R(I-|qn+swL*#*?{N)ETuW8?h+qiX?fzPssR8FV@q`a diff --git a/kapps/example.py b/kapps/example.py index 4530f808a..7ccff5b43 100644 --- a/kapps/example.py +++ b/kapps/example.py @@ -31,7 +31,7 @@ from krux.pages import Page, Menu, MENU_CONTINUE from krux.krux_settings import t -from krux.display import STATUS_BAR_HEIGHT, FONT_HEIGHT +from krux.display import STATUS_BAR_HEIGHT, FONT_HEIGHT, DEFAULT_PADDING from krux.themes import theme from krux.kboard import kboard @@ -39,6 +39,16 @@ class KMenu(Menu): """Customizes the page's menu""" + def __init__(self, ctx, menu, offset=None, disable_statusbar=False, back_label="Back", back_status=lambda: MENU_EXIT,): + super().__init__(ctx, menu, offset, disable_statusbar, back_label, back_status) + self.disable_statusbar = False + if offset is None: + self.menu_offset = STATUS_BAR_HEIGHT + else: + # Always disable status bar if menu has non standard offset + self.disable_statusbar = True + self.menu_offset = offset if offset >= 0 else DEFAULT_PADDING + def draw_wallet_indicator(self): """Customize the top bar""" if not kboard.is_m5stickv: diff --git a/kapps/nostr.py b/kapps/nostr.py index 14ec1b28f..0853203fa 100644 --- a/kapps/nostr.py +++ b/kapps/nostr.py @@ -26,7 +26,7 @@ os.chdir("/") VERSION = "0.1" -NAME = "Nostr app" +NAME = "Nostr" from krux.pages import Menu, MENU_CONTINUE, MENU_EXIT, LETTERS from krux.pages.login import Login, DIGITS_HEX, DIGITS @@ -36,9 +36,12 @@ STATUS_BAR_HEIGHT, FONT_HEIGHT, BOTTOM_PROMPT_LINE, + DEFAULT_PADDING, ) from krux.themes import theme from krux.kboard import kboard +from embit import bech32, bip32, bip39 +from binascii import hexlify NSEC_SIZE = 63 @@ -51,6 +54,7 @@ HEX = "hex" MNEMONIC = "mnemonic" DEFAULT_MNEMONIC = "action action action action action action action action action action action action" +NIP06_PATH = "m/44h/1237h/0h/0/0" FILE_SUFFIX = "-nostr" FILE_EXTENSION = ".txt" @@ -61,21 +65,86 @@ class NostrKey: def __init__(self): self.update() - def update(self, key="none", value=None): + def update(self, key="", value=None): + print("update", key, value) self.key = key self.value = value - def loaded(self): - return self.key in (NSEC, PRIV_HEX, MNEMONIC) + def load_nsec(self, nsec): + """Load a key in nsec format""" + _encoding, hrp, _data = bech32.bech32_decode(nsec) + if hrp != "nsec": + raise ValueError("Not an nsec key!") + self.update(NSEC, nsec) + + def load_hex(self, hex): + """Load a key in hex format""" + if len(hex) != 64: + raise ValueError("Hex key must be 64 chars!") + # try decoding + bytes.fromhex(hex) + self.update(HEX, hex) + + def load_mnemonic(self, mnemonic): + """Load a mnemonic, will assume it is valid""" + self.update(MNEMONIC, mnemonic) - def loaded_mnemonic(self): - print("loaded_mnemonic", self.key, self.value) - return self.key == MNEMONIC + def loaded(self): + return self.key != "" + + @classmethod + def _encode_nostr_key(cls, bits, version): + from embit import bech32 + + converted_bits = bech32.convertbits(bits, 8, 5) + return bech32.bech32_encode(bech32.Encoding.BECH32, version, converted_bits) + + def get_hex(self): + """Return key in hex format""" + if self.key == HEX: + return self.value + if self.key == NSEC: + _encoding, _hrp, data = bech32.bech32_decode(self.value) + data = bech32.convertbits(data, 5, 8, False) + return bytes(data).hex() + # is mnemonic + nostr_root = self._mnemonic_to_nip06_key() + return hexlify(nostr_root.secret).decode() + + def get_nsec(self): + """Return key in nsec format""" + if self.key == NSEC: + return self.value + if self.key == HEX: + return NostrKey._encode_nostr_key(bytes.fromhex(self.value), NSEC) + # is mnemonic + nostr_root = self._mnemonic_to_nip06_key() + return NostrKey._encode_nostr_key(nostr_root.secret, NSEC) + + def get_mnemonic(self): + """Return loaded mnemonic""" + if self.key != MNEMONIC: + raise ValueError("Load mnemonic first!") + return self.value + + def _mnemonic_to_nip06_key(self): + root = bip32.HDKey.from_seed(bip39.mnemonic_to_seed(self.value)) + return root.derive(NIP06_PATH) class KMenu(Menu): """Customizes the page's menu""" + def __init__(self, ctx, menu, offset=None, disable_statusbar=False, back_label="Back", back_status=lambda: MENU_EXIT,): + super().__init__(ctx, menu, offset, disable_statusbar, back_label, back_status) + self.disable_statusbar = False + if offset is None: + self.menu_offset = STATUS_BAR_HEIGHT + else: + # Always disable status bar if menu has non standard offset + self.disable_statusbar = True + self.menu_offset = offset if offset >= 0 else DEFAULT_PADDING + def draw_wallet_indicator(self): """Customize the top bar""" text = NAME @@ -102,10 +171,11 @@ def draw_wallet_indicator(self): class Klogin(Login): - """The page to insert the Key""" + """Page to load a Nostr the Key""" def __init__(self, ctx): super().__init__(ctx) + shtn_reboot_label = t("Shutdown") if kboard.has_battery else t("Reboot") self.menu = KMenu( ctx, [ @@ -113,7 +183,7 @@ def __init__(self, ctx): (t("New Mnemonic"), self.new_key), (t("Load nsec or hex"), self.load_nsec), (t("About"), self.about), - self.shutdown_menu_item(ctx), + (shtn_reboot_label, self.shutdown), ], back_label=None, ) @@ -267,7 +337,8 @@ def about(self): self.ctx.display.clear() self.ctx.display.draw_centered_text( - "Krux app\n" + NAME + "\n\n" + t("Version") + "\n%s" % VERSION + "Kapp %s\n%s: %s\n\n" % (NAME, t("Version"), VERSION) + + t("Load or create a key to sign events. Works with NIP-06 and NIP-19.") ) self.ctx.input.wait_for_button() return MENU_CONTINUE @@ -279,6 +350,7 @@ class Khome(Home): def __init__(self, ctx): super().__init__(ctx) + shtn_reboot_label = t("Shutdown") if kboard.has_battery else t("Reboot") self.menu = KMenu( ctx, [ @@ -294,7 +366,7 @@ def __init__(self, ctx): (t("Nostr Keys"), self.nostr_keys), ("BIP85", self.bip85), (t("Sign Event"), self.sign_message), - self.shutdown_menu_item(ctx), + (shtn_reboot_label, self.shutdown), ], back_label=None, ) @@ -447,7 +519,4 @@ def run(ctx): if not Khome(ctx).run(): break - print("Exited!!!!") - - nostrKey = NostrKey() From 9b95b71b1b238c53cc820d39380d29da0b1ef118 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Tue, 7 Oct 2025 21:45:46 -0300 Subject: [PATCH 66/86] nostr kapp NostrKey + tests --- kapps/nostr.py | 84 ++++++++++++++++++++++++------------ tests/kapps/test_nostr.py | 91 ++++++++++++++++++++++----------------- 2 files changed, 109 insertions(+), 66 deletions(-) diff --git a/kapps/nostr.py b/kapps/nostr.py index 0853203fa..22b6e5798 100644 --- a/kapps/nostr.py +++ b/kapps/nostr.py @@ -41,6 +41,7 @@ from krux.themes import theme from krux.kboard import kboard from embit import bech32, bip32, bip39 +from embit.ec import PrivateKey from binascii import hexlify @@ -63,50 +64,67 @@ class NostrKey: def __init__(self): - self.update() + self.set() - def update(self, key="", value=None): - print("update", key, value) + def set(self, key="", value=None): + print("set", key, value) self.key = key self.value = value - def load_nsec(self, nsec): + def load_nsec(self, nsec: str): """Load a key in nsec format""" + if len(nsec) != NSEC_SIZE: + ValueError("NSEC key must be %d chars!" % NSEC_SIZE) _encoding, hrp, _data = bech32.bech32_decode(nsec) - if hrp != "nsec": + if hrp != NSEC: raise ValueError("Not an nsec key!") - self.update(NSEC, nsec) + self.set(NSEC, nsec) - def load_hex(self, hex): + def load_hex(self, hex: str): """Load a key in hex format""" - if len(hex) != 64: - raise ValueError("Hex key must be 64 chars!") + if len(hex) != HEX_SIZE: + raise ValueError("Hex key must be %d chars!" % HEX_SIZE) # try decoding bytes.fromhex(hex) - self.update(HEX, hex) + self.set(HEX, hex) - def load_mnemonic(self, mnemonic): + def load_mnemonic(self, mnemonic: str): """Load a mnemonic, will assume it is valid""" - self.update(MNEMONIC, mnemonic) + self.set(MNEMONIC, mnemonic) - def loaded(self): + def is_loaded(self): return self.key != "" - @classmethod - def _encode_nostr_key(cls, bits, version): - from embit import bech32 - - converted_bits = bech32.convertbits(bits, 8, 5) - return bech32.bech32_encode(bech32.Encoding.BECH32, version, converted_bits) + @staticmethod + def _encode_bech32(data: bytes, version: str): + """Encode bytes into a bech32 string with given version""" + converted_data = bech32.convertbits(data, 8, 5) + return bech32.bech32_encode(bech32.Encoding.BECH32, version, converted_data) + + @staticmethod + def _decode_bech32(bech: str): + """Decode a bech32 string returning bytes.""" + _enc, _hrp, data = bech32.bech32_decode(bech) + if not data: + raise ValueError("Invalid bech32 data") + raw = bech32.convertbits(data, 5, 8, False) + return bytes(raw) + + def _mnemonic_to_nip06_key(self): + root = bip32.HDKey.from_seed(bip39.mnemonic_to_seed(self.value)) + return root.derive(NIP06_PATH) + + def _get_pub_xonly(self): + hex_key = self.value if self.key == HEX else self.get_hex() + priv = PrivateKey(bytes.fromhex(hex_key)) + return priv.get_public_key().xonly() def get_hex(self): """Return key in hex format""" if self.key == HEX: return self.value if self.key == NSEC: - _encoding, _hrp, data = bech32.bech32_decode(self.value) - data = bech32.convertbits(data, 5, 8, False) - return bytes(data).hex() + return NostrKey._decode_bech32(self.value).hex() # is mnemonic nostr_root = self._mnemonic_to_nip06_key() return hexlify(nostr_root.secret).decode() @@ -116,10 +134,10 @@ def get_nsec(self): if self.key == NSEC: return self.value if self.key == HEX: - return NostrKey._encode_nostr_key(bytes.fromhex(self.value), NSEC) + return NostrKey._encode_bech32(bytes.fromhex(self.value), NSEC) # is mnemonic nostr_root = self._mnemonic_to_nip06_key() - return NostrKey._encode_nostr_key(nostr_root.secret, NSEC) + return NostrKey._encode_bech32(nostr_root.secret, NSEC) def get_mnemonic(self): """Return loaded mnemonic""" @@ -127,9 +145,21 @@ def get_mnemonic(self): raise ValueError("Load mnemonic first!") return self.value - def _mnemonic_to_nip06_key(self): - root = bip32.HDKey.from_seed(bip39.mnemonic_to_seed(self.value)) - return root.derive(NIP06_PATH) + def get_pub_hex(self): + if self.key in (HEX, NSEC): + pub_bytes = self._get_pub_xonly() + return pub_bytes.hex() + # is mnemonic + nostr_root = self._mnemonic_to_nip06_key() + return hexlify(nostr_root.xonly()).decode() + + def get_npub(self): + if self.key in (HEX, NSEC): + pub_bytes = self._get_pub_xonly() + return NostrKey._encode_bech32(pub_bytes, NPUB) + # is mnemonic + nostr_root = self._mnemonic_to_nip06_key() + return NostrKey._encode_bech32(nostr_root.xonly(), NPUB) class KMenu(Menu): diff --git a/tests/kapps/test_nostr.py b/tests/kapps/test_nostr.py index a3ed37cb9..7524204ff 100644 --- a/tests/kapps/test_nostr.py +++ b/tests/kapps/test_nostr.py @@ -2,46 +2,59 @@ from . import create_ctx -@pytest.fixture -def mocker_printer(mocker): - mocker.patch("krux.printers.thermal.AdafruitPrinter", new=mocker.MagicMock()) - -################### Test menus - - -def test_klogin_shutdown(m5stickv, mocker): - from kapps import nostr - from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV - - BTN_SEQUENCE = ( - # Move to shutdown - BUTTON_PAGE_PREV, - # Exit (shutdown / reset) - BUTTON_ENTER, - # Are you sure? - BUTTON_ENTER, - ) - - ctx = create_ctx(mocker, BTN_SEQUENCE) - nostr.run(ctx) - - assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) - - -def test_klogin_about(m5stickv, mocker): - from kapps import nostr - from krux.input import BUTTON_ENTER, BUTTON_PAGE, BUTTON_PAGE_PREV - from krux.pages import MENU_CONTINUE - - BTN_SEQUENCE = [ - # Exit - BUTTON_ENTER +def test_nostrkey(mocker, m5stickv): + from kapps.nostr import NostrKey, MNEMONIC, HEX, NSEC, NPUB, PUB_HEX + + # Test vectors from NIP-06: https://github.com/nostr-protocol/nips/blob/master/06.md + tests = [ + { + MNEMONIC:"leader monkey parrot ring guide accident before fence cannon height naive bean", + HEX:"7f7ff03d123792d6ac594bfa67bf6d0c0ab55b6b1fdb6249303fe861f1ccba9a", + NSEC:"nsec10allq0gjx7fddtzef0ax00mdps9t2kmtrldkyjfs8l5xruwvh2dq0lhhkp", + PUB_HEX:"17162c921dc4d2518f9a101db33695df1afb56ab82f5ff3e5da6eec3ca5cd917", + NPUB:"npub1zutzeysacnf9rru6zqwmxd54mud0k44tst6l70ja5mhv8jjumytsd2x7nu" + }, + { + MNEMONIC:"what bleak badge arrange retreat wolf trade produce cricket blur garlic valid proud rude strong choose busy staff weather area salt hollow arm fade", + HEX:"c15d739894c81a2fcfd3a2df85a0d2c0dbc47a280d092799f144d73d7ae78add", + NSEC:"nsec1c9wh8xy5eqdzln7n5t0ctgxjcrdug73gp5yj0x03gntn67h83twssdfhel", + PUB_HEX:"d41b22899549e1f3d335a31002cfd382174006e166d3e658e3a5eecdb6463573", + NPUB:"npub16sdj9zv4f8sl85e45vgq9n7nsgt5qphpvmf7vk8r5hhvmdjxx4es8rq74h", + } ] - ctx = create_ctx(mocker, BTN_SEQUENCE) - klogin = nostr.Klogin(ctx) - return_status = klogin.about() + for n, t in enumerate(tests): + print(n, t) + for version in (MNEMONIC, HEX, NSEC): + nkey = NostrKey() + assert not nkey.is_loaded() + if version == MNEMONIC: + nkey.load_mnemonic(t[MNEMONIC]) + elif version == HEX: + nkey.load_hex(t[HEX]) + elif version == NSEC: + nkey.load_nsec(t[NSEC]) + + assert nkey.is_loaded() + + if version in (HEX, NSEC): + with pytest.raises(ValueError): + nkey.get_mnemonic() + else: + assert nkey.get_mnemonic() == t[MNEMONIC] + + assert nkey.get_hex() == t[HEX] + assert nkey.get_nsec() == t[NSEC] + assert nkey.get_pub_hex() == t[PUB_HEX] + assert nkey.get_npub() == t[NPUB] + + with pytest.raises(ValueError): + nkey.load_hex(t[HEX][:-1]) + + with pytest.raises(ValueError): + nkey.load_nsec(t[NSEC][:-1]) + + with pytest.raises(ValueError): + nkey.load_nsec(t[NSEC].replace(NSEC, NPUB)) - assert return_status == MENU_CONTINUE - assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE) From 0d5dee1f5c08415c2dc26f58dd9c98128b7ee3ba Mon Sep 17 00:00:00 2001 From: tadeubas Date: Wed, 8 Oct 2025 12:06:05 -0300 Subject: [PATCH 67/86] nostr app refactor + black --- kapps/example.py | 12 ++++++-- kapps/nostr.py | 65 +++++++++++++++++++-------------------- tests/kapps/test_nostr.py | 26 ++++++++-------- 3 files changed, 53 insertions(+), 50 deletions(-) diff --git a/kapps/example.py b/kapps/example.py index 7ccff5b43..88e39ca01 100644 --- a/kapps/example.py +++ b/kapps/example.py @@ -29,7 +29,7 @@ print("Print executed inside kapp", NAME) -from krux.pages import Page, Menu, MENU_CONTINUE +from krux.pages import Page, Menu, MENU_CONTINUE, MENU_EXIT from krux.krux_settings import t from krux.display import STATUS_BAR_HEIGHT, FONT_HEIGHT, DEFAULT_PADDING from krux.themes import theme @@ -39,7 +39,15 @@ class KMenu(Menu): """Customizes the page's menu""" - def __init__(self, ctx, menu, offset=None, disable_statusbar=False, back_label="Back", back_status=lambda: MENU_EXIT,): + def __init__( + self, + ctx, + menu, + offset=None, + disable_statusbar=False, + back_label="Back", + back_status=lambda: MENU_EXIT, + ): super().__init__(ctx, menu, offset, disable_statusbar, back_label, back_status) self.disable_statusbar = False if offset is None: diff --git a/kapps/nostr.py b/kapps/nostr.py index 22b6e5798..1e8ce9557 100644 --- a/kapps/nostr.py +++ b/kapps/nostr.py @@ -74,8 +74,8 @@ def set(self, key="", value=None): def load_nsec(self, nsec: str): """Load a key in nsec format""" if len(nsec) != NSEC_SIZE: - ValueError("NSEC key must be %d chars!" % NSEC_SIZE) - _encoding, hrp, _data = bech32.bech32_decode(nsec) + raise ValueError("NSEC key must be %d chars!" % NSEC_SIZE) + _, hrp, _ = bech32.bech32_decode(nsec) if hrp != NSEC: raise ValueError("Not an nsec key!") self.set(NSEC, nsec) @@ -94,26 +94,29 @@ def load_mnemonic(self, mnemonic: str): def is_loaded(self): return self.key != "" - + + def is_mnemonic(self): + return self.key == MNEMONIC + @staticmethod def _encode_bech32(data: bytes, version: str): """Encode bytes into a bech32 string with given version""" converted_data = bech32.convertbits(data, 8, 5) return bech32.bech32_encode(bech32.Encoding.BECH32, version, converted_data) - + @staticmethod def _decode_bech32(bech: str): """Decode a bech32 string returning bytes.""" - _enc, _hrp, data = bech32.bech32_decode(bech) + _, _, data = bech32.bech32_decode(bech) if not data: raise ValueError("Invalid bech32 data") raw = bech32.convertbits(data, 5, 8, False) return bytes(raw) - + def _mnemonic_to_nip06_key(self): root = bip32.HDKey.from_seed(bip39.mnemonic_to_seed(self.value)) return root.derive(NIP06_PATH) - + def _get_pub_xonly(self): hex_key = self.value if self.key == HEX else self.get_hex() priv = PrivateKey(bytes.fromhex(hex_key)) @@ -128,7 +131,7 @@ def get_hex(self): # is mnemonic nostr_root = self._mnemonic_to_nip06_key() return hexlify(nostr_root.secret).decode() - + def get_nsec(self): """Return key in nsec format""" if self.key == NSEC: @@ -138,13 +141,13 @@ def get_nsec(self): # is mnemonic nostr_root = self._mnemonic_to_nip06_key() return NostrKey._encode_bech32(nostr_root.secret, NSEC) - + def get_mnemonic(self): """Return loaded mnemonic""" if self.key != MNEMONIC: raise ValueError("Load mnemonic first!") return self.value - + def get_pub_hex(self): if self.key in (HEX, NSEC): pub_bytes = self._get_pub_xonly() @@ -165,7 +168,15 @@ def get_npub(self): class KMenu(Menu): """Customizes the page's menu""" - def __init__(self, ctx, menu, offset=None, disable_statusbar=False, back_label="Back", back_status=lambda: MENU_EXIT,): + def __init__( + self, + ctx, + menu, + offset=None, + disable_statusbar=False, + back_label="Back", + back_status=lambda: MENU_EXIT, + ): super().__init__(ctx, menu, offset, disable_statusbar, back_label, back_status) self.disable_statusbar = False if offset is None: @@ -178,9 +189,9 @@ def __init__(self, ctx, menu, offset=None, disable_statusbar=False, back_label=" def draw_wallet_indicator(self): """Customize the top bar""" text = NAME - if nostrKey.loaded_mnemonic(): + if nostrKey.is_mnemonic(): text = self.ctx.wallet.key.fingerprint_hex_str(True) - elif nostrKey.loaded(): + elif nostrKey.is_loaded(): text = nostrKey.key.upper() if not kboard.is_m5stickv: @@ -293,11 +304,6 @@ def _load_nostr_priv_manual(self, version): data = self.capture_from_keypad(title, [DIGITS_HEX]) data = str(data) - if len(data) > HEX_SIZE: - raise ValueError("Maximum length exceeded (%s)" % HEX_SIZE) - if version == NSEC and len(data) > NSEC_SIZE: - raise ValueError("Maximum length exceeded (%s)" % NSEC_SIZE) - self.ctx.display.clear() self.ctx.display.draw_hcentered_text(t("Private Key") + ":\n\n" + data) if not self.prompt( @@ -306,12 +312,7 @@ def _load_nostr_priv_manual(self, version): ): return MENU_CONTINUE - try: - if not self._load_nostr_priv_key(data): - raise ValueError() - except: - self.flash_error(t("Failed to load")) - return MENU_CONTINUE + self._load_nostr_priv_key(data) return MENU_EXIT @@ -346,16 +347,11 @@ def _load_nostr_priv_sd(self): return MENU_EXIT def _load_nostr_priv_key(self, data): - if data.startswith(NSEC) and len(data) == NSEC_SIZE: - nostrKey.update(NSEC, data) - self._load_fake_mnemonic() - return True - if len(data) == HEX_SIZE: - nostrKey.update(PRIV_HEX, data) - self._load_fake_mnemonic() - return True - - return False + if data.startswith(NSEC): + nostrKey.load_nsec(data) + else: + nostrKey.load_hex(data) + self._load_fake_mnemonic() def _load_fake_mnemonic(self): from krux.wallet import Wallet @@ -549,4 +545,5 @@ def run(ctx): if not Khome(ctx).run(): break + nostrKey = NostrKey() diff --git a/tests/kapps/test_nostr.py b/tests/kapps/test_nostr.py index 7524204ff..ee24fd824 100644 --- a/tests/kapps/test_nostr.py +++ b/tests/kapps/test_nostr.py @@ -2,26 +2,25 @@ from . import create_ctx - def test_nostrkey(mocker, m5stickv): from kapps.nostr import NostrKey, MNEMONIC, HEX, NSEC, NPUB, PUB_HEX # Test vectors from NIP-06: https://github.com/nostr-protocol/nips/blob/master/06.md tests = [ { - MNEMONIC:"leader monkey parrot ring guide accident before fence cannon height naive bean", - HEX:"7f7ff03d123792d6ac594bfa67bf6d0c0ab55b6b1fdb6249303fe861f1ccba9a", - NSEC:"nsec10allq0gjx7fddtzef0ax00mdps9t2kmtrldkyjfs8l5xruwvh2dq0lhhkp", - PUB_HEX:"17162c921dc4d2518f9a101db33695df1afb56ab82f5ff3e5da6eec3ca5cd917", - NPUB:"npub1zutzeysacnf9rru6zqwmxd54mud0k44tst6l70ja5mhv8jjumytsd2x7nu" + MNEMONIC: "leader monkey parrot ring guide accident before fence cannon height naive bean", + HEX: "7f7ff03d123792d6ac594bfa67bf6d0c0ab55b6b1fdb6249303fe861f1ccba9a", + NSEC: "nsec10allq0gjx7fddtzef0ax00mdps9t2kmtrldkyjfs8l5xruwvh2dq0lhhkp", + PUB_HEX: "17162c921dc4d2518f9a101db33695df1afb56ab82f5ff3e5da6eec3ca5cd917", + NPUB: "npub1zutzeysacnf9rru6zqwmxd54mud0k44tst6l70ja5mhv8jjumytsd2x7nu", }, { - MNEMONIC:"what bleak badge arrange retreat wolf trade produce cricket blur garlic valid proud rude strong choose busy staff weather area salt hollow arm fade", - HEX:"c15d739894c81a2fcfd3a2df85a0d2c0dbc47a280d092799f144d73d7ae78add", - NSEC:"nsec1c9wh8xy5eqdzln7n5t0ctgxjcrdug73gp5yj0x03gntn67h83twssdfhel", - PUB_HEX:"d41b22899549e1f3d335a31002cfd382174006e166d3e658e3a5eecdb6463573", - NPUB:"npub16sdj9zv4f8sl85e45vgq9n7nsgt5qphpvmf7vk8r5hhvmdjxx4es8rq74h", - } + MNEMONIC: "what bleak badge arrange retreat wolf trade produce cricket blur garlic valid proud rude strong choose busy staff weather area salt hollow arm fade", + HEX: "c15d739894c81a2fcfd3a2df85a0d2c0dbc47a280d092799f144d73d7ae78add", + NSEC: "nsec1c9wh8xy5eqdzln7n5t0ctgxjcrdug73gp5yj0x03gntn67h83twssdfhel", + PUB_HEX: "d41b22899549e1f3d335a31002cfd382174006e166d3e658e3a5eecdb6463573", + NPUB: "npub16sdj9zv4f8sl85e45vgq9n7nsgt5qphpvmf7vk8r5hhvmdjxx4es8rq74h", + }, ] for n, t in enumerate(tests): @@ -43,7 +42,7 @@ def test_nostrkey(mocker, m5stickv): nkey.get_mnemonic() else: assert nkey.get_mnemonic() == t[MNEMONIC] - + assert nkey.get_hex() == t[HEX] assert nkey.get_nsec() == t[NSEC] assert nkey.get_pub_hex() == t[PUB_HEX] @@ -57,4 +56,3 @@ def test_nostrkey(mocker, m5stickv): with pytest.raises(ValueError): nkey.load_nsec(t[NSEC].replace(NSEC, NPUB)) - From 8abf0ec44b72f97a7d4773bfc2bca3aeba574868 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sat, 11 Oct 2025 12:52:01 -0300 Subject: [PATCH 68/86] first version nostr NIP-06 --- kapps/example.py | 17 +++- kapps/nostr.py | 184 +++++++++++++++++--------------------- src/krux/pages/login.py | 3 + tests/kapps/test_nostr.py | 5 +- 4 files changed, 105 insertions(+), 104 deletions(-) diff --git a/kapps/example.py b/kapps/example.py index 88e39ca01..b6d581209 100644 --- a/kapps/example.py +++ b/kapps/example.py @@ -35,6 +35,8 @@ from krux.themes import theme from krux.kboard import kboard +# ------------------- + class KMenu(Menu): """Customizes the page's menu""" @@ -57,7 +59,7 @@ def __init__( self.disable_statusbar = True self.menu_offset = offset if offset >= 0 else DEFAULT_PADDING - def draw_wallet_indicator(self): + def new_draw_wallet_indicator(self): """Customize the top bar""" if not kboard.is_m5stickv: self.ctx.display.draw_hcentered_text( @@ -75,6 +77,16 @@ def draw_wallet_indicator(self): theme.info_bg_color, ) + def new_draw_network_indicator(self): + """Don't draw testnet""" + + # Overwrite Menu top bar functions to allow code reuse + Menu.draw_wallet_indicator = new_draw_wallet_indicator + Menu.draw_network_indicator = new_draw_network_indicator + + +# ------------------- + class Kapp(Page): """Represents the page of the kapp""" @@ -107,6 +119,9 @@ def about(self): return MENU_CONTINUE +# ------------------- + + def run(ctx): """Runs this kapp""" print("run() function inside kapp", NAME) diff --git a/kapps/nostr.py b/kapps/nostr.py index 1e8ce9557..6fa152add 100644 --- a/kapps/nostr.py +++ b/kapps/nostr.py @@ -28,7 +28,7 @@ VERSION = "0.1" NAME = "Nostr" -from krux.pages import Menu, MENU_CONTINUE, MENU_EXIT, LETTERS +from krux.pages import Menu, MENU_CONTINUE, MENU_EXIT, LETTERS, ESC_KEY from krux.pages.login import Login, DIGITS_HEX, DIGITS from krux.pages.home_pages.home import Home from krux.krux_settings import t, Settings @@ -40,8 +40,12 @@ ) from krux.themes import theme from krux.kboard import kboard +from krux.key import Key, TYPE_SINGLESIG +from krux.wallet import Wallet +from krux.settings import MAIN_TXT, ELLIPSIS from embit import bech32, bip32, bip39 from embit.ec import PrivateKey +from embit.networks import NETWORKS from binascii import hexlify @@ -54,20 +58,22 @@ PUB_HEX = "pub-hex" HEX = "hex" MNEMONIC = "mnemonic" -DEFAULT_MNEMONIC = "action action action action action action action action action action action action" NIP06_PATH = "m/44h/1237h/0h/0/0" FILE_SUFFIX = "-nostr" FILE_EXTENSION = ".txt" +# ------------------- + class NostrKey: + """Store and convert Nostr keys""" def __init__(self): self.set() def set(self, key="", value=None): - print("set", key, value) + """Set key type and its value""" self.key = key self.value = value @@ -93,9 +99,11 @@ def load_mnemonic(self, mnemonic: str): self.set(MNEMONIC, mnemonic) def is_loaded(self): + """If a key was loaded""" return self.key != "" def is_mnemonic(self): + """If loaded key is mnemonic""" return self.key == MNEMONIC @staticmethod @@ -106,7 +114,7 @@ def _encode_bech32(data: bytes, version: str): @staticmethod def _decode_bech32(bech: str): - """Decode a bech32 string returning bytes.""" + """Decode a bech32 string returning bytes""" _, _, data = bech32.bech32_decode(bech) if not data: raise ValueError("Invalid bech32 data") @@ -142,13 +150,8 @@ def get_nsec(self): nostr_root = self._mnemonic_to_nip06_key() return NostrKey._encode_bech32(nostr_root.secret, NSEC) - def get_mnemonic(self): - """Return loaded mnemonic""" - if self.key != MNEMONIC: - raise ValueError("Load mnemonic first!") - return self.value - def get_pub_hex(self): + """Return pubkey in hex format""" if self.key in (HEX, NSEC): pub_bytes = self._get_pub_xonly() return pub_bytes.hex() @@ -157,6 +160,7 @@ def get_pub_hex(self): return hexlify(nostr_root.xonly()).decode() def get_npub(self): + """Return pubkey in npub format""" if self.key in (HEX, NSEC): pub_bytes = self._get_pub_xonly() return NostrKey._encode_bech32(pub_bytes, NPUB) @@ -165,6 +169,9 @@ def get_npub(self): return NostrKey._encode_bech32(nostr_root.xonly(), NPUB) +# ------------------- + + class KMenu(Menu): """Customizes the page's menu""" @@ -186,13 +193,14 @@ def __init__( self.disable_statusbar = True self.menu_offset = offset if offset >= 0 else DEFAULT_PADDING - def draw_wallet_indicator(self): + def new_draw_wallet_indicator(self): """Customize the top bar""" text = NAME - if nostrKey.is_mnemonic(): - text = self.ctx.wallet.key.fingerprint_hex_str(True) - elif nostrKey.is_loaded(): - text = nostrKey.key.upper() + if nostrKey.is_loaded(): + if nostrKey.is_mnemonic(): + text = Key.extract_fingerprint(nostrKey.value) + else: + text = nostrKey.value[:9] + ELLIPSIS if not kboard.is_m5stickv: self.ctx.display.draw_hcentered_text( @@ -210,6 +218,15 @@ def draw_wallet_indicator(self): theme.info_bg_color, ) + def new_draw_network_indicator(self): + """Don't draw testnet""" + + Menu.draw_wallet_indicator = new_draw_wallet_indicator + Menu.draw_network_indicator = new_draw_network_indicator + + +# ------------------- + class Klogin(Login): """Page to load a Nostr the Key""" @@ -229,16 +246,11 @@ def __init__(self, ctx): back_label=None, ) - # Follow NIP-06 ? - # Basic key derivation from mnemonic seed phrase - # https://github.com/nostr-protocol/nips/blob/master/06.md - # https://github.com/vitorpamplona/amethyst/tree/main/quartz/src/main/java/com/vitorpamplona/quartz/crypto/nip06 - def _confirm_wallet_key(self, mnemonic): - from krux.key import Key - from embit.networks import NETWORKS - from krux.settings import MAIN_TXT + def _load_wallet_key(self, mnemonic): + nostrKey.load_mnemonic(mnemonic) + self.ctx.wallet = Wallet(Key(mnemonic, TYPE_SINGLESIG, NETWORKS[MAIN_TXT])) - return Key(mnemonic, False, NETWORKS[MAIN_TXT]) + return MENU_EXIT def load_nsec(self): """Load nsec or hex menu item""" @@ -283,38 +295,35 @@ def _load_nostr_priv_cam(self): return MENU_CONTINUE try: - data_str = data.decode() if not isinstance(data, str) else data - if not self._load_nostr_priv_key(data_str): - raise ValueError() + data = data.decode() if not isinstance(data, str) else data except: self.flash_error(error_msg) return MENU_CONTINUE - return MENU_EXIT + return self._load_nostr_priv_key(data) def _load_nostr_priv_manual(self, version): title = t("Private Key") data = "" if version == NSEC: - data = self.capture_from_keypad( - title, [LETTERS, DIGITS], starting_buffer=NSEC - ) - else: - data = self.capture_from_keypad(title, [DIGITS_HEX]) + data = NSEC - data = str(data) - self.ctx.display.clear() - self.ctx.display.draw_hcentered_text(t("Private Key") + ":\n\n" + data) - if not self.prompt( - t("Proceed?"), - BOTTOM_PROMPT_LINE, - ): - return MENU_CONTINUE + while True: + if version == NSEC: + data = self.capture_from_keypad( + title, [LETTERS, DIGITS], starting_buffer=data + ) + else: + data = self.capture_from_keypad( + title, [DIGITS_HEX], starting_buffer=data + ) - self._load_nostr_priv_key(data) + if data == ESC_KEY: + return MENU_CONTINUE - return MENU_EXIT + if self._load_nostr_priv_key(data) == MENU_EXIT: + return MENU_EXIT def _load_nostr_priv_sd(self): from krux.pages.utils import Utils @@ -327,36 +336,37 @@ def _load_nostr_priv_sd(self): from krux.sd_card import SDHandler - data = None - mnemonic = "" + data = "" try: with SDHandler() as sd: data = sd.read(filename) data = data.replace("\r\n", "").replace("\n", "") - if not self._load_nostr_priv_key(data): - raise ValueError() except: self.flash_error(t("Failed to load")) return MENU_CONTINUE - from krux.wallet import Wallet + return self._load_nostr_priv_key(data) - self.ctx.wallet = Wallet(self._confirm_wallet_key(mnemonic)) + def _load_nostr_priv_key(self, data: str): + data = data.lower() - return MENU_EXIT + self.ctx.display.clear() + self.ctx.display.draw_hcentered_text( + t("Private Key") + ":\n\n" + data, max_lines=10, highlight_prefix=":" + ) + if not self.prompt( + t("Proceed?"), + BOTTOM_PROMPT_LINE, + ): + return MENU_CONTINUE - def _load_nostr_priv_key(self, data): if data.startswith(NSEC): nostrKey.load_nsec(data) else: nostrKey.load_hex(data) - self._load_fake_mnemonic() - - def _load_fake_mnemonic(self): - from krux.wallet import Wallet - self.ctx.wallet = Wallet(self._confirm_wallet_key(DEFAULT_MNEMONIC)) + return MENU_EXIT def about(self): """Handler for the 'about' menu item""" @@ -370,6 +380,9 @@ def about(self): return MENU_CONTINUE +# ------------------- + + class Khome(Home): """The page after loading the Key""" @@ -385,12 +398,11 @@ def __init__(self, ctx): ( self.backup_mnemonic if not Settings().security.hide_mnemonic - and nostrKey.loaded_mnemonic() + and nostrKey.is_mnemonic() else None ), ), (t("Nostr Keys"), self.nostr_keys), - ("BIP85", self.bip85), (t("Sign Event"), self.sign_message), (shtn_reboot_label, self.shutdown), ], @@ -399,26 +411,12 @@ def __init__(self, ctx): def nostr_keys(self): """Handler for Nostr Keys menu item""" - - if nostrKey.loaded_mnemonic: - if not self.prompt(t("Create NIP06 keys?")): - return MENU_CONTINUE - - try: - self._get_private_key() - except: - raise ValueError("This mnemonic cannot be converted, try another") - submenu = Menu( self.ctx, [ ( t("Private Key"), - ( - None - if Settings().security.hide_mnemonic - else lambda: self.show_key_formats([NSEC, PRIV_HEX]) - ), + lambda: self.show_key_formats([NSEC, PRIV_HEX]), ), (t("Public Key"), lambda: self.show_key_formats([NPUB, PUB_HEX])), ], @@ -469,6 +467,7 @@ def _save_nostr_to_sd(version): full_nostr_key, offset_y=FONT_HEIGHT, info_box=True, + highlight_prefix=":", ) nostr_key_menu.run_loop() @@ -507,32 +506,16 @@ def _get_nostr_title(self, version): return "Private Key hex" def _get_nostr_key(self, version): - - def _encode_nostr_key(bits, version): - from embit import bech32 - - converted_bits = bech32.convertbits(bits, 8, 5) - return bech32.bech32_encode(bech32.Encoding.BECH32, version, converted_bits) - - if version in (NPUB, PUB_HEX): - pub_key = self._get_private_key().get_public_key().serialize()[1:] - if version == NPUB: - return _encode_nostr_key(pub_key, version) - return pub_key.hex() + if version == NPUB: + return nostrKey.get_npub() if version == NSEC: - return _encode_nostr_key(self._get_mnemonic_bytes(), version) - return self._get_mnemonic_bytes().hex() - - def _get_mnemonic_bytes(self): - from embit import bip39 - - mnemonic = self.ctx.wallet.key.mnemonic - return bip39.mnemonic_to_bytes(mnemonic, ignore_checksum=True) + return nostrKey.get_nsec() + if version == PRIV_HEX: + return nostrKey.get_hex() + return nostrKey.get_pub_hex() - def _get_private_key(self): - from embit import ec - return ec.PrivateKey(self._get_mnemonic_bytes()) +# ------------------- def run(ctx): @@ -540,10 +523,11 @@ def run(ctx): Klogin(ctx).run() - if ctx.is_logged_in(): - while True: - if not Khome(ctx).run(): - break + if nostrKey.is_loaded(): + Khome(ctx).run() nostrKey = NostrKey() + +# TODO: use try / catch and threat exceptions to avoid error: +# Could not execute nostr diff --git a/src/krux/pages/login.py b/src/krux/pages/login.py index ac992063e..9c3bea0dd 100644 --- a/src/krux/pages/login.py +++ b/src/krux/pages/login.py @@ -286,6 +286,9 @@ def _load_key_from_words(self, words, charset=LETTERS, new=False): if mnemonic is None: return MENU_CONTINUE + return self._load_wallet_key(mnemonic) + + def _load_wallet_key(self, mnemonic): passphrase = "" if not hasattr(Settings().wallet, "policy_type") and hasattr( Settings().wallet, "multisig" diff --git a/tests/kapps/test_nostr.py b/tests/kapps/test_nostr.py index ee24fd824..7644133a7 100644 --- a/tests/kapps/test_nostr.py +++ b/tests/kapps/test_nostr.py @@ -38,10 +38,9 @@ def test_nostrkey(mocker, m5stickv): assert nkey.is_loaded() if version in (HEX, NSEC): - with pytest.raises(ValueError): - nkey.get_mnemonic() + assert nkey.is_mnemonic() == False else: - assert nkey.get_mnemonic() == t[MNEMONIC] + assert nkey.is_mnemonic() assert nkey.get_hex() == t[HEX] assert nkey.get_nsec() == t[NSEC] From 847783fc7aafba572c90d42d386fd7085e60b71d Mon Sep 17 00:00:00 2001 From: tadeubas Date: Thu, 16 Oct 2025 23:16:53 -0300 Subject: [PATCH 69/86] nostr event and sign review + tests --- kapps/nostr.py | 471 +++++++++++++++++++++++++++++++++++++- tests/kapps/test_nostr.py | 79 ++++++- 2 files changed, 540 insertions(+), 10 deletions(-) diff --git a/kapps/nostr.py b/kapps/nostr.py index 6fa152add..d649416f5 100644 --- a/kapps/nostr.py +++ b/kapps/nostr.py @@ -28,8 +28,8 @@ VERSION = "0.1" NAME = "Nostr" -from krux.pages import Menu, MENU_CONTINUE, MENU_EXIT, LETTERS, ESC_KEY -from krux.pages.login import Login, DIGITS_HEX, DIGITS +from krux.pages import Menu, MENU_CONTINUE, MENU_EXIT, LETTERS, DIGITS, ESC_KEY +from krux.pages.login import Login, DIGITS_HEX from krux.pages.home_pages.home import Home from krux.krux_settings import t, Settings from krux.display import ( @@ -37,6 +37,7 @@ FONT_HEIGHT, BOTTOM_PROMPT_LINE, DEFAULT_PADDING, + FONT_WIDTH, ) from krux.themes import theme from krux.kboard import kboard @@ -47,6 +48,9 @@ from embit.ec import PrivateKey from embit.networks import NETWORKS from binascii import hexlify +import ujson as json +import hashlib +import time NSEC_SIZE = 63 @@ -63,6 +67,374 @@ FILE_SUFFIX = "-nostr" FILE_EXTENSION = ".txt" + +# ------------------- + + +# https://github.com/nostr-protocol/nips +class NostrEvent: + + # https://github.com/nostr-protocol/nips/blob/master/01.md + # { + # "id": <32-bytes lowercase hex-encoded sha256 of the serialized event data>, + # "pubkey": <32-bytes lowercase hex-encoded public key of the event creator>, + # "created_at": , + # "kind": , + # "tags": [ + # [...], + # // ... + # ], + # "content": , + # "sig": <64-bytes lowercase hex of the signature of the sha256 hash of the serialized event data, which is the same as the "id" field> + # } + + # Kind types + KIND_REGULAR = "regular" + KIND_REPLACEABLE = "replaceable" + KIND_EPHEMERAL = "ephemeral" + KIND_ADDRESSABLE = "addressable" + UNKNOWN = "unknown" + + # event mandatory attributes + PUBKEY = "pubkey" + CREATED_AT = "created_at" + KIND = "kind" + TAGS = "tags" + CONTENT = "content" + ID = "id" + + KIND_DESC = { + 0: "User Metadata", + 1: "Short Text Note", + 2: "Recommend Relay (deprecated)", + 3: "Follows", + 4: "Encrypted Direct Messages", + 5: "Event Deletion Request", + 6: "Repost", + 7: "Reaction", + 8: "Badge Award", + 9: "Chat Message", + 10: "Group Chat Threaded Reply (deprecated)", + 11: "Thread", + 12: "Group Thread Reply (deprecated)", + 13: "Seal", + 14: "Direct Message", + 15: "File Message", + 16: "Generic Repost", + 17: "Reaction to a website", + 20: "Picture", + 21: "Video Event", + 22: "Short-form Portrait Video Event", + 30: "internal reference", + 31: "external web reference", + 32: "hardcopy reference", + 33: "prompt reference", + 40: "Channel Creation", + 41: "Channel Metadata", + 42: "Channel Message", + 43: "Channel Hide Message", + 44: "Channel Mute User", + 62: "Request to Vanish", + 64: "Chess (PGN)", + 443: "KeyPackage", + 444: "Welcome Message", + 445: "Group Event", + 818: "Merge Requests", + 1018: "Poll Response", + 1021: "Bid", + 1022: "Bid confirmation", + 1040: "OpenTimestamps", + 1059: "Gift Wrap", + 1063: "File Metadata", + 1068: "Poll", + 1111: "Comment", + 1222: "Voice Message", + 1244: "Voice Message Comment", + 1311: "Live Chat Message", + 1337: "Code Snippet", + 1617: "Patches", + 1621: "Issues", + 1622: "Git Replies (deprecated)", + "1630-1633": "Status", + 1971: "Problem Tracker", + 1984: "Reporting", + 1985: "Label", + 1986: "Relay reviews", + 1987: "AI Embeddings / Vector lists", + 2003: "Torrent", + 2004: "Torrent Comment", + 2022: "Coinjoin Pool", + 4550: "Community Post Approval", + "5000-5999": "Job Request", + "6000-6999": "Job Result", + 7000: "Job Feedback", + 7374: "Reserved Cashu Wallet Tokens", + 7375: "Cashu Wallet Tokens", + 7376: "Cashu Wallet History", + 7516: "Geocache log", + 7517: "Geocache proof of find", + "9000-9030": "Group Control Events", + 9041: "Zap Goal", + 9321: "Nutzap", + 9467: "Tidal login", + 9734: "Zap Request", + 9735: "Zap", + 9802: "Highlights", + 10000: "Mute list", + 10001: "Pin list", + 10002: "Relay List Metadata", + 10003: "Bookmark list", + 10004: "Communities list", + 10005: "Public chats list", + 10006: "Blocked relays list", + 10007: "Search relays list", + 10009: "User groups", + 10012: "Favorite relays list", + 10013: "Private event relay list", + 10015: "Interests list", + 10019: "Nutzap Mint Recommendation", + 10020: "Media follows", + 10030: "User emoji list", + 10050: "Relay list to receive DMs", + 10051: "KeyPackage Relays List", + 10063: "User server list", + 10096: "File storage server list (deprecated)", + 10166: "Relay Monitor Announcement", + 10312: "Room Presence", + 10377: "Proxy Announcement", + 11111: "Transport Method Announcement", + 13194: "Wallet Info", + 17375: "Cashu Wallet Event", + 21000: "Lightning Pub RPC", + 22242: "Client Authentication", + 23194: "Wallet Request", + 23195: "Wallet Response", + 24133: "Nostr Connect", + 24242: "Blobs stored on mediaservers", + 27235: "HTTP Auth", + 30000: "Follow sets", + 30001: "Generic lists (deprecated)", + 30002: "Relay sets", + 30003: "Bookmark sets", + 30004: "Curation sets", + 30005: "Video sets", + 30007: "Kind mute sets", + 30008: "Profile Badges", + 30009: "Badge Definition", + 30015: "Interest sets", + 30017: "Create or update a stall", + 30018: "Create or update a product", + 30019: "Marketplace UI/UX", + 30020: "Product sold as an auction", + 30023: "Long-form Content", + 30024: "Draft Long-form Content", + 30030: "Emoji sets", + 30040: "Curated Publication Index", + 30041: "Curated Publication Content", + 30063: "Release artifact sets", + 30078: "Application-specific Data", + 30166: "Relay Discovery", + 30267: "App curation sets", + 30311: "Live Event", + 30312: "Interactive Room", + 30313: "Conference Event", + 30315: "User Statuses", + 30388: "Slide Set", + 30402: "Classified Listing", + 30403: "Draft Classified Listing", + 30617: "Repository announcements", + 30618: "Repository state announcements", + 30818: "Wiki article", + 30819: "Redirects", + 31234: "Draft Event", + 31388: "Link Set", + 31890: "Feed", + 31922: "Date-Based Calendar Event", + 31923: "Time-Based Calendar Event", + 31924: "Calendar", + 31925: "Calendar Event RSVP", + 31989: "Handler recommendation", + 31990: "Handler information", + 32267: "Software Application", + 34550: "Community Definition", + 37516: "Geocache listing", + 38172: "Cashu Mint Announcement", + 38173: "Fedimint Announcement", + 38383: "Peer-to-peer Order events", + "39000-9": "Group metadata events", + 39089: "Starter packs", + 39092: "Media starter packs", + 39701: "Web bookmarks", + } + + # May have different meanings depending on the kind number + TAGS_DESC = { + "a": "coordinates to an event", + "A": "root address", + "d": "identifier", + "e": "event id (hex)", + "E": "root event id", + "f": "currency code", + "g": "geohash", + "h": "group id", + "i": "external identity", + "I": "root external identity", + "k": "kind", + "K": "root scope", + "l": "label, label namespace, language name", + "L": "label namespace", + "m": "MIME type", + "p": "pubkey (hex)", + "P": "pubkey (hex)", + "q": "event id (hex)", + "r": "url / relay url", + "s": "status", + "t": "hashtag", + "u": "url", + "x": "hash", + "y": "platform", + "z": "order number", + "-": "protected", + "alt": "summary", + "amount": "millisatoshis, stringified", + "bolt11": "bolt11 invoice", + "challenge": "challenge string", + "client": "name, address", + "clone": "git clone URL", + "content-warning": "reason", + "delegation": "pubkey, conditions, delegation token", + "dep": "Required dependency", + "description": "description", + "emoji": "shortcode, image URL", + "encrypted": "--", + "extension": "File extension", + "expiration": "unix timestamp (string)", + "file": "full path (string)", + "goal": "event id (hex)", + "HEAD": "ref: refs/heads/", + "image": "image URL", + "imeta": "inline metadata", + "license": "License of the shared content", + "lnurl": "bech32 encoded lnurl", + "location": "location string", + "name": "name", + "nonce": "random", + "preimage": "hash of bolt11 invoice", + "price": "price", + "proxy": "external ID", + "published_at": "unix timestamp (string)", + "relay": "relay url", + "relays": "relay list", + "repo": "Reference to the origin repository", + "runtime": "Runtime or environment specification", + "server": "file storage server url", + "subject": "subject", + "summary": "summary", + "thumb": "badge thumbnail", + "title": "title", + "tracker": "torrent tracker URL", + "web": "webpage URL", + "zap": "pubkey (hex), relay URL", + } + + @classmethod + def get_kind_type(cls, n: int): + """The type of the kind""" + if n < 0 or n > 65535: + raise ValueError("Kind number must be greater than 0 and lower than 65535!") + if 1000 <= n < 10000 or 4 <= n < 45 or n in (1, 2): + return cls.KIND_REGULAR + if 10000 <= n < 20000 or n in (0, 3): + return cls.KIND_REPLACEABLE + if 20000 <= n < 30000: + return cls.KIND_EPHEMERAL + if 30000 <= n < 40000: + return cls.KIND_ADDRESSABLE + return cls.UNKNOWN + + @classmethod + def get_kind_desc(cls, n: int): + """The meaning of the event""" + try: + return cls.KIND_DESC[n] + except: + if 1630 >= n <= 1633: + return cls.KIND_DESC["1630-1633"] + if 5000 >= n <= 5999: + return cls.KIND_DESC["5000-5999"] + if 6000 >= n <= 6999: + return cls.KIND_DESC["6000-6999"] + if 9000 >= n <= 9030: + return cls.KIND_DESC["9000-9030"] + if 39000 >= n <= 39009: + return cls.KIND_DESC["39000-9"] + + return cls.UNKNOWN + + @classmethod + def get_tag(cls, txt: str): + """The meaning of the tag (may vary depending on the kind)""" + try: + return cls.TAGS_DESC[txt] + except: + return cls.UNKNOWN + + @classmethod + def parse_event(cls, txt: str): + """ + Parse a JSON-encoded event string and validate required attributes + Returns the parsed dict if valid or raise Error + """ + json_content = json.loads(txt) + expected_attrs = { + cls.PUBKEY, + cls.CREATED_AT, + cls.KIND, + cls.TAGS, + cls.CONTENT, + cls.ID, + } + + missing = expected_attrs - json_content.keys() + if missing: + raise ValueError("Missing expected attributes: %s." % ", ".join(missing)) + + return json_content + + @classmethod + def serialize_event(cls, event_dict: dict): + """UTF-8 JSON-serialized string as defined in NIP-01""" + data = [ + 0, + event_dict[cls.PUBKEY], + event_dict[cls.CREATED_AT], + event_dict[cls.KIND], + event_dict[cls.TAGS], + event_dict[cls.CONTENT], + ] + data_str = json.dumps(data, separators=(",", ":"), ensure_ascii=False) + return data_str + + @classmethod + def validate_id(cls, event_dict: dict, serialized_event: str): + """Validates informed id with calculated one""" + if event_dict[cls.ID] != cls._calculate_id(serialized_event): + raise ValueError("Attribute id do not match calculated.") + return True + + @staticmethod + def _calculate_id(serialized_event: str): + """Calculates the id field of the event""" + return hashlib.sha256(serialized_event.encode()).digest().hex() + + @staticmethod + def sign_event(root, serialized_event: str): + """Sign a serialized_event""" + return str( + root.schnorr_sign(hashlib.sha256(serialized_event.encode()).digest()) + ) + + # ------------------- @@ -125,10 +497,14 @@ def _mnemonic_to_nip06_key(self): root = bip32.HDKey.from_seed(bip39.mnemonic_to_seed(self.value)) return root.derive(NIP06_PATH) - def _get_pub_xonly(self): + def get_private_key(self): + if self.is_mnemonic(): + return self._mnemonic_to_nip06_key() hex_key = self.value if self.key == HEX else self.get_hex() - priv = PrivateKey(bytes.fromhex(hex_key)) - return priv.get_public_key().xonly() + return PrivateKey(bytes.fromhex(hex_key)) + + def _get_pub_xonly(self): + return self.get_private_key().get_public_key().xonly() def get_hex(self): """Return key in hex format""" @@ -368,6 +744,8 @@ def _load_nostr_priv_key(self, data: str): return MENU_EXIT + # NIP-06, NIP-19 and NIP-26 + # mnemonic, nsec and delegate def about(self): """Handler for the 'about' menu item""" @@ -403,12 +781,93 @@ def __init__(self, ctx): ), ), (t("Nostr Keys"), self.nostr_keys), - (t("Sign Event"), self.sign_message), + (t("Sign Event"), self.sign_event), (shtn_reboot_label, self.shutdown), ], back_label=None, ) + def sign_event(self): + """Handler for Sign Event menu item""" + from krux.pages.home_pages.sign_message_ui import SignMessage + + sing_message = SignMessage(self.ctx) + data, qr_format, message_filename = sing_message._load_message() + + self.ctx.display.clear() + self.ctx.display.draw_centered_text(t("Processing…")) + + if data is None: + self.flash_error(t("Failed to load")) + return MENU_CONTINUE + + print(qr_format, message_filename) + + # SD + if message_filename: + data = data.decode() + + print(data) + pe = NostrEvent.parse_event(data) + se = NostrEvent.serialize_event(pe) + # NostrEvent.validate_id(pe, se) + + self._show_event(pe) + + # TODO: show menu: review again, sign to QR code or SD + + return MENU_CONTINUE + + def _show_event(self, pe: dict): + created = time.localtime(pe[NostrEvent.CREATED_AT]) + kind = pe[NostrEvent.KIND] + unique_tags = {item[0] for item in pe[NostrEvent.TAGS]} + txt = t("Created:") + txt += " %s-%02d-%02d %02d:%02d" % created[:5] + txt += "\n\n" + + txt += t("Kind:") + txt += " %d %s {%s}" % ( + kind, + NostrEvent.get_kind_desc(kind), + NostrEvent.get_kind_type(kind), + ) + txt += "\n\n" + + txt += t("Tags:") + if unique_tags: + txt += " " + ", ".join( + "'%s' %s" % (tag, NostrEvent.get_tag(tag)) for tag in unique_tags + ) + txt += "\n\n" + txt += " | ".join(", ".join(sublist) for sublist in pe[NostrEvent.TAGS]) + txt += "\n\n" + + txt += t("Content:") + txt += " %s" % pe[NostrEvent.CONTENT] + + offset_x = ( + DEFAULT_PADDING + if not kboard.is_m5stickv + else (self.ctx.display.width() % FONT_WIDTH) // 2 + ) + + startpos = endpos = 0 + txt_size = len(txt) + while True: + lines, endpos = self.ctx.display.to_lines_endpos(txt[startpos:]) + self.ctx.display.clear() + for i, line in enumerate(lines): + self.ctx.display.draw_string( + offset_x, + (i * (FONT_HEIGHT)), + line, + ) + startpos += endpos + self.ctx.input.wait_for_fastnav_button() + if startpos >= txt_size: + break + def nostr_keys(self): """Handler for Nostr Keys menu item""" submenu = Menu( diff --git a/tests/kapps/test_nostr.py b/tests/kapps/test_nostr.py index 7644133a7..0e322ab09 100644 --- a/tests/kapps/test_nostr.py +++ b/tests/kapps/test_nostr.py @@ -2,11 +2,11 @@ from . import create_ctx -def test_nostrkey(mocker, m5stickv): - from kapps.nostr import NostrKey, MNEMONIC, HEX, NSEC, NPUB, PUB_HEX +def data(): + from kapps.nostr import MNEMONIC, HEX, NSEC, NPUB, PUB_HEX # Test vectors from NIP-06: https://github.com/nostr-protocol/nips/blob/master/06.md - tests = [ + return [ { MNEMONIC: "leader monkey parrot ring guide accident before fence cannon height naive bean", HEX: "7f7ff03d123792d6ac594bfa67bf6d0c0ab55b6b1fdb6249303fe861f1ccba9a", @@ -23,7 +23,11 @@ def test_nostrkey(mocker, m5stickv): }, ] - for n, t in enumerate(tests): + +def test_nostrkey(mocker, m5stickv): + from kapps.nostr import NostrKey, MNEMONIC, HEX, NSEC, NPUB, PUB_HEX + + for n, t in enumerate(data()): print(n, t) for version in (MNEMONIC, HEX, NSEC): nkey = NostrKey() @@ -55,3 +59,70 @@ def test_nostrkey(mocker, m5stickv): with pytest.raises(ValueError): nkey.load_nsec(t[NSEC].replace(NSEC, NPUB)) + + +def test_nostrevent(mocker, m5stickv): + from kapps.nostr import NostrEvent, NostrKey, MNEMONIC, HEX, NSEC + import json + + event = r"""{ + "id": "a2d1bc19ed2bc8e09de9485d641fa53b89df75eecc042127dd2272d46afd6c8f", + "pubkey": "17162c921dc4d2518f9a101db33695df1afb56ab82f5ff3e5da6eec3ca5cd917", + "created_at": 1760632896, + "kind": 1, + "tags": [], + "content": "t \" \\\r\n\r\nkkk", + "sig": "17f972991755d25ec8d132b93fd1c0f59abba4c5fabd56274210e2bded9fe131ad294d73904f680bc18511a4e3a40660b2a67086179b332b0d2f670bed1c3c96" + }""" + + event_dict = json.loads(event) + + # Remove the 'id' field + event_dict.pop("id", None) + + # Dump back to JSON string + event_without_id = json.dumps(event_dict, ensure_ascii=False) + + # Error event without necessary attribute + pe = None + with pytest.raises(ValueError): + pe = NostrEvent.parse_event(event_without_id) + assert pe is None + + pe = NostrEvent.parse_event(event) + assert pe[NostrEvent.KIND] == 1 + + se = NostrEvent.serialize_event(pe) + + # Event and its serialization OK + assert NostrEvent.validate_id(pe, se) + + # signature tests + data1 = data()[0] + nkey = NostrKey() + # with mnemonic + nkey.load_mnemonic(data1[MNEMONIC]) + sig = NostrEvent.sign_event(nkey.get_private_key(), se) + assert sig == pe["sig"] + + # with hex + nkey.load_hex(data1[HEX]) + sig = NostrEvent.sign_event(nkey.get_private_key(), se) + assert sig == pe["sig"] + + # with nsec + nkey.load_nsec(data1[NSEC]) + sig = NostrEvent.sign_event(nkey.get_private_key(), se) + assert sig == pe["sig"] + + # Mess with id + pe[NostrEvent.ID] = pe[NostrEvent.ID].replace("1", "2") + + # Error comparing serialized_event with its id + with pytest.raises(ValueError): + NostrEvent.validate_id(pe, se) + + # other tests + assert NostrEvent.get_kind_type(1) == NostrEvent.KIND_REGULAR + assert NostrEvent.get_kind_desc(1) == NostrEvent.KIND_DESC[1] + assert NostrEvent.get_tag(999999) == NostrEvent.UNKNOWN From 0ecfb0560debbaf16ede2f5545c69380738159ab Mon Sep 17 00:00:00 2001 From: tadeubas Date: Fri, 17 Oct 2025 08:35:16 -0300 Subject: [PATCH 70/86] fix pylint i18n.py --- i18n/i18n.py | 1 + 1 file changed, 1 insertion(+) diff --git a/i18n/i18n.py b/i18n/i18n.py index ecb26d711..2bba0463e 100644 --- a/i18n/i18n.py +++ b/i18n/i18n.py @@ -19,6 +19,7 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. +# pylint: disable=invalid-name import binascii import sys From 54251e8503332044017086f6bc5ce4c7e0dfbca5 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Fri, 17 Oct 2025 23:15:22 -0300 Subject: [PATCH 71/86] Kapp nostr v1.0 --- kapps/example.mpy | Bin 1419 -> 1546 bytes kapps/nostr.mpy | Bin 6626 -> 18264 bytes kapps/nostr.py | 113 ++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 95 insertions(+), 18 deletions(-) diff --git a/kapps/example.mpy b/kapps/example.mpy index 6baaabdba14b2de95703f4caad9cfb9ab20c0cce..f50b1ae4840869e02c879086ca0aaac1992eed89 100644 GIT binary patch delta 481 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 M1OmWqfCIb#4GOD7od5s; diff --git a/kapps/nostr.py b/kapps/nostr.py index d649416f5..782284ff6 100644 --- a/kapps/nostr.py +++ b/kapps/nostr.py @@ -25,7 +25,7 @@ # avoids importing from flash VSF os.chdir("/") -VERSION = "0.1" +VERSION = "1.0" NAME = "Nostr" from krux.pages import Menu, MENU_CONTINUE, MENU_EXIT, LETTERS, DIGITS, ESC_KEY @@ -47,10 +47,11 @@ from embit import bech32, bip32, bip39 from embit.ec import PrivateKey from embit.networks import NETWORKS -from binascii import hexlify +from binascii import hexlify, unhexlify import ujson as json import hashlib import time +import gc NSEC_SIZE = 63 @@ -395,7 +396,7 @@ def parse_event(cls, txt: str): cls.ID, } - missing = expected_attrs - json_content.keys() + missing = expected_attrs - set(json_content.keys()) if missing: raise ValueError("Missing expected attributes: %s." % ", ".join(missing)) @@ -412,8 +413,7 @@ def serialize_event(cls, event_dict: dict): event_dict[cls.TAGS], event_dict[cls.CONTENT], ] - data_str = json.dumps(data, separators=(",", ":"), ensure_ascii=False) - return data_str + return json.dumps(data).replace(", ", ",").replace(": ", ":") @classmethod def validate_id(cls, event_dict: dict, serialized_event: str): @@ -425,7 +425,7 @@ def validate_id(cls, event_dict: dict, serialized_event: str): @staticmethod def _calculate_id(serialized_event: str): """Calculates the id field of the event""" - return hashlib.sha256(serialized_event.encode()).digest().hex() + return hexlify(hashlib.sha256(serialized_event.encode()).digest()).decode() @staticmethod def sign_event(root, serialized_event: str): @@ -463,7 +463,7 @@ def load_hex(self, hex: str): if len(hex) != HEX_SIZE: raise ValueError("Hex key must be %d chars!" % HEX_SIZE) # try decoding - bytes.fromhex(hex) + unhexlify(hex) self.set(HEX, hex) def load_mnemonic(self, mnemonic: str): @@ -501,7 +501,7 @@ def get_private_key(self): if self.is_mnemonic(): return self._mnemonic_to_nip06_key() hex_key = self.value if self.key == HEX else self.get_hex() - return PrivateKey(bytes.fromhex(hex_key)) + return PrivateKey(unhexlify(hex_key)) def _get_pub_xonly(self): return self.get_private_key().get_public_key().xonly() @@ -511,7 +511,7 @@ def get_hex(self): if self.key == HEX: return self.value if self.key == NSEC: - return NostrKey._decode_bech32(self.value).hex() + return hexlify(NostrKey._decode_bech32(self.value)).decode() # is mnemonic nostr_root = self._mnemonic_to_nip06_key() return hexlify(nostr_root.secret).decode() @@ -521,7 +521,7 @@ def get_nsec(self): if self.key == NSEC: return self.value if self.key == HEX: - return NostrKey._encode_bech32(bytes.fromhex(self.value), NSEC) + return NostrKey._encode_bech32(unhexlify(self.value), NSEC) # is mnemonic nostr_root = self._mnemonic_to_nip06_key() return NostrKey._encode_bech32(nostr_root.secret, NSEC) @@ -530,7 +530,7 @@ def get_pub_hex(self): """Return pubkey in hex format""" if self.key in (HEX, NSEC): pub_bytes = self._get_pub_xonly() - return pub_bytes.hex() + return hexlify(pub_bytes).decode() # is mnemonic nostr_root = self._mnemonic_to_nip06_key() return hexlify(nostr_root.xonly()).decode() @@ -797,24 +797,90 @@ def sign_event(self): self.ctx.display.clear() self.ctx.display.draw_centered_text(t("Processing…")) + # memory management + del sing_message + gc.collect() + if data is None: self.flash_error(t("Failed to load")) return MENU_CONTINUE - print(qr_format, message_filename) - # SD if message_filename: data = data.decode() - print(data) pe = NostrEvent.parse_event(data) se = NostrEvent.serialize_event(pe) - # NostrEvent.validate_id(pe, se) + NostrEvent.validate_id(pe, se) + + submenu = Menu( + self.ctx, + [ + (t("Review Again"), lambda: None), + (t("Sign to QR code"), lambda: None), + ( + t("Sign to SD card"), + None if not self.has_sd_card() else lambda: None, + ), + ], + back_status=lambda: None, + ) + index = 0 + + while index == 0: # Review Again + self._show_event(pe) + index, _ = submenu.run_loop() - self._show_event(pe) + if index == submenu.back_index: # Back + return MENU_CONTINUE + + self.ctx.display.clear() + self.ctx.display.draw_centered_text(t("Signing…")) + + # memory management + del pe + del submenu + gc.collect() + + signed_event = NostrEvent.sign_event(nostrKey.get_private_key(), se) + + if index == 1: # Sign to QR code + from krux.pages.utils import Utils + + utils = Utils(self.ctx) + + while True: + self.display_qr_codes(signed_event, qr_format) + utils.print_standard_qr( + signed_event, qr_format, t("Signed Event"), width=45 + ) + self.ctx.display.clear() + if self.prompt(t("Done?"), self.ctx.display.height() // 2): + return MENU_CONTINUE + + # index == 2: Sign to SD card + from krux.sd_card import SDHandler, SIGNED_FILE_SUFFIX, SIGNATURE_FILE_EXTENSION + from krux.pages.file_operations import SaveFile + + save_page = SaveFile(self.ctx) + message_filename = save_page.set_filename( + message_filename, + "QRCode", + SIGNED_FILE_SUFFIX, + SIGNATURE_FILE_EXTENSION, + ) - # TODO: show menu: review again, sign to QR code or SD + if message_filename and message_filename != ESC_KEY: + try: + with SDHandler() as sd: + sd.write(message_filename, signed_event) + self.flash_text( + t("Saved to SD card:") + "\n\n%s" % message_filename, + highlight_prefix=":", + ) + return MENU_CONTINUE + except OSError: + self.flash_error(t("SD card not detected.")) return MENU_CONTINUE @@ -854,6 +920,7 @@ def _show_event(self, pe: dict): startpos = endpos = 0 txt_size = len(txt) + prefixes = [t("Created:"), t("Kind:"), t("Tags:"), t("Content:")] while True: lines, endpos = self.ctx.display.to_lines_endpos(txt[startpos:]) self.ctx.display.clear() @@ -863,6 +930,16 @@ def _show_event(self, pe: dict): (i * (FONT_HEIGHT)), line, ) + if any(line.startswith(p) for p in prefixes): + prefixes.pop(0) + prefix_index = line.find(":") + if prefix_index > -1: + self.ctx.display.draw_string( + offset_x, + (i * (FONT_HEIGHT)), + line[: prefix_index + 1], + theme.highlight_color, + ) startpos += endpos self.ctx.input.wait_for_fastnav_button() if startpos >= txt_size: @@ -988,5 +1065,5 @@ def run(ctx): nostrKey = NostrKey() -# TODO: use try / catch and threat exceptions to avoid error: +# use try / catch and threat exceptions to avoid error? # Could not execute nostr From 3c51142ce957e7b1f3f41ee8a5958319c9874a7e Mon Sep 17 00:00:00 2001 From: tadeubas Date: Sat, 18 Oct 2025 21:09:10 -0300 Subject: [PATCH 72/86] fix /flash on simulator --- kapps/nostr.py | 4 ++-- simulator/kruxsim/mocks/uos.py | 8 ++------ 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/kapps/nostr.py b/kapps/nostr.py index 782284ff6..6be9aab9b 100644 --- a/kapps/nostr.py +++ b/kapps/nostr.py @@ -744,8 +744,8 @@ def _load_nostr_priv_key(self, data: str): return MENU_EXIT - # NIP-06, NIP-19 and NIP-26 - # mnemonic, nsec and delegate + # NIP-06 and NIP-19 + # mnemonic and nsec/npub def about(self): """Handler for the 'about' menu item""" diff --git a/simulator/kruxsim/mocks/uos.py b/simulator/kruxsim/mocks/uos.py index 04f14de18..79d3a9780 100644 --- a/simulator/kruxsim/mocks/uos.py +++ b/simulator/kruxsim/mocks/uos.py @@ -28,18 +28,14 @@ def new_listdir(path, *args, **kwargs): - if path.startswith("/sd"): + if path.startswith(("/sd", "/flash")): path = path.lstrip("/") - elif path.startswith("/flash"): - path = path.replace("/flash", "sd") return old_listdir(path, *args, **kwargs) def new_remove(path, *args, **kwargs): - if path.startswith("/sd"): + if path.startswith(("/sd", "/flash")): path = path.lstrip("/") - elif path.startswith("/flash"): - return return old_remove(path, *args, **kwargs) From 53fcc3bd37aa00b5098f262aadddd5527b647152 Mon Sep 17 00:00:00 2001 From: tadeubas Date: Wed, 22 Oct 2025 14:59:04 -0300 Subject: [PATCH 73/86] fix docs datum + imgs --- .../features/encryption/encryption.en.md | 6 +-- .../encryption/kef-specifications.en.md | 28 +++++----- docs/getting-started/features/tools.en.md | 22 ++++---- .../usage/navigating-the-main-menu.en.md | 4 +- .../device-tests-options-300.en.png | Bin 56035 -> 58264 bytes .../tools-datum-tool-convert-300.en.png | Bin 69566 -> 73228 bytes .../tools-datum-tool-load-300.en.png | Bin 56637 -> 56700 bytes .../tools-datum-tool-loaded-300.en.png | Bin 68467 -> 71252 bytes .../img/maixpy_amigo/tools-options-300.en.png | Bin 64213 -> 61618 bytes .../device-tests-options-250.en.png | Bin 93012 -> 96080 bytes .../tools-datum-tool-convert-250.en.png | Bin 108797 -> 107200 bytes .../tools-datum-tool-load-250.en.png | Bin 96066 -> 95898 bytes .../tools-datum-tool-loaded-250.en.png | Bin 109637 -> 111686 bytes .../maixpy_m5stickv/tools-options-250.en.png | Bin 105797 -> 103044 bytes simulator/generate-device-screenshots.sh | 1 + .../sequences/qrcodes/datum-example-qr.png | Bin 0 -> 2113 bytes simulator/sequences/tools-check-sd.txt | 6 +++ simulator/sequences/tools-datum-tool.txt | 17 +++--- src/krux/pages/device_tests.py | 50 ++++++++++++++++++ src/krux/pages/tools.py | 49 ----------------- tests/pages/test_device_tests.py | 43 +++++++++++++++ tests/pages/test_tools.py | 41 -------------- 22 files changed, 141 insertions(+), 126 deletions(-) create mode 100644 simulator/sequences/qrcodes/datum-example-qr.png diff --git a/docs/getting-started/features/encryption/encryption.en.md b/docs/getting-started/features/encryption/encryption.en.md index 6c41bcf7d..d29345392 100644 --- a/docs/getting-started/features/encryption/encryption.en.md +++ b/docs/getting-started/features/encryption/encryption.en.md @@ -48,11 +48,11 @@ Modes ECB, CBC, and GCM use an Initialization Vector (IV), where IV is better te ## Key Stretching (PBKDF2 Iterations) -When you enter the encryption key, it is not directly used to encrypt your data. In order to protect against brute force attacks, the user supplied key is derived multiple times -- stretched to 256 bits via `pbkdf2_hmac_sha256`. PBKDF2 (Password-Based Key Derivation Function) Iterations refer to the number of derivations that will be performed over your key -- as the `password` -- `salted` with an ID, prior to encrypting/decrypting your secret. Users may set a preferred `PBKDF2 Iterations` value in `Encryption Settings`, then Krux will propose a slightly different value -- within a 10% delta, whenever encrypting. +When you enter the encryption key, it is not directly used to encrypt your data. In order to protect against brute force attacks, the user supplied key is derived multiple times - stretched to 256 bits via `pbkdf2_hmac_sha256`. PBKDF2 (Password-Based Key Derivation Function) Iterations refer to the number of derivations that will be performed over your key - as the `password` - `salted` with an ID, prior to encrypting/decrypting your secret. Users may set a preferred `PBKDF2 Iterations` value in `Encryption Settings`, then Krux will propose a slightly different value - within a 10% delta, whenever encrypting. ## KEF Encryption Format -When Krux encrypts a secret, the result is a `KEF Envelope` -- which is a series of bytes. Each envelope is constructed similarly, containing fixed-length and variable-length fields representing: a custom `ID` for the envelope, a `Version`, number of PBKDF2 `Iterations`, and a `Cipher PayLoad`, so that any devices or software supporting KEF may recognize the envelope and know how to decrypt it -- given the correct `key`. These fields, within each KEF envelope are: +When Krux encrypts a secret, the result is a `KEF Envelope` - which is a series of bytes. Each envelope is constructed similarly, containing fixed-length and variable-length fields representing: a custom `ID` for the envelope, a `Version`, number of PBKDF2 `Iterations`, and a `Cipher PayLoad`, so that any devices or software supporting KEF may recognize the envelope and know how to decrypt it - given the correct `key`. These fields, within each KEF envelope are: | ID length (1) | ID (2) | Version (3) | Key Derivations (4) | Cipher PayLoad (5, 6, and 7) | | :---: | :---: | :---: | :---: | :---: | @@ -69,7 +69,7 @@ When Krux encrypts a secret, the result is a `KEF Envelope` -- which is a series * **(7)** Authentication/validation data (3, 4, or 16 bytes). ### Version Details -While all KEF envelopes share the above format, each version differs -- offering choices to the user, as trade-offs that may better fit a particular use-case. For technical details, see: [KEF specifications](kef-specifications.md) +While all KEF envelopes share the above format, each version differs - offering choices to the user, as trade-offs that may better fit a particular use-case. For technical details, see: [KEF specifications](kef-specifications.md) | Version | Name | Mode | IV | Compressed | Intended Use Case | |---------|------------|------|----|------------|----------------------------------------| diff --git a/docs/getting-started/features/encryption/kef-specifications.en.md b/docs/getting-started/features/encryption/kef-specifications.en.md index d68d77cda..f06b030ed 100644 --- a/docs/getting-started/features/encryption/kef-specifications.en.md +++ b/docs/getting-started/features/encryption/kef-specifications.en.md @@ -1,17 +1,17 @@ -# KEF Encryption Format -- Technical Specification +# KEF Encryption Format - Technical Specification -...`The K stands for "KEF"` --anon +...`The K stands for "KEF"` -anon ## Motivation In the autumn of 2023, during the lead-up to **krux release 23.09.0**, contributors proposed a method of encrypting bip39 mnemonics that could be stored in SPI-flash, on sdcard, and/or exported to QR. Regarding the encrypted-mnemonic QR format: the layout proposed was interesting as an extensible, lite-weight, self-describing envelope that has been appreciated by users ever since. -...`"Wen passphrases, output descriptors, PSBTs, and notes?"` --plebs +...`"Wen passphrases, output descriptors, PSBTs, and notes?"` -plebs This specification, and its accompanying implementation and test-suite are the result of months of exploration into improvements meant to better define, test, and extend the original encryption format that we'll refer to as KEF. It proposes ten new versions, extending its usefulness to more than mnemonics, targeting variable-length strings up to moderately sized PSBTs, flexibility to choose among four AES modes of operation, with-or-without compression, and versions optimized to result in a smaller envelope. -Above all, this specification aims to be supported by as many projects as would consider adopting it, so that users are not "locked" into a particular project when recovering their secrets. Corrections and refinement to, and scrutiny of this specification are appreciated. Proposals for more `versions` are welcome, provided they offer "value" to the user and fit within the scope of this system. Once released, because it cannot be known how many KEF envelopes may exist in-the-wild, changes to any particular version must remain backwards compatible for decryption. Adopting implementations are free to support any KEF versions they wish to support, for decryption-only or for both encryption and decryption -- with the expectation that claims-of-support made are clear and precise about what is supported. +Above all, this specification aims to be supported by as many projects as would consider adopting it, so that users are not "locked" into a particular project when recovering their secrets. Corrections and refinement to, and scrutiny of this specification are appreciated. Proposals for more `versions` are welcome, provided they offer "value" to the user and fit within the scope of this system. Once released, because it cannot be known how many KEF envelopes may exist in-the-wild, changes to any particular version must remain backwards compatible for decryption. Adopting implementations are free to support any KEF versions they wish to support, for decryption-only or for both encryption and decryption - with the expectation that claims-of-support made are clear and precise about what is supported. ## Overview @@ -56,21 +56,21 @@ Authentication has three forms: ## Generalizations Regarding Implementation -It is expected that any implementation can decrypt a KEF envelope that was created by itself on the same device. Implementations are asked to make their "best-effort" to be capable of decrypting KEF envelopes for versions they support which were created by other implementations or on other devices -- but this will not always be possible. Decrypting large KEF envelopes on severely constrained devices, or ones created with flawed implementations is unrealistic. Therefore, in such cases it is the responsibility of the user to find an implementation and device capable of decrypting their KEF envelope, or to have a non-KEF form of recovery. +It is expected that any implementation can decrypt a KEF envelope that was created by itself on the same device. Implementations are asked to make their "best-effort" to be capable of decrypting KEF envelopes for versions they support which were created by other implementations or on other devices - but this will not always be possible. Decrypting large KEF envelopes on severely constrained devices, or ones created with flawed implementations is unrealistic. Therefore, in such cases it is the responsibility of the user to find an implementation and device capable of decrypting their KEF envelope, or to have a non-KEF form of recovery. -* Be strict while encrypting. Be tolerant -- and non-specific about errors, when decrypting. +* Be strict while encrypting. Be tolerant - and non-specific about errors, when decrypting. -* At its base, **a KEF envelope is a format of bytes -- so are all of its inputs**. Remember this when converting strings gathered for the `key` and `id`. Consider being strict about offering a reasonably minimal set of characters, common and available on other devices and/or international keyboards when encrypting -- then encode unicode codepoints (if not ascii) directly to their utf-8 representations without normalization. For decryption, more characters could be offered when gathering the `key`, and multiple normalization strategies may be tried, so that secrets may be recovered. Consider some capability of displaying both `key` and `id` as bytes, and gathering the `key` as bytes either directly or via hex/base64 conversion if necessary, to enable recovery. Do NOT assume that a user originally used a particular implementation to encrypt a KEF envelope. +* At its base, **a KEF envelope is a format of bytes - so are all of its inputs**. Remember this when converting strings gathered for the `key` and `id`. Consider being strict about offering a reasonably minimal set of characters, common and available on other devices and/or international keyboards when encrypting - then encode unicode codepoints (if not ascii) directly to their utf-8 representations without normalization. For decryption, more characters could be offered when gathering the `key`, and multiple normalization strategies may be tried, so that secrets may be recovered. Consider some capability of displaying both `key` and `id` as bytes, and gathering the `key` as bytes either directly or via hex/base64 conversion if necessary, to enable recovery. Do NOT assume that a user originally used a particular implementation to encrypt a KEF envelope. * **On the importance of a STRONG user-supplied `key`** This cannot be stressed enough to each user of KEF. While KEF allows for key-stretching via `id` and `iterations`, and offers modes that require a random `IV` / Nonce, **KEF offers no expectation of security for a weak user-supplied `key`**. Consider making this point clear to users before encrypting and/or offer an indication of `key` strength once gathered. If a KEF envelope has been created with a "weak" `key` and stored accessible to others, user should assume that their secret has been leaked. Consider encouraging users to make sane choices about the characters they use in their `key`, aware that non-ascii characters offered by one implementation may not be easy to enter on another, or that a recognizable glyph may not exist on other devices for them to verify their `key` when decrypting. * **On security** Not all KEF `versions` offer the same security guarantees, so implementors MUST take care to protect against "unsafe" usage. As already mentioned: be strict and fail to encrypt when "unsafe"; be tolerant and vague while decrypting. Support for decrypt-only on a particular version is perfectly valid should an implementation choose to "nudge" users towards a more-secure version where it supports full encrypt/decrypt functionality. - * **On mode ECB**: Repeated blocks would leak patterns within ciphertext. Therefore, be strict -- refuse to encrypt using mode ECB whenever duplicate blocks are detected. Consider a compressed version which may resolve this. + * **On mode ECB**: Repeated blocks would leak patterns within ciphertext. Therefore, be strict - refuse to encrypt using mode ECB whenever duplicate blocks are detected. Consider a compressed version which may resolve this. * **On block modes with NUL padding** Problems to unpad can arise decrypting where valid NUL bytes are confused with removable padding. - * If `auth` is appended to plaintext before padding AND the `auth` bytes end in 0x00: be strict -- refuse to encrypt. Consider a version with safe padding. - * If `auth` is appended to ciphertext after padding/encryption AND the `plaintext` bytes end in 0x00: be strict -- refuse to encrypt. Consider a version with safe padding. + * If `auth` is appended to plaintext before padding AND the `auth` bytes end in 0x00: be strict - refuse to encrypt. Consider a version with safe padding. + * If `auth` is appended to ciphertext after padding/encryption AND the `plaintext` bytes end in 0x00: be strict - refuse to encrypt. Consider a version with safe padding. * Do not assume that other implementations adhere to the above. Be tolerant and make reasonable efforts to successfully recover secrets when decrypting. Offering a warning to users AFTER successful decryption in this case may be appropriate. * **On modes that require IV or Nonce** Take precautions to ensure that this value is random and not reused. ie: Natural entropy captured from camera sensor (user validated and/or analyzed to ensure sensor is working / high entropy). @@ -82,7 +82,7 @@ It is expected that any implementation can decrypt a KEF envelope that was creat 4. if parsing succeeds without errors, it is likely to be a KEF envelope and a decryption user-interface should be offered to the user. While the user likely knows, the process instance of a KEF implementation will learn definitively, only AFTER a successful decryption, that a bytestring was indeed a KEF envelope. If at any point along this process, an implementation finds that `version` is unknown/disabled, or if parsing fails, the expected action is NOT TO RAISE SPECIFIC ERRORS regarding this inspection. Rather, the appropriate action is to assume it was not a KEF envelope and to treat the data under another context: ie: "Unknown". Similarly, as mentioned above, being vague about errors during decryption implies that "Failed!" may be a sufficient response for any error, instead of leaking to a potential attacker specific details about the failure. -* **On Iterations** Consider that users may want to decrypt KEF envelopes on various resource-constrained devices. There is a minimum 10,000 iterations imposed in any KEF envelope (a value of 1 would be 10,000 pbkdf2_hmac iterations), and the maximum could be as high as 100,000,000 (a value of 10,000), but depending on the device used, 500,000 might be too high. Also, since the user-supplied `key` is stretched by this value, consider offering a range to users -- then adding a small `delta` as extra bits of entropy to derive different AES-256 keys that would otherwise be the same in the event the user re-uses the same `key`, `id` and `iterations` when creating many KEF envelopes. +* **On Iterations** Consider that users may want to decrypt KEF envelopes on various resource-constrained devices. There is a minimum 10,000 iterations imposed in any KEF envelope (a value of 1 would be 10,000 pbkdf2_hmac iterations), and the maximum could be as high as 100,000,000 (a value of 10,000), but depending on the device used, 500,000 might be too high. Also, since the user-supplied `key` is stretched by this value, consider offering a range to users - then adding a small `delta` as extra bits of entropy to derive different AES-256 keys that would otherwise be the same in the event the user re-uses the same `key`, `id` and `iterations` when creating many KEF envelopes. * **On truncated Authentication** At first glance it may be concerning that `auth` bytes for many versions have been truncated and are trivially "weak". Note that KEF's use-case for authentication is to validate that the user has correctly entered their decryption `key`. In the worse case, "false-authenticated" success will occur at a rate of 1:16M (or 1:4B for others) if using an incorrect decryption `key`; similar if an attacker has modified the KEF envelope. In these "false-authenticated" success cases, data will result from decryption, but that data will NOT be the original secret or plaintext; it will be of no value. @@ -237,7 +237,7 @@ k: pbkdf2_hmac_sha256(K, id, i) * **Authentication**: First 4 bytes of `SHA256(plaintext)`, hidden * **cpl layout**: `[ciphertext]` (auth embedded after compression, before padding/encryption) * **Use Case**: Mid-sized variable length plaintext -* **Security Note**: like others, when encrypting: fail "unsafe" if duplicate blocks -- unlikely with compression +* **Security Note**: like others, when encrypting: fail "unsafe" if duplicate blocks - unlikely with compression --- @@ -446,13 +446,13 @@ k: pbkdf2_hmac_sha256(K, id, i) Using examples from, and as an introduction to the reference [KEF implementation](https://github.com/selfcustody/krux/blob/develop/src/krux/kef.py), we'll quickly cover some basic concepts that may be helpful in getting started with your own KEF implementation. ### Version Configuration -From the version details and summary table: note that all KEF versions can be defined as having a set of parameters which define that version's KEF rules. For ease-of-maintenance -- and also for extending later, it may be useful to store these in a central configuration. Within our sample reference, these are defined by constants `kef.VERSIONS`, `kef.MODE_NUMBERS` and `kef.MODE_IVS`. +From the version details and summary table: note that all KEF versions can be defined as having a set of parameters which define that version's KEF rules. For ease-of-maintenance - and also for extending later, it may be useful to store these in a central configuration. Within our sample reference, these are defined by constants `kef.VERSIONS`, `kef.MODE_NUMBERS` and `kef.MODE_IVS`. ### Choosing a Version As soon as you have data to hide, KEF offers choices for which version to use. That choice may be made by the user, or by the implementation, based on what is being hidden, compatibility with others, and how it may be stored/transported. The sample reference uses a function named `kef.suggest_versions()` to make a choice based on user's preferred mode-of-operation, the plaintext being hidden, then optimizes for a smaller KEF envelope. ### Encryption, Decryption, and Authentication -Once you know what you need to hide and how you want to hide it, you'll need something to perform the encryption. You'll start by stretching the user-supplied `key`, salted with `id` for a number of `iterations` to **derive** the 256-bit AES key. Next you'll need to **encrypt** the plaintext (possibly with a random `IV` / Nonce) according to the chosen KEF version, so that the result is a cipher-payload `cpl`. To reverse this process, you'll need something to **decrypt** and **authenticate** the cipher-payload `cpl` -- again according to the rules of the particular KEF version. The sample reference uses a class named `kef.Cipher` for stretching the `key`, encrypting plaintext to `cpl`, and decrypting / authenticating `cpl` back into plaintext. +Once you know what you need to hide and how you want to hide it, you'll need something to perform the encryption. You'll start by stretching the user-supplied `key`, salted with `id` for a number of `iterations` to **derive** the 256-bit AES key. Next you'll need to **encrypt** the plaintext (possibly with a random `IV` / Nonce) according to the chosen KEF version, so that the result is a cipher-payload `cpl`. To reverse this process, you'll need something to **decrypt** and **authenticate** the cipher-payload `cpl` - again according to the rules of the particular KEF version. The sample reference uses a class named `kef.Cipher` for stretching the `key`, encrypting plaintext to `cpl`, and decrypting / authenticating `cpl` back into plaintext. ### Padding and Unpadding Depending on the mode-of-operation of your version, you may need to **pad** the plaintext. If so, there will also be a need to **unpad** during the decryption process. The sample reference uses functions named `kef.pad()` and `kef.unpad()`, which are called from inside the `kef.Cipher` object when encrypting and decrypting. diff --git a/docs/getting-started/features/tools.en.md b/docs/getting-started/features/tools.en.md index dfda41b42..f3483dd1d 100644 --- a/docs/getting-started/features/tools.en.md +++ b/docs/getting-started/features/tools.en.md @@ -3,16 +3,6 @@ Here are some useful tools that are available as soon as Krux starts! These are -### Check SD Card - - - -Verify whether your device detects and reads the SD card, and browse its contents. Files can be deleted individually. If there are more files than can fit on a single screen, swipe up :material-gesture-swipe-up: or down :material-gesture-swipe-down: to navigate between the screens - if your device has a touchscreen. - -The SD card is optional, but can be used for firmware upgrades and for storing settings, encrypted mnemonics, XPUBs, QR codes, and CNC/files. It is also useful for saving and loading PSBTs, wallet output descriptors, and messages. - -
- ### Datum Tool @@ -24,7 +14,7 @@ Datum Tool is an advanced, educational feature that treats all input as a simple -Once datum has been loaded, it offers meta information about the contents and ability to View Datum -- whether text or binary. It also offers a menu to Convert Datum, Export to QR, and Export to SD. +Once datum has been loaded, it offers meta information about the contents and ability to View Datum - whether text or binary. It also offers a menu to Convert Datum, Export to QR, and Export to SD.
@@ -43,6 +33,16 @@ Simple tests to verify correct functioning of your Krux device.
+#### Check SD Card + + + +Verify whether your device detects and reads the SD card, and browse its contents. Files can be deleted individually. If there are more files than can fit on a single screen, swipe up :material-gesture-swipe-up: or down :material-gesture-swipe-down: to navigate between the screens - if your device has a touchscreen. + +The SD card is optional, but can be used for firmware upgrades and for storing settings, encrypted mnemonics, XPUBs, QR codes, and CNC/files. It is also useful for saving and loading PSBTs, wallet output descriptors, and messages. + +
+ #### Print Test QR diff --git a/docs/getting-started/usage/navigating-the-main-menu.en.md b/docs/getting-started/usage/navigating-the-main-menu.en.md index de2f62687..6dc1b6063 100644 --- a/docs/getting-started/usage/navigating-the-main-menu.en.md +++ b/docs/getting-started/usage/navigating-the-main-menu.en.md @@ -197,7 +197,7 @@ Bitcoin *BIP85* (aka Deterministic Entropy From BIP32 Keychains) allows for the
-**BIP39 Mnemonic** +##### BIP39 Mnemonic @@ -208,7 +208,7 @@ Choose between *12 or 24 words*, then type the desired *index* to export a *chil **Notice**: Any passphrase from the parent mnemonic will be removed when loading a BIP85 *child mnemonic*. -**Base64 Password** +##### Base64 Password diff --git a/docs/img/maixpy_amigo/device-tests-options-300.en.png b/docs/img/maixpy_amigo/device-tests-options-300.en.png index 448569c143830e6539b862ac199b57070cd10b5f..ddc355a57f0eae6895ad799032fc905abd9da364 100644 GIT binary patch literal 58264 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 literal 56035 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∾>(}1@jiU|XPXf=x6VwlM*G(uKT1Z9n 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 KMNUMnLSTZ|#}wxP diff --git a/docs/img/maixpy_amigo/tools-datum-tool-convert-300.en.png b/docs/img/maixpy_amigo/tools-datum-tool-convert-300.en.png index dcce4467f11b5455d18d6f66213123187fdf34d2..997cd99923cf9619087f2fd39ec49623fb005240 100644 GIT binary patch literal 73228 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 Wv-1;&QgrnI0000 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

uDE%!R&hpt-`^e!Jndf15s8i%Z{CWs?M+k$ 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

aFn;y?`tFO^s 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 LNkvXXu0mjfUru@P diff --git a/docs/img/maixpy_amigo/tools-datum-tool-load-300.en.png b/docs/img/maixpy_amigo/tools-datum-tool-load-300.en.png index 5a43de6cbb65a3e085957434b2642ab2048de652..adaf2d74f920424648e7f8ac171f9ba33728b4a5 100644 GIT binary patch literal 56700 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 P?oEV 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