diff --git a/CHANGELOG.md b/CHANGELOG.md index 387b26141..1e9d2f955 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,9 @@ Krux now displays a warning instead of blocking QR-encoded passphrases that cont ### Easier to Scan UR QR Codes Exported Uniform Resource (UR) QR codes, a widely adopted standard for exchanging PSBTs, now use uppercase data to reduce QR density, improving scan reliability without increasing the number of frames. +### Battery Percentage Indicator +Battery level is now displayed as a percentage (configurable in settings). The on-screen value updates automatically. + ### Other Bug Fixes and Improvements - Settings: Reduced default _Buttons Debounce_ value (with an even lower default on _M5StickV_) - Settings: Expanded value ranges for _Touch Threshold_ and _Buttons Debounce_ diff --git a/i18n/translations/de-DE.json b/i18n/translations/de-DE.json index ad6c3aebd..744d9edbe 100644 --- a/i18n/translations/de-DE.json +++ b/i18n/translations/de-DE.json @@ -31,6 +31,7 @@ "Backup Mnemonic": "Mnemonik-Backup", "Bad signature": "Ungültige Signatur", "Base64 Password": "Base64-Passwort", + "Battery": "Batterie", "Baudrate": "Baudrate", "Binary Grid": "Binäres Gitter", "Border Padding": "Randpolsterung", @@ -199,6 +200,7 @@ "Password Length": "Passwortlänge", "Path mismatch": "Pfad stimmt nicht überein", "Pattern detected!": "Muster erkannt!", + "Percentage": "Prozentsatz", "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:", diff --git a/i18n/translations/es-MX.json b/i18n/translations/es-MX.json index 9c22e7b41..5cf66520a 100644 --- a/i18n/translations/es-MX.json +++ b/i18n/translations/es-MX.json @@ -31,6 +31,7 @@ "Backup Mnemonic": "Backup del Mnemónico", "Bad signature": "Firma incorrecta", "Base64 Password": "Contraseña Base64", + "Battery": "Batería", "Baudrate": "Baudrate", "Binary Grid": "Cuadrícula binaria", "Border Padding": "Grosor del Borde", @@ -199,6 +200,7 @@ "Password Length": "Longitud", "Path mismatch": "La ruta no coincide", "Pattern detected!": "¡Patrón detectado!", + "Percentage": "Porcentaje", "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:", diff --git a/i18n/translations/fr-FR.json b/i18n/translations/fr-FR.json index 84ee289fa..3d363ba31 100644 --- a/i18n/translations/fr-FR.json +++ b/i18n/translations/fr-FR.json @@ -31,6 +31,7 @@ "Backup Mnemonic": "Sauvegarde mnémonique", "Bad signature": "Signature non valide", "Base64 Password": "Mot de passe Base64", + "Battery": "Batterie", "Baudrate": "Débit en bauds", "Binary Grid": "Grille binaire", "Border Padding": "Rembourrage de bordure", @@ -199,6 +200,7 @@ "Password Length": "Longueur du mot de passe", "Path mismatch": "Inadéquation du chemin", "Pattern detected!": "Motif détecté !", + "Percentage": "Pourcentage", "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 :", diff --git a/i18n/translations/ja-JP.json b/i18n/translations/ja-JP.json index 9986b567c..dd0c7cbe3 100644 --- a/i18n/translations/ja-JP.json +++ b/i18n/translations/ja-JP.json @@ -31,6 +31,7 @@ "Backup Mnemonic": "ニーモニックのバックアップ", "Bad signature": "無効なサイン", "Base64 Password": "Base64パスワード", + "Battery": "バッテリー", "Baudrate": "Baudrate", "Binary Grid": "バイナリグリッド", "Border Padding": "ボーダーパディング", @@ -199,6 +200,7 @@ "Password Length": "パスワードの長さ", "Path mismatch": "パスの不一致", "Pattern detected!": "パターンが検出されました!", + "Percentage": "パーセンテージ", "Permanently remove all stored encrypted mnemonics and settings from flash?": "フラッシュからすべての保存された暗号化mnemonicsと設定を永久に削除しますか?", "Persist": "永続させる", "Pixels deviation index:": "ピクセル偏差指数:", diff --git a/i18n/translations/ko-KR.json b/i18n/translations/ko-KR.json index 133998843..17fc9ab4a 100644 --- a/i18n/translations/ko-KR.json +++ b/i18n/translations/ko-KR.json @@ -31,6 +31,7 @@ "Backup Mnemonic": "니모닉 백업", "Bad signature": "잘못된 서명", "Base64 Password": "Base64 비밀번호", + "Battery": "배터리", "Baudrate": "Baudrate", "Binary Grid": "이진수 그리드", "Border Padding": "테두리 여백", @@ -199,6 +200,7 @@ "Password Length": "비밀번호 길이", "Path mismatch": "경로 불일치", "Pattern detected!": "패턴이 감지되었습니다!", + "Percentage": "백분율", "Permanently remove all stored encrypted mnemonics and settings from flash?": "저장된 모든 니모닉 및 설정값을 영구적으로 제거하시겠습니까?", "Persist": "저장", "Pixels deviation index:": "픽셀 편차 지수:", diff --git a/i18n/translations/nl-NL.json b/i18n/translations/nl-NL.json index 83c451810..b8f440aa0 100644 --- a/i18n/translations/nl-NL.json +++ b/i18n/translations/nl-NL.json @@ -31,6 +31,7 @@ "Backup Mnemonic": "Backup geheugensteun", "Bad signature": "Ongeldige handtekening", "Base64 Password": "Base64-wachtwoord", + "Battery": "Batterij", "Baudrate": "Baudratio", "Binary Grid": "Binair raster", "Border Padding": "Rand opvulling", @@ -199,6 +200,7 @@ "Password Length": "Wachtwoordlengte", "Path mismatch": "Pad komt niet overeen", "Pattern detected!": "Patroon gevonden!", + "Percentage": "Percentage", "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:", diff --git a/i18n/translations/pt-BR.json b/i18n/translations/pt-BR.json index c98b1cf8c..c773569ae 100644 --- a/i18n/translations/pt-BR.json +++ b/i18n/translations/pt-BR.json @@ -31,6 +31,7 @@ "Backup Mnemonic": "Mnemônico Backup", "Bad signature": "Assinatura inválida", "Base64 Password": "Senha em Base64", + "Battery": "Bateria", "Baudrate": "Baudrate", "Binary Grid": "Grade binária", "Border Padding": "Espaçamento da borda", @@ -199,6 +200,7 @@ "Password Length": "Comprimento da Senha", "Path mismatch": "Incompatibilidade de caminho", "Pattern detected!": "Padrão detectado!", + "Percentage": "Percentual", "Permanently remove all stored encrypted mnemonics and settings from flash?": "Remover permanentemente todos os mnemônicos criptografados e configurações armazenados na memória flash?", "Persist": "Salvar", "Pixels deviation index:": "Índice de desvio de pixels:", diff --git a/i18n/translations/ru-RU.json b/i18n/translations/ru-RU.json index 7f4ef2f73..b63dc2b5e 100644 --- a/i18n/translations/ru-RU.json +++ b/i18n/translations/ru-RU.json @@ -31,6 +31,7 @@ "Backup Mnemonic": "Резервная мнемоника", "Bad signature": "Плохая подпись", "Base64 Password": "Пароль Base64", + "Battery": "Аккумулятор", "Baudrate": "Скорость Передачи Данных", "Binary Grid": "Двоичная сетка", "Border Padding": "Заполнение Границ", @@ -199,6 +200,7 @@ "Password Length": "Длина пароля", "Path mismatch": "Несоответствие пути", "Pattern detected!": "Образец обнаружен!", + "Percentage": "Процент", "Permanently remove all stored encrypted mnemonics and settings from flash?": "Окончательно удалить все сохраненные зашифрованные мнемоники и настройки из флеш-памяти?", "Persist": "Постоянная Память", "Pixels deviation index:": "Индекс отклонения пикселей:", diff --git a/i18n/translations/tr-TR.json b/i18n/translations/tr-TR.json index 736020252..8daa0cc62 100644 --- a/i18n/translations/tr-TR.json +++ b/i18n/translations/tr-TR.json @@ -31,6 +31,7 @@ "Backup Mnemonic": "Yedek Mnemonic", "Bad signature": "Geçersiz imza", "Base64 Password": "Base64 Parola", + "Battery": "Pil", "Baudrate": "Baud Hızı", "Binary Grid": "İkili Izgara", "Border Padding": "Kenarlık Dolgusu", @@ -199,6 +200,7 @@ "Password Length": "Parola Uzunluğu", "Path mismatch": "Yol uyuşmazlığı", "Pattern detected!": "Örüntü algılandı!", + "Percentage": "Yüzde", "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:", diff --git a/i18n/translations/vi-VN.json b/i18n/translations/vi-VN.json index 35bb6f2f3..4922776c9 100644 --- a/i18n/translations/vi-VN.json +++ b/i18n/translations/vi-VN.json @@ -31,6 +31,7 @@ "Backup Mnemonic": "Sao lưu Mnemonic", "Bad signature": "Chữ ký xấu", "Base64 Password": "Mật khẩu Base64", + "Battery": "Pin", "Baudrate": "Tốc độ baud", "Binary Grid": "Lưới nhị phân", "Border Padding": "Đệm viền", @@ -199,6 +200,7 @@ "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!", + "Percentage": "Phần trăm", "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:", diff --git a/i18n/translations/zh-CN.json b/i18n/translations/zh-CN.json index b803a2df6..453ec8b5e 100644 --- a/i18n/translations/zh-CN.json +++ b/i18n/translations/zh-CN.json @@ -31,6 +31,7 @@ "Backup Mnemonic": "备份助记词", "Bad signature": "签名无效", "Base64 Password": "Base64密码", + "Battery": "电池", "Baudrate": "波特率", "Binary Grid": "二进制网格", "Border Padding": "边框填充", @@ -199,6 +200,7 @@ "Password Length": "密码长度:", "Path mismatch": "路径不匹配", "Pattern detected!": "检测到模式!", + "Percentage": "百分比", "Permanently remove all stored encrypted mnemonics and settings from flash?": "从 Flash 中永久删除所有存储的加密助记词和设置?", "Persist": "保存", "Pixels deviation index:": "像素偏差指数:", diff --git a/src/krux/input.py b/src/krux/input.py index 0eb076203..7f408a4f1 100644 --- a/src/krux/input.py +++ b/src/krux/input.py @@ -50,6 +50,7 @@ BUTTON_WAIT_PRESS_DELAY = 10 ONE_MINUTE = 60000 +UPDATE_CALLBACK_DELAY = 5000 class Input: @@ -204,7 +205,9 @@ def wdt_feed_inc_entropy(self): self.entropy += 1 wdt.feed() - def _wait_for_press(self, block=True, wait_duration=QR_ANIM_PERIOD): + def _wait_for_press( + self, block=True, wait_duration=QR_ANIM_PERIOD, update_callback=None + ): """ Wait for first button press or for wait_duration ms. Use block to wait indefinitely @@ -226,6 +229,7 @@ def _wait_for_press(self, block=True, wait_duration=QR_ANIM_PERIOD): self.flush_events() self.flushed_flag = not block + update_time = time.ticks_ms() - UPDATE_CALLBACK_DELAY while True: if self.enter_event(): return BUTTON_ENTER @@ -243,6 +247,13 @@ def _wait_for_press(self, block=True, wait_duration=QR_ANIM_PERIOD): if not block and time.ticks_ms() > start_time + wait_duration: return None + if ( + update_callback is not None + and time.ticks_ms() > update_time + UPDATE_CALLBACK_DELAY + ): + update_time = time.ticks_ms() + update_callback() + time.sleep_ms(BUTTON_WAIT_PRESS_DELAY) def wait_for_release(self): @@ -327,19 +338,23 @@ def _handle_touch_input(): return btn - def wait_for_button(self, block=True, wait_duration=QR_ANIM_PERIOD): + def wait_for_button( + self, block=True, wait_duration=QR_ANIM_PERIOD, update_callback=None + ): """Waits for any button to release, optionally blocking if block=True. Returns the button that was released, or None if non blocking. """ self.wait_for_release() - btn = self._wait_for_press(block, wait_duration) + btn = self._wait_for_press(block, wait_duration, update_callback) if btn is not None: auto_shutdown.feed() btn = self._detect_press_type(btn) self.debounce_time = time.ticks_ms() return btn - def wait_for_fastnav_button(self, block=True, wait_duration=QR_ANIM_PERIOD): + def wait_for_fastnav_button( + self, block=True, wait_duration=QR_ANIM_PERIOD, update_callback=None + ): """Wait for a button press, with support for fast navigation.""" if self.page_value() == PRESSED: time.sleep_ms(KEY_REPEAT_DELAY_MS) @@ -349,7 +364,7 @@ def wait_for_fastnav_button(self, block=True, wait_duration=QR_ANIM_PERIOD): if kboard.is_yahboom: return FAST_FORWARD return FAST_BACKWARD - return self.wait_for_button(block, wait_duration) + return self.wait_for_button(block, wait_duration, update_callback) def flush_events(self): """Clean eventual event flags unintentionally collected""" diff --git a/src/krux/krux_settings.py b/src/krux/krux_settings.py index c78150501..ae886f8b6 100644 --- a/src/krux/krux_settings.py +++ b/src/krux/krux_settings.py @@ -310,6 +310,19 @@ def label(self, attr): }[attr] +class BatterySettings(SettingsNamespace): + """Battery display settings""" + + namespace = "settings.battery" + percentage = CategorySetting("percentage", True, [False, True]) + + def label(self, attr): + """Returns a label for UI when given a setting name or namespace""" + return { + "percentage": t("Percentage"), + }[attr] + + class TouchSettings(SettingsNamespace): """Touch sensitivity settings""" @@ -376,6 +389,8 @@ class HardwareSettings(SettingsNamespace): def __init__(self): self.printer = PrinterSettings() self.buttons = ButtonsSettings() + if kboard.has_battery: + self.battery = BatterySettings() if board.config["krux"]["display"].get("touch", False): self.touch = TouchSettings() if kboard.is_amigo: @@ -390,6 +405,8 @@ def label(self, attr): "printer": t("Printer"), } hardware_menu["buttons"] = t("Buttons") + if kboard.has_battery: + hardware_menu["battery"] = t("Battery") if board.config["krux"]["display"].get("touch", False): hardware_menu["touchscreen"] = t("Touchscreen") if kboard.is_amigo: diff --git a/src/krux/pages/__init__.py b/src/krux/pages/__init__.py index 5e954c093..382e8b858 100644 --- a/src/krux/pages/__init__.py +++ b/src/krux/pages/__init__.py @@ -22,7 +22,6 @@ import gc import time import lcd -import _thread from ..context import Context from .keypads import Keypad from ..themes import theme, WHITE, GREEN, DARKGREY @@ -44,6 +43,7 @@ MINIMAL_PADDING, FLASH_MSG_TIME, FONT_HEIGHT, + FONT_WIDTH, STATUS_BAR_HEIGHT, BOTTOM_LINE, ) @@ -727,6 +727,11 @@ def run_loop(self, start_from_index=None, swipe_up_fnc=None, swipe_down_fnc=None if start_from_index is not None: start_from_submenu = True selected_item_index = start_from_index + battery_update_fnc = ( + self.draw_battery_indicator + if kboard.has_battery and not self.disable_statusbar + else None + ) while True: gc.collect() if self.menu_offset > STATUS_BAR_HEIGHT: @@ -757,6 +762,7 @@ def run_loop(self, start_from_index=None, swipe_up_fnc=None, swipe_down_fnc=None # Block if screen saver not active screensaver_time == 0, screensaver_time * ONE_MINUTE, + update_callback=battery_update_fnc, ) if kboard.has_touchscreen: if btn == BUTTON_TOUCH: @@ -812,8 +818,6 @@ def draw_status_bar(self): ) self.draw_network_indicator() self.draw_wallet_indicator() - if kboard.has_battery: - _thread.start_new_thread(self.draw_battery_indicator, ()) # self.draw_ram_indicator() @@ -863,24 +867,44 @@ def draw_battery_indicator(self): width = self.ctx.display.width() x_padding = FONT_HEIGHT // 3 y_padding = (STATUS_BAR_HEIGHT // 2) - (BATTERY_HEIGHT // 2) - self.ctx.display.outline( - width - x_padding - BATTERY_WIDTH, - y_padding, - BATTERY_WIDTH, - BATTERY_HEIGHT, - battery_color, - ) - self.ctx.display.fill_rectangle( - width - x_padding + 1, y_padding + 2, 2, BATTERY_HEIGHT - 3, battery_color - ) - charge_length = int((BATTERY_WIDTH - 3) * charge) - self.ctx.display.fill_rectangle( - width - x_padding - BATTERY_WIDTH + 2, - y_padding + 2, - charge_length, - BATTERY_HEIGHT - 3, - battery_color, - ) + if not Settings().hardware.battery.percentage: + self.ctx.display.outline( + width - x_padding - BATTERY_WIDTH, + y_padding, + BATTERY_WIDTH, + BATTERY_HEIGHT, + battery_color, + ) + self.ctx.display.fill_rectangle( + width - x_padding + 1, + y_padding + 2, + 2, + BATTERY_HEIGHT - 3, + battery_color, + ) + charge_length = int((BATTERY_WIDTH - 3) * charge) + self.ctx.display.fill_rectangle( + width - x_padding - BATTERY_WIDTH + 2, + y_padding + 2, + charge_length, + BATTERY_HEIGHT - 3, + battery_color, + ) + else: + charge = min(5 * round(int(charge * 100) / 5), 95) + x_padding = self.ctx.display.width() - (3 * FONT_WIDTH) + x_padding = ( + x_padding - 1 + if kboard.has_minimal_display + else x_padding - MINIMAL_PADDING + ) + self.ctx.display.draw_string( + x_padding, + STATUS_BAR_HEIGHT - FONT_HEIGHT - 1, + "{:>3}".format(str(charge) + "%"), + battery_color, + theme.info_bg_color, + ) def draw_wallet_indicator(self): """Draws wallet fingerprint or BIP85 child at top if wallet is loaded""" diff --git a/src/krux/translations/__init__.py b/src/krux/translations/__init__.py index fffc9af5f..1914dd654 100644 --- a/src/krux/translations/__init__.py +++ b/src/krux/translations/__init__.py @@ -65,6 +65,7 @@ 2756316330, 2256777600, 2568189522, + 529780018, 3937333362, 2046615409, 928727036, @@ -233,6 +234,7 @@ 433951968, 3745269737, 500286397, + 3696641006, 3040011773, 140802882, 2578106186, diff --git a/src/krux/translations/de.py b/src/krux/translations/de.py index de8ed8f28..55d7ec056 100644 --- a/src/krux/translations/de.py +++ b/src/krux/translations/de.py @@ -53,6 +53,7 @@ "Mnemonik-Backup", "Ungültige Signatur", "Base64-Passwort", + "Batterie", "Baudrate", "Binäres Gitter", "Randpolsterung", @@ -221,6 +222,7 @@ "Passwortlänge", "Pfad stimmt nicht überein", "Muster erkannt!", + "Prozentsatz", "Alle gespeicherten verschlüsselten Mnemoniken und Einstellungen dauerhaft vom Flash-Speicher entfernen?", "Speicher", "Pixelabweichungsindex:", diff --git a/src/krux/translations/es.py b/src/krux/translations/es.py index 99c7e042b..3cce7551e 100644 --- a/src/krux/translations/es.py +++ b/src/krux/translations/es.py @@ -53,6 +53,7 @@ "Backup del Mnemónico", "Firma incorrecta", "Contraseña Base64", + "Batería", "Baudrate", "Cuadrícula binaria", "Grosor del Borde", @@ -221,6 +222,7 @@ "Longitud", "La ruta no coincide", "¡Patrón detectado!", + "Porcentaje", "¿Eliminar permanentemente todos los mnemónicos y configuraciones cifradas almacenadas del flash?", "Guardar", "Índice de desviación de píxeles:", diff --git a/src/krux/translations/fr.py b/src/krux/translations/fr.py index 171e09fa8..4a946d6c0 100644 --- a/src/krux/translations/fr.py +++ b/src/krux/translations/fr.py @@ -53,6 +53,7 @@ "Sauvegarde mnémonique", "Signature non valide", "Mot de passe Base64", + "Batterie", "Débit en bauds", "Grille binaire", "Rembourrage de bordure", @@ -221,6 +222,7 @@ "Longueur du mot de passe", "Inadéquation du chemin", "Motif détecté\u2009!", + "Pourcentage", "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:", diff --git a/src/krux/translations/ja.py b/src/krux/translations/ja.py index f6e79046e..518a22df1 100644 --- a/src/krux/translations/ja.py +++ b/src/krux/translations/ja.py @@ -53,6 +53,7 @@ "ニーモニックのバックアップ", "無効なサイン", "Base64パスワード", + "バッテリー", "Baudrate", "バイナリグリッド", "ボーダーパディング", @@ -221,6 +222,7 @@ "パスワードの長さ", "パスの不一致", "パターンが検出されました!", + "パーセンテージ", "フラッシュからすべての保存された暗号化mnemonicsと設定を永久に削除しますか?", "永続させる", "ピクセル偏差指数:", diff --git a/src/krux/translations/ko.py b/src/krux/translations/ko.py index b4f44d73c..deffece02 100644 --- a/src/krux/translations/ko.py +++ b/src/krux/translations/ko.py @@ -53,6 +53,7 @@ "니모닉 백업", "잘못된 서명", "Base64 비밀번호", + "배터리", "Baudrate", "이진수 그리드", "테두리 여백", @@ -221,6 +222,7 @@ "비밀번호 길이", "경로 불일치", "패턴이 감지되었습니다!", + "백분율", "저장된 모든 니모닉 및 설정값을 영구적으로 제거하시겠습니까?", "저장", "픽셀 편차 지수:", diff --git a/src/krux/translations/nl.py b/src/krux/translations/nl.py index 2869e8126..d7bc656d5 100644 --- a/src/krux/translations/nl.py +++ b/src/krux/translations/nl.py @@ -53,6 +53,7 @@ "Backup geheugensteun", "Ongeldige handtekening", "Base64-wachtwoord", + "Batterij", "Baudratio", "Binair raster", "Rand opvulling", @@ -221,6 +222,7 @@ "Wachtwoordlengte", "Pad komt niet overeen", "Patroon gevonden!", + "Percentage", "Alle opgeslagen versleutelde mnemonics en instellingen permanent uit het flashgeheugen verwijderen?", "Opslag", "Pixelafwijkingsindex:", diff --git a/src/krux/translations/pt.py b/src/krux/translations/pt.py index ed6f183f8..791b2aa48 100644 --- a/src/krux/translations/pt.py +++ b/src/krux/translations/pt.py @@ -53,6 +53,7 @@ "Mnemônico Backup", "Assinatura inválida", "Senha em Base64", + "Bateria", "Baudrate", "Grade binária", "Espaçamento da borda", @@ -221,6 +222,7 @@ "Comprimento da Senha", "Incompatibilidade de caminho", "Padrão detectado!", + "Percentual", "Remover permanentemente todos os mnemônicos criptografados e configurações armazenados na memória flash?", "Salvar", "Índice de desvio de pixels:", diff --git a/src/krux/translations/ru.py b/src/krux/translations/ru.py index 5440ebbbb..b018a9a65 100644 --- a/src/krux/translations/ru.py +++ b/src/krux/translations/ru.py @@ -53,6 +53,7 @@ "Резервная мнемоника", "Плохая подпись", "Пароль Base64", + "Аккумулятор", "Скорость Передачи Данных", "Двоичная сетка", "Заполнение Границ", @@ -221,6 +222,7 @@ "Длина пароля", "Несоответствие пути", "Образец обнаружен!", + "Процент", "Окончательно удалить все сохраненные зашифрованные мнемоники и настройки из флеш-памяти?", "Постоянная Память", "Индекс отклонения пикселей:", diff --git a/src/krux/translations/tr.py b/src/krux/translations/tr.py index 37b187608..e6a80807f 100644 --- a/src/krux/translations/tr.py +++ b/src/krux/translations/tr.py @@ -53,6 +53,7 @@ "Yedek Mnemonic", "Geçersiz imza", "Base64 Parola", + "Pil", "Baud Hızı", "İkili Izgara", "Kenarlık Dolgusu", @@ -221,6 +222,7 @@ "Parola Uzunluğu", "Yol uyuşmazlığı", "Örüntü algılandı!", + "Yüzde", "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:", diff --git a/src/krux/translations/vi.py b/src/krux/translations/vi.py index 11d7f4256..e90154b4a 100644 --- a/src/krux/translations/vi.py +++ b/src/krux/translations/vi.py @@ -53,6 +53,7 @@ "Sao lưu Mnemonic", "Chữ ký xấu", "Mật khẩu Base64", + "Pin", "Tốc độ baud", "Lưới nhị phân", "Đệm viền", @@ -221,6 +222,7 @@ "Độ dài mật khẩu tối thiểu", "Đường dẫn không khớp", "Đã phát hiện mẫu!", + "Phần trăm", "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:", diff --git a/src/krux/translations/zh.py b/src/krux/translations/zh.py index bf187d37c..79a7c57ef 100644 --- a/src/krux/translations/zh.py +++ b/src/krux/translations/zh.py @@ -53,6 +53,7 @@ "备份助记词", "签名无效", "Base64密码", + "电池", "波特率", "二进制网格", "边框填充", @@ -221,6 +222,7 @@ "密码长度:", "路径不匹配", "检测到模式!", + "百分比", "从 Flash 中永久删除所有存储的加密助记词和设置?", "保存", "像素偏差指数:",