diff --git a/src/app/components/ContentBox/index.tsx b/src/app/components/ContentBox/index.tsx index 4134c7277d..abcc6a377f 100644 --- a/src/app/components/ContentBox/index.tsx +++ b/src/app/components/ContentBox/index.tsx @@ -2,7 +2,7 @@ import React from "react"; export function ContentBox({ children }: React.PropsWithChildren) { return ( -
+
{children}
); diff --git a/src/app/components/PasswordViewAdornment/index.tsx b/src/app/components/PasswordViewAdornment/index.tsx index 231c374e5f..83447a330a 100644 --- a/src/app/components/PasswordViewAdornment/index.tsx +++ b/src/app/components/PasswordViewAdornment/index.tsx @@ -1,8 +1,6 @@ -import { - HiddenIcon, - VisibleIcon, -} from "@bitcoin-design/bitcoin-icons-react/outline"; +import { PopiconsEyeLine } from "@popicons/react"; import { useEffect, useState } from "react"; +import EyeCrossedIcon from "~/app/icons/EyeCrossedIcon"; type Props = { onChange: (viewingPassword: boolean) => void; @@ -23,16 +21,16 @@ export default function PasswordViewAdornment({ onChange, isRevealed }: Props) { ); diff --git a/src/app/components/mnemonic/MnemonicBackupDescription/index.tsx b/src/app/components/mnemonic/MnemonicBackupDescription/index.tsx new file mode 100644 index 0000000000..a6279e8a65 --- /dev/null +++ b/src/app/components/mnemonic/MnemonicBackupDescription/index.tsx @@ -0,0 +1,58 @@ +import { + PopiconsLifebuoyLine, + PopiconsShieldLine, + PopiconsTriangleExclamationLine, +} from "@popicons/react"; +import { useTranslation } from "react-i18next"; +import { classNames } from "~/app/utils"; + +function MnemonicInstructions() { + const { t } = useTranslation("translation", { + keyPrefix: "accounts.account_view.mnemonic", + }); + + return ( + <> +
+ } + title={t("description.recovery_phrase")} + type="info" + /> + } + title={t("description.secure_recovery_phrase")} + type="info" + /> + } + title={t("description.warning")} + type="warn" + /> +
+ + ); +} + +export default MnemonicInstructions; + +type ListItemProps = { + icon: React.ReactNode; + title: string; + type: "warn" | "info"; +}; + +function ListItem({ icon, title, type }: ListItemProps) { + return ( +
+
{icon}
+ {title} +
+ ); +} diff --git a/src/app/components/mnemonic/MnemonicDescription/index.tsx b/src/app/components/mnemonic/MnemonicDescription/index.tsx index d1d8ac5d24..23ef0ec58b 100644 --- a/src/app/components/mnemonic/MnemonicDescription/index.tsx +++ b/src/app/components/mnemonic/MnemonicDescription/index.tsx @@ -1,10 +1,6 @@ -import { - KeyIcon, - MnemonicIcon, - PasswordIcon, - SafeIcon, -} from "@bitcoin-design/bitcoin-icons-react/outline"; +import { PopiconsDownloadLine, PopiconsKeyLine } from "@popicons/react"; import { useTranslation } from "react-i18next"; +import FaceSurpriseIcon from "~/app/icons/FaceSurpriseIcon"; function MnemonicDescription() { const { t } = useTranslation("translation", { @@ -13,14 +9,13 @@ function MnemonicDescription() { return ( <> -
- } title={t("backup.items.keys")} /> +
+ } title={t("new.items.keys")} /> + } title={t("new.items.usage")} /> } - title={t("backup.items.recovery_phrase")} + icon={} + title={t("new.items.recovery_phrase")} /> - } title={t("backup.items.words")} /> - } title={t("backup.items.storage")} />
); @@ -32,11 +27,9 @@ type ListItemProps = { icon: React.ReactNode; title: string }; function ListItem({ icon, title }: ListItemProps) { return ( -
-
- {icon} -
- {title} +
+
{icon}
+ {title}
); } diff --git a/src/app/components/mnemonic/MnemonicInputs/index.tsx b/src/app/components/mnemonic/MnemonicInputs/index.tsx index 20a74a6600..78c8991494 100644 --- a/src/app/components/mnemonic/MnemonicInputs/index.tsx +++ b/src/app/components/mnemonic/MnemonicInputs/index.tsx @@ -2,12 +2,14 @@ import { wordlist } from "@scure/bip39/wordlists/english"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import PasswordViewAdornment from "~/app/components/PasswordViewAdornment"; +import Checkbox from "~/app/components/form/Checkbox"; import Input from "~/app/components/form/Input"; type MnemonicInputsProps = { mnemonic?: string; setMnemonic?(mnemonic: string): void; readOnly?: boolean; + isConfirmed?: (confirmed: boolean) => void; }; export default function MnemonicInputs({ @@ -15,6 +17,7 @@ export default function MnemonicInputs({ setMnemonic, readOnly, children, + isConfirmed, }: React.PropsWithChildren) { const { t } = useTranslation("translation", { keyPrefix: "accounts.account_view.mnemonic", @@ -22,6 +25,7 @@ export default function MnemonicInputs({ const [revealedIndex, setRevealedIndex] = useState( undefined ); + const [hasConfirmedBackup, setHasConfirmedBackup] = useState(false); const words = mnemonic?.split(" ") || []; while (words.length < 12) { @@ -32,7 +36,7 @@ export default function MnemonicInputs({ } return ( -
+

{t("inputs.title")}

@@ -42,10 +46,10 @@ export default function MnemonicInputs({ const inputId = `mnemonic-word-${i}`; return (
- + {i + 1}. -
+
setRevealedIndex(undefined)} readOnly={readOnly} block={false} - className="w-32 text-center" + className="w-full text-center" list={readOnly ? undefined : "wordlist"} value={isRevealed ? word : word.length ? "•••••" : ""} onChange={(e) => { @@ -92,6 +96,26 @@ export default function MnemonicInputs({ )} {children} + + {isConfirmed && ( +
+ { + setHasConfirmedBackup(event.target.checked); + if (isConfirmed) isConfirmed(event.target.checked); + }} + /> + +
+ )}
); } diff --git a/src/app/icons/EyeCrossedIcon.tsx b/src/app/icons/EyeCrossedIcon.tsx new file mode 100644 index 0000000000..9bd05cad83 --- /dev/null +++ b/src/app/icons/EyeCrossedIcon.tsx @@ -0,0 +1,27 @@ +import { SVGProps } from "react"; + +const EyeCrossedIcon = (props: SVGProps) => ( + + + + + +); + +export default EyeCrossedIcon; diff --git a/src/app/icons/FaceSurpriseIcon.tsx b/src/app/icons/FaceSurpriseIcon.tsx new file mode 100644 index 0000000000..f3e54b71fc --- /dev/null +++ b/src/app/icons/FaceSurpriseIcon.tsx @@ -0,0 +1,32 @@ +import { SVGProps } from "react"; + +const FaceSurpriseIcon = (props: SVGProps) => ( + + + + + + +); +export default FaceSurpriseIcon; diff --git a/src/app/screens/Accounts/BackupMnemonic/index.tsx b/src/app/screens/Accounts/BackupMnemonic/index.tsx index 4d81b5faf9..dab94ae6dd 100644 --- a/src/app/screens/Accounts/BackupMnemonic/index.tsx +++ b/src/app/screens/Accounts/BackupMnemonic/index.tsx @@ -6,7 +6,7 @@ import { useNavigate, useParams } from "react-router-dom"; import Button from "~/app/components/Button"; import { ContentBox } from "~/app/components/ContentBox"; import toast from "~/app/components/Toast"; -import MnemonicDescription from "~/app/components/mnemonic/MnemonicDescription"; +import MnemonicInstructions from "~/app/components/mnemonic/MnemonicBackupDescription"; import MnemonicInputs from "~/app/components/mnemonic/MnemonicInputs"; import api from "~/common/lib/api"; @@ -19,8 +19,9 @@ function BackupMnemonic() { const [mnemonic, setMnemonic] = useState(); const [loading, setLoading] = useState(true); + const [hasConfirmedBackup, setHasConfirmedBackup] = useState(false); - const { id } = useParams(); + const { id } = useParams() as { id: string }; const fetchData = useCallback(async () => { try { @@ -38,7 +39,19 @@ function BackupMnemonic() { fetchData(); }, [fetchData]); - // TODO: set isMnemonicBackupDone, once new ui for screen is merged + async function completeBackupProcess() { + if (!hasConfirmedBackup) { + toast.error(t("error_confirm")); + return false; + } + + await api.editAccount(id, { + isMnemonicBackupDone: true, + }); + + navigate(`/accounts/${id}`); + } + return loading ? (
@@ -50,15 +63,24 @@ function BackupMnemonic() {

{t("backup.title")}

- - - -
-
+ +
+
+
); diff --git a/src/app/screens/Accounts/Detail/index.tsx b/src/app/screens/Accounts/Detail/index.tsx index e0df33cead..f2d6e5a4a5 100644 --- a/src/app/screens/Accounts/Detail/index.tsx +++ b/src/app/screens/Accounts/Detail/index.tsx @@ -47,6 +47,7 @@ function AccountDetail() { const [account, setAccount] = useState(null); const [accountName, setAccountName] = useState(""); const [hasMnemonic, setHasMnemonic] = useState(false); + const [isMnemonicBackupDone, setIsMnemonicBackupDone] = useState(false); const [nostrPublicKey, setNostrPublicKey] = useState(""); const [hasImportedNostrKey, setHasImportedNostrKey] = useState(false); @@ -80,6 +81,7 @@ function AccountDetail() { setAccount(response); setAccountName(response.name); setHasMnemonic(response.hasMnemonic); + setIsMnemonicBackupDone(response.isMnemonicBackupDone); setHasImportedNostrKey(response.hasImportedNostrKey); if (response.nostrEnabled) { @@ -312,7 +314,7 @@ function AccountDetail() {
- {hasMnemonic && ( + {hasMnemonic && !isMnemonicBackupDone && ( {t("mnemonic.backup.warning")} )} diff --git a/src/app/screens/Accounts/GenerateMnemonic/index.tsx b/src/app/screens/Accounts/GenerateMnemonic/index.tsx index b5b563e649..f433db0ea2 100644 --- a/src/app/screens/Accounts/GenerateMnemonic/index.tsx +++ b/src/app/screens/Accounts/GenerateMnemonic/index.tsx @@ -7,7 +7,7 @@ import Alert from "~/app/components/Alert"; import Button from "~/app/components/Button"; import { ContentBox } from "~/app/components/ContentBox"; import toast from "~/app/components/Toast"; -import Checkbox from "~/app/components/form/Checkbox"; +import MnemonicInstructions from "~/app/components/mnemonic/MnemonicBackupDescription"; import MnemonicInputs from "~/app/components/mnemonic/MnemonicInputs"; import api from "~/common/lib/api"; @@ -46,7 +46,7 @@ function GenerateMnemonic() { async function saveGeneratedSecretKey() { try { if (!hasConfirmedBackup) { - throw new Error(t("generate.error_confirm")); + throw new Error(t("error_confirm")); } if (!mnemonic) { throw new Error("No mnemonic available"); @@ -82,36 +82,28 @@ function GenerateMnemonic() {

{t("generate.title")}

+ + {hasNostrPrivateKey && ( {t("existing_nostr_key_notice")} )} - + { + setHasConfirmedBackup(hasConfirmedBackup); + }} + > -
- { - setHasConfirmedBackup(event.target.checked); - }} +
+
-
-
); diff --git a/src/app/screens/Accounts/GenerateMnemonic/new.tsx b/src/app/screens/Accounts/GenerateMnemonic/new.tsx index e16f582862..f9b135e880 100644 --- a/src/app/screens/Accounts/GenerateMnemonic/new.tsx +++ b/src/app/screens/Accounts/GenerateMnemonic/new.tsx @@ -1,6 +1,6 @@ import Container from "@components/Container"; import { useTranslation } from "react-i18next"; -import { useNavigate, useParams } from "react-router-dom"; +import { useNavigate } from "react-router-dom"; import Button from "~/app/components/Button"; import { ContentBox } from "~/app/components/ContentBox"; import MnemonicDescription from "~/app/components/mnemonic/MnemonicDescription"; @@ -9,37 +9,32 @@ import { useTheme } from "~/app/utils"; function MnemonicExplanation() { const navigate = useNavigate(); const theme = useTheme(); - const { id } = useParams() as { id: string }; const { t } = useTranslation("translation", { keyPrefix: "accounts.account_view.mnemonic.new", }); const { t: tCommon } = useTranslation("common"); - function cancel() { - // go to account settings - navigate(`/accounts/${id}`); - } - return (

{t("title")}

+ Master Key - + +
+
-
-
); } diff --git a/src/app/screens/Accounts/ImportMnemonic/index.tsx b/src/app/screens/Accounts/ImportMnemonic/index.tsx index 24117725d7..6838f75808 100644 --- a/src/app/screens/Accounts/ImportMnemonic/index.tsx +++ b/src/app/screens/Accounts/ImportMnemonic/index.tsx @@ -85,12 +85,12 @@ function ImportMnemonic() { {t("existing_nostr_key_notice")} )} - -
-
+
+
+
); diff --git a/src/extension/background-script/actions/accounts/get.ts b/src/extension/background-script/actions/accounts/get.ts index 392f40a286..2c2a8dc749 100644 --- a/src/extension/background-script/actions/accounts/get.ts +++ b/src/extension/background-script/actions/accounts/get.ts @@ -24,7 +24,7 @@ const get = async (message: MessageAccountGet) => { hasMnemonic: !!account.mnemonic, // for existing accounts consider mnemonic backup already done isMnemonicBackupDone: - account.isMnemonicBackupDone != undefined + account.isMnemonicBackupDone !== undefined ? account.isMnemonicBackupDone : true, // Note: undefined (default for new accounts) it is also considered imported diff --git a/src/i18n/locales/cs/translation.json b/src/i18n/locales/cs/translation.json index 8db384268f..38263537b4 100644 --- a/src/i18n/locales/cs/translation.json +++ b/src/i18n/locales/cs/translation.json @@ -310,9 +310,7 @@ "title": "Vygenerování nového Master klíče", "error_confirm": "Prosím potvrďte, že jste zazálohovali svou záložní frázi." }, - "inputs": { - "title": "Záložní fráze" - }, + "inputs": {}, "saved": "Master klíč byl zašifrován a úspěšně uložen.", "lnurl": { "use_mnemonic": "Používat Master klíč pro přihlašování do aplikací podporujících autentizaci přes Lightning (LNURL Auth)", diff --git a/src/i18n/locales/de/translation.json b/src/i18n/locales/de/translation.json index 5776553f53..53471f032b 100644 --- a/src/i18n/locales/de/translation.json +++ b/src/i18n/locales/de/translation.json @@ -537,7 +537,6 @@ "protocols": { "nostr": "Nostr" }, - "title": "Sichere deine Wiederherstellungsphrase", "save": "Hauptschlüssel speichern", "button": "Zeige Wiederherstellungsphrase", "warning": "⚠️ Vergesse nicht, deine Wiederherstellungsphrase zu sichern! Wird sie nicht gesichert, kann dies dazu führen, dass du den Zugang zu deinem Hauptschlüssel, dein Nostr-Identität oder den von dir mit diesem Schlüssel verwalteten Assets dauerhaft verlierst.", @@ -562,9 +561,7 @@ "description": "Verwende die Wiederherstellungsphrase, um deinen Hauptschlüssel in Alby zu importieren.", "button": "Hauptschlüssel importieren" }, - "inputs": { - "title": "Wiederherstellungsphrase" - }, + "inputs": {}, "existing_nostr_key_notice": "ℹ️ Für dieses Konto ist bereits ein privater Nostr-Schlüssel festgelegt, der nicht von diesem Hauptschlüssel abgeleitet wird. Du kannst dein Nostr-Schlüssel über deine Kontoeinstellungen verwalten.", "lnurl": { "title": "Anmeldung mit Lightning", diff --git a/src/i18n/locales/en/translation.json b/src/i18n/locales/en/translation.json index 652a62be1e..d8b6e179e9 100644 --- a/src/i18n/locales/en/translation.json +++ b/src/i18n/locales/en/translation.json @@ -418,28 +418,32 @@ "title": "🔑 Key Management", "saved": "Master Key encrypted & saved successfully.", "existing_nostr_key_notice": "ℹ️ This account already has a nostr private key set and will not be derived from this Master Key. You can manage your Nostr key from your account settings.", + "description": { + "warning": "Recovery phrase cannot recover this wallet or funds in it. It only recovers the identity you can use across aforementioned protocols", + "secure_recovery_phrase": "Make sure to write them down somewhere safe and and keep them private", + "recovery_phrase": "Recovery phrase is set of 12 words that backs up your Master Key" + }, + "confirm": "I've backed up the recovery phrase to my Master Key in a private and secure place.", + "error_confirm": "Please confirm that you have backed up the recovery phrase.", "new": { - "title": "What is a Master Key?" + "title": "What is a Master Key?", + "items": { + "keys": "Master Key is your identity that allows you to interact with protocols like Nostr, Liquid Network or base layer of bitcoin", + "usage": "You can import and use the same Master Key in each connected wallet in the Alby Extension", + "recovery_phrase": "To import your Master Key to any wallet in Alby, you need to use a recovery phrase" + } }, "generate": { "title": "Generate new Master Key", "description": "Master Key allows you to interact with various protocols such as: Nostr, base layer of Bitcoin or LNURL-Auth.", - "button": "Generate Master Key", - "confirm": "I've backed up the recovery phrase to my Master Key in a private and secure place.", - "error_confirm": "Please confirm that you have backed up the recovery phrase." + "button": "Generate Master Key" }, "backup": { - "title": "Back up your recovery phrase", + "title": "Back up your Master Key", "save": "Save Master Key", "button": "View recovery phrase", "warning": "⚠️ Don't forget to back up your recovery phrase! Not backing it up might result in permanently losing access to your Master Key, Nostr identity or assets you manage with this key.", "description": "Write down the recovery phrase to be able to restore your Master Key on a new device or in case you lose access to your account.", - "items": { - "keys": "Master Key allows you to interact with various protocols such as: Nostr, Liquid or base layer of Bitcoin.", - "recovery_phrase": "You can always access your Master Key by using it's recovery phrase.", - "words": "Recovery phrase is set of 12 words that works like a password, however it can't be changed or reset in case it's lost.", - "storage": "Make sure to write it down somewhere safe and private!" - }, "protocols": { "nostr": "Nostr" } @@ -450,7 +454,7 @@ "button": "Import Master Key" }, "inputs": { - "title": "Recovery Phrase" + "title": "Recovery phrase to your Master Key" }, "lnurl": { "title": "Login with Lightning", @@ -1022,6 +1026,7 @@ "cancel": "Cancel", "confirm": "Confirm", "continue": "Continue", + "finish": "Finish", "connect": "Connect", "lock": "Lock", "unlock": "Unlock", diff --git a/src/i18n/locales/fa/translation.json b/src/i18n/locales/fa/translation.json index 8f4682fb8f..9626be7623 100644 --- a/src/i18n/locales/fa/translation.json +++ b/src/i18n/locales/fa/translation.json @@ -383,7 +383,6 @@ "protocols": { "nostr": "ناستر" }, - "title": "عبارت بازیابی خود را جایی ذخیره کنید", "save": "ذخیره کلید اصلی", "items": { "recovery_phrase": "همیشه می توانید با استفاده از عبارت بازیابی به کلید اصلی خود دسترسی داشته باشید.", @@ -405,9 +404,7 @@ "description": "از عبارت بازیابی برای وارد کردن کلید اصلی خود به البی استفاده کنید.", "button": "وارد کردن کلید اصلی" }, - "inputs": { - "title": "عبارت بازیابی شما" - }, + "inputs": {}, "lnurl": { "title": "ورود با لایتنینگ", "use_mnemonic": "از کلید اصلی برای ورود به اپ های لایتنینگی استفاده کنید (LNURL Auth)" diff --git a/src/i18n/locales/hi/translation.json b/src/i18n/locales/hi/translation.json index 48bac35556..5226df1f36 100644 --- a/src/i18n/locales/hi/translation.json +++ b/src/i18n/locales/hi/translation.json @@ -704,7 +704,6 @@ }, "description": "किसी नए डिवाइस पर या अपने खाते तक पहुंच खो जाने की स्थिति में अपने मास्टर की को पुनर्स्थापित करने में सक्षम होने के लिए पुनर्प्राप्ति वाक्यांश लिखें।", "warning": "⚠️ अपने पुनर्प्राप्ति वाक्यांश का बैकअप लेना न भूलें! इसका बैकअप न लेने के परिणामस्वरूप आपके मास्टर की, नोस्ट्र एयडेंटिटी या आपके द्वारा इस की के साथ प्रबंधित किए जाने वाले एसेट्स तक पहुंच स्थायी रूप से खो सकती है।", - "title": "अपने पुनर्प्राप्ति वाक्यांश का बैकअप लें", "protocols": { "nostr": "Nostr" }, @@ -721,9 +720,7 @@ "title": "नई Master key उत्पन्न करें", "error_confirm": "कृपया पुष्टि करें कि आपने पुनर्प्राप्ति वाक्यांश का बैकअप ले लिया है।" }, - "inputs": { - "title": "पुनर्प्राप्ति वाक्यांश" - }, + "inputs": {}, "saved": "मास्टर की एन्क्रिप्ट की गई और सफलतापूर्वक सहेजी गई।", "import": { "description": "अपने मास्टर की को एल्बी में आयात करने के लिए पुनर्प्राप्ति वाक्यांश का उपयोग करें।", diff --git a/src/i18n/locales/id/translation.json b/src/i18n/locales/id/translation.json index 782f9e96d5..aaba509fcd 100644 --- a/src/i18n/locales/id/translation.json +++ b/src/i18n/locales/id/translation.json @@ -309,7 +309,6 @@ "error_confirm": "Silakan konfirmasi bahwa kamu telah mencadangkan recovery phrase." }, "backup": { - "title": "Cadangkan recovery phrase kamu", "save": "Simpan Master Key", "button": "Lihat recovery phrase", "warning": "⚠️ Jangan lupa untuk mencadangkan recovery phrase! tidak mempunyai cadangannya akan mungkin menyebabkan kehilangan akses secara permanen terhadap Master Key, identitas Nostr atau aset lainnya yang menggunakan kunci ini.", @@ -328,9 +327,7 @@ "button": "Impor Master Key", "description": "Gunakan recovery phrase untuk impor Master Key kamu ke Alby." }, - "inputs": { - "title": "Recovery Phrase" - }, + "inputs": {}, "lnurl": { "title": "Masuk dengan Lightning", "use_mnemonic": "Gunakan Master Key untuk masuk pada aplikasi yang telah terintegrasi dengan Lightning (LNURL Auth)" diff --git a/src/i18n/locales/ja/translation.json b/src/i18n/locales/ja/translation.json index 6d2743ae69..431d589aac 100644 --- a/src/i18n/locales/ja/translation.json +++ b/src/i18n/locales/ja/translation.json @@ -270,7 +270,6 @@ "backup": { "button": "リカバリーフレーズを表示", "description": "新しいデバイスでマスターキーを復元したり、アカウントにアクセスできなくなった場合に備えて、リカバリーフレーズは必ずメモしてください。", - "title": "リカバリーフレーズをバックアップ", "warning": "⚠️ リカバリフレーズのバックアップを忘れないでください!バックアップを忘れると、マスターキー、Nostr ID、またはこのキーで管理する資産へのアクセスを永久に失います。", "items": { "recovery_phrase": "リカバリーフレーズを使用すれば、いつでもマスターキーにアクセスできます。", @@ -282,9 +281,7 @@ }, "save": "マスターキーを保存" }, - "inputs": { - "title": "リカバリーフレーズ" - }, + "inputs": {}, "existing_nostr_key_notice": "ℹ️ このアカウントにはすでにnostr秘密鍵が設定されているため、このマスターキーから生成されることはありません。Nostr鍵はアカウント設定から管理できます。", "generate": { "description": "マスターキーは、Nostr、Bitcoinのベースレイヤー、LNURL-Authのようなプロトコルとの連携を可能にします。", diff --git a/src/i18n/locales/pl/translation.json b/src/i18n/locales/pl/translation.json index 90a8bec9fa..d164406a29 100644 --- a/src/i18n/locales/pl/translation.json +++ b/src/i18n/locales/pl/translation.json @@ -363,9 +363,7 @@ "nostr": "Nostr" } }, - "inputs": { - "title": "Fraza odzyskiwania" - }, + "inputs": {}, "import": { "description": "Użyj frazy odzyskiwania, aby zaimportować swój Klucz Główny do Alby.", "button": "Zaimportuj Klucz Główny", diff --git a/src/i18n/locales/pt_BR/translation.json b/src/i18n/locales/pt_BR/translation.json index 6bb8ffcbda..a76be329c8 100644 --- a/src/i18n/locales/pt_BR/translation.json +++ b/src/i18n/locales/pt_BR/translation.json @@ -398,7 +398,6 @@ "protocols": { "nostr": "Nostr" }, - "title": "Backup de sua frase de recuperação", "warning": "⚠️ Não se esqueça de fazer backup de sua frase de recuperação! Não fazer o backup pode resultar na perda permanente do acesso à sua chave mestra, identidade Nostr ou ativos que você gerencia com esta chave.", "description": "Anote a frase de recuperação para poder restaurar sua chave mestra em um novo dispositivo ou caso perca o acesso à sua conta.", "items": { @@ -413,9 +412,7 @@ "description": "Use a frase de recuperação para importar sua chave mestra na Alby.", "button": "Importar chave mestra" }, - "inputs": { - "title": "Frase de recuperação" - }, + "inputs": {}, "existing_nostr_key_notice": "ℹ️ Esta conta já possui uma chave privada nostr, logo não será gerada uma nova a partir desta chave mestra. Você pode gerenciar sua chave Nostr nas configurações de sua conta.", "lnurl": { "use_mnemonic": "Use a chave mestra para acessar aplicativos com tecnologia (LNURL Auth)", diff --git a/src/i18n/locales/sl/translation.json b/src/i18n/locales/sl/translation.json index 8494b9b8a6..ae7c5d7009 100644 --- a/src/i18n/locales/sl/translation.json +++ b/src/i18n/locales/sl/translation.json @@ -329,7 +329,6 @@ "error_confirm": "Prosim potrdi, da si naredil varnostno kopijo obnovitvene fraze." }, "backup": { - "title": "Varnostno kopiraj obnovitveno frazo", "save": "Shrani Glavni ključ", "button": "Poglej obnovitveno frazo", "items": { @@ -346,9 +345,7 @@ "description": "Uporabi obnovitveno frazo za uvoz Gladvnega ključa v Alby.", "button": "Uvozi Glavni ključ" }, - "inputs": { - "title": "Obnovitvena fraza" - }, + "inputs": {}, "lnurl": { "title": "Prijava z Lightning", "use_mnemonic": "Uporabi Glavni ključ za prijavo v Lightning omogočene aplikacije (LNURL Auth)" diff --git a/src/i18n/locales/sv/translation.json b/src/i18n/locales/sv/translation.json index e22d2dc389..214934cf3c 100644 --- a/src/i18n/locales/sv/translation.json +++ b/src/i18n/locales/sv/translation.json @@ -351,7 +351,6 @@ "description": "Master Key låter dig interagera med olika protokoll som: Nostr, baslager av Bitcoin eller LNURL-Auth." }, "backup": { - "title": "Säkerhetskopiera din återställningsfras", "save": "Spara huvudnyckeln", "button": "Visa återställningsfras", "protocols": { @@ -372,9 +371,7 @@ "button": "Importera huvudnyckel" }, "title": "🔑 Nyckelhantering", - "inputs": { - "title": "Återställningsfras" - }, + "inputs": {}, "lnurl": { "title": "Logga in med Lightning", "use_mnemonic": "Använd Master Key för att logga in på lightning appar (LNURL Auth)" diff --git a/src/i18n/locales/th/translation.json b/src/i18n/locales/th/translation.json index 6462d17b23..e5bb8a4e0e 100644 --- a/src/i18n/locales/th/translation.json +++ b/src/i18n/locales/th/translation.json @@ -60,7 +60,6 @@ "description": "Master Key ช่วยให้คุณโต้ตอบกับโปรโตคอลต่างๆ เช่น Nostr, เลเยอร์พื้นฐานของ Bitcoin หรือ LNURL-Auth" }, "backup": { - "title": "สำรอง recovery phase ของคุณ", "save": "บันทึก Master Key", "button": "ดู recovery phrase", "warning": "⚠️อย่าลืมสำรอง recovery phrase ของคุณ! การไม่สำรองข้อมูลอาจทำให้คุณสูญเสียการเข้าถึง Master Key, ข้อมูลประจำตัว Nostr หรือ สินทรัพย์ที่คุณจัดการด้วยคีย์นี้อย่างถาวร", @@ -79,9 +78,7 @@ "description": "ใช้ recovery phrase เพื่อนำ Master Key ของคุณเข้าสู่ Alby", "button": "นำเข้า Master Key" }, - "inputs": { - "title": "Recovery Phrase" - }, + "inputs": {}, "lnurl": { "title": "เข้าสู่ระบบด้วย Lightning", "use_mnemonic": "ใช้ Master Key เพื่อลงชื่อเข้าใช้แอปพลิเคชันที่ใช้ Lightning (LNURL Auth)" diff --git a/src/i18n/locales/zh_Hans/translation.json b/src/i18n/locales/zh_Hans/translation.json index 7bc9c9c235..a0582a2da6 100644 --- a/src/i18n/locales/zh_Hans/translation.json +++ b/src/i18n/locales/zh_Hans/translation.json @@ -328,7 +328,6 @@ "backup": { "button": "备份恢复短语", "warning": "⚠️ 别忘了将你的恢复短语备份!不备份可能会导致永久失去对你的主密钥、Nostr 身份或使用此密钥管理的资产的访问权限。", - "title": "备份你的恢复短语", "save": "保存主密钥", "protocols": { "nostr": "Nostr" @@ -355,9 +354,7 @@ "description": "通过使用恢复短语将主密钥导入 Alby。", "button": "导入主密钥" }, - "inputs": { - "title": "恢复短语" - }, + "inputs": {}, "lnurl": { "title": "闪电登录", "use_mnemonic": "使用主密钥登录闪电驱动的应用程序(LNURL Auth)" diff --git a/src/i18n/locales/zh_Hant/translation.json b/src/i18n/locales/zh_Hant/translation.json index 151e02ffe7..bcf3c034f5 100644 --- a/src/i18n/locales/zh_Hant/translation.json +++ b/src/i18n/locales/zh_Hant/translation.json @@ -361,7 +361,6 @@ "button": "備份恢復短語", "warning": "⚠️別忘了將你的恢復短語備份!不備份可能會導致永久失去對你的主密鑰、 Nostr 身份或使用此密鑰管理的資產的訪問權限。", "save": "保存主密鑰", - "title": "備份你的恢復短語", "description": "請寫下恢復短語,以便能夠在新設備上恢復主密鑰,或以防失去帳戶訪問。", "items": { "recovery_phrase": "你將始終可以通過使用主密鑰的恢復短語來訪問它。", @@ -373,9 +372,7 @@ "use_mnemonic": "使用主密鑰登錄閃電驅動的應用程式(LNURL Auth)", "title": "閃電登錄" }, - "inputs": { - "title": "恢復短語" - }, + "inputs": {}, "generate": { "error_confirm": "請確認你已將你的恢復短語備份。", "confirm": "我已將我的帳戶主密鑰的恢復短語保存到私密且安全的地方。", diff --git a/static/assets/images/master_key_dark.png b/static/assets/images/master_key_dark.png index 2ca2d2cced..4c174e6e94 100644 Binary files a/static/assets/images/master_key_dark.png and b/static/assets/images/master_key_dark.png differ diff --git a/static/assets/images/master_key_light.png b/static/assets/images/master_key_light.png index 7dfd62cfe4..87a041c7a9 100644 Binary files a/static/assets/images/master_key_light.png and b/static/assets/images/master_key_light.png differ