diff --git a/core/src/trezor/lvglui/i18n/keys.py b/core/src/trezor/lvglui/i18n/keys.py index a237e60fc..5a1263655 100644 --- a/core/src/trezor/lvglui/i18n/keys.py +++ b/core/src/trezor/lvglui/i18n/keys.py @@ -596,7 +596,7 @@ # What is Recovery Phrase? TITLE__WHAT_IS_RECOVERY_PHRASE__GUIDE = 274 # A human-readable "private key" to generate your wallet. A key to restore all -# your crypto asset. +# your crypto assets. SUBTITLE__WHAT_IS_RECOVERY_PHRASE__GUIDE = 275 # Enable PIN Protection TITLE__ENABLE_PIN_PROTECTION__GUIDE = 276 @@ -2319,4 +2319,44 @@ # When enabled, entropy from both the MCU and secure element will be combined # . Both methods meet cryptographic security standards. BUTTON__USE_MULTIPLE_SOURCES_OF_ENTROPY_DESC = 1050 +# Set Language +TITLE_SET_LANGUAGE = 1051 +# Do you want to change language to {language}? +SUBTITLE_SET_LANGUAGE = 1052 +# Set Auto-Lock +TITLE_SET_AUTO_LOCK = 1053 +# Do you want to change Auto-Lock time to {time}? +SUBTITLE_SET_AUTO_LOCK = 1054 +# Set Auto Shutdown +TITLE_SET_AUTO_SHUTDOWN = 1055 +# Do you want to change Auto-Shutdown time to {time}? +SUBTITLE_SET_AUTO_SHUTDOWN = 1056 +# Do you want to open Keyboard Haptic ? +SUBTITLE_OPEN_VIBRATION_HAPTIC = 1057 +# Do you want to close Keyboard Haptic ? +SUBTITLE_CLOSE_VIBRATION_HAPTIC = 1058 +# Do you want to switch PIN Keypad to default ? (The numbers on PIN keypad arr +# anged in sequence) +SUBTITLE_SWITCH_PIN_KEYPAD_DEFAULT = 1059 +# Do you want to switch PIN Keypad to randomized ? (The numbers on PIN keypad +# arrange randomly) +SUBTITLE_SWITCH_PIN_KEYPAD_RANDOM = 1060 +# Do you want to open USB Lock ? (Device will auto lock every time when USB pl +# ug or unplug) +SUBTITLE_OPEN_USB_LOCK = 1061 +# Do you want to close USB Lock ? (Device will remain unlocked when USB plug o +# r unplug.) +SUBTITLE_CLOSE_USB_LOCK = 1062 +# Does this match the code displayed on your App? +TITLE__BLUETOOTH_PAIR_DESC = 1063 +# Yes, they match +BUTTON__YES_THEY_MATCH = 1064 +# No, it does not +BUTTON__NO_IT_DOES_NOT = 1065 +# Make sure your device is near your OneKey Pro, then try again. +TITLE__PAIR_FAILED_DESC = 1066 +# Device Paired +TITLE__DEVICE_PAIRED = 1067 +# Please continue to complete the OneKey App Check & Update. +TITLE__ALREADY_PAIRED_DESC = 1068 # fmt: on diff --git a/core/src/trezor/lvglui/i18n/locales/de.py b/core/src/trezor/lvglui/i18n/locales/de.py index a59255e48..0d288517c 100644 --- a/core/src/trezor/lvglui/i18n/locales/de.py +++ b/core/src/trezor/lvglui/i18n/locales/de.py @@ -274,8 +274,8 @@ "Bestellt", "Einschalten/Ausschalten", "Halten Sie den Netzschalter gedrückt, um das Gerät ein- und auszuschalten.", - "Was ist Recovery Phrase?", - "Ein von Menschen lesbarer „privater Schlüssel“ zum Generieren Ihres Wallets. Ein Schlüssel zum Wiederherstellen all Ihrer Krypto-Assets.", + "Was ist Wiederherstellungsphrase?", + "Ein von Menschen lesbarer \"privater Schlüssel\" zum Generieren Ihrer Brieftasche. Ein Schlüssel zum Wiederherstellen all Ihrer Krypto-Assets.", "PIN-Schutz aktivieren", "Sicherheitsschutzmechanismus auf Systemebene, Legen Sie einen starken PIN-Code fest, um Ihre Krypto-Assets zu sichern.", "Wie Hardware Wallet funktioniert", @@ -284,7 +284,7 @@ "Die Passphrase kann als zweiter Faktor zum „zusätzlichen Wort“ der Hardware Wallet (Mnemonik + 1) betrachtet werden. Sie können mit unterschiedlichen Passphrasen auf verschiedene versteckte Wallets zugreifen.", "Brauchen Sie Hilfe?", "Haben Sie Fragen? Rufen Sie das OneKey Support Center auf, um Hilfe zu erhalten.", - "Was ist Recovery Phrase", + "Was ist Wiederherstellungsphrase", "Leitfaden", "Wert verschlüsseln", "Wert entschlüsseln", @@ -580,8 +580,8 @@ "Beenden Sie die KeyTag-Sicherung", "Rückseite ansehen", "Stellen Sie eine Verbindung zur OneKey-App her, suchen Sie die NFT, die dieser Hardware-Wallet gehört, und tippen Sie auf die Schaltfläche „Sammeln“.", - "Sie können später in \"Wallet - Check Recovery Phrase\" immer noch mit KeyTag sichern.", - "Wenn Sie eine weitere KeyTag-Sicherung erstellen möchten, können Sie die KeyTag-Dotmap in \"Wallet - Check Recovery Phrase\" anzeigen, nachdem Sie Ihre Wiederherstellungsphrase überprüft haben.", + "Sie können später in \"Brieftasche - Wiederherstellungsphrase prüfen\" immer noch mit KeyTag sichern.", + "Wenn Sie eine weitere KeyTag-Sicherung erstellen möchten, können Sie die KeyTag-Dotmap in \"Brieftasche - Wiederherstellungsphrase prüfen\" anzeigen, nachdem Sie Ihre Wiederherstellungsphrase überprüft haben.", "Geräteauthentifizierung", "Trezor-Kompatibilität deaktivieren", "Stellen Sie die Trezor-Kompatibilität wieder her", @@ -870,7 +870,7 @@ "Kandidat", "Zielnetzwerk", "Stimme entfernen", - "Hochrisiko-Operation: Diese Transaktion enthält einen Delegatecall, der es externer Software ermöglichen könnte, Ihre Wallet zu kontrollieren.", + "Hochrisiko-Operation: Diese Transaktion enthält einen Delegatecall, der es externer Software ermöglichen könnte, Ihre Brieftasche zu kontrollieren.", "Operation", "Gnosis Safe Transaktion", "Safe Tx Gas", @@ -955,7 +955,7 @@ "20-Wort-Backup-Typen", "Einzel-Share-Backup", "Multi-Share-Backup", - "Erzeugt eine einzelne 20-Wörter-Wiederherstellungsphrase oder mehrere 20-Wörter-Anteile (Wortlisten), um Ihre Wallet wiederherzustellen.", + "Erzeugt eine einzelne 20-Wörter-Wiederherstellungsphrase oder mehrere 20-Wörter-Anteile (Wortlisten), um Ihre Brieftasche wiederherzustellen.", "Anzahl der Anteile", "Schwelle", "Sie haben die Überprüfung von Anteil {num} von {total} der Wiederherstellungsphrase abgeschlossen.", @@ -1036,7 +1036,7 @@ "Legen Sie eine 4–50-stellige PIN fest, um Ihr Gerät vor unbefugtem Zugriff zu schützen.", "PIN festlegen", "Lege deine PIN fest, um deine Wallet zu entsperren. Bewahre sie sicher auf und gib sie niemals an andere weiter.", - "Richten Sie Ihre Wallet ein", + "Richten Sie Ihre Brieftasche ein", "Erstelle eine neue 12-Wörter-Wallet oder stelle eine zuvor verwendete Wallet aus der Recovery-Phrase-Sicherung wieder her. \nFür andere Längen der Recovery-Phrase oder eine Wallet mit mehreren Anteilen tippe oben rechts auf \"Mehr\", um den Typ der Recovery-Phrase auszuwählen.", "Wähle den Sicherungstyp für deine neue Wallet.", "Die Anzahl der Wörter in deiner Seed-Phrase beeinträchtigt ihre Sicherheit nicht; alle sind kryptografisch sicher.", @@ -1051,5 +1051,23 @@ "Erweiterte Optionen", "Verwenden Sie mehrere Entropiequellen", "Standardmäßig verwendet das Gerät das Secure Element, um mnemonische Phrasen zu erzeugen. Wenn aktiviert, wird Entropie sowohl vom MCU als auch vom Secure Element kombiniert. Beide Methoden erfüllen kryptografische Sicherheitsstandards.", + "Sprache festlegen", + "Möchten Sie die Sprache ändern zu {language}?", + "Automatische Sperre einstellen", + "Möchtest du die Auto-Sperrzeit auf {time} ändern?", + "Automatische Abschaltung festlegen", + "Möchten Sie die automatische Abschaltzeit auf {time} ändern?", + "Möchten Sie die Tastaturhaptik öffnen?", + "Möchtest du die Tastaturhaptik deaktivieren?", + "Möchten Sie die PIN-Tastatur auf die Standardeinstellung umstellen? (Die Zahlen auf der PIN-Tastatur sind der Reihe nach angeordnet)", + "Möchten Sie die PIN-Tastatur auf zufällige Anordnung umstellen? (Die Zahlen auf der PIN-Tastatur werden zufällig angeordnet)", + "Möchten Sie die USB-Sperre öffnen? (Das Gerät wird bei jedem Ein- oder Ausstecken eines USB-Geräts automatisch gesperrt)", + "Möchten Sie USB-Sperre schließen? (Das Gerät bleibt entsperrt, wenn USB eingesteckt oder abgezogen wird.)", + "Stimmt das mit dem Code überein, der in deiner App angezeigt wird?", + "Ja, sie stimmen überein", + "Nein, tut es nicht", + "Stellen Sie sicher, dass Ihr Gerät in der Nähe Ihres OneKey Pro ist, und versuchen Sie es dann erneut.", + "Gerät gekoppelt", + "Bitte fahre fort, um die OneKey App-Prüfung und -Aktualisierung abzuschließen.", ] # fmt: on diff --git a/core/src/trezor/lvglui/i18n/locales/en.py b/core/src/trezor/lvglui/i18n/locales/en.py index 87f365239..0798ad1c0 100644 --- a/core/src/trezor/lvglui/i18n/locales/en.py +++ b/core/src/trezor/lvglui/i18n/locales/en.py @@ -275,7 +275,7 @@ "Power On/Off", "Press and hold the power button to power on and off.", "What is Recovery Phrase?", - "A human-readable \"private key\" to generate your wallet. A key to restore all your crypto asset.", + "A human-readable \"private key\" to generate your wallet. A key to restore all your crypto assets.", "Enable PIN Protection", "System-level security protection mechanism, Set a strong PIN code to secure your crypto assets.", "How Hardware Wallet Works", @@ -1051,5 +1051,23 @@ "Advanced Options", "Use multiple sources of entropy", "By default, the device uses the secure element to generate mnemonic phrases. When enabled, entropy from both the MCU and secure element will be combined. Both methods meet cryptographic security standards.", + "Set Language", + "Do you want to change language to {language}?", + "Set Auto-Lock", + "Do you want to change Auto-Lock time to {time}?", + "Set Auto Shutdown", + "Do you want to change Auto-Shutdown time to {time}?", + "Do you want to open Keyboard Haptic ?", + "Do you want to close Keyboard Haptic ?", + "Do you want to switch PIN Keypad to default ? (The numbers on PIN keypad arranged in sequence)", + "Do you want to switch PIN Keypad to randomized ? (The numbers on PIN keypad arrange randomly)", + "Do you want to open USB Lock ? (Device will auto lock every time when USB plug or unplug)", + "Do you want to close USB Lock ? (Device will remain unlocked when USB plug or unplug.)", + "Does this match the code displayed on your App?", + "Yes, they match", + "No, it does not", + "Make sure your device is near your OneKey Pro, then try again.", + "Device Paired", + "Please continue to complete the OneKey App Check & Update.", ] # fmt: on diff --git a/core/src/trezor/lvglui/i18n/locales/es.py b/core/src/trezor/lvglui/i18n/locales/es.py index 63f4b7cf2..2e3e15225 100644 --- a/core/src/trezor/lvglui/i18n/locales/es.py +++ b/core/src/trezor/lvglui/i18n/locales/es.py @@ -1051,5 +1051,23 @@ "Opciones avanzadas", "Usa múltiples fuentes de entropía", "De forma predeterminada, el dispositivo utiliza el elemento seguro para generar frases mnemotécnicas. Cuando está habilitado, se combinará la entropía tanto del MCU como del elemento seguro. Ambos métodos cumplen con los estándares de seguridad criptográfica.", + "Configurar idioma", + "¿Quieres cambiar el idioma a {language}?", + "Configurar bloqueo automático", + "¿Quieres cambiar el tiempo de Bloqueo automático a {time}?", + "Configurar apagado automático", + "¿Deseas cambiar el tiempo de apagado automático a {time}?", + "¿Quieres activar la respuesta háptica del teclado?", + "¿Quieres desactivar la respuesta háptica del teclado?", + "¿Deseas cambiar el teclado PIN al predeterminado? (Los números en el teclado PIN están ordenados en secuencia)", + "¿Deseas cambiar el teclado PIN a aleatorio? (Los números del teclado PIN se disponen de forma aleatoria)", + "¿Quieres abrir USB Lock? (El dispositivo se bloqueará automáticamente cada vez que se conecte o desconecte un USB)", + "¿Desea cerrar USB Lock? (El dispositivo permanecerá desbloqueado cuando se conecte o desconecte el USB.)", + "¿Coincide esto con el código que se muestra en tu app?", + "Sí, coinciden", + "No, no lo hace", + "Asegúrate de que tu dispositivo esté cerca de tu OneKey Pro y vuelve a intentarlo.", + "Dispositivo emparejado", + "Por favor, continúa para completar la comprobación y actualización de OneKey App.", ] # fmt: on diff --git a/core/src/trezor/lvglui/i18n/locales/fr.py b/core/src/trezor/lvglui/i18n/locales/fr.py index c5dc064a0..2ecfc084a 100644 --- a/core/src/trezor/lvglui/i18n/locales/fr.py +++ b/core/src/trezor/lvglui/i18n/locales/fr.py @@ -1051,5 +1051,23 @@ "Options avancées", "Utiliser plusieurs sources d'entropie", "Par défaut, l'appareil utilise l'élément sécurisé pour générer des phrases mnémoniques. Lorsque cette option est activée, l'entropie du MCU et de l'élément sécurisé sera combinée. Les deux méthodes répondent aux normes de sécurité cryptographique.", + "Définir la langue", + "Voulez-vous changer la langue en {language} ?", + "Définir le verrouillage automatique", + "Voulez-vous modifier le délai de verrouillage automatique à {time} ?", + "Définir l'arrêt automatique", + "Voulez-vous modifier l'heure d'arrêt automatique à {time} ?", + "Voulez-vous ouvrir le retour haptique du clavier ?", + "Voulez-vous fermer le retour haptique du clavier ?", + "Voulez-vous rétablir le clavier PIN par défaut ? (Les chiffres du clavier PIN sont disposés en séquence)", + "Voulez-vous activer le clavier PIN aléatoire ? (Les chiffres du clavier PIN sont disposés de manière aléatoire)", + "Voulez-vous activer le verrouillage USB ? (L'appareil se verrouillera automatiquement à chaque branchement ou débranchement USB)", + "Voulez-vous fermer USB Lock ? (L'appareil restera déverrouillé lors du branchement ou du débranchement USB.)", + "Cela correspond-il au code affiché sur votre application ?", + "Oui, ils correspondent", + "Non, ce n'est pas le cas", + "Assurez-vous que votre appareil est à proximité de votre OneKey Pro, puis réessayez.", + "Appareil jumelé", + "Veuillez continuer pour terminer la vérification et la mise à jour de OneKey App.", ] # fmt: on diff --git a/core/src/trezor/lvglui/i18n/locales/it.py b/core/src/trezor/lvglui/i18n/locales/it.py index 567fc361d..dff55d2a4 100644 --- a/core/src/trezor/lvglui/i18n/locales/it.py +++ b/core/src/trezor/lvglui/i18n/locales/it.py @@ -1051,5 +1051,23 @@ "Opzioni avanzate", "Usa più fonti di entropia", "Per impostazione predefinita, il dispositivo utilizza l’elemento sicuro per generare frasi mnemoniche. Quando abilitata, l’entropia sia della MCU che dell’elemento sicuro verrà combinata. Entrambi i metodi soddisfano gli standard di sicurezza crittografica.", + "Imposta lingua", + "Vuoi cambiare lingua in {language}?", + "Imposta Blocco automatico", + "Vuoi cambiare il tempo di Blocco automatico a {time}?", + "Imposta spegnimento automatico", + "Vuoi cambiare il tempo di spegnimento automatico a {time}?", + "Vuoi attivare il feedback aptico della tastiera?", + "Vuoi disattivare il feedback aptico della tastiera?", + "Vuoi ripristinare il tastierino PIN alle impostazioni predefinite? (I numeri sul tastierino PIN sono disposti in sequenza)", + "Vuoi impostare il tastierino PIN su modalità casuale? (I numeri sul tastierino PIN sono disposti in modo casuale)", + "Vuoi aprire Blocco USB? (Il dispositivo si bloccherà automaticamente ogni volta che la USB viene collegata o scollegata)", + "Vuoi chiudere USB Lock? (Il dispositivo rimarrà sbloccato quando la USB viene collegata o scollegata.)", + "Questo corrisponde al codice visualizzato nella tua app?", + "Sì, corrispondono", + "No, non lo fa", + "Assicurati che il tuo dispositivo sia vicino al tuo OneKey Pro, quindi riprova.", + "Dispositivo associato", + "Continua per completare il controllo e l’aggiornamento di OneKey App.", ] # fmt: on diff --git a/core/src/trezor/lvglui/i18n/locales/ja.py b/core/src/trezor/lvglui/i18n/locales/ja.py index 8577ed1d4..5771c9182 100644 --- a/core/src/trezor/lvglui/i18n/locales/ja.py +++ b/core/src/trezor/lvglui/i18n/locales/ja.py @@ -9,7 +9,7 @@ "キャンセル", "確認", "強めのPINを使用して、不正な物理的アクセスからウォレットを守る。", - "PINを適切に保ち、回復フレーズとは別に保管してください。", + "PINを適切に保ち、シードフレーズとは別に保管してください。", "新たなPINを入力", "PINの再入力", "一致しない", @@ -24,16 +24,16 @@ "今回のバックアップをスキップするか?バックアップはいつでもできるが、最大一回のみとなる。", "バックアップを適切に保管し、決して他人に漏れないでください。", "次の画面でリカバリーフレーズが表示されます。知っておくべき点は次のとおりです。", - "回復フレーズをバックアップ", + "シードフレーズをバックアップ", "写真を撮ったり、デジタルコピーを作成したり、オンラインでアップロードしたりしないでください。", - "回復フレーズを紛失すると、すべての資金も失ってしまう。", + "シードフレーズを紛失すると、すべての資金も失ってしまう。", "長押しで確認", "以下の{}単語を順番に書き写してください。", "手動バックアップ", "正しい単語を選択してください。", "次へ", "単語チェック#{}", - "回復フレーズの検証が完了した。", + "シードフレーズの検証が完了した。", "確認済み", "バックアップ完了", "ウォレットを回復する必要がある場合は、バックアップを使用してください。", @@ -41,29 +41,29 @@ "PIN保護を有効にするか?", "ラベル変更", "ラベルを\"{}\"に変更するか?", - "回復フレーズをインポートして、既存のウォレットを回復する。", + "シードフレーズをインポートして、既存のウォレットを回復する。", "単語数を選択する", "一旦停止、後で続行しても安全である。", "中止", "回復中止", "回復プロセスを中止するか?すべての進行状況が失われる。", - "回復フレーズの単語数を選択します。", + "シードフレーズの単語数を選択します。", "回復の準備", - "回復フレーズ入力", + "シードフレーズ入力", "入力", "単語#{}を入力", "再試行", - "無効な回復フレーズ", - "入力した回復フレーズは無効で、バックアップをチェックしてから、再試行してください。", + "無効なシードフレーズ", + "入力したシードフレーズは無効で、バックアップをチェックしてから、再試行してください。", "ウォレットを回復ずみ。", - "バックアップをチェックし、セキュリティエレメントに保存されている回復フレーズと完全に一致していることを確認してください。。", - "回復フレーズのチェック", + "バックアップをチェックし、セキュリティエレメントに保存されているシードフレーズと完全に一致していることを確認してください。", + "シードフレーズのチェック", "チェック中止", - "回復フレーズチェックを中止するか?", + "シードフレーズチェックを中止するか?", "チェックが準備済み!", - "入力された回復フレーズは有効であるが、デバイスに保存されている回復フレーズと不一致である。", + "入力されたシードフレーズは有効であるが、デバイスに保存されているシードフレーズと不一致である。", "正しい", - "入力した回復フレーズが一致し、バックアップが正しい。", + "入力したシードフレーズが一致し、バックアップが正しい。", "PINを変更するか?", "PIN 変更", "元PIN入力", @@ -89,9 +89,9 @@ "デバイスワイプ", "デバイスの初期化により、すべてのデータを削除できる。", "初期化リセット", - "リセットしたら、このデバイスの回復フレーズは完全に削除されまる。", + "リセットしたら、このデバイスのシードフレーズは完全に削除されます。", "長押しでリセット", - "回復フレーズのバックアップから資金を回復できる。", + "シードフレーズのバックアップから資金を回復できる。", "これにより、内部ストレージとSecure Element(SE)に保存されるすべてのデータが削除される。次のことを予めご了承ください:", "デバイスが正常にリセット済み。システムを再起動してください。", "リセット完了", @@ -241,7 +241,7 @@ "ペアリング失敗", "Bluetoothのペアリングに失敗した、もう一度接続してみてください。", "単語を書き留め済み。これからガイドに従って単語を1つずつ確認する。", - "回復フレーズなし", + "シードフレーズなし", "バックアップ失敗!", "バックアップ必要!", "PINが設定されていない!", @@ -274,17 +274,17 @@ "順序付けられ", "電源オン/オフ", "電源ボタンを押したままにして、電源をオン/オフする。", - "回復フレーズとは?", + "シードフレーズとは?", "ウォレットを生成するための人間が読める「秘密鍵」。すべての暗号資産を復元するための鍵。", "PIN保護を有効にする", "システムレベルのセキュリティ保護メカニズム。強力なPINコードの設定で暗号資産を保護する。", "ハードウェアウォレットの仕組み", "OneKeyはリカバリフレーズを暗号化してからセキュリティチップにオフラインで保存し、BluetoothまたはUSBを介してOneKeyアプリに接続して対話する。", "パスフレーズ:隠しウォレットにアクセス", - "パスフレーズは、ハードウェアウォレットの「余分な単語(回復フレーズ+ 1)」の2番目の要素と考えることができる。さまざまなパスフレーズを使用して、さまざまな非表示のウォレットにアクセスできる。", + "パスフレーズは、ハードウェアウォレットの「余分な単語(シードフレーズ+ 1)」の2番目の要素と考えることができる。さまざまなパスフレーズを使用して、さまざまな非表示のウォレットにアクセスできる。", "ヘルプが必要?", "お問い合わせなら、OneKeyサポートセンターにアクセスしてください。", - "回復フレーズとは?", + "シードフレーズとは?", "ガイド", "値を暗号化", "値を復号化", @@ -292,7 +292,7 @@ "エントロピー確認", "エントロピーをエクスポートするか?自分が何をしているのかを知っていた上で続行してください。", "ファームウェアの抽出", - "デバイスファームウェアを抽出するか?回復フレーズは漏洩されない。", + "デバイスファームウェアを抽出するか?シードフレーズは漏洩されない。", "OneKeyセキュアサーバーでデバイスを認証するか? [確認]をタップして、デバイスが本物で、改ざんされていないかを確認する。", "タップして閉じる", "処理中...", @@ -442,27 +442,27 @@ "ホーム画面", "開発者向けオプション", "ウォレットのインポート", - "新しいウォレットを作成するか、回復フレーズのバックアップから以前に使用したウォレットを復元する。", + "新しいウォレットを作成するか、シードフレーズのバックアップから以前に使用したウォレットを復元する。", "ウォレットを保護するために、4 ~ 50 桁の長さの PIN を設定する。", - "これにより、新しい回復フレーズのセットを含む標準のウォレットが生成される。", + "これにより、新しいシードフレーズのセットを含む標準のウォレットが生成される。", "ブルートゥース", "PIN を設定する", "ホーム画面の画像を変更するか?", "この取引に署名するか?", "シリアル", "間も無く完了!", - "回復フレーズ", + "シードフレーズ", "インポートする準備ができた", "{} 単語", "終了する", "インポートを中止するか?", "デバイスを工場出荷時のデフォルトにリセットする。警告: これにより、デバイスからすべてのデータが削除される。", "このデバイスを消去", - "単語を順番に入力し、回復フレーズのバックアップと同じ順序であることを確認してください。", + "単語を順番に入力し、シードフレーズのバックアップと同じ順序であることを確認してください。", "このプロセスを中止するか?すべての進行状況が失われる。", "戻る", "バックアップの準備ができた", - "次に、ガイドに従って、回復フレーズのバックアップに基づいて単語を 1 つずつ確認する。", + "次に、ガイドに従って、シードフレーズのバックアップに基づいて単語を 1 つずつ確認する。", "Safety-Checks が実行されており、非標準 (BIP-44 と互換性がある必要があります) アドレスの派生、潜在的に危険なトランザクションの実行、または予期しない高料金からユーザーを保護する。", "安全性チェックは永久に無効になっている。", "安全確認は一時的に無効になっている。デバイス再起動したら有効になる。", @@ -580,8 +580,8 @@ "キータグのバックアップを終了", "裏面を見る", "OneKey アプリに接続し、このハードウェア ウォレットが所有する NFT を見つけて、[収集] ボタンをタップします。", - "後で「Wallet - Check Recovery Phrase」で KeyTag を使用してバックアップすることもできます。", - "別の KeyTag バックアップを作成する場合は、リカバリ フレーズを確認した後、「Wallet - Check Recovery Phrase」で KeyTag ドットマップを表示できます。", + "後で「ウォレット - シードフレーズを確認」で KeyTag を使用してバックアップすることもできます。", + "別の KeyTag バックアップを作成する場合は、シードフレーズを確認した後、「ウォレット - シードフレーズを確認」で KeyTag ドットマップを表示できます。", "デバイス認証", "Trezor の互換性を無効にする", "Trezor の互換性を復元する", @@ -797,7 +797,7 @@ "終了", "接続に使用される2つのOneKey Liteが同じではありません。", "バックアッププロセスを終了しますか?", - "今終了すると、再度ログインするときに回復フレーズを再確認する必要があります。終了してもよろしいですか?", + "今終了すると、再度ログインするときにシードフレーズを再確認する必要があります。終了してもよろしいですか?", "サポートされていないリカバリーフレーズ", "現在のハードウェアウォレットは、12語、18語、24語のリカバリーフレーズのみをサポートしています。\nこのLiteバックアップは復元できません。", "OneKey Appを開いて、QRコードをスキャンしてください", @@ -1051,5 +1051,23 @@ "詳細オプション", "複数のエントロピー源を使用する", "デフォルトでは、デバイスはセキュアエレメントを使用してニーモニックフレーズを生成します。有効にすると、MCUとセキュアエレメントの両方からのエントロピーが組み合わされます。どちらの方法も暗号セキュリティ標準を満たしています。", + "言語を設定", + "言語を{language}に変更しますか?", + "自動ロックを設定", + "自動ロック時間を{time}に変更しますか?", + "自動シャットダウンを設定", + "自動シャットダウン時刻を{time}に変更しますか?", + "キーボードの触覚フィードバックを開きますか?", + "キーボードの触覚フィードバックを終了しますか?", + "PINキーパッドをデフォルトに切り替えますか?(PINキーパッドの数字が順番に配置されます)", + "PINキーパッドをランダム配置に切り替えますか?(PINキーパッドの数字がランダムに配置されます)", + "USB ロックを有効にしますか?(USB の抜き差しの度にデバイスが自動的にロックされます)", + "USB Lockを終了しますか?(USBの抜き差し時にデバイスはロック解除されたままになります。)", + "これはアプリに表示されているコードと一致しますか?", + "はい、一致しています", + "いいえ、そうではありません", + "デバイスがOneKey Proの近くにあることを確認してから、もう一度お試しください。", + "デバイスがペアリングされました", + "OneKey App のチェックとアップデートを続けて完了してください。", ] # fmt: on diff --git a/core/src/trezor/lvglui/i18n/locales/ko.py b/core/src/trezor/lvglui/i18n/locales/ko.py index 171437c90..3933d5edf 100644 --- a/core/src/trezor/lvglui/i18n/locales/ko.py +++ b/core/src/trezor/lvglui/i18n/locales/ko.py @@ -109,7 +109,7 @@ "거래 보기", "보내다", "거부합니다", - "{} 트랜잭션 서명", + "{} 거래 서명", "길게 눌러 서명", "양", "가스 가격", @@ -121,7 +121,7 @@ "가스당 우선 요금", "계약", "알 수 없는 토큰", - "{} 주소(Taproot)", + "{} 주소\n(Taproot)", "{} 주소\n(레거시 Segwit)", "{} 주소\n(Segwit)", "경로 확인", @@ -154,7 +154,7 @@ "에", "{} 이제 블라인드 서명이 비활성화되었습니다.", "{} 블라인드 서명", - "블라인드 서명은 장치에서 인식할 수 없는 특정 스마트 계약 트랜잭션에 서명할 때만 필요합니다. 이 기능을 활성화하기 전에 다음 사항을 알아야 합니다.", + "블라인드 서명은 장치에서 인식할 수 없는 특정 스마트 계약 거래에 서명할 때만 필요합니다. 이 기능을 활성화하기 전에 다음 사항을 알아야 합니다.", "사용 후에는 이 기능을 비활성화하는 것이 좋습니다.", "블라인드 서명을 활성화하면 특정 보안 위험이 있습니다.", "{} 블라인드 서명을 활성화하시겠습니까?", @@ -179,7 +179,7 @@ "신규 수수료", "금액 수정", "새로운 금액", - "트랜잭션 ID", + "거래 ID", "코인 이름", "최대 라운드", "최대 광업 수수료", @@ -217,7 +217,7 @@ "거래 확인", "거래 수수료", "락타임 보기", - "이 트랜잭션에 대한 잠금 시간 설정", + "이 거래에 대한 잠금 시간 설정", "시각", "높은 수수료", "수수료가 예상외로 높습니다.", @@ -279,7 +279,7 @@ "PIN 보호 활성화", "시스템 수준 보안 보호 메커니즘, 강력한 PIN 코드를 설정하여 암호화 자산을 보호합니다.", "하드웨어 지갑 작동 방식", - "OneKey 암호화는 복구 문구를 보안 요소에 오프라인으로 저장하여 블루투스 또는 USB를 통해 OneKey 앱에 연결하고 상호 작용합니다.", + "OneKey 암호화는 복구 구문을 보안 요소에 오프라인으로 저장하여 블루투스 또는 USB를 통해 OneKey 앱에 연결하고 상호 작용합니다.", "암호: 숨겨진 지갑에 액세스", "Passphrase는 하드웨어 지갑의 \"추가 단어(니모닉 + 1)\"에 대한 두 번째 요소로 생각할 수 있습니다. 다른 Passphrase를 사용하여 다른 숨겨진 지갑에 액세스할 수 있습니다.", "도움이 필요하신가요?", @@ -292,7 +292,7 @@ "엔트로피 확인", "엔트로피를 내보내시겠습니까? 당신이하는 일을 알고있는 경우에만 계속하십시오!", "펌웨어 추출", - "장치 펌웨어를 추출하시겠습니까? 복구 문구는 공개되지 않습니다.", + "장치 펌웨어를 추출하시겠습니까? 복구 구문은 공개되지 않습니다.", "OneKey 보안 서버로 장치를 인증하시겠습니까? 확인을 눌러 장치가 변조되지 않은 정품인지 확인하십시오.", "닫으려면 탭하세요.", "처리 중...", @@ -432,7 +432,7 @@ "기본", "PIN 키패드의 숫자가 순서대로 배열됩니다.", "PIN 키패드의 숫자는 무작위로 정렬됩니다.", - "이 {} 트랜잭션에 서명하시겠습니까?", + "이 {} 거래에 서명하시겠습니까?", "{} 형식화된 데이터", "상호 작용:", "메모 보기", @@ -442,13 +442,13 @@ "배경화면", "개발자 옵션", "지갑 가져오기", - "새 지갑을 생성하거나 복구 문구 백업에서 이전에 사용한 지갑을 복원하십시오.", + "새 지갑을 생성하거나 복구 구문 백업에서 이전에 사용한 지갑을 복원하십시오.", "4~50자리 길이의 PIN을 설정하여 지갑을 보호하세요.", - "이렇게 하면 새로운 복구 문구 세트가 있는 표준 지갑이 생성됩니다.", + "이렇게 하면 새로운 복구 구문 세트가 있는 표준 지갑이 생성됩니다.", "블루투스", "PIN 설정", "배경화면 이미지를 변경하시겠습니까?", - "이 트랜잭션에 서명하시겠습니까?", + "이 거래에 서명하시겠습니까?", "연속물", "거의 완료되었습니다!", "복구 구문", @@ -458,12 +458,12 @@ "가져오기를 중단하시겠습니까?", "장치를 공장 기본값으로 재설정합니다.경고: 이렇게 하면 장치에서 모든 데이터가 제거됩니다.", "이 장치 지우기", - "단어를 순서대로 입력하고 복구 문구 백업과 동일한 순서인지 확인하십시오.", + "단어를 순서대로 입력하고 복구 구문 백업과 동일한 순서인지 확인하십시오.", "이 프로세스를 중단하시겠습니까? 모든 진행 상황이 손실됩니다.", "뒤", "백업 준비", - "다음으로 복구 문구 백업을 기반으로 가이드를 따라 단어를 하나씩 확인합니다.", - "Safety-Checks가 실행 중이며 비표준(BIP-44와 호환되어야 함) 주소 파생, 잠재적으로 위험한 트랜잭션 수행 또는 예기치 않은 높은 수수료로부터 사용자를 보호합니다.", + "다음으로 복구 구문 백업을 기반으로 가이드를 따라 단어를 하나씩 확인합니다.", + "Safety-Checks가 실행 중이며 비표준(BIP-44와 호환되어야 함) 주소 파생, 잠재적으로 위험한 거래 수행 또는 예기치 않은 높은 수수료로부터 사용자를 보호합니다.", "안전 확인이 영구적으로 비활성화됩니다.", "안전 확인이 일시적으로 사용 중지되었습니다. 장치를 다시 시작하면 다시 활성화됩니다.", "안전 확인을 사용 중지하시겠습니까?", @@ -486,7 +486,7 @@ "기기가 잠겨 있는 동안(화면 꺼짐) 비활성 {} 후 종료됩니다.", "\"{}\"은(는) 비표준 경로입니다. 이 경로를 사용하시겠습니까?", "곧 출시", - "이 트랜잭션의 잠금 시간은 다음과 같이 설정됩니다.", + "이 거래의 잠금 시간은 다음과 같이 설정됩니다.", "항목이 없습니다", "NFT 수집", "이 NFT를 수집하시겠습니까?", @@ -546,7 +546,7 @@ "성공", "서명이 유효합니다.", "확인하다", - "다음 트랜잭션 출력에는 토큰이 포함되어 있습니다.", + "다음 거래 출력에는 토큰이 포함되어 있습니다.", "보낸 금액", "거래 유형", "스테이크 키 등록", @@ -555,11 +555,11 @@ "스테이크 풀 등록", "풀에", "Plutus 거래 확인 -- 담보 손실이 가능합니다. 모든 항목을 주의 깊게 확인하십시오.", - "트랜잭션에 담보 입력이 포함되어 있지 않으므로 Plutus 스크립트를 실행할 수 없습니다.", + "거래에 담보 입력이 포함되어 있지 않으므로 Plutus 스크립트를 실행할 수 없습니다.", "입력 ID", "입력 색인", "담보 금액을 알 수 없으므로 모든 항목을 주의 깊게 확인하십시오.", - "다음 트랜잭션 출력에는 데이텀 해시가 포함되어 있습니다.", + "다음 거래 출력에는 데이텀 해시가 포함되어 있습니다.", "데이텀 해시", "보조 데이터 해시", "자산 지문", @@ -569,7 +569,7 @@ "부트로더 업데이트", "부트로더를 업데이트하시겠습니까?", "KeyTag로 백업", - "이미 OneKey KeyTag가 있습니까? 복구 문구를 BIP39 도트맵으로 변환하려면 \"백업\" 버튼을 누르십시오.", + "이미 OneKey KeyTag가 있습니까? 복구 구문을 BIP39 도트맵으로 변환하려면 \"백업\" 버튼을 누르십시오.", "지원", "지금은 아님", "백업 건너뛰기", @@ -580,8 +580,8 @@ "KeyTag 백업 완료", "뒷면 보기", "OneKey 앱에 연결하고 이 하드웨어 지갑이 소유한 NFT를 찾은 다음 수집 버튼을 누릅니다.", - "나중에 \"Wallet - Check Recovery Phrase\"에서 KeyTag로 백업할 수 있습니다.", - "다른 KeyTag 백업을 하고 싶다면 복구 문구를 확인한 후 \"Wallet - 복구 문구 확인\"에서 KeyTag 도트맵을 볼 수 있습니다.", + "나중에 \"지갑 - 복구 구문 확인\"에서 KeyTag로 백업할 수 있습니다.", + "다른 KeyTag 백업을 하고 싶다면 복구 구문을 확인한 후 \"지갑 - 복구 구문 확인\"에서 KeyTag 도트맵을 볼 수 있습니다.", "기기 인증", "Trezor 호환성 비활성화", "Trezor 호환성 복원", @@ -609,7 +609,7 @@ "새로 고치다", "결제 ID", "잠금 해제 시간 확인", - "이 트랜잭션의 잠금 해제 시간은 {}로 설정되었습니다.", + "이 거래의 잠금 해제 시간은 {}로 설정되었습니다.", "원천", "팁", "살아 유지", @@ -669,7 +669,7 @@ "이 지문을 정말 제거할까요?", "지문을 설정한 후 이를 사용하여 장치 잠금을 해제할 수 있습니다. 해당 시나리오에서 등록된 손가락으로 전원 버튼을 터치하세요. 언제든지 설정에서 수정할 수 있습니다.", "Lite로 백업하시겠습니까?", - "이미 OneKey Lite를 갖고 계십니까? 복구 문구를 OneKey Lite에 저장하려면 \"백업\"을 탭하세요.", + "이미 OneKey Lite를 갖고 계십니까? 복구 구문을 OneKey Lite에 저장하려면 \"백업\"을 탭하세요.", "장치의 뒷면에 Lite를 놓고, 계속 버튼을 클릭하세요.", "OneKey Lite PIN 입력", "수색...", @@ -691,7 +691,7 @@ "연결 실패", "카드가 장치 뒷면에 단단히 고정되어 있는지 확인한 후 다시 시도하십시오.", "백업이 중단되었습니다.", - "백업할 방법을 선택하세요. 복구 문구 확인 후, 입력하신 문구를 백업용으로 활용하겠습니다.", + "백업할 방법을 선택하세요. 복구 구문 확인 후, 입력하신 구문을 백업용으로 활용하겠습니다.", "Lite/KeyTag로 백업하시겠습니까?", "복구 구문 확인이 완료되었으니 백업을 진행하세요.", "가져오려는 방법을 선택하세요.", @@ -714,7 +714,7 @@ "이 모드를 활성화하면 블루투스, USB, 그리고 NFC가 비활성화됩니다.", "Bluetooth, USB 및 NFC가 비활성화되었습니다.", "에어 갭 활성화", - "이 모드를 활성화하면 블루투스, USB, 그리고 NFC가 비활성화됩니다. 그래도 소프트웨어 지갑에 연결하거나 QR 코드를 스캔하여 오프라인으로 트랜잭션에 서명할 수 있습니다.", + "이 모드를 활성화하면 블루투스, USB, 그리고 NFC가 비활성화됩니다. 그래도 소프트웨어 지갑에 연결하거나 QR 코드를 스캔하여 오프라인으로 거래에 서명할 수 있습니다.", "Air Gap은 중간 전송 미디어 공격을 방지하는 보안 조치입니다. \n Air Gap을 활성화한 후 OneKey Pro는 모든 유무선 통신 모듈을 비활성화하고 외부 장치 또는 신뢰할 수 없는 네트워크로부터 엄격한 물리적 격리를 유지합니다.", "OKX 지갑", "MetaMask", @@ -930,14 +930,14 @@ "스캔 중... 기다려주세요", "서로 다른 패스프레이즈에 연결된 다양한 PIN 코드를 설정하면 여러 지갑에 쉽게 접근할 수 있습니다. 특정 PIN을 입력하기만 하면 해당 PIN에 연결된 지갑이 열립니다", "Turbo 모드", - "한 번의 클릭으로 트랜잭션에 서명하세요. (EVM 네트워크 및 Solana만 해당)", + "한 번의 클릭으로 거래에 서명하세요. (EVM 네트워크 및 Solana만 해당)", "Turbo 모드를 활성화하시겠습니까?", "한 번의 클릭으로 거래에 서명하세요.", "활성화되면, 기기는 거래를 검토할 때 세부 정보를 생략합니다. 위험을 인지하고 있습니다.", "활성화하려면 슬라이드하세요", "{addr}에게 {num} {token} 보내기", "메시지 서명", - "트랜잭션 서명", + "거래 서명", "Fingerprint (SE) 의 업데이트가 필요합니다. https://firmware.onekey.so/ 에 방문하여 업데이트한 후 다시 시도해 주세요.", "OP_RETURN", "이 거래에는 0이 아닌 OP_RETURN 값이 포함되어 있습니다. 한 번 확인되면, 자금은 영구적으로 잠기게 됩니다.", @@ -1002,7 +1002,7 @@ "OneKey 확장", "Kaspa 공식", "계정 유형 선택", - "트랜잭션 해시", + "거래 해시", "이 자산은 하드웨어 지갑에서 인식되지 않네요. 신중하게 확인해 주세요.", "수신자는 잘 알려진 에너지 렌탈 서비스 제공업체 주소입니다.", "최신 버전의 OneKey App에서 “PIN에 연결”을 사용하세요.", @@ -1051,5 +1051,23 @@ "고급 옵션", "여러 출처의 엔트로피를 사용하세요", "기본적으로 기기는 보안 요소를 사용해 니모닉 구문을 생성합니다. 이 기능을 활성화하면 MCU와 보안 요소의 엔트로피가 결합됩니다. 두 방식 모두 암호학적 보안 표준을 충족합니다.", + "언어 설정", + "언어를 {language}(으)로 변경하시겠습니까?", + "자동 잠금 설정", + "자동 잠금 시간을 {time}(으)로 변경하시겠습니까?", + "자동 종료 설정", + "자동 종료 시간을 {time}(으)로 변경하시겠습니까?", + "키보드 햅틱을 켜시겠어요?", + "키보드 햅틱을 종료하시겠습니까?", + "PIN 키패드를 기본 설정으로 전환하시겠습니까? (PIN 키패드의 숫자가 순서대로 배열됩니다)", + "PIN 키패드를 무작위로 전환하시겠습니까? (PIN 키패드의 숫자가 무작위로 배열됩니다)", + "USB 잠금을 열겠습니까? (USB를 꽂거나 빼면 매번 기기가 자동으로 잠깁니다)", + "USB 잠금을 종료하시겠습니까? (USB를 연결하거나 분리해도 기기는 계속 잠금 해제 상태로 유지됩니다.)", + "앱에 표시된 코드와 일치하나요?", + "네, 일치합니다", + "아니요, 그렇지 않습니다", + "기기가 OneKey Pro 가까이에 있는지 확인한 후 다시 시도하세요.", + "장치가 페어링됨", + "OneKey App 확인 및 업데이트를 계속 완료해 주세요.", ] # fmt: on diff --git a/core/src/trezor/lvglui/i18n/locales/pt_br.py b/core/src/trezor/lvglui/i18n/locales/pt_br.py index 6a90fc753..41fcaa5f4 100644 --- a/core/src/trezor/lvglui/i18n/locales/pt_br.py +++ b/core/src/trezor/lvglui/i18n/locales/pt_br.py @@ -1051,5 +1051,23 @@ "Opções Avançadas", "Use múltiplas fontes de entropia", "Por padrão, o dispositivo usa o elemento seguro para gerar frases mnemônicas. Quando ativado, a entropia do MCU e do elemento seguro serão combinadas. Ambos os métodos atendem aos padrões de segurança criptográfica.", + "Definir Idioma", + "Deseja alterar o idioma para {language}?", + "Definir Bloqueio Automático", + "Deseja alterar o tempo de Bloqueio Automático para {time}?", + "Definir Desligamento Automático", + "Deseja alterar o tempo de Desligamento Automático para {time}?", + "Deseja abrir o Teclado Háptico?", + "Deseja fechar o Teclado Háptico?", + "Deseja alternar o Teclado de PIN para o padrão? (Os números no teclado de PIN organizados em sequência)", + "Deseja alternar o Teclado de PIN para aleatório? (Os números no teclado de PIN são organizados aleatoriamente)", + "Deseja abrir o Bloqueio USB? (O dispositivo será bloqueado automaticamente toda vez que o USB for conectado ou desconectado)", + "Deseja fechar o USB Lock? (O dispositivo permanecerá desbloqueado ao conectar ou desconectar o USB.)", + "Isso corresponde ao código exibido no seu App?", + "Sim, eles correspondem", + "Não, não tem", + "Certifique-se de que seu dispositivo esteja próximo ao seu OneKey Pro e tente novamente.", + "Dispositivo Pareado", + "Continue para concluir a Verificação e Atualização do OneKey App.", ] # fmt: on diff --git a/core/src/trezor/lvglui/i18n/locales/ru.py b/core/src/trezor/lvglui/i18n/locales/ru.py index f59c0f302..13ad75f06 100644 --- a/core/src/trezor/lvglui/i18n/locales/ru.py +++ b/core/src/trezor/lvglui/i18n/locales/ru.py @@ -1051,5 +1051,23 @@ "Дополнительные параметры", "Используйте несколько источников энтропии", "По умолчанию устройство использует защищенный элемент для генерации мнемонических фраз. При включении энтропия от MCU и защищенного элемента будет объединена. Оба метода соответствуют стандартам криптографической безопасности.", + "Установить язык", + "Вы хотите изменить язык на {language}?", + "Установить автоблокировку", + "Вы хотите изменить время автоблокировки на {time}?", + "Установить автоматическое выключение", + "Вы хотите изменить время автоматического выключения на {time}?", + "Вы хотите открыть тактильную обратную связь клавиатуры?", + "Вы хотите закрыть тактильную обратную связь клавиатуры?", + "Вы хотите переключить клавиатуру PIN-кода на стандартную? (Цифры на клавиатуре PIN-кода расположены последовательно)", + "Вы хотите переключить клавиатуру PIN-кода на случайный порядок? (Цифры на клавиатуре PIN-кода располагаются в случайном порядке)", + "Вы хотите включить блокировку USB? (Устройство будет автоматически блокироваться каждый раз при подключении или отключении USB)", + "Вы хотите закрыть USB Lock? (Устройство останется разблокированным при подключении или отключении USB.)", + "Это соответствует коду, отображаемому в вашем приложении?", + "Да, они совпадают", + "Нет, не делает", + "Убедитесь, что ваше устройство находится рядом с OneKey Pro, затем повторите попытку.", + "Устройство подключено", + "Пожалуйста, продолжите проверку и обновление OneKey App.", ] # fmt: on diff --git a/core/src/trezor/lvglui/i18n/locales/zh_cn.py b/core/src/trezor/lvglui/i18n/locales/zh_cn.py index 45aa2c27b..e621b5079 100644 --- a/core/src/trezor/lvglui/i18n/locales/zh_cn.py +++ b/core/src/trezor/lvglui/i18n/locales/zh_cn.py @@ -40,7 +40,7 @@ "启用 PIN", "是否要启用 PIN 码保护?", "更改标签", - "确定要把标签改为 \"{}\" 吗?", + "确定要把标签改为 「{}」 吗?", "导入助记词来恢复已存在的钱包。", "选择单词位数", "您可以暂时中断进程,稍后继续操作。", @@ -275,7 +275,7 @@ "设备开机和关机", "按住电源键执行开机或关机。", "什么是助记词?", - "将用于生成钱包的私钥转换为便于记忆的可读格式。是恢复您的所有加密资产的关键要素。", + "将用于生成钱包的私钥转换为便于记忆的可读格式,是恢复您所有加密资产的关键要素。", "启用 PIN 码保护", "系统级别的安全防护机制,设置一个复杂 PIN 码来保护您的加密资产。", "硬件钱包的工作原理", @@ -1051,5 +1051,23 @@ "高级选项", "使用多个熵源", "默认情况下,设备使用安全芯片生成助记词。启用该选项后,设备会同时结合 MCU 与安全芯片的熵源。两种方式都符合加密安全标准。", + "设置语言", + "您想将语言更改为{language}吗?", + "设置自动锁定", + "您要将自动锁定时间更改为 {time} 吗?", + "设置自动关机", + "您想将自动关机时间更改为 {time} 吗?", + "您要打开键盘触感反馈吗?", + "您要关闭键盘触感反馈吗?", + "您要将 PIN 键盘切换为默认设置吗?(PIN 键盘上的数字按顺序排列)", + "您想将 PIN 键盘切换为随机排列吗?(PIN 键盘上的数字将随机排列)", + "您要开启 USB 锁定吗?(每次插入或拔出 USB 时设备将自动锁定)", + "您要关闭 USB 锁定吗?(当 USB 插入或拔出时,设备将保持解锁状态。)", + "与应用中显示的代码一致吗?", + "是的,两者匹配", + "不,两者不匹配", + "确保您的设备靠近 OneKey Pro,然后重试。", + "设备已配对", + "请继续完成 OneKey App 检查和更新。", ] # fmt: on diff --git a/core/src/trezor/lvglui/i18n/locales/zh_hk.py b/core/src/trezor/lvglui/i18n/locales/zh_hk.py index 0a6a6422c..7c0c841e6 100644 --- a/core/src/trezor/lvglui/i18n/locales/zh_hk.py +++ b/core/src/trezor/lvglui/i18n/locales/zh_hk.py @@ -1051,5 +1051,23 @@ "進階選項", "使用多個熵源", "預設情況下,裝置使用安全芯片生成助記詞。啟用此選項後,裝置會同時結合 MCU 與安全芯片的熵源。兩種方式皆符合加密安全標準。", + "設定語言", + "你想將語言更改為{language}嗎?", + "設定自動鎖定", + "您想將自動鎖定時間更改為 {time} 嗎?", + "設定自動關機", + "您想將自動關機時間更改為 {time} 嗎?", + "你想開啟鍵盤觸感回饋嗎?", + "您想關閉鍵盤觸感反饋嗎?", + "您想將 PIN 鍵盤切換為預設嗎?(PIN 鍵盤上的數字按順序排列)", + "您想將 PIN 鍵盤切換為隨機排列嗎?(PIN 鍵盤上的數字會隨機排列)", + "您想開啟 USB 鎖定功能嗎?(每次插入或拔出 USB 時,裝置將自動鎖定)", + "您想關閉 USB 鎖定嗎?(插入或拔出 USB 時,裝置將保持解鎖狀態。)", + "與應用程式中顯示的代碼一致嗎?", + "是,兩者相符", + "不,兩者不相符", + "請確保您的設備靠近 OneKey Pro,然後重試。", + "設備已配對", + "請繼續完成 OneKey App 檢查及更新。", ] # fmt: on diff --git a/core/src/trezor/lvglui/scrs/ble.py b/core/src/trezor/lvglui/scrs/ble.py index ecf321caa..56b91b781 100644 --- a/core/src/trezor/lvglui/scrs/ble.py +++ b/core/src/trezor/lvglui/scrs/ble.py @@ -4,12 +4,56 @@ from .widgets.style import StyleWrapper +def _compare_version(version1: str, version2: str) -> int: + """Compare two version strings. + Returns: + -1 if version1 < version2 + 0 if version1 == version2 + 1 if version1 > version2 + """ + if not version1 or not version2: + return -1 + + try: + v1_parts = [int(x) for x in version1.split(".")] + v2_parts = [int(x) for x in version2.split(".")] + except (ValueError, AttributeError): + return -1 + + # Pad with zeros to make same length + max_len = max(len(v1_parts), len(v2_parts)) + v1_parts.extend([0] * (max_len - len(v1_parts))) + v2_parts.extend([0] * (max_len - len(v2_parts))) + + for v1, v2 in zip(v1_parts, v2_parts): + if v1 < v2: + return -1 + elif v1 > v2: + return 1 + return 0 + + class PairCodeDisplay(FullSizeWindow): def __init__(self, pair_code: str): + from trezor import uart + + ble_version = uart.get_ble_version() + use_new_ui = ble_version and _compare_version(ble_version, "2.3.5") >= 0 + + if use_new_ui: + subtitle = _(i18n_keys.TITLE__BLUETOOTH_PAIR_DESC) + confirm_text = _(i18n_keys.BUTTON__YES_THEY_MATCH) + cancel_text = _(i18n_keys.BUTTON__NO_IT_DOES_NOT) + else: + subtitle = _(i18n_keys.SUBTITLE__BLUETOOTH_PAIR) + confirm_text = "" + cancel_text = _(i18n_keys.BUTTON__CLOSE) + super().__init__( _(i18n_keys.TITLE__BLUETOOTH_PAIR), - _(i18n_keys.SUBTITLE__BLUETOOTH_PAIR), - _(i18n_keys.BUTTON__CLOSE), + subtitle, + confirm_text=confirm_text, + cancel_text=cancel_text, icon_path="A:/res/icon-bluetooth.png", anim_dir=0, ) @@ -32,10 +76,14 @@ def __init__(self, pair_code: str): self.pair_code.set_style_text_letter_space(-2, lv.PART.MAIN | lv.STATE.DEFAULT) self.pair_code.set_text(pair_code) self.pair_code.align(lv.ALIGN.CENTER, 0, 0) - self.btn_yes.enable() + self.btn_layout_ver() self.destroyed = False + def show_unload_anim(self): + self.show_dismiss_anim() + def destroy(self, delay_ms=100): + super().destroy(delay_ms) self.destroyed = True from trezor.lvglui.scrs.homescreen import ScanScreen @@ -51,3 +99,43 @@ def __init__(self) -> None: _(i18n_keys.BUTTON__CLOSE), ) self.btn_yes.enable() + + +class PairFailedScreen(FullSizeWindow): + def __init__(self) -> None: + self.destroyed = False + super().__init__( + _(i18n_keys.TITLE__PAIR_FAILED), + _(i18n_keys.TITLE__PAIR_FAILED_DESC), + cancel_text=_(i18n_keys.BUTTON__CLOSE), + icon_path="A:/res/danger.png", + ) + self.btn_no.enable() + + def destroy(self, delay_ms=100): + self.destroyed = True + from trezor import uart, workflow + + if uart.PAIR_ERROR_SCREEN == self: + uart.PAIR_ERROR_SCREEN = None + if uart.PENDING_PAIR_CODE is not None: + workflow.spawn(uart._show_pending_pair_code()) + super().destroy(delay_ms) + + +class PairSuccessScreen(FullSizeWindow): + def __init__(self) -> None: + self.destroyed = False + super().__init__( + _(i18n_keys.TITLE__DEVICE_PAIRED), + _(i18n_keys.TITLE__ALREADY_PAIRED_DESC), + icon_path="A:/res/success.png", + ) + + def destroy(self, delay_ms=100): + self.destroyed = True + from trezor import uart + + if uart.PAIR_SUCCESS_SCREEN == self: + uart.PAIR_SUCCESS_SCREEN = None + super().destroy(delay_ms) diff --git a/core/src/trezor/uart.py b/core/src/trezor/uart.py index 1ec2387ad..f931b4875 100644 --- a/core/src/trezor/uart.py +++ b/core/src/trezor/uart.py @@ -34,7 +34,11 @@ _CMD_BLE_HASH = const(17) _CMD_BLE_MAC = const(18) CHARING_TYPE = 0 # 1 VIA USB / 2 VIA WIRELESS -SCREEN: PairCodeDisplay | None = None +PAIR_CODE_SCREEN: PairCodeDisplay | None = None +PAIR_ERROR_SCREEN = None +PAIR_SUCCESS_SCREEN = None +PENDING_PAIR_CODE: str | None = None +PENDING_PAIR_FAILED: bool = False BLE_ENABLED: bool | None = None NRF_VERSION: str | None = None BLE_CTRL = io.BLE() @@ -312,6 +316,55 @@ async def process_push() -> None: print("unknown or not care command:", cmd) +def _clear_pairing_screens(): + """Clear existing pairing-related screens.""" + global PAIR_CODE_SCREEN, PAIR_SUCCESS_SCREEN + + if PAIR_CODE_SCREEN is not None and not PAIR_CODE_SCREEN.destroyed: + PAIR_CODE_SCREEN.destroy() + PAIR_CODE_SCREEN = None + if PAIR_SUCCESS_SCREEN is not None and not PAIR_SUCCESS_SCREEN.destroyed: + PAIR_SUCCESS_SCREEN.destroy() + PAIR_SUCCESS_SCREEN = None + + +async def _display_pair_code(pair_code: str) -> None: + """Display pair code screen and handle user response.""" + global PAIR_CODE_SCREEN, BLE_PAIR_ABORT + + _clear_pairing_screens() + utils.turn_on_lcd_if_possible() + from trezor.lvglui.scrs.ble import PairCodeDisplay + + PAIR_CODE_SCREEN = PairCodeDisplay(pair_code) + result = await PAIR_CODE_SCREEN.request() + + if result == 0: + BLE_PAIR_ABORT = True + _send_pair_code_response(False, None) + elif result == 1: + _send_pair_code_response(True, pair_code) + + +async def _show_pending_pair_code(): + """Display pending pair code if available and not failed.""" + global PAIR_CODE_SCREEN, PENDING_PAIR_CODE, PENDING_PAIR_FAILED + + if PENDING_PAIR_CODE is None: + return + + if PENDING_PAIR_FAILED: + PENDING_PAIR_CODE = None + PENDING_PAIR_FAILED = False + return + + pair_code = PENDING_PAIR_CODE + PENDING_PAIR_CODE = None + PENDING_PAIR_FAILED = False + + await _display_pair_code(pair_code) + + async def _deal_ble_pair(value): from trezor.qr import close_camera @@ -323,7 +376,8 @@ async def _deal_ble_pair(value): PairForbiddenScreen() return - global BLE_PAIR_ABORT + + global BLE_PAIR_ABORT, PAIR_ERROR_SCREEN, PENDING_PAIR_CODE, PENDING_PAIR_FAILED BLE_PAIR_ABORT = False if not base.device_is_unlocked(): @@ -337,13 +391,22 @@ async def _deal_ble_pair(value): if BLE_PAIR_ABORT: return - global SCREEN - pair_codes = value.decode("utf-8") - # pair_codes = "".join(list(map(lambda c: chr(c), ustruct.unpack(">6B", value)))) - utils.turn_on_lcd_if_possible() - from trezor.lvglui.scrs.ble import PairCodeDisplay + pair_code = value.decode("utf-8") + + if PAIR_ERROR_SCREEN is not None and not PAIR_ERROR_SCREEN.destroyed: + PENDING_PAIR_CODE = pair_code + PENDING_PAIR_FAILED = False + return + + if PENDING_PAIR_FAILED and PENDING_PAIR_CODE == pair_code: + PENDING_PAIR_CODE = None + PENDING_PAIR_FAILED = False + return - SCREEN = PairCodeDisplay(pair_codes) + PENDING_PAIR_CODE = None + PENDING_PAIR_FAILED = False + + await _display_pair_code(pair_code) async def _deal_button_press(value: bytes) -> None: @@ -466,20 +529,33 @@ async def _deal_charging_state(value: bytes) -> None: async def _deal_pair_res(value: bytes) -> None: res = ustruct.unpack(">B", value)[0] - if res in [_BLE_PAIR_SUCCESS, _BLE_PAIR_FAILED]: - if SCREEN is not None and not SCREEN.destroyed: - SCREEN.destroy() - if res == _BLE_PAIR_FAILED: - global BLE_PAIR_ABORT - BLE_PAIR_ABORT = True - motor.vibrate(motor.ERROR) - StatusBar.get_instance().show_ble(StatusBar.BLE_STATE_ENABLED) - if device.is_initialized(): + if res not in [_BLE_PAIR_SUCCESS, _BLE_PAIR_FAILED]: + return + + global PAIR_CODE_SCREEN + if PAIR_CODE_SCREEN is not None and not PAIR_CODE_SCREEN.destroyed: + PAIR_CODE_SCREEN.destroy() + PAIR_CODE_SCREEN = None + + if res == _BLE_PAIR_FAILED: + global BLE_PAIR_ABORT, PENDING_PAIR_CODE, PENDING_PAIR_FAILED, PAIR_ERROR_SCREEN + BLE_PAIR_ABORT = True + motor.vibrate(motor.ERROR) + StatusBar.get_instance().show_ble(StatusBar.BLE_STATE_ENABLED) + + if device.is_initialized(): + if PENDING_PAIR_CODE is not None: + PENDING_PAIR_FAILED = True + if PAIR_ERROR_SCREEN is None or PAIR_ERROR_SCREEN.destroyed: from trezor.ui.layouts import show_pairing_error - await show_pairing_error() - else: - motor.vibrate(motor.SUCCESS) + workflow.spawn(show_pairing_error()) + else: + motor.vibrate(motor.SUCCESS) + if device.is_initialized(): + from trezor.ui.layouts import show_pairing_success + + workflow.spawn(show_pairing_success()) async def _deal_ble_status(value: bytes) -> None: @@ -598,6 +674,14 @@ def disconnect_ble(): BLE_CTRL.ctrl(0x81, b"\x03") +def _send_pair_code_response(accepted: bool, passkey: str | None) -> None: + if accepted and passkey: + passkey_bytes = passkey.encode("utf-8") + BLE_CTRL.ctrl(0x81, b"\x06" + passkey_bytes) + else: + BLE_CTRL.ctrl(0x81, b"\x07") + + async def fetch_all(): """Request some important data.""" while True: diff --git a/core/src/trezor/ui/layouts/lvgl/__init__.py b/core/src/trezor/ui/layouts/lvgl/__init__.py index 35222e2e0..c0b11dc50 100644 --- a/core/src/trezor/ui/layouts/lvgl/__init__.py +++ b/core/src/trezor/ui/layouts/lvgl/__init__.py @@ -43,6 +43,7 @@ "confirm_modify_fee", "confirm_coinjoin", "show_pairing_error", + "show_pairing_success", "show_popup", "draw_simple_text", "request_passphrase_on_device", @@ -1368,13 +1369,36 @@ async def request_pin_tips(ctx: wire.GenericContext) -> None: async def show_pairing_error() -> None: - await show_popup( - _(i18n_keys.TITLE__PAIR_FAILED), - description=None, - subtitle=_(i18n_keys.SUBTITLE__BLUETOOTH_PAIR_PAIR_FAILED), - timeout_ms=2000, - icon="A:/res/danger.png", - ) + from trezor.lvglui.scrs.ble import PairFailedScreen + from trezor import uart + + screen = PairFailedScreen() + uart.PAIR_ERROR_SCREEN = screen + try: + await screen.request() + except Exception: + pass + if not screen.destroyed: + screen.destroy() + if uart.PAIR_ERROR_SCREEN == screen: + uart.PAIR_ERROR_SCREEN = None + + +async def show_pairing_success() -> None: + from trezor.lvglui.scrs.ble import PairSuccessScreen + from trezor import loop + from trezor import uart + + screen = PairSuccessScreen() + uart.PAIR_SUCCESS_SCREEN = screen + try: + await loop.race(screen.request(), loop.sleep(3000)) + except Exception: + pass + if not screen.destroyed: + screen.destroy() + if uart.PAIR_SUCCESS_SCREEN == screen: + uart.PAIR_SUCCESS_SCREEN = None async def confirm_domain(ctx: wire.GenericContext, **kwargs) -> None: