From 859ac46e3275a7a4c1cc8bb7a0351547698981a2 Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Mon, 10 Jan 2022 22:26:13 -0330 Subject: [PATCH 001/115] Remove unused localized messages (#13272) These messages were removed from the `en` locale in #13244, but they were not deleted because that branch was not up-to-date when it was merged, and the translations were recent additions (#13206) --- app/_locales/el/messages.json | 18 ------------------ app/_locales/fr/messages.json | 18 ------------------ app/_locales/hi/messages.json | 18 ------------------ app/_locales/id/messages.json | 18 ------------------ app/_locales/ja/messages.json | 18 ------------------ app/_locales/ko/messages.json | 18 ------------------ app/_locales/ru/messages.json | 18 ------------------ app/_locales/tl/messages.json | 18 ------------------ app/_locales/tr/messages.json | 18 ------------------ app/_locales/vi/messages.json | 18 ------------------ app/_locales/zh_CN/messages.json | 18 ------------------ 11 files changed, 198 deletions(-) diff --git a/app/_locales/el/messages.json b/app/_locales/el/messages.json index 53ebd0f4c..c33171c0e 100644 --- a/app/_locales/el/messages.json +++ b/app/_locales/el/messages.json @@ -1099,21 +1099,6 @@ "message": "Η εισαγωγή αρχείων δεν λειτουργεί; Κάντε κλικ εδώ!", "description": "Helps user import their account from a JSON file" }, - "flaskExperimentalText1": { - "message": "Χρησιμοποιώντας το Flask μπορείτε να αυξήσετε σημαντικά τον κίνδυνο απώλειας κεφαλαίων:" - }, - "flaskExperimentalText2": { - "message": "εάν το χρησιμοποιείτε για να εγκαταστήσετε μη αξιόπιστα Snap" - }, - "flaskExperimentalText3": { - "message": "αν δεν επανεξετάσετε τις επιβεβαιώσεις πριν από την έγκριση αλλαγών" - }, - "flaskExperimentalText4": { - "message": "αν αλληλεπιδράσετε με έξυπνα συμβόλαια με τα οποία δεν είστε εξοικειωμένοι" - }, - "flaskExperimentalText5": { - "message": "Χρησιμοποιώντας το Flask σας δίνεται πολύ μεγαλύτερη διακριτική ευχέρεια στη χρήση της δύναμης του MetaMask, και αυτή η διακριτική ευχέρεια είναι όλη δική σας. Αποδέχεστε αυτούς τους κινδύνους καθώς και επιπλέον ευθύνη για την ασφάλεια του πορτοφολιού σας;" - }, "flaskSnapSettingsCardButtonCta": { "message": "Προβολή λεπτομερειών", "description": "Call to action a user can take to see more information about the Snap that is installed" @@ -3337,9 +3322,6 @@ "usedByClients": { "message": "Χρησιμοποιείται από μια ποικιλία διαφορετικών πελατών" }, - "userAccepts": { - "message": "Αποδέχομαι" - }, "userName": { "message": "Όνομα χρήστη" }, diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json index 22338bfe1..a01a75db8 100644 --- a/app/_locales/fr/messages.json +++ b/app/_locales/fr/messages.json @@ -1099,21 +1099,6 @@ "message": "L'importation de fichier ne fonctionne pas? Cliquez ici!", "description": "Helps user import their account from a JSON file" }, - "flaskExperimentalText1": { - "message": "L’utilisation de Flask peut augmenter considérablement votre risque de perte de fonds :" - }, - "flaskExperimentalText2": { - "message": "si vous l’utilisez pour installer des Snaps non dignes de confiance ;" - }, - "flaskExperimentalText3": { - "message": "si vous ne vérifiez pas les confirmations avant d’approuver des changements ;" - }, - "flaskExperimentalText4": { - "message": "si vous utilisez des contrats intelligents non familiers." - }, - "flaskExperimentalText5": { - "message": "L’utilisation de Flask vous offre une plus grande discrétion quant à l’utilisation de la puissance de MetaMask. Cette discrétion vous appartient. Acceptez-vous ces risques ainsi que de prendre la responsabilité supplémentaire de la sécurité de votre portefeuille ?" - }, "flaskSnapSettingsCardButtonCta": { "message": "Voir les détails", "description": "Call to action a user can take to see more information about the Snap that is installed" @@ -3337,9 +3322,6 @@ "usedByClients": { "message": "Utilisé par une variété de clients différents" }, - "userAccepts": { - "message": "J’accepte" - }, "userName": { "message": "Nom d'utilisateur" }, diff --git a/app/_locales/hi/messages.json b/app/_locales/hi/messages.json index 56ce5b71c..580fbdd35 100644 --- a/app/_locales/hi/messages.json +++ b/app/_locales/hi/messages.json @@ -1099,21 +1099,6 @@ "message": "फ़ाइल आयात काम नहीं कर रहा है? यहाँ क्लिक करें!", "description": "Helps user import their account from a JSON file" }, - "flaskExperimentalText1": { - "message": "फ्लास्क का उपयोग आपके फंड के नुकसान के जोखिम को काफी ज्यादा बढ़ा सकता है।" - }, - "flaskExperimentalText2": { - "message": "यदि आप इसका उपयोग गैर-भरोसेमंद स्नैप इंस्टॉल करने के लिए करते हैं" - }, - "flaskExperimentalText3": { - "message": "बदलाव को स्वीकृति देने से पहले यदि आप पुष्टिकरण की समीक्षा नहीं करते हैं" - }, - "flaskExperimentalText4": { - "message": "यदि आप अपरिचित स्मार्ट अनुबंधों के साथ बातचीत करते हैं" - }, - "flaskExperimentalText5": { - "message": "मेटामास्क की शक्ति का इस्तेमाल करने में फ्लास्क का उपयोग आपको ज़्यादा समझदारी देता है, और वो समझदारी आपकी है। अपने वॉलेट की सुरक्षा के लिए क्या आप इन जोखिमों के साथ साथ अतिरिक्त ज़िम्मेदारियों को भी स्वीकार करते हैं?" - }, "flaskSnapSettingsCardButtonCta": { "message": "विवरण देखें", "description": "Call to action a user can take to see more information about the Snap that is installed" @@ -3337,9 +3322,6 @@ "usedByClients": { "message": "विभिन्न क्लाइंट द्वारा उपयोग किया जाता है" }, - "userAccepts": { - "message": "मुझे स्वीकार है" - }, "userName": { "message": "उपयोगकर्ता" }, diff --git a/app/_locales/id/messages.json b/app/_locales/id/messages.json index ac6d2d019..18ac64d24 100644 --- a/app/_locales/id/messages.json +++ b/app/_locales/id/messages.json @@ -1099,21 +1099,6 @@ "message": "Impor file tidak bekerja? Klik di sini!", "description": "Helps user import their account from a JSON file" }, - "flaskExperimentalText1": { - "message": "Menggunakan Flask dapat sangat meningkatkan risiko kehilangan dana:" - }, - "flaskExperimentalText2": { - "message": "jika Anda menggunakannya untuk memasang Snaps yang tidak tepercaya" - }, - "flaskExperimentalText3": { - "message": "jika Anda tidak meninjau konfirmasi sebelum menyetujui perubahan" - }, - "flaskExperimentalText4": { - "message": "jika Anda berinteraksi dengan kontrak pintar yang tak dikenal" - }, - "flaskExperimentalText5": { - "message": "Menggunakan Flask memberi Anda keleluasaan yang jauh lebih besar dalam menggunakan kekuatan MetaMask, dan keleluasaan itu adalah milik Anda. Apakah Anda menerima risiko ini serta tanggung jawab ekstra untuk keamanan dompet Anda?" - }, "flaskSnapSettingsCardButtonCta": { "message": "Lihat detailnya", "description": "Call to action a user can take to see more information about the Snap that is installed" @@ -3337,9 +3322,6 @@ "usedByClients": { "message": "Digunakan oleh berbagai klien yang berbeda" }, - "userAccepts": { - "message": "Saya menerima" - }, "userName": { "message": "Nama pengguna" }, diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json index 8a12c217b..381b4c943 100644 --- a/app/_locales/ja/messages.json +++ b/app/_locales/ja/messages.json @@ -1099,21 +1099,6 @@ "message": "ファイルのインポートが機能していない場合ここをクリック!", "description": "Helps user import their account from a JSON file" }, - "flaskExperimentalText1": { - "message": "Flaskを使用すると、次の場合に資金が失われるリスクが大幅に増加します。" - }, - "flaskExperimentalText2": { - "message": "信頼できないスナップをインストールするために使用する場合" - }, - "flaskExperimentalText3": { - "message": "変更を承認する前に確認を行わない場合" - }, - "flaskExperimentalText4": { - "message": "不慣れなスマートコントラクトを扱った場合" - }, - "flaskExperimentalText5": { - "message": "Flaskを使用することで、MetaMaskをより自由に使用し、より多くの決定権を握ることができます。これらのリスクと、ウォレットの安全性に対する追加の責任を受け入れますか?" - }, "flaskSnapSettingsCardButtonCta": { "message": "詳細を表示", "description": "Call to action a user can take to see more information about the Snap that is installed" @@ -3337,9 +3322,6 @@ "usedByClients": { "message": "さまざまな異なるクライアントによって使用されています" }, - "userAccepts": { - "message": "同意する" - }, "userName": { "message": "ユーザー名" }, diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index f5e61e319..d2ab73621 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -1099,21 +1099,6 @@ "message": "파일 가져오기가 작동하지 않나요? 여기를 클릭하세요.", "description": "Helps user import their account from a JSON file" }, - "flaskExperimentalText1": { - "message": "Flask를 사용하면 자금 손실 위험이 크게 증가할 수 있습니다." - }, - "flaskExperimentalText2": { - "message": "신뢰할 수 없는 Snap을 설치하는 데 사용하는 경우" - }, - "flaskExperimentalText3": { - "message": "변경을 승인하기 전에 확인을 검토하지 않는 경우" - }, - "flaskExperimentalText4": { - "message": "익숙하지 않은 스마트 계약과 상호 작용하는 경우" - }, - "flaskExperimentalText5": { - "message": "Flask를 사용하면 메타마스크의 기능을 사용하는 데 있어 훨씬 더 큰 재량권을 갖게 되며 그 재량권은 사용자의 몫입니다. 이러한 위험과 지갑의 안전에 대한 추가 책임을 받아들이십니까?" - }, "flaskSnapSettingsCardButtonCta": { "message": "세부 정보 보기", "description": "Call to action a user can take to see more information about the Snap that is installed" @@ -3337,9 +3322,6 @@ "usedByClients": { "message": "다양한 클라이언트에서 사용합니다." }, - "userAccepts": { - "message": "수락합니다." - }, "userName": { "message": "사용자 이름" }, diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json index 6ac373c49..e438e24b0 100644 --- a/app/_locales/ru/messages.json +++ b/app/_locales/ru/messages.json @@ -1099,21 +1099,6 @@ "message": "Импорт файлов не работает? Нажмите здесь!", "description": "Helps user import their account from a JSON file" }, - "flaskExperimentalText1": { - "message": "Использование Flask может значительно увеличить риск потери средств:" - }, - "flaskExperimentalText2": { - "message": "если вы используете его для установки ненадежных привязок;" - }, - "flaskExperimentalText3": { - "message": "если вы не просматриваете подтверждения перед утверждением изменений;" - }, - "flaskExperimentalText4": { - "message": "если вы взаимодействуете с незнакомыми смарт-контрактами." - }, - "flaskExperimentalText5": { - "message": "Flask дает вам гораздо большую свободу действий при использовании возможностей MetaMask, но вы применяете Flask на свой страх и риск. Принимаете ли вы эти риски, а также дополнительную ответственность за безопасность своего кошелька?" - }, "flaskSnapSettingsCardButtonCta": { "message": "См. подробности", "description": "Call to action a user can take to see more information about the Snap that is installed" @@ -3337,9 +3322,6 @@ "usedByClients": { "message": "Используется множеством разных клиентов" }, - "userAccepts": { - "message": "Я согласен(-на)" - }, "userName": { "message": "Имя пользователя" }, diff --git a/app/_locales/tl/messages.json b/app/_locales/tl/messages.json index e1c76e2b0..5f9eb4d03 100644 --- a/app/_locales/tl/messages.json +++ b/app/_locales/tl/messages.json @@ -1099,21 +1099,6 @@ "message": "Hindi gumagana ang pag-import ng file? Mag-click dito!", "description": "Helps user import their account from a JSON file" }, - "flaskExperimentalText1": { - "message": "Ang paggamit ng Flask ay maaaring lubos na magpataas ang iyong panganib ng pagkawala ng pondo:" - }, - "flaskExperimentalText2": { - "message": "kung ginagamit mo ito para mag-install ng mga hindi mapagkakatiwalaang Snap" - }, - "flaskExperimentalText3": { - "message": "kung ayaw mong i-review ang mga kumpirmasyon bago maaprubahan ang mga pagbabago" - }, - "flaskExperimentalText4": { - "message": "kapag nakipag-usap ka sa di kilalang mga smart contract" - }, - "flaskExperimentalText5": { - "message": "Ang paggamit ng Flask ay nagbibigay sa iyo ng higit na pagpapasya sa paggamit ng kapangyarihan ng MetaMask, at ang pagpapasya na iyon ay sa iyo. Tinatanggap mo ba ang mga panganib na ito pati na rin ang karagdagang responsibilidad para sa kaligtasan ng iyong wallet?" - }, "flaskSnapSettingsCardButtonCta": { "message": "Tingnan ang mga detalye", "description": "Call to action a user can take to see more information about the Snap that is installed" @@ -3337,9 +3322,6 @@ "usedByClients": { "message": "Ginagamit ng iba't ibang client" }, - "userAccepts": { - "message": "Tinatanggap ko" - }, "userName": { "message": "Username" }, diff --git a/app/_locales/tr/messages.json b/app/_locales/tr/messages.json index 32efe261a..2fc5cba1c 100644 --- a/app/_locales/tr/messages.json +++ b/app/_locales/tr/messages.json @@ -1099,21 +1099,6 @@ "message": "Dosya alma çalışmıyor mu? Buraya tıklayın!", "description": "Helps user import their account from a JSON file" }, - "flaskExperimentalText1": { - "message": "Flask kullanmak para kaybı riskinizi yüksek oranda artırabilir:" - }, - "flaskExperimentalText2": { - "message": "güvenilir olmayan Sanpl'leri yüklemek için kullanırsanız" - }, - "flaskExperimentalText3": { - "message": "değişiklikleri kabul etmeden önce onayları incelemezseniz" - }, - "flaskExperimentalText4": { - "message": "alışkın olmadığınız akıllı sözleşmelerle uğraşırsanız" - }, - "flaskExperimentalText5": { - "message": "Flask kullanmak MetaMask'ın gücünü kullanmada size çok daha fazla gizlilik sağlar ve bu gizlilik tamamen size özeldir. Bu riskleri ve ayrıca cüzdanınızın güvenliği için ekstra sorumluluğu kabul ediyor musunuz?" - }, "flaskSnapSettingsCardButtonCta": { "message": "Ayrıntılara bakın", "description": "Call to action a user can take to see more information about the Snap that is installed" @@ -3337,9 +3322,6 @@ "usedByClients": { "message": "Farklı istemciler tarafından kullanılmakta" }, - "userAccepts": { - "message": "Kabul ediyorum" - }, "userName": { "message": "Kullanıcı adı" }, diff --git a/app/_locales/vi/messages.json b/app/_locales/vi/messages.json index a38e86a55..060c5e485 100644 --- a/app/_locales/vi/messages.json +++ b/app/_locales/vi/messages.json @@ -1099,21 +1099,6 @@ "message": "Tính năng nhập tệp không hoạt động? Nhấp vào đây!", "description": "Helps user import their account from a JSON file" }, - "flaskExperimentalText1": { - "message": "Sử dụng Flask có thể gia tăng đáng kể nguy cơ mất tiền của bạn:" - }, - "flaskExperimentalText2": { - "message": "nếu bạn sử dụng để cài đặt Snaps không đáng tin cậy" - }, - "flaskExperimentalText3": { - "message": "nếu bạn không xem lại xác nhận trước khi chấp thuận các thay đổi" - }, - "flaskExperimentalText4": { - "message": "nếu bạn tương tác với những hợp đồng thông minh không quen thuộc" - }, - "flaskExperimentalText5": { - "message": "Sử dụng Flask cho phép bạn toàn quyền quyết định trong việc sử dụng sức mạnh của MetaMask và quyền đó là của bạn. Bạn có chấp nhận những nguy cơ này cũng như phải chịu thêm trách nhiệm cho sự an toàn của ví không?" - }, "flaskSnapSettingsCardButtonCta": { "message": "Xem chi tiết", "description": "Call to action a user can take to see more information about the Snap that is installed" @@ -3337,9 +3322,6 @@ "usedByClients": { "message": "Được nhiều ví khác nhau sử dụng" }, - "userAccepts": { - "message": "Tôi chấp nhận" - }, "userName": { "message": "Tên người dùng" }, diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index cec91fbfb..d1fb4e637 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -1099,21 +1099,6 @@ "message": "文件导入失败? 点击这里!", "description": "Helps user import their account from a JSON file" }, - "flaskExperimentalText1": { - "message": "使用Flask可极大地增加您的资金损失风险:" - }, - "flaskExperimentalText2": { - "message": "如果您使用它来安装不可信的快照" - }, - "flaskExperimentalText3": { - "message": "如果您在批准更改之前不审核确认" - }, - "flaskExperimentalText4": { - "message": "如果您与不熟悉的智能合同发生交互作用" - }, - "flaskExperimentalText5": { - "message": "使用Flask让您在使用Metamask的力量时拥有更大的自由裁量权,这个自由裁量权由您决定。 您是否接受这些风险以及您钱包安全的额外责任?" - }, "flaskSnapSettingsCardButtonCta": { "message": "查看详细信息", "description": "Call to action a user can take to see more information about the Snap that is installed" @@ -3337,9 +3322,6 @@ "usedByClients": { "message": "可用于各种不同的客户端" }, - "userAccepts": { - "message": "我接受" - }, "userName": { "message": "名称" }, From 14704917c6ade4a7754898ad66fec7a687a08ddd Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Tue, 11 Jan 2022 15:02:17 -0330 Subject: [PATCH 002/115] Update Bug Report issue template (#13267) The "Bug Report" issue template now uses the new "issue form" GitHub feature[1], which allows creating issues using a web form. This form should be more effective in encouraging submitters to fill out the required fields. This form includes a new field for error messages or log output, and for the build type the user was using (e.g. Flask). [1]: https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository#creating-issue-forms --- .github/ISSUE_TEMPLATE/bug-report.md | 37 ---------- .github/ISSUE_TEMPLATE/bug-report.yml | 97 +++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 37 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug-report.md create mode 100644 .github/ISSUE_TEMPLATE/bug-report.yml diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md deleted file mode 100644 index 68cad1c32..000000000 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -name: Bug Report -about: Using MetaMask, but it's not working as you expect? - ---- - - - -**Describe the bug** -A clear and concise description of what the bug is. - -**Steps to reproduce (REQUIRED)** -Steps to reproduce the behavior, libraries used with version number, and/or any setup information to easily reproduce: - -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Browser details (please complete the following information):** - - OS: [e.g. OS X, Windows] - - Hardware Wallet: [e.g. Trezor Firmware version 1.8.3, Ledger Nano S Firmware version 1.6.0] - - Browser: [e.g. Chrome Version 79.0.3945.79 (Official Build) (64-bit), Firefox Browser 71.0 (64-bit)] - - MetaMask Version: [e.g. 5.0.2 - find it in Settings > About] - -**Additional context (Error Messages, etc.)** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 000000000..cb38aaf16 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,97 @@ +name: Bug Report +description: Using MetaMask, but it's not working as you expect? +title: "[Bug]: " +labels: ["bug"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! + + ## **Before Submitting:** + + * Please search to make sure this issue has not been opened already. + * If this is a question about how to integrate MetaMask with your project, please ask in our [Community forum](https://community.metamask.io/c/developer-questions/) instead. This will get your question answered more quickly and make it easier for other devs to find the answer in the future. + - type: textarea + id: what-happened + attributes: + label: Describe the bug + description: What happened? What did you expect to happen? Please include screenshots if applicable! + placeholder: Tell us what you see! + validations: + required: true + - type: textarea + id: reproduce + attributes: + label: Steps to reproduce + description: List all steps needed to reproduce the problem + value: | + 1. + validations: + required: true + - type: textarea + id: error + attributes: + label: Error messages or log output + description: Please copy and paste any relevant error messages or log output. This will be automatically formatted, so there is no need for backticks. + render: shell + - type: input + id: version + attributes: + label: Version + description: What version of MetaMask are you running? You can find the version in "Settings" > "About" + validations: + required: true + - type: dropdown + id: build + attributes: + label: Build type + description: Are you using a testing or development build of MetaMask? If so, please select the type of build you are using. + options: + - Beta + - Flask + - Other (please specify exactly where you obtained this build in "Additional Context" section) + - type: dropdown + id: browsers + attributes: + label: Browser + description: Which browsers have you seen the problem on? + multiple: true + options: + - Chrome + - Firefox + - Microsoft Edge + - Brave + - Other (please elaborate in the "Additional Context" section) + validations: + required: true + - type: dropdown + id: os + attributes: + label: Operating system + description: Which operating systems have you seen the problem on? + multiple: true + options: + - Windows + - MacOS + - Linux + - Other (please elaborate in the "Additional Context" section) + validations: + required: true + - type: dropdown + id: hardware-wallet + attributes: + label: Hardware wallet + description: Are you using any of these hardware wallets? Please include the firmware version in the "Additional context" section below for any that you select here. + multiple: true + options: + - Ledger + - Trezor + - Keystone + - GridPlus Lattice1 + - Other (please elaborate in the "Additional Context" section) + - type: textarea + id: additional + attributes: + label: Additional context + description: Add any other context about the problem here, e.g. related issues, additional error messages or logs, or any potentially relevant details about the environment or situation the bug occurred in. From 88faef7e19228652e2bfb339ffc3392926ee985d Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Wed, 12 Jan 2022 00:47:56 +0530 Subject: [PATCH 003/115] Adding user setting option for EIP-1559 V2 (#13242) --- app/_locales/en/messages.json | 16 ++++ app/scripts/controllers/app-state.js | 12 +++ app/scripts/controllers/preferences.js | 9 ++ app/scripts/controllers/transactions/index.js | 7 +- app/scripts/metamask-controller.js | 6 ++ ui/components/app/app-components.scss | 1 + ...m-page-container-content.component.test.js | 3 +- .../confirm-page-container.component.js | 2 + .../enableEIP1559V2-notice.js | 94 +++++++++++++++++++ .../enableEIP1559V2-notice/index.js | 1 + .../enableEIP1559V2-notice/index.scss | 33 +++++++ .../edit-gas-fee-button.test.js | 9 +- .../transaction-detail.component.test.js | 9 +- .../transaction-list-item.component.js | 10 +- ui/ducks/metamask/metamask.js | 4 + ui/hooks/gasFeeInput/test-utils.js | 5 + ui/hooks/gasFeeInput/useGasFeeInputs.js | 7 +- ui/hooks/gasFeeInput/useGasFeeInputs.test.js | 6 +- ui/pages/confirm-approve/confirm-approve.js | 9 +- .../confirm-transaction-base.component.js | 7 +- .../confirm-transaction-base.container.js | 3 + .../experimental-tab.component.js | 55 ++++++++++- .../experimental-tab.container.js | 4 + ui/pages/settings/index.scss | 4 + ui/pages/swaps/fee-card/fee-card.test.js | 6 +- ui/pages/swaps/view-quote/view-quote.js | 9 +- ui/selectors/selectors.js | 4 + ui/store/actions.js | 16 ++++ 28 files changed, 297 insertions(+), 54 deletions(-) create mode 100644 ui/components/app/confirm-page-container/enableEIP1559V2-notice/enableEIP1559V2-notice.js create mode 100644 ui/components/app/confirm-page-container/enableEIP1559V2-notice/index.js create mode 100644 ui/components/app/confirm-page-container/enableEIP1559V2-notice/index.scss diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 08de0b075..fadb4033f 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -933,6 +933,22 @@ "enableAutoDetect": { "message": " Enable Autodetect" }, + "enableEIP1559V2": { + "message": "Enable Enhanced Gas Fee UI" + }, + "enableEIP1559V2AlertMessage": { + "message": "We've updated how gas fee estimation and customization works." + }, + "enableEIP1559V2ButtonText": { + "message": "Turn on Enhanced Gas Fee UI in Settings" + }, + "enableEIP1559V2Description": { + "message": "We've updated how gas estimation and customization works. Turn on if you'd like to use the new gas experience. $1", + "description": "$1 here is Learn More link" + }, + "enableEIP1559V2Header": { + "message": "New gas experience" + }, "enableFromSettings": { "message": " Enable it from Settings." }, diff --git a/app/scripts/controllers/app-state.js b/app/scripts/controllers/app-state.js index 4d9ef9ebe..3ddc7b858 100644 --- a/app/scripts/controllers/app-state.js +++ b/app/scripts/controllers/app-state.js @@ -31,6 +31,7 @@ export default class AppStateController extends EventEmitter { recoveryPhraseReminderHasBeenShown: false, recoveryPhraseReminderLastShown: new Date().getTime(), collectiblesDetectionNoticeDismissed: false, + enableEIP1559V2NoticeDismissed: false, showTestnetMessageInDropdown: true, trezorModel: null, ...initState, @@ -270,4 +271,15 @@ export default class AppStateController extends EventEmitter { collectiblesDetectionNoticeDismissed, }); } + + /** + * A setter for the `enableEIP1559V2NoticeDismissed` property + * + * @param enableEIP1559V2NoticeDismissed + */ + setEnableEIP1559V2NoticeDismissed(enableEIP1559V2NoticeDismissed) { + this.store.updateState({ + enableEIP1559V2NoticeDismissed, + }); + } } diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index c51e7d46a..037359453 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -167,6 +167,15 @@ export default class PreferencesController { this.store.updateState({ advancedGasFee: val }); } + /** + * Setter for the `eip1559V2Enabled` property + * + * @param {object} val - holds the eip1559V2Enabled that the user set as experimental settings. + */ + setEIP1559V2Enabled(val) { + this.store.updateState({ eip1559V2Enabled: val }); + } + /** * Add new methodData to state, to avoid requesting this information again through Infura * diff --git a/app/scripts/controllers/transactions/index.js b/app/scripts/controllers/transactions/index.js index 555d892e3..09f5f94c0 100644 --- a/app/scripts/controllers/transactions/index.js +++ b/app/scripts/controllers/transactions/index.js @@ -441,7 +441,8 @@ export default class TransactionController extends EventEmitter { } if (eip1559Compatibility) { - if (process.env.EIP_1559_V2 && Boolean(advancedGasFeeDefaultValues)) { + const { eip1559V2Enabled } = this.preferencesStore.getState(); + if (eip1559V2Enabled && Boolean(advancedGasFeeDefaultValues)) { txMeta.userFeeLevel = CUSTOM_GAS_ESTIMATE; txMeta.txParams.maxFeePerGas = decGWEIToHexWEI( advancedGasFeeDefaultValues.maxBaseFee, @@ -458,7 +459,7 @@ export default class TransactionController extends EventEmitter { // then we set maxFeePerGas and maxPriorityFeePerGas to the suggested gasPrice. txMeta.txParams.maxFeePerGas = txMeta.txParams.gasPrice; txMeta.txParams.maxPriorityFeePerGas = txMeta.txParams.gasPrice; - if (process.env.EIP_1559_V2) { + if (eip1559V2Enabled) { txMeta.userFeeLevel = PRIORITY_LEVELS.DAPP_SUGGESTED; } else { txMeta.userFeeLevel = CUSTOM_GAS_ESTIMATE; @@ -472,7 +473,7 @@ export default class TransactionController extends EventEmitter { txMeta.origin === 'metamask' ) { txMeta.userFeeLevel = GAS_RECOMMENDATIONS.MEDIUM; - } else if (process.env.EIP_1559_V2) { + } else if (eip1559V2Enabled) { txMeta.userFeeLevel = PRIORITY_LEVELS.DAPP_SUGGESTED; } else { txMeta.userFeeLevel = CUSTOM_GAS_ESTIMATE; diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 528c36d55..f5ef9cfef 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -1188,6 +1188,9 @@ export default class MetamaskController extends EventEmitter { setAdvancedGasFee: preferencesController.setAdvancedGasFee.bind( preferencesController, ), + setEIP1559V2Enabled: preferencesController.setEIP1559V2Enabled.bind( + preferencesController, + ), // CollectiblesController addCollectible: collectiblesController.addCollectible.bind( @@ -1246,6 +1249,9 @@ export default class MetamaskController extends EventEmitter { setCollectiblesDetectionNoticeDismissed: appStateController.setCollectiblesDetectionNoticeDismissed.bind( appStateController, ), + setEnableEIP1559V2NoticeDismissed: appStateController.setEnableEIP1559V2NoticeDismissed.bind( + appStateController, + ), // EnsController tryReverseResolveAddress: ensController.reverseResolveAddress.bind( ensController, diff --git a/ui/components/app/app-components.scss b/ui/components/app/app-components.scss index 87e0b8921..2327f7d01 100644 --- a/ui/components/app/app-components.scss +++ b/ui/components/app/app-components.scss @@ -9,6 +9,7 @@ @import 'asset-list-item/asset-list-item'; @import 'cancel-speedup-popover/index'; @import 'confirm-page-container/index'; +@import 'confirm-page-container/enableEIP1559V2-notice'; @import 'collectibles-items/index'; @import 'collectibles-tab/index'; @import 'collectible-details/index'; diff --git a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.test.js b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.test.js index 3ccdb21e9..5b86da60f 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.test.js +++ b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.test.js @@ -11,6 +11,7 @@ describe('Confirm Page Container Content', () => { provider: { type: 'test', }, + eip1559V2Enabled: false, }, }; @@ -41,8 +42,6 @@ describe('Confirm Page Container Content', () => { }); it('render ConfirmPageContainer component with simulation error', async () => { - process.env.EIP_1559_V2 = false; - const { queryByText, getByText } = renderWithProvider( , store, diff --git a/ui/components/app/confirm-page-container/confirm-page-container.component.js b/ui/components/app/confirm-page-container/confirm-page-container.component.js index 7767159ed..dc23050e9 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container.component.js +++ b/ui/components/app/confirm-page-container/confirm-page-container.component.js @@ -16,6 +16,7 @@ import AdvancedGasFeePopover from '../advanced-gas-fee-popover'; import EditGasFeePopover from '../edit-gas-fee-popover/edit-gas-fee-popover'; import EditGasPopover from '../edit-gas-popover'; +import EnableEIP1559V2Notice from './enableEIP1559V2-notice'; import { ConfirmPageContainerHeader, ConfirmPageContainerContent, @@ -204,6 +205,7 @@ export default class ConfirmPageContainer extends Component { )} + {contentComponent || ( + + + + + + + ); +} + +EnableEIP1559V2Notice.propTypes = { + isFirstAlert: PropTypes.bool, +}; diff --git a/ui/components/app/confirm-page-container/enableEIP1559V2-notice/index.js b/ui/components/app/confirm-page-container/enableEIP1559V2-notice/index.js new file mode 100644 index 000000000..c616b7286 --- /dev/null +++ b/ui/components/app/confirm-page-container/enableEIP1559V2-notice/index.js @@ -0,0 +1 @@ +export { default } from './enableEIP1559V2-notice'; diff --git a/ui/components/app/confirm-page-container/enableEIP1559V2-notice/index.scss b/ui/components/app/confirm-page-container/enableEIP1559V2-notice/index.scss new file mode 100644 index 000000000..9615bd0ac --- /dev/null +++ b/ui/components/app/confirm-page-container/enableEIP1559V2-notice/index.scss @@ -0,0 +1,33 @@ +.enableEIP1559V2-notice { + &__dialog { + position: relative; + } + + &__close-button { + background-color: transparent; + position: absolute; + right: 0; + top: 0; + + &::after { + position: absolute; + content: '\00D7'; + font-size: 29px; + font-weight: 200; + color: var(--black); + background-color: transparent; + top: 0; + right: 12px; + cursor: pointer; + } + } + + a.enableEIP1559V2-notice__link { + @include H7; + + padding: 0; + justify-content: flex-start; + font-weight: bold; + font-size: 0.75rem; + } +} diff --git a/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.test.js b/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.test.js index 25e070d41..5c08fe457 100644 --- a/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.test.js +++ b/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.test.js @@ -35,6 +35,7 @@ const render = ({ componentProps, contextProps } = {}) => { }, }, gasFeeEstimates: mockEstimates[GAS_ESTIMATE_TYPES.FEE_MARKET], + eip1559V2Enabled: true, }, }); @@ -47,14 +48,6 @@ const render = ({ componentProps, contextProps } = {}) => { }; describe('EditGasFeeButton', () => { - beforeEach(() => { - process.env.EIP_1559_V2 = true; - }); - - afterEach(() => { - process.env.EIP_1559_V2 = false; - }); - it('should render edit link with text low if low gas estimates are selected', () => { render({ contextProps: { transaction: { userFeeLevel: 'low' } } }); expect(screen.queryByText('🐢')).toBeInTheDocument(); diff --git a/ui/components/app/transaction-detail/transaction-detail.component.test.js b/ui/components/app/transaction-detail/transaction-detail.component.test.js index 5850a2a15..7a0396377 100644 --- a/ui/components/app/transaction-detail/transaction-detail.component.test.js +++ b/ui/components/app/transaction-detail/transaction-detail.component.test.js @@ -31,6 +31,7 @@ const render = ({ componentProps, contextProps } = {}) => { }, }, gasFeeEstimates: mockEstimates[GAS_ESTIMATE_TYPES.FEE_MARKET], + eip1559V2Enabled: true, }, }); @@ -50,14 +51,6 @@ const render = ({ componentProps, contextProps } = {}) => { }; describe('TransactionDetail', () => { - beforeEach(() => { - process.env.EIP_1559_V2 = true; - }); - - afterEach(() => { - process.env.EIP_1559_V2 = false; - }); - it('should render edit link with text low if low gas estimates are selected', () => { render({ contextProps: { transaction: { userFeeLevel: 'low' } } }); expect(screen.queryByText('🐢')).toBeInTheDocument(); diff --git a/ui/components/app/transaction-list-item/transaction-list-item.component.js b/ui/components/app/transaction-list-item/transaction-list-item.component.js index 0fc8e7542..cb6752309 100644 --- a/ui/components/app/transaction-list-item/transaction-list-item.component.js +++ b/ui/components/app/transaction-list-item/transaction-list-item.component.js @@ -26,7 +26,10 @@ import { TransactionModalContextProvider, useTransactionModalContext, } from '../../../contexts/transaction-modal'; -import { checkNetworkAndAccountSupports1559 } from '../../../selectors'; +import { + checkNetworkAndAccountSupports1559, + getEIP1559V2Enabled, +} from '../../../selectors'; import { isLegacyTransaction } from '../../../helpers/utils/transactions.util'; import { useMetricEvent } from '../../../hooks/useMetricEvent'; import Button from '../../ui/button'; @@ -280,14 +283,13 @@ const TransactionListItem = (props) => { const { transactionGroup } = props; const [editGasMode, setEditGasMode] = useState(); const transaction = transactionGroup.primaryTransaction; - const EIP_1559_V2_ENABLED = - process.env.EIP_1559_V2 === true || process.env.EIP_1559_V2 === 'true'; + const eip1559V2Enabled = useSelector(getEIP1559V2Enabled); const supportsEIP1559 = useSelector(checkNetworkAndAccountSupports1559) && !isLegacyTransaction(transaction?.txParams); - const supportsEIP1559V2 = EIP_1559_V2_ENABLED && supportsEIP1559; + const supportsEIP1559V2 = eip1559V2Enabled && supportsEIP1559; return ( { const { metamask: { diff --git a/ui/hooks/gasFeeInput/test-utils.js b/ui/hooks/gasFeeInput/test-utils.js index 117d4f7cc..926cb757f 100644 --- a/ui/hooks/gasFeeInput/test-utils.js +++ b/ui/hooks/gasFeeInput/test-utils.js @@ -12,6 +12,7 @@ import { import { checkNetworkAndAccountSupports1559, getCurrentCurrency, + getEIP1559V2Enabled, getSelectedAccount, getShouldShowFiat, getPreferences, @@ -96,6 +97,7 @@ export const HIGH_FEE_MARKET_ESTIMATE_RETURN_VALUE = { export const generateUseSelectorRouter = ({ checkNetworkAndAccountSupports1559Response, shouldShowFiat = true, + eip1559V2Enabled = false, } = {}) => (selector) => { if (selector === getConversionRate) { return MOCK_ETH_USD_CONVERSION_RATE; @@ -135,6 +137,9 @@ export const generateUseSelectorRouter = ({ if (selector === checkNetworkAndAccountSupports1559) { return checkNetworkAndAccountSupports1559Response; } + if (selector === getEIP1559V2Enabled) { + return eip1559V2Enabled; + } return undefined; }; diff --git a/ui/hooks/gasFeeInput/useGasFeeInputs.js b/ui/hooks/gasFeeInput/useGasFeeInputs.js index 63b5b3fe6..3e076076a 100644 --- a/ui/hooks/gasFeeInput/useGasFeeInputs.js +++ b/ui/hooks/gasFeeInput/useGasFeeInputs.js @@ -11,6 +11,7 @@ import { GAS_FORM_ERRORS } from '../../helpers/constants/gas'; import { checkNetworkAndAccountSupports1559, getAdvancedInlineGasShown, + getEIP1559V2Enabled, } from '../../selectors'; import { hexToDecimal } from '../../helpers/utils/conversions.util'; import { isLegacyTransaction } from '../../helpers/utils/transactions.util'; @@ -93,15 +94,13 @@ export function useGasFeeInputs( minimumGasLimit = '0x5208', editGasMode = EDIT_GAS_MODES.MODIFY_IN_PLACE, ) { - const EIP_1559_V2_ENABLED = - // This is a string in unit tests but is a boolean in the browser - process.env.EIP_1559_V2 === true || process.env.EIP_1559_V2 === 'true'; + const eip1559V2Enabled = useSelector(getEIP1559V2Enabled); const supportsEIP1559 = useSelector(checkNetworkAndAccountSupports1559) && !isLegacyTransaction(transaction?.txParams); - const supportsEIP1559V2 = supportsEIP1559 && EIP_1559_V2_ENABLED; + const supportsEIP1559V2 = supportsEIP1559 && eip1559V2Enabled; // We need the gas estimates from the GasFeeController in the background. // Calling this hooks initiates polling for new gas estimates and returns the diff --git a/ui/hooks/gasFeeInput/useGasFeeInputs.test.js b/ui/hooks/gasFeeInput/useGasFeeInputs.test.js index 8b3f1e9e3..c3c722c18 100644 --- a/ui/hooks/gasFeeInput/useGasFeeInputs.test.js +++ b/ui/hooks/gasFeeInput/useGasFeeInputs.test.js @@ -324,13 +324,9 @@ describe('useGasFeeInputs', () => { useSelector.mockImplementation( generateUseSelectorRouter({ checkNetworkAndAccountSupports1559Response: true, + eip1559V2Enabled: true, }), ); - process.env.EIP_1559_V2 = true; - }); - - afterEach(() => { - process.env.EIP_1559_V2 = false; }); it('return true for fee_market transaction type', () => { diff --git a/ui/pages/confirm-approve/confirm-approve.js b/ui/pages/confirm-approve/confirm-approve.js index 20ad652d2..b8b5bb287 100644 --- a/ui/pages/confirm-approve/confirm-approve.js +++ b/ui/pages/confirm-approve/confirm-approve.js @@ -35,6 +35,7 @@ import { getRpcPrefsForCurrentProvider, getIsMultiLayerFeeNetwork, checkNetworkAndAccountSupports1559, + getEIP1559V2Enabled, } from '../../selectors'; import { useApproveTransaction } from '../../hooks/useApproveTransaction'; import { currentNetworkTxListSelector } from '../../selectors/transactions'; @@ -50,10 +51,6 @@ const isAddressLedgerByFromAddress = (address) => (state) => { return isAddressLedger(state, address); }; -// eslint-disable-next-line prefer-destructuring -const EIP_1559_V2_ENABLED = - process.env.EIP_1559_V2 === true || process.env.EIP_1559_V2 === 'true'; - export default function ConfirmApprove() { const dispatch = useDispatch(); const { id: paramsTransactionId } = useParams(); @@ -89,8 +86,8 @@ export default function ConfirmApprove() { hexTransactionTotal, } = useSelector((state) => transactionFeeSelector(state, transaction)); - const supportsEIP1559V2 = - EIP_1559_V2_ENABLED && networkAndAccountSupports1559; + const eip1559V2Enabled = useSelector(getEIP1559V2Enabled); + const supportsEIP1559V2 = eip1559V2Enabled && networkAndAccountSupports1559; const currentToken = (tokens && tokens.find(({ address }) => diff --git a/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js index efbd680a4..67e53af49 100644 --- a/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js +++ b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js @@ -63,10 +63,6 @@ import { MIN_GAS_LIMIT_DEC } from '../send/send.constants'; import TransactionAlerts from './transaction-alerts'; -// eslint-disable-next-line prefer-destructuring -const EIP_1559_V2_ENABLED = - process.env.EIP_1559_V2 === true || process.env.EIP_1559_V2 === 'true'; - const renderHeartBeatIfNotInTest = () => process.env.IN_TEST ? null : ; @@ -147,6 +143,7 @@ export default class ConfirmTransactionBase extends Component { supportsEIP1559: PropTypes.bool, hardwareWalletRequiresConnection: PropTypes.bool, isMultiLayerFeeNetwork: PropTypes.bool, + eip1559V2Enabled: PropTypes.bool, }; state = { @@ -974,7 +971,7 @@ export default class ConfirmTransactionBase extends Component { } supportsEIP1559V2 = - EIP_1559_V2_ENABLED && + this.props.eip1559V2Enabled && this.props.supportsEIP1559 && !isLegacyTransaction(this.props.txData); diff --git a/ui/pages/confirm-transaction-base/confirm-transaction-base.container.js b/ui/pages/confirm-transaction-base/confirm-transaction-base.container.js index 03ddd85f1..8b13a1034 100644 --- a/ui/pages/confirm-transaction-base/confirm-transaction-base.container.js +++ b/ui/pages/confirm-transaction-base/confirm-transaction-base.container.js @@ -36,6 +36,7 @@ import { getUseTokenDetection, getTokenList, getIsMultiLayerFeeNetwork, + getEIP1559V2Enabled, } from '../../selectors'; import { getMostRecentOverviewPage } from '../../ducks/history/history'; import { @@ -197,6 +198,7 @@ const mapStateToProps = (state, ownProps) => { ); const isMultiLayerFeeNetwork = getIsMultiLayerFeeNetwork(state); + const eip1559V2Enabled = getEIP1559V2Enabled(state); return { balance, @@ -248,6 +250,7 @@ const mapStateToProps = (state, ownProps) => { hardwareWalletRequiresConnection, isMultiLayerFeeNetwork, chainId, + eip1559V2Enabled, }; }; diff --git a/ui/pages/settings/experimental-tab/experimental-tab.component.js b/ui/pages/settings/experimental-tab/experimental-tab.component.js index 1dc9cb549..212d8bbb5 100644 --- a/ui/pages/settings/experimental-tab/experimental-tab.component.js +++ b/ui/pages/settings/experimental-tab/experimental-tab.component.js @@ -14,7 +14,9 @@ export default class ExperimentalTab extends PureComponent { useCollectibleDetection: PropTypes.bool, setUseCollectibleDetection: PropTypes.func, setOpenSeaEnabled: PropTypes.func, - openSeaEnabled: PropTypes.func, + openSeaEnabled: PropTypes.bool, + eip1559V2Enabled: PropTypes.bool, + setEIP1559V2Enabled: PropTypes.func, }; renderTokenDetectionToggle() { @@ -134,12 +136,63 @@ export default class ExperimentalTab extends PureComponent { ); } + renderEIP1559V2EnabledToggle() { + const EIP_1559_V2_ENABLED = + // This is a string in unit tests but is a boolean in the browser + process.env.EIP_1559_V2 === true || process.env.EIP_1559_V2 === 'true'; + if (!EIP_1559_V2_ENABLED) { + return null; + } + const { t } = this.context; + const { eip1559V2Enabled, setEIP1559V2Enabled } = this.props; + + return ( +
+
+ {t('enableEIP1559V2')} +
+ {t('enableEIP1559V2Description', [ + + {t('learnMoreUpperCase')} + , + ])} +
+
+
+
+ { + this.context.metricsEvent({ + eventOpts: { + category: 'Settings', + action: 'Enabled/Disable OpenSea', + name: 'Enabled/Disable OpenSea', + }, + }); + setEIP1559V2Enabled(!value); + }} + offLabel={t('off')} + onLabel={t('on')} + /> +
+
+
+ ); + } + render() { return (
{this.renderTokenDetectionToggle()} {this.renderOpenSeaEnabledToggle()} {this.renderCollectibleDetectionToggle()} + {this.renderEIP1559V2EnabledToggle()}
); } diff --git a/ui/pages/settings/experimental-tab/experimental-tab.container.js b/ui/pages/settings/experimental-tab/experimental-tab.container.js index ac26f10ab..195d01e88 100644 --- a/ui/pages/settings/experimental-tab/experimental-tab.container.js +++ b/ui/pages/settings/experimental-tab/experimental-tab.container.js @@ -5,11 +5,13 @@ import { setUseTokenDetection, setUseCollectibleDetection, setOpenSeaEnabled, + setEIP1559V2Enabled, } from '../../../store/actions'; import { getUseTokenDetection, getUseCollectibleDetection, getOpenSeaEnabled, + getEIP1559V2Enabled, } from '../../../selectors'; import ExperimentalTab from './experimental-tab.component'; @@ -18,6 +20,7 @@ const mapStateToProps = (state) => { useTokenDetection: getUseTokenDetection(state), useCollectibleDetection: getUseCollectibleDetection(state), openSeaEnabled: getOpenSeaEnabled(state), + eip1559V2Enabled: getEIP1559V2Enabled(state), }; }; @@ -27,6 +30,7 @@ const mapDispatchToProps = (dispatch) => { setUseCollectibleDetection: (val) => dispatch(setUseCollectibleDetection(val)), setOpenSeaEnabled: (val) => dispatch(setOpenSeaEnabled(val)), + setEIP1559V2Enabled: (val) => dispatch(setEIP1559V2Enabled(val)), }; }; diff --git a/ui/pages/settings/index.scss b/ui/pages/settings/index.scss index b10a15b37..78b4af992 100644 --- a/ui/pages/settings/index.scss +++ b/ui/pages/settings/index.scss @@ -205,6 +205,10 @@ color: var(--dusty-gray); padding-top: 5px; + + a { + color: var(--Blue-500); + } } &__content-item-col { diff --git a/ui/pages/swaps/fee-card/fee-card.test.js b/ui/pages/swaps/fee-card/fee-card.test.js index 27dba700d..16f43da8d 100644 --- a/ui/pages/swaps/fee-card/fee-card.test.js +++ b/ui/pages/swaps/fee-card/fee-card.test.js @@ -14,6 +14,7 @@ import { MAINNET_CHAIN_ID } from '../../../../shared/constants/network'; import { checkNetworkAndAccountSupports1559, + getEIP1559V2Enabled, getPreferences, getSelectedAccount, } from '../../../selectors'; @@ -133,7 +134,6 @@ describe('FeeCard', () => { }); it('renders the component with EIP-1559 V2 enabled', () => { - process.env.EIP_1559_V2 = true; useGasFeeEstimates.mockImplementation(() => ({ gasFeeEstimates: {} })); useSelector.mockImplementation((selector) => { if (selector === getPreferences) { @@ -141,6 +141,9 @@ describe('FeeCard', () => { useNativeCurrencyAsPrimaryCurrency: true, }; } + if (selector === getEIP1559V2Enabled) { + return true; + } if (selector === getSelectedAccount) { return { balance: '0x440aa47cc2556', @@ -180,6 +183,5 @@ describe('FeeCard', () => { expect( document.querySelector('.fee-card__top-bordered-row'), ).toMatchSnapshot(); - process.env.EIP_1559_V2 = false; }); }); diff --git a/ui/pages/swaps/view-quote/view-quote.js b/ui/pages/swaps/view-quote/view-quote.js index 47dbaaf6e..d2fb50d93 100644 --- a/ui/pages/swaps/view-quote/view-quote.js +++ b/ui/pages/swaps/view-quote/view-quote.js @@ -46,6 +46,7 @@ import { isHardwareWallet, getHardwareWalletType, checkNetworkAndAccountSupports1559, + getEIP1559V2Enabled, } from '../../../selectors'; import { getNativeCurrency, getTokens } from '../../../ducks/metamask/metamask'; @@ -103,15 +104,12 @@ import CountdownTimer from '../countdown-timer'; import SwapsFooter from '../swaps-footer'; import ViewQuotePriceDifference from './view-quote-price-difference'; -// eslint-disable-next-line prefer-destructuring -const EIP_1559_V2_ENABLED = - process.env.EIP_1559_V2 === true || process.env.EIP_1559_V2 === 'true'; - export default function ViewQuote() { const history = useHistory(); const dispatch = useDispatch(); const t = useContext(I18nContext); const metaMetricsEvent = useContext(MetaMetricsContext); + const eip1559V2Enabled = useSelector(getEIP1559V2Enabled); const [dispatchedSafeRefetch, setDispatchedSafeRefetch] = useState(false); const [submitClicked, setSubmitClicked] = useState(false); @@ -689,8 +687,7 @@ export default function ViewQuote() { }, }; - const supportsEIP1559V2 = - EIP_1559_V2_ENABLED && networkAndAccountSupports1559; + const supportsEIP1559V2 = eip1559V2Enabled && networkAndAccountSupports1559; return ( { + dispatch(showLoadingIndication()); + log.debug(`background.setEIP1559V2Enabled`); + try { + await promisifiedBackground.setEIP1559V2Enabled(val); + } finally { + dispatch(hideLoadingIndication()); + } + }; +} + export function setIpfsGateway(val) { return (dispatch) => { dispatch(showLoadingIndication()); @@ -3100,6 +3112,10 @@ export function setCollectiblesDetectionNoticeDismissed() { return promisifiedBackground.setCollectiblesDetectionNoticeDismissed(true); } +export function setEnableEIP1559V2NoticeDismissed() { + return promisifiedBackground.setEnableEIP1559V2NoticeDismissed(true); +} + // QR Hardware Wallets export async function submitQRHardwareCryptoHDKey(cbor) { await promisifiedBackground.submitQRHardwareCryptoHDKey(cbor); From 05f9ceda77953068647c4b369004a9361d68d5f0 Mon Sep 17 00:00:00 2001 From: MG Date: Wed, 12 Jan 2022 17:54:51 +0100 Subject: [PATCH 004/115] #10168 - Fix to Can't open settings if browser zoom level > 100% (#13281) * Added css fix * Fixed left margin --- ui/components/app/account-menu/index.scss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ui/components/app/account-menu/index.scss b/ui/components/app/account-menu/index.scss index 05d3fd6e5..820e25906 100644 --- a/ui/components/app/account-menu/index.scss +++ b/ui/components/app/account-menu/index.scss @@ -10,7 +10,9 @@ color: var(--white); @media screen and (max-width: $break-small) { - right: calc(((100vw - 100%) / 2) + 8px); + position: initial; + margin-top: -10px; + margin-left: calc(((100vw - 100%) / 2) + 8px); } @media screen and (min-width: $break-large) { From ff27f24ef9ef74672d4b8f6b3895779b5eceab7e Mon Sep 17 00:00:00 2001 From: Hassan Malik <41640681+hmalik88@users.noreply.github.com> Date: Wed, 12 Jan 2022 09:37:29 -0800 Subject: [PATCH 005/115] Flask devx fix (#13280) * added fix for snaps devx issue * reordered lines * updated comment * added test that ensures removeFencedCode detects a file with sourceMap inclusion * fixed test * Update development/build/transforms/remove-fenced-code.test.js Co-authored-by: Erik Marks <25517051+rekmarks@users.noreply.github.com> --- development/build/transforms/remove-fenced-code.js | 12 +++++++++++- .../build/transforms/remove-fenced-code.test.js | 11 +++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/development/build/transforms/remove-fenced-code.js b/development/build/transforms/remove-fenced-code.js index ee205e0a7..71236e179 100644 --- a/development/build/transforms/remove-fenced-code.js +++ b/development/build/transforms/remove-fenced-code.js @@ -200,9 +200,19 @@ const directiveParsingRegex = /^([A-Z]+):([A-Z_]+)(?:\(((?:\w+,)*\w+)\))?$/u; * a boolean indicating whether they were modified. */ function removeFencedCode(filePath, typeOfCurrentBuild, fileContent) { - const matchedLines = [...fileContent.matchAll(linesWithFenceRegex)]; + // Do not modify the file if we detect an inline sourcemap. For reasons + // yet to be determined, the transform receives every file twice while in + // watch mode, the second after Babel has transpiled the file. Babel adds + // inline source maps to the file, something we will never do in our own + // source files, so we use the existence of inline source maps to determine + // whether we should ignore the file. + if (/^\/\/# sourceMappingURL=/gmu.test(fileContent)) { + return [fileContent, false]; + } // If we didn't match any lines, return the unmodified file contents. + const matchedLines = [...fileContent.matchAll(linesWithFenceRegex)]; + if (matchedLines.length === 0) { return [fileContent, false]; } diff --git a/development/build/transforms/remove-fenced-code.test.js b/development/build/transforms/remove-fenced-code.test.js index 4397b4bf6..b3ff511e3 100644 --- a/development/build/transforms/remove-fenced-code.test.js +++ b/development/build/transforms/remove-fenced-code.test.js @@ -610,6 +610,17 @@ describe('build/transforms/remove-fenced-code', () => { }); }); + it('ignores files with inline source maps', () => { + // This is so that there isn't an unnecessary second execution of + // removeFencedCode with a transpiled version of the same file + const input = getTestData().validInputs.extraContentWithFences.concat( + '\n//# sourceMappingURL=as32e32wcwc2234f2ew32cnin4243f4nv9nsdoivnxzoivnd', + ); + expect( + removeFencedCode(mockFileName, BuildType.flask, input), + ).toStrictEqual([input, false]); + }); + // We can't do this until there's more than one command it.todo('rejects directive pairs with mismatched commands'); }); From b820ef131b06d606c9e049d0dfada0d042bdc7ff Mon Sep 17 00:00:00 2001 From: Brad Decker Date: Wed, 12 Jan 2022 13:31:54 -0600 Subject: [PATCH 006/115] Implement event fragments (#12251) --- app/scripts/controllers/metametrics.js | 146 +++++++++++++- app/scripts/controllers/metametrics.test.js | 43 ++++ app/scripts/metamask-controller.js | 9 + shared/constants/metametrics.js | 33 +++ ui/contexts/metametrics.js | 5 - ui/contexts/transaction-modal.js | 4 +- ui/hooks/useEventFragment.js | 100 ++++++++++ ui/hooks/useEventFragment.test.js | 211 ++++++++++++++++++++ ui/hooks/useMetricEvent.js | 46 +++++ ui/selectors/index.js | 1 + ui/selectors/metametrics.js | 36 ++++ ui/selectors/metametrics.test.js | 71 +++++++ ui/store/actions.js | 12 ++ 13 files changed, 707 insertions(+), 10 deletions(-) create mode 100644 ui/hooks/useEventFragment.js create mode 100644 ui/hooks/useEventFragment.test.js create mode 100644 ui/selectors/metametrics.js create mode 100644 ui/selectors/metametrics.test.js diff --git a/app/scripts/controllers/metametrics.js b/app/scripts/controllers/metametrics.js index 4352a09cf..6eacb8772 100644 --- a/app/scripts/controllers/metametrics.js +++ b/app/scripts/controllers/metametrics.js @@ -1,11 +1,13 @@ -import { merge, omit } from 'lodash'; +import { merge, omit, omitBy } from 'lodash'; import { ObservableStore } from '@metamask/obs-store'; import { bufferToHex, keccak } from 'ethereumjs-util'; +import { generateUUID } from 'pubnub'; import { ENVIRONMENT_TYPE_BACKGROUND } from '../../../shared/constants/app'; import { METAMETRICS_ANONYMOUS_ID, METAMETRICS_BACKGROUND_PAGE_OBJECT, } from '../../../shared/constants/metametrics'; +import { SECOND } from '../../../shared/constants/time'; const defaultCaptureException = (err) => { // throw error on clean stack so its captured by platform integrations (eg sentry) @@ -27,15 +29,18 @@ const exceptionsToFilter = { * @typedef {import('../../../shared/constants/metametrics').SegmentInterface} SegmentInterface * @typedef {import('../../../shared/constants/metametrics').MetaMetricsPagePayload} MetaMetricsPagePayload * @typedef {import('../../../shared/constants/metametrics').MetaMetricsPageOptions} MetaMetricsPageOptions + * @typedef {import('../../../shared/constants/metametrics').MetaMetricsEventFragment} MetaMetricsEventFragment */ /** * @typedef {Object} MetaMetricsControllerState - * @property {?string} metaMetricsId - The user's metaMetricsId that will be + * @property {string} [metaMetricsId] - The user's metaMetricsId that will be * attached to all non-anonymized event payloads - * @property {?boolean} participateInMetaMetrics - The user's preference for + * @property {boolean} [participateInMetaMetrics] - The user's preference for * participating in the MetaMetrics analytics program. This setting controls * whether or not events are tracked + * @property {{[string]: MetaMetricsEventFragment}} [fragments] - Object keyed + * by UUID with stored fragments as values. */ export default class MetaMetricsController { @@ -81,10 +86,15 @@ export default class MetaMetricsController { this.version = environment === 'production' ? version : `${version}-${environment}`; + const abandonedFragments = omitBy(initState?.fragments, 'persist'); + this.store = new ObservableStore({ participateInMetaMetrics: null, metaMetricsId: null, ...initState, + fragments: { + ...initState?.fragments, + }, }); preferencesStore.subscribe(({ currentLocale }) => { @@ -96,6 +106,32 @@ export default class MetaMetricsController { this.network = getNetworkIdentifier(); }); this.segment = segment; + + // Track abandoned fragments that weren't properly cleaned up. + // Abandoned fragments are those that were stored in persistent memory + // and are available at controller instance creation, but do not have the + // 'persist' flag set. This means anytime the extension is unlocked, any + // fragments that are not marked as persistent will be purged and the + // failure event will be emitted. + Object.values(abandonedFragments).forEach((fragment) => { + this.finalizeEventFragment(fragment.id, { abandoned: true }); + }); + + // Close out event fragments that were created but not progressed. An + // interval is used to routinely check if a fragment has not been updated + // within the fragment's timeout window. When creating a new event fragment + // a timeout can be specified that will cause an abandoned event to be + // tracked if the event isn't progressed within that amount of time. + setInterval(() => { + this.store.getState().fragments.forEach((fragment) => { + if ( + fragment.timeout && + Date.now() - fragment.lastUpdated / 1000 > fragment.timeout + ) { + this.finalizeEventFragment(fragment.id, { abandoned: true }); + } + }); + }, SECOND * 30); } generateMetaMetricsId() { @@ -109,6 +145,110 @@ export default class MetaMetricsController { ); } + /** + * Create an event fragment in state and returns the event fragment object. + * + * @param {MetaMetricsFunnel} options - Fragment settings and properties + * to initiate the fragment with. + * @returns {MetaMetricsFunnel} + */ + createEventFragment(options) { + if (!options.successEvent || !options.category) { + throw new Error( + `Must specify success event and category. Success event was: ${ + options.event + }. Category was: ${options.category}. Payload keys were: ${Object.keys( + options, + )}. ${ + typeof options.properties === 'object' + ? `Payload property keys were: ${Object.keys(options.properties)}` + : '' + }`, + ); + } + const { fragments } = this.store.getState(); + + const id = generateUUID(); + const fragment = { + id, + ...options, + lastUpdated: Date.now(), + }; + this.store.updateState({ + fragments: { + ...fragments, + [id]: fragment, + }, + }); + return fragment; + } + + /** + * Updates an event fragment in state + * + * @param {string} id - The fragment id to update + * @param {MetaMetricsEventFragment} payload - Fragment settings and + * properties to initiate the fragment with. + */ + updateEventFragment(id, payload) { + const { fragments } = this.store.getState(); + + const fragment = fragments[id]; + + if (!fragment) { + throw new Error(`Event fragment with id ${id} does not exist.`); + } + + this.store.updateState({ + fragments: { + ...fragments, + [id]: merge(fragments[id], { + ...payload, + lastUpdated: Date.now(), + }), + }, + }); + } + + /** + * Finalizes a fragment, tracking either a success event or failure Event + * and then removes the fragment from state. + * + * @param {string} id - UUID of the event fragment to be closed + * @param {object} options + * @param {boolean} [options.abandoned] - if true track the failure + * event instead of the success event + * @param {MetaMetricsContext.page} [options.page] - page the final event + * occurred on. This will override whatever is set on the fragment + * @param {MetaMetricsContext.referrer} [options.referrer] - Dapp that + * originated the fragment. This is for fallback only, the fragment referrer + * property will take precedence. + */ + finalizeEventFragment(id, { abandoned = false, page, referrer }) { + const fragment = this.store.getState().fragments[id]; + if (!fragment) { + throw new Error(`Funnel with id ${id} does not exist.`); + } + + const eventName = abandoned ? fragment.failureEvent : fragment.successEvent; + + this.trackEvent({ + event: eventName, + category: fragment.category, + properties: fragment.properties, + sensitiveProperties: fragment.sensitiveProperties, + page: page ?? fragment.page, + referrer: fragment.referrer ?? referrer, + revenue: fragment.revenue, + value: fragment.value, + currency: fragment.currency, + environmentType: fragment.environmentType, + }); + const { fragments } = this.store.getState(); + delete fragments[id]; + this.store.updateState({ fragments }); + } + /** * Setter for the `participateInMetaMetrics` property * diff --git a/app/scripts/controllers/metametrics.test.js b/app/scripts/controllers/metametrics.test.js index 9918d6319..a5c2dc1f5 100644 --- a/app/scripts/controllers/metametrics.test.js +++ b/app/scripts/controllers/metametrics.test.js @@ -81,6 +81,28 @@ function getMockPreferencesStore({ currentLocale = LOCALE } = {}) { }; } +const SAMPLE_PERSISTED_EVENT = { + id: 'testid', + persist: true, + category: 'Unit Test', + successEvent: 'sample persisted event success', + failureEvent: 'sample persisted event failure', + properties: { + test: true, + }, +}; + +const SAMPLE_NON_PERSISTED_EVENT = { + id: 'testid2', + persist: false, + category: 'Unit Test', + successEvent: 'sample non-persisted event success', + failureEvent: 'sample non-persisted event failure', + properties: { + test: true, + }, +}; + function getMetaMetricsController({ participateInMetaMetrics = true, metaMetricsId = TEST_META_METRICS_ID, @@ -105,12 +127,29 @@ function getMetaMetricsController({ initState: { participateInMetaMetrics, metaMetricsId, + fragments: { + testid: SAMPLE_PERSISTED_EVENT, + testid2: SAMPLE_NON_PERSISTED_EVENT, + }, }, }); } describe('MetaMetricsController', function () { describe('constructor', function () { it('should properly initialize', function () { + const mock = sinon.mock(segment); + mock + .expects('track') + .once() + .withArgs({ + event: 'sample non-persisted event failure', + userId: TEST_META_METRICS_ID, + context: DEFAULT_TEST_CONTEXT, + properties: { + ...DEFAULT_EVENT_PROPERTIES, + test: true, + }, + }); const metaMetricsController = getMetaMetricsController(); assert.strictEqual(metaMetricsController.version, VERSION); assert.strictEqual(metaMetricsController.network, NETWORK); @@ -127,6 +166,10 @@ describe('MetaMetricsController', function () { metaMetricsController.locale, LOCALE.replace('_', '-'), ); + assert.deepStrictEqual(metaMetricsController.state.fragments, { + testid: SAMPLE_PERSISTED_EVENT, + }); + mock.verify(); }); it('should update when network changes', function () { diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index f5ef9cfef..205472581 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -1408,6 +1408,15 @@ export default class MetamaskController extends EventEmitter { trackMetaMetricsPage: metaMetricsController.trackPage.bind( metaMetricsController, ), + createEventFragment: metaMetricsController.createEventFragment.bind( + metaMetricsController, + ), + updateEventFragment: metaMetricsController.updateEventFragment.bind( + metaMetricsController, + ), + finalizeEventFragment: metaMetricsController.finalizeEventFragment.bind( + metaMetricsController, + ), // approval controller resolvePendingApproval: approvalController.accept.bind( diff --git a/shared/constants/metametrics.js b/shared/constants/metametrics.js index e0f503234..3ea3052e0 100644 --- a/shared/constants/metametrics.js +++ b/shared/constants/metametrics.js @@ -82,6 +82,39 @@ * segment source that marks the event data as not conforming to our schema */ +/** + * @typedef {Object} MetaMetricsEventFragment + * @property {string} successEvent - The event name to fire when the fragment + * is closed in an affirmative action. + * @property {string} [failureEvent] - The event name to fire when the fragment + * is closed with a rejection. + * @property {string} category - the event category to use for both the success + * and failure events + * @property {boolean} [persist] - Should this fragment be persisted in + * state and progressed after the extension is locked and unlocked. + * @property {number} [timeout] - Time in seconds the event should be persisted + * for. After the timeout the fragment will be closed as abandoned. if not + * supplied the fragment is stored indefinitely. + * @property {number} [lastUpdated] - Date.now() when the fragment was last + * updated. Used to determine if the timeout has expired and the fragment + * should be closed. + * @property {object} [properties] - Object of custom values to track, keys in + * this object must be in snake_case. + * @property {object} [sensitiveProperties] - Object of sensitive values to + * track. Keys in this object must be in snake_case. These properties will be + * sent in an additional event that excludes the user's metaMetricsId + * @property {number} [revenue] - amount of currency that event creates in + * revenue for MetaMask if fragment is successful. + * @property {string} [currency] - ISO 4127 format currency for events with + * revenue, defaults to US dollars + * @property {number} [value] - Abstract business "value" attributable to + * customers who successfully complete this fragment + * @property {MetaMetricsPageObject} [page] - the page/route that the event + * occurred on + * @property {MetaMetricsReferrerObject} [referrer] - the origin of the dapp + * that initiated the event fragment. + */ + /** * Represents the shape of data sent to the segment.track method. * diff --git a/ui/contexts/metametrics.js b/ui/contexts/metametrics.js index 3e2b9786a..bb23afef8 100644 --- a/ui/contexts/metametrics.js +++ b/ui/contexts/metametrics.js @@ -3,7 +3,6 @@ import React, { createContext, useEffect, useCallback, - useContext, useState, } from 'react'; import { useSelector } from 'react-redux'; @@ -125,10 +124,6 @@ export function MetaMetricsProvider({ children }) { MetaMetricsProvider.propTypes = { children: PropTypes.node }; -export function useMetaMetricsContext() { - return useContext(MetaMetricsContext); -} - export class LegacyMetaMetricsProvider extends Component { static propTypes = { children: PropTypes.node, diff --git a/ui/contexts/transaction-modal.js b/ui/contexts/transaction-modal.js index 626e623d5..d7967ba7f 100644 --- a/ui/contexts/transaction-modal.js +++ b/ui/contexts/transaction-modal.js @@ -4,7 +4,7 @@ import PropTypes from 'prop-types'; import { TRANSACTION_TYPES } from '../../shared/constants/transaction'; import { getMethodName } from '../helpers/utils/metrics'; import { useGasFeeContext } from './gasFee'; -import { useMetaMetricsContext } from './metametrics'; +import { MetaMetricsContext } from './metametrics'; export const TransactionModalContext = createContext({}); @@ -15,7 +15,7 @@ export const TransactionModalContextProvider = ({ captureEventEnabled = true, }) => { const [openModals, setOpenModals] = useState([]); - const metricsEvent = useMetaMetricsContext(); + const metricsEvent = useContext(MetaMetricsContext); const { transaction: { origin } = {} } = useGasFeeContext(); const captureEvent = () => { diff --git a/ui/hooks/useEventFragment.js b/ui/hooks/useEventFragment.js new file mode 100644 index 000000000..abdbb4244 --- /dev/null +++ b/ui/hooks/useEventFragment.js @@ -0,0 +1,100 @@ +import { useCallback, useEffect, useRef, useState } from 'react'; +import { useSelector } from 'react-redux'; +import { getEnvironmentType } from '../../app/scripts/lib/util'; +import { selectMatchingFragment } from '../selectors'; +import { + finalizeEventFragment, + createEventFragment, + updateEventFragment, +} from '../store/actions'; +import { useMetaMetricsContext } from './useMetricEvent'; + +/** + * Retrieves a fragment from memory or initializes new fragment if one does not + * exist. Returns three methods that are tied to the fragment, as well as the + * fragment id. + * + * @param {string} existingId + * @param {Object} fragmentOptions + * @returns + */ +export function useEventFragment(existingId, fragmentOptions) { + // To prevent overcalling the createEventFragment background method a ref + // is used to store a boolean value of whether we have already called the + // method. + const createEventFragmentCalled = useRef(false); + + // In order to immediately return a created fragment, instead of waiting for + // background state to update and find the newly created fragment, we have a + // state element that is updated with the fragmentId returned from the + // call into the background process. + const [createdFragmentId, setCreatedFragmentId] = useState(undefined); + + // Select a matching fragment from state if one exists that matches the + // criteria. If an existingId is passed in it is preferred, if not and the + // fragmentOptions has the persist key set to true, a fragment with matching + // successEvent will be pulled from memory if it exists. + const fragment = useSelector((state) => + selectMatchingFragment(state, { + fragmentOptions, + existingId: existingId ?? createdFragmentId, + }), + ); + + // If no valid existing fragment can be found, a new one must be created that + // will then be found by the selector above. To do this, invoke the + // createEventFragment method with the fragmentOptions and current sessionId. + // As soon as we call the background method we also update the + // createEventFragmentCalled ref's current value to true so that future calls + // are suppressed. + useEffect(() => { + if (fragment === undefined && createEventFragmentCalled.current === false) { + createEventFragmentCalled.current = true; + createEventFragment({ + ...fragmentOptions, + environmentType: getEnvironmentType(), + }).then((createdFragment) => { + setCreatedFragmentId(createdFragment.id); + }); + } + }, [fragment, fragmentOptions]); + + const context = useMetaMetricsContext(); + + /** + * trackSuccess is used to close a fragment with the affirmative action. This + * method is just a thin wrapper around the background method that sets the + * necessary values. + */ + const trackSuccess = useCallback(() => { + finalizeEventFragment(fragment.id, { context }); + }, [fragment, context]); + + /** + * trackFailure is used to close a fragment as abandoned. This method is just a + * thin wrapper around the background method that sets the necessary values. + */ + const trackFailure = useCallback(() => { + finalizeEventFragment(fragment.id, { abandoned: true, context }); + }, [fragment, context]); + + /** + * updateEventFragmentProperties is a thin wrapper around updateEventFragment + * that supplies the fragment id as the first parameter. This function will + * be passed back from the hook as 'updateEventFragment', but is named + * updateEventFragmentProperties to avoid naming conflicts. + */ + const updateEventFragmentProperties = useCallback( + (payload) => { + updateEventFragment(fragment.id, payload); + }, + [fragment], + ); + + return { + trackSuccess, + trackFailure, + updateEventFragment: updateEventFragmentProperties, + fragment, + }; +} diff --git a/ui/hooks/useEventFragment.test.js b/ui/hooks/useEventFragment.test.js new file mode 100644 index 000000000..f40febd82 --- /dev/null +++ b/ui/hooks/useEventFragment.test.js @@ -0,0 +1,211 @@ +import { renderHook } from '@testing-library/react-hooks'; +import { useSelector } from 'react-redux'; +import { + finalizeEventFragment, + createEventFragment, + updateEventFragment, +} from '../store/actions'; +import { useEventFragment } from './useEventFragment'; + +jest.mock('../store/actions', () => ({ + finalizeEventFragment: jest.fn(), + updateEventFragment: jest.fn(), + createEventFragment: jest.fn(), +})); + +jest.mock('./useMetricEvent', () => ({ + useMetaMetricsContext: jest.fn(() => ({ page: '/' })), +})); + +jest.mock('react-redux', () => ({ + useSelector: jest.fn(), +})); + +describe('useEventFragment', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('return shape', () => { + let value; + beforeAll(async () => { + useSelector.mockImplementation((selector) => + selector({ metamask: { fragments: { testid: { id: 'testid' } } } }), + ); + createEventFragment.mockImplementation(() => + Promise.resolve({ + id: 'testid', + }), + ); + const { result, waitForNextUpdate } = renderHook(() => + useEventFragment(undefined, { + successEvent: 'success', + failureEvent: 'failure', + persist: true, + }), + ); + await waitForNextUpdate(); + value = result.current; + }); + + it('should have trackSuccess method', () => { + expect(value).toHaveProperty('trackSuccess'); + expect(typeof value.trackSuccess).toBe('function'); + }); + + it('should have trackFailure method', () => { + expect(value).toHaveProperty('trackFailure'); + expect(typeof value.trackFailure).toBe('function'); + }); + + it('should have updateEventFragment method', () => { + expect(value).toHaveProperty('updateEventFragment'); + expect(typeof value.updateEventFragment).toBe('function'); + }); + + it('should have fragment property', () => { + expect(value).toHaveProperty('fragment'); + expect(value.fragment).toMatchObject({ + id: 'testid', + }); + }); + }); + + describe('identifying appropriate fragment', () => { + it('should create a new fragment when a matching fragment does not exist', async () => { + useSelector.mockImplementation((selector) => + selector({ + metamask: { + fragments: { + testid: { + id: 'testid', + successEvent: 'success', + failureEvent: 'failure', + }, + }, + }, + }), + ); + createEventFragment.mockImplementation(() => + Promise.resolve({ + id: 'testid', + }), + ); + const { result, waitForNextUpdate } = renderHook(() => + useEventFragment(undefined, { + successEvent: 'success', + failureEvent: 'failure', + }), + ); + await waitForNextUpdate(); + expect(createEventFragment).toHaveBeenCalledTimes(1); + const returnValue = result.current; + expect(returnValue.fragment).toMatchObject({ + id: 'testid', + successEvent: 'success', + failureEvent: 'failure', + }); + }); + + it('should return the matching fragment by id when existingId is provided', async () => { + useSelector.mockImplementation((selector) => + selector({ + metamask: { + fragments: { + testid: { + id: 'testid', + successEvent: 'success', + failureEvent: 'failure', + }, + }, + }, + }), + ); + const { result } = renderHook(() => + useEventFragment('testid', { + successEvent: 'success', + failureEvent: 'failure', + }), + ); + const returnValue = result.current; + expect(returnValue.fragment).toMatchObject({ + id: 'testid', + successEvent: 'success', + failureEvent: 'failure', + }); + }); + + it('should return matching fragment by successEvent when no id is provided, but persist is true', async () => { + useSelector.mockImplementation((selector) => + selector({ + metamask: { + fragments: { + testid: { + persist: true, + id: 'testid', + successEvent: 'track new event', + }, + }, + }, + }), + ); + const { result } = renderHook(() => + useEventFragment(undefined, { + successEvent: 'track new event', + persist: true, + }), + ); + const returnValue = result.current; + expect(returnValue.fragment).toMatchObject({ + id: 'testid', + persist: true, + successEvent: 'track new event', + }); + }); + }); + + describe('methods', () => { + let value; + beforeAll(async () => { + useSelector.mockImplementation((selector) => + selector({ metamask: { fragments: { testid: { id: 'testid' } } } }), + ); + createEventFragment.mockImplementation(() => + Promise.resolve({ + id: 'testid', + }), + ); + const { result, waitForNextUpdate } = renderHook(() => + useEventFragment(undefined, { + successEvent: 'success', + failureEvent: 'failure', + persist: true, + }), + ); + await waitForNextUpdate(); + value = result.current; + }); + + it('trackSuccess method should invoke the background finalizeEventFragment method', () => { + value.trackSuccess(); + expect(finalizeEventFragment).toHaveBeenCalledWith('testid', { + context: { page: '/' }, + }); + }); + + it('trackFailure method should invoke the background finalizeEventFragment method', () => { + value.trackFailure(); + expect(finalizeEventFragment).toHaveBeenCalledWith('testid', { + abandoned: true, + context: { page: '/' }, + }); + }); + + it('updateEventFragment method should invoke the background updateEventFragment method', () => { + value.updateEventFragment({ properties: { count: 1 } }); + expect(updateEventFragment).toHaveBeenCalledWith('testid', { + properties: { count: 1 }, + }); + }); + }); +}); diff --git a/ui/hooks/useMetricEvent.js b/ui/hooks/useMetricEvent.js index 4e9fb8323..f6e44574a 100644 --- a/ui/hooks/useMetricEvent.js +++ b/ui/hooks/useMetricEvent.js @@ -1,6 +1,10 @@ import { useContext, useCallback } from 'react'; +import { useSelector } from 'react-redux'; +import { useRouteMatch } from 'react-router-dom'; import { MetaMetricsContext } from '../contexts/metametrics'; import { MetaMetricsContext as NewMetaMetricsContext } from '../contexts/metametrics.new'; +import { PATH_NAME_MAP } from '../helpers/constants/routes'; +import { txDataSelector } from '../selectors'; import { useEqualityCheck } from './useEqualityCheck'; // Type imports @@ -38,3 +42,45 @@ export function useNewMetricEvent(payload, options) { memoizedOptions, ]); } + +const PATHS_TO_CHECK = Object.keys(PATH_NAME_MAP); + +/** + * Returns the current page if it matches our route map, as well as the origin + * if there is a confirmation that was triggered by a dapp. These values are + * not required but add valuable context to events, and should be included in + * the context object on the event payload. + * + * @returns {{ + * page?: MetaMetricsPageObject + * referrer?: MetaMetricsReferrerObject + * }} + */ +export function useMetaMetricsContext() { + const match = useRouteMatch({ + path: PATHS_TO_CHECK, + exact: true, + strict: true, + }); + const txData = useSelector(txDataSelector) || {}; + const confirmTransactionOrigin = txData.origin; + + const referrer = confirmTransactionOrigin + ? { + url: confirmTransactionOrigin, + } + : undefined; + + const page = match + ? { + path: match.path, + title: PATH_NAME_MAP[match.path], + url: match.path, + } + : undefined; + + return { + page, + referrer, + }; +} diff --git a/ui/selectors/index.js b/ui/selectors/index.js index 3f4ff3b0e..28d8e9e34 100644 --- a/ui/selectors/index.js +++ b/ui/selectors/index.js @@ -1,6 +1,7 @@ export * from './confirm-transaction'; export * from './custom-gas'; export * from './first-time-flow'; +export * from './metametrics'; export * from './permissions'; export * from './selectors'; export * from './transactions'; diff --git a/ui/selectors/metametrics.js b/ui/selectors/metametrics.js new file mode 100644 index 000000000..377181a3e --- /dev/null +++ b/ui/selectors/metametrics.js @@ -0,0 +1,36 @@ +import { createSelector } from 'reselect'; + +export const selectFragments = (state) => state.metamask.fragments; + +export const selectFragmentBySuccessEvent = createSelector( + selectFragments, + (_, fragmentOptions) => fragmentOptions, + (fragments, fragmentOptions) => { + if (fragmentOptions.persist) { + return Object.values(fragments).find( + (fragment) => fragment.successEvent === fragmentOptions.successEvent, + ); + } + return undefined; + }, +); + +export const selectFragmentById = createSelector( + selectFragments, + (_, fragmentId) => fragmentId, + (fragments, fragmentId) => { + // A valid existing fragment must exist in state. + // If these conditions are not meant we will create a new fragment. + if (fragmentId && fragments?.[fragmentId]) { + return fragments[fragmentId]; + } + return undefined; + }, +); + +export const selectMatchingFragment = createSelector( + (state, params) => + selectFragmentBySuccessEvent(state, params.fragmentOptions), + (state, params) => selectFragmentById(state, params.existingId), + (matchedBySuccessEvent, matchedById) => matchedById ?? matchedBySuccessEvent, +); diff --git a/ui/selectors/metametrics.test.js b/ui/selectors/metametrics.test.js new file mode 100644 index 000000000..13185a477 --- /dev/null +++ b/ui/selectors/metametrics.test.js @@ -0,0 +1,71 @@ +const { + selectFragmentBySuccessEvent, + selectFragmentById, + selectMatchingFragment, +} = require('.'); + +describe('selectFragmentBySuccessEvent', () => { + it('should find matching fragment in state by successEvent', () => { + const state = { + metamask: { + fragments: { + randomid: { + successEvent: 'example event', + persist: true, + id: 'randomid', + }, + }, + }, + }; + const selected = selectFragmentBySuccessEvent(state, { + successEvent: 'example event', + persist: true, + }); + expect(selected).toHaveProperty('id', 'randomid'); + }); +}); + +describe('selectFragmentById', () => { + it('should find matching fragment in state by id', () => { + const state = { + metamask: { + fragments: { + randomid: { + successEvent: 'example event', + persist: true, + id: 'randomid', + }, + }, + }, + }; + const selected = selectFragmentById(state, 'randomid'); + expect(selected).toHaveProperty('id', 'randomid'); + }); +}); + +describe('selectMatchingFragment', () => { + it('should find matching fragment in state by id', () => { + const state = { + metamask: { + fragments: { + notthecorrectid: { + successEvent: 'event name', + id: 'notthecorrectid', + }, + randomid: { + successEvent: 'example event', + persist: true, + id: 'randomid', + }, + }, + }, + }; + const selected = selectMatchingFragment(state, { + fragmentOptions: { + successEvent: 'event name', + }, + existingId: 'randomid', + }); + expect(selected).toHaveProperty('id', 'randomid'); + }); +}); diff --git a/ui/store/actions.js b/ui/store/actions.js index c6be03f9b..480c34ee0 100644 --- a/ui/store/actions.js +++ b/ui/store/actions.js @@ -3072,6 +3072,18 @@ export function trackMetaMetricsEvent(payload, options) { return promisifiedBackground.trackMetaMetricsEvent(payload, options); } +export function createEventFragment(options) { + return promisifiedBackground.createEventFragment(options); +} + +export function updateEventFragment(id, payload) { + return promisifiedBackground.updateEventFragment(id, payload); +} + +export function finalizeEventFragment(id, options) { + return promisifiedBackground.finalizeEventFragment(id, options); +} + /** * @param {MetaMetricsPagePayload} payload - details of the page viewed * @param {MetaMetricsPageOptions} options - options for handling the page view From d4b6e95f895084a0b3f9956b40fcecc6c9c4e77d Mon Sep 17 00:00:00 2001 From: Erik Marks <25517051+rekmarks@users.noreply.github.com> Date: Wed, 12 Jan 2022 21:37:40 -0800 Subject: [PATCH 007/115] Add resolution for follow-redirects (#13301) Adds a resolution for `follow-redirects` to resolve https://github.com/advisories/GHSA-74fj-2j2h-c42q. The dependency graph is `analytics-node#axios#follow-redirects`, and neither parent package has published a fix for this vulnerability. --- package.json | 1 + yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 82d3d605b..077774fbc 100644 --- a/package.json +++ b/package.json @@ -86,6 +86,7 @@ "3box/**/libp2p-crypto/node-forge": "^0.10.0", "3box/**/libp2p-keychain/node-forge": "^0.10.0", "analytics-node/axios": "^0.21.2", + "analytics-node/axios/follow-redirects": "^1.14.7", "ganache-core/lodash": "^4.17.21", "netmask": "^2.0.1", "pubnub/superagent-proxy": "^3.0.0", diff --git a/yarn.lock b/yarn.lock index f2ce61b9b..e26dbe493 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13027,10 +13027,10 @@ fnv1a@^1.0.1: resolved "https://registry.yarnpkg.com/fnv1a/-/fnv1a-1.0.1.tgz#915e2d6d023c43d5224ad9f6d2a3c4156f5712f5" integrity sha1-kV4tbQI8Q9UiStn20qPEFW9XEvU= -follow-redirects@^1.14.0: - version "1.14.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.3.tgz#6ada78118d8d24caee595595accdc0ac6abd022e" - integrity sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw== +follow-redirects@^1.14.0, follow-redirects@^1.14.7: + version "1.14.7" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" + integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== for-each@^0.3.3, for-each@~0.3.3: version "0.3.3" From 76bfc399b6c16742765eb18c2d8f87e72a2fdffb Mon Sep 17 00:00:00 2001 From: dragana8 <92531782+dragana8@users.noreply.github.com> Date: Thu, 13 Jan 2022 12:36:27 +0100 Subject: [PATCH 008/115] convert knobs and actions to controls / args (#13203) * changed knobs * review updates --- .../gas-fee-display.stories.js | 22 +++++------ .../send-hex-data-row.stories.js | 15 ++++--- .../send/send-footer/send-footer.stories.js | 39 ++++++++++--------- 3 files changed, 41 insertions(+), 35 deletions(-) diff --git a/ui/pages/send/send-content/send-gas-row/gas-fee-display/gas-fee-display.stories.js b/ui/pages/send/send-content/send-gas-row/gas-fee-display/gas-fee-display.stories.js index 3e55f7f06..b02ce345d 100644 --- a/ui/pages/send/send-content/send-gas-row/gas-fee-display/gas-fee-display.stories.js +++ b/ui/pages/send/send-content/send-gas-row/gas-fee-display/gas-fee-display.stories.js @@ -1,22 +1,22 @@ import React from 'react'; -import { action } from '@storybook/addon-actions'; -import { number, boolean } from '@storybook/addon-knobs'; import GasFeeDisplay from './gas-fee-display.component'; export default { title: 'Pages/Send/SendContent/SendGasRow/GasFeeDisplay', id: __filename, + argTypes: { + gasTotal: { control: 'number' }, + gasLoadingError: { control: 'boolean' }, + onReset: { action: 'OnReset' }, + }, }; -export const DefaultStory = () => { - const gasTotal = number('Gas Total', 10000000000); - return ( - - ); +export const DefaultStory = (args) => { + return ; }; DefaultStory.storyName = 'Default'; +DefaultStory.args = { + gasTotal: 10000000000, + gasLoadingError: false, +}; diff --git a/ui/pages/send/send-content/send-hex-data-row/send-hex-data-row.stories.js b/ui/pages/send/send-content/send-hex-data-row/send-hex-data-row.stories.js index c4dd46e79..b3c774d6a 100644 --- a/ui/pages/send/send-content/send-hex-data-row/send-hex-data-row.stories.js +++ b/ui/pages/send/send-content/send-hex-data-row/send-hex-data-row.stories.js @@ -1,21 +1,24 @@ import React from 'react'; -import { boolean } from '@storybook/addon-knobs'; import SendHexDataRow from './send-hex-data-row.component'; export default { title: 'Pages/Send/SendContent/SendHexDataRow', id: __filename, + argTypes: { + inError: { control: 'boolean' }, + updateSendHexData: { action: 'updateSendHexData' }, + }, }; -export const DefaultStory = () => { +export const DefaultStory = (args) => { return (
- null} - /> + null} />
); }; DefaultStory.storyName = 'Default'; +DefaultStory.args = { + inError: false, +}; diff --git a/ui/pages/send/send-footer/send-footer.stories.js b/ui/pages/send/send-footer/send-footer.stories.js index 84118cace..9a9179a35 100644 --- a/ui/pages/send/send-footer/send-footer.stories.js +++ b/ui/pages/send/send-footer/send-footer.stories.js @@ -1,30 +1,33 @@ import React from 'react'; -import { action } from '@storybook/addon-actions'; -import { boolean } from '@storybook/addon-knobs'; import SendFooter from './send-footer.component'; export default { title: 'Pages/Send/SendFooter', id: __filename, + argTypes: { + clearSend: { action: 'clearSend' }, + sign: { action: 'sign' }, + from: { control: 'object' }, + disabled: { control: 'boolean' }, + mostRecentOverviewPage: { control: 'text' }, + sendErrors: { control: 'object' }, + history: { action: 'history' }, + addToAddressBookIfNew: { action: 'addToAddressBookIfNew' }, + resetSendState: { action: 'resetSendState' }, + }, }; -export const DefaultStory = () => { - const disabled = boolean('Disabled', false); - return ( - action('Cancel Button Pressed')()} - sign={() => action('Next Button Pressed')()} - // The other props below are only to make the component show no error - from={{ address: '' }} - history={{ push: () => undefined }} - addToAddressBookIfNew={() => undefined} - disabled={disabled} - mostRecentOverviewPage="" - resetSendState={() => undefined} - sendErrors={{}} - /> - ); +export const DefaultStory = (args) => { + return ; }; DefaultStory.storyName = 'Default'; +DefaultStory.args = { + from: { + address: '', + }, + disabled: false, + mostRecentOverviewPage: '', + sendErrors: {}, +}; From 48d9ca19cc1400b38b69a1d31d0a92927cd6b275 Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Thu, 13 Jan 2022 13:19:35 -0330 Subject: [PATCH 009/115] Remove unnecessary Yarn resolution (#13305) This resolution was used to force a transitive dependency to be updated to a specific version. But this target version was within the range that was already requested, so a resolution is not needed. Yarn resolutions are used for forcing a package to update to something _outside_ of the requested range. For in-range updates, a Yarn lockfile update is all we need, and it leaves us with less of a maintenance burden (the resolution can clobber future updates). --- package.json | 1 - yarn.lock | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 077774fbc..82d3d605b 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,6 @@ "3box/**/libp2p-crypto/node-forge": "^0.10.0", "3box/**/libp2p-keychain/node-forge": "^0.10.0", "analytics-node/axios": "^0.21.2", - "analytics-node/axios/follow-redirects": "^1.14.7", "ganache-core/lodash": "^4.17.21", "netmask": "^2.0.1", "pubnub/superagent-proxy": "^3.0.0", diff --git a/yarn.lock b/yarn.lock index e26dbe493..f29064a04 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13027,7 +13027,7 @@ fnv1a@^1.0.1: resolved "https://registry.yarnpkg.com/fnv1a/-/fnv1a-1.0.1.tgz#915e2d6d023c43d5224ad9f6d2a3c4156f5712f5" integrity sha1-kV4tbQI8Q9UiStn20qPEFW9XEvU= -follow-redirects@^1.14.0, follow-redirects@^1.14.7: +follow-redirects@^1.14.0: version "1.14.7" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== From 5d7094cafc055c0a0fb49f362136e2f45ad6a77d Mon Sep 17 00:00:00 2001 From: Alejandro Garcia Anglada Date: Thu, 13 Jan 2022 18:46:38 +0100 Subject: [PATCH 010/115] Improve first time flow css - select action (#12799) * Improve first time flow css - select action * Update ui/pages/first-time-flow/select-action/index.scss Co-authored-by: George Marshall * Update ui/pages/first-time-flow/select-action/index.scss Co-authored-by: George Marshall Co-authored-by: George Marshall Co-authored-by: Elliot Winkler --- ui/pages/first-time-flow/select-action/index.scss | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ui/pages/first-time-flow/select-action/index.scss b/ui/pages/first-time-flow/select-action/index.scss index f10e1fed2..8c8fe939a 100644 --- a/ui/pages/first-time-flow/select-action/index.scss +++ b/ui/pages/first-time-flow/select-action/index.scss @@ -19,8 +19,9 @@ } &__select-buttons { - display: flex; - flex-direction: row; + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 24px; margin-top: 40px; } @@ -34,7 +35,7 @@ border: 1px solid #d8d8d8; box-sizing: border-box; border-radius: 10px; - margin-left: 22px; + padding: 8px; .first-time-flow__button { max-width: 221px; From dffad6e35d9540f86f052621ecb0cfdbe541f40b Mon Sep 17 00:00:00 2001 From: Brad Decker Date: Thu, 13 Jan 2022 12:10:47 -0600 Subject: [PATCH 011/115] use object.values to get array for iteration (#13300) --- app/scripts/controllers/metametrics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/scripts/controllers/metametrics.js b/app/scripts/controllers/metametrics.js index 6eacb8772..bfdf63b9a 100644 --- a/app/scripts/controllers/metametrics.js +++ b/app/scripts/controllers/metametrics.js @@ -123,7 +123,7 @@ export default class MetaMetricsController { // a timeout can be specified that will cause an abandoned event to be // tracked if the event isn't progressed within that amount of time. setInterval(() => { - this.store.getState().fragments.forEach((fragment) => { + Object.values(this.store.getState().fragments).forEach((fragment) => { if ( fragment.timeout && Date.now() - fragment.lastUpdated / 1000 > fragment.timeout From 4cf5c942aabfafd4ca8560c4ea8c6a9ae1066b62 Mon Sep 17 00:00:00 2001 From: Benjamin Bourgeois Date: Thu, 13 Jan 2022 19:40:45 +0000 Subject: [PATCH 012/115] Typography stories : convert knobs and actions to controls / args (#13220) Convert Typography story in ui/components/ui/typography/typography.stories.js to use controls argType annotation - Add README.MDX - Story has argTypes that align with component api / props - All instances of @storybook/addon-knobs have been removed in favour of control args - All instances of @storybook/addon-actions have been removed in favour of action argType annotation --- ui/components/ui/typography/README.mdx | 16 +++++ .../ui/typography/typography.stories.js | 63 +++++++++++-------- 2 files changed, 54 insertions(+), 25 deletions(-) create mode 100644 ui/components/ui/typography/README.mdx diff --git a/ui/components/ui/typography/README.mdx b/ui/components/ui/typography/README.mdx new file mode 100644 index 000000000..1286a8b1c --- /dev/null +++ b/ui/components/ui/typography/README.mdx @@ -0,0 +1,16 @@ +import { Story, Canvas, ArgsTable } from '@storybook/addon-docs'; +import Typography from '.'; + +# Typography + + + + + + + + + +## Component API + + diff --git a/ui/components/ui/typography/typography.stories.js b/ui/components/ui/typography/typography.stories.js index 2f761bfcf..119860c25 100644 --- a/ui/components/ui/typography/typography.stories.js +++ b/ui/components/ui/typography/typography.stories.js @@ -1,52 +1,65 @@ import React from 'react'; -import { number, select, text } from '@storybook/addon-knobs'; import { COLORS, FONT_WEIGHT, TEXT_ALIGN, TYPOGRAPHY, } from '../../../helpers/constants/design-system'; +import README from './README.mdx'; import Typography from '.'; export default { title: 'Components/UI/Typography', id: __filename, + parameters: { + docs: { + page: README, + }, + }, + argTypes: { + color: { + control: { type: 'select' }, + options: COLORS, + defaultValue: COLORS.BLACK, + }, + align: { + control: { type: 'select' }, + options: TEXT_ALIGN, + defaultValue: TEXT_ALIGN.LEFT, + }, + fontWeight: { + control: { type: 'select' }, + options: FONT_WEIGHT, + defaultValue: FONT_WEIGHT.NORMAL, + }, + variant: { + control: { type: 'select' }, + options: TYPOGRAPHY, + defaultValue: TYPOGRAPHY.Paragraph, + }, + content: { + control: { type: 'text' }, + defaultValue: 'The quick orange fox jumped over the lazy dog.', + }, + }, }; -export const List = () => ( +export const DefaultStory = (args) => (
{Object.values(TYPOGRAPHY).map((variant) => (
- - {variant} - + {variant}
))}
); -export const TheQuickOrangeFox = () => ( +DefaultStory.storyName = 'List'; + +export const TheQuickOrangeFox = (args) => (
- - {text('content', 'The quick orange fox jumped over the lazy dog.')} - + {args.content}
); From 269aaa6fb59b3a9d92d7c0b206507724d42ee28e Mon Sep 17 00:00:00 2001 From: Alex Donesky Date: Thu, 13 Jan 2022 15:21:20 -0600 Subject: [PATCH 013/115] fix send duck standard setting bug in updateSendAsset (#13289) --- ui/ducks/send/send.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ui/ducks/send/send.js b/ui/ducks/send/send.js index 9dde7b2a5..355e81e49 100644 --- a/ui/ducks/send/send.js +++ b/ui/ducks/send/send.js @@ -1434,11 +1434,15 @@ export function updateSendAsset({ type, details }) { state.send.account.address ?? getSelectedAddress(state), ); // TODO remove along with migration of isERC721 tokens and stripping away this designation - if (details && details.isERC721 === undefined) { - const updatedAssetDetails = await updateTokenType(details.address); - details.isERC721 = updatedAssetDetails.isERC721; + if (details) { + if (details.isERC721 === undefined) { + const updatedAssetDetails = await updateTokenType(details.address); + details.isERC721 = updatedAssetDetails.isERC721; + } + if (details.standard === undefined) { + details.standard = ERC20; + } } - details.standard = ERC20; await dispatch(hideLoadingIndication()); } else if (type === ASSET_TYPES.COLLECTIBLE) { let isCurrentOwner = true; From f58e2552c3d7d6b945f8d5dff1e3fd3d8705a506 Mon Sep 17 00:00:00 2001 From: ricky Date: Thu, 13 Jan 2022 17:45:07 -0500 Subject: [PATCH 014/115] use PAT for `GITHUB_TOKEN` (#13307) Use `secrets.METAMASKBOT_CROWDIN_TOKEN` for `GITHUB_TOKEN` ref: https://docs.github.com/en/actions/security-guides/automatic-token-authentication#using-the-github_token-in-a-workflow > When you use the repository's GITHUB_TOKEN to perform tasks on behalf of the GitHub Actions app, events triggered by the GITHUB_TOKEN will not create a new workflow run. This prevents you from accidentally creating recursive workflow runs. For example, if a workflow run pushes code using the repository's GITHUB_TOKEN, a new workflow will not run even when the repository contains a workflow configured to run when push events occur. --- .github/workflows/crowdin_action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/crowdin_action.yml b/.github/workflows/crowdin_action.yml index fce3edce5..ca2e00677 100644 --- a/.github/workflows/crowdin_action.yml +++ b/.github/workflows/crowdin_action.yml @@ -26,6 +26,6 @@ jobs: upload_translations: true download_translations: true env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.METAMASKBOT_CROWDIN_TOKEN }} CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} From 58ff673bcd013be809f48e9ad2bb70899d052856 Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Thu, 13 Jan 2022 18:05:35 -0500 Subject: [PATCH 015/115] V10.9.0: Disconnect all accounts flow (#13309) --- ui/pages/connected-sites/connected-sites.container.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/pages/connected-sites/connected-sites.container.js b/ui/pages/connected-sites/connected-sites.container.js index 55cbacac2..6385bd849 100644 --- a/ui/pages/connected-sites/connected-sites.container.js +++ b/ui/pages/connected-sites/connected-sites.container.js @@ -53,7 +53,7 @@ const mapDispatchToProps = (dispatch) => { dispatch(removePermittedAccount(subjectKey, address)); }, disconnectAllAccounts: (subjectKey, subject) => { - const permissionMethodNames = subject.permissions.map( + const permissionMethodNames = Object.values(subject.permissions).map( ({ parentCapability }) => parentCapability, ); dispatch( From b5973b46e056da01bbf1be6aa5b7851c0c580352 Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Fri, 14 Jan 2022 10:09:28 -0500 Subject: [PATCH 016/115] V10.9.0: Mainnet should have a capital `M` in the import token warning message (#13310) --- app/_locales/en/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index fadb4033f..206aababa 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -1641,7 +1641,7 @@ "message": "Ethereum Mainnet" }, "mainnetToken": { - "message": "This address matches a known mainnet token address. Recheck the contract address and network for the token you are trying to add." + "message": "This address matches a known Ethereum Mainnet token address. Recheck the contract address and network for the token you are trying to add." }, "makeAnotherSwap": { "message": "Create a new swap" From a5873eb7ff313659d5028271829e8a4de6f497ac Mon Sep 17 00:00:00 2001 From: Erik Marks <25517051+rekmarks@users.noreply.github.com> Date: Fri, 14 Jan 2022 14:31:32 -0800 Subject: [PATCH 017/115] Fix manually connecting sites (#13320) --- .../controllers/permissions/background-api.js | 5 ++++- .../controllers/permissions/background-api.test.js | 14 ++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/app/scripts/controllers/permissions/background-api.js b/app/scripts/controllers/permissions/background-api.js index da8a9c4c8..0ed2354d1 100644 --- a/app/scripts/controllers/permissions/background-api.js +++ b/app/scripts/controllers/permissions/background-api.js @@ -1,3 +1,4 @@ +import nanoid from 'nanoid'; import { CaveatTypes, RestrictedMethods, @@ -59,11 +60,13 @@ export function getPermissionBackgroundApiMethods(permissionController) { }, requestAccountsPermissionWithId: async (origin) => { - const [, { id }] = await permissionController.requestPermissions( + const id = nanoid(); + permissionController.requestPermissions( { origin }, { eth_accounts: {}, }, + { id }, ); return id; }, diff --git a/app/scripts/controllers/permissions/background-api.test.js b/app/scripts/controllers/permissions/background-api.test.js index 39a96265a..8857835b4 100644 --- a/app/scripts/controllers/permissions/background-api.test.js +++ b/app/scripts/controllers/permissions/background-api.test.js @@ -160,9 +160,11 @@ describe('permission background API methods', () => { describe('requestAccountsPermissionWithId', () => { it('request an accounts permission and returns the request id', async () => { const permissionController = { - requestPermissions: jest.fn().mockImplementationOnce(async () => { - return [null, { id: 'arbitraryId' }]; - }), + requestPermissions: jest + .fn() + .mockImplementationOnce(async (_, __, { id }) => { + return [null, { id }]; + }), }; const id = await getPermissionBackgroundApiMethods( @@ -173,9 +175,13 @@ describe('permission background API methods', () => { expect(permissionController.requestPermissions).toHaveBeenCalledWith( { origin: 'foo.com' }, { eth_accounts: {} }, + { id: expect.any(String) }, ); - expect(id).toStrictEqual('arbitraryId'); + expect(id.length > 0).toBe(true); + expect(id).toStrictEqual( + permissionController.requestPermissions.mock.calls[0][2].id, + ); }); }); }); From 8beaae3361528351d9a32a3d0b17ff52af2eeecf Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Fri, 14 Jan 2022 20:12:20 -0700 Subject: [PATCH 018/115] Fix UI issues at top of confirm page container (#13314) This commit fixes a few issues with ConfirmPageContainerSummary (which holds the contract being used or action being performed and the money being sent): * Remove fixed height so that the secondary currency doesn't get cut off or spill over * Add missing padding * Fix font size of primary and secondary currencies * Add top border when there is a "address not in your address book" alert at the top Co-authored-by: Ariella --- .../confirm-page-container-content.component.js | 8 +++++++- .../confirm-page-container-summary/index.scss | 16 ++++++++-------- .../confirm-page-container-content/index.scss | 4 ++++ .../confirm-page-container.component.js | 1 + .../confirm-transaction-base.component.js | 2 +- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js index 85a957ef1..665d1924f 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js +++ b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js @@ -43,6 +43,7 @@ export default class ConfirmPageContainerContent extends Component { rejectNText: PropTypes.string, hideTitle: PropTypes.bool, supportsEIP1559V2: PropTypes.bool, + hasTopBorder: PropTypes.bool, }; renderContent() { @@ -111,6 +112,7 @@ export default class ConfirmPageContainerContent extends Component { setUserAcknowledgedGasMissing, hideUserAcknowledgedGasMissing, supportsEIP1559V2, + hasTopBorder, } = this.props; const primaryAction = hideUserAcknowledgedGasMissing @@ -121,7 +123,11 @@ export default class ConfirmPageContainerContent extends Component { }; return ( -
+
{warning ? : null} {ethGasPriceWarning && ( diff --git a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/index.scss b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/index.scss index 8bb39b705..d8f7a307c 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/index.scss +++ b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/index.scss @@ -1,16 +1,18 @@ .confirm-page-container-summary { - padding: 0 24px; + padding: 16px 24px; background-color: #f9fafa; - height: 120px; box-sizing: border-box; display: flex; flex-direction: column; justify-content: space-evenly; + &__origin, + &__action-row { + padding-bottom: 8px; + } + &__origin { @include H6; - - padding-bottom: 10px; } &__action-row { @@ -34,7 +36,6 @@ } &__title { - padding: 4px 0; display: flex; align-items: center; } @@ -45,7 +46,7 @@ } &__title-text { - @include H2; + @include H1; white-space: nowrap; overflow: hidden; @@ -53,13 +54,12 @@ } &__subtitle { - @include H6; + @include H5; color: var(--oslo-gray); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - margin-left: 42px; } &--border { diff --git a/ui/components/app/confirm-page-container/confirm-page-container-content/index.scss b/ui/components/app/confirm-page-container/confirm-page-container-content/index.scss index 96da686c9..b932af183 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container-content/index.scss +++ b/ui/components/app/confirm-page-container/confirm-page-container-content/index.scss @@ -8,6 +8,10 @@ display: flex; flex-direction: column; + &--with-top-border { + border-top: 1px solid var(--geyser); + } + &__error-container { padding: 0 16px 16px 16px; } diff --git a/ui/components/app/confirm-page-container/confirm-page-container.component.js b/ui/components/app/confirm-page-container/confirm-page-container.component.js index dc23050e9..10f326594 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container.component.js +++ b/ui/components/app/confirm-page-container/confirm-page-container.component.js @@ -234,6 +234,7 @@ export default class ConfirmPageContainer extends Component { ethGasPriceWarning={ethGasPriceWarning} hideTitle={hideTitle} supportsEIP1559V2={supportsEIP1559V2} + hasTopBorder={showAddToAddressDialog} /> )} {shouldDisplayWarning && ( diff --git a/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js index 67e53af49..d23912787 100644 --- a/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js +++ b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js @@ -861,7 +861,7 @@ export default class ConfirmTransactionBase extends Component { value={hexTransactionAmount} type={PRIMARY} showEthLogo - ethLogoHeight="36" + ethLogoHeight="28" hideLabel /> ); From cb815a91ad8de86f3aaf0e36959d412b441498e9 Mon Sep 17 00:00:00 2001 From: VSaric <92527393+VSaric@users.noreply.github.com> Date: Mon, 17 Jan 2022 19:58:12 +0100 Subject: [PATCH 019/115] SendHeader, ContactListTab and AdvancedTab story: converted knobs and actions to controls / args (#13230) * SendHeader, ContactListTab and AdvancedTab story: converted knobs and actions to controls / args * Added the other function type props to action controls * Requested review changes --- .../send/send-header/send-header.stories.js | 55 ++++---- .../advanced-tab/advanced-tab.stories.js | 133 ++++++++++++++---- .../contact-list-tab.stories.js | 31 ++-- 3 files changed, 148 insertions(+), 71 deletions(-) diff --git a/ui/pages/send/send-header/send-header.stories.js b/ui/pages/send/send-header/send-header.stories.js index 8b0f317e8..9423bb6cd 100644 --- a/ui/pages/send/send-header/send-header.stories.js +++ b/ui/pages/send/send-header/send-header.stories.js @@ -2,7 +2,6 @@ import React, { useEffect } from 'react'; import { combineReducers, createStore } from 'redux'; import { Provider } from 'react-redux'; -import { select } from '@storybook/addon-knobs'; import { updateSendStage, updateSendAsset, @@ -10,47 +9,53 @@ import { import sendSBReducer from '../../../../.storybook/reducers/sb-send-reducer'; import historySBReducer from '../../../../.storybook/reducers/sb-history-reducer'; - -import { ASSET_TYPES, SEND_STAGES } from '../../../ducks/send'; import SendHeader from './send-header.component'; export default { title: 'Pages/Send/SendHeader', id: __filename, + argTypes: { + asset: { + control: { + type: 'select', + }, + options: ['NATIVE', 'TOKEN'], + }, + stage: { + control: { + type: 'select', + }, + options: ['ADD_RECIPIENT', 'DRAFT', 'EDIT', 'INACTIVE'], + }, + }, }; -export const DefaultStory = () => { - const store = createStore( - combineReducers({ send: sendSBReducer, history: historySBReducer }), - ); - const state = store.getState(); - const { send } = state; - const asset = - select('Asset', [ASSET_TYPES.NATIVE, ASSET_TYPES.TOKEN]) || send.asset; +const store = createStore( + combineReducers({ send: sendSBReducer, history: historySBReducer }), +); +const state = store.getState(); +const { send } = state; - const stage = - select('Stage', [ - SEND_STAGES.ADD_RECIPIENT, - SEND_STAGES.DRAFT, - SEND_STAGES.EDIT, - SEND_STAGES.INACTIVE, - ]) || send.stage; +export const DefaultStory = (args) => { + useEffect(() => { + store.dispatch(updateSendAsset(args.asset)); + }, [args.asset]); useEffect(() => { - store.dispatch(updateSendAsset(asset)); - }, [store, asset]); - - useEffect(() => { - store.dispatch(updateSendStage(stage)); - }, [store, stage]); + store.dispatch(updateSendStage(args.stage)); + }, [args.stage]); return (
- +
); }; DefaultStory.storyName = 'Default'; +DefaultStory.args = { + asset: 'NATIVE' || send.asset, + stage: 'ADD_RECIPIENT' || send.stage, +}; diff --git a/ui/pages/settings/advanced-tab/advanced-tab.stories.js b/ui/pages/settings/advanced-tab/advanced-tab.stories.js index 3be10b39c..259069686 100644 --- a/ui/pages/settings/advanced-tab/advanced-tab.stories.js +++ b/ui/pages/settings/advanced-tab/advanced-tab.stories.js @@ -1,48 +1,121 @@ import React from 'react'; -import { text, boolean } from '@storybook/addon-knobs'; +import { useArgs } from '@storybook/client-api'; import AdvancedTab from './advanced-tab.component'; export default { title: 'Pages/Settings/AdvancedTab', id: __filename, + argTypes: { + warning: { control: 'text' }, + useNonceField: { control: 'boolean' }, + sendHexData: { control: 'boolean' }, + advancedInlineGas: { control: 'boolean' }, + showFiatInTestnets: { control: 'boolean' }, + threeBoxSyncingAllowed: { control: 'boolean' }, + threeBoxDisabled: { control: 'boolean' }, + useLedgerLive: { control: 'boolean' }, + dismissSeedBackUpReminder: { control: 'boolean' }, + setAutoLockTimeLimit: { action: 'setAutoLockTimeLimit' }, + setShowFiatConversionOnTestnetsPreference: { + action: 'setShowFiatConversionOnTestnetsPreference', + }, + setShowTestNetworks: { action: 'setShowTestNetworks' }, + setThreeBoxSyncingPermission: { action: 'setThreeBoxSyncingPermission' }, + setIpfsGateway: { action: 'setIpfsGateway' }, + setLedgerTransportPreference: { action: 'setLedgerTransportPreference' }, + setDismissSeedBackUpReminder: { action: 'setDismissSeedBackUpReminder' }, + setUseNonceField: { action: 'setUseNonceField' }, + setHexDataFeatureFlag: { action: 'setHexDataFeatureFlag' }, + displayWarning: { action: 'displayWarning' }, + history: { action: 'history' }, + showResetAccountConfirmationModal: { + action: 'showResetAccountConfirmationModal', + }, + setAdvancedInlineGasFeatureFlag: { + action: 'setAdvancedInlineGasFeatureFlag', + }, + }, }; -export const DefaultStory = () => { +export const DefaultStory = (args) => { + const [ + { + useNonceField, + sendHexData, + advancedInlineGas, + showFiatInTestnets, + threeBoxSyncingAllowed, + dismissSeedBackUpReminder, + }, + updateArgs, + ] = useArgs(); + + const handleUseNonceField = () => { + updateArgs({ + useNonceField: !useNonceField, + }); + }; + + const handleSendHexData = () => { + updateArgs({ + sendHexData: !sendHexData, + }); + }; + + const handleAdvancedInlineGas = () => { + updateArgs({ + advancedInlineGas: !advancedInlineGas, + }); + }; + + const handleShowFiatInTestnets = () => { + updateArgs({ + showFiatInTestnets: !showFiatInTestnets, + }); + }; + + const handleThreeBoxSyncingAllowed = () => { + updateArgs({ + threeBoxSyncingAllowed: !threeBoxSyncingAllowed, + }); + }; + + const handleDismissSeedBackUpReminder = () => { + updateArgs({ + dismissSeedBackUpReminder: !dismissSeedBackUpReminder, + }); + }; return (
undefined} - setShowFiatConversionOnTestnetsPreference={() => undefined} - setShowTestNetworks={() => undefined} - setThreeBoxSyncingPermission={() => undefined} - setIpfsGateway={() => undefined} - setLedgerTransportPreference={() => undefined} - setDismissSeedBackUpReminder={() => undefined} - setUseNonceField={() => undefined} - setHexDataFeatureFlag={() => undefined} - displayWarning={() => undefined} - history={{ push: () => undefined }} - showResetAccountConfirmationModal={() => undefined} - setAdvancedInlineGasFeatureFlag={() => undefined} - warning={text('Warning', 'Warning Sample')} + {...args} + useNonceField={useNonceField} + setUseNonceField={handleUseNonceField} + sendHexData={sendHexData} + setHexDataFeatureFlag={handleSendHexData} + advancedInlineGas={advancedInlineGas} + setAdvancedInlineGasFeatureFlag={handleAdvancedInlineGas} + showFiatInTestnets={showFiatInTestnets} + setShowFiatConversionOnTestnetsPreference={handleShowFiatInTestnets} + threeBoxSyncingAllowed={threeBoxSyncingAllowed} + setThreeBoxSyncingPermission={handleThreeBoxSyncingAllowed} + dismissSeedBackUpReminder={dismissSeedBackUpReminder} + setDismissSeedBackUpReminder={handleDismissSeedBackUpReminder} ipfsGateway="ipfs-gateway" - useNonceField={boolean('Customize Transaction Nonce', false)} - sendHexData={boolean('Show Hex Data', false)} - advancedInlineGas={boolean('Advanced Inline Gas', false)} - showFiatInTestnets={boolean('Show Conversion on Testnets', false)} - threeBoxSyncingAllowed={boolean( - 'Sync data with 3Box (experimental)', - false, - )} - threeBoxDisabled={boolean('3Box Disabled', false)} - useLedgerLive={boolean('Use Ledger Live', false)} - dismissSeedBackUpReminder={boolean( - 'Dismiss recovery phrase backup reminder', - false, - )} />
); }; DefaultStory.storyName = 'Default'; +DefaultStory.args = { + warning: 'Warning Sample', + useNonceField: false, + sendHexData: false, + advancedInlineGas: false, + showFiatInTestnets: false, + threeBoxSyncingAllowed: false, + threeBoxDisabled: false, + useLedgerLive: false, + dismissSeedBackUpReminder: false, +}; diff --git a/ui/pages/settings/contact-list-tab/contact-list-tab.stories.js b/ui/pages/settings/contact-list-tab/contact-list-tab.stories.js index fc3409ca7..20c9640e9 100644 --- a/ui/pages/settings/contact-list-tab/contact-list-tab.stories.js +++ b/ui/pages/settings/contact-list-tab/contact-list-tab.stories.js @@ -1,6 +1,5 @@ import React from 'react'; import { Provider } from 'react-redux'; -import { object, boolean, select } from '@storybook/addon-knobs'; import configureStore from '../../../store/store'; import testData from '../../../../.storybook/test-data'; @@ -13,28 +12,28 @@ export default { title: 'Pages/Settings/ContactListTab', id: __filename, decorators: [(story) => {story()}], + argsTypes: { + addressBook: { control: 'object' }, + hideAddressBook: { control: 'boolean' }, + selectedAddress: { control: 'select' }, + history: { action: 'history' }, + }, }; -export const DefaultStory = () => { - const { metamask } = store.getState(); - const { addresses } = metamask; - const addressBook = object('Address Book', addresses); - const hideAddressBook = boolean('Hide Address Book', false); - const selectedAddress = select( - 'Selected Address', - addresses.map(({ address }) => address), - ); +const { metamask } = store.getState(); +const { addresses } = metamask; +export const DefaultStory = (args) => { return (
- undefined }} - hideAddressBook={hideAddressBook} - selectedAddress={selectedAddress} - /> +
); }; DefaultStory.storyName = 'Default'; +DefaultStory.args = { + addressBook: addresses, + hideAddressBook: false, + selectedAddress: addresses.map(({ address }) => address), +}; From 371da2eb83515d7112ec3e5c954d3c876d129940 Mon Sep 17 00:00:00 2001 From: 6201 Date: Tue, 18 Jan 2022 05:50:27 +0800 Subject: [PATCH 020/115] Box story: convert knobs to controls (#13274) Co-authored-by: caogu --- ui/components/ui/box/box.stories.js | 223 +++++++++++++++++----------- 1 file changed, 136 insertions(+), 87 deletions(-) diff --git a/ui/components/ui/box/box.stories.js b/ui/components/ui/box/box.stories.js index f4c357c15..382927a78 100644 --- a/ui/components/ui/box/box.stories.js +++ b/ui/components/ui/box/box.stories.js @@ -1,4 +1,3 @@ -import { number, select } from '@storybook/addon-knobs'; import React from 'react'; import { ALIGN_ITEMS, @@ -11,96 +10,146 @@ import { } from '../../../helpers/constants/design-system'; import Box from './box'; -export default { - title: 'Components/UI/Box', - id: __filename, -}; - const sizeKnobOptions = [undefined, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; const marginSizeKnobOptions = [...sizeKnobOptions, 'auto']; -export const DefaultStory = () => { - const items = []; - const size = number( - 'size', - 100, - { range: true, min: 50, max: 500, step: 10 }, - 'children', - ); - for (let $i = 0; $i < number('items', 1, {}, 'children'); $i++) { - items.push(); +export default { + title: 'Components/UI/Box', + id: __filename, + component: Box, + argTypes: { + size: { + control: { type: 'range', min: 50, max: 500, step: 10 }, + table: { category: 'children' }, + defaultValue: 100, + }, + items: { + control: 'number', + table: { category: 'children' }, + defaultValue: 1, + }, + display: { + options: DISPLAY, + control: 'select', + defaultValue: DISPLAY.BLOCK, + table: { category: 'display' }, + }, + width: { + options: BLOCK_SIZES, + control: 'select', + defaultValue: BLOCK_SIZES.HALF, + table: { category: 'display' }, + }, + height: { + options: BLOCK_SIZES, + control: 'select', + defaultValue: BLOCK_SIZES.HALF, + table: { category: 'display' }, + }, + justifyContent: { + options: JUSTIFY_CONTENT, + control: 'select', + defaultValue: JUSTIFY_CONTENT.FLEX_START, + table: { category: 'display' }, + }, + alignItems: { + options: ALIGN_ITEMS, + control: 'select', + defaultValue: ALIGN_ITEMS.FLEX_START, + table: { category: 'display' }, + }, + textAlign: { + options: TEXT_ALIGN, + control: 'select', + defaultValue: TEXT_ALIGN.LEFT, + table: { category: 'left' }, + }, + margin: { + options: marginSizeKnobOptions, + control: 'select', + table: { category: 'margin' }, + }, + marginTop: { + options: marginSizeKnobOptions, + control: 'select', + table: { category: 'margin' }, + }, + marginRight: { + options: marginSizeKnobOptions, + control: 'select', + table: { category: 'margin' }, + }, + marginBottom: { + options: marginSizeKnobOptions, + control: 'select', + table: { category: 'margin' }, + }, + marginLeft: { + options: marginSizeKnobOptions, + control: 'select', + table: { category: 'margin' }, + }, + padding: { + options: sizeKnobOptions, + control: 'select', + table: { category: 'padding' }, + }, + paddingTop: { + options: sizeKnobOptions, + control: 'select', + table: { category: 'padding' }, + }, + paddingRight: { + options: sizeKnobOptions, + control: 'select', + table: { category: 'padding' }, + }, + paddingBottom: { + options: sizeKnobOptions, + control: 'select', + table: { category: 'padding' }, + }, + paddingLeft: { + options: sizeKnobOptions, + control: 'select', + table: { category: 'padding' }, + }, + borderStyle: { + options: BORDER_STYLE, + control: 'select', + defaultValue: BORDER_STYLE.DASHED, + table: { category: 'border' }, + }, + borderWidth: { + options: sizeKnobOptions, + control: 'number', + defaultValue: 1, + table: { category: 'border' }, + }, + borderColor: { + options: COLORS, + control: 'select', + defaultValue: COLORS.BLACK, + table: { category: 'border' }, + }, + backgroundColor: { + options: COLORS, + defaultValue: COLORS.WHITE, + control: 'select', + table: { category: 'background' }, + }, + }, +}; + +export const DefaultStory = (args) => { + const { items, size, ...rest } = args; + const children = []; + for (let $i = 0; $i < items; $i++) { + children.push( + , + ); } - return ( - - {items} - - ); + return {children}; }; DefaultStory.storyName = 'Default'; From a8ec87603102f9233c02110167a0532a618c2a6f Mon Sep 17 00:00:00 2001 From: Matthew Epps Date: Mon, 17 Jan 2022 13:55:23 -0800 Subject: [PATCH 021/115] Fix token ordering: prioritize top before owned (#13270) --- ui/hooks/useTokensToSearch.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/hooks/useTokensToSearch.js b/ui/hooks/useTokensToSearch.js index 7140737a4..ac06d84ef 100644 --- a/ui/hooks/useTokensToSearch.js +++ b/ui/hooks/useTokensToSearch.js @@ -175,8 +175,8 @@ export function useTokensToSearch({ ); tokensToSearchBuckets.top = tokensToSearchBuckets.top.filter(Boolean); return [ - ...tokensToSearchBuckets.owned, ...tokensToSearchBuckets.top, + ...tokensToSearchBuckets.owned, ...tokensToSearchBuckets.others, ]; }, [ From d12097ac1c305ae04bb32d119164be9a925d3239 Mon Sep 17 00:00:00 2001 From: Benjamin Bourgeois Date: Mon, 17 Jan 2022 22:00:40 +0000 Subject: [PATCH 022/115] UpdateNickname story : convert knobs and actions to controls/args (#13189) Co-authored-by: George Marshall --- .../ui/update-nickname-popover/README.mdx | 14 ++++ .../update-nickname-popover.stories.js | 69 +++++++++++++------ 2 files changed, 62 insertions(+), 21 deletions(-) create mode 100644 ui/components/ui/update-nickname-popover/README.mdx diff --git a/ui/components/ui/update-nickname-popover/README.mdx b/ui/components/ui/update-nickname-popover/README.mdx new file mode 100644 index 000000000..28074738c --- /dev/null +++ b/ui/components/ui/update-nickname-popover/README.mdx @@ -0,0 +1,14 @@ +import { Story, Canvas, ArgsTable } from '@storybook/addon-docs'; +import UpdateNicknamePopover from '.'; + +# UpdateNicknamePopover + +Popover to update nickname of an address + + + + + +## Component API + + diff --git a/ui/components/ui/update-nickname-popover/update-nickname-popover.stories.js b/ui/components/ui/update-nickname-popover/update-nickname-popover.stories.js index 4e870b01f..fa8973298 100644 --- a/ui/components/ui/update-nickname-popover/update-nickname-popover.stories.js +++ b/ui/components/ui/update-nickname-popover/update-nickname-popover.stories.js @@ -1,44 +1,71 @@ -import React, { useState } from 'react'; -import { action } from '@storybook/addon-actions'; -import { text } from '@storybook/addon-knobs'; +import { useArgs } from '@storybook/client-api'; +import React from 'react'; import Button from '../button'; +import README from './README.mdx'; import UpdateNicknamePopover from '.'; export default { - title: 'Components/UI/UpdateNickname', + title: 'Components/UI/UpdateNicknamePopover', id: __filename, + parameters: { + docs: { + page: README, + }, + }, + argTypes: { + address: { + control: { type: 'text' }, + defaultValue: '0xdeDbcA0156308960E3bBa2f5a273E72179940788', + }, + showPopover: { + control: { type: 'boolean' }, + defaultValue: false, + }, + onAdd: { action: 'onAdd' }, + onClose: { action: 'onClose' }, + }, }; -export const AddNickname = () => { - const [showPopover, setShowPopover] = useState(false); +export const DefaultStory = (args) => { + const [{ showPopover }, updateArgs] = useArgs(); + + const handlePopoverState = () => { + updateArgs({ + showPopover: !showPopover, + }); + }; + return (
- + {showPopover && ( action(`Close Update Nickname Popover`)()} + {...args} + nickname="user_nickname" + memo="This is a memo" + onClose={handlePopoverState} /> )}
); }; -export const UpdateNickname = () => { - const [showPopover, setShowPopover] = useState(false); +DefaultStory.storyName = 'UpdateNickname'; + +export const AddNickname = (args) => { + const [{ showPopover }, updateArgs] = useArgs(); + + const handlePopoverState = () => { + updateArgs({ + showPopover: !showPopover, + }); + }; + return (
- + {showPopover && ( - action(`Close Update Nickname Popover`)()} - /> + )}
); From bd33512c2a04d3855bafdffcee2943f3a925c1cd Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Tue, 18 Jan 2022 23:07:52 +0530 Subject: [PATCH 023/115] Fix issue with dapp suggested option being visible in edit gas fee popover even if dapp has no gas suggestion (#13316) --- .../edit-gas-fee-popover.test.js | 2 +- .../edit-gas-item/edit-gas-item.js | 3 ++- .../edit-gas-item/edit-gas-item.test.js | 17 +++++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js index 7fa800668..165cb3de0 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js @@ -79,7 +79,7 @@ const render = ({ txProps, contextProps } = {}) => { describe('EditGasFeePopover', () => { it('should renders low / medium / high options', () => { - render({ txProps: { dappSuggestedGasFees: {} } }); + render({ txProps: { dappSuggestedGasFees: { maxFeePerGas: '0x5208' } } }); expect(screen.queryByText('🐢')).toBeInTheDocument(); expect(screen.queryByText('🦊')).toBeInTheDocument(); diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js index 49e7d7443..ddd80c963 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js @@ -64,7 +64,8 @@ const EditGasItem = ({ priorityLevel }) => { if ( priorityLevel === PRIORITY_LEVELS.DAPP_SUGGESTED && - !dappSuggestedGasFees + !dappSuggestedGasFees?.maxFeePerGas && + !dappSuggestedGasFees?.gasPrice ) { return null; } diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js index d3baf6a3b..469348e2a 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js @@ -150,6 +150,23 @@ describe('EditGasItem', () => { expect(screen.queryByTitle('0.0000315 ETH')).toBeInTheDocument(); }); + it('should not renders site gas estimate option for priorityLevel dappSuggested if site does not provided gas estimates', () => { + renderComponent({ + componentProps: { priorityLevel: 'dappSuggested' }, + transactionProps: {}, + }); + expect( + screen.queryByRole('button', { name: 'dappSuggested' }), + ).not.toBeInTheDocument(); + renderComponent({ + componentProps: { priorityLevel: 'dappSuggested' }, + transactionProps: { dappSuggestedGasFees: { gas: '0x59682f10' } }, + }); + expect( + screen.queryByRole('button', { name: 'dappSuggested' }), + ).not.toBeInTheDocument(); + }); + it('should renders advance gas estimate option for priorityLevel custom', () => { renderComponent({ componentProps: { priorityLevel: 'custom' }, From 9a3c917a48fe68d43853c2b9c11adcd0fe6897b5 Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Wed, 19 Jan 2022 04:38:41 +0530 Subject: [PATCH 024/115] Adding support for EIP-1559 in E2E tests (#13282) --- development/run-ganache.sh | 4 +- lavamoat/browserify/beta/policy.json | 8 + lavamoat/browserify/flask/policy.json | 8 + lavamoat/browserify/main/policy.json | 8 + package.json | 5 +- test/e2e/fixtures/send-edit-v2/state.json | 214 +++++++++++++++++ test/e2e/ganache.js | 16 +- test/e2e/helpers.js | 7 +- test/e2e/metamask-ui.spec.js | 2 +- test/e2e/metrics.spec.js | 4 +- .../send-eth-with-private-key.js | 3 - test/e2e/tests/account-details.spec.js | 4 +- test/e2e/tests/add-account.spec.js | 4 +- test/e2e/tests/add-hide-token.spec.js | 6 +- test/e2e/tests/address-book.spec.js | 4 +- test/e2e/tests/contract-interactions.spec.js | 8 +- test/e2e/tests/custom-rpc-history.spec.js | 4 +- test/e2e/tests/from-import-ui.spec.js | 13 +- test/e2e/tests/incremental-security.spec.js | 6 +- test/e2e/tests/localization.spec.js | 4 +- test/e2e/tests/lock-account.spec.js | 4 +- test/e2e/tests/lockdown.spec.js | 4 +- test/e2e/tests/metamask-responsive-ui.spec.js | 6 +- test/e2e/tests/navigate-transactions.spec.js | 4 +- test/e2e/tests/permissions.spec.js | 4 +- test/e2e/tests/personal-sign.spec.js | 4 +- test/e2e/tests/provider-api.spec.js | 4 +- test/e2e/tests/send-edit.spec.js | 113 ++++++++- test/e2e/tests/send-eth.spec.js | 12 +- test/e2e/tests/signature-request.spec.js | 4 +- test/e2e/tests/simple-send.spec.js | 4 +- test/e2e/tests/threebox.spec.js | 4 +- .../advanced-gas-fee-gas-limit.js | 2 + .../base-fee-input/base-fee-input.js | 1 + .../priority-fee-input/priority-fee-input.js | 1 + ...onfirm-page-container-summary.component.js | 2 +- ui/components/ui/form-field/form-field.js | 1 + .../numeric-input/numeric-input.component.js | 3 + yarn.lock | 227 +++++++++++------- 39 files changed, 573 insertions(+), 163 deletions(-) create mode 100644 test/e2e/fixtures/send-edit-v2/state.json diff --git a/development/run-ganache.sh b/development/run-ganache.sh index 0afdad98d..218457663 100755 --- a/development/run-ganache.sh +++ b/development/run-ganache.sh @@ -4,7 +4,7 @@ set -e set -u set -o pipefail -ganache_cli="$(yarn bin)/ganache-cli" +ganache_cli="$(yarn bin)/ganache" seed_phrase="${GANACHE_SEED_PHRASE:-phrase upgrade clock rough situate wedding elder clever doctor stamp excess tent}" _term () { @@ -23,7 +23,7 @@ trap _term SIGTERM trap _int SIGINT # shellcheck disable=SC2086 -$ganache_cli --noVMErrorsOnRPCResponse --networkId 1337 --mnemonic "$seed_phrase" ${GANACHE_ARGS:-} & +$ganache_cli --chain.vmErrorsOnRPCResponse false --networkId 1337 --mnemonic "$seed_phrase" ${GANACHE_ARGS:-} & child=$! wait "$child" diff --git a/lavamoat/browserify/beta/policy.json b/lavamoat/browserify/beta/policy.json index 0cabec1e1..27fbf0195 100644 --- a/lavamoat/browserify/beta/policy.json +++ b/lavamoat/browserify/beta/policy.json @@ -955,7 +955,10 @@ }, "abstract-leveldown": { "packages": { + "buffer": true, + "immediate": true, "is-buffer": true, + "level-supports": true, "process": true, "xtend": true } @@ -3042,6 +3045,11 @@ "xtend": true } }, + "level-supports": { + "packages": { + "xtend": true + } + }, "levelup": { "packages": { "assert": true, diff --git a/lavamoat/browserify/flask/policy.json b/lavamoat/browserify/flask/policy.json index 0cabec1e1..27fbf0195 100644 --- a/lavamoat/browserify/flask/policy.json +++ b/lavamoat/browserify/flask/policy.json @@ -955,7 +955,10 @@ }, "abstract-leveldown": { "packages": { + "buffer": true, + "immediate": true, "is-buffer": true, + "level-supports": true, "process": true, "xtend": true } @@ -3042,6 +3045,11 @@ "xtend": true } }, + "level-supports": { + "packages": { + "xtend": true + } + }, "levelup": { "packages": { "assert": true, diff --git a/lavamoat/browserify/main/policy.json b/lavamoat/browserify/main/policy.json index 0cabec1e1..27fbf0195 100644 --- a/lavamoat/browserify/main/policy.json +++ b/lavamoat/browserify/main/policy.json @@ -955,7 +955,10 @@ }, "abstract-leveldown": { "packages": { + "buffer": true, + "immediate": true, "is-buffer": true, + "level-supports": true, "process": true, "xtend": true } @@ -3042,6 +3045,11 @@ "xtend": true } }, + "level-supports": { + "packages": { + "xtend": true + } + }, "levelup": { "packages": { "assert": true, diff --git a/package.json b/package.json index 82d3d605b..e9531d171 100644 --- a/package.json +++ b/package.json @@ -290,7 +290,7 @@ "fancy-log": "^1.3.3", "fast-glob": "^3.2.2", "fs-extra": "^8.1.0", - "ganache-cli": "^6.12.1", + "ganache": "^v7.0.0-rc.0", "ganache-core": "^2.13.1", "geckodriver": "^1.21.0", "globby": "^11.0.4", @@ -385,7 +385,8 @@ "node-hid": false, "usb": false, "blake-hash": false, - "protobufjs": false + "protobufjs": false, + "@trufflesuite/bigint-buffer": false } } } diff --git a/test/e2e/fixtures/send-edit-v2/state.json b/test/e2e/fixtures/send-edit-v2/state.json new file mode 100644 index 000000000..fe1a4390c --- /dev/null +++ b/test/e2e/fixtures/send-edit-v2/state.json @@ -0,0 +1,214 @@ +{ + "data": { + "AppStateController": { + "mkrMigrationReminderTimestamp": null, + "swapsWelcomeMessageHasBeenShown": true + }, + "CachedBalancesController": { + "cachedBalances": { + "4": {} + } + }, + "CurrencyController": { + "conversionDate": 1575697244.188, + "conversionRate": 149.61, + "currentCurrency": "usd", + "nativeCurrency": "ETH" + }, + "IncomingTransactionsController": { + "incomingTransactions": {}, + "incomingTxLastFetchedBlocksByNetwork": { + "goerli": null, + "kovan": null, + "mainnet": null, + "rinkeby": 5570536 + } + }, + "KeyringController": { + "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" + }, + "NetworkController": { + "network": "1337", + "provider": { + "nickname": "Localhost 8545", + "rpcUrl": "http://localhost:8545", + "chainId": "0x539", + "ticker": "ETH", + "type": "rpc" + } + }, + "NotificationController": { + "notifications": { + "1": { + "isShown": true + }, + "3": { + "isShown": true + }, + "5": { + "isShown": true + }, + "6": { + "isShown": true + }, + "8": { + "isShown": true + } + } + }, + "OnboardingController": { + "onboardingTabs": {}, + "seedPhraseBackedUp": false + }, + "PermissionsMetadata": { + "domainMetadata": { + "metamask.github.io": { + "icon": null, + "name": "M E T A M A S K M E S H T E S T" + } + }, + "permissionsHistory": {}, + "permissionsLog": [ + { + "id": 746677923, + "method": "eth_accounts", + "methodType": "restricted", + "origin": "metamask.github.io", + "request": { + "id": 746677923, + "jsonrpc": "2.0", + "method": "eth_accounts", + "origin": "metamask.github.io", + "params": [] + }, + "requestTime": 1575697241368, + "response": { + "id": 746677923, + "jsonrpc": "2.0", + "result": [] + }, + "responseTime": 1575697241370, + "success": true + } + ] + }, + "PreferencesController": { + "accountTokens": { + "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { + "rinkeby": [], + "ropsten": [] + } + }, + "assetImages": {}, + "completedOnboarding": true, + "eip1559V2Enabled": true, + "currentLocale": "en", + "featureFlags": { + "showIncomingTransactions": true, + "transactionTime": false + }, + "firstTimeFlowType": "create", + "forgottenPassword": false, + "frequentRpcListDetail": [], + "identities": { + "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { + "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", + "name": "Account 1" + } + }, + "knownMethodData": {}, + "lostIdentities": {}, + "metaMetricsId": null, + "participateInMetaMetrics": false, + "preferences": { + "useNativeCurrencyAsPrimaryCurrency": true + }, + "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", + "suggestedTokens": {}, + "tokens": [], + "useBlockie": false, + "useNonceField": false, + "usePhishDetect": true + }, + "TransactionController": { + "transactions": { + "4046084157914634": { + "chainId": "0x539", + "primaryTransaction": { + "chainId": "0x539", + "id": 4046084157914634, + "loadingDefaults": true, + "metamaskNetworkId": "1337", + "origin": "metamask", + "status": "unapproved", + "time": 1617228030067, + "txParams": { + "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", + "gas": "0x61a8", + "maxFeePerGas": "0x59682f0c", + "maxPriorityFeePerGas": "0x59682f00", + "type": "0x2", + "to": "0x2f318C334780961FB129D2a6c30D0763d9a5C970", + "value": "0xde0b6b3a7640000" + }, + "type": "sentEther" + }, + "history": [ + { + "chainId": "0x539", + "id": 4046084157914634, + "loadingDefaults": true, + "metamaskNetworkId": "1337", + "origin": "metamask", + "status": "unapproved", + "time": 1617228030067, + "txParams": { + "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", + "gas": "0x61a8", + "maxFeePerGas": "0x59682f0c", + "maxPriorityFeePerGas": "0x59682f00", + "type": "0x2", + "to": "0x2f318C334780961FB129D2a6c30D0763d9a5C970", + "value": "0xde0b6b3a7640000" + }, + "type": "simpleSend" + }, + [ + { + "note": "Added new unapproved transaction.", + "op": "replace", + "path": "/loadingDefaults", + "timestamp": 1617228030069, + "value": false + } + ] + ], + "id": 4046084157914634, + "loadingDefaults": false, + "metamaskNetworkId": "1337", + "origin": "metamask", + "status": "unapproved", + "time": 1617228030067, + "txParams": { + "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", + "gas": "0x61a8", + "maxFeePerGas": "0x59682f0c", + "maxPriorityFeePerGas": "0x59682f00", + "type": "0x2", + "to": "0x2f318C334780961FB129D2a6c30D0763d9a5C970", + "value": "0xde0b6b3a7640000" + }, + "type": "simpleSend" + } + } + }, + "config": {}, + "firstTimeInfo": { + "date": 1575697234195, + "version": "7.7.0" + } + }, + "meta": { + "version": 40 + } +} diff --git a/test/e2e/ganache.js b/test/e2e/ganache.js index 8f9974da1..5d45f6208 100644 --- a/test/e2e/ganache.js +++ b/test/e2e/ganache.js @@ -1,5 +1,4 @@ -const { promisify } = require('util'); -const ganache = require('ganache-core'); +const ganache = require('ganache'); const defaultOptions = { blockTime: 2, @@ -8,6 +7,7 @@ const defaultOptions = { 'phrase upgrade clock rough situate wedding elder clever doctor stamp excess tent', port: 8545, vmErrorsOnRPCResponse: false, + hardfork: 'muirGlacier', }; class Ganache { @@ -15,22 +15,14 @@ class Ganache { const options = { ...defaultOptions, ...opts }; const { port } = options; this._server = ganache.server(options); - - const listen = promisify(this._server.listen).bind(this._server); - const blockchain = await listen(port); - - return { - ...blockchain, - port, - }; + await this._server.listen(port); } async quit() { if (!this._server) { throw new Error('Server not running yet'); } - const close = promisify(this._server.close).bind(this._server); - await close(); + await this._server.close(); } } diff --git a/test/e2e/helpers.js b/test/e2e/helpers.js index 5eb5ad8fb..76d0976b4 100644 --- a/test/e2e/helpers.js +++ b/test/e2e/helpers.js @@ -1,5 +1,6 @@ const path = require('path'); const sinon = require('sinon'); +const BigNumber = require('bignumber.js'); const createStaticServer = require('../../development/create-static-server'); const { createSegmentServer, @@ -12,9 +13,10 @@ const { ensureXServerIsRunning } = require('./x-server'); const tinyDelayMs = 200; const regularDelayMs = tinyDelayMs * 2; const largeDelayMs = regularDelayMs * 2; - const dappPort = 8080; +const convertToHexValue = (val) => `0x${new BigNumber(val, 10).toString(16)}`; + async function withFixtures(options, testSuite) { const { dapp, @@ -42,7 +44,7 @@ async function withFixtures(options, testSuite) { secondaryGanacheServer = new Ganache(); await secondaryGanacheServer.start({ blockTime: 2, - _chainIdRpc: chainId, + chain: { chainId }, port, vmErrorsOnRPCResponse: false, }); @@ -148,6 +150,7 @@ async function withFixtures(options, testSuite) { } module.exports = { + convertToHexValue, tinyDelayMs, regularDelayMs, largeDelayMs, diff --git a/test/e2e/metamask-ui.spec.js b/test/e2e/metamask-ui.spec.js index e6ec801d5..5ffd36c7f 100644 --- a/test/e2e/metamask-ui.spec.js +++ b/test/e2e/metamask-ui.spec.js @@ -217,7 +217,7 @@ describe('MetaMask', function () { it('balance renders', async function () { await driver.waitForSelector({ css: '[data-testid="wallet-balance"] .list-item__heading', - text: '100 ETH', + text: '1000', }); await driver.delay(regularDelayMs); }); diff --git a/test/e2e/metrics.spec.js b/test/e2e/metrics.spec.js index 498a6ccd0..141b56192 100644 --- a/test/e2e/metrics.spec.js +++ b/test/e2e/metrics.spec.js @@ -1,6 +1,6 @@ const { strict: assert } = require('assert'); const waitUntilCalled = require('../lib/wait-until-called'); -const { withFixtures, tinyDelayMs } = require('./helpers'); +const { convertToHexValue, withFixtures, tinyDelayMs } = require('./helpers'); /** * WARNING: These tests must be run using a build created with `yarn build:test:metrics`, so that it has @@ -15,7 +15,7 @@ describe('Segment metrics', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/send-eth-with-private-key-test/send-eth-with-private-key.js b/test/e2e/send-eth-with-private-key-test/send-eth-with-private-key.js index 5f7291950..4ea215793 100644 --- a/test/e2e/send-eth-with-private-key-test/send-eth-with-private-key.js +++ b/test/e2e/send-eth-with-private-key-test/send-eth-with-private-key.js @@ -12,9 +12,6 @@ sendButton.addEventListener('click', function () { gasPrice: '0x09184e72a000', gasLimit: '0x22710', value: '0xde0b6b3a7640000', - r: '0x25a1bc499cd8799a2ece0fcba0df6e666e54a6e2b4e18c09838e2b621c10db71', - s: '0x6cf83e6e8f6e82a0a1d7bd10bc343fc0ae4b096c1701aa54e6389d447f98ac6f', - v: '0x2d46', to: document.getElementById('address').value, } var tx = new Tx(rawTx); diff --git a/test/e2e/tests/account-details.spec.js b/test/e2e/tests/account-details.spec.js index 82f28ad15..cfdbdf238 100644 --- a/test/e2e/tests/account-details.spec.js +++ b/test/e2e/tests/account-details.spec.js @@ -1,5 +1,5 @@ const { strict: assert } = require('assert'); -const { withFixtures } = require('../helpers'); +const { convertToHexValue, withFixtures } = require('../helpers'); describe('Show account details', function () { const ganacheOptions = { @@ -7,7 +7,7 @@ describe('Show account details', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/tests/add-account.spec.js b/test/e2e/tests/add-account.spec.js index 910402e43..e358660d0 100644 --- a/test/e2e/tests/add-account.spec.js +++ b/test/e2e/tests/add-account.spec.js @@ -1,5 +1,5 @@ const { strict: assert } = require('assert'); -const { withFixtures } = require('../helpers'); +const { convertToHexValue, withFixtures } = require('../helpers'); describe('Add account', function () { const ganacheOptions = { @@ -7,7 +7,7 @@ describe('Add account', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/tests/add-hide-token.spec.js b/test/e2e/tests/add-hide-token.spec.js index 66c6067bb..56fb2840c 100644 --- a/test/e2e/tests/add-hide-token.spec.js +++ b/test/e2e/tests/add-hide-token.spec.js @@ -1,5 +1,5 @@ const { strict: assert } = require('assert'); -const { withFixtures } = require('../helpers'); +const { convertToHexValue, withFixtures } = require('../helpers'); describe('Hide token', function () { const ganacheOptions = { @@ -7,7 +7,7 @@ describe('Hide token', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; @@ -61,7 +61,7 @@ describe('Add existing token using search', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/tests/address-book.spec.js b/test/e2e/tests/address-book.spec.js index 707c72e00..e4d43d347 100644 --- a/test/e2e/tests/address-book.spec.js +++ b/test/e2e/tests/address-book.spec.js @@ -1,5 +1,5 @@ const { strict: assert } = require('assert'); -const { withFixtures } = require('../helpers'); +const { convertToHexValue, withFixtures } = require('../helpers'); describe('Address Book', function () { const ganacheOptions = { @@ -7,7 +7,7 @@ describe('Address Book', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/tests/contract-interactions.spec.js b/test/e2e/tests/contract-interactions.spec.js index 6ef4cc4fb..1e4ddecfa 100644 --- a/test/e2e/tests/contract-interactions.spec.js +++ b/test/e2e/tests/contract-interactions.spec.js @@ -1,5 +1,9 @@ const { strict: assert } = require('assert'); -const { withFixtures, regularDelayMs } = require('../helpers'); +const { + convertToHexValue, + withFixtures, + regularDelayMs, +} = require('../helpers'); describe('Deploy contract and call contract methods', function () { let windowHandles; @@ -11,7 +15,7 @@ describe('Deploy contract and call contract methods', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/tests/custom-rpc-history.spec.js b/test/e2e/tests/custom-rpc-history.spec.js index 6868808ac..d392afbcd 100644 --- a/test/e2e/tests/custom-rpc-history.spec.js +++ b/test/e2e/tests/custom-rpc-history.spec.js @@ -1,5 +1,5 @@ const { strict: assert } = require('assert'); -const { withFixtures } = require('../helpers'); +const { convertToHexValue, withFixtures } = require('../helpers'); describe('Stores custom RPC history', function () { const ganacheOptions = { @@ -7,7 +7,7 @@ describe('Stores custom RPC history', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/tests/from-import-ui.spec.js b/test/e2e/tests/from-import-ui.spec.js index cf3becf05..c68285682 100644 --- a/test/e2e/tests/from-import-ui.spec.js +++ b/test/e2e/tests/from-import-ui.spec.js @@ -1,5 +1,10 @@ const { strict: assert } = require('assert'); -const { withFixtures, regularDelayMs, largeDelayMs } = require('../helpers'); +const { + convertToHexValue, + withFixtures, + regularDelayMs, + largeDelayMs, +} = require('../helpers'); const enLocaleMessages = require('../../../app/_locales/en/messages.json'); describe('Metamask Import UI', function () { @@ -9,7 +14,7 @@ describe('Metamask Import UI', function () { { secretKey: '0x53CB0AB5226EEBF4D872113D98332C1555DC304443BEE1CF759D15798D3C55A9', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; @@ -186,7 +191,7 @@ describe('Metamask Import UI', function () { { secretKey: '0x53CB0AB5226EEBF4D872113D98332C1555DC304443BEE1CF759D15798D3C55A9', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; @@ -292,7 +297,7 @@ describe('Metamask Import UI', function () { { secretKey: '0x53CB0AB5226EEBF4D872113D98332C1555DC304443BEE1CF759D15798D3C55A9', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/tests/incremental-security.spec.js b/test/e2e/tests/incremental-security.spec.js index 90df69560..98f397f78 100644 --- a/test/e2e/tests/incremental-security.spec.js +++ b/test/e2e/tests/incremental-security.spec.js @@ -1,5 +1,5 @@ const { strict: assert } = require('assert'); -const { withFixtures, tinyDelayMs } = require('../helpers'); +const { convertToHexValue, withFixtures, tinyDelayMs } = require('../helpers'); const enLocaleMessages = require('../../../app/_locales/en/messages.json'); describe('Incremental Security', function () { @@ -8,12 +8,12 @@ describe('Incremental Security', function () { { secretKey: '0x250F458997A364988956409A164BA4E16F0F99F916ACDD73ADCD3A1DE30CF8D1', - balance: 0, + balance: '0x0', }, { secretKey: '0x53CB0AB5226EEBF4D872113D98332C1555DC304443BEE1CF759D15798D3C55A9', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/tests/localization.spec.js b/test/e2e/tests/localization.spec.js index e9d6e0f7e..a4859de68 100644 --- a/test/e2e/tests/localization.spec.js +++ b/test/e2e/tests/localization.spec.js @@ -1,5 +1,5 @@ const { strict: assert } = require('assert'); -const { withFixtures } = require('../helpers'); +const { convertToHexValue, withFixtures } = require('../helpers'); describe('Localization', function () { it('can correctly display Philippine peso symbol and code', async function () { @@ -8,7 +8,7 @@ describe('Localization', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/tests/lock-account.spec.js b/test/e2e/tests/lock-account.spec.js index c8c949a42..345a6ec78 100644 --- a/test/e2e/tests/lock-account.spec.js +++ b/test/e2e/tests/lock-account.spec.js @@ -1,5 +1,5 @@ const { strict: assert } = require('assert'); -const { withFixtures } = require('../helpers'); +const { convertToHexValue, withFixtures } = require('../helpers'); describe('Lock and unlock', function () { const ganacheOptions = { @@ -7,7 +7,7 @@ describe('Lock and unlock', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/tests/lockdown.spec.js b/test/e2e/tests/lockdown.spec.js index a1d0db969..cb38725aa 100644 --- a/test/e2e/tests/lockdown.spec.js +++ b/test/e2e/tests/lockdown.spec.js @@ -4,7 +4,7 @@ const { getGlobalProperties, testIntrinsic, } = require('../../helpers/protect-intrinsics-helpers'); -const { withFixtures } = require('../helpers'); +const { convertToHexValue, withFixtures } = require('../helpers'); const { PAGES } = require('../webdriver/driver'); const isFirefox = process.env.SELENIUM_BROWSER === Browser.FIREFOX; @@ -56,7 +56,7 @@ describe('lockdown', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/tests/metamask-responsive-ui.spec.js b/test/e2e/tests/metamask-responsive-ui.spec.js index 1be3d0c9c..cff4f6fb1 100644 --- a/test/e2e/tests/metamask-responsive-ui.spec.js +++ b/test/e2e/tests/metamask-responsive-ui.spec.js @@ -1,5 +1,5 @@ const { strict: assert } = require('assert'); -const { withFixtures, tinyDelayMs } = require('../helpers'); +const { convertToHexValue, withFixtures, tinyDelayMs } = require('../helpers'); const enLocaleMessages = require('../../../app/_locales/en/messages.json'); describe('Metamask Responsive UI', function () { @@ -183,7 +183,7 @@ describe('Metamask Responsive UI', function () { // balance renders await driver.waitForSelector({ css: '[data-testid="eth-overview__primary-currency"]', - text: '100 ETH', + text: '1000 ETH', }); }, ); @@ -196,7 +196,7 @@ describe('Metamask Responsive UI', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/tests/navigate-transactions.spec.js b/test/e2e/tests/navigate-transactions.spec.js index a5a6a4166..64de4c7e8 100644 --- a/test/e2e/tests/navigate-transactions.spec.js +++ b/test/e2e/tests/navigate-transactions.spec.js @@ -1,5 +1,5 @@ const { strict: assert } = require('assert'); -const { withFixtures } = require('../helpers'); +const { convertToHexValue, withFixtures } = require('../helpers'); describe('Navigate transactions', function () { const ganacheOptions = { @@ -7,7 +7,7 @@ describe('Navigate transactions', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/tests/permissions.spec.js b/test/e2e/tests/permissions.spec.js index 95636934d..16f786718 100644 --- a/test/e2e/tests/permissions.spec.js +++ b/test/e2e/tests/permissions.spec.js @@ -1,5 +1,5 @@ const { strict: assert } = require('assert'); -const { withFixtures } = require('../helpers'); +const { convertToHexValue, withFixtures } = require('../helpers'); describe('Permissions', function () { it('sets permissions and connect to Dapp', async function () { @@ -8,7 +8,7 @@ describe('Permissions', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/tests/personal-sign.spec.js b/test/e2e/tests/personal-sign.spec.js index a1812892d..c479beea4 100644 --- a/test/e2e/tests/personal-sign.spec.js +++ b/test/e2e/tests/personal-sign.spec.js @@ -1,5 +1,5 @@ const { strict: assert } = require('assert'); -const { withFixtures } = require('../helpers'); +const { convertToHexValue, withFixtures } = require('../helpers'); describe('Personal sign', function () { it('can initiate and confirm a personal sign', async function () { @@ -8,7 +8,7 @@ describe('Personal sign', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/tests/provider-api.spec.js b/test/e2e/tests/provider-api.spec.js index c2c5928f7..14a4ff0eb 100644 --- a/test/e2e/tests/provider-api.spec.js +++ b/test/e2e/tests/provider-api.spec.js @@ -1,6 +1,6 @@ const { strict: assert } = require('assert'); const { errorCodes } = require('eth-rpc-errors'); -const { withFixtures } = require('../helpers'); +const { convertToHexValue, withFixtures } = require('../helpers'); describe('MetaMask', function () { const ganacheOptions = { @@ -8,7 +8,7 @@ describe('MetaMask', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/tests/send-edit.spec.js b/test/e2e/tests/send-edit.spec.js index 94000b4a8..05562add9 100644 --- a/test/e2e/tests/send-edit.spec.js +++ b/test/e2e/tests/send-edit.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { + convertToHexValue, withFixtures, tinyDelayMs, regularDelayMs, @@ -13,7 +14,7 @@ describe('Editing Confirm Transaction', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; @@ -90,4 +91,114 @@ describe('Editing Confirm Transaction', function () { }, ); }); + + if (process.env.EIP_1559_V2 === '1') { + it('goes back from confirm page to edit eth value, baseFee, priorityFee and gas limit - 1559 V2', async function () { + const ganacheOptions = { + hardfork: 'london', + accounts: [ + { + secretKey: + '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: convertToHexValue(25000000000000000000), + }, + ], + }; + await withFixtures( + { + fixtures: 'send-edit-v2', + ganacheOptions, + title: this.test.title, + }, + async ({ driver }) => { + await driver.navigate(); + + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + + const transactionAmounts = await driver.findElements( + '.currency-display-component__text', + ); + const transactionAmount = transactionAmounts[0]; + assert.equal(await transactionAmount.getText(), '1'); + + const transactionFee = transactionAmounts[1]; + assert.equal(await transactionFee.getText(), '0.0000375'); + + await driver.clickElement( + '.confirm-page-container-header__back-button', + ); + await driver.fill('.unit-input__input', '2.2'); + + await driver.clickElement({ text: 'Next', tag: 'button' }); + + // open gas fee popover + await driver.clickElement({ text: 'Edit', tag: 'button' }); + + // show gas limit + await driver.clickElement('[data-testid="advanced-gas-fee-edit"]'); + await driver.delay(largeDelayMs); + + // enter max fee + const maxBaseFee = await driver.findElement( + '[data-testid="base-fee-input"]', + ); + await maxBaseFee.clear(); + await maxBaseFee.sendKeys('8'); + await driver.delay(largeDelayMs); + + // enter priority fee + const priorityFee = await driver.findElement( + '[data-testid="priority-fee-input"]', + ); + await priorityFee.clear(); + await priorityFee.sendKeys('8'); + await driver.delay(largeDelayMs); + + // edit gas limit + const gasLimit = await driver.findElement( + '[data-testid="gas-limit-input"]', + ); + await gasLimit.clear(); + await gasLimit.sendKeys('100000'); + await driver.delay(largeDelayMs); + + // save default values + await driver.clickElement('input[type="checkbox"]'); + await driver.delay(largeDelayMs); + + // Submit gas fee changes + await driver.clickElement({ text: 'Save', tag: 'button' }); + + // has correct updated value on the confirm screen the transaction + const editedTransactionAmounts = await driver.findElements( + '.transaction-detail-item__row .transaction-detail-item__detail-values .currency-display-component__text:last-of-type', + ); + const editedTransactionAmount = editedTransactionAmounts[0]; + assert.equal(await editedTransactionAmount.getText(), '0.0008'); + + const editedTransactionFee = editedTransactionAmounts[1]; + assert.equal(await editedTransactionFee.getText(), '2.2008'); + + // confirms the transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.delay(regularDelayMs); + + await driver.clickElement('[data-testid="home__activity-tab"]'); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .transaction-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); + + const txValues = await driver.findElements( + '.transaction-list-item__primary-currency', + ); + assert.equal(txValues.length, 1); + assert.ok(/-2.2\s*ETH/u.test(await txValues[0].getText())); + }, + ); + }); + } }); diff --git a/test/e2e/tests/send-eth.spec.js b/test/e2e/tests/send-eth.spec.js index 7d88f121a..abe8082a5 100644 --- a/test/e2e/tests/send-eth.spec.js +++ b/test/e2e/tests/send-eth.spec.js @@ -1,5 +1,9 @@ const { strict: assert } = require('assert'); -const { withFixtures, regularDelayMs } = require('../helpers'); +const { + convertToHexValue, + withFixtures, + regularDelayMs, +} = require('../helpers'); describe('Send ETH from inside MetaMask using default gas', function () { const ganacheOptions = { @@ -7,7 +11,7 @@ describe('Send ETH from inside MetaMask using default gas', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; @@ -93,7 +97,7 @@ describe('Send ETH from inside MetaMask using advanced gas modal', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; @@ -162,7 +166,7 @@ describe('Send ETH from dapp using advanced gas controls', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/tests/signature-request.spec.js b/test/e2e/tests/signature-request.spec.js index bf2a547e2..a2726b860 100644 --- a/test/e2e/tests/signature-request.spec.js +++ b/test/e2e/tests/signature-request.spec.js @@ -1,5 +1,5 @@ const { strict: assert } = require('assert'); -const { withFixtures } = require('../helpers'); +const { convertToHexValue, withFixtures } = require('../helpers'); describe('Signature Request', function () { it('can initiate and confirm a Signature Request', async function () { @@ -8,7 +8,7 @@ describe('Signature Request', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/tests/simple-send.spec.js b/test/e2e/tests/simple-send.spec.js index 21502e836..2d26a1871 100644 --- a/test/e2e/tests/simple-send.spec.js +++ b/test/e2e/tests/simple-send.spec.js @@ -1,4 +1,4 @@ -const { withFixtures } = require('../helpers'); +const { convertToHexValue, withFixtures } = require('../helpers'); describe('Simple send', function () { it('can send a simple transaction from one account to another', async function () { @@ -7,7 +7,7 @@ describe('Simple send', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/test/e2e/tests/threebox.spec.js b/test/e2e/tests/threebox.spec.js index cae0ebca8..ac58e68ab 100644 --- a/test/e2e/tests/threebox.spec.js +++ b/test/e2e/tests/threebox.spec.js @@ -1,5 +1,5 @@ const { strict: assert } = require('assert'); -const { withFixtures, largeDelayMs } = require('../helpers'); +const { convertToHexValue, withFixtures, largeDelayMs } = require('../helpers'); const ThreeboxMockServer = require('../mock-3box/threebox-mock-server'); describe('Threebox', function () { @@ -8,7 +8,7 @@ describe('Threebox', function () { { secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, + balance: convertToHexValue(25000000000000000000), }, ], }; diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-gas-limit/advanced-gas-fee-gas-limit.js b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-gas-limit/advanced-gas-fee-gas-limit.js index db5a2a6f8..facc3b132 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-gas-limit/advanced-gas-fee-gas-limit.js +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-gas-limit/advanced-gas-fee-gas-limit.js @@ -45,6 +45,7 @@ const AdvancedGasFeeGasLimit = () => { if (isEditing) { return ( { {gasLimit} + ); @@ -104,6 +108,18 @@ TypeLink.args = { children: 'Click me', }; +export const TypeInline = (args) => ( +
+ this is a inline button + +
+); + +TypeInline.args = { + type: 'inline', + children: 'Click me', +}; + export const Icon = (args) => ; Icon.args = { diff --git a/ui/components/ui/button/buttons.scss b/ui/components/ui/button/buttons.scss index acaa94a24..c0f61531f 100644 --- a/ui/components/ui/button/buttons.scss +++ b/ui/components/ui/button/buttons.scss @@ -318,3 +318,29 @@ input[type="submit"][disabled] { } } } + +.btn--inline { + display: inline; + padding: 0 4px; + font-size: inherit; + width: auto; + color: var(--Blue-500); + cursor: pointer; + background-color: transparent; + + &:hover { + color: var(--Blue-400); + } + + &:active { + color: var(--Blue-600); + } + + &--disabled, + &[disabled] { + cursor: auto; + opacity: 1; + pointer-events: none; + color: var(--hover-secondary); + } +} From 5b5b2cd7df933d82babd80de829ed929e8da1db1 Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Thu, 20 Jan 2022 00:04:22 +0530 Subject: [PATCH 027/115] Fixing warnings in unit test cases (#13349) --- .../edit-gas-tooltip/edit-gas-tooltip.js | 63 +++++++++++-------- .../latest-priority-fee-field.js | 10 +-- .../network-statistics/network-statistics.js | 13 ++-- ui/pages/swaps/fee-card/fee-card.js | 4 +- 4 files changed, 50 insertions(+), 40 deletions(-) diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/edit-gas-tooltip.js b/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/edit-gas-tooltip.js index d8ea809a4..f173c59c7 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/edit-gas-tooltip.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/edit-gas-tooltip.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useMemo } from 'react'; import PropTypes from 'prop-types'; import { EDIT_GAS_MODES, @@ -24,7 +24,7 @@ const EditGasToolTip = ({ transaction, t, }) => { - const toolTipMessage = () => { + const toolTipMessage = useMemo(() => { switch (priorityLevel) { case PRIORITY_LEVELS.LOW: return t('lowGasSettingToolTipMessage', [ @@ -76,7 +76,8 @@ const EditGasToolTip = ({ default: return ''; } - }; + }, [editGasMode, estimateGreaterThanGasUse, priorityLevel, transaction, t]); + return (
{priorityLevel !== PRIORITY_LEVELS.CUSTOM && @@ -97,9 +98,11 @@ const EditGasToolTip = ({
) : null} -
- {toolTipMessage()} -
+ {toolTipMessage && ( +
+ {toolTipMessage} +
+ )} {priorityLevel === PRIORITY_LEVELS.CUSTOM || estimateGreaterThanGasUse ? null : (
@@ -111,13 +114,15 @@ const EditGasToolTip = ({ > {t('maxBaseFee')} - - {maxFeePerGas} - + {maxFeePerGas && ( + + {maxFeePerGas} + + )}
{t('priorityFeeProperCase')} - - {maxPriorityFeePerGas} - + {maxPriorityFeePerGas && ( + + {maxPriorityFeePerGas} + + )}
{t('gasLimit')} - - {gasLimit} - + {gasLimit && ( + + {gasLimit} + + )}
)} diff --git a/ui/components/app/edit-gas-fee-popover/network-statistics/latest-priority-fee-field/latest-priority-fee-field.js b/ui/components/app/edit-gas-fee-popover/network-statistics/latest-priority-fee-field/latest-priority-fee-field.js index db2ec93ac..3fc9a7543 100644 --- a/ui/components/app/edit-gas-fee-popover/network-statistics/latest-priority-fee-field/latest-priority-fee-field.js +++ b/ui/components/app/edit-gas-fee-popover/network-statistics/latest-priority-fee-field/latest-priority-fee-field.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useMemo } from 'react'; import { uniq } from 'lodash'; import { roundToDecimalPlacesRemovingExtraZeroes } from '../../../../../helpers/utils/util'; import { useGasFeeContext } from '../../../../../contexts/gasFee'; @@ -8,7 +8,7 @@ import { PriorityFeeTooltip } from '../tooltips'; export default function LatestPriorityFeeField() { const { gasFeeEstimates } = useGasFeeContext(); - const renderPriorityFeeRange = () => { + const priorityFeeRange = useMemo(() => { const { latestPriorityFeeRange } = gasFeeEstimates; if (latestPriorityFeeRange) { const formattedRange = uniq([ @@ -18,12 +18,14 @@ export default function LatestPriorityFeeField() { return `${formattedRange} GWEI`; } return null; - }; + }, [gasFeeEstimates]); return (
- {renderPriorityFeeRange()} + {priorityFeeRange && ( + {priorityFeeRange} + )} diff --git a/ui/components/app/edit-gas-fee-popover/network-statistics/network-statistics.js b/ui/components/app/edit-gas-fee-popover/network-statistics/network-statistics.js index e03d14f80..81b92bc2e 100644 --- a/ui/components/app/edit-gas-fee-popover/network-statistics/network-statistics.js +++ b/ui/components/app/edit-gas-fee-popover/network-statistics/network-statistics.js @@ -30,13 +30,12 @@ const NetworkStatistics = () => {
- - {gasFeeEstimates?.estimatedBaseFee && - `${roundToDecimalPlacesRemovingExtraZeroes( - gasFeeEstimates?.estimatedBaseFee, - 0, - )} GWEI`} - + {gasFeeEstimates?.estimatedBaseFee && ( + {`${roundToDecimalPlacesRemovingExtraZeroes( + gasFeeEstimates?.estimatedBaseFee, + 0, + )} GWEI`} + )} diff --git a/ui/pages/swaps/fee-card/fee-card.js b/ui/pages/swaps/fee-card/fee-card.js index d044f77c7..fd1acd538 100644 --- a/ui/pages/swaps/fee-card/fee-card.js +++ b/ui/pages/swaps/fee-card/fee-card.js @@ -35,7 +35,7 @@ export default function FeeCard({ onQuotesClick, chainId, isBestQuote, - supportsEIP1559V2, + supportsEIP1559V2 = false, }) { const t = useContext(I18nContext); @@ -211,5 +211,5 @@ FeeCard.propTypes = { numberOfQuotes: PropTypes.number.isRequired, chainId: PropTypes.string.isRequired, isBestQuote: PropTypes.bool.isRequired, - supportsEIP1559V2: PropTypes.bool.isRequired, + supportsEIP1559V2: PropTypes.bool, }; From 5b92dc4cf08570e81277e74c39973a919c6eba0b Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Thu, 20 Jan 2022 00:04:43 +0530 Subject: [PATCH 028/115] Adding e2e test for edit gas fee modal (#13303) --- test/e2e/fixtures/eip-1559-v2-dapp/state.json | 145 +++++++++ test/e2e/fixtures/eip-1559-v2/state.json | 214 ++++++++++++++ test/e2e/helpers.js | 45 +++ test/e2e/tests/edit-gas-fee.spec.js | 277 ++++++++++++++++++ test/e2e/tests/send-edit.spec.js | 8 +- .../edit-gas-fee-button.js | 5 +- .../edit-gas-item/edit-gas-item.js | 1 + .../actionable-message/actionable-message.js | 4 +- .../transaction-alerts/transaction-alerts.js | 1 + 9 files changed, 694 insertions(+), 6 deletions(-) create mode 100644 test/e2e/fixtures/eip-1559-v2-dapp/state.json create mode 100644 test/e2e/fixtures/eip-1559-v2/state.json create mode 100644 test/e2e/tests/edit-gas-fee.spec.js diff --git a/test/e2e/fixtures/eip-1559-v2-dapp/state.json b/test/e2e/fixtures/eip-1559-v2-dapp/state.json new file mode 100644 index 000000000..3e29d737e --- /dev/null +++ b/test/e2e/fixtures/eip-1559-v2-dapp/state.json @@ -0,0 +1,145 @@ +{ + "data": { + "AppStateController": { + "mkrMigrationReminderTimestamp": null, + "swapsWelcomeMessageHasBeenShown": true + }, + "CachedBalancesController": { + "cachedBalances": { + "4": {} + } + }, + "CurrencyController": { + "conversionDate": 1575697244.188, + "conversionRate": 149.61, + "currentCurrency": "usd", + "nativeCurrency": "ETH" + }, + "IncomingTransactionsController": { + "incomingTransactions": {}, + "incomingTxLastFetchedBlocksByNetwork": { + "goerli": null, + "kovan": null, + "mainnet": null, + "rinkeby": 5570536 + } + }, + "KeyringController": { + "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" + }, + "NetworkController": { + "network": "1337", + "provider": { + "nickname": "Localhost 8545", + "rpcUrl": "http://localhost:8545", + "chainId": "0x539", + "ticker": "ETH", + "type": "rpc" + } + }, + "NotificationController": { + "notifications": { + "1": { + "isShown": true + }, + "3": { + "isShown": true + }, + "5": { + "isShown": true + }, + "6": { + "isShown": true + }, + "8": { + "isShown": true + } + } + }, + "OnboardingController": { + "onboardingTabs": {}, + "seedPhraseBackedUp": false + }, + "PermissionsMetadata": { + "domainMetadata": { + "metamask.github.io": { + "icon": null, + "name": "M E T A M A S K M E S H T E S T" + } + }, + "permissionsHistory": {}, + "permissionsLog": [ + { + "id": 746677923, + "method": "eth_accounts", + "methodType": "restricted", + "origin": "metamask.github.io", + "request": { + "id": 746677923, + "jsonrpc": "2.0", + "method": "eth_accounts", + "origin": "metamask.github.io", + "params": [] + }, + "requestTime": 1575697241368, + "response": { + "id": 746677923, + "jsonrpc": "2.0", + "result": [] + }, + "responseTime": 1575697241370, + "success": true + } + ] + }, + "PreferencesController": { + "accountTokens": { + "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { + "rinkeby": [], + "ropsten": [] + } + }, + "assetImages": {}, + "completedOnboarding": true, + "eip1559V2Enabled": true, + "currentLocale": "en", + "featureFlags": { + "showIncomingTransactions": true, + "transactionTime": false + }, + "firstTimeFlowType": "create", + "forgottenPassword": false, + "frequentRpcListDetail": [], + "identities": { + "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { + "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", + "name": "Account 1" + } + }, + "knownMethodData": {}, + "lostIdentities": {}, + "metaMetricsId": null, + "participateInMetaMetrics": false, + "preferences": { + "useNativeCurrencyAsPrimaryCurrency": true + }, + "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", + "suggestedTokens": {}, + "tokens": [], + "useBlockie": false, + "useNonceField": false, + "usePhishDetect": true + }, + "TransactionController": { + "transactions": {} + }, + "config": {}, + "firstTimeInfo": { + "date": 1575697234195, + "version": "7.7.0" + } + }, + "meta": { + "version": 40 + } +} diff --git a/test/e2e/fixtures/eip-1559-v2/state.json b/test/e2e/fixtures/eip-1559-v2/state.json new file mode 100644 index 000000000..452c896c3 --- /dev/null +++ b/test/e2e/fixtures/eip-1559-v2/state.json @@ -0,0 +1,214 @@ +{ + "data": { + "AppStateController": { + "mkrMigrationReminderTimestamp": null, + "swapsWelcomeMessageHasBeenShown": true + }, + "CachedBalancesController": { + "cachedBalances": { + "4": {} + } + }, + "CurrencyController": { + "conversionDate": 1575697244.188, + "conversionRate": 149.61, + "currentCurrency": "usd", + "nativeCurrency": "ETH" + }, + "IncomingTransactionsController": { + "incomingTransactions": {}, + "incomingTxLastFetchedBlocksByNetwork": { + "goerli": null, + "kovan": null, + "mainnet": null, + "rinkeby": 5570536 + } + }, + "KeyringController": { + "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" + }, + "NetworkController": { + "network": "1337", + "provider": { + "nickname": "Localhost 8545", + "rpcUrl": "http://localhost:8545", + "chainId": "0x539", + "ticker": "ETH", + "type": "rpc" + } + }, + "NotificationController": { + "notifications": { + "1": { + "isShown": true + }, + "3": { + "isShown": true + }, + "5": { + "isShown": true + }, + "6": { + "isShown": true + }, + "8": { + "isShown": true + } + } + }, + "OnboardingController": { + "onboardingTabs": {}, + "seedPhraseBackedUp": false + }, + "PermissionsMetadata": { + "domainMetadata": { + "metamask.github.io": { + "icon": null, + "name": "M E T A M A S K M E S H T E S T" + } + }, + "permissionsHistory": {}, + "permissionsLog": [ + { + "id": 746677923, + "method": "eth_accounts", + "methodType": "restricted", + "origin": "metamask.github.io", + "request": { + "id": 746677923, + "jsonrpc": "2.0", + "method": "eth_accounts", + "origin": "metamask.github.io", + "params": [] + }, + "requestTime": 1575697241368, + "response": { + "id": 746677923, + "jsonrpc": "2.0", + "result": [] + }, + "responseTime": 1575697241370, + "success": true + } + ] + }, + "PreferencesController": { + "accountTokens": { + "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { + "rinkeby": [], + "ropsten": [] + } + }, + "assetImages": {}, + "completedOnboarding": true, + "eip1559V2Enabled": true, + "currentLocale": "en", + "featureFlags": { + "showIncomingTransactions": true, + "transactionTime": false + }, + "firstTimeFlowType": "create", + "forgottenPassword": false, + "frequentRpcListDetail": [], + "identities": { + "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { + "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", + "name": "Account 1" + } + }, + "knownMethodData": {}, + "lostIdentities": {}, + "metaMetricsId": null, + "participateInMetaMetrics": false, + "preferences": { + "useNativeCurrencyAsPrimaryCurrency": true + }, + "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", + "suggestedTokens": {}, + "tokens": [], + "useBlockie": false, + "useNonceField": false, + "usePhishDetect": true + }, + "TransactionController": { + "transactions": { + "4046084157914634": { + "chainId": "0x539", + "primaryTransaction": { + "chainId": "0x539", + "id": 4046084157914634, + "loadingDefaults": true, + "metamaskNetworkId": "1337", + "origin": "metamask", + "status": "unapproved", + "time": 1617228030067, + "txParams": { + "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", + "gas": "0x61a8", + "maxFeePerGas": "0x59682f0c", + "maxPriorityFeePerGas": "0x59682f00", + "type": "0x2", + "to": "0x2f318C334780961FB129D2a6c30D0763d9a5C970", + "value": "0x1e87F85809dc0000" + }, + "type": "sentEther" + }, + "history": [ + { + "chainId": "0x539", + "id": 4046084157914634, + "loadingDefaults": true, + "metamaskNetworkId": "1337", + "origin": "metamask", + "status": "unapproved", + "time": 1617228030067, + "txParams": { + "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", + "gas": "0x61a8", + "maxFeePerGas": "0x59682f0c", + "maxPriorityFeePerGas": "0x59682f00", + "type": "0x2", + "to": "0x2f318C334780961FB129D2a6c30D0763d9a5C970", + "value": "0x1e87F85809dc0000" + }, + "type": "simpleSend" + }, + [ + { + "note": "Added new unapproved transaction.", + "op": "replace", + "path": "/loadingDefaults", + "timestamp": 1617228030069, + "value": false + } + ] + ], + "id": 4046084157914634, + "loadingDefaults": false, + "metamaskNetworkId": "1337", + "origin": "metamask", + "status": "unapproved", + "time": 1617228030067, + "txParams": { + "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", + "gas": "0x61a8", + "maxFeePerGas": "0x59682f0c", + "maxPriorityFeePerGas": "0x59682f00", + "type": "0x2", + "to": "0x2f318C334780961FB129D2a6c30D0763d9a5C970", + "value": "0x1e87F85809dc0000" + }, + "type": "simpleSend" + } + } + }, + "config": {}, + "firstTimeInfo": { + "date": 1575697234195, + "version": "7.7.0" + } + }, + "meta": { + "version": 40 + } +} diff --git a/test/e2e/helpers.js b/test/e2e/helpers.js index 76d0976b4..6b662f1a6 100644 --- a/test/e2e/helpers.js +++ b/test/e2e/helpers.js @@ -149,10 +149,55 @@ async function withFixtures(options, testSuite) { } } +/** + * @param {*} driver - selinium driver + * @param {*} handlesCount - total count of windows that should be loaded + * @returns handles - an object with window handles, properties in object represent windows: + * 1. extension: metamask extension window + * 2. dapp: test-app window + * 3. popup: metsmask extension popup window + */ +const getWindowHandles = async (driver, handlesCount) => { + await driver.waitUntilXWindowHandles(handlesCount); + const windowHandles = await driver.getAllWindowHandles(); + + const extension = windowHandles[0]; + const dapp = await driver.switchToWindowWithTitle( + 'E2E Test Dapp', + windowHandles, + ); + const popup = windowHandles.find( + (handle) => handle !== extension && handle !== dapp, + ); + return { extension, dapp, popup }; +}; + +const connectDappWithExtensionPopup = async (driver) => { + await driver.openNewPage(`http://127.0.0.1:${dappPort}/`); + await driver.delay(regularDelayMs); + await driver.clickElement({ text: 'Connect', tag: 'button' }); + await driver.delay(regularDelayMs); + + const windowHandles = await getWindowHandles(driver, 3); + + // open extension popup and confirm connect + await driver.switchToWindow(windowHandles.popup); + await driver.delay(largeDelayMs); + await driver.clickElement({ text: 'Next', tag: 'button' }); + await driver.clickElement({ text: 'Connect', tag: 'button' }); + + // send from dapp + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindow(windowHandles.dapp); + await driver.delay(regularDelayMs); +}; + module.exports = { + getWindowHandles, convertToHexValue, tinyDelayMs, regularDelayMs, largeDelayMs, withFixtures, + connectDappWithExtensionPopup, }; diff --git a/test/e2e/tests/edit-gas-fee.spec.js b/test/e2e/tests/edit-gas-fee.spec.js new file mode 100644 index 000000000..9c43c9e79 --- /dev/null +++ b/test/e2e/tests/edit-gas-fee.spec.js @@ -0,0 +1,277 @@ +const { strict: assert } = require('assert'); +const { + convertToHexValue, + connectDappWithExtensionPopup, + getWindowHandles, + largeDelayMs, + withFixtures, + regularDelayMs, +} = require('../helpers'); + +if (process.env.EIP_1559_V2 === '1') { + describe('Editing Confirm Transaction', function () { + it('allows selecting high, medium, low gas estimates on edit gas fee popover', async function () { + const ganacheOptions = { + hardfork: 'london', + accounts: [ + { + secretKey: + '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: convertToHexValue(25000000000000000000), + }, + ], + }; + await withFixtures( + { + fixtures: 'eip-1559-v2', + ganacheOptions, + title: this.test.title, + }, + async ({ driver }) => { + await driver.navigate(); + + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + + const transactionAmounts = await driver.findElements( + '.currency-display-component__text', + ); + const transactionAmount = transactionAmounts[0]; + assert.equal(await transactionAmount.getText(), '2.2'); + + // update estimates to high + await driver.clickElement('[data-testid="edit-gas-fee-button"]'); + await driver.delay(regularDelayMs); + await driver.clickElement('[data-testid="edit-gas-fee-item-high"]'); + await driver.delay(regularDelayMs); + await driver.waitForSelector({ text: '🦍' }); + await driver.waitForSelector({ + text: 'Aggressive', + }); + + // update estimates to medium + await driver.clickElement('[data-testid="edit-gas-fee-button"]'); + await driver.delay(regularDelayMs); + await driver.clickElement('[data-testid="edit-gas-fee-item-medium"]'); + await driver.delay(regularDelayMs); + await driver.waitForSelector({ text: '🦊' }); + await driver.waitForSelector({ + text: 'Market', + }); + + // update estimates to low + await driver.clickElement('[data-testid="edit-gas-fee-button"]'); + await driver.delay(regularDelayMs); + await driver.clickElement('[data-testid="edit-gas-fee-item-low"]'); + await driver.delay(regularDelayMs); + await driver.waitForSelector({ text: '🐢' }); + await driver.waitForSelector({ + text: 'Low', + }); + await driver.waitForSelector('[data-testid="low-gas-fee-alert"]'); + + // confirms the transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.delay(regularDelayMs); + + await driver.clickElement('[data-testid="home__activity-tab"]'); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .transaction-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); + + const txValues = await driver.findElements( + '.transaction-list-item__primary-currency', + ); + assert.equal(txValues.length, 1); + assert.ok(/-2.2\s*ETH/u.test(await txValues[0].getText())); + }, + ); + }); + + it('allows accessing advance gas fee popover from edit gas fee popover', async function () { + const ganacheOptions = { + hardfork: 'london', + accounts: [ + { + secretKey: + '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: convertToHexValue(25000000000000000000), + }, + ], + }; + await withFixtures( + { + fixtures: 'eip-1559-v2', + ganacheOptions, + title: this.test.title, + }, + async ({ driver }) => { + await driver.navigate(); + + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + + const transactionAmounts = await driver.findElements( + '.currency-display-component__text', + ); + const transactionAmount = transactionAmounts[0]; + assert.equal(await transactionAmount.getText(), '2.2'); + + // update estimates to high + await driver.clickElement('[data-testid="edit-gas-fee-button"]'); + await driver.delay(regularDelayMs); + await driver.clickElement('[data-testid="edit-gas-fee-item-custom"]'); + await driver.delay(regularDelayMs); + + // enter max fee + const maxBaseFee = await driver.findElement( + '[data-testid="base-fee-input"]', + ); + await maxBaseFee.clear(); + await maxBaseFee.sendKeys('8'); + await driver.delay(regularDelayMs); + + // enter priority fee + const priorityFee = await driver.findElement( + '[data-testid="priority-fee-input"]', + ); + await priorityFee.clear(); + await priorityFee.sendKeys('8'); + await driver.delay(regularDelayMs); + + // save default values + await driver.clickElement('input[type="checkbox"]'); + await driver.delay(regularDelayMs); + + // edit gas limit + await driver.clickElement('[data-testid="advanced-gas-fee-edit"]'); + await driver.delay(regularDelayMs); + const gasLimit = await driver.findElement( + '[data-testid="gas-limit-input"]', + ); + await gasLimit.clear(); + await gasLimit.sendKeys('100000'); + await driver.delay(regularDelayMs); + + // Submit gas fee changes + await driver.clickElement({ text: 'Save', tag: 'button' }); + + // has correct updated value on the confirm screen the transaction + const editedTransactionAmounts = await driver.findElements( + '.transaction-detail-item__row .transaction-detail-item__detail-values .currency-display-component__text:last-of-type', + ); + const editedTransactionAmount = editedTransactionAmounts[0]; + assert.equal(await editedTransactionAmount.getText(), '0.0008'); + + const editedTransactionFee = editedTransactionAmounts[1]; + assert.equal(await editedTransactionFee.getText(), '2.2008'); + + // confirms the transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.delay(regularDelayMs); + + await driver.clickElement('[data-testid="home__activity-tab"]'); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .transaction-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); + + const txValues = await driver.findElements( + '.transaction-list-item__primary-currency', + ); + assert.equal(txValues.length, 1); + assert.ok(/-2.2\s*ETH/u.test(await txValues[0].getText())); + }, + ); + }); + + it('should use dapp suggested estimates for transaction coming from dapp', async function () { + const ganacheOptions = { + hardfork: 'london', + accounts: [ + { + secretKey: + '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: convertToHexValue(25000000000000000000), + }, + ], + }; + await withFixtures( + { + fixtures: 'eip-1559-v2-dapp', + ganacheOptions, + title: this.test.title, + dapp: true, + }, + async ({ driver }) => { + await driver.navigate(); + + // login to extension + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + + // open dapp and connect + await connectDappWithExtensionPopup(driver); + await driver.clickElement({ text: 'Send', tag: 'button' }); + + // check transaction in extension popup + const windowHandles = await getWindowHandles(driver, 3); + await driver.switchToWindow(windowHandles.popup); + await driver.delay(largeDelayMs); + await driver.waitForSelector({ text: '🌐' }); + await driver.waitForSelector({ + text: 'Site suggested', + }); + + await driver.clickElement('[data-testid="edit-gas-fee-button"]'); + await driver.delay(regularDelayMs); + await driver.clickElement( + '[data-testid="edit-gas-fee-item-dappSuggested"]', + ); + await driver.delay(regularDelayMs); + + const transactionAmounts = await driver.findElements( + '.currency-display-component__text', + ); + const transactionAmount = transactionAmounts[0]; + assert.equal(await transactionAmount.getText(), '3'); + + // has correct updated value on the confirm screen the transaction + const editedTransactionAmounts = await driver.findElements( + '.transaction-detail-item__row .transaction-detail-item__detail-values .currency-display-component__text:last-of-type', + ); + const editedTransactionAmount = editedTransactionAmounts[0]; + assert.equal(await editedTransactionAmount.getText(), '0.00042'); + + const editedTransactionFee = editedTransactionAmounts[1]; + assert.equal(await editedTransactionFee.getText(), '3.00042'); + + // confirms the transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.delay(regularDelayMs); + + // transaction should correct values in activity tab + await driver.switchToWindow(windowHandles.extension); + await driver.clickElement('[data-testid="home__activity-tab"]'); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .transaction-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); + + const txValues = await driver.findElements( + '.transaction-list-item__primary-currency', + ); + assert.equal(txValues.length, 1); + assert.ok(/-3\s*ETH/u.test(await txValues[0].getText())); + }, + ); + }); + }); +} diff --git a/test/e2e/tests/send-edit.spec.js b/test/e2e/tests/send-edit.spec.js index 05562add9..f63796d53 100644 --- a/test/e2e/tests/send-edit.spec.js +++ b/test/e2e/tests/send-edit.spec.js @@ -145,7 +145,7 @@ describe('Editing Confirm Transaction', function () { ); await maxBaseFee.clear(); await maxBaseFee.sendKeys('8'); - await driver.delay(largeDelayMs); + await driver.delay(regularDelayMs); // enter priority fee const priorityFee = await driver.findElement( @@ -153,7 +153,7 @@ describe('Editing Confirm Transaction', function () { ); await priorityFee.clear(); await priorityFee.sendKeys('8'); - await driver.delay(largeDelayMs); + await driver.delay(regularDelayMs); // edit gas limit const gasLimit = await driver.findElement( @@ -161,11 +161,11 @@ describe('Editing Confirm Transaction', function () { ); await gasLimit.clear(); await gasLimit.sendKeys('100000'); - await driver.delay(largeDelayMs); + await driver.delay(regularDelayMs); // save default values await driver.clickElement('input[type="checkbox"]'); - await driver.delay(largeDelayMs); + await driver.delay(regularDelayMs); // Submit gas fee changes await driver.clickElement({ text: 'Save', tag: 'button' }); diff --git a/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.js b/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.js index f8791918e..468624408 100644 --- a/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.js +++ b/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.js @@ -48,7 +48,10 @@ export default function EditGasFeeButton({ userAcknowledgedGasMissing }) { return (
-
-
- - {t('description')} - - - {description} - -
+ {description ? ( +
+ + {t('description')} + + + {description} + +
+ ) : null} {inPopUp ? null : renderSendButton()}
@@ -241,13 +244,13 @@ export default function CollectibleDetails({ collectible }) { margin: 0, marginBottom: 4, }} - overflowWrap={OVERFLOW_WRAP.BREAK_WORD} + className="collectible-details__image-link" > {image} @@ -268,17 +271,18 @@ export default function CollectibleDetails({ collectible }) { {t('contractAddress')} - {getEnvironmentType() === ENVIRONMENT_TYPE_POPUP - ? shortenAddress(address) - : address} + {inPopUp ? shortenAddress(address) : address} diff --git a/ui/components/app/collectible-details/index.scss b/ui/components/app/collectible-details/index.scss index 6ce5b556b..cb2e39273 100644 --- a/ui/components/app/collectible-details/index.scss +++ b/ui/components/app/collectible-details/index.scss @@ -55,13 +55,13 @@ $spacer-break-small: 16px; &__contract-link, &__image-link { - color: var(--primary-1); - overflow: hidden; - text-overflow: ellipsis; word-break: break-all; - &:hover { - color: var(--primary-3); + @media screen and (max-width: $break-small) { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 90%; } } diff --git a/ui/components/app/collectibles-tab/collectibles-tab.js b/ui/components/app/collectibles-tab/collectibles-tab.js index b0f0d07a8..34c18e032 100644 --- a/ui/components/app/collectibles-tab/collectibles-tab.js +++ b/ui/components/app/collectibles-tab/collectibles-tab.js @@ -117,6 +117,7 @@ export default function CollectiblesTab({ onAddNFT }) { marginBottom={12} justifyContent={JUSTIFY_CONTENT.CENTER} flexDirection={FLEX_DIRECTION.COLUMN} + className="collectibles-tab__link" > {t('learnMoreUpperCase')} @@ -154,27 +154,31 @@ export default function CollectiblesTab({ onAddNFT }) { alignItems={ALIGN_ITEMS.CENTER} justifyContent={JUSTIFY_CONTENT.CENTER} > - - {isMainnet && !useCollectibleDetection ? ( - - ) : ( - - )} - - - {t('or')} - + {!isMainnet && Object.keys(collections).length < 1 ? null : ( + <> + + {isMainnet && !useCollectibleDetection ? ( + + ) : ( + + )} + + + {t('or')} + + + )} { }); useEffect(() => { - if (token.isERC721) { + if (token.isERC721 && process.env.COLLECTIBLES_V1) { dispatch( showModal({ name: 'CONVERT_TOKEN_TO_NFT', diff --git a/ui/components/app/wallet-overview/token-overview.test.js b/ui/components/app/wallet-overview/token-overview.test.js index 8cd15c1bb..77ab8ec16 100644 --- a/ui/components/app/wallet-overview/token-overview.test.js +++ b/ui/components/app/wallet-overview/token-overview.test.js @@ -54,6 +54,7 @@ describe('TokenOverview', () => { }); it('should show ConvertTokenToNFT modal when token passed in props is an ERC721', () => { + process.env.COLLECTIBLES_V1 = true; const token = { name: 'test', isERC721: true, @@ -69,6 +70,7 @@ describe('TokenOverview', () => { name: 'CONVERT_TOKEN_TO_NFT', tokenAddress: '0x01', }); + process.env.COLLECTIBLES_V1 = false; }); }); }); diff --git a/ui/css/itcss/components/send.scss b/ui/css/itcss/components/send.scss index 512f21fc1..113f46eec 100644 --- a/ui/css/itcss/components/send.scss +++ b/ui/css/itcss/components/send.scss @@ -203,12 +203,12 @@ box-shadow: 2px 2px 2px var(--alto); } -.customize-gas-tooltip-container input[type="number"]::-webkit-inner-spin-button { +.customize-gas-tooltip-container input[type='number']::-webkit-inner-spin-button { -webkit-appearance: none; display: none; } -.customize-gas-tooltip-container input[type="number"]:hover::-webkit-inner-spin-button { +.customize-gas-tooltip-container input[type='number']:hover::-webkit-inner-spin-button { -webkit-appearance: none; display: none; } @@ -684,10 +684,19 @@ flex-grow: 1; } + @media screen and (max-width: $break-small) { + &__asset-data { + width: 60%; + } + } + &__symbol { @include Paragraph; margin-bottom: 2px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } &__name { @@ -1061,12 +1070,12 @@ justify-content: center; } - input[type="number"]::-webkit-inner-spin-button { + input[type='number']::-webkit-inner-spin-button { -webkit-appearance: none; display: none; } - input[type="number"]:hover::-webkit-inner-spin-button { + input[type='number']:hover::-webkit-inner-spin-button { -webkit-appearance: none; display: none; } diff --git a/ui/ducks/send/send.js b/ui/ducks/send/send.js index aac325d54..4d6090168 100644 --- a/ui/ducks/send/send.js +++ b/ui/ducks/send/send.js @@ -1438,7 +1438,10 @@ export function updateSendAsset({ type, details }) { details.address, userAddress, ); - if (standard === ERC721 || standard === ERC1155) { + if ( + process.env.COLLECTIBLES_V1 && + (standard === ERC721 || standard === ERC1155) + ) { await dispatch(hideLoadingIndication()); dispatch( showModal({ diff --git a/ui/ducks/send/send.test.js b/ui/ducks/send/send.test.js index 9359c4253..93f082170 100644 --- a/ui/ducks/send/send.test.js +++ b/ui/ducks/send/send.test.js @@ -1524,6 +1524,7 @@ describe('Send Slice', () => { }); it('should show ConvertTokenToNFT modal and throw "invalidAssetType" error when token passed in props is an ERC721 or ERC1155', async () => { + process.env.COLLECTIBLES_V1 = true; getTokenStandardAndDetailsStub.mockImplementation(() => Promise.resolve({ standard: 'ERC1155' }), ); @@ -1552,6 +1553,7 @@ describe('Send Slice', () => { }, type: 'UI_MODAL_OPEN', }); + process.env.COLLECTIBLES_V1 = false; }); }); diff --git a/ui/store/actions.js b/ui/store/actions.js index 6473d2c58..8e3c1dbd2 100644 --- a/ui/store/actions.js +++ b/ui/store/actions.js @@ -2767,13 +2767,26 @@ export function loadingTokenParamsFinished() { }; } -export function getTokenParams(tokenAddress) { +export function getTokenParams(address) { return (dispatch, getState) => { const tokenList = getTokenList(getState()); const existingTokens = getState().metamask.tokens; - const existingToken = existingTokens.find(({ address }) => - isEqualCaseInsensitive(tokenAddress, address), + const { selectedAddress } = getState().metamask; + const { chainId } = getState().metamask.provider; + const existingCollectibles = getState().metamask?.allCollectibles?.[ + selectedAddress + ]?.[chainId]; + const existingToken = existingTokens.find(({ address: tokenAddress }) => + isEqualCaseInsensitive(address, tokenAddress), ); + const existingCollectible = existingCollectibles?.find( + ({ address: collectibleAddress }) => + isEqualCaseInsensitive(address, collectibleAddress), + ); + + if (existingCollectible) { + return null; + } if (existingToken) { return Promise.resolve({ @@ -2785,9 +2798,9 @@ export function getTokenParams(tokenAddress) { dispatch(loadingTokenParamsStarted()); log.debug(`loadingTokenParams`); - return getSymbolAndDecimals(tokenAddress, tokenList).then( + return getSymbolAndDecimals(address, tokenList).then( ({ symbol, decimals }) => { - dispatch(addToken(tokenAddress, symbol, Number(decimals))); + dispatch(addToken(address, symbol, Number(decimals))); dispatch(loadingTokenParamsFinished()); }, ); From 4c8ea8fdbd87540ae21f5d6bebf8f8a04da59e98 Mon Sep 17 00:00:00 2001 From: sooyoung Date: Sat, 22 Jan 2022 00:54:03 +0900 Subject: [PATCH 036/115] Fix typo in from-import-ui.spec.js (#13369) --- test/e2e/tests/from-import-ui.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/e2e/tests/from-import-ui.spec.js b/test/e2e/tests/from-import-ui.spec.js index c68285682..d93800485 100644 --- a/test/e2e/tests/from-import-ui.spec.js +++ b/test/e2e/tests/from-import-ui.spec.js @@ -284,10 +284,10 @@ describe('Metamask Import UI', function () { await driver.delay(regularDelayMs); await driver.clickElement('.account-menu__icon'); - const accountListItemsAgfterRemoval = await driver.findElements( + const accountListItemsAfterRemoval = await driver.findElements( '.account-menu__account', ); - assert.equal(accountListItemsAgfterRemoval.length, 4); + assert.equal(accountListItemsAfterRemoval.length, 4); }, ); }); From f631684fdde3e1459628f991495a21c65866596f Mon Sep 17 00:00:00 2001 From: Tim Bansemer Date: Fri, 21 Jan 2022 23:58:40 +0800 Subject: [PATCH 037/115] Add German subtitles for SRP Video (#13368) --- .../recovery-onboarding/subtitles/de.vtt | 116 ++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 app/images/videos/recovery-onboarding/subtitles/de.vtt diff --git a/app/images/videos/recovery-onboarding/subtitles/de.vtt b/app/images/videos/recovery-onboarding/subtitles/de.vtt new file mode 100644 index 000000000..9b5612285 --- /dev/null +++ b/app/images/videos/recovery-onboarding/subtitles/de.vtt @@ -0,0 +1,116 @@ +WEBVTT + +1 +00:00:00.780 --> 00:00:04.580 +MetaMask ist eine neue Möglichkeit, sich mit +Webseiten und Anwendungen zu verbinden. + +2 +00:00:04.580 --> 00:00:08.860 +Auf traditionellen Webseiten ist eine +zentrale Datenbank für die Steuerung und + +3 +00:00:08.860 --> 00:00:10.179 +Wiederherstellung der Konten zuständig. + +4 +00:00:10.179 --> 00:00:15.050 +Bei MetaMask gehört all diese Macht dem +Besitzer eines „Hauptschlüssels“. + +5 +00:00:15.050 --> 00:00:18.460 +Wer den Schlüssel besitzt, kontrolliert +das Wallet und damit die Konten. + +6 +00:00:18.460 --> 00:00:21.110 +Der geheime Satz zur Wiederherstellung +Deines Wallets ist der „Hauptschlüssel“. + +7 +00:00:21.110 --> 00:00:26.070 +Es ist eine Reihe von 12 Wörtern, welche generiert werden, +wenn MetaMask zum ersten Mal eingerichtet wird, diese erlauben dir + +8 +00:00:26.070 --> 00:00:30.120 +Deinen „Hauptschlüssel“ zu Deinem Wallet wieder herzustellen, +solltest Du jemals den Zugriff darauf verlieren. + +9 +00:00:30.120 --> 00:00:33.451 +Es ist wichtig, dass Du Dein Wallet sicherst, +indem Du Deinen geheimen + +10 +00:00:33.451 --> 00:00:37.510 +Wiederherstellungssatz sicher +und geheim verwahrst. + +11 +00:00:37.510 --> 00:00:41.429 +Wenn jemand Zugriff darauf erhält, hat er +den „Hauptschlüssel“ für Dein Wallet und kann + +12 +00:00:41.429 --> 00:00:45.190 +frei auf Deine Konten zugreifen und alle Gelder stehlen. + +13 +00:00:45.190 --> 00:00:50.109 +Um Dein MetaMask-Wallet zu sichern, musst Du Deinen +geheimen Wiederherstellungssatz sicher speichern. + +14 +00:00:50.109 --> 00:00:54.930 +Du kannst ihn aufschreiben, irgendwo verstecken, +in ein Schließfach legen + +15 +00:00:54.930 --> 00:00:57.729 +oder in einen sicheren Passwort-Manager speichern. + +16 +00:00:57.729 --> 00:01:01.050 +Einige Benutzer gravieren ihren +Satz sogar auf eine Metallplatte. + +17 +00:01:01.050 --> 00:01:04.440 +Niemand, nicht einmal das Team von MetaMask, +kann Dir dabei helfen + +18 +00:01:04.440 --> 00:01:07.820 +Dein Wallet wiederherzustellen, wenn Du Deinen +geheimen Wiederherstellungssatz verlierst. + +19 +00:01:07.820 --> 00:01:12.072 +Wenn Du Deinen geheimen Wiederherstellungssatz noch nicht +aufgeschrieben und an einem sicheren Ort aufbewahrt hast, + +20 +00:01:12.072 --> 00:01:15.492 +mach es jetzt. Wir warten solange. + +21 +00:01:15.500 --> 00:01:20.780 +Und denk daran, teilen Deinen geheimen Wiederherstellungssatz +niemals: nicht einmal mit uns. + +22 +00:01:20.780 --> 00:01:24.910 +Wenn dich jemals jemand danach fragt, +versucht er dich zu betrügen. + +23 +00:01:24.910 --> 00:01:26.250 +Das ist alles! + +24 +00:01:26.250 --> 00:01:31.020 +Jetzt weist Du, was ein geheimer Wiederherstellungssatz ist +und wie Du dafür sorgst, das Dein Wallete sicher bleibt. From 5579061cfa62d4a663daa0dba309a8896036289f Mon Sep 17 00:00:00 2001 From: VSaric <92527393+VSaric@users.noreply.github.com> Date: Fri, 21 Jan 2022 16:58:59 +0100 Subject: [PATCH 038/115] Proper calculation of the gas limit (#12784) --- app/_locales/en/messages.json | 3 + app/scripts/controllers/transactions/index.js | 1 + .../transactions/tx-state-manager.js | 2 + shared/constants/transaction.js | 4 ++ .../edit-gas-display.component.js | 18 +++++ .../edit-gas-popover.component.js | 4 ++ ui/ducks/send/send.js | 15 +++- ui/ducks/send/send.test.js | 72 ++++++------------- ui/hooks/gasFeeInput/useGasFeeInputs.js | 10 +++ 9 files changed, 75 insertions(+), 54 deletions(-) diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 44fa92710..495781f05 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -1210,6 +1210,9 @@ "gasLimitInfoTooltipContent": { "message": "Gas limit is the maximum amount of units of gas you are willing to spend." }, + "gasLimitRecommended": { + "message": "Recommended gas limit is $1. If the gas limit is less than that, it may fail." + }, "gasLimitTooLow": { "message": "Gas limit must be at least 21000" }, diff --git a/app/scripts/controllers/transactions/index.js b/app/scripts/controllers/transactions/index.js index f717a1db2..771fc0ee7 100644 --- a/app/scripts/controllers/transactions/index.js +++ b/app/scripts/controllers/transactions/index.js @@ -541,6 +541,7 @@ export default class TransactionController extends EventEmitter { if (defaultGasLimit && !txMeta.txParams.gas) { txMeta.txParams.gas = defaultGasLimit; + txMeta.originalGasEstimate = defaultGasLimit; } return txMeta; } diff --git a/app/scripts/controllers/transactions/tx-state-manager.js b/app/scripts/controllers/transactions/tx-state-manager.js index aa753be82..74ba5dca0 100644 --- a/app/scripts/controllers/transactions/tx-state-manager.js +++ b/app/scripts/controllers/transactions/tx-state-manager.js @@ -117,6 +117,8 @@ export default class TransactionStateManager extends EventEmitter { time: new Date().getTime(), status: TRANSACTION_STATUSES.UNAPPROVED, metamaskNetworkId: netId, + originalGasEstimate: opts.txParams?.gas, + userEditedGasLimit: false, chainId, loadingDefaults: true, dappSuggestedGasFees, diff --git a/shared/constants/transaction.js b/shared/constants/transaction.js index 9a41a9dda..929e2bf71 100644 --- a/shared/constants/transaction.js +++ b/shared/constants/transaction.js @@ -226,6 +226,10 @@ export const TRANSACTION_GROUP_CATEGORIES = { * TransactionMeta object. * @property {string} origin - A string representing the interface that * suggested the transaction. + * @property {string} originalGasEstimate - A string representing the original + * gas estimation on the transaction metadata. + * @property {boolean} userEditedGasLimit - A boolean representing when the + * user manually edited the gas limit. * @property {Object} nonceDetails - A metadata object containing information * used to derive the suggested nonce, useful for debugging nonce issues. * @property {string} rawTx - A hex string of the final signed transaction, diff --git a/ui/components/app/edit-gas-display/edit-gas-display.component.js b/ui/components/app/edit-gas-display/edit-gas-display.component.js index c72d606c5..0d5c659fc 100644 --- a/ui/components/app/edit-gas-display/edit-gas-display.component.js +++ b/ui/components/app/edit-gas-display/edit-gas-display.component.js @@ -2,6 +2,7 @@ import React, { useContext, useLayoutEffect, useRef, useState } from 'react'; import { useSelector } from 'react-redux'; import PropTypes from 'prop-types'; +import BigNumber from 'bignumber.js'; import { GAS_RECOMMENDATIONS, EDIT_GAS_MODES, @@ -57,6 +58,7 @@ export default function EditGasDisplay({ setGasPrice, gasLimit, setGasLimit, + properGasLimit, estimateToUse, setEstimateToUse, estimatedMinimumFiat, @@ -107,6 +109,11 @@ export default function EditGasDisplay({ dappSuggestedAndTxParamGasFeesAreTheSame, ); + let warningMessage; + if (new BigNumber(gasLimit).lessThan(new BigNumber(properGasLimit))) { + warningMessage = t('gasLimitRecommended', [properGasLimit]); + } + const showTopError = (balanceError || estimatesUnavailableWarning) && (!isGasEstimatesLoading || txParamsHaveBeenCustomized); @@ -138,6 +145,16 @@ export default function EditGasDisplay({
)} + {warningMessage && ( +
+ +
+ )} {requireDappAcknowledgement && !isGasEstimatesLoading && (
{ const state = thunkApi.getState(); const { send, metamask } = state; + const unapprovedTxs = getUnapprovedTxs(state); + const transaction = unapprovedTxs[send.draftTransaction.id]; const isNonStandardEthChain = getIsNonStandardEthChain(state); const chainId = getCurrentChainId(state); - if (send.stage !== SEND_STAGES.EDIT) { + if ( + send.stage !== SEND_STAGES.EDIT || + !transaction.dappSuggestedGasFees?.gas || + !transaction.userEditedGasLimit + ) { const gasLimit = await estimateGasLimitForSend({ gasPrice: send.gas.gasPrice, blockGasLimit: metamask.currentBlockGasLimit, @@ -1662,15 +1668,18 @@ export function signTransaction() { // merge in the modified txParams. Once the transaction has been modified // we can send that to the background to update the transaction in state. const unapprovedTxs = getUnapprovedTxs(state); + const unapprovedTx = unapprovedTxs[id]; // We only update the tx params that can be changed via the edit flow UX const eip1559OnlyTxParamsToUpdate = { data: txParams.data, from: txParams.from, to: txParams.to, value: txParams.value, - gas: txParams.gas, + gas: unapprovedTx.userEditedGasLimit + ? unapprovedTx.txParams.gas + : txParams.gas, }; - const unapprovedTx = unapprovedTxs[id]; + unapprovedTx.originalGasEstimate = eip1559OnlyTxParamsToUpdate.gas; const editingTx = { ...unapprovedTx, txParams: Object.assign( diff --git a/ui/ducks/send/send.test.js b/ui/ducks/send/send.test.js index 93f082170..741b1370c 100644 --- a/ui/ducks/send/send.test.js +++ b/ui/ducks/send/send.test.js @@ -1303,10 +1303,7 @@ describe('Send Slice', () => { 'send/computeEstimatedGasLimit/pending', ); expect(actionResult[2].type).toStrictEqual( - 'metamask/gas/SET_CUSTOM_GAS_LIMIT', - ); - expect(actionResult[3].type).toStrictEqual( - 'send/computeEstimatedGasLimit/fulfilled', + 'send/computeEstimatedGasLimit/rejected', ); }); @@ -1355,10 +1352,7 @@ describe('Send Slice', () => { 'send/computeEstimatedGasLimit/pending', ); expect(actionResult[2].type).toStrictEqual( - 'metamask/gas/SET_CUSTOM_GAS_LIMIT', - ); - expect(actionResult[3].type).toStrictEqual( - 'send/computeEstimatedGasLimit/fulfilled', + 'send/computeEstimatedGasLimit/rejected', ); }); @@ -1398,16 +1392,13 @@ describe('Send Slice', () => { const actionResult = store.getActions(); - expect(actionResult).toHaveLength(4); + expect(actionResult).toHaveLength(3); expect(actionResult[0].type).toStrictEqual('send/updateSendAmount'); expect(actionResult[1].type).toStrictEqual( 'send/computeEstimatedGasLimit/pending', ); expect(actionResult[2].type).toStrictEqual( - 'metamask/gas/SET_CUSTOM_GAS_LIMIT', - ); - expect(actionResult[3].type).toStrictEqual( - 'send/computeEstimatedGasLimit/fulfilled', + 'send/computeEstimatedGasLimit/rejected', ); }); }); @@ -1460,7 +1451,7 @@ describe('Send Slice', () => { const actionResult = store.getActions(); - expect(actionResult).toHaveLength(4); + expect(actionResult).toHaveLength(3); expect(actionResult[0].type).toStrictEqual('send/updateAsset'); expect(actionResult[0].payload).toStrictEqual({ @@ -1473,10 +1464,7 @@ describe('Send Slice', () => { 'send/computeEstimatedGasLimit/pending', ); expect(actionResult[2].type).toStrictEqual( - 'metamask/gas/SET_CUSTOM_GAS_LIMIT', - ); - expect(actionResult[3].type).toStrictEqual( - 'send/computeEstimatedGasLimit/fulfilled', + 'send/computeEstimatedGasLimit/rejected', ); }); @@ -1503,7 +1491,7 @@ describe('Send Slice', () => { const actionResult = store.getActions(); - expect(actionResult).toHaveLength(6); + expect(actionResult).toHaveLength(5); expect(actionResult[0].type).toStrictEqual('SHOW_LOADING_INDICATION'); expect(actionResult[1].type).toStrictEqual('HIDE_LOADING_INDICATION'); expect(actionResult[2].payload).toStrictEqual({ @@ -1516,10 +1504,7 @@ describe('Send Slice', () => { 'send/computeEstimatedGasLimit/pending', ); expect(actionResult[4].type).toStrictEqual( - 'metamask/gas/SET_CUSTOM_GAS_LIMIT', - ); - expect(actionResult[5].type).toStrictEqual( - 'send/computeEstimatedGasLimit/fulfilled', + 'send/computeEstimatedGasLimit/rejected', ); }); @@ -1704,16 +1689,13 @@ describe('Send Slice', () => { const actionResult = store.getActions(); - expect(actionResult).toHaveLength(4); + expect(actionResult).toHaveLength(3); expect(actionResult[0].type).toStrictEqual('send/updateRecipient'); expect(actionResult[1].type).toStrictEqual( 'send/computeEstimatedGasLimit/pending', ); expect(actionResult[2].type).toStrictEqual( - 'metamask/gas/SET_CUSTOM_GAS_LIMIT', - ); - expect(actionResult[3].type).toStrictEqual( - 'send/computeEstimatedGasLimit/fulfilled', + 'send/computeEstimatedGasLimit/rejected', ); }); @@ -1772,7 +1754,7 @@ describe('Send Slice', () => { ); const actionResult = store.getActions(); - expect(actionResult).toHaveLength(4); + expect(actionResult).toHaveLength(3); expect(actionResult[0].type).toStrictEqual('send/updateRecipient'); expect(actionResult[0].payload.address).toStrictEqual( TEST_RECIPIENT_ADDRESS, @@ -1822,16 +1804,13 @@ describe('Send Slice', () => { const actionResult = store.getActions(); - expect(actionResult).toHaveLength(4); + expect(actionResult).toHaveLength(3); expect(actionResult[0].type).toStrictEqual('send/updateRecipient'); expect(actionResult[1].type).toStrictEqual( 'send/computeEstimatedGasLimit/pending', ); expect(actionResult[2].type).toStrictEqual( - 'metamask/gas/SET_CUSTOM_GAS_LIMIT', - ); - expect(actionResult[3].type).toStrictEqual( - 'send/computeEstimatedGasLimit/fulfilled', + 'send/computeEstimatedGasLimit/rejected', ); }); }); @@ -1896,7 +1875,7 @@ describe('Send Slice', () => { await store.dispatch(resetRecipientInput()); const actionResult = store.getActions(); - expect(actionResult).toHaveLength(7); + expect(actionResult).toHaveLength(6); expect(actionResult[0].type).toStrictEqual( 'send/updateRecipientUserInput', ); @@ -1906,13 +1885,10 @@ describe('Send Slice', () => { 'send/computeEstimatedGasLimit/pending', ); expect(actionResult[3].type).toStrictEqual( - 'metamask/gas/SET_CUSTOM_GAS_LIMIT', + 'send/computeEstimatedGasLimit/rejected', ); - expect(actionResult[4].type).toStrictEqual( - 'send/computeEstimatedGasLimit/fulfilled', - ); - expect(actionResult[5].type).toStrictEqual('ENS/resetEnsResolution'); - expect(actionResult[6].type).toStrictEqual( + expect(actionResult[4].type).toStrictEqual('ENS/resetEnsResolution'); + expect(actionResult[5].type).toStrictEqual( 'send/validateRecipientUserInput', ); }); @@ -1979,17 +1955,14 @@ describe('Send Slice', () => { const actionResult = store.getActions(); - expect(actionResult).toHaveLength(5); + expect(actionResult).toHaveLength(4); expect(actionResult[0].type).toStrictEqual('send/updateAmountMode'); expect(actionResult[1].type).toStrictEqual('send/updateAmountToMax'); expect(actionResult[2].type).toStrictEqual( 'send/computeEstimatedGasLimit/pending', ); expect(actionResult[3].type).toStrictEqual( - 'metamask/gas/SET_CUSTOM_GAS_LIMIT', - ); - expect(actionResult[4].type).toStrictEqual( - 'send/computeEstimatedGasLimit/fulfilled', + 'send/computeEstimatedGasLimit/rejected', ); }); @@ -2026,17 +1999,14 @@ describe('Send Slice', () => { const actionResult = store.getActions(); - expect(actionResult).toHaveLength(5); + expect(actionResult).toHaveLength(4); expect(actionResult[0].type).toStrictEqual('send/updateAmountMode'); expect(actionResult[1].type).toStrictEqual('send/updateSendAmount'); expect(actionResult[2].type).toStrictEqual( 'send/computeEstimatedGasLimit/pending', ); expect(actionResult[3].type).toStrictEqual( - 'metamask/gas/SET_CUSTOM_GAS_LIMIT', - ); - expect(actionResult[4].type).toStrictEqual( - 'send/computeEstimatedGasLimit/fulfilled', + 'send/computeEstimatedGasLimit/rejected', ); }); }); diff --git a/ui/hooks/gasFeeInput/useGasFeeInputs.js b/ui/hooks/gasFeeInput/useGasFeeInputs.js index 3e076076a..63f54753a 100644 --- a/ui/hooks/gasFeeInput/useGasFeeInputs.js +++ b/ui/hooks/gasFeeInput/useGasFeeInputs.js @@ -140,6 +140,12 @@ export function useGasFeeInputs( Number(hexToDecimal(transaction?.txParams?.gas ?? '0x0')), ); + const properGasLimit = Number(hexToDecimal(transaction?.originalGasEstimate)); + + const [userEditedGasLimit, setUserEditedGasLimit] = useState(() => + Boolean(transaction?.userEditedGasLimit), + ); + /** * In EIP-1559 V2 designs change to gas estimate is always updated to transaction * Thus callback setEstimateToUse can be deprecate in favour of this useEffect @@ -298,6 +304,7 @@ export function useGasFeeInputs( // Restore existing values setGasPrice(gasPrice); setGasLimit(gasLimit); + setUserEditedGasLimit(true); setMaxFeePerGas(maxFeePerGas); setMaxPriorityFeePerGas(maxPriorityFeePerGas); setGasPriceHasBeenManuallySet(true); @@ -309,6 +316,7 @@ export function useGasFeeInputs( gasPrice, setGasLimit, gasLimit, + setUserEditedGasLimit, setMaxFeePerGas, maxFeePerGas, setMaxPriorityFeePerGas, @@ -328,6 +336,8 @@ export function useGasFeeInputs( setGasPrice, gasLimit, setGasLimit, + properGasLimit, + userEditedGasLimit, editGasMode, estimateToUse, setEstimateToUse, From d25f0e5817ecdc8e37bfb144e4b7ebf299233421 Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Sat, 22 Jan 2022 05:50:49 +0530 Subject: [PATCH 039/115] Fix for checkbox on advance gas fee modal (#13366) --- .../advanced-gas-fee-defaults.js | 62 +++++++++++-------- .../advanced-gas-fee-defaults.test.js | 19 ++++++ .../advanced-gas-fee-defaults/index.scss | 4 ++ 3 files changed, 59 insertions(+), 26 deletions(-) diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.js b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.js index 05de4c655..a5b7c04c4 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.js +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useEffect, useState } from 'react'; import { useSelector, useDispatch } from 'react-redux'; import Box from '../../../ui/box'; @@ -19,7 +19,6 @@ import { useI18nContext } from '../../../../hooks/useI18nContext'; const AdvancedGasFeeDefaults = () => { const t = useI18nContext(); const dispatch = useDispatch(); - const { hasErrors, maxBaseFee, @@ -27,25 +26,34 @@ const AdvancedGasFeeDefaults = () => { } = useAdvancedGasFeePopoverContext(); const advancedGasFeeValues = useSelector(getAdvancedGasFeeValues); - const updateDefaultSettings = (value) => { - if (value) { + const [isDefaultSettingsSelected, setDefaultSettingsSelected] = useState( + Boolean(advancedGasFeeValues) && + advancedGasFeeValues.maxBaseFee === maxBaseFee && + advancedGasFeeValues.priorityFee === maxPriorityFeePerGas, + ); + + useEffect(() => { + setDefaultSettingsSelected( + Boolean(advancedGasFeeValues) && + advancedGasFeeValues.maxBaseFee === maxBaseFee && + advancedGasFeeValues.priorityFee === maxPriorityFeePerGas, + ); + }, [advancedGasFeeValues, maxBaseFee, maxPriorityFeePerGas]); + + const handleUpdateDefaultSettings = () => { + if (isDefaultSettingsSelected) { + dispatch(setAdvancedGasFee(null)); + setDefaultSettingsSelected(false); + } else { dispatch( setAdvancedGasFee({ maxBaseFee, priorityFee: maxPriorityFeePerGas, }), ); - } else { - dispatch(setAdvancedGasFee(null)); + setDefaultSettingsSelected(true); } }; - const isDefaultSettingsSelected = - Boolean(advancedGasFeeValues) && - advancedGasFeeValues.maxBaseFee === maxBaseFee && - advancedGasFeeValues.priorityFee === maxPriorityFeePerGas; - - const handleUpdateDefaultSettings = () => - updateDefaultSettings(!isDefaultSettingsSelected); return ( { marginRight={4} className="advanced-gas-fee-defaults" > - - - {!isDefaultSettingsSelected && Boolean(advancedGasFeeValues) - ? t('advancedGasFeeDefaultOptIn', [ - {t('newValues')}, - ]) - : t('advancedGasFeeDefaultOptOut')} - + ); }; diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js index fd83dd1e6..e7e280889 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js @@ -5,6 +5,7 @@ import { GAS_ESTIMATE_TYPES } from '../../../../../shared/constants/gas'; import { renderWithProvider } from '../../../../../test/lib/render-helpers'; import mockEstimates from '../../../../../test/data/mock-estimates.json'; import mockState from '../../../../../test/data/mock-state.json'; +import * as Actions from '../../../../store/actions'; import { AdvancedGasFeePopoverContextProvider } from '../context'; import { GasFeeContextProvider } from '../../../../contexts/gasFee'; @@ -20,6 +21,7 @@ jest.mock('../../../../store/actions', () => ({ .mockImplementation(() => Promise.resolve()), addPollingTokenToAppState: jest.fn(), removePollingTokenFromAppState: jest.fn(), + setAdvancedGasFee: jest.fn(), })); const render = (defaultGasParams) => { @@ -125,4 +127,21 @@ describe('AdvancedGasFeeDefaults', () => { screen.queryByText('Save these as my default for "Advanced"'), ).toBeInTheDocument(); }); + + it('should call action setAdvancedGasFee when checkbox or label text is clicked', () => { + render({ + advancedGasFee: { maxBaseFee: 50, priorityFee: 2 }, + }); + const mock = jest + .spyOn(Actions, 'setAdvancedGasFee') + .mockReturnValue({ type: 'test' }); + const checkboxLabel = screen.queryByText( + 'Always use these values and advanced setting as default.', + ); + fireEvent.click(checkboxLabel); + expect(mock).toHaveBeenCalledTimes(1); + const checkbox = document.querySelector('input[type=checkbox]'); + fireEvent.click(checkbox); + expect(mock).toHaveBeenCalledTimes(2); + }); }); diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/index.scss b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/index.scss index 814dd4722..771e3a1cb 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/index.scss +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/index.scss @@ -3,4 +3,8 @@ font-size: $font-size-h4; margin: 0 8px 0 8px; } + + &__label { + display: flex; + } } From 119e5497ff0db2d50bb2acc6b377ac2cda43cf86 Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Sat, 22 Jan 2022 05:53:02 +0530 Subject: [PATCH 040/115] UI fixes in EIP-1559 V2 screens (#13367) --- app/_locales/el/messages.json | 3 - app/_locales/en/messages.json | 9 +- app/_locales/fr/messages.json | 3 - app/_locales/hi/messages.json | 3 - app/_locales/id/messages.json | 3 - app/_locales/ja/messages.json | 3 - app/_locales/ko/messages.json | 3 - app/_locales/ru/messages.json | 3 - app/_locales/tl/messages.json | 3 - app/_locales/tr/messages.json | 3 - app/_locales/vi/messages.json | 3 - app/_locales/zh_CN/messages.json | 3 - .../base-fee-input/base-fee-input.js | 18 ++- .../advanced-gas-fee-inputs/utils.js | 13 +- .../advanced-gas-fee-popover.js | 7 +- .../edit-gas-fee-popover.js | 113 +++++++++--------- .../edit-gas-item/edit-gas-item.js | 6 +- .../edit-gas-tooltip/edit-gas-tooltip.js | 19 ++- .../edit-gas-tooltip/edit-gas-tooltip.test.js | 8 +- .../app/edit-gas-fee-popover/index.scss | 5 + .../network-statistics/index.scss | 10 +- .../latest-priority-fee-field.js | 16 +-- .../network-statistics/network-statistics.js | 23 ++-- .../network-statistics/tooltips.js | 10 +- ui/components/app/gas-timing/index.scss | 5 + ui/components/ui/loading-heartbeat/index.js | 13 +- ui/helpers/utils/util.js | 9 +- .../transaction-alerts/transaction-alerts.js | 12 +- .../transaction-alerts.test.js | 8 +- 29 files changed, 161 insertions(+), 176 deletions(-) diff --git a/app/_locales/el/messages.json b/app/_locales/el/messages.json index 4c308c91b..9512aa32e 100644 --- a/app/_locales/el/messages.json +++ b/app/_locales/el/messages.json @@ -1293,9 +1293,6 @@ "high": { "message": "Επιθετική" }, - "highGasSettingToolTipDialog": { - "message": "Υψηλή πιθανότητα, ακόμη και σε ευμετάβλητες αγορές" - }, "highGasSettingToolTipMessage": { "message": "Χρησιμοποιήστε $1 για να καλύψετε απότομες αυξήσεις της κίνησης του δικτύου λόγω των δημοφιλών ξεκινημάτων NFT.", "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 495781f05..d38ec374d 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -663,7 +663,7 @@ "message": "Customize Gas" }, "customGasSettingToolTipMessage": { - "message": "Use $1 to customise the gas price. This can be confusing if you aren’t familiar. Interact at your own risk.", + "message": "Use $1 to customize the gas price. This can be confusing if you aren’t familiar. Interact at your own risk.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold fontweight" }, "customGasSubTitle": { @@ -1360,11 +1360,8 @@ "high": { "message": "Aggressive" }, - "highGasSettingToolTipDialog": { - "message": "High probability, even in volatile markets" - }, "highGasSettingToolTipMessage": { - "message": "Use $1 to cover surges in network traffic due to things like popular NFT drops.", + "message": "High probability, even in volatile markets. Use $1 to cover surges in network traffic due to things like popular NFT drops.", "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" }, "highLowercase": { @@ -1654,7 +1651,7 @@ "message": "low" }, "lowPriorityMessage": { - "message": "Future transactions will queue after this one. This price was last seen was some time ago." + "message": "Future transactions will queue after this one." }, "mainnet": { "message": "Ethereum Mainnet" diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json index 7250f14c3..7d3fe77dc 100644 --- a/app/_locales/fr/messages.json +++ b/app/_locales/fr/messages.json @@ -1293,9 +1293,6 @@ "high": { "message": "Agressif" }, - "highGasSettingToolTipDialog": { - "message": "Probabilité élevée, même sur des marchés volatils" - }, "highGasSettingToolTipMessage": { "message": "Utilisez $1 pour couvrir les envolées du trafic réseau dues à des événements tels que les chutes de NFT populaires.", "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" diff --git a/app/_locales/hi/messages.json b/app/_locales/hi/messages.json index 25f9f5c7e..c70180b6c 100644 --- a/app/_locales/hi/messages.json +++ b/app/_locales/hi/messages.json @@ -1293,9 +1293,6 @@ "high": { "message": "आक्रामक" }, - "highGasSettingToolTipDialog": { - "message": "उच्च संभावना, अस्थिर बाजारों में भी" - }, "highGasSettingToolTipMessage": { "message": "लोकप्रिय NFT ड्रॉप जैसी चीज़ों की वजह से नेटवर्क ट्रैफिक में वृद्धि को कवर करने के लिए $1 का उपयोग करें।", "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" diff --git a/app/_locales/id/messages.json b/app/_locales/id/messages.json index b951b3887..624d4f4b3 100644 --- a/app/_locales/id/messages.json +++ b/app/_locales/id/messages.json @@ -1293,9 +1293,6 @@ "high": { "message": "Agresif" }, - "highGasSettingToolTipDialog": { - "message": "Probabilitas tinggi, bahkan di pasar yang tidak stabil" - }, "highGasSettingToolTipMessage": { "message": "Gunakan $1 untuk menutupi lonjakan lalu lintas jaringan karena hal-hal seperti penurunan NFT populer.", "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json index 3361819c2..aa098370c 100644 --- a/app/_locales/ja/messages.json +++ b/app/_locales/ja/messages.json @@ -1293,9 +1293,6 @@ "high": { "message": "積極的" }, - "highGasSettingToolTipDialog": { - "message": "変動の激しい市場においても高い確率" - }, "highGasSettingToolTipMessage": { "message": "人気のNFTドロップなどによるネットワークトラフィックの急増に備えるため、$1を使用してください。", "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index 4f1477f7a..d6663d856 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -1293,9 +1293,6 @@ "high": { "message": "공격적" }, - "highGasSettingToolTipDialog": { - "message": "변동성이 큰 시장에서도 높은 확률" - }, "highGasSettingToolTipMessage": { "message": "인기 있는 NFT의 하락 등으로 인한 네트워크 트래픽 급증을 커버하려면 $1을 사용하세요.", "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json index 99085c5f5..0b2d31fd2 100644 --- a/app/_locales/ru/messages.json +++ b/app/_locales/ru/messages.json @@ -1293,9 +1293,6 @@ "high": { "message": "Агрессивный" }, - "highGasSettingToolTipDialog": { - "message": "Высокая вероятность даже на волатильных рынках" - }, "highGasSettingToolTipMessage": { "message": "Используйте $1, чтобы компенсировать скачки сетевого трафика из-за таких событий, как дропы популярных NFT.", "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" diff --git a/app/_locales/tl/messages.json b/app/_locales/tl/messages.json index efef53600..7b9460350 100644 --- a/app/_locales/tl/messages.json +++ b/app/_locales/tl/messages.json @@ -1293,9 +1293,6 @@ "high": { "message": "Agresibo" }, - "highGasSettingToolTipDialog": { - "message": "Mataas na probabilidad, kahit sa mga pabagu-bagong market" - }, "highGasSettingToolTipMessage": { "message": "Gamitin ang $1 upang pagtakpan ang mga surge sa network traffic dahil sa mga bagay tulad ng popular na pagbagsak ng NFT.", "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" diff --git a/app/_locales/tr/messages.json b/app/_locales/tr/messages.json index 99f68d427..fb58a4f41 100644 --- a/app/_locales/tr/messages.json +++ b/app/_locales/tr/messages.json @@ -1293,9 +1293,6 @@ "high": { "message": "Agresif" }, - "highGasSettingToolTipDialog": { - "message": "Dalgalı piyasalarda dahi yüksek olasılık" - }, "highGasSettingToolTipMessage": { "message": "Popüler NFT düşüşleri gibi şeyler nedeniyle ağ trafiğindeki dalgalanmaları kapsayacak şekilde $1 kullanın.", "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" diff --git a/app/_locales/vi/messages.json b/app/_locales/vi/messages.json index 13edabecb..b3d64447e 100644 --- a/app/_locales/vi/messages.json +++ b/app/_locales/vi/messages.json @@ -1293,9 +1293,6 @@ "high": { "message": "Linh hoạt" }, - "highGasSettingToolTipDialog": { - "message": "Có khả năng cao, ngay cả trong thị trường biến động" - }, "highGasSettingToolTipMessage": { "message": "Sử dụng $1 để bù đắp khi lưu lượng mạng lưới tăng vọt trong những trường hợp như phát hành NFT nổi tiếng.", "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index 53f8da176..a2d28f57e 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -1293,9 +1293,6 @@ "high": { "message": "进取" }, - "highGasSettingToolTipDialog": { - "message": "高概率,即使在不稳定的市场中也是如此。" - }, "highGasSettingToolTipMessage": { "message": "使用$1来覆盖网络流量因像流行的 NFT 丢弃而出现的剧增。", "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/base-fee-input/base-fee-input.js b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/base-fee-input/base-fee-input.js index 26fcd93a8..2354faa84 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/base-fee-input/base-fee-input.js +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/base-fee-input/base-fee-input.js @@ -4,7 +4,11 @@ import { useSelector } from 'react-redux'; import { HIGH_FEE_WARNING_MULTIPLIER } from '../../../../../pages/send/send.constants'; import { PRIORITY_LEVELS } from '../../../../../../shared/constants/gas'; import { SECONDARY } from '../../../../../helpers/constants/common'; -import { bnGreaterThan, bnLessThan } from '../../../../../helpers/utils/util'; +import { + bnGreaterThan, + bnLessThan, + roundToDecimalPlacesRemovingExtraZeroes, +} from '../../../../../helpers/utils/util'; import { decGWEIToHexWEI } from '../../../../../helpers/utils/conversions.util'; import { getAdvancedGasFeeValues } from '../../../../../selectors'; import { useGasFeeContext } from '../../../../../contexts/gasFee'; @@ -16,10 +20,7 @@ import FormField from '../../../../ui/form-field'; import { useAdvancedGasFeePopoverContext } from '../../context'; import AdvancedGasFeeInputSubtext from '../../advanced-gas-fee-input-subtext'; -import { - roundToDecimalPlacesRemovingExtraZeroes, - renderFeeRange, -} from '../utils'; +import { renderFeeRange } from '../utils'; const validateBaseFee = (value, gasFeeEstimates, maxPriorityFeePerGas) => { if (bnGreaterThan(maxPriorityFeePerGas, value)) { @@ -60,10 +61,7 @@ const BaseFeeInput = () => { baseFeeTrend, } = gasFeeEstimates; const [baseFeeError, setBaseFeeError] = useState(); - const { - currency, - numberOfDecimals: numberOfDecimalsFiat, - } = useUserPreferencedCurrency(SECONDARY); + const { currency, numberOfDecimals } = useUserPreferencedCurrency(SECONDARY); const advancedGasFeeValues = useSelector(getAdvancedGasFeeValues); @@ -80,7 +78,7 @@ const BaseFeeInput = () => { const [, { value: baseFeeInFiat }] = useCurrencyDisplay( decGWEIToHexWEI(baseFee), - { currency, numberOfDecimalsFiat }, + { currency, numberOfDecimals }, ); const updateBaseFee = useCallback( diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/utils.js b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/utils.js index 4dfa8852a..8782628f8 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/utils.js +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/utils.js @@ -1,17 +1,6 @@ import { uniq } from 'lodash'; -import { toBigNumber } from '../../../../../shared/modules/conversion.utils'; -export function roundToDecimalPlacesRemovingExtraZeroes( - numberish, - numberOfDecimalPlaces, -) { - if (numberish) { - return toBigNumber.dec( - toBigNumber.dec(numberish).toFixed(numberOfDecimalPlaces), - ); - } - return null; -} +import { roundToDecimalPlacesRemovingExtraZeroes } from '../../../../helpers/utils/util'; export const renderFeeRange = (feeRange) => { if (feeRange) { diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-popover.js b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-popover.js index a422b2acf..d246c67c9 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-popover.js +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-popover.js @@ -13,11 +13,7 @@ import AdvancedGasFeeDefaults from './advanced-gas-fee-defaults'; const AdvancedGasFeePopover = () => { const t = useI18nContext(); - const { - closeAllModals, - closeModal, - currentModal, - } = useTransactionModalContext(); + const { closeAllModals, currentModal } = useTransactionModalContext(); if (currentModal !== 'advancedGasFee') { return null; @@ -28,7 +24,6 @@ const AdvancedGasFeePopover = () => { closeModal('advancedGasFee')} onClose={closeAllModals} footer={} > diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js index ee0dad1d3..cb11ed53b 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js @@ -6,6 +6,7 @@ import { } from '../../../../shared/constants/gas'; import { useI18nContext } from '../../../hooks/useI18nContext'; import { useTransactionModalContext } from '../../../contexts/transaction-modal'; +import Box from '../../ui/box'; import ErrorMessage from '../../ui/error-message'; import I18nValue from '../../ui/i18n-value'; import Popover from '../../ui/popover'; @@ -51,60 +52,64 @@ const EditGasFeePopover = () => {
- {balanceError && ( - - )} -
- - - - - {editGasMode !== EDIT_GAS_MODES.SWAPS && ( - - )} - - - - -
- {(editGasMode === EDIT_GAS_MODES.CANCEL || - editGasMode === EDIT_GAS_MODES.SPEED_UP) && ( - - )} - {editGasMode === EDIT_GAS_MODES.MODIFY_IN_PLACE && ( - - )} - - -
- {editGasMode === EDIT_GAS_MODES.MODIFY_IN_PLACE && ( - - )} - - - - - - , - ]} - /> - + + {balanceError && ( + + )} +
+ + + + + {editGasMode !== EDIT_GAS_MODES.SWAPS && ( + + )} + + + + +
+ {(editGasMode === EDIT_GAS_MODES.CANCEL || + editGasMode === EDIT_GAS_MODES.SPEED_UP) && ( + + )} + {editGasMode === EDIT_GAS_MODES.MODIFY_IN_PLACE && ( + + )} + + +
+ {editGasMode === EDIT_GAS_MODES.MODIFY_IN_PLACE && ( + + )} + + + + + + + + , + ]} + /> + +
diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js index f6a0104d6..7e8604405 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js @@ -121,7 +121,11 @@ const EditGasItem = ({ priorityLevel }) => { > {hexMaximumTransactionFee ? (
- + ) : null} - {priorityLevel === PRIORITY_LEVELS.HIGH && - editGasMode !== EDIT_GAS_MODES.SWAPS && - !estimateGreaterThanGasUse ? ( -
- - {t('highGasSettingToolTipDialog')} - -
- ) : null} {toolTipMessage && (
{toolTipMessage} @@ -120,7 +112,7 @@ const EditGasToolTip = ({ color={COLORS.NEUTRAL_GREY} className="edit-gas-tooltip__container__value" > - {maxFeePerGas} + {roundToDecimalPlacesRemovingExtraZeroes(maxFeePerGas, 4)} )}
@@ -138,7 +130,10 @@ const EditGasToolTip = ({ color={COLORS.NEUTRAL_GREY} className="edit-gas-tooltip__container__value" > - {maxPriorityFeePerGas} + {roundToDecimalPlacesRemovingExtraZeroes( + maxPriorityFeePerGas, + 4, + )} )}
@@ -156,7 +151,7 @@ const EditGasToolTip = ({ color={COLORS.NEUTRAL_GREY} className="edit-gas-tooltip__container__value" > - {gasLimit} + {roundToDecimalPlacesRemovingExtraZeroes(gasLimit, 4)} )}
diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/edit-gas-tooltip.test.js b/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/edit-gas-tooltip.test.js index e505b7d62..6c9adbadb 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/edit-gas-tooltip.test.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/edit-gas-tooltip.test.js @@ -63,8 +63,8 @@ describe('EditGasToolTip', () => { ...LOW_GAS_OPTION, }); - expect(queryByText('2.010203381')).toBeInTheDocument(); - expect(queryByText('1.20004164')).toBeInTheDocument(); + expect(queryByText('2.0102')).toBeInTheDocument(); + expect(queryByText('1.2')).toBeInTheDocument(); expect(queryByText('21000')).toBeInTheDocument(); }); @@ -73,7 +73,7 @@ describe('EditGasToolTip', () => { priorityLevel: 'medium', ...MEDIUM_GAS_OPTION, }); - expect(queryByText('2.383812808')).toBeInTheDocument(); + expect(queryByText('2.3838')).toBeInTheDocument(); expect(queryByText('1.5')).toBeInTheDocument(); expect(queryByText('21000')).toBeInTheDocument(); }); @@ -83,7 +83,7 @@ describe('EditGasToolTip', () => { priorityLevel: 'high', ...HIGH_GAS_OPTION, }); - expect(queryByText('2.920638342')).toBeInTheDocument(); + expect(queryByText('2.9206')).toBeInTheDocument(); expect(queryByText('2')).toBeInTheDocument(); expect(queryByText('21000')).toBeInTheDocument(); }); diff --git a/ui/components/app/edit-gas-fee-popover/index.scss b/ui/components/app/edit-gas-fee-popover/index.scss index f1c8b27ac..5319938a3 100644 --- a/ui/components/app/edit-gas-fee-popover/index.scss +++ b/ui/components/app/edit-gas-fee-popover/index.scss @@ -3,9 +3,14 @@ &__wrapper { border-top: 1px solid var(--ui-grey); + height: 100%; } &__content { + height: 100%; + display: flex; + flex-direction: column; + justify-content: space-between; padding: 16px 12px; & .error-message { diff --git a/ui/components/app/edit-gas-fee-popover/network-statistics/index.scss b/ui/components/app/edit-gas-fee-popover/network-statistics/index.scss index 263884abb..d52741eb9 100644 --- a/ui/components/app/edit-gas-fee-popover/network-statistics/index.scss +++ b/ui/components/app/edit-gas-fee-popover/network-statistics/index.scss @@ -1,5 +1,5 @@ .network-statistics { - margin: 24px 0 12px; + margin: 24px 12px 12px; &__info { border-top: 1px solid var(--ui-2); @@ -21,10 +21,6 @@ justify-content: center; width: 30%; - &--priority-fee { - width: 40%; - } - &-data { color: var(--ui-4); font-size: 12px; @@ -38,6 +34,10 @@ margin-top: 4px; } } + + .latest-priority-fee-field { + width: 40%; + } } &__tooltip-label { diff --git a/ui/components/app/edit-gas-fee-popover/network-statistics/latest-priority-fee-field/latest-priority-fee-field.js b/ui/components/app/edit-gas-fee-popover/network-statistics/latest-priority-fee-field/latest-priority-fee-field.js index 3fc9a7543..12585123c 100644 --- a/ui/components/app/edit-gas-fee-popover/network-statistics/latest-priority-fee-field/latest-priority-fee-field.js +++ b/ui/components/app/edit-gas-fee-popover/network-statistics/latest-priority-fee-field/latest-priority-fee-field.js @@ -22,14 +22,14 @@ export default function LatestPriorityFeeField() { return (
- - {priorityFeeRange && ( - {priorityFeeRange} - )} - - - - + + + {priorityFeeRange} + + + + +
); } diff --git a/ui/components/app/edit-gas-fee-popover/network-statistics/network-statistics.js b/ui/components/app/edit-gas-fee-popover/network-statistics/network-statistics.js index 81b92bc2e..9e2f730c5 100644 --- a/ui/components/app/edit-gas-fee-popover/network-statistics/network-statistics.js +++ b/ui/components/app/edit-gas-fee-popover/network-statistics/network-statistics.js @@ -29,17 +29,18 @@ const NetworkStatistics = () => {
- - {gasFeeEstimates?.estimatedBaseFee && ( - {`${roundToDecimalPlacesRemovingExtraZeroes( - gasFeeEstimates?.estimatedBaseFee, - 0, - )} GWEI`} - )} - - - - + + + {gasFeeEstimates?.estimatedBaseFee && + `${roundToDecimalPlacesRemovingExtraZeroes( + gasFeeEstimates?.estimatedBaseFee, + 0, + )} GWEI`} + + + + +
diff --git a/ui/components/app/edit-gas-fee-popover/network-statistics/tooltips.js b/ui/components/app/edit-gas-fee-popover/network-statistics/tooltips.js index e775c367f..f626959bd 100644 --- a/ui/components/app/edit-gas-fee-popover/network-statistics/tooltips.js +++ b/ui/components/app/edit-gas-fee-popover/network-statistics/tooltips.js @@ -2,11 +2,19 @@ import React from 'react'; import PropTypes from 'prop-types'; import { useI18nContext } from '../../../../hooks/useI18nContext'; +import Box from '../../../ui/box'; import Tooltip from '../../../ui/tooltip'; +import { + DISPLAY, + FLEX_DIRECTION, +} from '../../../../helpers/constants/design-system'; + const NetworkStatusTooltip = ({ children, html, title }) => ( - {children} + + {children} + ); diff --git a/ui/components/app/gas-timing/index.scss b/ui/components/app/gas-timing/index.scss index 3b158b090..bd4e03c3e 100644 --- a/ui/components/app/gas-timing/index.scss +++ b/ui/components/app/gas-timing/index.scss @@ -5,6 +5,11 @@ color: var(--success-3); } + &--positive-V2 { + color: var(--success-3); + font-weight: bold; + } + &--warning { color: var(--alert-3); } diff --git a/ui/components/ui/loading-heartbeat/index.js b/ui/components/ui/loading-heartbeat/index.js index a94855b91..7c3895d9e 100644 --- a/ui/components/ui/loading-heartbeat/index.js +++ b/ui/components/ui/loading-heartbeat/index.js @@ -1,13 +1,15 @@ -import classNames from 'classnames'; -import React from 'react'; import { useSelector } from 'react-redux'; +import classNames from 'classnames'; +import PropTypes from 'prop-types'; +import React from 'react'; + import { getGasLoadingAnimationIsShowing } from '../../../ducks/app/app'; import { useShouldAnimateGasEstimations } from '../../../hooks/useShouldAnimateGasEstimations'; const BASE_CLASS = 'loading-heartbeat'; const LOADING_CLASS = `${BASE_CLASS}--active`; -export default function LoadingHeartBeat() { +export default function LoadingHeartBeat({ backgroundColor = '#fff' }) { useShouldAnimateGasEstimations(); const active = useSelector(getGasLoadingAnimationIsShowing); @@ -24,6 +26,11 @@ export default function LoadingHeartBeat() { e.preventDefault(); e.stopPropagation(); }} + style={{ backgroundColor }} >
); } + +LoadingHeartBeat.propTypes = { + backgroundColor: PropTypes.string, +}; diff --git a/ui/helpers/utils/util.js b/ui/helpers/utils/util.js index e35826881..ae2568fbb 100644 --- a/ui/helpers/utils/util.js +++ b/ui/helpers/utils/util.js @@ -573,7 +573,10 @@ export function roundToDecimalPlacesRemovingExtraZeroes( numberish, numberOfDecimalPlaces, ) { - return toBigNumber.dec( - toBigNumber.dec(numberish).toFixed(numberOfDecimalPlaces), - ); + if (numberish === undefined || numberish === null) { + return ''; + } + return toBigNumber + .dec(toBigNumber.dec(numberish).toFixed(numberOfDecimalPlaces)) + .toNumber(); } diff --git a/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.js b/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.js index 31394557d..ae6b195ad 100644 --- a/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.js +++ b/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.js @@ -111,9 +111,19 @@ const TransactionAlerts = ({ )} {isNetworkBusy ? ( } + message={ + + + + } iconFillColor="#f8c000" type="warning" + useIcon /> ) : null}
diff --git a/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.test.js b/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.test.js index 038e9c3d3..5bb113556 100644 --- a/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.test.js +++ b/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.test.js @@ -174,9 +174,7 @@ describe('TransactionAlerts', () => { }, }); expect( - getByText( - 'Future transactions will queue after this one. This price was last seen was some time ago.', - ), + getByText('Future transactions will queue after this one.'), ).toBeInTheDocument(); }); }); @@ -190,9 +188,7 @@ describe('TransactionAlerts', () => { }, }); expect( - queryByText( - 'Future transactions will queue after this one. This price was last seen was some time ago.', - ), + queryByText('Future transactions will queue after this one.'), ).not.toBeInTheDocument(); }); }); From b1f5f78d9076a15b0f33ffb65f7cf3af6bdbbbed Mon Sep 17 00:00:00 2001 From: Jon Ator Date: Mon, 24 Jan 2022 08:06:40 -0600 Subject: [PATCH 041/115] Maintain leading whitespace in sig req window (#13340) --- ui/components/app/signature-request-original/index.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/components/app/signature-request-original/index.scss b/ui/components/app/signature-request-original/index.scss index f7c718558..e0e650b74 100644 --- a/ui/components/app/signature-request-original/index.scss +++ b/ui/components/app/signature-request-original/index.scss @@ -222,7 +222,7 @@ overflow-wrap: break-word; border-bottom: 1px solid #d2d8dd; padding: 6px 18px 15px; - white-space: pre-line; + white-space: pre; } &__help-link { From cb28ecad5481643836114265f81207b37c0f979d Mon Sep 17 00:00:00 2001 From: oliver renwick <7252642+mapachurro@users.noreply.github.com> Date: Mon, 24 Jan 2022 09:28:16 -0500 Subject: [PATCH 042/115] SRP copy-paste language (#12012) Co-authored-by: Elliot Winkler --- app/_locales/en/messages.json | 4 ++-- test/e2e/tests/from-import-ui.spec.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index d38ec374d..8ccd962df 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -2187,7 +2187,7 @@ "message": "Passwords Don't Match" }, "pastePrivateKey": { - "message": "Paste your private key string here:", + "message": "Enter your private key string here:", "description": "For importing an account from a private key" }, "pending": { @@ -2499,7 +2499,7 @@ "message": "Separate each word with a single space" }, "seedPhrasePlaceholderPaste": { - "message": "Paste Secret Recovery Phrase from clipboard" + "message": "Enter your Secret Recovery Phrase" }, "seedPhraseReq": { "message": "Secret Recovery Phrases contain 12, 15, 18, 21, or 24 words" diff --git a/test/e2e/tests/from-import-ui.spec.js b/test/e2e/tests/from-import-ui.spec.js index d93800485..fc34a2f78 100644 --- a/test/e2e/tests/from-import-ui.spec.js +++ b/test/e2e/tests/from-import-ui.spec.js @@ -77,7 +77,7 @@ describe('Metamask Import UI', function () { // Import Secret Recovery Phrase await driver.fill( - 'input[placeholder="Paste Secret Recovery Phrase from clipboard"]', + 'input[placeholder="Enter your Secret Recovery Phrase"]', testSeedPhrase, ); From c366dd67b05d20ae73a69bb3d9a226c38934e49d Mon Sep 17 00:00:00 2001 From: Ersan YAKIT Date: Mon, 24 Jan 2022 21:11:18 +0300 Subject: [PATCH 043/115] Update phishing.html (#13323) --- app/phishing.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/phishing.html b/app/phishing.html index 30accb9bf..ae9d125da 100644 --- a/app/phishing.html +++ b/app/phishing.html @@ -1,7 +1,7 @@ - Ethereum Phishing Detection - MetaMask + MetaMask Phishing Detection @@ -37,7 +37,7 @@

- Ethereum Phishing Detection + MetaMask Phishing Detection

From ec8a9384c919ca316e6ae22cc477c1663bc4fc03 Mon Sep 17 00:00:00 2001 From: Brad Decker Date: Tue, 25 Jan 2022 10:19:58 -0600 Subject: [PATCH 044/115] fix node-forge vulnerability (#13389) --- package.json | 4 ++-- yarn.lock | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index c4c9bb7f2..6179471ab 100644 --- a/package.json +++ b/package.json @@ -83,8 +83,8 @@ "3box/ipfs/ipld-zcash/zcash-bitcore-lib/elliptic": "^6.5.4", "3box/ipfs/libp2p-mdns/multicast-dns/dns-packet": "^5.2.2", "3box/ipfs/prometheus-gc-stats/gc-stats/node-pre-gyp/tar": "^6.1.2", - "3box/**/libp2p-crypto/node-forge": "^0.10.0", - "3box/**/libp2p-keychain/node-forge": "^0.10.0", + "3box/**/libp2p-crypto/node-forge": "^1.0.0", + "3box/**/libp2p-keychain/node-forge": "^1.0.0", "analytics-node/axios": "^0.21.2", "ganache-core/lodash": "^4.17.21", "netmask": "^2.0.1", diff --git a/yarn.lock b/yarn.lock index 053cd87ed..e4d9a673d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19296,10 +19296,10 @@ node-fetch@2.6.1, node-fetch@^2.3.0, node-fetch@^2.6.0, node-fetch@^2.6.1: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-forge@^0.10.0, node-forge@^0.7.1, node-forge@^0.7.5, node-forge@~0.7.6: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" - integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== +node-forge@^0.7.1, node-forge@^0.7.5, node-forge@^1.0.0, node-forge@~0.7.6: + version "1.2.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.2.1.tgz#82794919071ef2eb5c509293325cec8afd0fd53c" + integrity sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w== node-gyp-build@4.3.0, node-gyp-build@^4.2.0, node-gyp-build@^4.2.2, node-gyp-build@^4.2.3, node-gyp-build@^4.3.0: version "4.3.0" From 8756ad2e789b33d2085b6b7702df2b4fba09a6b4 Mon Sep 17 00:00:00 2001 From: MG Date: Tue, 25 Jan 2022 18:48:41 +0100 Subject: [PATCH 045/115] Feat: Label hardware wallets (#13339) * Added keyring label * Fixed labels name * Clean up * Remove blank spaces * Linted * Fixed lint * Removed unused hooks * Fixed test * Addressed PR comments * Added KEYRING_NAMES obj * Lint * Removed empty space --- shared/constants/hardware-wallets.js | 7 +++ .../account-menu/account-menu.component.js | 32 +------------ .../app/account-menu/account-menu.test.js | 2 +- .../app/account-menu/keyring-label.js | 48 +++++++++++++++++++ 4 files changed, 58 insertions(+), 31 deletions(-) create mode 100644 ui/components/app/account-menu/keyring-label.js diff --git a/shared/constants/hardware-wallets.js b/shared/constants/hardware-wallets.js index 105287800..195a1b488 100644 --- a/shared/constants/hardware-wallets.js +++ b/shared/constants/hardware-wallets.js @@ -17,6 +17,13 @@ export const DEVICE_NAMES = { LATTICE: 'lattice', }; +export const KEYRING_NAMES = { + LEDGER: 'Ledger', + TREZOR: 'Trezor', + QR: 'QR', + LATTICE: 'Lattice1', +}; + /** * Used for setting the users preference for ledger transport type */ diff --git a/ui/components/app/account-menu/account-menu.component.js b/ui/components/app/account-menu/account-menu.component.js index b674a52ac..8105af35b 100644 --- a/ui/components/app/account-menu/account-menu.component.js +++ b/ui/components/app/account-menu/account-menu.component.js @@ -16,7 +16,6 @@ import { SUPPORT_REQUEST_LINK, ///: END:ONLY_INCLUDE_IN } from '../../../helpers/constants/common'; -import { KEYRING_TYPES } from '../../../../shared/constants/hardware-wallets'; import { SETTINGS_ROUTE, NEW_ACCOUNT_ROUTE, @@ -27,6 +26,7 @@ import { import TextField from '../../ui/text-field'; import SearchIcon from '../../ui/search-icon'; import Button from '../../ui/button'; +import KeyRingLabel from './keyring-label'; export function AccountMenuItem(props) { const { icon, children, text, subText, className, onClick } = props; @@ -214,7 +214,7 @@ export default class AccountMenu extends Component { type={PRIMARY} />
- {this.renderKeyringType(keyring)} + {iconAndNameForOpenSubject ? (
{label}
; - } - resetSearchQuery() { this.setSearchQuery(''); } diff --git a/ui/components/app/account-menu/account-menu.test.js b/ui/components/app/account-menu/account-menu.test.js index ea23bcacc..c8393533c 100644 --- a/ui/components/app/account-menu/account-menu.test.js +++ b/ui/components/app/account-menu/account-menu.test.js @@ -96,7 +96,7 @@ describe('Account Menu', () => { it('render imported account label', () => { const importedAccount = wrapper.find('.keyring-label.allcaps'); - expect(importedAccount.text()).toStrictEqual('imported'); + expect(importedAccount.text()).toStrictEqual('[imported]'); }); }); diff --git a/ui/components/app/account-menu/keyring-label.js b/ui/components/app/account-menu/keyring-label.js new file mode 100644 index 000000000..794eed5e4 --- /dev/null +++ b/ui/components/app/account-menu/keyring-label.js @@ -0,0 +1,48 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import { useI18nContext } from '../../../hooks/useI18nContext'; +import { + KEYRING_NAMES, + KEYRING_TYPES, +} from '../../../../shared/constants/hardware-wallets'; + +export default function KeyRingLabel({ keyring }) { + const t = useI18nContext(); + + let label = null; + + // Keyring value might take a while to get a value + if (!keyring) { + return null; + } + const { type } = keyring; + + switch (type) { + case KEYRING_TYPES.QR: + label = KEYRING_NAMES.QR; + break; + case 'Simple Key Pair': + label = t('imported'); + break; + case KEYRING_TYPES.TREZOR: + label = KEYRING_NAMES.TREZOR; + break; + case KEYRING_TYPES.LEDGER: + label = KEYRING_NAMES.LEDGER; + break; + case KEYRING_TYPES.LATTICE: + label = KEYRING_NAMES.LATTICE; + break; + default: + return null; + } + + return ( + <>{label ?
{label}
: null} + ); +} + +KeyRingLabel.propTypes = { + keyring: PropTypes.object, +}; From 667350d15a6ca00910831c6e90097f2dc0b06946 Mon Sep 17 00:00:00 2001 From: Ariella Vu Date: Tue, 25 Jan 2022 20:16:56 +0000 Subject: [PATCH 046/115] Convert ConfirmAddSuggestedToken to a functional component + cleanup (#13377) * FC: ConfirmAddSuggestedToken - change class to functional component * clean: reorganize functions (no logic change) * FC: ConfirmAddSuggestedToken pt. 2 - preserve trackEvent logic -> metricsEvent * clean: rm _ prefix from fn name - why? now, only 3 other functions remain prefixed w/ '_' * clean: update useEffect hook * clean: alphabetize props * clean: functions in ConfirmAddSuggestedToken * clean: use arrow fn for FC --- .../confirm-add-suggested-token.component.js | 323 ++++++++---------- 1 file changed, 148 insertions(+), 175 deletions(-) diff --git a/ui/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js b/ui/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js index fdb3a84ab..60656b753 100644 --- a/ui/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js +++ b/ui/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js @@ -1,192 +1,49 @@ -import React, { Component } from 'react'; +import React, { useContext, useEffect } from 'react'; import PropTypes from 'prop-types'; import Button from '../../components/ui/button'; import Identicon from '../../components/ui/identicon'; import TokenBalance from '../../components/ui/token-balance'; +import { I18nContext } from '../../contexts/i18n'; +import { MetaMetricsContext } from '../../contexts/metametrics'; import { isEqualCaseInsensitive } from '../../helpers/utils/util'; -export default class ConfirmAddSuggestedToken extends Component { - static contextTypes = { - t: PropTypes.func, - trackEvent: PropTypes.func, - }; +function getTokenName(name, symbol) { + return typeof name === 'undefined' ? symbol : `${name} (${symbol})`; +} +const ConfirmAddSuggestedToken = (props) => { + const { + acceptWatchAsset, + history, + mostRecentOverviewPage, + rejectWatchAsset, + suggestedAssets, + tokens, + } = props; - static propTypes = { - history: PropTypes.object, - acceptWatchAsset: PropTypes.func, - rejectWatchAsset: PropTypes.func, - mostRecentOverviewPage: PropTypes.string.isRequired, - suggestedAssets: PropTypes.array, - tokens: PropTypes.array, - }; + const metricsEvent = useContext(MetaMetricsContext); + const t = useContext(I18nContext); - componentDidMount() { - this._checksuggestedAssets(); - } - - componentDidUpdate() { - this._checksuggestedAssets(); - } - - _checksuggestedAssets() { - const { - mostRecentOverviewPage, - suggestedAssets = [], - history, - } = this.props; - - if (suggestedAssets.length > 0) { - return; - } - - history.push(mostRecentOverviewPage); - } - - getTokenName(name, symbol) { - return typeof name === 'undefined' ? symbol : `${name} (${symbol})`; - } - - render() { - const { - suggestedAssets, - tokens, - rejectWatchAsset, - history, - mostRecentOverviewPage, - acceptWatchAsset, - } = this.props; - - const hasTokenDuplicates = this.checkTokenDuplicates( - suggestedAssets, - tokens, - ); - const reusesName = this.checkNameReuse(suggestedAssets, tokens); - - return ( -
-
-
- {this.context.t('addSuggestedTokens')} -
-
- {this.context.t('likeToImportTokens')} -
- {hasTokenDuplicates ? ( -
{this.context.t('knownTokenWarning')}
- ) : null} - {reusesName ? ( -
- {this.context.t('reusedTokenNameWarning')} -
- ) : null} -
-
-
-
-
- {this.context.t('token')} -
-
- {this.context.t('balance')} -
-
-
- {suggestedAssets.map(({ asset }) => { - return ( -
-
- -
- {this.getTokenName(asset.name, asset.symbol)} -
-
-
- -
-
- ); - })} -
-
-
-
-
- - -
-
-
- ); - } - - checkTokenDuplicates(suggestedAssets, tokens) { - const pending = suggestedAssets.map(({ asset }) => - asset.address.toUpperCase(), - ); - const existing = tokens.map((token) => token.address.toUpperCase()); - const dupes = pending.filter((proposed) => { - return existing.includes(proposed); + const tokenAddedEvent = (asset) => { + metricsEvent({ + event: 'Token Added', + category: 'Wallet', + sensitiveProperties: { + token_symbol: asset.symbol, + token_contract_address: asset.address, + token_decimal_precision: asset.decimals, + unlisted: asset.unlisted, + source: 'dapp', + }, }); - - return dupes.length > 0; - } + }; /** * Returns true if any suggestedAssets both: * - Share a symbol with an existing `tokens` member. * - Does not share an address with that same `tokens` member. * This should be flagged as possibly deceptive or confusing. - * - * @param suggestedAssets - * @param tokens */ - checkNameReuse(suggestedAssets, tokens) { + const checkNameReuse = () => { const duplicates = suggestedAssets.filter(({ asset }) => { const dupes = tokens.filter( (old) => @@ -196,5 +53,121 @@ export default class ConfirmAddSuggestedToken extends Component { return dupes.length > 0; }); return duplicates.length > 0; - } -} + }; + + const checkTokenDuplicates = () => { + const pending = suggestedAssets.map(({ asset }) => + asset.address.toUpperCase(), + ); + const existing = tokens.map((token) => token.address.toUpperCase()); + const dupes = pending.filter((proposed) => { + return existing.includes(proposed); + }); + + return dupes.length > 0; + }; + + const hasTokenDuplicates = checkTokenDuplicates(); + const reusesName = checkNameReuse(); + + useEffect(() => { + if (!suggestedAssets.length) { + history.push(mostRecentOverviewPage); + } + }, [history, suggestedAssets, mostRecentOverviewPage]); + + return ( +
+
+
{t('addSuggestedTokens')}
+
+ {t('likeToImportTokens')} +
+ {hasTokenDuplicates ? ( +
{t('knownTokenWarning')}
+ ) : null} + {reusesName ? ( +
{t('reusedTokenNameWarning')}
+ ) : null} +
+
+
+
+
{t('token')}
+
{t('balance')}
+
+
+ {suggestedAssets.map(({ asset }) => { + return ( +
+
+ +
+ {getTokenName(asset.name, asset.symbol)} +
+
+
+ +
+
+ ); + })} +
+
+
+
+
+ + +
+
+
+ ); +}; + +ConfirmAddSuggestedToken.propTypes = { + acceptWatchAsset: PropTypes.func, + history: PropTypes.object, + mostRecentOverviewPage: PropTypes.string.isRequired, + rejectWatchAsset: PropTypes.func, + suggestedAssets: PropTypes.array, + tokens: PropTypes.array, +}; + +export default ConfirmAddSuggestedToken; From 022f0efcd73335ebbacb9b14a771ebc078a80f16 Mon Sep 17 00:00:00 2001 From: Brad Decker Date: Tue, 25 Jan 2022 14:34:50 -0600 Subject: [PATCH 047/115] Update vulnerability ignore list (#13390) --- .circleci/scripts/yarn-audit.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/scripts/yarn-audit.sh b/.circleci/scripts/yarn-audit.sh index 0f2de7123..30efcf2d7 100755 --- a/.circleci/scripts/yarn-audit.sh +++ b/.circleci/scripts/yarn-audit.sh @@ -7,7 +7,7 @@ set -o pipefail # use `improved-yarn-audit` since that allows for exclude # exclude 1002401 until we remove use of 3Box, 1002581 until we can find a better solution -yarn run improved-yarn-audit --ignore-dev-deps --min-severity moderate --exclude 1002401,1002581,GHSA-93q8-gq69-wqmw,GHSA-257v-vj4p-3w2h +yarn run improved-yarn-audit --ignore-dev-deps --min-severity moderate --exclude 1002401,1002581,GHSA-93q8-gq69-wqmw,GHSA-257v-vj4p-3w2h,GHSA-qrpm-p2h7-hrv2 audit_status="$?" # Use a bitmask to ignore INFO and LOW severity audit results From 7b75b9e638747cf0a9963fca93a85a96500308f1 Mon Sep 17 00:00:00 2001 From: VSaric <92527393+VSaric@users.noreply.github.com> Date: Tue, 25 Jan 2022 22:51:42 +0100 Subject: [PATCH 048/115] Fix failing test:unit pipeline (#13387) * Fix failing test:unit pipeline * Correct check of gasLimit and properGasLimit in edit-gas-display Co-authored-by: Dan Miller --- .../app/edit-gas-display/edit-gas-display.component.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ui/components/app/edit-gas-display/edit-gas-display.component.js b/ui/components/app/edit-gas-display/edit-gas-display.component.js index 0d5c659fc..4e0aa83cb 100644 --- a/ui/components/app/edit-gas-display/edit-gas-display.component.js +++ b/ui/components/app/edit-gas-display/edit-gas-display.component.js @@ -110,7 +110,11 @@ export default function EditGasDisplay({ ); let warningMessage; - if (new BigNumber(gasLimit).lessThan(new BigNumber(properGasLimit))) { + if ( + gasLimit !== undefined && + properGasLimit !== undefined && + new BigNumber(gasLimit).lessThan(new BigNumber(properGasLimit)) + ) { warningMessage = t('gasLimitRecommended', [properGasLimit]); } From 7fb5f417c4deb36dd7e9e5f12cea092d5b5a9dfa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jan 2022 20:31:33 -0330 Subject: [PATCH 049/115] Bump @metamask/controllers from 25.0.0 to 25.1.0 (#13399) Bumps [@metamask/controllers](https://github.com/MetaMask/controllers) from 25.0.0 to 25.1.0. - [Release notes](https://github.com/MetaMask/controllers/releases) - [Changelog](https://github.com/MetaMask/controllers/blob/main/CHANGELOG.md) - [Commits](https://github.com/MetaMask/controllers/compare/v25.0.0...v25.1.0) --- updated-dependencies: - dependency-name: "@metamask/controllers" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index e4d9a673d..e45a72e68 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2638,9 +2638,9 @@ web3-provider-engine "^16.0.3" "@metamask/controllers@^25.0.0": - version "25.0.0" - resolved "https://registry.yarnpkg.com/@metamask/controllers/-/controllers-25.0.0.tgz#764ba46a169f197253e35ca5273720c91eae7662" - integrity sha512-BfTRaK87Iha+EXlEsu330Jp9Wtx0gks2vA+q3Lu/AKGbcz2J0cokECNwN7uEe4GQLPLsfCIAkUIAlP3pRiCvjg== + version "25.1.0" + resolved "https://registry.yarnpkg.com/@metamask/controllers/-/controllers-25.1.0.tgz#2efee24a9a2b03ab2a2b0422c8f250931c269560" + integrity sha512-syndn2lIhtlACzaqjDrw23dJzw8pZ6en4Cr35C7B9RRS87EhahUqkPP73moAzLtvbyqtBlAUO1HHrqV3lw4E5g== dependencies: "@ethereumjs/common" "^2.3.1" "@ethereumjs/tx" "^3.2.1" @@ -2666,7 +2666,7 @@ isomorphic-fetch "^3.0.0" jsonschema "^1.2.4" multiformats "^9.5.2" - nanoid "^3.1.12" + nanoid "^3.1.31" punycode "^2.1.1" single-call-balance-checker-abi "^1.0.0" uuid "^8.3.2" @@ -19088,10 +19088,10 @@ nanoid@^2.0.0, nanoid@^2.1.6: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.11.tgz#ec24b8a758d591561531b4176a01e3ab4f0f0280" integrity sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA== -nanoid@^3.1.12, nanoid@^3.1.23, nanoid@^3.1.28: - version "3.1.30" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" - integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== +nanoid@^3.1.12, nanoid@^3.1.23, nanoid@^3.1.28, nanoid@^3.1.31: + version "3.2.0" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" + integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== nanomatch@^1.2.9: version "1.2.9" From eb39c51ede1a48656b58f4f80543e47a1bd3962a Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Wed, 26 Jan 2022 07:04:58 +0530 Subject: [PATCH 050/115] Using new graph images for edit gas fee popover (#13382) --- app/_locales/en/messages.json | 9 +++++++ app/images/curve-high.svg | 26 ++++++++++++++++++- app/images/curve-low.svg | 21 ++++++++++++++- app/images/curve-medium.svg | 17 +++++++++++- .../edit-gas-tooltip/edit-gas-tooltip.js | 11 +++++++- 5 files changed, 80 insertions(+), 4 deletions(-) diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 8ccd962df..fde592a29 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -656,6 +656,15 @@ "currentlyUnavailable": { "message": "Unavailable on this network" }, + "curveHighGasEstimate": { + "message": "Aggressive gas estimate graph" + }, + "curveLowGasEstimate": { + "message": "Low gas estimate graph" + }, + "curveMediumGasEstimate": { + "message": "Market gas estimate graph" + }, "custom": { "message": "Advanced" }, diff --git a/app/images/curve-high.svg b/app/images/curve-high.svg index f5c918636..bd6d8d0ce 100644 --- a/app/images/curve-high.svg +++ b/app/images/curve-high.svg @@ -1 +1,25 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/images/curve-low.svg b/app/images/curve-low.svg index fee21216e..9f98826ea 100644 --- a/app/images/curve-low.svg +++ b/app/images/curve-low.svg @@ -1 +1,20 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + diff --git a/app/images/curve-medium.svg b/app/images/curve-medium.svg index c3cc1d2aa..9a454bc99 100644 --- a/app/images/curve-medium.svg +++ b/app/images/curve-medium.svg @@ -1 +1,16 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/edit-gas-tooltip.js b/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/edit-gas-tooltip.js index a97da2db5..0a80a8c63 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/edit-gas-tooltip.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/edit-gas-tooltip.js @@ -79,6 +79,15 @@ const EditGasToolTip = ({ } }, [editGasMode, estimateGreaterThanGasUse, priorityLevel, transaction, t]); + let imgAltText; + if (priorityLevel === PRIORITY_LEVELS.LOW) { + imgAltText = t('curveLowGasEstimate'); + } else if (priorityLevel === PRIORITY_LEVELS.MEDIUM) { + imgAltText = t('curveMediumGasEstimate'); + } else if (priorityLevel === PRIORITY_LEVELS.HIGH) { + imgAltText = t('curveHighGasEstimate'); + } + return (
{priorityLevel !== PRIORITY_LEVELS.CUSTOM && @@ -88,7 +97,7 @@ const EditGasToolTip = ({ editGasMode === EDIT_GAS_MODES.SWAPS ) && !estimateGreaterThanGasUse ? ( - + {imgAltText} ) : null} {toolTipMessage && (
From fcd5f89e2f2e6de3cd263ee751bef62cb8b90e20 Mon Sep 17 00:00:00 2001 From: filipsekulic Date: Wed, 26 Jan 2022 18:48:28 +0100 Subject: [PATCH 051/115] Move component into another folder (#13380) --- ui/components/app/app-components.scss | 1 + ui/components/{ui => app}/currency-input/currency-input.js | 4 ++-- .../{ui => app}/currency-input/currency-input.test.js | 4 ++-- ui/components/{ui => app}/currency-input/index.js | 0 ui/components/{ui => app}/currency-input/index.scss | 0 .../user-preferenced-currency-input.component.js | 2 +- .../user-preferenced-currency-input.component.test.js | 2 +- ui/components/ui/ui-components.scss | 1 - 8 files changed, 7 insertions(+), 7 deletions(-) rename ui/components/{ui => app}/currency-input/currency-input.js (97%) rename ui/components/{ui => app}/currency-input/currency-input.test.js (99%) rename ui/components/{ui => app}/currency-input/index.js (100%) rename ui/components/{ui => app}/currency-input/index.scss (100%) diff --git a/ui/components/app/app-components.scss b/ui/components/app/app-components.scss index 2327f7d01..fdeaf9b54 100644 --- a/ui/components/app/app-components.scss +++ b/ui/components/app/app-components.scss @@ -74,3 +74,4 @@ @import 'advanced-gas-fee-popover/advanced-gas-fee-inputs/base-fee-input/index'; @import 'advanced-gas-fee-popover/advanced-gas-fee-input-subtext/index'; @import 'advanced-gas-fee-popover/advanced-gas-fee-defaults/index'; +@import 'currency-input/index'; diff --git a/ui/components/ui/currency-input/currency-input.js b/ui/components/app/currency-input/currency-input.js similarity index 97% rename from ui/components/ui/currency-input/currency-input.js rename to ui/components/app/currency-input/currency-input.js index 721ca076d..79efec149 100644 --- a/ui/components/ui/currency-input/currency-input.js +++ b/ui/components/app/currency-input/currency-input.js @@ -1,8 +1,8 @@ import React, { useContext, useEffect, useState } from 'react'; import PropTypes from 'prop-types'; import { useSelector } from 'react-redux'; -import UnitInput from '../unit-input'; -import CurrencyDisplay from '../currency-display'; +import UnitInput from '../../ui/unit-input'; +import CurrencyDisplay from '../../ui/currency-display'; import { getValueFromWeiHex, getWeiHexFromDecimalValue, diff --git a/ui/components/ui/currency-input/currency-input.test.js b/ui/components/app/currency-input/currency-input.test.js similarity index 99% rename from ui/components/ui/currency-input/currency-input.test.js rename to ui/components/app/currency-input/currency-input.test.js index 57f8677a7..a12e529df 100644 --- a/ui/components/ui/currency-input/currency-input.test.js +++ b/ui/components/app/currency-input/currency-input.test.js @@ -4,8 +4,8 @@ import { mount } from 'enzyme'; import sinon from 'sinon'; import { Provider } from 'react-redux'; import configureMockStore from 'redux-mock-store'; -import UnitInput from '../unit-input'; -import CurrencyDisplay from '../currency-display'; +import UnitInput from '../../ui/unit-input'; +import CurrencyDisplay from '../../ui/currency-display'; import CurrencyInput from './currency-input'; describe('CurrencyInput Component', () => { diff --git a/ui/components/ui/currency-input/index.js b/ui/components/app/currency-input/index.js similarity index 100% rename from ui/components/ui/currency-input/index.js rename to ui/components/app/currency-input/index.js diff --git a/ui/components/ui/currency-input/index.scss b/ui/components/app/currency-input/index.scss similarity index 100% rename from ui/components/ui/currency-input/index.scss rename to ui/components/app/currency-input/index.scss diff --git a/ui/components/app/user-preferenced-currency-input/user-preferenced-currency-input.component.js b/ui/components/app/user-preferenced-currency-input/user-preferenced-currency-input.component.js index 1bcfdd636..eb49f7400 100644 --- a/ui/components/app/user-preferenced-currency-input/user-preferenced-currency-input.component.js +++ b/ui/components/app/user-preferenced-currency-input/user-preferenced-currency-input.component.js @@ -1,6 +1,6 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; -import CurrencyInput from '../../ui/currency-input'; +import CurrencyInput from '../currency-input'; export default class UserPreferencedCurrencyInput extends PureComponent { static propTypes = { diff --git a/ui/components/app/user-preferenced-currency-input/user-preferenced-currency-input.component.test.js b/ui/components/app/user-preferenced-currency-input/user-preferenced-currency-input.component.test.js index 99ad79772..39c3bb736 100644 --- a/ui/components/app/user-preferenced-currency-input/user-preferenced-currency-input.component.test.js +++ b/ui/components/app/user-preferenced-currency-input/user-preferenced-currency-input.component.test.js @@ -1,6 +1,6 @@ import React from 'react'; import { shallow } from 'enzyme'; -import CurrencyInput from '../../ui/currency-input'; +import CurrencyInput from '../currency-input'; import UserPreferencedCurrencyInput from './user-preferenced-currency-input.component'; describe('UserPreferencedCurrencyInput Component', () => { diff --git a/ui/components/ui/ui-components.scss b/ui/components/ui/ui-components.scss index 4c0e871a1..cf85f6cf0 100644 --- a/ui/components/ui/ui-components.scss +++ b/ui/components/ui/ui-components.scss @@ -15,7 +15,6 @@ @import 'color-indicator/color-indicator'; @import 'confusable/index'; @import 'currency-display/index'; -@import 'currency-input/index'; @import 'definition-list/definition-list'; @import 'dialog/dialog'; @import 'dropdown/dropdown'; From a0e97f4681f52cba2410f7e170130c79acbd0ed0 Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Wed, 26 Jan 2022 23:48:43 +0530 Subject: [PATCH 052/115] EIP-1559 v2 - small fixes (#13392) --- .../cancel-speedup-popover.js | 2 +- .../edit-gas-item/edit-gas-item.js | 1 + .../edit-gas-item/useGasItemFeeDetails.js | 2 +- .../app/gas-details-item/gas-details-item.js | 8 ++++---- ui/components/ui/actionable-message/index.scss | 1 + ui/components/ui/loading-heartbeat/index.js | 12 ++++++++++-- ui/helpers/utils/gas.js | 13 +++++++++++-- ui/helpers/utils/gas.test.js | 6 ++---- .../confirm-transaction-base.component.js | 8 +++++--- 9 files changed, 36 insertions(+), 17 deletions(-) diff --git a/ui/components/app/cancel-speedup-popover/cancel-speedup-popover.js b/ui/components/app/cancel-speedup-popover/cancel-speedup-popover.js index 68611ab96..fdd18a420 100644 --- a/ui/components/app/cancel-speedup-popover/cancel-speedup-popover.js +++ b/ui/components/app/cancel-speedup-popover/cancel-speedup-popover.js @@ -54,7 +54,7 @@ const CancelSpeedupPopover = () => { const gasUsedLessThanMedium = gasFeeEstimates && gasEstimateGreaterThanGasUsedPlusTenPercent( - transaction, + transaction.txParams, gasFeeEstimates, PRIORITY_LEVELS.MEDIUM, ); diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js index 7e8604405..cd2f8bd70 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js @@ -125,6 +125,7 @@ const EditGasItem = ({ priorityLevel }) => { backgroundColor={ priorityLevel === estimateUsed ? '#f2f3f4' : '#fff' } + estimateUsed={priorityLevel} /> { priorityLevel === PRIORITY_LEVELS.HIGH) ) { const estimateGreater = !gasEstimateGreaterThanGasUsedPlusTenPercent( - transaction, + transaction.previousGas || transaction.txParams, gasFeeEstimates, priorityLevel, ); diff --git a/ui/components/app/gas-details-item/gas-details-item.js b/ui/components/app/gas-details-item/gas-details-item.js index c0aeeb20f..c47b3a1dd 100644 --- a/ui/components/app/gas-details-item/gas-details-item.js +++ b/ui/components/app/gas-details-item/gas-details-item.js @@ -39,7 +39,7 @@ const GasDetailsItem = ({ userAcknowledgedGasMissing = false }) => { detailTitleColor={COLORS.BLACK} detailText={
- + { } detailTotal={
- + { 'gas-details-item__gas-fee-warning': estimateUsed === 'high', })} > - + {estimateUsed === 'high' && '⚠ '} @@ -77,7 +77,7 @@ const GasDetailsItem = ({ userAcknowledgedGasMissing = false }) => { key="editGasSubTextFeeValue" className="gas-details-item__currency-container" > - + { - let { maxFeePerGas: maxFeePerGasInTransaction } = transaction.txParams; + let { maxFeePerGas: maxFeePerGasInTransaction } = gasUsed; maxFeePerGasInTransaction = new BigNumber( hexWEIToDecGWEI(addTenPercentAndRound(maxFeePerGasInTransaction)), ); @@ -53,3 +54,11 @@ export function addTenPercent(hexStringValue, conversionOptions = {}) { export function addTenPercentAndRound(hexStringValue) { return addTenPercent(hexStringValue, { numberOfDecimals: 0 }); } + +export function isVolatileGasEstimate(estimate) { + return [ + GAS_RECOMMENDATIONS.HIGH, + GAS_RECOMMENDATIONS.MEDIUM, + GAS_RECOMMENDATIONS.LOW, + ].includes(estimate); +} diff --git a/ui/helpers/utils/gas.test.js b/ui/helpers/utils/gas.test.js index 2d13f4030..58aaaf38e 100644 --- a/ui/helpers/utils/gas.test.js +++ b/ui/helpers/utils/gas.test.js @@ -10,10 +10,8 @@ describe('Gas utils', () => { const compareGas = (estimateValues) => { return gasEstimateGreaterThanGasUsedPlusTenPercent( { - txParams: { - maxFeePerGas: '0x59682f10', - maxPriorityFeePerGas: '0x59682f00', - }, + maxFeePerGas: '0x59682f10', + maxPriorityFeePerGas: '0x59682f00', }, { medium: estimateValues, diff --git a/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js index d23912787..d9e4769d3 100644 --- a/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js +++ b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js @@ -365,7 +365,7 @@ export default class ConfirmTransactionBase extends Component { ) { return (
- + - + - + {t('editGasSubTextAmountLabel')} {' '} From be65eb733904c4931f288fbac0788d82fbbd3af4 Mon Sep 17 00:00:00 2001 From: Alex Donesky Date: Thu, 27 Jan 2022 11:26:33 -0600 Subject: [PATCH 053/115] More nft ux fixes (#13388) * a batch of nft ux fixes --- app/scripts/controllers/app-state.js | 12 ++ app/scripts/metamask-controller.js | 3 + .../collectible-details.js | 81 ++++++---- .../app/collectible-details/index.scss | 38 ++++- .../collectibles-items/collectibles-items.js | 138 ++++++++++-------- .../app/collectibles-items/index.scss | 6 + .../collectibles-tab/collectibles-tab.test.js | 6 + ui/css/itcss/components/send.scss | 1 + ui/ducks/metamask/metamask.js | 4 + ui/ducks/send/send.js | 13 ++ .../send-asset-row.component.js | 5 +- .../experimental-tab.component.js | 19 ++- ui/pages/settings/index.scss | 9 ++ ui/store/actions.js | 7 + 14 files changed, 240 insertions(+), 102 deletions(-) diff --git a/app/scripts/controllers/app-state.js b/app/scripts/controllers/app-state.js index 3ddc7b858..6ca948aa0 100644 --- a/app/scripts/controllers/app-state.js +++ b/app/scripts/controllers/app-state.js @@ -36,6 +36,7 @@ export default class AppStateController extends EventEmitter { trezorModel: null, ...initState, qrHardware: {}, + collectiblesDropdownState: {}, }); this.timer = null; @@ -282,4 +283,15 @@ export default class AppStateController extends EventEmitter { enableEIP1559V2NoticeDismissed, }); } + + /** + * A setter for the `collectiblesDropdownState` property + * + * @param collectiblesDropdownState + */ + updateCollectibleDropDownState(collectiblesDropdownState) { + this.store.updateState({ + collectiblesDropdownState, + }); + } } diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index e7b588043..c8d2931a1 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -1271,6 +1271,9 @@ export default class MetamaskController extends EventEmitter { setEnableEIP1559V2NoticeDismissed: appStateController.setEnableEIP1559V2NoticeDismissed.bind( appStateController, ), + updateCollectibleDropDownState: appStateController.updateCollectibleDropDownState.bind( + appStateController, + ), // EnsController tryReverseResolveAddress: ensController.reverseResolveAddress.bind( ensController, diff --git a/ui/components/app/collectible-details/collectible-details.js b/ui/components/app/collectible-details/collectible-details.js index 1cfa7590e..195953545 100644 --- a/ui/components/app/collectible-details/collectible-details.js +++ b/ui/components/app/collectible-details/collectible-details.js @@ -30,6 +30,7 @@ import { getSelectedIdentity, } from '../../../selectors'; import AssetNavigation from '../../../pages/asset/components/asset-navigation'; +import Copy from '../../ui/icon/copy-icon.component'; import { getCollectibleContracts } from '../../../ducks/metamask/metamask'; import { DEFAULT_ROUTE, SEND_ROUTE } from '../../../helpers/constants/routes'; import { @@ -52,10 +53,12 @@ import { ASSET_TYPES, updateSendAsset } from '../../../ducks/send'; import InfoTooltip from '../../ui/info-tooltip'; import { ERC721 } from '../../../helpers/constants/common'; import { usePrevious } from '../../../hooks/usePrevious'; +import { useCopyToClipboard } from '../../../hooks/useCopyToClipboard'; export default function CollectibleDetails({ collectible }) { const { image, + imageOriginal, name, description, address, @@ -70,6 +73,7 @@ export default function CollectibleDetails({ collectible }) { const ipfsGateway = useSelector(getIpfsGateway); const collectibleContracts = useSelector(getCollectibleContracts); const currentNetwork = useSelector(getCurrentChainId); + const [copied, handleCopy] = useCopyToClipboard(); const collectibleContractName = collectibleContracts.find( ({ address: contractAddress }) => @@ -78,7 +82,10 @@ export default function CollectibleDetails({ collectible }) { const selectedAccountName = useSelector( (state) => getSelectedIdentity(state).name, ); - const collectibleImageURL = getAssetImageURL(image, ipfsGateway); + const collectibleImageURL = getAssetImageURL( + imageOriginal ?? image, + ipfsGateway, + ); const onRemove = () => { dispatch(removeAndIgnoreCollectible(address, tokenId)); @@ -171,10 +178,7 @@ export default function CollectibleDetails({ collectible }) { justifyContent={JUSTIFY_CONTENT.CENTER} className="collectible-details__card" > - + - {image} + {collectibleImageURL} @@ -270,31 +274,49 @@ export default function CollectibleDetails({ collectible }) { > {t('contractAddress')} - - - {inPopUp ? shortenAddress(address) : address} - - + + {inPopUp ? shortenAddress(address) : address} + + + + {inPopUp ? renderSendButton() : null} @@ -314,6 +336,7 @@ CollectibleDetails.propTypes = { standard: PropTypes.string, imageThumbnail: PropTypes.string, imagePreview: PropTypes.string, + imageOriginal: PropTypes.string, creator: PropTypes.shape({ address: PropTypes.string, config: PropTypes.string, diff --git a/ui/components/app/collectible-details/index.scss b/ui/components/app/collectible-details/index.scss index cb2e39273..e3e83ec9b 100644 --- a/ui/components/app/collectible-details/index.scss +++ b/ui/components/app/collectible-details/index.scss @@ -53,18 +53,40 @@ $spacer-break-small: 16px; overflow-wrap: break-word; } - &__contract-link, - &__image-link { - word-break: break-all; + &__contract-wrapper { + max-width: calc(100% - #{$link-title-width}); + } - @media screen and (max-width: $break-small) { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - width: 90%; + &__contract-copy-button { + @include H6; + + width: 80px; + display: flex; + align-items: flex-start; + justify-content: center; + background-color: transparent; + cursor: pointer; + color: var(--ui-4); + border: 0; + + &:active { + transform: scale(0.97); } } + &__contract-link { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + &__image-link { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 332px; + } + &__link-title { flex: 0 0 $link-title-width; max-width: 0 0 $link-title-width; diff --git a/ui/components/app/collectibles-items/collectibles-items.js b/ui/components/app/collectibles-items/collectibles-items.js index bc0b3c83d..43f2af6fc 100644 --- a/ui/components/app/collectibles-items/collectibles-items.js +++ b/ui/components/app/collectibles-items/collectibles-items.js @@ -1,9 +1,10 @@ -import React, { useState } from 'react'; +import React, { useEffect } from 'react'; import PropTypes from 'prop-types'; -import { useSelector } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; import { useHistory } from 'react-router-dom'; import Box from '../../ui/box'; import Typography from '../../ui/typography/typography'; +import Card from '../../ui/card'; import { COLORS, TYPOGRAPHY, @@ -19,6 +20,9 @@ import { getEnvironmentType } from '../../../../app/scripts/lib/util'; import { getIpfsGateway } from '../../../selectors'; import { ASSET_ROUTE } from '../../../helpers/constants/routes'; import { getAssetImageURL } from '../../../helpers/utils/util'; +import { updateCollectibleDropDownState } from '../../../store/actions'; +import { usePrevious } from '../../../hooks/usePrevious'; +import { getCollectiblesDropdownState } from '../../../ducks/metamask/metamask'; const width = getEnvironmentType() === ENVIRONMENT_TYPE_POPUP @@ -31,20 +35,30 @@ export default function CollectiblesItems({ collections = {}, previouslyOwnedCollection = {}, }) { + const dispatch = useDispatch(); const collectionsKeys = Object.keys(collections); + const collectiblesDropdownState = useSelector(getCollectiblesDropdownState); + const previousCollectionKeys = usePrevious(collectionsKeys); - // if there is only one collection present set it to open when component mounts - const [dropdownState, setDropdownState] = useState(() => { - return collectionsKeys.length === 1 - ? { - [PREVIOUSLY_OWNED_KEY]: false, - [collectionsKeys[0]]: true, - } - : { [PREVIOUSLY_OWNED_KEY]: false }; - }); + useEffect(() => { + if ( + !Object.keys(collectiblesDropdownState).length && + previousCollectionKeys !== collectionsKeys + ) { + const initState = {}; + collectionsKeys.forEach((key) => { + initState[key] = true; + }); + dispatch(updateCollectibleDropDownState(initState)); + } + }, [ + collectionsKeys, + previousCollectionKeys, + collectiblesDropdownState, + dispatch, + ]); const ipfsGateway = useSelector(getIpfsGateway); - const history = useHistory(); const renderCollectionImage = ( @@ -81,46 +95,50 @@ export default function CollectiblesItems({ return null; } - const isExpanded = dropdownState[key]; + const isExpanded = collectiblesDropdownState[key]; return ( -
{ - setDropdownState((_dropdownState) => ({ - ..._dropdownState, - [key]: !isExpanded, - })); - }} - > - + + {isExpanded ? ( {collectibles.map((collectible, i) => { @@ -132,20 +150,22 @@ export default function CollectiblesItems({ key={`collectible-${i}`} className="collectibles-items__collection-item-wrapper" > -
- - history.push(`${ASSET_ROUTE}/${address}/${tokenId}`) - } - className="collectibles-items__collection-item-image" - src={collectibleImage} - /> -
+ +
+ + history.push(`${ASSET_ROUTE}/${address}/${tokenId}`) + } + className="collectibles-items__collection-item-image" + src={collectibleImage} + /> +
+
); })} diff --git a/ui/components/app/collectibles-items/index.scss b/ui/components/app/collectibles-items/index.scss index 7e427cf47..574efa6e1 100644 --- a/ui/components/app/collectibles-items/index.scss +++ b/ui/components/app/collectibles-items/index.scss @@ -6,6 +6,12 @@ cursor: pointer; } + &-wrapper { + background-color: transparent; + border: 0; + width: 100%; + } + &-image { width: 32px; height: 32px; diff --git a/ui/components/app/collectibles-tab/collectibles-tab.test.js b/ui/components/app/collectibles-tab/collectibles-tab.test.js index cfbd7d2f5..3773c5488 100644 --- a/ui/components/app/collectibles-tab/collectibles-tab.test.js +++ b/ui/components/app/collectibles-tab/collectibles-tab.test.js @@ -136,6 +136,11 @@ const COLLECTIBLES_CONTRACTS = [ }, ]; +const collectiblesDropdownState = { + 0x495f947276749ce646f68ac8c248420045cb7b5e: true, + 0xdc7382eb0bc9c352a4cba23c909bda01e0206414: true, +}; + const ACCOUNT_1 = '0x123'; const ACCOUNT_2 = '0x456'; @@ -164,6 +169,7 @@ const render = ({ selectedAddress, collectiblesDetectionNoticeDismissed, useCollectibleDetection, + collectiblesDropdownState, }, }); return renderWithProvider(, store); diff --git a/ui/css/itcss/components/send.scss b/ui/css/itcss/components/send.scss index 113f46eec..90b4743a0 100644 --- a/ui/css/itcss/components/send.scss +++ b/ui/css/itcss/components/send.scss @@ -707,6 +707,7 @@ &__label { margin-right: 0.25rem; + min-width: 52px; } } diff --git a/ui/ducks/metamask/metamask.js b/ui/ducks/metamask/metamask.js index 70e10f1ae..bb2634288 100644 --- a/ui/ducks/metamask/metamask.js +++ b/ui/ducks/metamask/metamask.js @@ -264,6 +264,10 @@ export function getCollectiblesDetectionNoticeDismissed(state) { return state.metamask.collectiblesDetectionNoticeDismissed; } +export function getCollectiblesDropdownState(state) { + return state.metamask.collectiblesDropdownState; +} + export function getEnableEIP1559V2NoticeDismissed(state) { return state.metamask.enableEIP1559V2NoticeDismissed; } diff --git a/ui/ducks/send/send.js b/ui/ducks/send/send.js index ffae1e680..8df8cbc9d 100644 --- a/ui/ducks/send/send.js +++ b/ui/ducks/send/send.js @@ -1491,6 +1491,19 @@ export function updateSendAsset({ type, details }) { dispatch(displayWarning(err.message)); } } + + if (details.standard === undefined) { + const { standard } = await getTokenStandardAndDetails( + details.address, + userAddress, + ); + details.standard = standard; + } + + if (details.standard === ERC1155) { + throw new Error('Sends of ERC1155 tokens are not currently supported'); + } + if (isCurrentOwner) { error = null; balance = '0x1'; diff --git a/ui/pages/send/send-content/send-asset-row/send-asset-row.component.js b/ui/pages/send/send-content/send-asset-row/send-asset-row.component.js index 795b9a2c1..d1e308c70 100644 --- a/ui/pages/send/send-content/send-asset-row/send-asset-row.component.js +++ b/ui/pages/send/send-content/send-asset-row/send-asset-row.component.js @@ -4,7 +4,7 @@ import SendRowWrapper from '../send-row-wrapper'; import Identicon from '../../../../components/ui/identicon'; import TokenBalance from '../../../../components/ui/token-balance'; import UserPreferencedCurrencyDisplay from '../../../../components/app/user-preferenced-currency-display'; -import { ERC20, PRIMARY } from '../../../../helpers/constants/common'; +import { ERC20, ERC721, PRIMARY } from '../../../../helpers/constants/common'; import { ASSET_TYPES } from '../../../../ducks/send'; import { isEqualCaseInsensitive } from '../../../../helpers/utils/util'; @@ -57,7 +57,8 @@ export default class SendAssetRow extends Component { async componentDidMount() { const sendableTokens = this.props.tokens.filter((token) => !token.isERC721); const sendableCollectibles = this.props.collectibles.filter( - (collectible) => collectible.isCurrentlyOwned, + (collectible) => + collectible.isCurrentlyOwned && collectible.standard === ERC721, ); this.setState({ sendableTokens, sendableCollectibles }); } diff --git a/ui/pages/settings/experimental-tab/experimental-tab.component.js b/ui/pages/settings/experimental-tab/experimental-tab.component.js index 212d8bbb5..6b37d955a 100644 --- a/ui/pages/settings/experimental-tab/experimental-tab.component.js +++ b/ui/pages/settings/experimental-tab/experimental-tab.component.js @@ -64,10 +64,11 @@ export default class ExperimentalTab extends PureComponent { useCollectibleDetection, setUseCollectibleDetection, openSeaEnabled, + setOpenSeaEnabled, } = this.props; return ( -
+
{t('useCollectibleDetection')}
@@ -77,7 +78,6 @@ export default class ExperimentalTab extends PureComponent {
{ this.context.metricsEvent({ @@ -87,6 +87,9 @@ export default class ExperimentalTab extends PureComponent { name: 'Collectible Detection', }, }); + if (!value && !openSeaEnabled) { + setOpenSeaEnabled(!value); + } setUseCollectibleDetection(!value); }} offLabel={t('off')} @@ -103,10 +106,15 @@ export default class ExperimentalTab extends PureComponent { return null; } const { t } = this.context; - const { openSeaEnabled, setOpenSeaEnabled } = this.props; + const { + openSeaEnabled, + setOpenSeaEnabled, + useCollectibleDetection, + setUseCollectibleDetection, + } = this.props; return ( -
+
{t('enableOpenSeaAPI')}
@@ -126,6 +134,9 @@ export default class ExperimentalTab extends PureComponent { }, }); setOpenSeaEnabled(!value); + if (value && !useCollectibleDetection) { + setUseCollectibleDetection(true); + } }} offLabel={t('off')} onLabel={t('on')} diff --git a/ui/pages/settings/index.scss b/ui/pages/settings/index.scss index 78b4af992..d854a5951 100644 --- a/ui/pages/settings/index.scss +++ b/ui/pages/settings/index.scss @@ -168,6 +168,15 @@ display: flex; flex-direction: column; padding: 10px 0 20px; + + &--parent { + padding: 10px 0 10px; + } + + &--dependent { + margin-left: 48px; + padding: 0 0 20px; + } } &__content-item { diff --git a/ui/store/actions.js b/ui/store/actions.js index 8e3c1dbd2..6800a9ced 100644 --- a/ui/store/actions.js +++ b/ui/store/actions.js @@ -1829,6 +1829,13 @@ export function hideAlert() { }; } +export function updateCollectibleDropDownState(value) { + return async (dispatch) => { + await promisifiedBackground.updateCollectibleDropDownState(value); + await forceUpdateMetamaskState(dispatch); + }; +} + /** * This action will receive two types of values via qrCodeData * an object with the following structure {type, values} From fd46f97e3556dc13b7d4fde6d7703df7fffc9f99 Mon Sep 17 00:00:00 2001 From: thickforest Date: Fri, 28 Jan 2022 04:47:25 +0800 Subject: [PATCH 054/115] Fix className misspelling in `awaiting-swap.js ` --- .../awaiting-swap/__snapshots__/awaiting-swap.test.js.snap | 2 +- ui/pages/swaps/awaiting-swap/awaiting-swap.js | 2 +- ui/pages/swaps/awaiting-swap/awaiting-swap.test.js | 2 +- ui/pages/swaps/awaiting-swap/index.scss | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/pages/swaps/awaiting-swap/__snapshots__/awaiting-swap.test.js.snap b/ui/pages/swaps/awaiting-swap/__snapshots__/awaiting-swap.test.js.snap index c0c43246c..3f523d5d1 100644 --- a/ui/pages/swaps/awaiting-swap/__snapshots__/awaiting-swap.test.js.snap +++ b/ui/pages/swaps/awaiting-swap/__snapshots__/awaiting-swap.test.js.snap @@ -2,7 +2,7 @@ exports[`AwaitingSwap renders the component with initial props 1`] = `
diff --git a/ui/pages/swaps/awaiting-swap/awaiting-swap.js b/ui/pages/swaps/awaiting-swap/awaiting-swap.js index 64905efd4..658ed7175 100644 --- a/ui/pages/swaps/awaiting-swap/awaiting-swap.js +++ b/ui/pages/swaps/awaiting-swap/awaiting-swap.js @@ -273,7 +273,7 @@ export default function AwaitingSwap({ )}
{statusImage}
{headerText}
-
{descriptionText}
+
{descriptionText}
{content}
{!errorKey && swapComplete ? : null} diff --git a/ui/pages/swaps/awaiting-swap/awaiting-swap.test.js b/ui/pages/swaps/awaiting-swap/awaiting-swap.test.js index 079f16a01..30a587df1 100644 --- a/ui/pages/swaps/awaiting-swap/awaiting-swap.test.js +++ b/ui/pages/swaps/awaiting-swap/awaiting-swap.test.js @@ -30,7 +30,7 @@ describe('AwaitingSwap', () => { expect(getByText('ETH')).toBeInTheDocument(); expect(getByText('View in activity')).toBeInTheDocument(); expect( - document.querySelector('.awaiting-swap__main-descrption'), + document.querySelector('.awaiting-swap__main-description'), ).toMatchSnapshot(); expect(getByText('View in activity')).toBeInTheDocument(); }); diff --git a/ui/pages/swaps/awaiting-swap/index.scss b/ui/pages/swaps/awaiting-swap/index.scss index 297970dc1..9ed729b9c 100644 --- a/ui/pages/swaps/awaiting-swap/index.scss +++ b/ui/pages/swaps/awaiting-swap/index.scss @@ -35,7 +35,7 @@ color: var(--Black-100); } - &__main-descrption { + &__main-description { @include H6; color: var(--Grey-500); From a365c3b647f365a32e0ff739a2066ee1ab83315f Mon Sep 17 00:00:00 2001 From: ryanml Date: Thu, 27 Jan 2022 15:44:55 -0700 Subject: [PATCH 055/115] Revert "Revert "New Crowdin translations by Github Action (#13206)"" This reverts commit 27fc56e522cbb0ad0cbd157679c57cc928625065. --- app/_locales/ar/messages.json | 20 + app/_locales/bg/messages.json | 12 + app/_locales/bn/messages.json | 12 + app/_locales/ca/messages.json | 12 + app/_locales/cs/messages.json | 6 + app/_locales/da/messages.json | 12 + app/_locales/de/messages.json | 22 +- app/_locales/el/messages.json | 2335 ++++++++++++++++++++++ app/_locales/es/messages.json | 31 - app/_locales/es_419/messages.json | 43 +- app/_locales/et/messages.json | 12 + app/_locales/fa/messages.json | 12 + app/_locales/fi/messages.json | 12 + app/_locales/fil/messages.json | 9 + app/_locales/fr/messages.json | 2355 +++++++++++++++++++++- app/_locales/gu/messages.json | 6 + app/_locales/he/messages.json | 12 + app/_locales/hi/messages.json | 1118 +++++++++++ app/_locales/hr/messages.json | 12 + app/_locales/ht/messages.json | 9 + app/_locales/hu/messages.json | 12 + app/_locales/id/messages.json | 1126 ++++++++++- app/_locales/it/messages.json | 62 +- app/_locales/ja/messages.json | 1118 +++++++++++ app/_locales/kn/messages.json | 12 + app/_locales/ko/messages.json | 1118 +++++++++++ app/_locales/lt/messages.json | 14 +- app/_locales/lv/messages.json | 12 + app/_locales/ml/messages.json | 6 + app/_locales/mr/messages.json | 6 + app/_locales/ms/messages.json | 12 + app/_locales/nl/messages.json | 3 + app/_locales/no/messages.json | 12 + app/_locales/pl/messages.json | 12 + app/_locales/pt_BR/messages.json | 47 +- app/_locales/ro/messages.json | 12 + app/_locales/ru/messages.json | 1118 +++++++++++ app/_locales/sk/messages.json | 12 + app/_locales/sl/messages.json | 12 + app/_locales/sr/messages.json | 12 + app/_locales/sv/messages.json | 12 + app/_locales/sw/messages.json | 12 + app/_locales/ta/messages.json | 9 + app/_locales/te/messages.json | 6 + app/_locales/th/messages.json | 6 + app/_locales/tl/messages.json | 1598 ++++++++++++++- app/_locales/tr/messages.json | 3002 +++++++++++++++++++++++++++++ app/_locales/uk/messages.json | 12 + app/_locales/vi/messages.json | 1118 +++++++++++ app/_locales/zh_CN/messages.json | 1527 +++++++++++++++ 50 files changed, 17928 insertions(+), 174 deletions(-) diff --git a/app/_locales/ar/messages.json b/app/_locales/ar/messages.json index bea011d3c..ab092254e 100644 --- a/app/_locales/ar/messages.json +++ b/app/_locales/ar/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "رفض" + }, + "QRHardwareWalletImporterTitle": { + "message": "مسح كود الاستجابة السريعة QR" + }, "about": { "message": "حول" }, @@ -8,6 +14,14 @@ "acceleratingATransaction": { "message": "* تسريع المعاملات باستخدام سعر عملة جاس أعلى يزيد من فرص معالجتها بواسطة الشبكة بشكلٍ أسرع، لكن ذلك غير مضمون دائماً." }, + "acceptTermsOfUse": { + "message": "لقد قرأت دولار واحد وأوافق عليه", + "description": "$1 is the `terms` message" + }, + "accessAndSpendNotice": { + "message": "$1 يمكن الوصول إلى هذا المبلغ الأقصى وإنفاقه حتى", + "description": "$1 is the url of the site requesting ability to spend" + }, "accessingYourCamera": { "message": "جاري استخدام كاميرتك..." }, @@ -256,6 +270,9 @@ "currentLanguage": { "message": "اللغة الحالية" }, + "custom": { + "message": "إعدادات متقدمة" + }, "customGas": { "message": "تخصيص الغاز" }, @@ -526,6 +543,9 @@ "learnMore": { "message": "اكتشف المزيد" }, + "learnMoreUpperCase": { + "message": "اكتشف المزيد" + }, "ledgerAccountRestriction": { "message": "أنت بحاجة إلى استخدام حسابك الأخير قبل أن تتمكن من إضافة حساب جديد." }, diff --git a/app/_locales/bg/messages.json b/app/_locales/bg/messages.json index 170ef75af..0f8320b6c 100644 --- a/app/_locales/bg/messages.json +++ b/app/_locales/bg/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Отхвърляне" + }, + "QRHardwareWalletImporterTitle": { + "message": "Сканиране на QR код" + }, "about": { "message": "Информация" }, @@ -256,6 +262,9 @@ "currentLanguage": { "message": "Настоящ език" }, + "custom": { + "message": "Разширени" + }, "customGas": { "message": "Персонализирайте газ" }, @@ -526,6 +535,9 @@ "learnMore": { "message": "Научете повече" }, + "learnMoreUpperCase": { + "message": "Научете повече" + }, "ledgerAccountRestriction": { "message": "Трябва да използвате последния си акаунт, преди да можете да добавите нов." }, diff --git a/app/_locales/bn/messages.json b/app/_locales/bn/messages.json index a316b3558..fc3d0bad1 100644 --- a/app/_locales/bn/messages.json +++ b/app/_locales/bn/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "প্রত্যাখ্যান" + }, + "QRHardwareWalletImporterTitle": { + "message": "QR কোড স্ক্যান করুন" + }, "about": { "message": "সম্পর্কে" }, @@ -256,6 +262,9 @@ "currentLanguage": { "message": "বর্তমান ভাষা" }, + "custom": { + "message": "উন্নত" + }, "customGas": { "message": "গ্যাস কাস্টোমাইজ করুন" }, @@ -530,6 +539,9 @@ "learnMore": { "message": "আরও জানুন" }, + "learnMoreUpperCase": { + "message": "আরও জানুন" + }, "ledgerAccountRestriction": { "message": "একটি নতুন অ্যা কাউন্ট যোগ করার আগে আপনাকে আপনার শেষ অ্যাকাউন্ট ব্যবহার করে ফেলতে হবে।" }, diff --git a/app/_locales/ca/messages.json b/app/_locales/ca/messages.json index fe011c7c0..7f901d6a6 100644 --- a/app/_locales/ca/messages.json +++ b/app/_locales/ca/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Rebutja" + }, + "QRHardwareWalletImporterTitle": { + "message": "Escanejar Codi QR" + }, "about": { "message": "Informació" }, @@ -253,6 +259,9 @@ "currentLanguage": { "message": "Llengua Actual" }, + "custom": { + "message": "Configuració avançada" + }, "customGas": { "message": "Customitza el gas" }, @@ -517,6 +526,9 @@ "learnMore": { "message": "Saber més" }, + "learnMoreUpperCase": { + "message": "Saber més" + }, "ledgerAccountRestriction": { "message": "Has de fer servir el teu últim compte abans de poder afegir-ne un altre." }, diff --git a/app/_locales/cs/messages.json b/app/_locales/cs/messages.json index e5267f1e1..8fe8abacb 100644 --- a/app/_locales/cs/messages.json +++ b/app/_locales/cs/messages.json @@ -1,4 +1,7 @@ { + "QRHardwareSignRequestCancel": { + "message": "Odmítnout" + }, "account": { "message": "Účet" }, @@ -213,6 +216,9 @@ "learnMore": { "message": "Zjistěte více." }, + "learnMoreUpperCase": { + "message": "Zjistěte více." + }, "likeToImportTokens": { "message": "Chcete přidat tyto tokeny?" }, diff --git a/app/_locales/da/messages.json b/app/_locales/da/messages.json index 66660302d..3041f971b 100644 --- a/app/_locales/da/messages.json +++ b/app/_locales/da/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Afvis" + }, + "QRHardwareWalletImporterTitle": { + "message": "Scan QR-kode" + }, "about": { "message": "Om" }, @@ -256,6 +262,9 @@ "currentLanguage": { "message": "Nuværende sprog" }, + "custom": { + "message": "Avanceret" + }, "customGas": { "message": "Tilpas brændstof" }, @@ -523,6 +532,9 @@ "learnMore": { "message": "Lær mere" }, + "learnMoreUpperCase": { + "message": "Lær mere" + }, "ledgerAccountRestriction": { "message": "Du skal benytte din tidligere konto, før du kan tilføje en ny." }, diff --git a/app/_locales/de/messages.json b/app/_locales/de/messages.json index f07862c17..63ffe3d6e 100644 --- a/app/_locales/de/messages.json +++ b/app/_locales/de/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Ablehnen" + }, + "QRHardwareWalletImporterTitle": { + "message": "QR-Code scannen" + }, "about": { "message": "Über" }, @@ -247,6 +253,9 @@ "currentLanguage": { "message": "Aktuelle Sprache" }, + "custom": { + "message": "Erweitert" + }, "customGas": { "message": "Gas anpassen" }, @@ -427,9 +436,6 @@ "happyToSeeYou": { "message": "Wir freuen uns, Sie zu sehen." }, - "hardware": { - "message": "Hardware" - }, "hardwareWalletConnected": { "message": "Hardware-Wallet verknüpft" }, @@ -518,6 +524,9 @@ "learnMore": { "message": "Mehr erfahren" }, + "learnMoreUpperCase": { + "message": "Mehr erfahren" + }, "ledgerAccountRestriction": { "message": "Sie müssen Ihr letztes Konto verwenden, ehe Sie ein neues hinzufügen können." }, @@ -539,9 +548,6 @@ "lock": { "message": "Ausloggen" }, - "mainnet": { - "message": "Ethereum Mainnet" - }, "memo": { "message": " Memo" }, @@ -591,10 +597,6 @@ "newAccountDetectedDialogMessage": { "message": "Neue Adresse erkannt! Klicken Sie hier, um sie zu Ihrem Adressbuch hinzuzufügen." }, - "newAccountNumberName": { - "message": "Account $1", - "description": "Default name of next account to be created on create account screen" - }, "newContact": { "message": "Neuer Kontakt" }, diff --git a/app/_locales/el/messages.json b/app/_locales/el/messages.json index 6b676c9e0..c33171c0e 100644 --- a/app/_locales/el/messages.json +++ b/app/_locales/el/messages.json @@ -1,4 +1,49 @@ { + "QRHardwareInvalidTransactionTitle": { + "message": "Σφάλμα" + }, + "QRHardwareMismatchedSignId": { + "message": "Μη συμβατά δεδομένα συναλλαγών. Ελέγξτε τις λεπτομέρειες της συναλλαγής." + }, + "QRHardwarePubkeyAccountOutOfRange": { + "message": "Δεν υπάρχουν άλλοι λογαριασμοί. Αν θέλετε να αποκτήσετε πρόσβαση σε άλλο λογαριασμό που δεν αναφέρεται παρακάτω, παρακαλώ επανασυνδέστε το υλικό πορτοφόλι σας και επιλέξτε το." + }, + "QRHardwareScanInstructions": { + "message": "Τοποθετήστε τον κωδικό QR μπροστά από την κάμερα. Η οθόνη είναι θολή, αλλά δεν θα επηρεάσει την ανάγνωση." + }, + "QRHardwareSignRequestCancel": { + "message": "Απόρριψη" + }, + "QRHardwareSignRequestDescription": { + "message": "Αφού συνδεθείτε με το πορτοφόλι σας, κάντε κλικ στο 'Λήψη Υπογραφής' για να λάβετε την υπογραφή" + }, + "QRHardwareSignRequestGetSignature": { + "message": "Λήψη Υπογραφής" + }, + "QRHardwareSignRequestSubtitle": { + "message": "Σαρώστε τον κωδικό QR με το πορτοφόλι σας" + }, + "QRHardwareSignRequestTitle": { + "message": "Αίτημα Υπογραφής" + }, + "QRHardwareUnknownQRCodeTitle": { + "message": "Σφάλμα" + }, + "QRHardwareUnknownWalletQRCode": { + "message": "Μη έγκυρος κωδικός QR. Παρακαλώ σαρώστε τον κωδικό QR του υλικού πορτοφολιού." + }, + "QRHardwareWalletImporterTitle": { + "message": "Σάρωση Κωδικού QR" + }, + "QRHardwareWalletSteps1Description": { + "message": "Συνδέστε ένα airgapped πορτοφόλι υλικού που επικοινωνεί μέσω κωδικών QR. Τα airgapped πορτοφόλια που υποστηρίζονται επίσημα περιλαμβάνουν:" + }, + "QRHardwareWalletSteps1Title": { + "message": "Πορτοφόλι HW βασισμένο σε QR" + }, + "QRHardwareWalletSteps2Description": { + "message": "AirGap Vault & Ngrave (Σύντομα)" + }, "about": { "message": "Σχετικά με" }, @@ -8,6 +53,14 @@ "acceleratingATransaction": { "message": "* Η επιτάχυνση μιας συναλλαγής με τη χρήση υψηλότερης τιμής καυσίμου αυξάνει τις πιθανότητές της για ταχύτερη επεξεργασία από το δίκτυο, αλλά δεν είναι πάντοτε εγγυημένη." }, + "acceptTermsOfUse": { + "message": "Έχω διαβάσει και συμφωνώ με το $1", + "description": "$1 is the `terms` message" + }, + "accessAndSpendNotice": { + "message": "$1 μπορεί να έχει πρόσβαση και να ξοδέψει μέχρι αυτό το μέγιστο ποσό", + "description": "$1 is the url of the site requesting ability to spend" + }, "accessingYourCamera": { "message": "Πρόσβαση στην κάμερά σας..." }, @@ -20,21 +73,76 @@ "accountName": { "message": "Όνομα Λογαριασμού" }, + "accountNameDuplicate": { + "message": "Αυτό το όνομα λογαριασμού υπάρχει ήδη", + "description": "This is an error message shown when the user enters a new account name that matches an existing account name" + }, "accountOptions": { "message": "Επιλογές Λογαριασμού" }, "accountSelectionRequired": { "message": "Πρέπει να επιλέξετε έναν λογαριασμό!" }, + "active": { + "message": "Ενεργό" + }, + "activity": { + "message": "Δραστηριότητα" + }, "activityLog": { "message": "αρχείο καταγραφής δραστηριότητας" }, + "add": { + "message": "Προσθήκη" + }, + "addANetwork": { + "message": "Προσθήκη ενός Δικτύου" + }, + "addANickname": { + "message": "Προσθήκη ενός ψευδωνύμου" + }, "addAcquiredTokens": { "message": "Προσθέστε τα token που αποκτήσατε χρησιμοποιώντας το MetaMask" }, "addAlias": { "message": "Προσθήκη ψευδωνύμου" }, + "addContact": { + "message": "Προσθήκη επαφής" + }, + "addCustomToken": { + "message": "Προσθήκη Προσαρμοσμένου Token" + }, + "addCustomTokenByContractAddress": { + "message": "Αδυναμία εύρεσης token? Μπορείτε να προσθέσετε χειροκίνητα οποιοδήποτε διακριτικό επικολλώντας τη διεύθυνσή του. Οι διευθύνσεις συμβολαίων Token μπορούν να βρεθούν στο $1.", + "description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum" + }, + "addEthereumChainConfirmationDescription": { + "message": "Αυτό θα επιτρέψει σε αυτό το δίκτυο να χρησιμοποιηθεί στο MetaMask." + }, + "addEthereumChainConfirmationRisks": { + "message": "Το MetaMask δεν επαληθεύει τα προσαρμοσμένα δίκτυα." + }, + "addEthereumChainConfirmationRisksLearnMore": { + "message": "Μάθετε για το $1.", + "description": "$1 is a link with text that is provided by the 'addEthereumChainConfirmationRisksLearnMoreLink' key" + }, + "addEthereumChainConfirmationRisksLearnMoreLink": { + "message": "απάτες και κίνδυνοι ασφάλειας δικτύου", + "description": "Link text for the 'addEthereumChainConfirmationRisksLearnMore' translation key" + }, + "addEthereumChainConfirmationTitle": { + "message": "Επιτρέπετε σε αυτήν την ιστοσελίδα να προσθέσει ένα δίκτυο;" + }, + "addFriendsAndAddresses": { + "message": "Προσθέστε φίλους και διευθύνσεις που εμπιστεύεστε" + }, + "addMemo": { + "message": "Προσθήκη σημειώματος" + }, + "addNFT": { + "message": "Προσθήκη NFT" + }, "addNetwork": { "message": "Προσθήκη Δικτύου" }, @@ -50,15 +158,80 @@ "addToken": { "message": "Προσθήκη Token" }, + "address": { + "message": "Διεύθυνση" + }, + "addressBookIcon": { + "message": "Εικονίδιο βιβλίου διευθύνσεων" + }, "advanced": { "message": "Σύνθετες" }, + "advancedBaseGasFeeToolTip": { + "message": "Όταν η συναλλαγή σας συμπεριληφθεί στο μπλοκ, οποιαδήποτε διαφορά μεταξύ της μέγιστης βασικής χρέωσής σας και της πραγματικής βασικής χρέωσής θα επιστραφεί. Το συνολικό ποσό υπολογίζεται ως μέγιστο βασικό τέλος (σε GWEI) * όριο τελών συναλλαγής." + }, + "advancedGasFeeDefaultOptIn": { + "message": "Αποθηκεύστε αυτά τα $1 ως προεπιλογή μου για το \"Προηγμένο\"" + }, + "advancedGasFeeDefaultOptOut": { + "message": "Να χρησιμοποιούνται πάντα αυτές τις τιμές και η ρύθμιση για προχωρημένους." + }, + "advancedGasFeeModalTitle": { + "message": "Προηγμένη χρέωση τελών συναλλαγής" + }, + "advancedGasPriceTitle": { + "message": "Τιμή τελών συναλλαγής" + }, "advancedOptions": { "message": "Σύνθετες Επιλογές" }, + "advancedPriorityFeeToolTip": { + "message": "Το τέλος προτεραιότητας (γνωστό και ως “miner tip”) πηγαίνει άμεσα στους miner και τους ενθαρρύνει να δώσουν προτεραιότητα στη συναλλαγή σας." + }, "advancedSettingsDescription": { "message": "Αποκτήστε πρόσβαση στις λειτουργίες του προγραμματιστή, κατεβάστε Αρχεία Καταγραφών Καταστάσεων, Επαναφέρετε τον Λογαριασμό, εγκαταστήστε δοκιμαστικά δίκτυα και προσαρμοσμένα RPC" }, + "affirmAgree": { + "message": "Συμφωνώ" + }, + "aggregatorFeeCost": { + "message": "Αμοιβή ανταλλακτηρίου" + }, + "alertDisableTooltip": { + "message": "Αυτό μπορεί να αλλάξει στο \"Ρυθμίσεις> Ειδοποιήσεις\"" + }, + "alertSettingsUnconnectedAccount": { + "message": "Περιήγηση σε μια ιστοσελίδα με έναν μη συνδεδεμένο λογαριασμό επιλεγμένο" + }, + "alertSettingsUnconnectedAccountDescription": { + "message": "Αυτή η ειδοποίηση εμφανίζεται στο αναδυόμενο παράθυρο κατά την περιήγηση σε μια συνδεδεμένη web3 ιστοσελίδα, αλλά ο τρέχων επιλεγμένος λογαριασμός δεν είναι συνδεδεμένος." + }, + "alertSettingsWeb3ShimUsage": { + "message": "Όταν μια ιστοσελίδα προσπαθεί να χρησιμοποιήσει το window.web3 API που έχει αφαιρεθεί" + }, + "alertSettingsWeb3ShimUsageDescription": { + "message": "Αυτή η ειδοποίηση εμφανίζεται στο αναδυόμενο παράθυρο όταν περιηγείστε σε μια ιστοσελίδα που προσπαθεί να χρησιμοποιήσει το window.web3 API που έχει αφαιρεθεί, και μπορεί, ως αποτέλεσμα, να μην λειτουργεί." + }, + "alerts": { + "message": "Ειδοποιήσεις" + }, + "alertsSettingsDescription": { + "message": "Ενεργοποίηση ή απενεργοποίηση κάθε ειδοποίησης" + }, + "allowExternalExtensionTo": { + "message": "Επιτρέψτε σε αυτή την εξωτερική επέκταση να:" + }, + "allowSpendToken": { + "message": "Δίνετε άδεια για να αποκτήσετε πρόσβαση στο $1;", + "description": "$1 is the symbol of the token that are requesting to spend" + }, + "allowThisSiteTo": { + "message": "Επιτρέψτε σε αυτόν τον ιστότοπο να:" + }, + "allowWithdrawAndSpend": { + "message": "Επιτρέψτε στο $1 να κάνει ανάληψη και να ξοδέψει μέχρι το ακόλουθο ποσό:", + "description": "The url of the site that requested permission to 'withdraw and spend'" + }, "amount": { "message": "Ποσό" }, @@ -78,15 +251,37 @@ "message": "MetaMask Flask", "description": "The name of the application (Flask)" }, + "approvalAndAggregatorTxFeeCost": { + "message": "Τέλος έγκρισης και δικτύου ανταλλακτηρίου" + }, + "approvalTxGasCost": { + "message": "Έγκριση Tx τέλους συναλλαγής" + }, "approve": { "message": "Έγκριση" }, + "approveButtonText": { + "message": "Έγκριση" + }, + "approveSpendLimit": { + "message": "Έγκριση ορίου δαπανών $1", + "description": "The token symbol that is being approved" + }, "approved": { "message": "Εγκρίθηκε" }, + "approvedAmountWithColon": { + "message": "Εγκεκριμένο ποσό:" + }, "asset": { "message": "Στοιχείο ενεργητικού" }, + "assetOptions": { + "message": "Επιλογές περιουσιακών στοιχείων" + }, + "assets": { + "message": "Περιουσιακά στοιχεία" + }, "attemptToCancel": { "message": "Προσπάθεια Ακύρωσης;" }, @@ -99,6 +294,9 @@ "attributions": { "message": "Αποδόσεις" }, + "authorizedPermissions": { + "message": "Έχετε εξουσιοδοτήσει τα ακόλουθα δικαιώματα" + }, "autoLockTimeLimit": { "message": "Χρονόμετρο Αυτόματης Αποσύνδεσης (λεπτά)" }, @@ -129,12 +327,49 @@ "balanceOutdated": { "message": "Το υπόλοιπο μπορεί να μην είναι ενημερωμένο" }, + "baseFee": { + "message": "Βασικό τέλος" + }, "basic": { "message": "Βασικά" }, + "betaMetamaskDescription": { + "message": "Αξιόπιστο για εκατομμύρια, MetaMask είναι ένα ασφαλές πορτοφόλι που καθιστά τον κόσμο του web3 προσβάσιμο σε όλους." + }, + "betaMetamaskDescriptionExplanation": { + "message": "Χρησιμοποιήστε αυτήν την έκδοση για να δοκιμάσετε τις επερχόμενες λειτουργίες πριν από την κυκλοφορία τους. Η χρήση και η ανατροφοδότηση σας μας βοηθούν να χτίσουμε την καλύτερη δυνατή έκδοση του MetaMask. Η χρήση του MetaMask Δοκιμαστική Έκδοση υπόκειται στα στάνταρ μας $1, καθώς και $2. Ως Δοκιμαστική Έκδοση, μπορεί να υπάρχει αυξημένος κίνδυνος σφαλμάτων. Συνεχίζοντας, αποδέχεστε και αναγνωρίζετε αυτούς τους κινδύνους, καθώς και τους κινδύνους που εντοπίζονται στους Όρους μας και τους Όρους Δοκιμαστικής Έκδοσης.", + "description": "$1 represents localization item betaMetamaskDescriptionExplanationTermsLinkText. $2 represents localization item betaMetamaskDescriptionExplanationBetaTermsLinkText" + }, + "betaMetamaskDescriptionExplanationBetaTermsLinkText": { + "message": "Συμπληρωματικοί Όροι Δοκιμαστικής Έκδοσης" + }, + "betaMetamaskDescriptionExplanationTermsLinkText": { + "message": "Όροι" + }, + "betaMetamaskVersion": { + "message": "Δοκιμαστική έκδοση MetaMask" + }, + "betaWelcome": { + "message": "Καλώς ήλθατε στη Δοκιμαστική Έκδοση MetaMask" + }, + "blockExplorerAccountAction": { + "message": "Λογαριασμός", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Account in Explorer" + }, + "blockExplorerAssetAction": { + "message": "Περιουσιακά στοιχεία", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Asset in Explorer" + }, + "blockExplorerSwapAction": { + "message": "Ανταλλαγή", + "description": "This is used with viewOnEtherscan e.g View Swap on Etherscan" + }, "blockExplorerUrl": { "message": "Εξερευνητής Μπλοκ" }, + "blockExplorerUrlDefinition": { + "message": "Το URL που χρησιμοποιείται ως εξερευνητής μπλοκ για αυτό το δίκτυο." + }, "blockExplorerView": { "message": "Προβολή λογαριασμού με $1", "description": "$1 replaced by URL for custom block explorer" @@ -145,15 +380,48 @@ "browserNotSupported": { "message": "Το Πρόγραμμα Περιήγησής σας δεν υποστηρίζεται..." }, + "buildContactList": { + "message": "Δημιουργήστε τη λίστα επαφών σας" + }, + "builtAroundTheWorld": { + "message": "Η MetaMask έχει σχεδιαστεί και κατασκευαστεί σε όλο τον κόσμο." + }, + "busy": { + "message": "Απασχολημένο" + }, + "buy": { + "message": "Αγορά" + }, + "buyWithTransak": { + "message": "Αγοράστε ETH με Transak" + }, + "buyWithTransakDescription": { + "message": "Η Transak υποστηρίζει χρεωστική κάρτα και τραπεζικές μεταφορές (ανάλογα με τη τοποθεσία σας) σε 59+ χώρες. Το ETH κατατίθεται στο λογαριασμό σας MetaMask." + }, "buyWithWyre": { "message": "Αγοράστε ETH με το Wyre" }, "buyWithWyreDescription": { "message": "Το Wyre σας επιτρέπει να χρησιμοποιήσετε μια πιστωτική κάρτα για να καταθέσετε ETH απευθείας στον λογαριασμό σας MetaTask." }, + "bytes": { + "message": "Bytes" + }, + "canToggleInSettings": { + "message": "Μπορείτε να ενεργοποιήσετε ξανά αυτήν την ειδοποίηση στις Ρυθμίσεις -> Ειδοποιήσεις." + }, "cancel": { "message": "Ακύρωση" }, + "cancelEdit": { + "message": "Ακύρωση Επεξεργασίας" + }, + "cancelPopoverTitle": { + "message": "Ακύρωση συναλλαγής" + }, + "cancelSpeedUp": { + "message": "ακύρωση ή επιτάχυνση μιας συναλλαγής." + }, "cancellationGasFee": { "message": "Ακύρωση Χρέωσης Αερίου" }, @@ -163,9 +431,19 @@ "chainId": { "message": "Αναγνωριστικό Αλυσίδας" }, + "chainIdDefinition": { + "message": "Το αναγνωριστικό αλυσίδας χρησιμοποιείται για την υπογραφή συναλλαγών για αυτό το δίκτυο." + }, + "chainIdExistsErrorMsg": { + "message": "Αυτό το αναγνωριστικό αλυσίδας χρησιμοποιείται επί του παρόντος από το δίκτυο $1." + }, "chromeRequiredForHardwareWallets": { "message": "Θα πρέπει να χρησιμοποιήσετε το MetaMask στο Google Chrome για να συνδεθείτε στο Πορτοφόλι Υλικού." }, + "clickToConnectLedgerViaWebHID": { + "message": "Κάντε κλικ εδώ για να συνδέσετε το Ledger σας μέσω WebHID", + "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" + }, "clickToRevealSeed": { "message": "Κάντε κλικ εδώ για να αποκαλύψετε μυστικές λέξεις" }, @@ -178,21 +456,86 @@ "confirmPassword": { "message": "Επιβεβαίωση Κωδικού Πρόσβασης" }, + "confirmRecoveryPhrase": { + "message": "Επιβεβαιώστε τη Μυστική Φράση Ανάκτησης" + }, "confirmSecretBackupPhrase": { "message": "Επιβεβαιώστε τη Μυστική Φράση Αντιγράφου Ασφαλείας" }, "confirmed": { "message": "Επιβεβαιωμένο" }, + "confusableUnicode": { + "message": "'$1' είναι παρόμοιο με '$2'." + }, + "confusableZeroWidthUnicode": { + "message": "Βρέθηκε χαρακτήρας μηδενικού πλάτους." + }, + "confusingEnsDomain": { + "message": "Εντοπίσαμε έναν παράξενο χαρακτήρα στο όνομα ENS. Ελέγξτε το όνομα ENS για να αποφύγετε μια πιθανή απάτη." + }, "congratulations": { "message": "Συγχαρητήρια" }, "connect": { "message": "Σύνδεση" }, + "connectAccountOrCreate": { + "message": "Σύνδεση λογαριασμού ή δημιουργία νέου" + }, "connectHardwareWallet": { "message": "Σύνδεση Πορτοφολιού Υλικού" }, + "connectManually": { + "message": "Χειροκίνητη σύνδεση στον τρέχοντα ιστότοπο" + }, + "connectTo": { + "message": "Σύνδεση με $1", + "description": "$1 is the name/origin of a web3 site/application that the user can connect to metamask" + }, + "connectToAll": { + "message": "Συνδεθείτε σε όλα τα $1 σας", + "description": "$1 will be replaced by the translation of connectToAllAccounts" + }, + "connectToAllAccounts": { + "message": "λογαριασμοί", + "description": "will replace $1 in connectToAll, completing the sentence 'connect to all of your accounts', will be text that shows list of accounts on hover" + }, + "connectToMultiple": { + "message": "Σύνδεση με $1", + "description": "$1 will be replaced by the translation of connectToMultipleNumberOfAccounts" + }, + "connectToMultipleNumberOfAccounts": { + "message": "$1 λογαριασμοί", + "description": "$1 is the number of accounts to which the web3 site/application is asking to connect; this will substitute $1 in connectToMultiple" + }, + "connectWithMetaMask": { + "message": "Σύνδεση Με MetaMask" + }, + "connectedAccountsDescriptionPlural": { + "message": "Έχετε $1 λογαριασμούς συνδεδεμένους με αυτόν τον ιστότοπο.", + "description": "$1 is the number of accounts" + }, + "connectedAccountsDescriptionSingular": { + "message": "Έχετε 1 λογαριασμό συνδεδεμένο σε αυτόν τον ιστότοπο." + }, + "connectedAccountsEmptyDescription": { + "message": "To MetaMask δεν είναι συνδεδεμένo σε αυτόν τον ιστότοπο. Για να συνδεθείτε σε έναν ιστότοπο web3, βρείτε και κάντε κλικ στο κουμπί σύνδεσης." + }, + "connectedSites": { + "message": "Συνδεδεμένοι ιστότοποι" + }, + "connectedSitesDescription": { + "message": "$1 είναι συνδεδεμένο σε αυτές τις ιστοσελίδες. Μπορούν να δουν τη διεύθυνση του λογαριασμού σας.", + "description": "$1 is the account name" + }, + "connectedSitesEmptyDescription": { + "message": "$1 δεν είναι συνδεδεμένο με καμία τοποθεσία.", + "description": "$1 is the account name" + }, + "connecting": { + "message": "Σύνδεση..." + }, "connectingTo": { "message": "Σύνδεση με $1" }, @@ -211,9 +554,33 @@ "connectingToRopsten": { "message": "Σύνδεση με το Δίκτυο Δοκιμών Ropsten" }, + "contactUs": { + "message": "Επικοινωνήστε μαζί μας" + }, + "contacts": { + "message": "Επαφές" + }, + "contactsSettingsDescription": { + "message": "Προσθέστε, επεξεργαστείτε, αφαιρέστε και διαχειριστείτε τις επαφές σας" + }, + "continue": { + "message": "Συνέχεια" + }, + "continueToTransak": { + "message": "Συνεχίστε στο Transak" + }, "continueToWyre": { "message": "Συνεχίστε στο Wyre" }, + "contract": { + "message": "Συμβόλαιο" + }, + "contractAddress": { + "message": "Διεύθυνση συμβολαίου" + }, + "contractAddressError": { + "message": "Στέλνετε νομίσματα στη διεύθυνση συμβολαίου του νομίσματος. Αυτό μπορεί να έχει ως αποτέλεσμα την απώλεια αυτών των νομισμάτων." + }, "contractDeployment": { "message": "Ανάπτυξη Συμβολαίου" }, @@ -229,6 +596,9 @@ "copyPrivateKey": { "message": "Αυτό είναι το ιδιωτικό σας κλειδί (κάντε κλικ για αντιγραφή)" }, + "copyRawTransactionData": { + "message": "Αντιγραφή ακατέργαστων δεδομένων συναλλαγών" + }, "copyToClipboard": { "message": "Αντιγραφή στο πρόχειρο" }, @@ -244,30 +614,104 @@ "createAccount": { "message": "Δημιουργία Λογαριασμού" }, + "createNewWallet": { + "message": "Δημιουργήστε ένα νέο πορτοφόλι" + }, "createPassword": { "message": "Δημιουργία Κωδικού Πρόσβασης" }, "currencyConversion": { "message": "Μετατροπή Νομίσματος" }, + "currencySymbol": { + "message": "Σύμβολο Νομίσματος" + }, + "currencySymbolDefinition": { + "message": "Το σύμβολο ticker που εμφανίζεται για το νόμισμα αυτού του δικτύου." + }, + "currentAccountNotConnected": { + "message": "Ο τρέχων λογαριασμός σας δεν είναι συνδεδεμένος" + }, + "currentExtension": { + "message": "Τρέχουσα σελίδα επεκτάσεων" + }, "currentLanguage": { "message": "Τρέχουσα Γλώσσα" }, + "currentTitle": { + "message": "Τρέχον:" + }, + "currentlyUnavailable": { + "message": "Μη διαθέσιμο σε αυτό το δίκτυο" + }, + "custom": { + "message": "Σύνθετες" + }, "customGas": { "message": "Προσαρμογή Gas" }, + "customGasSettingToolTipMessage": { + "message": "Χρησιμοποιήστε 1 $ για να προσαρμόσετε την τιμή του τέλους συναλλαγής. Αυτό μπορεί να προκαλέσει σύγχυση, αν δεν είστε εξοικειωμένοι. Επεξεργαστείτε το με δικό σας ρίσκο.", + "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold fontweight" + }, "customGasSubTitle": { "message": "Η αύξηση των τελών μπορεί να μειώσει τους χρόνους επεξεργασίας, αλλά αυτό δεν είναι εγγυημένο." }, + "customSpendLimit": { + "message": "Προσαρμοσμένο Όριο Δαπάνης" + }, "customToken": { "message": "Προσαρμοσμένο Token" }, + "dappSuggested": { + "message": "Προτεινόμενο από την ιστοσελίδα" + }, + "dappSuggestedGasSettingToolTipMessage": { + "message": "Το $1 έχει προτείνει αυτή την τιμή.", + "description": "$1 is url for the dapp that has suggested gas settings" + }, + "dappSuggestedShortLabel": { + "message": "Ιστοσελίδα" + }, + "dappSuggestedTooltip": { + "message": "Το $1 έχει προτείνει αυτή την τιμή.", + "description": "$1 represents the Dapp's origin" + }, + "data": { + "message": "Δεδομένα" + }, + "dataBackupFoundInfo": { + "message": "Ορισμένα από τα δεδομένα του λογαριασμού σας δημιουργήθηκαν σε προηγούμενη εγκατάσταση του MetaMask. Αυτό θα μπορούσε να περιλαμβάνει τις ρυθμίσεις, τις επαφές και τα διακριτικά σας. Θα θέλατε να επαναφέρετε αυτά τα δεδομένα τώρα;" + }, + "dataHex": { + "message": "Δεκαεξαδικός" + }, "decimal": { "message": "Δεκαδικά Ψηφία Ακριβείας" }, "decimalsMustZerotoTen": { "message": "Τα δεκαδικά πρέπει να είναι τουλάχιστον 0 και όχι πάνω από 36." }, + "decrypt": { + "message": "Αποκρυπτογράφηση" + }, + "decryptCopy": { + "message": "Αντιγραφή κρυπτογραφημένου μηνύματος" + }, + "decryptInlineError": { + "message": "Αυτό το μήνυμα δεν μπορεί να αποκρυπτογραφηθεί λόγω σφάλματος: $1", + "description": "$1 is error message" + }, + "decryptMessageNotice": { + "message": "Το $1 θα ήθελε να διαβάσει αυτό το μήνυμα για να ολοκληρώσει την ενέργειά σας", + "description": "$1 is the web3 site name" + }, + "decryptMetamask": { + "message": "Αποκρυπτογράφηση μηνύματος" + }, + "decryptRequest": { + "message": "Αίτημα αποκρυπτογράφησης" + }, "delete": { "message": "Διαγραφή" }, @@ -283,6 +727,9 @@ "depositEther": { "message": "Κατάθεση Ether" }, + "description": { + "message": "Περιγραφή" + }, "details": { "message": "Λεπτομέρειες" }, @@ -292,9 +739,39 @@ "directDepositEtherExplainer": { "message": "Αν έχετε ήδη κάποια Ether, ο πιο γρήγορος τρόπος για να πάρετε τα Ether στο νέο σας πορτοφόλι με άμεση κατάθεση." }, + "disconnect": { + "message": "Αποσύνδεση" + }, + "disconnectAllAccounts": { + "message": "Αποσύνδεση όλων των λογαριασμών" + }, + "disconnectAllAccountsConfirmationDescription": { + "message": "Είστε βέβαιοι ότι θέλετε να αποσυνδεθείτε? Μπορεί να χάσετε τη λειτουργικότητα της ιστοσελίδας." + }, + "disconnectPrompt": { + "message": "Αποσύνδεση $1" + }, + "disconnectThisAccount": { + "message": "Αποσύνδεση αυτού του λογαριασμού" + }, + "dismiss": { + "message": "Παράβλεψη" + }, + "dismissReminderDescriptionField": { + "message": "Ενεργοποιήστε αυτήν την επιλογή για να απορρίψετε το μήνυμα υπενθύμισης αντιγράφου ασφαλείας Ανάκτησης Μυστικής Φράσης. Σας συνιστούμε έντονα να δημιουργήσετε αντίγραφα ασφαλείας της Ανάκτησης Μυστικής Φράσης σας για να αποφύγετε την απώλεια χρημάτων" + }, + "dismissReminderField": { + "message": "Παράβλεψη υπενθύμισης αντιγράφου ασφαλείας Ανάκτησης Μυστικής Φράσης" + }, + "domain": { + "message": "Τομέας" + }, "done": { "message": "Τέλος" }, + "dontShowThisAgain": { + "message": "Να μην εμφανιστεί ξανά" + }, "downloadGoogleChrome": { "message": "Κατεβάστε το Google Chrome" }, @@ -310,9 +787,154 @@ "edit": { "message": "Επεξεργασία" }, + "editANickname": { + "message": "Επεξεργασία ψευδώνυμου" + }, + "editAddressNickname": { + "message": "Επεξεργασία ψευδωνύμου διεύθυνσης" + }, "editContact": { "message": "Επεξεργασία Επαφής" }, + "editGasEducationButtonText": { + "message": "Πώς πρέπει να επιλέξω;" + }, + "editGasEducationHighExplanation": { + "message": "Αυτό είναι καλύτερο για ευαίσθητες στον χρόνο συναλλαγές (όπως τα Swaps) καθώς αυξάνει την πιθανότητα επιτυχούς συναλλαγής. Εάν ένα Swap πάρει πολύ χρόνο για να επεξεργαστεί, μπορεί να αποτύχει και να έχει ως αποτέλεσμα την απώλεια κάποιων τελών συναλλαγής." + }, + "editGasEducationLowExplanation": { + "message": "Ένα χαμηλότερο τέλος συναλλαγής θα πρέπει να χρησιμοποιείται μόνο όταν ο χρόνος επεξεργασίας είναι λιγότερο σημαντικός. Οι χαμηλότερες χρεώσεις καθιστούν δύσκολη την πρόβλεψη πότε (ή αν) η συναλλαγή σας θα είναι επιτυχής." + }, + "editGasEducationMediumExplanation": { + "message": "Ένα μέσο τέλος συναλλαγής είναι καλό για την αποστολή, την ανάληψη ή άλλες συναλλαγές που δεν είναι χρονικά ευαίσθητες. Αυτή η ρύθμιση θα οδηγήσει πιο συχνά σε μια επιτυχημένη συναλλαγή." + }, + "editGasEducationModalIntro": { + "message": "Η επιλογή του σωστού τέλους συναλλαγής εξαρτάται από το είδος της συναλλαγής και πόσο σημαντικό είναι για εσάς." + }, + "editGasEducationModalTitle": { + "message": "Πώς να επιλέξετε;" + }, + "editGasFeeModalTitle": { + "message": "Επεξεργασία τέλους συναλλαγής" + }, + "editGasHigh": { + "message": "Υψηλό" + }, + "editGasLimitOutOfBounds": { + "message": "Το όριο τελών συναλλαγής πρέπει να είναι τουλάχιστον $1" + }, + "editGasLimitOutOfBoundsV2": { + "message": "Το όριο τελών συναλλαγής πρέπει να είναι μεγαλύτερο από $1 και μικρότερο από $2", + "description": "$1 is the minimum limit for gas and $2 is the maximum limit" + }, + "editGasLimitTooltip": { + "message": "Το τελών συναλλαγής είναι οι μέγιστες μονάδες τελών συναλλαγής που είστε πρόθυμοι να χρησιμοποιήσετε. Τα τέλη συναλλαγής είναι ένας πολλαπλασιαστής στο \"Μέγιστο τέλος προτεραιότητας\" και το \"Μέγιστο τέλος\"." + }, + "editGasLow": { + "message": "Χαμηλό" + }, + "editGasMaxBaseFeeGWEIImbalance": { + "message": "Η μέγιστη βασική χρέωση δεν μπορεί να είναι χαμηλότερη από το τέλος προτεραιότητας" + }, + "editGasMaxBaseFeeHigh": { + "message": "Η μέγιστη χρέωση βάσης είναι υψηλότερη από το απαραίτητο" + }, + "editGasMaxBaseFeeLow": { + "message": "Η μέγιστη βασική χρέωση τέλους είναι χαμηλή για τις τρέχουσες συνθήκες δικτύου" + }, + "editGasMaxFeeHigh": { + "message": "Η μέγιστη χρέωση είναι υψηλότερη από το απαραίτητο" + }, + "editGasMaxFeeLow": { + "message": "Πολύ χαμηλή χρέωση για τις συνθήκες δικτύου" + }, + "editGasMaxFeePriorityImbalance": { + "message": "Η μέγιστη βασική χρέωση δεν μπορεί να είναι χαμηλότερη από το μέγιστο τέλος προτεραιότητας" + }, + "editGasMaxFeeTooltip": { + "message": "Το μέγιστο τέλος είναι το περισσότερο που θα πληρώσετε (βασικό τέλος + τέλος προτεραιότητας)." + }, + "editGasMaxPriorityFeeBelowMinimum": { + "message": "Το μέγιστο τέλος προτεραιότητας πρέπει να είναι μεγαλύτερο από 0 GWEI" + }, + "editGasMaxPriorityFeeBelowMinimumV2": { + "message": "Το τέλος προτεραιότητας πρέπει να είναι μεγαλύτερο από 0." + }, + "editGasMaxPriorityFeeHigh": { + "message": "Μέγιστο τέλος προτεραιότητας υψηλότερο από το αναγκαίο. Μπορείτε να πληρώσετε περισσότερα από ό,τι απαιτείται." + }, + "editGasMaxPriorityFeeHighV2": { + "message": "Το τέλος προτεραιότητας είναι υψηλότερο από το αναγκαίο. Μπορείτε να πληρώσετε περισσότερα από όσα χρειάζεται" + }, + "editGasMaxPriorityFeeLow": { + "message": "Το μέγιστο τέλος προτεραιότητας είναι χαμηλό για τις τρέχουσες συνθήκες δικτύου" + }, + "editGasMaxPriorityFeeLowV2": { + "message": "Το τέλος προτεραιότητας είναι χαμηλό για τις τρέχουσες συνθήκες δικτύου" + }, + "editGasMaxPriorityFeeTooltip": { + "message": "Το μέγιστο τέλος προτεραιότητας (γνωστό και ως “miner tip”) πηγαίνει άμεσα στους miner και τους ενθαρρύνει να δώσουν προτεραιότητα στη συναλλαγή σας. Συχνά θα πληρώνετε το μέγιστο που επιλέξατε" + }, + "editGasMedium": { + "message": "Μεσαίο" + }, + "editGasPriceTooLow": { + "message": "Η τιμή τέλους συναλλαγής πρέπει να είναι μεγαλύτερη από 0" + }, + "editGasPriceTooltip": { + "message": "Αυτό το δίκτυο απαιτεί ένα πεδίο \"Τέλος συναλλαγής\" κατά την υποβολή μιας συναλλαγής. Η τιμή τέλους συναλλαγής είναι το ποσό που θα πληρώσετε ανά μονάδα τέλους συναλλαγής." + }, + "editGasSubTextAmountLabel": { + "message": "Μέγιστο ποσό:", + "description": "This is meant to be used as the $1 substitution editGasSubTextAmount" + }, + "editGasSubTextFeeLabel": { + "message": "Μέγιστη χρέωση:" + }, + "editGasTitle": { + "message": "Επεξεργασία προτεραιότητας" + }, + "editGasTooLow": { + "message": "Άγνωστος χρόνος επεξεργασίας" + }, + "editGasTooLowTooltip": { + "message": "Η μέγιστη χρέωση ή το μέγιστο τέλος προτεραιότητας μπορεί να είναι χαμηλά για τις τρέχουσες συνθήκες της αγοράς. Δεν γνωρίζουμε πότε (ή εάν) η συναλλαγή σας θα επεξεργαστεί. " + }, + "editGasTooLowWarningTooltip": { + "message": "Αυτό μειώνει τη μέγιστη χρέωση αλλά αν η κίνηση δικτύου αυξήσει την συναλλαγή σας μπορεί να καθυστερήσει ή να αποτύχει." + }, + "editNonceField": { + "message": "Επεξεργασία Nonce" + }, + "editNonceMessage": { + "message": "Αυτό είναι ένα προηγμένο χαρακτηριστικό, χρησιμοποιήστε προσεκτικά." + }, + "editPermission": { + "message": "Επεξεργαστείτε τα Δικαιώματα" + }, + "enableAutoDetect": { + "message": " Ενεργοποίηση Αυτόματου Εντοπισμού" + }, + "enableFromSettings": { + "message": " Ενεργοποίηση του από τις Ρυθμίσεις." + }, + "enableOpenSeaAPI": { + "message": "Ενεργοποίηση OpenSea API" + }, + "enableOpenSeaAPIDescription": { + "message": "Χρήσιμοποιείστε το API OpenSea για λήψη δεδομένων NFT. Η αυτόματη ανίχνευση NFT βασίζεται στο API του OpenSea, και δεν θα είναι διαθέσιμη όταν αυτό είναι απενεργοποιημένο." + }, + "enableToken": { + "message": "ενεργοποίηση $1", + "description": "$1 is a token symbol, e.g. ETH" + }, + "encryptionPublicKeyNotice": { + "message": "Το $1 θα ήθελε το δημόσιο σας κλειδί κρυπτογράφησης. Με τη συγκατάθεσή σας, αυτός ο ιστότοπος θα είναι σε θέση να σας συνθέσει κρυπτογραφημένα μηνύματα.", + "description": "$1 is the web3 site name" + }, + "encryptionPublicKeyRequest": { + "message": "Αίτηση δημόσιου κλειδιού κρυπτογράφησης" + }, "endOfFlowMessage1": { "message": "Περάσατε τη δοκιμή - κρατήστε τη φράση φύτρου σας ασφαλή, είναι δική σας ευθύνη!" }, @@ -334,48 +956,141 @@ "endOfFlowMessage6": { "message": "Αν χρειάζεται να δημιουργήσετε ξανά αντίγραφο της φράσης επαναφοράς σας, μπορείτε να την βρείτε στη Ρυθμίσεις -> Ασφάλεια." }, + "endOfFlowMessage7": { + "message": "Αν έχετε ποτέ ερωτήσεις ή δείτε κάτι ύποπτο, επικοινωνήστε με την υποστήριξή μας $1.", + "description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." + }, "endOfFlowMessage8": { "message": "Το MetaMask δεν μπορεί να ανακτήσει τη φράση φύτρου σας. Μάθετε περισσότερα." }, "endOfFlowMessage9": { "message": "Μάθετε περισσότερα." }, + "endpointReturnedDifferentChainId": { + "message": "Το τελικό σημείο επέστρεψε ένα διαφορετικό αναγνωριστικό αλυσίδας: $1", + "description": "$1 is the return value of eth_chainId from an RPC endpoint" + }, + "ensIllegalCharacter": { + "message": "Μη έγκυρος χαρακτήρας για το ENS." + }, "ensNotFoundOnCurrentNetwork": { "message": "Το όνομα ENS δεν βρέθηκε στο τρέχον δίκτυο. Δοκιμάστε να μεταβείτε στο Κύριο Δίκτυο Ethereum." }, + "ensNotSupportedOnNetwork": { + "message": "Το δίκτυο δεν υποστηρίζει ENS" + }, "ensRegistrationError": { "message": "Σφάλμα στην καταχώριση ονόματος ENS" }, + "ensUnknownError": { + "message": "Η αναζήτηση ENS απέτυχε." + }, "enterAnAlias": { "message": "Δώστε ένα ψευδώνυμο" }, + "enterMaxSpendLimit": { + "message": "Εισάγετε Το Μέγιστο Όριο Δαπάνης" + }, "enterPassword": { "message": "Εισάγετε τον κωδικό πρόσβασης" }, "enterPasswordContinue": { "message": "Πληκτρολογήστε τον κωδικό πρόσβασης για να συνεχίσετε" }, + "errorCode": { + "message": "Κωδικός: $1", + "description": "Displayed error code for debugging purposes. $1 is the error code" + }, + "errorDetails": { + "message": "Λεπτομέρειες Σφάλματος", + "description": "Title for collapsible section that displays error details for debugging purposes" + }, + "errorMessage": { + "message": "Μήνυμα: $1", + "description": "Displayed error message for debugging purposes. $1 is the error message" + }, + "errorName": { + "message": "Κωδικός: $1", + "description": "Displayed error name for debugging purposes. $1 is the error name" + }, + "errorPageMessage": { + "message": "Δοκιμάστε ξανά φορτώνοντας τη σελίδα, ή επικοινωνήστε με την υποστήριξη $1.", + "description": "Message displayed on generic error page in the fullscreen or notification UI, $1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." + }, + "errorPagePopupMessage": { + "message": "Δοκιμάστε ξανά κλείνοντας και ανοίγοντας ξανά το αναδυόμενο παράθυρο ή επικοινωνήστε με την υποστήριξη $1.", + "description": "Message displayed on generic error page in the popup UI, $1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." + }, + "errorPageTitle": { + "message": "Το MetaMask αντιμετώπισε ένα σφάλμα", + "description": "Title of generic error page" + }, + "errorStack": { + "message": "Στοίβα:", + "description": "Title for error stack, which is displayed for debugging purposes" + }, "estimatedProcessingTimes": { "message": "Εκτιμώμενοι Χρόνοι Επεξεργασίας" }, + "ethGasPriceFetchWarning": { + "message": "Το εφεδρικό τέλος συναλλαγής που παρέχεται ως η κύρια υπηρεσία εκτίμησης τελών συναλλαγής, δεν είναι διαθέσιμο αυτή τη στιγμή." + }, + "eth_accounts": { + "message": "Βλέπε διεύθυνση, υπόλοιπο λογαριασμού, δραστηριότητα και έναρξη συναλλαγών", + "description": "The description for the `eth_accounts` permission" + }, "ethereumPublicAddress": { "message": "Δημόσια Διεύθυνση Ethereum" }, + "etherscan": { + "message": "Etherscan" + }, "etherscanView": { "message": "Προβολή λογαριασμού στο Etherscan" }, + "etherscanViewOn": { + "message": "Προβολή στην Etherscan" + }, "expandView": { "message": "Ανάπτυξη Προβολής" }, + "experimental": { + "message": "Πειραματικό" + }, + "experimentalSettingsDescription": { + "message": "Εντοπισμός token & περισσότερα" + }, "exportPrivateKey": { "message": "Εξαγωγή Ιδιωτικού Κλειδιού" }, + "externalExtension": { + "message": "Εξωτερική Επέκταση" + }, + "extraApprovalGas": { + "message": "+$1 τέλος συναλλαγής", + "description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas" + }, "failed": { "message": "Απέτυχε" }, + "failedToFetchChainId": { + "message": "Αδύνατη η λήψη του αναγνωριστικού αλυσίδας. Είναι το URL του RPC σας σωστό;" + }, + "failureMessage": { + "message": "Κάτι πήγε λάθος και δεν μπορέσαμε να ολοκληρώσουμε την ενέργεια" + }, + "fakeTokenWarning": { + "message": "Οποιοσδήποτε μπορεί να δημιουργήσει ένα token, συμπεριλαμβανομένης της δημιουργίας ψεύτικων εκδόσεων των υφιστάμενων tokens. Μάθετε περισσότερά γι'αυτό $1" + }, "fast": { "message": "Γρήγορα" }, + "fastest": { + "message": "Ταχύτερη" + }, + "feeAssociatedRequest": { + "message": "Ένα τέλος σχετίζεται με αυτό το αίτημα." + }, "fiat": { "message": "Εντολή", "description": "Exchange type" @@ -384,15 +1099,53 @@ "message": "Η εισαγωγή αρχείων δεν λειτουργεί; Κάντε κλικ εδώ!", "description": "Helps user import their account from a JSON file" }, + "flaskSnapSettingsCardButtonCta": { + "message": "Προβολή λεπτομερειών", + "description": "Call to action a user can take to see more information about the Snap that is installed" + }, + "flaskSnapSettingsCardDateAddedOn": { + "message": "Προστέθηκε στις", + "description": "Start of the sentence describing when and where snap was added" + }, + "flaskSnapSettingsCardFrom": { + "message": "από", + "description": "Part of the sentence describing when and where snap was added" + }, + "followUsOnTwitter": { + "message": "Ακολουθήστε μας στο Twitter" + }, + "forbiddenIpfsGateway": { + "message": "Απαγορευμένη πύλη IPFS: Παρακαλώ καθορίστε μια πύλη CID" + }, "forgetDevice": { "message": "Διαγραφή αυτής της συσκευής" }, "from": { "message": "Από " }, + "fromAddress": { + "message": "Από: $1", + "description": "$1 is the address to include in the From label. It is typically shortened first using shortenAddress" + }, + "functionApprove": { + "message": "Λειτουργία: Έγκριση" + }, "functionType": { "message": "Τύπος Λειτουργίας" }, + "gas": { + "message": "Τέλος συναλλαγής" + }, + "gasDisplayAcknowledgeDappButtonText": { + "message": "Επεξεργασία προτεινόμενου τέλους συναλλαγής" + }, + "gasDisplayDappWarning": { + "message": "Αυτό το τέλος συναλλαγής έχει προταθεί από το $1. Η παράκαμψη μπορεί να προκαλέσει πρόβλημα με τη συναλλαγή σας. Εάν έχετε απορίες, επικοινωνήστε με $1.", + "description": "$1 represents the Dapp's origin" + }, + "gasEstimatesUnavailableWarning": { + "message": "Οι χαμηλές, μεσαίες και υψηλές εκτιμήσεις μας δεν είναι διαθέσιμες." + }, "gasLimit": { "message": "Όριο Καυσίμου" }, @@ -402,18 +1155,77 @@ "gasLimitTooLow": { "message": "Το όριο αερίου πρέπει να είναι τουλάχιστον 21000" }, + "gasLimitTooLowWithDynamicFee": { + "message": "Το όριο τέλους συναλλαγής πρέπει να είναι τουλάχιστον $1", + "description": "$1 is the custom gas limit, in decimal." + }, + "gasLimitV2": { + "message": "Όριο τέλους συναλλαγής" + }, + "gasOption": { + "message": "Επιλογή τέλους συναλλαγής" + }, "gasPrice": { "message": "Τιμή Αερίου (GWEI)" }, + "gasPriceExcessive": { + "message": "Το ποσό του τέλους συναλλαγής σας ορίστηκε άσκοπα υψηλό. Εξετάστε τη μείωση του ποσού." + }, + "gasPriceExcessiveInput": { + "message": "Η Τιμή του Τέλους Συναλλαγής Είναι Υπερβολική" + }, "gasPriceExtremelyLow": { "message": "Τιμή Καυσίμου Εξαιρετικά Χαμηλή" }, + "gasPriceFetchFailed": { + "message": "Η εκτίμηση της τιμής του τέλους συναλλαγής απέτυχε λόγω σφάλματος δικτύου." + }, "gasPriceInfoTooltipContent": { "message": "Η τιμή καυσίμου καθορίζει το ποσό των Ether που είστε διατεθειμένοι να πληρώσετε για κάθε μονάδα καυσίμου." }, + "gasTimingHoursShort": { + "message": "$1 ώρες", + "description": "$1 represents a number of hours" + }, + "gasTimingMinutes": { + "message": "$1 λεπτά", + "description": "$1 represents a number of minutes" + }, + "gasTimingMinutesShort": { + "message": "$1 λεπτά", + "description": "$1 represents a number of minutes" + }, + "gasTimingNegative": { + "message": "Ίσως σε $1", + "description": "$1 represents an amount of time" + }, + "gasTimingPositive": { + "message": "Πιθανό σε < $1", + "description": "$1 represents an amount of time" + }, + "gasTimingSeconds": { + "message": "$1 δευτερόλεπτα", + "description": "$1 represents a number of seconds" + }, + "gasTimingSecondsShort": { + "message": "$1 δευτ.", + "description": "$1 represents a number of seconds" + }, + "gasTimingVeryPositive": { + "message": "Πολύ πιθανό σε < $1", + "description": "$1 represents an amount of time" + }, "gasUsed": { "message": "Καύσιμο που Χρησιμοποιήθηκε" }, + "gdprMessage": { + "message": "Τα δεδομένα αυτά συγκεντρωτικά και, ως εκ τούτου, είναι ανώνυμα για τους σκοπούς του Γενικού Κανονισμού για την Προστασία Δεδομένων GDPR (ΕΕ) 2016/679. Για περισσότερες πληροφορίες σχετικά με τις πρακτικές απορρήτου μας, ανατρέξτε στο $1.", + "description": "$1 refers to the gdprMessagePrivacyPolicy message, the translation of which is meant to be used exclusively in the context of gdprMessage" + }, + "gdprMessagePrivacyPolicy": { + "message": "Πολιτική Απορρήτου εδώ", + "description": "this translation is intended to be exclusively used as the replacement for the $1 in the gdprMessage translation" + }, "general": { "message": "Γενικά" }, @@ -430,9 +1242,15 @@ "getStarted": { "message": "Έναρξη" }, + "goBack": { + "message": "Μετάβαση Πίσω" + }, "goerli": { "message": "Δοκιμαστικό Δίκτυο Goerli" }, + "grantedToWithColon": { + "message": "Χορηγήθηκε στο:" + }, "happyToSeeYou": { "message": "Χαιρόμαστε που σας βλέπουμε." }, @@ -442,6 +1260,13 @@ "hardwareWalletConnected": { "message": "Συνδέθηκε το πορτοφόλι υλικού" }, + "hardwareWalletLegacyDescription": { + "message": "(παλαιό)", + "description": "Text representing the MEW path" + }, + "hardwareWalletSupportLinkConversion": { + "message": "κάντε κλικ εδώ" + }, "hardwareWallets": { "message": "Συνδέστε ένα πορτοφόλι εξοπλισμού" }, @@ -461,9 +1286,32 @@ "hideTokenPrompt": { "message": "Απόκρυψη του Token;" }, + "hideTokenSymbol": { + "message": "Απόκρυψη $1", + "description": "$1 is the symbol for a token (e.g. 'DAI')" + }, + "hideZeroBalanceTokens": { + "message": "Απόκρυψη Tokens Χωρίς Υπόλοιπο" + }, + "high": { + "message": "Επιθετική" + }, + "highGasSettingToolTipDialog": { + "message": "Υψηλή πιθανότητα, ακόμη και σε ευμετάβλητες αγορές" + }, + "highGasSettingToolTipMessage": { + "message": "Χρησιμοποιήστε $1 για να καλύψετε απότομες αυξήσεις της κίνησης του δικτύου λόγω των δημοφιλών ξεκινημάτων NFT.", + "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" + }, + "highLowercase": { + "message": "υψηλό" + }, "history": { "message": "Ιστορικό" }, + "id": { + "message": "Αναγνωριστικό" + }, "import": { "message": "Εισαγωγή", "description": "Button to import an account from a selected file" @@ -471,19 +1319,61 @@ "importAccount": { "message": "Εισαγωγή Λογαριασμού" }, + "importAccountError": { + "message": "Σφάλμα εισαγωγής λογαριασμού." + }, + "importAccountLinkText": { + "message": "εισαγωγή χρησιμοποιώντας τη Μυστική Φράση Ανάκτησης" + }, "importAccountMsg": { "message": "Οι λογαριασμοί που εισάγονται δεν θα συσχετιστούν με τη φάση σπόρου του λογαριασμού σας MetaTask που δημιουργήθηκε αρχικά. Μάθετε περισσότερα για τους εισηγμένους λογαριασμούς" }, "importAccountSeedPhrase": { "message": "Εισαγωγή λογαριασμού με Φράση Φύτρου" }, + "importAccountText": { + "message": "ή $1", + "description": "$1 represents the text from `importAccountLinkText` as a link" + }, + "importExistingWalletDescription": { + "message": "Εισάγετε τη Μυστική Φράση Ανάκτησης (δλδ Seed Phrase) που σας δόθηκε όταν δημιουργήσατε το πορτοφόλι σας. $1", + "description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link" + }, + "importExistingWalletTitle": { + "message": "Εισαγωγή υπάρχοντος πορτοφολιού με Μυστική Φράση Ανάκτησης" + }, + "importMyWallet": { + "message": "Εισαγωγή Πορτοφολιού μου" + }, + "importNFTs": { + "message": "Εισαγωγή NFT" + }, + "importTokenQuestion": { + "message": "Εισαγωγή token;" + }, + "importTokenWarning": { + "message": "Ο καθένας μπορεί να δημιουργήσει ένα token με οποιοδήποτε όνομα, συμπεριλαμβανομένων ψεύτικων εκδόσεων των υφιστάμενων νομισμάτων. Προσθέστε και ανταλλάξτε με δική σας ευθύνη!" + }, + "importTokens": { + "message": "εισαγωγή token" + }, + "importTokensCamelCase": { + "message": "Εισαγωγή Token" + }, "importWallet": { "message": "Εισαγωγή Πορτοφολιού" }, + "importYourExisting": { + "message": "Εισαγωγή υπάρχοντος πορτοφολιού με Μυστική Φράση Ανάκτησης" + }, "imported": { "message": "Έγινε εισαγωγή", "description": "status showing that an account has been fully loaded into the keyring" }, + "infuraBlockedNotification": { + "message": "Το MetaMask δεν μπορεί να συνδεθεί με τον blockchain host. Ανασκόπηση πιθανών λόγων $1.", + "description": "$1 is a clickable link with with text defined by the 'here' key" + }, "initialTransactionConfirmed": { "message": "Η αρχική σας συναλλαγή επιβεβαιώθηκε από το δίκτυο. Πατήστε ΕΝΤΑΞΕΙ για επιστροφή." }, @@ -493,6 +1383,9 @@ "insufficientFunds": { "message": "Ανεπαρκείς πόροι." }, + "insufficientFundsForGas": { + "message": "Ανεπαρκή κεφάλαια για το τέλος συναλλαγής" + }, "insufficientTokens": { "message": "Ανεπαρκή tokens." }, @@ -508,34 +1401,151 @@ "invalidBlockExplorerURL": { "message": "Μη έγκυρο Block Explorer URL" }, + "invalidChainIdTooBig": { + "message": "Μη έγκυρο αναγνωριστικό αλυσίδας. Το αναγνωριστικό αλυσίδας είναι πολύ μεγάλο." + }, + "invalidCustomNetworkAlertContent1": { + "message": "Το αναγνωριστικό αλυσίδας για το προσαρμοσμένο δίκτυο '$1' πρέπει να εισαχθεί εκ νέου.", + "description": "$1 is the name/identifier of the network." + }, + "invalidCustomNetworkAlertContent2": { + "message": "Για να σας προστατεύσει από κακόβουλους ή ελαττωματικούς παρόχους δικτύου, τα αναγνωριστικά αλυσίδας είναι πλέον απαραίτητα για όλα τα προσαρμοσμένα δίκτυα." + }, + "invalidCustomNetworkAlertContent3": { + "message": "Μεταβείτε στις Ρυθμίσεις > Δίκτυο και εισαγάγετε το αναγνωριστικό αλυσίδας. Μπορείτε να βρείτε τα αναγνωριστικά αλυσίδας των πιο δημοφιλών δικτύων στο $1.", + "description": "$1 is a link to https://chainid.network" + }, + "invalidCustomNetworkAlertTitle": { + "message": "Μη Έγκυρο Προσαρμοσμένο Δίκτυο" + }, + "invalidHexNumber": { + "message": "Μη έγκυρος δεκαεξαδικός αριθμός." + }, + "invalidHexNumberLeadingZeros": { + "message": "Μη έγκυρος δεκαεξαδικός αριθμός. Αφαιρέστε τα αρχικά μηδενικά." + }, + "invalidIpfsGateway": { + "message": "Μη έγκυρη πύλη IPFS: Η τιμή πρέπει να είναι μια έγκυρη διεύθυνση URL" + }, + "invalidNumber": { + "message": "Μη έγκυρος αριθμός. Εισάγετε έναν δεκαδικό ή προκαθορισμένο δεκαεξαδικό αριθμό '0x'." + }, + "invalidNumberLeadingZeros": { + "message": "Μη έγκυρος δεκαεξαδικός αριθμός. Αφαιρέστε τα αρχικά μηδενικά." + }, "invalidRPC": { "message": "Μη έγκυρο RPC URL" }, "invalidSeedPhrase": { "message": "Μη έγκυρη φράση φύτρου" }, + "ipfsGateway": { + "message": "Πύλη IPFS" + }, + "ipfsGatewayDescription": { + "message": "Εισάγετε τη διεύθυνση URL της πύλης IPFS CID που θα χρησιμοποιηθεί για την ανάλυση περιεχομένου ENS." + }, + "jsDeliver": { + "message": "jsDeliver" + }, "jsonFile": { "message": "Αρχείο JSON", "description": "format for importing an account" }, + "keystone": { + "message": "Keystone" + }, + "keystoneTutorial": { + "message": " (Εκμάθηση)" + }, "knownAddressRecipient": { "message": "Γνωστή διεύθυνση συμβολαίου." }, + "knownTokenWarning": { + "message": "Αυτή η ενέργεια θα επεξεργαστεί tokens που είναι ήδη εισηγμένα στο πορτοφόλι σας, τα οποίαο μπορεί να χρησιμοποιηθούν για να σας κλέψουν στοιχεία. Αποδεχθείτε μόνο αν είστε σίγουροι ότι θέλετε να αλλάξετε αυτό που αντιπροσωπεύουν αυτά τα νομίσματα." + }, "kovan": { "message": "Δίκτυο Δοκιμής Kovan" }, + "lastConnected": { + "message": "Τελευταία Σύνδεση" + }, + "layer1Fees": { + "message": "Τέλη επιπέδου 1" + }, + "learmMoreAboutGas": { + "message": "Θέλετε να $1 για το τέλος συναλλαγής;" + }, + "learnCancelSpeeedup": { + "message": "Μάθετε πώς να $1", + "description": "$1 is link to cancel or speed up transactions" + }, "learnMore": { "message": "Μάθε περισσότερα" }, + "learnMoreUpperCase": { + "message": "Μάθε περισσότερα" + }, + "learnScamRisk": { + "message": "απάτες και κίνδυνοι ασφάλειας." + }, "ledgerAccountRestriction": { "message": "Πρέπει να χρησιμοποιήσετε τον τελευταίο σας λογαριασμό πριν προσθέσετε έναν νέο." }, + "ledgerConnectionInstructionCloseOtherApps": { + "message": "Κλείστε οποιοδήποτε άλλο λογισμικό συνδέεται με τη συσκευή σας και, στη συνέχεια, κάντε κλικ εδώ για να ανανεώσετε." + }, + "ledgerConnectionInstructionHeader": { + "message": "Πριν κάνετε κλικ στην επιβεβαίωση:" + }, + "ledgerConnectionInstructionStepFour": { + "message": "Ενεργοποιήστε τα \"έξυπνα δεδομένα συμβολαίου\" ή \"τυφλή υπογραφή\" στη συσκευή σας Ledger" + }, + "ledgerConnectionInstructionStepOne": { + "message": "Ενεργοποίηση χρήσης Ledger Live κάτω από τις Ρυθμίσεις > Για προχωρημένους" + }, + "ledgerConnectionInstructionStepThree": { + "message": "Συνδέστε τη συσκευή Ledger και επιλέξτε την εφαρμογή Ethereum" + }, + "ledgerConnectionInstructionStepTwo": { + "message": "Άνοιγμα και ξεκλείδωμα εφαρμογής Ledger Live" + }, + "ledgerConnectionPreferenceDescription": { + "message": "Προσαρμόστε το πώς μπορείτε να συνδέσετε Ledger σας με το MetaMask. Το $1 συνιστάται, αλλά και άλλες επιλογές είναι διαθέσιμες. Διαβάστε περισσότερα εδώ: $2", + "description": "A description that appears above a dropdown where users can select between up to three options - Ledger Live, U2F or WebHID - depending on what is supported in their browser. $1 is the recommended browser option, it will be either WebHID or U2f. $2 is a link to an article where users can learn more, but will be the translation of the learnMore message." + }, + "ledgerDeviceOpenFailureMessage": { + "message": "Η συσκευή Ledger απέτυχε να ανοίξει. Το Ledger μπορεί να είναι συνδεδεμένο σε άλλο λογισμικό. Παρακαλώ κλείστε το Ledger Live ή άλλες εφαρμογές συνδεδεμένες με τη συσκευή σας Ledger και προσπαθήστε να συνδεθείτε ξανά." + }, + "ledgerLive": { + "message": "Ledger Live", + "description": "The name of a desktop app that can be used with your ledger device. We can also use it to connect a users Ledger device to MetaMask." + }, + "ledgerLiveApp": { + "message": "Εφαρμογή Ledger Live" + }, + "ledgerLocked": { + "message": "Δεν είναι δυνατή η σύνδεση με τη συσκευή Ledger. Βεβαιωθείτε ότι η συσκευή σας είναι ξεκλειδωμένη και ότι η εφαρμογή Ethereum είναι ανοιχτή." + }, + "ledgerTimeout": { + "message": "Το Ledger Live καθυστερεί πάρα πολύ για να ανταποκριθεί ή τελείωσε το χρονικό όριο σύνδεσης. Βεβαιωθείτε ότι η εφαρμογή Ledger Live είναι ανοικτή και ότι η συσκευή σας είναι ξεκλειδωμένη." + }, + "ledgerTransportChangeWarning": { + "message": "Αν η εφαρμογή σας Ledger Live είναι ανοιχτή, παρακαλούμε αποσυνδέστε οποιαδήποτε ανοιχτή σύνδεση στο Ledger Live και κλείστε την εφαρμογή Ledger Live." + }, + "ledgerWebHIDNotConnectedErrorMessage": { + "message": "Η συσκευή ledger δεν συνδέθηκε. Αν θέλετε να συνδέσετε το Ledger, παρακαλώ κάντε κλικ στο 'Συνέχεια' ξανά και εγκρίνετε τη σύνδεση HID", + "description": "An error message shown to the user during the hardware connect flow." + }, "letsGoSetUp": { "message": "Ναι, ας το εγκαταστήσουμε!" }, "likeToImportTokens": { "message": "Θέλετε να προσθέσετε αυτά τα token;" }, + "link": { + "message": "Σύνδεσμος" + }, "links": { "message": "Σύνδεσμοι" }, @@ -554,12 +1564,51 @@ "lock": { "message": "Αποσύνδεση" }, + "lockTimeTooGreat": { + "message": "Ο χρόνος κλειδώματος είναι πολύ μεγάλος" + }, + "low": { + "message": "Χαμηλό" + }, + "lowGasSettingToolTipMessage": { + "message": "Χρησιμοποιήστε 1 $ για να περιμένετε για μια φθηνότερη τιμή. Οι εκτιμήσεις του χρόνου είναι πολύ λιγότερο ακριβείς καθώς οι τιμές είναι κάπως απρόβλεπτες.", + "description": "$1 is key 'low' separated here so that it can be passed in with bold fontweight" + }, + "lowLowercase": { + "message": "χαμηλό" + }, + "lowPriorityMessage": { + "message": "Οι μελλοντικές συναλλαγές θα περιμένουν σε αναμονή μετά από αυτή. Αυτή ήταν η τελευταία τιμή που είδαμε." + }, "mainnet": { "message": "Κύριο Δίκτυο Ethereum" }, + "makeAnotherSwap": { + "message": "Δημιουργία νέας ανταλλαγής" + }, + "makeSureNoOneWatching": { + "message": "Βεβαιωθείτε ότι κανείς δεν παρακολουθεί την οθόνη σας", + "description": "Warning to users to be care while creating and saving their new Secret Recovery Phrase" + }, "max": { "message": "Μέγ." }, + "maxBaseFee": { + "message": "Μέγιστο βασικό τέλος" + }, + "maxFee": { + "message": "Μέγιστη χρέωση" + }, + "maxPriorityFee": { + "message": "Μέγιστο τέλος προτεραιότητας" + }, + "medium": { + "message": "Αγορά" + }, + "mediumGasSettingToolTipMessage": { + "message": "Χρησιμοποιήστε $1 για γρήγορη επεξεργασία στην τρέχουσα τιμή της αγοράς.", + "description": "$1 is key 'medium' (text: 'Market') separated here so that it can be passed in with bold fontweight" + }, "memo": { "message": "σημείωμα" }, @@ -569,21 +1618,115 @@ "message": { "message": "Μήνυμα" }, + "metaMaskConnectStatusParagraphOne": { + "message": "Τώρα έχετε περισσότερο έλεγχο των συνδέσεων του λογαριασμού σας στο MetaMask." + }, + "metaMaskConnectStatusParagraphThree": { + "message": "Κάντε κλικ για να διαχειριστείτε τους συνδεδεμένους λογαριασμούς σας." + }, + "metaMaskConnectStatusParagraphTwo": { + "message": "Το κουμπί κατάστασης σύνδεσης εμφανίζει αν η ιστοσελίδα που επισκέπτεστε είναι συνδεδεμένη με τον τρέχοντα επιλεγμένο λογαριασμό σας." + }, "metamaskDescription": { "message": "Σύνδεση με το Ethereum και τον Αποκεντρωμένο Ιστό." }, + "metamaskSwapsOfflineDescription": { + "message": "Συντήρηση των ανταλλαγών MetaMask. Παρακαλούμε ελέγξτε αργότερα." + }, "metamaskVersion": { "message": "Έκδοση MetaMask " }, + "metametricsCommitmentsAllowOptOut": { + "message": "Σας επιτρέπεται πάντα να εξαιρεθείτε μέσω των Ρυθμίσεων" + }, + "metametricsCommitmentsAllowOptOut2": { + "message": "Πάντα μπορείτε να εξαιρεθείτε μέσω των Ρυθμίσεων" + }, + "metametricsCommitmentsBoldNever": { + "message": "Ποτέ δεν", + "description": "This string is localized separately from some of the commitments so that we can bold it" + }, + "metametricsCommitmentsIntro": { + "message": "Το MetaMask.." + }, + "metametricsCommitmentsNeverCollect": { + "message": "Ποτέ δεν θα συλλέγει κλειδιά, διευθύνσεις, συναλλαγές, υπόλοιπα, συναρτήσεις κατατεμαχισμού ή οποιαδήποτε προσωπικά στοιχεία" + }, + "metametricsCommitmentsNeverCollectIP": { + "message": "$1 συλλέγει την πλήρη διεύθυνση IP σας", + "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" + }, + "metametricsCommitmentsNeverCollectKeysEtc": { + "message": "$ συλλέγει κλειδιά, διευθύνσεις, συναλλαγές, υπόλοιπα, συναρτήσεις κατατεμαχισμού ή οποιαδήποτε προσωπικά στοιχεία", + "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" + }, + "metametricsCommitmentsNeverIP": { + "message": "Ποτέ δεν συλλέγεi την πλήρη IP διεύθυνσή σας" + }, + "metametricsCommitmentsNeverSell": { + "message": "Ποτέ δεν πουλά δεδομένα για κέρδος. Ποτέ!" + }, + "metametricsCommitmentsNeverSellDataForProfit": { + "message": "$1 πουλά δεδομένα για το κέρδος. Ποτέ!", + "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" + }, + "metametricsCommitmentsSendAnonymizedEvents": { + "message": "Στείλτε ανώνυμα γεγονότα κλικ και προβολής ιστοσελίδων" + }, + "metametricsHelpImproveMetaMask": { + "message": "Βοηθήστε μας να βελτιώσουμε το MetaMask" + }, + "metametricsOptInDescription": { + "message": "Το MetaMask θα ήθελε να συγκεντρώσει δεδομένα χρήσης για να κατανοήσει καλύτερα πώς οι χρήστες μας αλληλεπιδρούν με την επέκταση. Τα δεδομένα αυτά θα χρησιμοποιηθούν για τη συνεχή βελτίωση της χρηστικότητας και της εμπειρίας χρήσης του προϊόντος μας και του οικοσυστήματος Ethereum." + }, + "metametricsOptInDescription2": { + "message": "Θα θέλαμε να συγκεντρώσουμε βασικά δεδομένα χρήσης για τη βελτίωση της χρηστικότητας του προϊόντος μας. Αυτές οι μετρήσεις θα..." + }, + "metametricsTitle": { + "message": "Συμμετάσχετε σε 6εκ+ χρήστες για να βελτιώσετε το MetaMask" + }, + "mismatchedChain": { + "message": "Οι λεπτομέρειες δικτύου για αυτό το αναγνωριστικό αλυσίδας δεν ταιριάζουν με τις εγγραφές μας. Σας συνιστούμε να $1 πριν συνεχίσετε.", + "description": "$1 is a clickable link with text defined by the 'mismatchedChainLinkText' key" + }, + "mismatchedChainLinkText": { + "message": "επαληθεύστε τα στοιχεία δικτύου", + "description": "Serves as link text for the 'mismatchedChain' key. This text will be embedded inside the translation for that key." + }, + "missingNFT": { + "message": "Δεν βλέπετε το NFT σας;" + }, + "missingToken": { + "message": "Δεν βλέπετε το token σας;" + }, + "mobileSyncWarning": { + "message": "Η λειτουργία 'Συγχρονισμός με επέκταση' είναι προσωρινά απενεργοποιημένη. Αν θέλετε να χρησιμοποιήσετε το πορτοφόλι της επέκτασής σας στο MetaMask mobile, τότε στην εφαρμογή για το κινητό σας: επιστρέψτε στις επιλογές εγκατάστασης του πορτοφολιού και επιλέξτε την επιλογή 'Εισαγωγή με Μυστική Φράση Ανάκτησης'. Χρησιμοποιήστε τη μυστική φράση του πορτοφολιού της επέκτασής σας για να εισαγάγετε το πορτοφόλι σας στο κινητό." + }, "mustSelectOne": { "message": "Πρέπει να επιλέξετε 1 τουλάχιστον διακριτικό." }, "myAccounts": { "message": "Οι Λογαριασμοί μου" }, + "name": { + "message": "Όνομα" + }, "needEtherInWallet": { "message": "Για να αλληλεπιδράσετε με αποκεντρωμένες εφαρμογές χρησιμοποιώντας το MetaMask, θα χρειαστείτε Ether στο πορτοφόλι σας." }, + "needHelp": { + "message": "Χρειάζεστε βοήθεια? Επικοινωνήστε με $1", + "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" + }, + "needHelpFeedback": { + "message": "Μοιραστείτε τα σχόλιά σας" + }, + "needHelpLinkText": { + "message": "Υποστήριξη MetaMask" + }, + "needHelpSubmitTicket": { + "message": "Υποβολή αιτήματος" + }, "needImportFile": { "message": "Πρέπει να επιλέξετε ένα αρχείο για εισαγωγή.", "description": "User is important an account and needs to add a file to continue" @@ -591,12 +1734,56 @@ "negativeETH": { "message": "Δεν μπορεί να γίνει αποστολή αρνητικών ποσών ETH." }, + "networkDetails": { + "message": "Λεπτομέρειες Δικτύου" + }, "networkName": { "message": "Ονομασία Δικτύου" }, + "networkNameBSC": { + "message": "BSC" + }, + "networkNameDefinition": { + "message": "Το όνομα που συνδέεται με αυτό το δίκτυο." + }, + "networkNameEthereum": { + "message": "Ethereum" + }, + "networkNamePolygon": { + "message": "Πολύγωνο" + }, + "networkNameRinkeby": { + "message": "Rinkeby" + }, + "networkNameTestnet": { + "message": "Testnet" + }, + "networkSettingsChainIdDescription": { + "message": "Το αναγνωριστικό αλυσίδας χρησιμοποιείται για την υπογραφή συναλλαγών. Πρέπει να ταιριάζει με το αναγνωριστικό αλυσίδας που επιστρέφεται από το δίκτυο. Μπορείτε να εισάγετε ένα δεκαδικό ή '0x'-προκαθορισμένο δεκαεξαδικό αριθμό, αλλά θα εμφανίσουμε τον αριθμό στο δεκαδικό σύστημα." + }, "networkSettingsDescription": { "message": "Προσθήκη και επεξεργασία προσαρμοσμένων δικτύων RPC" }, + "networkStatus": { + "message": "Κατάσταση δικτύου" + }, + "networkStatusBaseFeeTooltip": { + "message": "Η βασική χρέωση ορίζεται από το δίκτυο και αλλάζει κάθε 13-14 δευτερόλεπτα. Οι επιλογές μας $1 και $2 αντιπροσωπεύουν ξαφνικές αυξήσεις.", + "description": "$1 and $2 are bold text for Medium and Aggressive respectively." + }, + "networkStatusPriorityFeeTooltip": { + "message": "Εύρος των τελών προτεραιότητας (γνωστή και ως “Miner tip”). Αυτό πηγαίνει στους miners και τους ενθαρρύνει να δώσουν προτεραιότητα στη συναλλαγή σας." + }, + "networkStatusStabilityFeeTooltip": { + "message": "Τα τέλη συναλλαγών είναι $1 σε σχέση με τις τελευταίες 72 ώρες.", + "description": "$1 is networks stability value - stable, low, high" + }, + "networkURL": { + "message": "URL Δικτύου" + }, + "networkURLDefinition": { + "message": "Το URL που χρησιμοποιείται για την πρόσβαση σε αυτό το δίκτυο." + }, "networks": { "message": "Δίκτυα" }, @@ -613,12 +1800,27 @@ "message": "Λογαριασμός $1", "description": "Default name of next account to be created on create account screen" }, + "newCollectibleAddFailed": { + "message": "Το Collectible δεν προστέθηκε επειδή: $1" + }, + "newCollectibleAddedMessage": { + "message": "Το Collectible προστέθηκε με επιτυχία!" + }, "newContact": { "message": "Νέα Επαφή" }, "newContract": { "message": "Νέα Σύμβαση" }, + "newNFTsDetected": { + "message": "Νέο! Εντοπισμός NFT" + }, + "newNFTsDetectedInfo": { + "message": "Επιτρέψτε στο MetaMask να ανιχνεύει αυτόματα NFTs από το Opensea και να εμφανίζεται στο πορτοφόλι σας MetaMask." + }, + "newNetworkAdded": { + "message": "Το “$1” προστέθηκε με επιτυχία!" + }, "newPassword": { "message": "Νέος Κωδικός Πρόσβασης (ελάχιστο 8 χαρακτήρες)" }, @@ -631,18 +1833,46 @@ "newTransactionFee": { "message": "Τέλος Νέας Συναλλαγής" }, + "newValues": { + "message": "νέες τιμές" + }, "next": { "message": "Επόμενο" }, + "nextNonceWarning": { + "message": "Το Nonce είναι υψηλότερο από το προτεινόμενο nonce του $1", + "description": "The next nonce according to MetaMask's internal logic" + }, + "nftTokenIdPlaceholder": { + "message": "Εισάγετε το συλλεκτικό αναγνωριστικό" + }, + "nfts": { + "message": "NFT" + }, + "nickname": { + "message": "Ψευδώνυμο" + }, + "noAccountsFound": { + "message": "Δεν βρέθηκαν λογαριασμοί για το συγκεκριμένο ερώτημα αναζήτησης" + }, "noAddressForName": { "message": "Δεν έχει ορισθεί καμιά διεύθυνση γ' αυτό το όνομα." }, "noAlreadyHaveSeed": { "message": "Όχι, έχω ήδη μια φράση φύτρου" }, + "noConversionDateAvailable": { + "message": "Δεν Υπάρχει Διαθέσιμη Ημερομηνία Ισοτιμίας Μετατροπής Νομίσματος" + }, "noConversionRateAvailable": { "message": "Δεν Υπάρχει Διαθέσιμη Ισοτιμία Μετατροπής" }, + "noNFTs": { + "message": "Δεν υπάρχουν NFT ακόμα" + }, + "noThanks": { + "message": "Όχι Ευχαριστώ" + }, "noTransactions": { "message": "Δεν έχετε καμιά συναλλαγή" }, @@ -652,21 +1882,204 @@ "noWebcamFoundTitle": { "message": "Η διαδικτυακή κάμερα δεν βρέθηκε" }, + "nonce": { + "message": "Nonce" + }, + "nonceField": { + "message": "Προσαρμόστε τη συναλλαγή nonce" + }, + "nonceFieldDescription": { + "message": "Ενεργοποιήστε αυτήν την επιλογή για να αλλάξετε τον αριθμό Nonce (αριθμός συναλλαγής) στις οθόνες επιβεβαίωσης. Αυτή είναι μια προηγμένη λειτουργία, χρησιμοποιήστε προσεκτικά." + }, + "nonceFieldHeading": { + "message": "Προσαρμοσμένο Nonce" + }, + "notBusy": { + "message": "Όχι απασχολημένος" + }, + "notCurrentAccount": { + "message": "Είναι ο σωστός λογαριασμός? Είναι διαφορετικό από τον τρέχοντα επιλεγμένο λογαριασμό στο πορτοφόλι σας" + }, "notEnoughGas": { "message": "Δεν Υπάρχει Αρκετό Αέριο" }, + "notifications1Description": { + "message": "Οι χρήστες του MetaMask Mobile μπορούν τώρα να ανταλλάξουν tokens μέσα στο κινητό τους πορτοφόλι. Σαρώστε τον κωδικό QR για να πάρετε την εφαρμογή για κινητά και να αρχίσετε να ανταλλάζετε.", + "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." + }, + "notifications1Title": { + "message": "Η ανταλλαγή στο κινητό είναι εδώ!", + "description": "Title for a notification in the 'See What's New' popup. Tells users that they can now use MetaMask Swaps on Mobile." + }, + "notifications3ActionText": { + "message": "Μάθε περισσότερα", + "description": "The 'call to action' on the button, or link, of the 'Stay secure' notification. Upon clicking, users will be taken to a page about security on the metamask support website." + }, + "notifications3Description": { + "message": "Μείνετε ενημερωμένοι για τις βέλτιστες πρακτικές ασφάλειας MetaMask και λάβετε τις τελευταίες συμβουλές ασφαλείας από την επίσημη υποστήριξη MetaMask.", + "description": "Description of a notification in the 'See What's New' popup. Describes the information they can get on security from the linked support page." + }, + "notifications3Title": { + "message": "Μείνετε ασφαλείς", + "description": "Title for a notification in the 'See What's New' popup. Encourages users to consider security." + }, + "notifications4ActionText": { + "message": "Έναρξη ανταλλαγής", + "description": "The 'call to action' on the button, or link, of the 'Swap on Binance Smart Chain!' notification. Upon clicking, users will be taken to a page where then can swap tokens on Binance Smart Chain." + }, + "notifications4Description": { + "message": "Λάβετε τις καλύτερες τιμές για swaps token ακριβώς μέσα στο πορτοφόλι σας. Το MetaMask τώρα σας συνδέει με πολλαπλούς αποκεντρωμένα ανταλλακτήρια συναλλάγματος και επαγγελματίες διαμορφωτές της αγοράς για εξυπνη αλυσίδα Binance.", + "description": "Description of a notification in the 'See What's New' popup." + }, + "notifications4Title": { + "message": "Εναλλαγή σε έξυπνη αλυσίδα Binance", + "description": "Title for a notification in the 'See What's New' popup. Encourages users to do swaps on Binance Smart Chain." + }, + "notifications5Description": { + "message": "Η φράση \"Seed Phrase\" σας ονομάζεται τώρα \"Μυστική Φράση Επαναφοράς\"", + "description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update." + }, + "notifications6DescriptionOne": { + "message": "Από την έκδοση 91, το API που ενεργοποίησε την υποστήριξη Ledger (U2F) δεν υποστηρίζει πλέον πορτοφόλια υλικού. Η MetaMask έχει υλοποιήσει μια νέα υποστήριξη Ledger Live που σας επιτρέπει να συνεχίσετε να συνδέεστε με τη συσκευή Ledger μέσω της εφαρμογής επιφάνειας εργασίας Ledger Live.", + "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." + }, + "notifications6DescriptionThree": { + "message": "Όταν αλληλεπιδράτε με τον λογαριασμό σας Ledger στο MetaMask, θα ανοίξει μια νέα καρτέλα και θα σας ζητηθεί να ανοίξετε την εφαρμογή Ledger Live. Μόλις ανοίξει η εφαρμογή, θα σας ζητηθεί να επιτρέψετε μια σύνδεση WebSocket στο λογαριασμό σας MetaMask. Αυτό ήταν όλο!", + "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." + }, + "notifications6DescriptionTwo": { + "message": "Μπορείτε να ενεργοποιήσετε την υποστήριξη Ledger Live κάνοντας κλικ στις Ρυθμίσεις> Για προχωρημένους> Χρήση Ledger Live.", + "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." + }, + "notifications6Title": { + "message": "Ενημέρωση υποστήριξης Ledger για χρήστες του Chrome", + "description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update" + }, + "notifications7DescriptionOne": { + "message": "Το MetaMask v10.1.0 περιελάμβανε νέα υποστήριξη για συναλλαγές EIP-1559 όταν χρησιμοποιούσε συσκευές Ledger.", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for ledger and EIP1559 in v10.1.0" + }, + "notifications7DescriptionTwo": { + "message": "Για να ολοκληρώσετε τις συναλλαγές στο Ethereum Mainnet, βεβαιωθείτε ότι η συσκευή Ledger έχει το πιο πρόσφατο firmware.", + "description": "Description of a notification in the 'See What's New' popup. Describes the need to update ledger firmware." + }, + "notifications7Title": { + "message": "Ενημέρωση υλικολογισμικού Ledger", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." + }, + "notifications8ActionText": { + "message": "Μεταβείτε στις Ρυθμίσεις για Προχωρημένους", + "description": "Description on an action button that appears in the What's New popup. Tells the user that if they click it, they will go to our Advanced Settings page." + }, + "notifications8DescriptionOne": { + "message": "Από τη MetaMask v10.4.0 και μετά, δεν χρειάζεστε πλέον το Ledger Live για να συνδέσετε τη συσκευή Ledger με το MetaMask.", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for how Ledger Live is no longer needed to connect the device." + }, + "notifications8DescriptionTwo": { + "message": "Για μια ευκολότερη και πιο σταθερή εμπειρία ledger μεταβείτε στην καρτέλα Ρυθμίσεις για Προχωρημένους και αλλάξτε το 'Προτιμώμενος Τύπος Σύνδεσης Ledger' στο 'WebHID'.", + "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." + }, + "notifications8Title": { + "message": "Βελτίωση σύνδεσης Ledger", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users that there is an improvement in how they can connect their device." + }, + "notifications9DescriptionOne": { + "message": "Τώρα σας παρέχουμε περισσότερες πληροφορίες σχετικά με την καρτέλα 'Δεδομένα' όταν επιβεβαιώνετε τις συναλλαγές έξυπνων συμβολαίων." + }, + "notifications9DescriptionTwo": { + "message": "Μπορείτε τώρα να κατανοήσετε καλύτερα τα στοιχεία της συναλλαγής σας πριν την επιβεβαίωση, και είναι πιο εύκολο να προσθέσετε διευθύνσεις συναλλαγών στο βιβλίο διευθύνσεών σας, βοηθώντας σας να λάβετε ασφαλείς και ενημερωμένες αποφάσεις." + }, + "notifications9Title": { + "message": "👓 Κάνουμε τις συναλλαγές ευκολότερες στο διάβασμα." + }, "ofTextNofM": { "message": "από" }, "off": { "message": "Ανενεργό" }, + "offlineForMaintenance": { + "message": "Εκτός σύνδεσης για συντήρηση" + }, "ok": { "message": "Εντάξει" }, "on": { "message": "Ενεργό" }, + "onboardingCreateWallet": { + "message": "Δημιουργήστε ένα νέο πορτοφόλι" + }, + "onboardingImportWallet": { + "message": "Εισαγωγή υπάρχοντος πορτοφολιού" + }, + "onboardingPinExtensionBillboardAccess": { + "message": "Πλήρης Πρόσβαση" + }, + "onboardingPinExtensionBillboardDescription": { + "message": "Αυτές οι επεκτάσεις μπορούν να δουν και να αλλάξουν πληροφορίες" + }, + "onboardingPinExtensionBillboardDescription2": { + "message": "σε αυτή την ιστοσελίδα." + }, + "onboardingPinExtensionBillboardTitle": { + "message": "Επεκτάσεις" + }, + "onboardingPinExtensionChrome": { + "message": "Κάντε κλικ στο εικονίδιο επέκτασης προγράμματος περιήγησης" + }, + "onboardingPinExtensionDescription": { + "message": "Καρφίτσωμα του MetaMask στο πρόγραμμα περιήγησής σας ώστε να είναι προσβάσιμες και εύκολα ορατές επιβεβαιώσεις συναλλαγών." + }, + "onboardingPinExtensionDescription2": { + "message": "Μπορείτε να ανοίξετε το MetaMask κάνοντας κλικ στην επέκταση και να αποκτήσετε πρόσβαση στο πορτοφόλι σας με 1 κλικ." + }, + "onboardingPinExtensionDescription3": { + "message": "Κάντε κλικ στο εικονίδιο επέκτασης προγράμματος περιήγησης για άμεση πρόσβαση" + }, + "onboardingPinExtensionLabel": { + "message": "Καρφίτσωμα MetaMask" + }, + "onboardingPinExtensionStep1": { + "message": "1" + }, + "onboardingPinExtensionStep2": { + "message": "2" + }, + "onboardingPinExtensionTitle": { + "message": "Η εγκατάσταση του MetaMask ολοκληρώθηκε!" + }, + "onboardingReturnNotice": { + "message": "Το \"$1\" θα κλείσει αυτή την καρτέλα και θα επιστρέψει στο $2", + "description": "Return the user to the site that initiated onboarding" + }, + "onboardingShowIncomingTransactionsDescription": { + "message": "Η εμφάνιση των εισερχόμενων συναλλαγών στο πορτοφόλι σας βασίζεται σε επικοινωνία με το $1. Το Etherscan θα έχει πρόσβαση στη διεύθυνση Ethereum σας και τη διεύθυνση IP σας. Δείτε $2.", + "description": "$1 is a clickable link with text defined by the 'etherscan' key. $2 is a clickable link with text defined by the 'privacyMsg' key." + }, + "onboardingUsePhishingDetectionDescription": { + "message": "Οι ειδοποιήσεις ανίχνευσης Απάτης Ηλεκτρονικού Ψαρέματος βασίζονται στην επικοινωνία με το $1. Το jsDeliver θα έχει πρόσβαση στη διεύθυνση IP σας. Δείτε $2.", + "description": "The $1 is the word 'jsDeliver', from key 'jsDeliver' and $2 is the words Privacy Policy from key 'privacyMsg', both separated here so that it can be wrapped as a link" + }, + "onlyAddTrustedNetworks": { + "message": "Ένας κακόβουλος πάροχος δικτύου μπορεί να πει ψέμματα για την κατάσταση του blockchain και να καταγράψει τη δραστηριότητα του δικτύου σας. Να προσθέτετε μόνο προσαρμοσμένα δίκτυα που εμπιστεύεστε." + }, + "onlyConnectTrust": { + "message": "Συνδεθείτε μόνο με ιστότοπους που εμπιστεύεστε." + }, + "openFullScreenForLedgerWebHid": { + "message": "Ανοίξτε το MetaMask σε πλήρη οθόνη για να συνδέσετε το ledger σας μέσω WebHID.", + "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." + }, + "optional": { + "message": "Προαιρετικό" + }, + "optionalWithParanthesis": { + "message": "(Προαιρετικό)" + }, + "or": { + "message": "ή" + }, "origin": { "message": "Προέλευση" }, @@ -685,6 +2098,12 @@ "passwordNotLongEnough": { "message": "Ο Κωδικός Πρόσβασης δεν είναι αρκετά μεγάλος" }, + "passwordSetupDetails": { + "message": "Αυτός ο κωδικός πρόσβασης θα ξεκλειδώσει το πορτοφόλι σας MetaMask μόνο σε αυτήν τη συσκευή. Το MetaMask δεν μπορεί να ανακτήσει αυτόν τον κωδικό πρόσβασης." + }, + "passwordTermsWarning": { + "message": "Καταλαβαίνω ότι το MetaMask δεν μπορεί να ανακτήσει αυτόν τον κωδικό πρόσβασης για μένα. $1" + }, "passwordsDontMatch": { "message": "Οι κωδικοί πρόσβασης δεν ταιριάζουν" }, @@ -695,9 +2114,33 @@ "pending": { "message": "σε εκκρεμότητα" }, + "pendingTransactionInfo": { + "message": "Αυτή η συναλλαγή δεν θα επεξεργαστεί μέχρι να ολοκληρωθεί αυτή η συναλλαγή." + }, + "pendingTransactionMultiple": { + "message": "Έχετε ($1) εκκρεμείς συναλλαγές." + }, + "pendingTransactionSingle": { + "message": "Έχετε (1) εκκρεμή συναλλαγή.", + "description": "$1 is count of pending transactions" + }, + "permissionRequest": { + "message": "Αίτημα άδειας" + }, + "permissions": { + "message": "Άδειες" + }, "personalAddressDetected": { "message": "Η προσωπική διεύθυνση εντοπίστηκε. Καταχωρίστε τη διεύθυνση συμβολαίου διακριτικού." }, + "plusXMore": { + "message": "+ $1 ακόμη", + "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" + }, + "preferredLedgerConnectionType": { + "message": "Προτιμώμενος Τύπος Σύνδεσης Ledger", + "description": "A header for a dropdown in the advanced section of settings. Appears above the ledgerConnectionPreferenceDescription message" + }, "prev": { "message": "Προηγούμενο" }, @@ -707,6 +2150,12 @@ "primaryCurrencySettingDescription": { "message": "Επιλέξτε ενδογενές για να δώσετε προτεραιότητα στην προβολή τιμών στο φυσικό νόμισμα της αλυσίδας (π.χ. ETH). Επιλέξτε Παραστατικό για να δώσετε προτεραιότητα στην προβολή τιμών στο επιλεγμένο παραστατικό νόμισμα." }, + "priorityFee": { + "message": "Τέλη προτεραιότητας" + }, + "priorityFeeProperCase": { + "message": "Τέλη Προτεραιότητας" + }, "privacyMsg": { "message": "Πολιτική Απορρήτου" }, @@ -720,18 +2169,66 @@ "privateNetwork": { "message": "Ιδιωτικό Δίκτυο" }, + "proceedWithTransaction": { + "message": "Θέλω να προχωρήσω ούτως ή άλλως" + }, + "proposedApprovalLimit": { + "message": "Προτεινόμενο Όριο Έγκρισης" + }, + "provide": { + "message": "Παροχή" + }, + "publicAddress": { + "message": "Δημόσια Διεύθυνση" + }, "queue": { "message": "Ουρά" }, + "queued": { + "message": "Σε Αναμονή" + }, "readdToken": { "message": "Μπορείτε να προσθέσετε ξανά αυτό το διακριτικό στο μέλλον μεταβαίνοντας στο \"Πρόσθεση διακριτικού\" στο μενού επιλογών των λογαριασμών σας." }, + "receive": { + "message": "Λήψη" + }, "recents": { "message": "Πρόσφατα" }, "recipientAddressPlaceholder": { "message": "Αναζήτηση, δημόσια διεύθυνση (0x) ή ENS" }, + "recommendedGasLabel": { + "message": "Προτεινόμενο" + }, + "recoveryPhraseReminderBackupStart": { + "message": "Ξεκινήστε εδώ" + }, + "recoveryPhraseReminderConfirm": { + "message": "Το κατάλαβα" + }, + "recoveryPhraseReminderHasBackedUp": { + "message": "Κρατάτε πάντα τη Μυστική Φράση Ανάκτηση σε ασφαλές και μυστικό μέρος" + }, + "recoveryPhraseReminderHasNotBackedUp": { + "message": "Χρειάζεστε να δημιουργήσετε αντίγραφα ασφαλείας της Μυστική Φράση Ανάκτησης ξανά;" + }, + "recoveryPhraseReminderItemOne": { + "message": "Ποτέ μην μοιράζεστε τη Μυστική Φράση Ανάκτησης με κανέναν" + }, + "recoveryPhraseReminderItemTwo": { + "message": "Η ομάδα MetaMask δεν θα ζητήσει ποτέ τη Μυστική Φράση Ανάκτησης σας" + }, + "recoveryPhraseReminderSubText": { + "message": "Η Μυστική Φράση Ανάκτησης σας ελέγχει όλους τους λογαριασμούς σας." + }, + "recoveryPhraseReminderTitle": { + "message": "Προστατέψτε τα χρήματά σας" + }, + "refreshList": { + "message": "Ανανέωση λίστας" + }, "reject": { "message": "Απόρριψη" }, @@ -747,6 +2244,9 @@ "rejected": { "message": "Απορρίφθηκε" }, + "remember": { + "message": "Θυμηθείτε:" + }, "remindMeLater": { "message": "Θυμίστε μου αργότερα" }, @@ -759,6 +2259,9 @@ "removeAccountDescription": { "message": "Αυτός ο λογαριασμός θα καταργηθεί από το πορτοφόλι σας. Παρακαλούμε βεβαιωθείτε ότι έχετε την αρχική φράση επαναφοράς ή ιδιωτικό κλειδί για αυτόν τον εισαγόμενο λογαριασμό πριν συνεχίσετε. Μπορείτε να εισαγάγετε ή να δημιουργήσετε ξανά λογαριασμούς από το αναπτυσσόμενο μενού του λογαριασμού." }, + "removeNFT": { + "message": "Αφαίρεση NFT" + }, "requestsAwaitingAcknowledgement": { "message": "αιτήματα τα οποία αναμένουν να αναγνωριστούν" }, @@ -780,6 +2283,16 @@ "restoreAccountWithSeed": { "message": "Επαναφέρετε τον Λογαριασμό σας με Φράση Επαναφοράς" }, + "restoreWalletPreferences": { + "message": "Βρέθηκε ένα αντίγραφο ασφαλείας των δεδομένων σας από το $1. Θα θέλατε να επαναφέρετε τις προτιμήσεις του πορτοφολιού σας;", + "description": "$1 is the date at which the data was backed up" + }, + "retryTransaction": { + "message": "Επανάληψη Συναλλαγής" + }, + "reusedTokenNameWarning": { + "message": "Ένα token εδώ επαναχρησιμοποιεί ένα σύμβολο από ένα άλλο token που παρακολουθείτε, αυτό μπορεί να προκαλέσει σύγχυση ή να είναι παραπλανητικό." + }, "revealSeedWords": { "message": "Αποκάλυψη Λέξεων Φύτρου" }, @@ -813,9 +2326,15 @@ "scanQrCode": { "message": "Σάρωση Κωδικού QR" }, + "scrollDown": { + "message": "Κύλιση κάτω" + }, "search": { "message": "Αναζήτηση" }, + "searchAccounts": { + "message": "Αναζήτηση Λογαριασμών" + }, "searchResults": { "message": "Αποτελέσματα Αναζήτησης" }, @@ -828,51 +2347,155 @@ "secretBackupPhraseWarning": { "message": "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Ποτέ μην αποκαλύπτετε την εφεδρική φράση. Όποιος έχει αυτή τη φράση μπορεί να πάρει τα Ether σας για πάντα." }, + "secretPhrase": { + "message": "Μόνο ο πρώτος λογαριασμός σε αυτό το πορτοφόλι θα φορτώσει αυτόματα. Μετά την ολοκλήρωση αυτής της διαδικασίας, για να προσθέσετε επιπλέον λογαριασμούς, κάντε κλικ στο αναπτυσσόμενο μενού και, στη συνέχεια, επιλέξτε Δημιουργία Λογαριασμού." + }, + "secretPhraseWarning": { + "message": "Αν κάνετε επαναφορά χρησιμοποιώντας μια άλλη Μυστική Φράση Ανάκτησης, το τρέχον πορτοφόλι, οι λογαριασμοί και τα περιουσιακά στοιχεία σας θα αφαιρεθούν από αυτή την εφαρμογή μόνιμα. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί." + }, + "secretRecoveryPhrase": { + "message": "Μυστική Φράση Ανάκτησης" + }, + "secureWallet": { + "message": "Ασφαλές Πορτοφόλι" + }, "securityAndPrivacy": { "message": "Ασφάλεια και Απόρρητο" }, "securitySettingsDescription": { "message": "Φάση ρυθμίσεων απορρήτου και σπόρου πορτοφολιού" }, + "seedPhraseConfirm": { + "message": "Επιβεβαίωση Μυστικής Φράσης Ανάκτησης" + }, + "seedPhraseEnterMissingWords": { + "message": "Επιβεβαίωση Μυστικής Φράσης Ανάκτησης" + }, + "seedPhraseIntroNotRecommendedButtonCopy": { + "message": "Υπενθύμιση αργότερα (δεν συνιστάται)" + }, + "seedPhraseIntroRecommendedButtonCopy": { + "message": "Ασφαλίστε το πορτοφόλι μου (συνιστάται)" + }, + "seedPhraseIntroSidebarBulletFour": { + "message": "Γράψτε και αποθηκεύστε σε πολλές κρυψώνες." + }, + "seedPhraseIntroSidebarBulletOne": { + "message": "Αποθήκευση σε ένα διαχειριστή κωδικών πρόσβασης" + }, + "seedPhraseIntroSidebarBulletThree": { + "message": "Να φυλάσσεται σε χρηματοκιβώτιο." + }, + "seedPhraseIntroSidebarBulletTwo": { + "message": "Κατάστημα σε θησαυ/κιο τράπεζας." + }, + "seedPhraseIntroSidebarCopyOne": { + "message": "Η Μυστική Φράση Ανάκτησης είναι μια φράση 12 λέξεων που είναι το «κύριο κλειδί» στο πορτοφόλι σας και τα χρήματά σας" + }, + "seedPhraseIntroSidebarCopyThree": { + "message": "Αν κάποιος ζητήσει τη φράση ανάκτησης σας είναι πιθανό να προσπαθεί να σας εξαπατήσει και να κλέψει τα χρήματα του πορτοφολιού σας" + }, + "seedPhraseIntroSidebarCopyTwo": { + "message": "Ποτέ μα ποτέ μην μοιραστείτε ποτέ Μυστική Φράση Αποκατάστασης σας, ούτε καν με το MetaMask!" + }, + "seedPhraseIntroSidebarTitleOne": { + "message": "Τι είναι μια Μυστική Φράση Ανάκτησης;" + }, + "seedPhraseIntroSidebarTitleThree": { + "message": "Θα πρέπει να μοιραστώ τη Μυστική Φράση Ανάκτησης μου;" + }, + "seedPhraseIntroSidebarTitleTwo": { + "message": "Πώς μπορώ να αποθηκεύσω τη Μυστική Φράση Ανάκτησης μου;" + }, + "seedPhraseIntroTitle": { + "message": "Ασφαλίστε το πορτοφόλι σας" + }, + "seedPhraseIntroTitleCopy": { + "message": "Πριν ξεκινήσετε, παρακολουθήστε αυτό το σύντομο βίντεο για να μάθετε για τη Μυστική Φράση Ανάκτησης σας και πώς να κρατήσετε το πορτοφόλι σας ασφαλές." + }, "seedPhrasePlaceholder": { "message": "Διαχωρίστε κάθε λέξη μ' ένα κενό" }, + "seedPhrasePlaceholderPaste": { + "message": "Επικόλληση Μυστικής Φράσης Ανάκτησης από το πρόχειρο" + }, "seedPhraseReq": { "message": "Οι φράσεις φύτρου έχουν μήκος 12 λέξεων" }, + "seedPhraseWriteDownDetails": { + "message": "Γράψτε αυτή τη Μυστική Φράση Ανάκτησης 12 λέξεων και αποθηκεύστε την σε ένα μέρος που εμπιστεύεστε και όπου μόνο εσείς μπορείτε να έχετε πρόσβαση." + }, + "seedPhraseWriteDownHeader": { + "message": "Γράψτε τη Μυστική Φράση Ανάκτησης σας" + }, "selectAHigherGasFee": { "message": "Επιλέξτε ένα μεγαλύτερο τέλος gas για να επιταχύνετε την επεξεργασία της συναλλαγής σας.*" }, + "selectAccounts": { + "message": "Επιλέξτε τον/τους λογαριασμό(ούς) που θα χρησιμοποιήσετε σε αυτόν τον ιστότοπο" + }, + "selectAll": { + "message": "Επιλογή όλων" + }, "selectAnAccount": { "message": "Επιλέξτε Λογαριασμό" }, + "selectAnAccountAlreadyConnected": { + "message": "Αυτός ο λογαριασμός έχει ήδη συνδεθεί με το MetaMask" + }, "selectEachPhrase": { "message": "Παρακαλούμε επιλέξτε κάθε φράση, για να βεβαιωθείτε ότι είναι σωστή." }, "selectHdPath": { "message": "Επιλέξτε Διαδρομή HD" }, + "selectNFTPrivacyPreference": { + "message": "Ενεργοποιήστε την ανίχνευση NFT στις Ρυθμίσεις" + }, "selectPathHelp": { "message": "Εάν δεν βλέπετε τους υπάρχοντες λογαριασμούς σας Καθολικού παρακάτω, προσπαθήστε να αλλάξετε τις διαδρομές σε \"Legacy (MEW / MyCrypto)\"" }, "selectType": { "message": "Επιλέξτε Τύπο" }, + "selectingAllWillAllow": { + "message": "Επιλέγοντας τα όλα θα επιτρέψετε σε αυτόν τον ιστότοπο να δει όλους τους τρεχούμενους λογαριασμούς σας. Βεβαιωθείτε ότι εμπιστεύεστε αυτόν τον ιστότοπο." + }, "send": { "message": "Αποστολή" }, "sendAmount": { "message": "Αποστολή Ποσού" }, + "sendSpecifiedTokens": { + "message": "Αποστολή $1", + "description": "Symbol of the specified token" + }, + "sendTo": { + "message": "Αποστολή σε" + }, "sendTokens": { "message": "Στείλτε Tokens" }, + "sendingNativeAsset": { + "message": "Αποστολή $1", + "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" + }, "separateEachWord": { "message": "Διαχωρίστε κάθε λέξη με ένα μόνο κενό" }, + "setAdvancedPrivacySettings": { + "message": "Ορίστε ρυθμίσεις απορρήτου για προχωρημένους" + }, + "setAdvancedPrivacySettingsDetails": { + "message": "Το MetaMask χρησιμοποιεί αυτές τις αξιόπιστες υπηρεσίες τρίτων για να ενισχύσει τη χρηστικότητα και την ασφάλεια των προϊόντων." + }, "settings": { "message": "Ρυθμίσεις" }, + "show": { + "message": "Εμφάνιση" + }, "showAdvancedGasInline": { "message": "Προωθημένος έλεγχος gas" }, @@ -891,9 +2514,33 @@ "showHexDataDescription": { "message": "Επιλέξτε αυτό για να εμφανίσετε το πεδίο hex δεδομένων στην οθόνη αποστολής" }, + "showHide": { + "message": "Εμφάνιση/απόκρυψη" + }, + "showIncomingTransactions": { + "message": "Εμφάνιση Εισερχομένων Συναλλαγών" + }, + "showIncomingTransactionsDescription": { + "message": "Επιλέξτε αυτό για να χρησιμοποιήσετε Etherscan για να εμφανίσετε τις εισερχόμενες συναλλαγές στη λίστα συναλλαγών" + }, + "showPermissions": { + "message": "Εμφάνιση δικαιωμάτων" + }, "showPrivateKeys": { "message": "Εμφάνιση Ιδιωτικών Κλειδιών" }, + "showRecommendations": { + "message": "Εμφάνιση Προτάσεων" + }, + "showSeedPhrase": { + "message": "Εμφάνιση Μυστικής Φράσης Ανάκτησης" + }, + "showTestnetNetworks": { + "message": "Εμφάνιση δοκιμαστικών δικτύων" + }, + "showTestnetNetworksDescription": { + "message": "Επιλέξτε αυτό για να εμφανίζονται τα δοκιμαστικά δίκτυα στη λίστα δικτύων" + }, "sigRequest": { "message": "Αίτημα Υπογραφής" }, @@ -906,51 +2553,476 @@ "signatureRequest": { "message": "Αίτημα Υπογραφής" }, + "signatureRequest1": { + "message": "Μήνυμα" + }, "signed": { "message": "Συνδεδεμένος" }, + "simulationErrorMessage": { + "message": "Αυτή η συναλλαγή αναμένεται να αποτύχει. Η προσπάθεια εκτέλεσης αναμένεται να είναι δαπανηρή αλλά να αποτύχει και δεν συνιστάται." + }, + "simulationErrorMessageV2": { + "message": "Δεν ήμασταν σε θέση να εκτιμήσουμε το τέλος συναλλαγής. Μπορεί να υπάρχει σφάλμα στο συμβόλαιο και αυτή η συναλλαγή μπορεί να αποτύχει." + }, + "skip": { + "message": "Παράλειψη" + }, + "skipAccountSecurity": { + "message": "Παράλειψη Ασφάλειας Λογαριασμού;" + }, + "skipAccountSecurityDetails": { + "message": "Καταλαβαίνω ότι μέχρι να δημιουργήσω αντίγραφα ασφαλείας για την Μυστική Φράση Ανάκτησής μου, μπορεί να χάσω τους λογαριασμούς μου και όλα τα περιουσιακά στοιχεία τους." + }, "slow": { "message": "Αργά" }, "somethingWentWrong": { "message": "Ουπς! Κάτι πήγε στραβά." }, + "source": { + "message": "Πηγή" + }, "speedUp": { "message": "Επιτάχυνση" }, "speedUpCancellation": { "message": "Επιτάχυνση αυτής της ακύρωσης" }, + "speedUpExplanation": { + "message": "Έχουμε ενημερώσει το τέλος συναλλαγής με βάση τις τρέχουσες συνθήκες δικτύου και το έχουμε αυξήσει κατά τουλάχιστον 10% (απαιτείται από το δίκτυο)." + }, + "speedUpPopoverTitle": { + "message": "Επιτάχυνση αυτής της συναλλαγής" + }, + "speedUpTooltipText": { + "message": "Νέο τέλος συναλλαγής" + }, "speedUpTransaction": { "message": "Επιτάχυνση αυτής της συναλλαγής" }, + "spendLimitAmount": { + "message": "Ποσό ορίου δαπανών" + }, + "spendLimitInsufficient": { + "message": "Ανεπαρκές όριο δαπανών" + }, + "spendLimitInvalid": { + "message": "Όριο δαπανών μη έγκυρο. Πρέπει να είναι θετικός αριθμός" + }, + "spendLimitPermission": { + "message": "Άδεια χρήσης ορίου δαπανών" + }, + "spendLimitRequestedBy": { + "message": "Το όριο δαπανών ζητήθηκε από το $1", + "description": "Origin of the site requesting the spend limit" + }, + "spendLimitTooLarge": { + "message": "Πολύ μεγάλο όριο δαπανών" + }, + "stable": { + "message": "Σταθερό" + }, + "stableLowercase": { + "message": "σταθερό" + }, "stateLogError": { "message": "Σφάλμα κατά την ανάκτηση αρχείων καταγραφής κατάστασης." }, + "stateLogFileName": { + "message": "Καταγραφές Κατάστασης MetaMask" + }, "stateLogs": { "message": "Αρχεία Καταγραφής Κατάστασης" }, "stateLogsDescription": { "message": "Τα αρχεία καταγραφής κατάστασης περιέχουν τις διευθύνσεις του δημόσιου λογαριασμού σας και τις συναλλαγές οι οποίες έχουν αποσταλεί." }, + "statusConnected": { + "message": "Συνδεδεμένο" + }, + "statusNotConnected": { + "message": "Δεν έχει συνδεθεί" + }, + "step1LatticeWallet": { + "message": "Βεβαιωθείτε ότι το Lattice1 σας είναι έτοιμο να συνδεθεί" + }, + "step1LatticeWalletMsg": { + "message": "Μπορείτε να συνδέσετε το MetaMask με τη συσκευή Lattice1 σας μόλις εγκατασταθεί και είναι συνδεδεμένο στο ίντερνετ. Ξεκλειδώστε τη συσκευή σας και να έχετε το Αναγνωριστικό της Συσκευής σας έτοιμο. Για περισσότερα σχετικά με τη χρήση υλικού πορτοφολιού, $1", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, + "step1LedgerWallet": { + "message": "Λήψη εφαρμογής Ledger" + }, + "step1LedgerWalletMsg": { + "message": "Κατεβάστε, ρυθμίστε και εισάγετε τον κωδικό πρόσβασής σας για να ξεκλειδώσετε το $1.", + "description": "$1 represents the `ledgerLiveApp` localization value" + }, + "step1TrezorWallet": { + "message": "Συνδέστε το πορτοφόλι Trezor" + }, + "step1TrezorWalletMsg": { + "message": "Συνδέστε το πορτοφόλι σας απευθείας στον υπολογιστή σας. Για περισσότερα σχετικά με τη χρήση της συσκευής πορτοφολιού σας, $1", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, + "step2LedgerWallet": { + "message": "Συνδέστε το πορτοφόλι Ledger" + }, + "step2LedgerWalletMsg": { + "message": "Συνδέστε το πορτοφόλι σας απευθείας στον υπολογιστή σας. Ξεκλειδώστε το Ledger και ανοίξτε την εφαρμογή Ethereum. Για περισσότερες πληροφορίες σχετικά με τη χρήση της συσκευής πορτοφολιού σας, $1.", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, "storePhrase": { "message": "Αποθηκεύστε αυτήν τη φράση σε έναν διαχειριστή κωδικών πρόσβασης όπως το 1Password." }, + "submit": { + "message": "Υποβολή" + }, "submitted": { "message": "Υποβλήθηκε" }, + "support": { + "message": "Υποστήριξη" + }, "supportCenter": { "message": "Επισκεφθείτε το Κέντρο Υποστήριξής μας" }, + "swap": { + "message": "Ανταλλαγή" + }, + "swapAdvancedSlippageInfo": { + "message": "Εάν η τιμή αλλάζει μεταξύ της ώρας που τοποθετείται η παραγγελία σας και της επιβεβαίωσης, αυτό ονομάζεται \"ολίσθηση\". Η ανταλλαγή σας θα ακυρωθεί αυτόματα αν η ολίσθηση υπερβαίνει τη ρύθμιση \"ανοχή ολίσθησης\"." + }, + "swapAggregator": { + "message": "Aggregator Ανταλλακτηρίων" + }, + "swapAllowSwappingOf": { + "message": "Επιτρέψτε ανταλλαγή $1", + "description": "Shows a user that they need to allow a token for swapping on their hardware wallet" + }, + "swapAmountReceived": { + "message": "Εγγυημένο ποσό" + }, + "swapAmountReceivedInfo": { + "message": "Αυτό είναι το ελάχιστο ποσό που θα λάβετε. Μπορεί να λάβετε περισσότερα ανάλογα με την ολίσθηση." + }, + "swapApproval": { + "message": "Έγκριση $1 για swaps", + "description": "Used in the transaction display list to describe a transaction that is an approve call on a token that is to be swapped.. $1 is the symbol of a token that has been approved." + }, + "swapApproveNeedMoreTokens": { + "message": "Χρειάζεστε $1 περισσότερα $2 για να ολοκληρώσετε αυτήν την ανταλλαγή", + "description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol." + }, + "swapBestOfNQuotes": { + "message": "Το καλύτερο από $1 προσφορές.", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, + "swapBuildQuotePlaceHolderText": { + "message": "Δεν υπάρχουν διαθέσιμα tokens που να ταιριάζουν σε $1", + "description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text" + }, + "swapConfirmWithHwWallet": { + "message": "Επιβεβαιώστε με το υλικό πορτοφόλι σας" + }, + "swapContractDataDisabledErrorDescription": { + "message": "Στην εφαρμογή Ethereum στο Ledger, μεταβείτε στις \"Ρυθμίσεις\" και επιτρέψτε τα δεδομένα συμβολαίου. Στη συνέχεια, δοκιμάστε ξανά την ανταλλαγή σας." + }, + "swapContractDataDisabledErrorTitle": { + "message": "Τα δεδομένα συμβολαίου δεν είναι ενεργοποιημένα στο Ledger σας" + }, + "swapCustom": { + "message": "προσαρμοσμένο" + }, + "swapDecentralizedExchange": { + "message": "Αποκεντρωμένη ανταλλαγή" + }, + "swapDirectContract": { + "message": "Άμεσο συμβόλαιο" + }, + "swapEditLimit": { + "message": "Επεξεργασία ορίου" + }, + "swapEnableDescription": { + "message": "Αυτό απαιτείται και δίνει άδεια στο MetaMask για να ανταλλάξετε το $1 σας.", + "description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps." + }, + "swapEnableTokenForSwapping": { + "message": "Αυτό θα $1 για ανταλλαγή", + "description": "$1 is for the 'enableToken' key, e.g. 'enable ETH'" + }, + "swapEstimatedNetworkFees": { + "message": "Εκτιμώμενα τέλη δικτύου" + }, + "swapEstimatedNetworkFeesInfo": { + "message": "Αυτή είναι μια εκτίμηση των τελών δικτύου που θα χρησιμοποιηθούν για την ολοκλήρωση της ανταλλαγής σας. Το πραγματικό ποσό μπορεί να αλλάξει ανάλογα με τις συνθήκες δικτύου." + }, + "swapFailedErrorDescriptionWithSupportLink": { + "message": "Αποτυχίες συναλλαγών συμβαίνουν και είμαστε εδώ για να βοηθήσουμε. Εάν αυτό το ζήτημα επιμείνει, μπορείτε να επικοινωνήσετε με την υποστήριξη πελατών μας στο $1 για περαιτέρω βοήθεια.", + "description": "This message is shown to a user if their swap fails. The $1 will be replaced by support.metamask.io" + }, + "swapFailedErrorTitle": { + "message": "Η αλλαγή απέτυχε" + }, + "swapFetchingQuotes": { + "message": "Λήψη προσφορών" + }, + "swapFetchingQuotesErrorDescription": { + "message": "Χμμμ... κάτι πήγε στραβά. Δοκιμάστε ξανά, ή αν τα σφάλματα επιμένουν, επικοινωνήστε με την υποστήριξη πελατών." + }, + "swapFetchingQuotesErrorTitle": { + "message": "Σφάλμα κατά τη λήψη παραθέσεων" + }, + "swapFetchingTokens": { + "message": "Λήψη tokens..." + }, + "swapFromTo": { + "message": "Η ανταλλαγή από $1 έως $2", + "description": "Tells a user that they need to confirm on their hardware wallet a swap of 2 tokens. $1 is a source token and $2 is a destination token" + }, + "swapGasFeesDetails": { + "message": "Τα τέλη συναλλαγών εκτιμώνται και θα αυξάνονται ανάλογα με την κυκλοφορία του δικτύου και την πολυπλοκότητα των συναλλαγών." + }, + "swapGasFeesLearnMore": { + "message": "Μάθετε περισσότερα σχετικά με τα τέλη συναλλαγών" + }, + "swapGasFeesSplit": { + "message": "Τα τέλη συναλλαγών στην προηγούμενη οθόνη μοιράζονται μεταξύ αυτών των δύο συναλλαγών." + }, + "swapGasFeesSummary": { + "message": "Τα τέλη συναλλαγών καταβάλλονται σε κρυπτο miners που επεξεργάζονται συναλλαγές στο δίκτυο $1. Το MetaMask δεν επωφελείται από τα τέλη συναλλαγών.", + "description": "$1 is the selected network, e.g. Ethereum or BSC" + }, + "swapHighSlippageWarning": { + "message": "Το ποσό ολίσθησης είναι πολύ υψηλό." + }, + "swapIncludesMMFee": { + "message": "Περιλαμβάνει $1% τέλος MetaMask.", + "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." + }, + "swapLowSlippageError": { + "message": "Η συναλλαγή ενδέχεται να αποτύχει, η μέγιστη ολίσθηση είναι πολύ χαμηλή." + }, + "swapMaxSlippage": { + "message": "Μέγιστη ολίσθηση" + }, + "swapMetaMaskFee": { + "message": "Τέλος MetaMask" + }, + "swapMetaMaskFeeDescription": { + "message": "Βρίσκουμε την καλύτερη τιμή από τις κορυφαίες πηγές ρευστότητας, κάθε φορά. Μια αμοιβή $1% λαμβάνεται αυτόματα υπόψη σε αυτή τη προσφορά.", + "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." + }, + "swapNQuotesWithDot": { + "message": "$1 προσφορές.", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, + "swapNewQuoteIn": { + "message": "Νέες προσφορές σε $1", + "description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00" + }, + "swapOnceTransactionHasProcess": { + "message": "Το $1 σας θα προστεθεί στο λογαριασμό σας μόλις ολοκληρωθεί αυτή η συναλλαγή.", + "description": "This message communicates the token that is being transferred. It is shown on the awaiting swap screen. The $1 will be a token symbol." + }, + "swapPriceDifference": { + "message": "Πρόκειται να ανταλλάξετε $1 $2 (~$3) για $4 $5 (~$6).", + "description": "This message represents the price slippage for the swap. $1 and $4 are a number (ex: 2.89), $2 and $5 are symbols (ex: ETH), and $3 and $6 are fiat currency amounts." + }, + "swapPriceDifferenceTitle": { + "message": "Διαφορά τιμής του ~$1%", + "description": "$1 is a number (ex: 1.23) that represents the price difference." + }, + "swapPriceImpactTooltip": { + "message": "Ο αντίκτυπος στην τιμή είναι η διαφορά μεταξύ της τρέχουσας τιμής αγοράς και του ποσού που ελήφθη κατά την εκτέλεση της συναλλαγής. Ο αντίκτυπος της τιμής είναι μια συνάρτηση του μεγέθους της συναλλαγής σας σε σχέση με το μέγεθος της δεξαμενής ρευστότητας." + }, + "swapPriceUnavailableDescription": { + "message": "Ο αντίκτυπος στην τιμή δεν ήταν δυνατόν να προσδιοριστεί λόγω έλλειψης στοιχείων για τις τιμές της αγοράς. Παρακαλώ επιβεβαιώστε ότι είστε εντάξει με το ποσό των νομισμάτων που πρόκειται να λάβετε πριν από την ανταλλαγή." + }, + "swapPriceUnavailableTitle": { + "message": "Ελέγξτε το ποσοστό σας πριν προχωρήσετε" + }, + "swapProcessing": { + "message": "Επεξεργασία" + }, + "swapQuoteDetails": { + "message": "Λεπτομέρειες προσφοράς" + }, + "swapQuoteDetailsSlippageInfo": { + "message": "Εάν η τιμή αλλάζει μεταξύ της ώρας που τοποθετείται η παραγγελία σας και επιβεβαιώνεται ονομάζεται \"ολίσθηση\". Η ανταλλαγή σας θα ακυρωθεί αυτόματα αν η ολίσθηση υπερβαίνει τη ρύθμιση \"ανοχή ολίσθησης\"." + }, + "swapQuoteNofN": { + "message": "Προσφορά $1 από $2", + "description": "A count of loaded quotes shown to the user while they are waiting for quotes to be fetched. $1 is the number of quotes already loaded, and $2 is the total number of quotes to load." + }, + "swapQuoteSource": { + "message": "Πηγή προσφοράς" + }, + "swapQuotesExpiredErrorDescription": { + "message": "Παρακαλούμε ζητήστε νέες προσφορές για να πάρετε τις τελευταίες τιμές." + }, + "swapQuotesExpiredErrorTitle": { + "message": "Έληξε το χρονικό όριο προσφοράς" + }, + "swapQuotesNotAvailableErrorDescription": { + "message": "Δοκιμάστε να προσαρμόσετε το ποσό ή τις ρυθμίσεις ολίσθησης και δοκιμάστε ξανά." + }, + "swapQuotesNotAvailableErrorTitle": { + "message": "Καμία διαθέσιμη προσφορά" + }, + "swapRate": { + "message": "Ποσοστό" + }, + "swapReceiving": { + "message": "Λήψη" + }, + "swapReceivingInfoTooltip": { + "message": "Αυτή είναι μια εκτίμηση. Το ακριβές ποσό εξαρτάται από την ολίσθηση." + }, + "swapRequestForQuotation": { + "message": "Αίτηση για προσφορά" + }, + "swapReviewSwap": { + "message": "Επανεξέταση Ανταλλαγής" + }, + "swapSearchForAToken": { + "message": "Αναζήτηση για ένα token" + }, + "swapSelect": { + "message": "Επιλογή" + }, + "swapSelectAQuote": { + "message": "Επιλέξτε μια προσφορά" + }, + "swapSelectAToken": { + "message": "Επιλέξτε ένα token" + }, + "swapSelectQuotePopoverDescription": { + "message": "Παρακάτω είναι όλες οι προσφορές που συγκεντρώθηκαν από πολλαπλές πηγές ρευστότητας." + }, + "swapSlippageNegative": { + "message": "Η ολίσθηση πρέπει να είναι μεγαλύτερη ή ίση με το μηδέν" + }, + "swapSource": { + "message": "Πηγή ρευστότητας" + }, + "swapSourceInfo": { + "message": "Αναζητούμε σε πολλαπλές πηγές ρευστότητας (ανταλλαγές, ανταλλακτήρια και επαγγελματίες διαπραγματευτές της αγοράς) για να βρούμε τις καλύτερες τιμές και τα χαμηλότερα τέλη δικτύου." + }, + "swapSuggested": { + "message": "Προτεινόμενη ανταλλαγή" + }, + "swapSuggestedGasSettingToolTipMessage": { + "message": "Οι ανταλλαγές είναι πολύπλοκες και ευαίσθητες στον χρόνο συναλλαγές. Συνιστούμε αυτό το τέλος συναλλαγής για μια καλή ισορροπία μεταξύ κόστους και εμπιστοσύνης μιας επιτυχημένης Ανταλλαγής." + }, + "swapSwapFrom": { + "message": "Ανταλλαγή από" + }, + "swapSwapSwitch": { + "message": "Αλλαγή από και προς tokens" + }, + "swapSwapTo": { + "message": "Εναλλαγή σε" + }, + "swapToConfirmWithHwWallet": { + "message": "για επιβεβαίωση με το υλικό πορτοφόλι σας" + }, + "swapTokenAvailable": { + "message": "Το $1 σας έχει προστεθεί στο λογαριασμό σας.", + "description": "This message is shown after a swap is successful and communicates the exact amount of tokens the user has received for a swap. The $1 is a decimal number of tokens followed by the token symbol." + }, + "swapTokenBalanceUnavailable": { + "message": "Δεν μπορέσαμε να ανακτήσουμε το υπόλοιπο $1 σας", + "description": "This message communicates to the user that their balance of a given token is currently unavailable. $1 will be replaced by a token symbol" + }, + "swapTokenToToken": { + "message": "Ανταλλαγή $1 έως $2", + "description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap." + }, + "swapTokenVerificationAddedManually": { + "message": "Αυτό το token έχει προστεθεί χειροκίνητα." + }, + "swapTokenVerificationMessage": { + "message": "Πάντα να επιβεβαιώνετε τη διεύθυνση token στο $1.", + "description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover." + }, + "swapTokenVerificationOnlyOneSource": { + "message": "Επαληθεύεται μόνο σε 1 πηγή." + }, + "swapTokenVerificationSources": { + "message": "Επαληθευμένο σε $1 πηγές.", + "description": "Indicates the number of token information sources that recognize the symbol + address. $1 is a decimal number." + }, + "swapTooManyDecimalsError": { + "message": "Το $1 επιτρέπει έως και $2 δεκαδικά ψηφία", + "description": "$1 is a token symbol and $2 is the max. number of decimals allowed for the token" + }, + "swapTransactionComplete": { + "message": "Η συναλλαγή ολοκληρώθηκε" + }, + "swapTwoTransactions": { + "message": "2 συναλλαγές" + }, + "swapUnknown": { + "message": "Άγνωστο" + }, + "swapVerifyTokenExplanation": { + "message": "Πολλαπλά tokens μπορούν να χρησιμοποιήσουν το ίδιο όνομα και σύμβολο. Ελέγξτε το $1 για να επιβεβαιώσετε ότι αυτό είναι το token που ψάχνετε.", + "description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network." + }, + "swapYourTokenBalance": { + "message": "$1 $2 διαθέσιμο για ανταλλαγή", + "description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol" + }, + "swapZeroSlippage": { + "message": "0% Ολίσθηση" + }, + "swapsAdvancedOptions": { + "message": "Σύνθετες Επιλογές" + }, + "swapsExcessiveSlippageWarning": { + "message": "Το ποσό ολίσθησης είναι πολύ υψηλό και θα έχει ως αποτέλεσμα κακό ποσοστό. Παρακαλούμε μειώστε την ανοχή ολίσθησης σε τιμή κάτω από 15%." + }, + "swapsMaxSlippage": { + "message": "Ανοχή Ολίσθησης" + }, + "swapsNotEnoughForTx": { + "message": "Δεν υπάρχουν αρκετά $1 για να ολοκληρωθεί αυτή η συναλλαγή", + "description": "Tells the user that they don't have enough of a token for a proposed swap. $1 is a token symbol" + }, + "swapsViewInActivity": { + "message": "Προβολή σε δραστηριότητα" + }, + "switchEthereumChainConfirmationDescription": { + "message": "Αυτό θα αλλάξει το επιλεγμένο δίκτυο στο MetaMask σε ένα δίκτυο που έχει προστεθεί προηγουμένως:" + }, + "switchEthereumChainConfirmationTitle": { + "message": "Επιτρέπετε σε αυτόν τον ιστότοπο να αλλάξει το δίκτυο;" + }, + "switchNetwork": { + "message": "Εναλλαγή δικτύου" + }, "switchNetworks": { "message": "Αλλαγή Δικτύων" }, + "switchToThisAccount": { + "message": "Εναλλαγή σε αυτόν τον λογαριασμό" + }, + "switchingNetworksCancelsPendingConfirmations": { + "message": "Η εναλλαγή δικτύων θα ακυρώσει όλες τις εκκρεμείς επιβεβαιώσεις" + }, "symbol": { "message": "Σύμβολο" }, "symbolBetweenZeroTwelve": { "message": "Το σύμβολο πρέπει να είναι τουλάχιστον 11 χαρακτήρες." }, + "syncFailed": { + "message": "Ο συγχρονισμός απέτυχε" + }, + "syncInProgress": { + "message": "Συγχρονισμός σε εξέλιξη" + }, "syncWithMobile": { "message": "Συγχρονισμός με κινητό" }, @@ -972,18 +3044,44 @@ "syncWithMobileTitle": { "message": "Συγχρονισμός με κινητό" }, + "syncWithThreeBox": { + "message": "Συγχρονισμός δεδομένων με 3Box (πειραματικό)" + }, + "syncWithThreeBoxDescription": { + "message": "Ενεργοποιήστε για να δημιουργηθούν αντίγραφα ασφαλείας των ρυθμίσεων σας με το 3Box. Αυτή η λειτουργία είναι επί του παρόντος πειραματική. Χρησιμοποιήστε τη με δική σας ευθύνη." + }, + "syncWithThreeBoxDisabled": { + "message": "Το 3Box έχει απενεργοποιηθεί λόγω σφάλματος κατά τον αρχικό συγχρονισμό" + }, "terms": { "message": "Όροι Χρήσης" }, + "termsOfService": { + "message": "Όροι παροχής υπηρεσιών" + }, "testFaucet": { "message": "Έλεγχος Βαλβίδας" }, "thisWillCreate": { "message": "Αυτό θα δημιουργήσει ένα νέο πορτοφόλι και φράση φύτρου" }, + "time": { + "message": "Ώρα" + }, + "tips": { + "message": "Συμβουλές" + }, "to": { "message": "Προς" }, + "toAddress": { + "message": "Προς: $1", + "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" + }, + "toggleTestNetworks": { + "message": "$1 δοκιμαστικά δίκτυα", + "description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open to the advanced settings where users can enable the display of test networks in the network dropdown." + }, "token": { "message": "Διακριτικό" }, @@ -993,9 +3091,18 @@ "tokenContractAddress": { "message": "Διεύθυνση Συμβολαίου Token" }, + "tokenDecimalFetchFailed": { + "message": "Απαιτείται δεκαδικό Token." + }, + "tokenDetectionAnnouncement": { + "message": "Νέο! Η βελτιωμένη ανίχνευση token είναι διαθέσιμη στο Ethereum Mainnet ως πειραματικό χαρακτηριστικό. $1" + }, "tokenSymbol": { "message": "Σύμβολο Διακριτικού" }, + "tooltipApproveButton": { + "message": "Καταλαβαίνω" + }, "total": { "message": "Σύνολο" }, @@ -1014,6 +3121,48 @@ "transactionCreated": { "message": "Η συναλλαγή δημιουργήθηκε με τιμή $1 στο $2." }, + "transactionData": { + "message": "Δεδομένα συναλλαγής" + }, + "transactionDecodingAccreditationDecoded": { + "message": "Αποκωδικοποιήθηκε από Truffle" + }, + "transactionDecodingAccreditationVerified": { + "message": "Επαληθευμένο συμβόλαιο σε $1" + }, + "transactionDecodingUnsupportedNetworkError": { + "message": "Η αποκωδικοποίηση συναλλαγών δεν είναι διαθέσιμη για chainId $1" + }, + "transactionDetailDappGasMoreInfo": { + "message": "Προτεινόμενο από την ιστοσελίδα" + }, + "transactionDetailDappGasTooltip": { + "message": "Επεξεργαστείτε για να χρησιμοποιήσετε το προτεινόμενο τέλος συναλλαγής του MetaMask με βάση το τελευταίο μπλοκ." + }, + "transactionDetailGasHeading": { + "message": "Εκτιμώμενο τέλος συναλλαγής" + }, + "transactionDetailGasInfoV2": { + "message": "εκτιμώμενο" + }, + "transactionDetailGasTooltipConversion": { + "message": "Μάθετε περισσότερα σχετικά με τα τέλη συναλλαγών" + }, + "transactionDetailGasTooltipExplanation": { + "message": "Τα τέλη συναλλαγών καθορίζονται από το δίκτυο και θα αυξάνονται ανάλογα με την κυκλοφορία του δικτύου και την πολυπλοκότητα των συναλλαγών." + }, + "transactionDetailGasTooltipIntro": { + "message": "Τα τέλη συναλλαγών καταβάλλονται σε κρυπτο miners που επεξεργάζονται συναλλαγές στο δίκτυο $1. Το MetaMask δεν επωφελείται από τα τέλη συναλλαγών." + }, + "transactionDetailGasTotalSubtitle": { + "message": "Ποσό + τέλος συναλλαγής" + }, + "transactionDetailLayer2GasHeading": { + "message": "Τέλος συναλλαγής Επιπέδου 2" + }, + "transactionDetailMultiLayerTotalSubtitle": { + "message": "Ποσά + τέλη" + }, "transactionDropped": { "message": "Η συναλλαγή υποχώρησε στα $2." }, @@ -1029,6 +3178,27 @@ "transactionFee": { "message": "Χρέωση Συναλλαγής" }, + "transactionHistoryBaseFee": { + "message": "Βασικό Τέλος (GWEI)" + }, + "transactionHistoryL1GasLabel": { + "message": "Σύνολο Τέλους Συναλλαγής L1" + }, + "transactionHistoryL2GasLimitLabel": { + "message": "L2 Όριο Τέλους Συναλλαγής" + }, + "transactionHistoryL2GasPriceLabel": { + "message": "L2 Τιμή Τέλους Συναλλαγής" + }, + "transactionHistoryMaxFeePerGas": { + "message": "Μέγιστη Χρέωση Ανά Τέλος Συναλλαγής" + }, + "transactionHistoryPriorityFee": { + "message": "Τέλος Προτεραιότητας (GWEI)" + }, + "transactionHistoryTotalGasFee": { + "message": "Σύνολο Τέλους Συναλλαγής" + }, "transactionResubmitted": { "message": "Η συναλλαγή υποβλήθηκε ξανά με το τέλος gas να έχει αυξηθεί για $1 σε $2" }, @@ -1047,16 +3217,39 @@ "transferFrom": { "message": "Μεταφορά Από" }, + "troubleConnectingToWallet": { + "message": "Είχαμε πρόβλημα να συνδεθούμε με το $1 σας, δοκιμάστε να ξαναδείτε το $2 και προσπαθήστε ξανά.", + "description": "$1 is the wallet device name; $2 is a link to wallet connection guide" + }, "troubleTokenBalances": { "message": "Είχαμε πρόβλημα να φορτώσουμε τα υπόλοιπα του διακριτικού σας. Μπορείτε να τα δείτε", "description": "Followed by a link (here) to view token balances" }, + "trustSiteApprovePermission": { + "message": "Χορηγώντας άδεια, επιτρέπετε στα ακόλουθα $1 να έχουν πρόσβαση στα χρήματά σας" + }, "tryAgain": { "message": "Δοκιμάστε ξανά" }, + "tryAnywayOption": { + "message": "Θα προσπαθήσω ούτως ή άλλως" + }, + "turnOnTokenDetection": { + "message": "Ενεργοποιήστε την ενισχυμένη ανίχνευση token" + }, + "twelveHrTitle": { + "message": "12ώρες:" + }, + "txInsightsNotSupported": { + "message": "Οι αναλύσεις συναλλαγών εις βάθος δεν υποστηρίζονται για αυτό το συμβόλαιο αυτή τη στιγμή." + }, "typePassword": { "message": "Πληκτρολογήστε τον κωδικό πρόσβασής σας MetaMask" }, + "u2f": { + "message": "U2F", + "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." + }, "unapproved": { "message": "Μη εγκεκριμένο" }, @@ -1078,42 +3271,184 @@ "unknownQrCode": { "message": "Σφάλμα: Δεν μπορέσαμε να προσδιορίσουμε αυτόν τον κώδικα QR" }, + "unlimited": { + "message": "Απεριόριστο" + }, "unlock": { "message": "Ξεκλείδωμα" }, "unlockMessage": { "message": "Ο αποκεντρωμένος ιστός περιμένει" }, + "unrecognizedChain": { + "message": "Αυτό το προσαρμοσμένο δίκτυο δεν αναγνωρίζεται. Σας συνιστούμε να $1 πριν προχωρήσετε", + "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." + }, + "unrecognizedChainLinkText": { + "message": "επαληθεύστε τα στοιχεία δικτύου", + "description": "Serves as link text for the 'unrecognizedChain' key. This text will be embedded inside the translation for that key." + }, + "unsendableAsset": { + "message": "Η αποστολή συλλεκτικών (ERC-721) δεν υποστηρίζεται προς το παρόν", + "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" + }, "updatedWithDate": { "message": "Ενημερώθηκε το $1" }, "urlErrorMsg": { "message": "Τα URI απαιτούν το κατάλληλο πρόθεμα HTTP/HTTPS." }, + "urlExistsErrorMsg": { + "message": "Αυτό το URL χρησιμοποιείται επί του παρόντος από το δίκτυο $1." + }, + "useCollectibleDetection": { + "message": "Αυτόματη Ανίχνευση NFT" + }, + "useCollectibleDetectionDescription": { + "message": "Η εμφάνιση πολυμέσων και δεδομένων NFT μπορεί να εκθέσει τη διεύθυνση IP σας σε κεντρικούς διακομιστές. Τα API τρίτων (όπως το OpenSea) χρησιμοποιούνται για την ανίχνευση NFT στο πορτοφόλι σας. Αυτό εκθέτει τη διεύθυνση του λογαριασμού σας με αυτές τις υπηρεσίες. Αφήστε το απενεργοποιημένο αν δεν θέλετε η εφαρμογή να τραβήξει δεδομένα από αυτές τις υπηρεσίες." + }, + "usePhishingDetection": { + "message": "Χρήση Ανίχνευσης Απάτης Ηλεκτρονικού Ψαρέματος" + }, + "usePhishingDetectionDescription": { + "message": "Εμφάνιση μιας προειδοποίησης για τομείς Απάτης Ηλεκτρονικού Ψαρέματος που στοχεύουν χρήστες του Ethereum" + }, + "useTokenDetection": { + "message": "Χρήση Ανίχνευσης Token" + }, + "useTokenDetectionDescription": { + "message": "Χρησιμοποιούμε API τρίτων για να εντοπίσουμε και να εμφανίσουμε νέα tokens που αποστέλλονται στο πορτοφόλι σας. Απενεργοποιήστε αν δεν θέλετε το MetaMask να τραβήξει δεδομένα από αυτές τις υπηρεσίες." + }, "usedByClients": { "message": "Χρησιμοποιείται από μια ποικιλία διαφορετικών πελατών" }, "userName": { "message": "Όνομα χρήστη" }, + "verifyThisTokenDecimalOn": { + "message": "Το δεκαδικό token μπορεί να βρεθεί σε $1", + "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" + }, + "verifyThisTokenOn": { + "message": "Επαλήθευση αυτού του token στο $1", + "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" + }, + "verifyThisUnconfirmedTokenOn": { + "message": "Επαληθεύστε αυτό το token για $1 και βεβαιωθείτε ότι αυτό είναι το token που θέλετε να κάνετε συναλλαγές.", + "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" + }, "viewAccount": { "message": "Προβολή λογαριασμού" }, + "viewAllDetails": { + "message": "Προβολή όλων των λεπτομερειών" + }, "viewContact": { "message": "Εμφάνιση Επαφής" }, + "viewFullTransactionDetails": { + "message": "Δείτε όλες τις λεπτομέρειες της συναλλαγής" + }, + "viewMore": { + "message": "Δείτε Περισσότερα" + }, + "viewOnBlockExplorer": { + "message": "Προβολή στον εξερευνητή μπλοκ" + }, + "viewOnCustomBlockExplorer": { + "message": "Προβολή $1 στο $2", + "description": "$1 is the action type. e.g (Account, Transaction, Swap) and $2 is the Custom Block Exporer URL" + }, + "viewOnEtherscan": { + "message": "Προβολή $1 στην Etherscan", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, + "viewOnOpensea": { + "message": "Προβολή στο Opensea" + }, + "viewinExplorer": { + "message": "Προβολή $1 στον Εξερευνητή", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, "visitWebSite": { "message": "Επισκεφθείτε τον ιστότοπό μας" }, + "walletConnectionGuide": { + "message": "ο οδηγός μας σύνδεσης υλικού πορτοφολιού" + }, + "walletCreationSuccessDetail": { + "message": "Προστατεύσατε με επιτυχία το πορτοφόλι σας. Κρατήστε τη Μυστική Φράση Ανάκτησης σας ασφαλή και μυστική -- είναι δική σας ευθύνη!" + }, + "walletCreationSuccessReminder1": { + "message": "Το MetaMask δεν μπορεί να ανακτήσει τη Μυστική Φράση Ανάκτησής σας." + }, + "walletCreationSuccessReminder2": { + "message": "Το MetaMask δεν θα σας ζητήσει ποτέ τη Μυστική Φράση Ανάκτησής σας." + }, + "walletCreationSuccessReminder3": { + "message": "$1 με οποιονδήποτε ή να διακινδυνεύστε τα χρήματά σας να κλαπούν", + "description": "$1 is separated as walletCreationSuccessReminder3BoldSection so that we can bold it" + }, + "walletCreationSuccessReminder3BoldSection": { + "message": "Ποτέ μην μοιράζεστε τη Μυστική Φράση Ανάκτησης σας", + "description": "This string is localized separately from walletCreationSuccessReminder3 so that we can bold it" + }, + "walletCreationSuccessTitle": { + "message": "Επιτυχής δημιουργία πορτοφολιού" + }, + "walletSeedRestore": { + "message": "Μυστικής Φράσης Ανάκτησης Πορτοφολιού" + }, + "web3ShimUsageNotification": { + "message": "Παρατηρήσαμε ότι η τρέχουσα ιστοσελίδα προσπάθησε να χρησιμοποιήσει το αφαιρεθέν window.web3 API. Αν η ιστοσελίδα φαίνεται να έχει παραβιαστεί, κάντε κλικ στο $1 για περισσότερες πληροφορίες.", + "description": "$1 is a clickable link." + }, + "webhid": { + "message": "WebHID", + "description": "Refers to a interface for connecting external devices to the browser. Used for connecting ledger to the browser. Read more here https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API" + }, "welcome": { "message": "Καλώς ήλθατε στο MetaMask" }, "welcomeBack": { "message": "Καλώς Ήλθατε και Πάλι!" }, + "welcomeExploreDescription": { + "message": "Αποθηκεύστε, στείλτε και ξοδέψτε νομίσματα και περιουσιακά στοιχεία κρυπτονομισμάτων." + }, + "welcomeExploreTitle": { + "message": "Εξερεύνηση αποκεντρωμένων εφαρμογών" + }, + "welcomeLoginDescription": { + "message": "Χρησιμοποιήστε το MetaMask σας για να συνδεθείτε σε αποκεντρωμένες εφαρμογές - δεν απαιτείται εγγραφή." + }, + "welcomeLoginTitle": { + "message": "Πείτε γεια στο πορτοφόλι σας" + }, + "welcomeToMetaMask": { + "message": "Ας ξεκινήσουμε" + }, + "welcomeToMetaMaskIntro": { + "message": "Αξιόπιστο για εκατομμύρια, το MetaMask είναι ένα ασφαλές πορτοφόλι που καθιστά τον κόσμο του web3 προσβάσιμο σε όλους." + }, + "whatsNew": { + "message": "Τι νέο υπάρχει", + "description": "This is the title of a popup that gives users notifications about new features and updates to MetaMask." + }, + "whatsThis": { + "message": "Τι είναι αυτό;" + }, "writePhrase": { "message": "Γράψτε αυτήν τη φάση σε ένα κομμάτι χαρτί και αποθηκεύστε την σε μια ασφαλή τοποθεσία. Εάν θέλετε ακόμη περισσότερη ασφάλεια, γράψτε την σε περισσότερα κομμάτια χαρτί και αποθηκεύστε καθένα από αυτά σε 2-3 διαφορετικές τοποθεσίες." }, + "xOfY": { + "message": "$1 από $2", + "description": "$1 and $2 are intended to be two numbers, where $2 is a total, and $1 is a count towards that total" + }, + "xOfYPending": { + "message": "$1 από $2 σε εκκρεμότητα", + "description": "$1 and $2 are intended to be two numbers, where $2 is a total number of pending confirmations, and $1 is a count towards that total" + }, "yesLetsTry": { "message": "Ναι, ας δοκιμάσουμε" }, diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index 93231184c..b02cbb3f7 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -260,9 +260,6 @@ "buyWithWyreDescription": { "message": "Wyre le permite usar una tarjeta de débito para depositar ETH directamente en su cuenta de MetaMask." }, - "bytes": { - "message": "Bytes" - }, "canToggleInSettings": { "message": "Puede volver a activar esta notificación desde Configuración -> Alertas." }, @@ -696,9 +693,6 @@ "ethereumPublicAddress": { "message": "Dirección pública de Ethereum" }, - "etherscan": { - "message": "Etherscan" - }, "etherscanView": { "message": "Ver cuenta en Etherscan" }, @@ -802,9 +796,6 @@ "message": "Política de privacidad aquí", "description": "this translation is intended to be exclusively used as the replacement for the $1 in the gdprMessage translation" }, - "general": { - "message": "General" - }, "generalSettingsDescription": { "message": "Conversión de moneda, moneda principal, idioma, Blockies Identicon" }, @@ -824,16 +815,9 @@ "happyToSeeYou": { "message": "Nos alegra verlo." }, - "hardware": { - "message": "Hardware" - }, "hardwareWalletConnected": { "message": "Cartera de hardware conectada" }, - "hardwareWalletLegacyDescription": { - "message": "(legacy)", - "description": "Text representing the MEW path" - }, "hardwareWalletSupportLinkConversion": { "message": "Haga clic aquí" }, @@ -1139,15 +1123,9 @@ "networkName": { "message": "Nombre de la red" }, - "networkNameBSC": { - "message": "BSC" - }, "networkNameDefinition": { "message": "El nombre asociado a esta red." }, - "networkNameEthereum": { - "message": "Ethereum" - }, "networkNameTestnet": { "message": "Red de prueba" }, @@ -1228,9 +1206,6 @@ "noWebcamFoundTitle": { "message": "No se encontró cámara web" }, - "nonce": { - "message": "Nonce" - }, "nonceField": { "message": "Personalizar nonce de transacción" }, @@ -2128,9 +2103,6 @@ "message": "Para: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, - "token": { - "message": "Token" - }, "tokenAlreadyAdded": { "message": "Ya se agregó el token." }, @@ -2146,9 +2118,6 @@ "tooltipApproveButton": { "message": "Comprendo" }, - "total": { - "message": "Total" - }, "transaction": { "message": "transacción" }, diff --git a/app/_locales/es_419/messages.json b/app/_locales/es_419/messages.json index 93231184c..ec53a44a2 100644 --- a/app/_locales/es_419/messages.json +++ b/app/_locales/es_419/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Rechazar" + }, + "QRHardwareWalletImporterTitle": { + "message": "Escanear código QR" + }, "about": { "message": "Acerca de" }, @@ -260,9 +266,6 @@ "buyWithWyreDescription": { "message": "Wyre le permite usar una tarjeta de débito para depositar ETH directamente en su cuenta de MetaMask." }, - "bytes": { - "message": "Bytes" - }, "canToggleInSettings": { "message": "Puede volver a activar esta notificación desde Configuración -> Alertas." }, @@ -466,6 +469,9 @@ "currentLanguage": { "message": "Idioma actual" }, + "custom": { + "message": "Avanzado" + }, "customGas": { "message": "Personalizar gas" }, @@ -696,9 +702,6 @@ "ethereumPublicAddress": { "message": "Dirección pública de Ethereum" }, - "etherscan": { - "message": "Etherscan" - }, "etherscanView": { "message": "Ver cuenta en Etherscan" }, @@ -802,9 +805,6 @@ "message": "Política de privacidad aquí", "description": "this translation is intended to be exclusively used as the replacement for the $1 in the gdprMessage translation" }, - "general": { - "message": "General" - }, "generalSettingsDescription": { "message": "Conversión de moneda, moneda principal, idioma, Blockies Identicon" }, @@ -824,16 +824,9 @@ "happyToSeeYou": { "message": "Nos alegra verlo." }, - "hardware": { - "message": "Hardware" - }, "hardwareWalletConnected": { "message": "Cartera de hardware conectada" }, - "hardwareWalletLegacyDescription": { - "message": "(legacy)", - "description": "Text representing the MEW path" - }, "hardwareWalletSupportLinkConversion": { "message": "Haga clic aquí" }, @@ -993,6 +986,9 @@ "learnMore": { "message": "Más información" }, + "learnMoreUpperCase": { + "message": "Más información" + }, "ledgerAccountRestriction": { "message": "Debe usar su última cuenta antes de poder agregar una nueva." }, @@ -1139,15 +1135,9 @@ "networkName": { "message": "Nombre de la red" }, - "networkNameBSC": { - "message": "BSC" - }, "networkNameDefinition": { "message": "El nombre asociado a esta red." }, - "networkNameEthereum": { - "message": "Ethereum" - }, "networkNameTestnet": { "message": "Red de prueba" }, @@ -1228,9 +1218,6 @@ "noWebcamFoundTitle": { "message": "No se encontró cámara web" }, - "nonce": { - "message": "Nonce" - }, "nonceField": { "message": "Personalizar nonce de transacción" }, @@ -2128,9 +2115,6 @@ "message": "Para: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, - "token": { - "message": "Token" - }, "tokenAlreadyAdded": { "message": "Ya se agregó el token." }, @@ -2146,9 +2130,6 @@ "tooltipApproveButton": { "message": "Comprendo" }, - "total": { - "message": "Total" - }, "transaction": { "message": "transacción" }, diff --git a/app/_locales/et/messages.json b/app/_locales/et/messages.json index e84794179..2a0d62d82 100644 --- a/app/_locales/et/messages.json +++ b/app/_locales/et/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Lükka tagasi" + }, + "QRHardwareWalletImporterTitle": { + "message": "Skannige QR-koos" + }, "about": { "message": "Teave" }, @@ -256,6 +262,9 @@ "currentLanguage": { "message": "Praegune keel" }, + "custom": { + "message": "Täpsemad" + }, "customGas": { "message": "Gaasi kohandamine" }, @@ -526,6 +535,9 @@ "learnMore": { "message": "Lisateave" }, + "learnMoreUpperCase": { + "message": "Lisateave" + }, "ledgerAccountRestriction": { "message": "Enne uue konto loomist peate kasutama eelmist kontot." }, diff --git a/app/_locales/fa/messages.json b/app/_locales/fa/messages.json index 15d3cd038..19440d60c 100644 --- a/app/_locales/fa/messages.json +++ b/app/_locales/fa/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "عدم پذیرش" + }, + "QRHardwareWalletImporterTitle": { + "message": "سکن کود QR" + }, "about": { "message": "درباره" }, @@ -256,6 +262,9 @@ "currentLanguage": { "message": "زبان فعلی" }, + "custom": { + "message": "پیشرفته" + }, "customGas": { "message": "گاز دلخواه" }, @@ -530,6 +539,9 @@ "learnMore": { "message": "بیشتر بدانید" }, + "learnMoreUpperCase": { + "message": "بیشتر بدانید" + }, "ledgerAccountRestriction": { "message": "لازم است تا حساب قبلی تان را قبل از اینکه جدید اضافه کنید، مورد استفاده قرار دهید." }, diff --git a/app/_locales/fi/messages.json b/app/_locales/fi/messages.json index fce7a0c03..13307c372 100644 --- a/app/_locales/fi/messages.json +++ b/app/_locales/fi/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Hylkää" + }, + "QRHardwareWalletImporterTitle": { + "message": "Lue QR-koodi" + }, "about": { "message": "Tietoja asetuksista" }, @@ -256,6 +262,9 @@ "currentLanguage": { "message": "Nykyinen kieli" }, + "custom": { + "message": "Lisäasetukset" + }, "customGas": { "message": "Mukauta bensa" }, @@ -530,6 +539,9 @@ "learnMore": { "message": "Lisätietoa" }, + "learnMoreUpperCase": { + "message": "Lisätietoa" + }, "ledgerAccountRestriction": { "message": "Sinun tarvitsee käyttää edellistä tiliäsi ennen kuin voit lisätä uuden." }, diff --git a/app/_locales/fil/messages.json b/app/_locales/fil/messages.json index 25b94a30f..7d85bfe7d 100644 --- a/app/_locales/fil/messages.json +++ b/app/_locales/fil/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Tanggihan" + }, + "QRHardwareWalletImporterTitle": { + "message": "I-scan ang QR Code" + }, "about": { "message": "Tungkol sa" }, @@ -483,6 +489,9 @@ "learnMore": { "message": "Matuto pa" }, + "learnMoreUpperCase": { + "message": "Matuto pa" + }, "ledgerAccountRestriction": { "message": "Kailangan mong gamitin ang iyong dating account bago ka makapagdagdag ng bago." }, diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json index 382613d76..a01a75db8 100644 --- a/app/_locales/fr/messages.json +++ b/app/_locales/fr/messages.json @@ -1,4 +1,49 @@ { + "QRHardwareInvalidTransactionTitle": { + "message": "Erreur" + }, + "QRHardwareMismatchedSignId": { + "message": "Données de transaction incompatibles. Veuillez vérifier les détails de la transaction." + }, + "QRHardwarePubkeyAccountOutOfRange": { + "message": "Il n’y a plus de comptes. Si vous souhaitez accéder à un autre compte non répertorié ci-dessous, veuillez reconnecter votre portefeuille matériel et le sélectionner." + }, + "QRHardwareScanInstructions": { + "message": "Placez le code QR devant votre caméra. L’écran est flou, mais cela n’affectera pas la lecture." + }, + "QRHardwareSignRequestCancel": { + "message": "Rejeter" + }, + "QRHardwareSignRequestDescription": { + "message": "Après avoir signé avec votre portefeuille, cliquez sur « Obtenir la signature » pour recevoir la signature" + }, + "QRHardwareSignRequestGetSignature": { + "message": "Obtenir la signature" + }, + "QRHardwareSignRequestSubtitle": { + "message": "Veuillez scanner le code QR avec votre portefeuille" + }, + "QRHardwareSignRequestTitle": { + "message": "Demander la signature" + }, + "QRHardwareUnknownQRCodeTitle": { + "message": "Erreur" + }, + "QRHardwareUnknownWalletQRCode": { + "message": "Code QR invalide. Scannez le code QR de synchronisation du portefeuille matériel." + }, + "QRHardwareWalletImporterTitle": { + "message": "Scannez le QR Code" + }, + "QRHardwareWalletSteps1Description": { + "message": "Connectez un portefeuille matériel sécurisé par air gap qui communique via des codes QR. Les portefeuilles de ce type officiellement pris en charge sont les suivants :" + }, + "QRHardwareWalletSteps1Title": { + "message": "Portefeuille matériel basé avec code QR" + }, + "QRHardwareWalletSteps2Description": { + "message": "AirGap Vault et Ngrave (bientôt disponible)" + }, "about": { "message": "À propos" }, @@ -8,6 +53,14 @@ "acceleratingATransaction": { "message": "* Accélérer une transaction en utilisant un prix de l'essence plus élevé augmente ses chances d'être traitée plus rapidement par le réseau, mais ce n'est pas toujours garanti." }, + "acceptTermsOfUse": { + "message": "J’ai lu et j’accepte les $1", + "description": "$1 is the `terms` message" + }, + "accessAndSpendNotice": { + "message": "$1 peut accéder et dépenser jusqu’à ce montant maximal", + "description": "$1 is the url of the site requesting ability to spend" + }, "accessingYourCamera": { "message": "Accès à votre appareil photo..." }, @@ -20,21 +73,76 @@ "accountName": { "message": "Nom du compte" }, + "accountNameDuplicate": { + "message": "Ce nom de compte existe déjà", + "description": "This is an error message shown when the user enters a new account name that matches an existing account name" + }, "accountOptions": { "message": "Options du compte" }, "accountSelectionRequired": { "message": "Vous devez selectionner un compte !" }, + "active": { + "message": "Actif" + }, + "activity": { + "message": "Activité" + }, "activityLog": { "message": "Log d'activité" }, + "add": { + "message": "Ajouter" + }, + "addANetwork": { + "message": "Ajouter un réseau" + }, + "addANickname": { + "message": "Ajouter un pseudo" + }, "addAcquiredTokens": { "message": "Ajouter les jetons que vous avez acquis par l'intermédiaire de MetaMask" }, "addAlias": { "message": "Ajouter un alias" }, + "addContact": { + "message": "Ajouter un contact" + }, + "addCustomToken": { + "message": "Ajouter un jeton personnalisé" + }, + "addCustomTokenByContractAddress": { + "message": "Vous ne trouvez pas de jeton ? Vous pouvez ajouter manuellement n’importe quel jeton avec son adresse par copier-coller. Les adresses des contrats de jetons sont disponibles sur $1.", + "description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum" + }, + "addEthereumChainConfirmationDescription": { + "message": "Vous ne trouvez pas un jeton ? Vous pouvez ajouter manuellement n’importe quel jeton en copiant-collant son adresse. Les adresses des contrats de jetons sont disponibles sur $1." + }, + "addEthereumChainConfirmationRisks": { + "message": "MetaMask ne vérifie pas les réseaux personnalisés." + }, + "addEthereumChainConfirmationRisksLearnMore": { + "message": "En savoir plus sur $1.", + "description": "$1 is a link with text that is provided by the 'addEthereumChainConfirmationRisksLearnMoreLink' key" + }, + "addEthereumChainConfirmationRisksLearnMoreLink": { + "message": "les risques de fraude et de sécurité des réseaux", + "description": "Link text for the 'addEthereumChainConfirmationRisksLearnMore' translation key" + }, + "addEthereumChainConfirmationTitle": { + "message": "Autoriser ce site à ajouter un réseau ?" + }, + "addFriendsAndAddresses": { + "message": "Ajoutez uniquement des amis et des adresses de confiance" + }, + "addMemo": { + "message": "Ajouter un mémo" + }, + "addNFT": { + "message": "Ajouter un NFT" + }, "addNetwork": { "message": "Ajouter un réseau" }, @@ -50,15 +158,80 @@ "addToken": { "message": "Ajouter un jeton" }, + "address": { + "message": "Adresse" + }, + "addressBookIcon": { + "message": "Icône du carnet d’adresses" + }, "advanced": { "message": "Paramètres avancés" }, + "advancedBaseGasFeeToolTip": { + "message": "Lorsque votre transaction est intégrée au bloc, toute différence entre vos frais de base maximaux et les frais de base réels vous sera remboursée. Le montant total est calculé comme suit : frais de base maximaux (en GWEI) × limite de carburant." + }, + "advancedGasFeeDefaultOptIn": { + "message": "Enregistrer ces $1 comme valeur par défaut pour « Avancé »" + }, + "advancedGasFeeDefaultOptOut": { + "message": "Toujours utiliser par défaut ces valeurs et les paramètres avancés." + }, + "advancedGasFeeModalTitle": { + "message": "Frais de carburant avancés" + }, + "advancedGasPriceTitle": { + "message": "Prix du gaz" + }, "advancedOptions": { "message": "Options avancées" }, + "advancedPriorityFeeToolTip": { + "message": "Les frais de priorité (aussi appelés « pourboire du mineur ») vont directement aux mineurs et les incitent à accorder la priorité à votre transaction." + }, "advancedSettingsDescription": { "message": "Accédez aux fonctionnalités pour les développeurs, téléchargez State Logs, réinitialisez votre compte, configurez testnets et personnalisez RPC" }, + "affirmAgree": { + "message": "Je suis d’accord" + }, + "aggregatorFeeCost": { + "message": "Frais de réseau de l’agrégateur" + }, + "alertDisableTooltip": { + "message": "Vous pouvez modifier ceci dans « Paramètres > Alertes »" + }, + "alertSettingsUnconnectedAccount": { + "message": "Navigation sur un site Web avec un compte non connecté sélectionné" + }, + "alertSettingsUnconnectedAccountDescription": { + "message": "Cette alerte s’affiche dans le pop-up lorsque vous naviguez sur un site web3 connecté, mais que le compte actuellement sélectionné n’est pas connecté." + }, + "alertSettingsWeb3ShimUsage": { + "message": "Lorsqu’un site Web tente d’utiliser l’API window.web3 supprimée" + }, + "alertSettingsWeb3ShimUsageDescription": { + "message": "Cette alerte s’affiche dans le pop-up lorsque vous naviguez sur un site qui tente d’utiliser l’API window.web3 supprimée, et qui peut par conséquent être défaillant." + }, + "alerts": { + "message": "Alertes" + }, + "alertsSettingsDescription": { + "message": "Activez ou désactivez chaque alerte" + }, + "allowExternalExtensionTo": { + "message": "Autoriser cette extension externe à :" + }, + "allowSpendToken": { + "message": "Donner l’autorisation d’accéder à votre $1 ?", + "description": "$1 is the symbol of the token that are requesting to spend" + }, + "allowThisSiteTo": { + "message": "Autoriser ce site à :" + }, + "allowWithdrawAndSpend": { + "message": "Permettre à $1 de retirer et de dépenser jusqu’au montant suivant :", + "description": "The url of the site that requested permission to 'withdraw and spend'" + }, "amount": { "message": "Montant" }, @@ -78,15 +251,37 @@ "message": "MetaMask Flask", "description": "The name of the application (Flask)" }, + "approvalAndAggregatorTxFeeCost": { + "message": "Approbation et frais du réseau d’agrégateur" + }, + "approvalTxGasCost": { + "message": "Approbation du coût de carburant Tx" + }, "approve": { "message": "Approuver" }, + "approveButtonText": { + "message": "Approuver" + }, + "approveSpendLimit": { + "message": "Approuver la limite de dépenses de $1", + "description": "The token symbol that is being approved" + }, "approved": { "message": "Approuvé" }, + "approvedAmountWithColon": { + "message": "Montant approuvé :" + }, "asset": { "message": "Actif" }, + "assetOptions": { + "message": "Options d’actifs" + }, + "assets": { + "message": "Actifs" + }, "attemptToCancel": { "message": "Tenter d'annuler ?" }, @@ -96,6 +291,12 @@ "attemptingConnect": { "message": "Tentative de connexion au réseau" }, + "attributions": { + "message": "Attributions" + }, + "authorizedPermissions": { + "message": "Vous avez accordé les autorisations suivantes" + }, "autoLockTimeLimit": { "message": "Minuterie de déconnexion automatique (minutes)" }, @@ -126,9 +327,49 @@ "balanceOutdated": { "message": "Le solde peut ne pas être à jour" }, + "baseFee": { + "message": "Frais de base" + }, "basic": { "message": "Général" }, + "betaMetamaskDescription": { + "message": "MetaMask est un portefeuille sécurisé utilisé par des millions de personnes qui rend l’univers du web3 accessible à toutes et à tous." + }, + "betaMetamaskDescriptionExplanation": { + "message": "Utilisez cette version pour tester les futures fonctionnalités avant leur lancement. Votre utilisation et vos commentaires nous aident à développer la meilleure version possible de MetaMask. Votre utilisation de MetaMask Beta est conditionnée par notre norme $1, ainsi que par notre $2. En tant que version bêta, les risques de bogues peuvent être plus élevés. En continuant, vous acceptez et reconnaissez ces risques, ainsi que ceux mentionnés dans nos Conditions d’utilisation et nos Conditions bêta.", + "description": "$1 represents localization item betaMetamaskDescriptionExplanationTermsLinkText. $2 represents localization item betaMetamaskDescriptionExplanationBetaTermsLinkText" + }, + "betaMetamaskDescriptionExplanationBetaTermsLinkText": { + "message": "Conditions bêta supplémentaires" + }, + "betaMetamaskDescriptionExplanationTermsLinkText": { + "message": "Conditions d’utilisation" + }, + "betaMetamaskVersion": { + "message": "Version MetaMask Beta" + }, + "betaWelcome": { + "message": "Bienvenue sur MetaMask Bêta" + }, + "blockExplorerAccountAction": { + "message": "Compte", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Account in Explorer" + }, + "blockExplorerAssetAction": { + "message": "Actif", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Asset in Explorer" + }, + "blockExplorerSwapAction": { + "message": "Swap", + "description": "This is used with viewOnEtherscan e.g View Swap on Etherscan" + }, + "blockExplorerUrl": { + "message": "URL de l’explorateur de blocs" + }, + "blockExplorerUrlDefinition": { + "message": "L’URL utilisée comme explorateur de blocs pour ce réseau." + }, "blockExplorerView": { "message": "Afficher le compte à $1", "description": "$1 replaced by URL for custom block explorer" @@ -139,15 +380,48 @@ "browserNotSupported": { "message": "Votre navigateur internet n'est pas supporté..." }, + "buildContactList": { + "message": "Créez votre liste de contacts" + }, + "builtAroundTheWorld": { + "message": "MetaMask est conçu et établi dans le monde entier." + }, + "busy": { + "message": "Occupé" + }, + "buy": { + "message": "Acheter" + }, + "buyWithTransak": { + "message": "Achetez des ETH avec Transak" + }, + "buyWithTransakDescription": { + "message": "Transak prend en charge les cartes de débit et les virements bancaires (en fonction de l’emplacement) dans plus de 59 pays. Les ETH sont ensuite déposés sur votre compte MetaMask." + }, "buyWithWyre": { "message": "Acheter ETH avec Wyre" }, "buyWithWyreDescription": { "message": "Wyre vous permet d'utiliser une carte de crédit pour déposer ETH directement sur votre compte MetaMask." }, + "bytes": { + "message": "Octets" + }, + "canToggleInSettings": { + "message": "Vous pouvez réactiver cette notification dans Paramètres -> Alertes." + }, "cancel": { "message": "Annuler" }, + "cancelEdit": { + "message": "Annuler la modification" + }, + "cancelPopoverTitle": { + "message": "Annuler la transaction" + }, + "cancelSpeedUp": { + "message": "annuler ou accélérer une transaction." + }, "cancellationGasFee": { "message": "Frais en gas de l'annulation" }, @@ -157,9 +431,19 @@ "chainId": { "message": "ID de chaîne" }, + "chainIdDefinition": { + "message": "L’ID de chaîne utilisé pour signer les transactions pour ce réseau." + }, + "chainIdExistsErrorMsg": { + "message": "Cet ID de chaîne est actuellement utilisé par le réseau $1." + }, "chromeRequiredForHardwareWallets": { "message": "Pour connecter votre portefeuille hardware, vous devez utiliser MetaMask pour Google Chrome." }, + "clickToConnectLedgerViaWebHID": { + "message": "Cliquez ici pour connecter votre Ledger via WebHID", + "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" + }, "clickToRevealSeed": { "message": "Cliquez ici pour révéler des mots secrets" }, @@ -172,21 +456,86 @@ "confirmPassword": { "message": "Confirmer le mot de passe" }, + "confirmRecoveryPhrase": { + "message": "Confirmer la Phrase secrète de récupération" + }, "confirmSecretBackupPhrase": { "message": "Confirmez votre phrase mnémotechnique " }, "confirmed": { "message": "Confirmé" }, + "confusableUnicode": { + "message": "« $1 » est similaire à « $2 »." + }, + "confusableZeroWidthUnicode": { + "message": "Caractère de largeur nulle trouvé." + }, + "confusingEnsDomain": { + "message": "Nous avons détecté un caractère pouvant prêter à confusion dans le nom de l’ENS. Vérifiez le nom de l’ENS pour éviter toute fraude potentielle." + }, "congratulations": { "message": "Félicitations" }, "connect": { "message": "Connecter" }, + "connectAccountOrCreate": { + "message": "Connecter un compte ou en créer un nouveau" + }, "connectHardwareWallet": { "message": "Connecter un portefeuille hardware" }, + "connectManually": { + "message": "Se connecter manuellement au site actuel" + }, + "connectTo": { + "message": "Connectez-vous à $1", + "description": "$1 is the name/origin of a web3 site/application that the user can connect to metamask" + }, + "connectToAll": { + "message": "Connectez-vous à vos $1", + "description": "$1 will be replaced by the translation of connectToAllAccounts" + }, + "connectToAllAccounts": { + "message": "comptes", + "description": "will replace $1 in connectToAll, completing the sentence 'connect to all of your accounts', will be text that shows list of accounts on hover" + }, + "connectToMultiple": { + "message": "Connectez-vous à $1", + "description": "$1 will be replaced by the translation of connectToMultipleNumberOfAccounts" + }, + "connectToMultipleNumberOfAccounts": { + "message": "$1 comptes", + "description": "$1 is the number of accounts to which the web3 site/application is asking to connect; this will substitute $1 in connectToMultiple" + }, + "connectWithMetaMask": { + "message": "Connectez-vous avec MetaMask" + }, + "connectedAccountsDescriptionPlural": { + "message": "Vous avez $1 comptes connectés à ce site.", + "description": "$1 is the number of accounts" + }, + "connectedAccountsDescriptionSingular": { + "message": "Vous avez 1 compte connecté à ce site." + }, + "connectedAccountsEmptyDescription": { + "message": "MetaMask n’est pas connecté à ce site. Pour vous connecter à un site web3, cliquez sur le bouton de connexion." + }, + "connectedSites": { + "message": "Sites connectés" + }, + "connectedSitesDescription": { + "message": "$1 est connecté à ces sites. Ils peuvent voir l’adresse de votre compte.", + "description": "$1 is the account name" + }, + "connectedSitesEmptyDescription": { + "message": "$1 n’est connecté à aucun site.", + "description": "$1 is the account name" + }, + "connecting": { + "message": "Connexion…" + }, "connectingTo": { "message": "Connexion à $1" }, @@ -205,9 +554,33 @@ "connectingToRopsten": { "message": "Connexion au réseau de test Ropsten" }, + "contactUs": { + "message": "Nous contacter" + }, + "contacts": { + "message": "Contacts" + }, + "contactsSettingsDescription": { + "message": "Ajoutez, modifiez, supprimez et gérez vos contacts" + }, + "continue": { + "message": "Continuer" + }, + "continueToTransak": { + "message": "Continuer vers Transak" + }, "continueToWyre": { "message": "Continuer vers Wyre" }, + "contract": { + "message": "Contrat" + }, + "contractAddress": { + "message": "Adresse du contrat" + }, + "contractAddressError": { + "message": "Vous envoyez des jetons à l’adresse de contrat des jetons. Cela peut entraîner la perte des jetons en question." + }, "contractDeployment": { "message": "Déploiement de contrat" }, @@ -223,6 +596,9 @@ "copyPrivateKey": { "message": "Ceci est votre clé privée (cliquez pour copier)" }, + "copyRawTransactionData": { + "message": "Copier les données brutes de la transaction" + }, "copyToClipboard": { "message": "Copier dans le presse-papier" }, @@ -238,30 +614,104 @@ "createAccount": { "message": "Créer un compte" }, + "createNewWallet": { + "message": "Créer un nouveau portefeuille" + }, "createPassword": { "message": "Créer un mot de passe" }, "currencyConversion": { "message": "Conversion des devises" }, + "currencySymbol": { + "message": "Symbole de la devise" + }, + "currencySymbolDefinition": { + "message": "Le code mnémo affiché pour la devise de ce réseau." + }, + "currentAccountNotConnected": { + "message": "Votre compte actuel n’est pas connecté" + }, + "currentExtension": { + "message": "Page d’extension actuelle" + }, "currentLanguage": { "message": "Langue actuelle" }, + "currentTitle": { + "message": "Actuel :" + }, + "currentlyUnavailable": { + "message": "Indisponible sur ce réseau" + }, + "custom": { + "message": "Paramètres avancés" + }, "customGas": { "message": "Personnaliser le gaz" }, + "customGasSettingToolTipMessage": { + "message": "Utilisez $1 pour personnaliser le prix du carburant. Cela peut porter à confusion si vous n’en avez pas l’habitude. Agissez avec prudence !", + "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold fontweight" + }, "customGasSubTitle": { "message": "Augmenter le tarif peut faire baisser le temps de traitement, mais cela n'est pas garanti." }, + "customSpendLimit": { + "message": "Limite de dépenses personnalisée" + }, "customToken": { "message": "Jeton personnalisé" }, + "dappSuggested": { + "message": "Site suggéré" + }, + "dappSuggestedGasSettingToolTipMessage": { + "message": "$1 a suggéré ce prix.", + "description": "$1 is url for the dapp that has suggested gas settings" + }, + "dappSuggestedShortLabel": { + "message": "Site" + }, + "dappSuggestedTooltip": { + "message": "$1 a recommandé ce prix.", + "description": "$1 represents the Dapp's origin" + }, + "data": { + "message": "Données" + }, + "dataBackupFoundInfo": { + "message": "Certaines données de votre compte ont été sauvegardées lors d’une installation précédente de MetaMask. Il peut s’agir de vos paramètres, contacts et jetons. Voulez-vous restaurer ces données maintenant ?" + }, + "dataHex": { + "message": "Hex" + }, "decimal": { "message": "Décimales de précision" }, "decimalsMustZerotoTen": { "message": "Les décimales doivent être plus grandes que 0 et inférieures à 36." }, + "decrypt": { + "message": "Décrypter" + }, + "decryptCopy": { + "message": "Copier le message crypté" + }, + "decryptInlineError": { + "message": "Ce message ne peut pas être décrypté suite à une erreur : $1", + "description": "$1 is error message" + }, + "decryptMessageNotice": { + "message": "$1 souhaite lire ce message pour compléter votre action", + "description": "$1 is the web3 site name" + }, + "decryptMetamask": { + "message": "Décrypter le message" + }, + "decryptRequest": { + "message": "Décrypter la demande" + }, "delete": { "message": "Supprimer" }, @@ -277,6 +727,9 @@ "depositEther": { "message": "Déposer de l'Ether" }, + "description": { + "message": "Description" + }, "details": { "message": "Détails" }, @@ -286,9 +739,39 @@ "directDepositEtherExplainer": { "message": "Si vous avez déjà de l'Ether, le moyen le plus rapide d'obtenir des Ether dans votre nouveau portefeuille est par dépôt direct." }, + "disconnect": { + "message": "Déconnecter" + }, + "disconnectAllAccounts": { + "message": "Déconnecter tous les comptes" + }, + "disconnectAllAccountsConfirmationDescription": { + "message": "Voulez-vous vraiment vous déconnecter ? Vous risquez de perdre certaines fonctionnalités du site." + }, + "disconnectPrompt": { + "message": "Déconnecter $1" + }, + "disconnectThisAccount": { + "message": "Déconnecter ce compte" + }, + "dismiss": { + "message": "Annuler" + }, + "dismissReminderDescriptionField": { + "message": "Activez cette option pour annuler le message de rappel de sauvegarde de la Phrase secrète de récupération. Nous vous recommandons fortement de sauvegarder votre Phrase secrète de récupération pour éviter toute perte de fonds" + }, + "dismissReminderField": { + "message": "Annuler le rappel de sauvegarde de la Phrase secrète de récupération" + }, + "domain": { + "message": "Domaine" + }, "done": { "message": "Terminé" }, + "dontShowThisAgain": { + "message": "Ne plus afficher ceci" + }, "downloadGoogleChrome": { "message": "Télécharger Google Chrome" }, @@ -304,9 +787,154 @@ "edit": { "message": "Modifier" }, + "editANickname": { + "message": "Modifier le pseudo" + }, + "editAddressNickname": { + "message": "Modifier le pseudo de l’adresse" + }, "editContact": { "message": "Modifier le contact" }, + "editGasEducationButtonText": { + "message": "Comment puis-je choisir ?" + }, + "editGasEducationHighExplanation": { + "message": "Ce choix est préférable pour les transactions urgentes (comme les swaps), car cela multiplie les chances de réussite de la transaction. Si le traitement d’un swap prend trop de temps, il peut échouer et vous faire perdre une partie de vos frais de carburant." + }, + "editGasEducationLowExplanation": { + "message": "Des frais de carburant inférieurs ne doivent être utilisés que lorsque le temps de traitement est moins important. En effet, il est difficile de prévoir quand (ou si) votre transaction aboutira." + }, + "editGasEducationMediumExplanation": { + "message": "Des frais de carburant modérés conviennent pour l’envoi, le retrait ou d’autres transactions pour lesquelles le facteur temps n’est pas décisif. Ce paramètre permet le plus souvent de conclure une transaction avec succès." + }, + "editGasEducationModalIntro": { + "message": "Le choix du bon prix de carburant dépend du type de transaction et de son importance à vos yeux." + }, + "editGasEducationModalTitle": { + "message": "Comment choisir ?" + }, + "editGasFeeModalTitle": { + "message": "Modifier le prix du carburant" + }, + "editGasHigh": { + "message": "Élevé" + }, + "editGasLimitOutOfBounds": { + "message": "La limite de carburant doit être d’au moins $1" + }, + "editGasLimitOutOfBoundsV2": { + "message": "La limite de carburant doit être supérieure à $1 et inférieure à $2", + "description": "$1 is the minimum limit for gas and $2 is the maximum limit" + }, + "editGasLimitTooltip": { + "message": "La limite de carburant correspond au maximum d’unités de carburant que vous consentez à utiliser. Les unités de carburant servent de multiplicateur aux « Frais de priorité maximaux » et aux « Frais maximaux »." + }, + "editGasLow": { + "message": "Bas" + }, + "editGasMaxBaseFeeGWEIImbalance": { + "message": "Les frais de base maximaux ne peuvent pas être inférieurs aux frais de priorité" + }, + "editGasMaxBaseFeeHigh": { + "message": "Les frais de base maximaux sont plus élevés que nécessaire" + }, + "editGasMaxBaseFeeLow": { + "message": "Les frais de base maximaux sont faibles par rapport aux conditions actuelles du réseau" + }, + "editGasMaxFeeHigh": { + "message": "Les frais maximaux sont plus élevés que nécessaire" + }, + "editGasMaxFeeLow": { + "message": "Les frais maximaux sont trop bas par rapport aux conditions du réseau" + }, + "editGasMaxFeePriorityImbalance": { + "message": "Les frais maximaux ne peuvent pas être inférieurs aux frais de priorité maximaux" + }, + "editGasMaxFeeTooltip": { + "message": "Les frais maximaux correspondent au montant le plus élevé que vous aurez à payer (frais de base + frais de priorité)." + }, + "editGasMaxPriorityFeeBelowMinimum": { + "message": "Les frais de priorité maximaux doivent être supérieurs à 0 GWEI" + }, + "editGasMaxPriorityFeeBelowMinimumV2": { + "message": "Les frais de priorité doivent être supérieurs à 0." + }, + "editGasMaxPriorityFeeHigh": { + "message": "Les frais de priorité maximaux sont plus élevés que nécessaire. Vous risquez de payer plus que nécessaire." + }, + "editGasMaxPriorityFeeHighV2": { + "message": "Les frais de priorité sont plus élevés que nécessaire. Vous risquez de payer plus que nécessaire" + }, + "editGasMaxPriorityFeeLow": { + "message": "Les frais de priorité maximaux sont faibles par rapport aux conditions actuelles du réseau" + }, + "editGasMaxPriorityFeeLowV2": { + "message": "Les frais de priorité sont faibles par rapport aux conditions actuelles du réseau" + }, + "editGasMaxPriorityFeeTooltip": { + "message": "Les frais de priorité maximaux (aussi appelés « pourboire du mineur ») vont directement aux mineurs et les incitent à accorder la priorité à votre transaction. Vous paierez le plus souvent votre réglage maximal" + }, + "editGasMedium": { + "message": "Moyen" + }, + "editGasPriceTooLow": { + "message": "Les frais de carburant doivent être supérieurs à 0" + }, + "editGasPriceTooltip": { + "message": "Ce réseau exige un champ « prix du carburant » lors de la soumission d’une transaction. Le prix du carburant correspond au montant que vous paierez par unité de carburant." + }, + "editGasSubTextAmountLabel": { + "message": "Montant maximal :", + "description": "This is meant to be used as the $1 substitution editGasSubTextAmount" + }, + "editGasSubTextFeeLabel": { + "message": "Frais maximaux :" + }, + "editGasTitle": { + "message": "Modifier la priorité" + }, + "editGasTooLow": { + "message": "Délai de traitement inconnu" + }, + "editGasTooLowTooltip": { + "message": "Vos frais maximaux ou vos frais de priorité maximaux risquent d’être faibles compte tenu des conditions actuelles du marché. Nous ignorons quand (ou si) votre transaction sera traitée. " + }, + "editGasTooLowWarningTooltip": { + "message": "Cela réduit vos frais maximaux, mais si le trafic réseau augmente, votre transaction peut être retardée ou ne pas aboutir." + }, + "editNonceField": { + "message": "Modifier le nonce" + }, + "editNonceMessage": { + "message": "Il s’agit d’une fonction avancée, à utiliser avec précaution." + }, + "editPermission": { + "message": "Modifier l’autorisation" + }, + "enableAutoDetect": { + "message": " Activer la détection automatique" + }, + "enableFromSettings": { + "message": " Activez-la depuis les Paramètres." + }, + "enableOpenSeaAPI": { + "message": "Activer l’API OpenSea" + }, + "enableOpenSeaAPIDescription": { + "message": "Utilisez l’API OpenSea pour récupérer les données de NFT. La détection automatique de NFT repose sur l’API OpenSea et ne sera pas disponible si elle est désactivée." + }, + "enableToken": { + "message": "activer $1", + "description": "$1 is a token symbol, e.g. ETH" + }, + "encryptionPublicKeyNotice": { + "message": "$1 aimerait avoir votre clé publique de cryptage. En y consentant, ce site sera en mesure de vous composer des messages cryptés.", + "description": "$1 is the web3 site name" + }, + "encryptionPublicKeyRequest": { + "message": "Demander la clé publique de cryptage" + }, "endOfFlowMessage1": { "message": "Vous avez réussi l'essai : gardez votre phrase de départ en sécurité, c'est de votre responsabilité !" }, @@ -328,48 +956,141 @@ "endOfFlowMessage6": { "message": "Si vous avez besoin de sauvegarder à nouveau votre phrase de départ, vous pouvez la trouver dans Paramètres -> Sécurité." }, + "endOfFlowMessage7": { + "message": "Si vous avez des questions ou si vous constatez une quelconque anomalie, contactez notre service d’assistance $1.", + "description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." + }, "endOfFlowMessage8": { "message": "MetaMask ne peut pas récupérer votre phrase de départ. Renseignez-vous davantage." }, "endOfFlowMessage9": { "message": "En savoir plus." }, + "endpointReturnedDifferentChainId": { + "message": "Le point terminal a renvoyé un ID de chaîne différent : $1", + "description": "$1 is the return value of eth_chainId from an RPC endpoint" + }, + "ensIllegalCharacter": { + "message": "Caractère invalide pour l’ENS." + }, "ensNotFoundOnCurrentNetwork": { "message": "Nom ENS non trouvé sur le réseau actuel. Essayez de passer au réseau Ethereum principal." }, + "ensNotSupportedOnNetwork": { + "message": "Le réseau ne prend pas en charge l’ENS" + }, "ensRegistrationError": { "message": "Erreur dans l'enregistrement du nom ENS" }, + "ensUnknownError": { + "message": "La recherche d’ENS a échoué." + }, "enterAnAlias": { "message": "Saisissez un pseudonyme" }, + "enterMaxSpendLimit": { + "message": "Saisissez la limite de dépenses maximale" + }, "enterPassword": { "message": "Entrez votre mot de passe" }, "enterPasswordContinue": { "message": "Entrez votre mot de passe pour continuer" }, + "errorCode": { + "message": "Code : $1", + "description": "Displayed error code for debugging purposes. $1 is the error code" + }, + "errorDetails": { + "message": "Détails de l’erreur", + "description": "Title for collapsible section that displays error details for debugging purposes" + }, + "errorMessage": { + "message": "Message : $1", + "description": "Displayed error message for debugging purposes. $1 is the error message" + }, + "errorName": { + "message": "Code : $1", + "description": "Displayed error name for debugging purposes. $1 is the error name" + }, + "errorPageMessage": { + "message": "Essayez à nouveau en rechargeant la page, ou contactez le service d’assistance $1.", + "description": "Message displayed on generic error page in the fullscreen or notification UI, $1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." + }, + "errorPagePopupMessage": { + "message": "Essayez à nouveau en fermant puis en rouvrant le pop-up, ou contactez le service d’assistance $1.", + "description": "Message displayed on generic error page in the popup UI, $1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." + }, + "errorPageTitle": { + "message": "MetaMask a rencontré une erreur", + "description": "Title of generic error page" + }, + "errorStack": { + "message": "Stack :", + "description": "Title for error stack, which is displayed for debugging purposes" + }, "estimatedProcessingTimes": { "message": "Délais de traitement estimés" }, + "ethGasPriceFetchWarning": { + "message": "Le prix de carburant de sauvegarde est fourni, car le service principal d’estimation du carburant est momentanément indisponible." + }, + "eth_accounts": { + "message": "Consultez l’adresse, le solde du compte et l’activité, et lancez des transactions", + "description": "The description for the `eth_accounts` permission" + }, "ethereumPublicAddress": { "message": "Adresse publique d'Ethereum" }, + "etherscan": { + "message": "Etherscan" + }, "etherscanView": { "message": "Afficher le compte sur Etherscan" }, + "etherscanViewOn": { + "message": "Afficher sur Etherscan" + }, "expandView": { "message": "Agrandir la vue" }, + "experimental": { + "message": "Expérimental" + }, + "experimentalSettingsDescription": { + "message": "Détection de jetons et plus encore" + }, "exportPrivateKey": { "message": "Exporter la clé privée" }, + "externalExtension": { + "message": "Extension externe" + }, + "extraApprovalGas": { + "message": "+$1 de carburant approuvé", + "description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas" + }, "failed": { "message": "Échec" }, + "failedToFetchChainId": { + "message": "Impossible de récupérer l’ID de la chaîne. Votre URL de RPC est-elle correcte ?" + }, + "failureMessage": { + "message": "Un problème est survenu et nous n’avons pas pu mener à bien l’action" + }, + "fakeTokenWarning": { + "message": "Tout un chacun peut créer un jeton, y compris créer de fausses copies de jetons existants. En savoir plus sur $1" + }, "fast": { "message": "Rapide" }, + "fastest": { + "message": "Plus rapide" + }, + "feeAssociatedRequest": { + "message": "Des frais sont associés à cette demande." + }, "fiat": { "message": "FIAT", "description": "Exchange type" @@ -378,6 +1099,21 @@ "message": "L'importation de fichier ne fonctionne pas? Cliquez ici!", "description": "Helps user import their account from a JSON file" }, + "flaskSnapSettingsCardButtonCta": { + "message": "Voir les détails", + "description": "Call to action a user can take to see more information about the Snap that is installed" + }, + "flaskSnapSettingsCardDateAddedOn": { + "message": "Ajouté le", + "description": "Start of the sentence describing when and where snap was added" + }, + "flaskSnapSettingsCardFrom": { + "message": "de", + "description": "Part of the sentence describing when and where snap was added" + }, + "followUsOnTwitter": { + "message": "Suivez-nous sur Twitter" + }, "forbiddenIpfsGateway": { "message": "IPFS Gateway Interdite: veuillez spécifier une gateway CID" }, @@ -387,9 +1123,29 @@ "from": { "message": "de" }, + "fromAddress": { + "message": "De : $1", + "description": "$1 is the address to include in the From label. It is typically shortened first using shortenAddress" + }, + "functionApprove": { + "message": "Fonction : approuver" + }, "functionType": { "message": "Type de fonction" }, + "gas": { + "message": "Carburant" + }, + "gasDisplayAcknowledgeDappButtonText": { + "message": "Modifier le prix de carburant suggéré" + }, + "gasDisplayDappWarning": { + "message": "Ce prix de carburant a été suggéré par $1. Si vous n’en tenez pas compte, vous risquez de rencontrer des difficultés lors de votre transaction. Veuillez contacter $1 pour toute question.", + "description": "$1 represents the Dapp's origin" + }, + "gasEstimatesUnavailableWarning": { + "message": "Nos estimations basses, moyennes et hautes ne sont pas disponibles." + }, "gasLimit": { "message": "Quantité max. de gaz" }, @@ -399,18 +1155,77 @@ "gasLimitTooLow": { "message": "La quantité max. de gaz doit être d'au moins 21000" }, + "gasLimitTooLowWithDynamicFee": { + "message": "La limite de carburant doit être d’au moins $1", + "description": "$1 is the custom gas limit, in decimal." + }, + "gasLimitV2": { + "message": "Limite de carburant" + }, + "gasOption": { + "message": "Option de carburant" + }, "gasPrice": { "message": "Prix du gaz (GWEI)" }, + "gasPriceExcessive": { + "message": "Vos frais de carburant sont inutilement élevés. Songez à les réduire." + }, + "gasPriceExcessiveInput": { + "message": "Les frais de carburant sont excessifs" + }, "gasPriceExtremelyLow": { "message": "Prix de l'essence extrêmement bas" }, + "gasPriceFetchFailed": { + "message": "L’estimation du prix du carburant a échoué en raison d’une erreur de réseau." + }, "gasPriceInfoTooltipContent": { "message": "Le prix du gaz spécifie la quantité d'Ethers que vous acceptez de payer pour chaque unité de gaz." }, + "gasTimingHoursShort": { + "message": "$1 h", + "description": "$1 represents a number of hours" + }, + "gasTimingMinutes": { + "message": "$1 minutes", + "description": "$1 represents a number of minutes" + }, + "gasTimingMinutesShort": { + "message": "$1 min", + "description": "$1 represents a number of minutes" + }, + "gasTimingNegative": { + "message": "Peut-être dans $1", + "description": "$1 represents an amount of time" + }, + "gasTimingPositive": { + "message": "Probablement dans < $1", + "description": "$1 represents an amount of time" + }, + "gasTimingSeconds": { + "message": "$1 secondes", + "description": "$1 represents a number of seconds" + }, + "gasTimingSecondsShort": { + "message": "$1 s", + "description": "$1 represents a number of seconds" + }, + "gasTimingVeryPositive": { + "message": "Très probablement dans < $1", + "description": "$1 represents an amount of time" + }, "gasUsed": { "message": "Essence utilisée" }, + "gdprMessage": { + "message": "Ces données sont agrégées et sont donc anonymes aux fins du règlement général sur la protection des données (UE) 2016/679. Pour plus d’informations concernant nos pratiques en matière de confidentialité, veuillez consulter nos $1.", + "description": "$1 refers to the gdprMessagePrivacyPolicy message, the translation of which is meant to be used exclusively in the context of gdprMessage" + }, + "gdprMessagePrivacyPolicy": { + "message": "Politique de confidentialité ici", + "description": "this translation is intended to be exclusively used as the replacement for the $1 in the gdprMessage translation" + }, "general": { "message": "Général" }, @@ -427,15 +1242,31 @@ "getStarted": { "message": "Démarrer" }, + "goBack": { + "message": "Retour" + }, "goerli": { "message": "Réseau de test Goerli" }, + "grantedToWithColon": { + "message": "Accordé à :" + }, "happyToSeeYou": { "message": "Nous sommes ravis de vous voir." }, + "hardware": { + "message": "Matériel" + }, "hardwareWalletConnected": { "message": "Portefeuille hardware connecté" }, + "hardwareWalletLegacyDescription": { + "message": "(hérité)", + "description": "Text representing the MEW path" + }, + "hardwareWalletSupportLinkConversion": { + "message": "cliquez ici" + }, "hardwareWallets": { "message": "Connecter un portefeuille hardware" }, @@ -455,9 +1286,32 @@ "hideTokenPrompt": { "message": "Masquer le jeton?" }, + "hideTokenSymbol": { + "message": "Masquer $1", + "description": "$1 is the symbol for a token (e.g. 'DAI')" + }, + "hideZeroBalanceTokens": { + "message": "Masquer les jetons sans solde" + }, + "high": { + "message": "Agressif" + }, + "highGasSettingToolTipDialog": { + "message": "Probabilité élevée, même sur des marchés volatils" + }, + "highGasSettingToolTipMessage": { + "message": "Utilisez $1 pour couvrir les envolées du trafic réseau dues à des événements tels que les chutes de NFT populaires.", + "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" + }, + "highLowercase": { + "message": "élevé" + }, "history": { "message": "Historique" }, + "id": { + "message": "ID" + }, "import": { "message": "Importer", "description": "Button to import an account from a selected file" @@ -465,25 +1319,76 @@ "importAccount": { "message": "Importer un compte" }, + "importAccountError": { + "message": "Erreur d’importation de compte." + }, + "importAccountLinkText": { + "message": "importer en utilisant la Phrase secrète de récupération" + }, "importAccountMsg": { "message": " Les comptes importés ne seront pas associés avec votre phrase Seed que vous avez créé au départ dans MetaMask. Obtenir plus d'information sur les comptes importés" }, "importAccountSeedPhrase": { "message": "Importez un compte avec une phrase mnémotechnique" }, + "importAccountText": { + "message": "ou $1", + "description": "$1 represents the text from `importAccountLinkText` as a link" + }, + "importExistingWalletDescription": { + "message": "Saisissez la Phrase secrète de récupération (aussi appelée « phrase mnémonique » ou « seed ») qui vous a été attribuée lors de la création de votre portefeuille. $1", + "description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link" + }, + "importExistingWalletTitle": { + "message": "Importer un portefeuille existant avec la Phrase secrète de récupération" + }, + "importMyWallet": { + "message": "Importer mon portefeuille" + }, + "importNFTs": { + "message": "Importer des NFT" + }, + "importTokenQuestion": { + "message": "Importer un jeton ?" + }, + "importTokenWarning": { + "message": "Tout un chacun peut créer un jeton avec n’importe quel nom, y compris de fausses versions de jetons existants. Ajoutez et échangez avec prudence !" + }, + "importTokens": { + "message": "importer des jetons" + }, + "importTokensCamelCase": { + "message": "Importer des jetons" + }, "importWallet": { "message": "Importer le portefeuille" }, + "importYourExisting": { + "message": "Importez votre portefeuille existant à l’aide d’une Phrase secrète de récupération" + }, "imported": { "message": "Importé", "description": "status showing that an account has been fully loaded into the keyring" }, + "infuraBlockedNotification": { + "message": "MetaMask ne peut pas se connecter à l’hôte de la blockchain. Vérifiez les éventuelles raisons $1.", + "description": "$1 is a clickable link with with text defined by the 'here' key" + }, "initialTransactionConfirmed": { "message": "Votre transaction initiale a été confirmée par le réseau. Cliquez sur OK pour retourner à l'écran précédent." }, "insufficientBalance": { "message": "Solde insuffisant." }, + "insufficientFunds": { + "message": "Fonds insuffisants." + }, + "insufficientFundsForGas": { + "message": "Fonds insuffisants pour le carburant" + }, + "insufficientTokens": { + "message": "Jetons insuffisants." + }, "invalidAddress": { "message": "Adresse invalide" }, @@ -496,9 +1401,38 @@ "invalidBlockExplorerURL": { "message": "URL de l'explorateur de blocs invalide" }, + "invalidChainIdTooBig": { + "message": "ID de chaîne invalide. L’ID de la chaîne est trop grand." + }, + "invalidCustomNetworkAlertContent1": { + "message": "L’ID de la chaîne pour le réseau personnalisé « $1 » doit être saisi à nouveau.", + "description": "$1 is the name/identifier of the network." + }, + "invalidCustomNetworkAlertContent2": { + "message": "Pour vous protéger des fournisseurs de réseau malveillants ou défectueux, les ID de chaîne sont désormais obligatoires pour tous les réseaux personnalisés." + }, + "invalidCustomNetworkAlertContent3": { + "message": "Allez dans Paramètres > Réseau et saisissez l’ID de chaîne. Vous trouverez les ID de chaîne des réseaux les plus courants sur $1.", + "description": "$1 is a link to https://chainid.network" + }, + "invalidCustomNetworkAlertTitle": { + "message": "Réseau personnalisé invalide" + }, + "invalidHexNumber": { + "message": "Numéro hexadécimal invalide." + }, + "invalidHexNumberLeadingZeros": { + "message": "Numéro hexadécimal invalide. Supprimez tous les zéros non significatifs." + }, "invalidIpfsGateway": { "message": "IPFS Gateway Invalide: la valeur doit être une URL valide" }, + "invalidNumber": { + "message": "Numéro invalide. Saisissez un nombre décimal ou hexadécimal avec le préfixe « 0x »." + }, + "invalidNumberLeadingZeros": { + "message": "Numéro invalide. Supprimez tous les zéros non significatifs." + }, "invalidRPC": { "message": "URL RPC invalide" }, @@ -506,33 +1440,112 @@ "message": "Phrase Seed invalide" }, "ipfsGateway": { - "message": "IPFS Gateway" + "message": "Passerelle IPFS" }, "ipfsGatewayDescription": { "message": "Entrez l'URL de la gateway CID IPFS à utiliser pour résoudre les contenus ENS." }, + "jsDeliver": { + "message": "jsDeliver" + }, "jsonFile": { "message": "Fichier JSON", "description": "format for importing an account" }, + "keystone": { + "message": "Keystone" + }, + "keystoneTutorial": { + "message": " (Tutoriels)" + }, "knownAddressRecipient": { "message": "Adresse contractuelle connue." }, + "knownTokenWarning": { + "message": "Cette action modifiera les jetons déjà présents dans votre portefeuille, et risque de favoriser les tentatives d’hameçonnage. N’approuvez que si vous êtes certain·e de vouloir modifier ce que ces jetons représentent." + }, "kovan": { "message": "Réseau de test Kovan" }, + "lastConnected": { + "message": "Dernière connexion" + }, + "layer1Fees": { + "message": "Frais de couche 1 (L1)" + }, + "learmMoreAboutGas": { + "message": "Voulez-vous $1 à propos du carburant ?" + }, + "learnCancelSpeeedup": { + "message": "Découvrir comment $1", + "description": "$1 is link to cancel or speed up transactions" + }, "learnMore": { "message": "En savoir plus" }, + "learnMoreUpperCase": { + "message": "En savoir plus" + }, + "learnScamRisk": { + "message": "hameçonnages et risques de sécurité." + }, "ledgerAccountRestriction": { "message": "Vous devez d'abord utiliser le dernier compte que vous avez créé avant de pouvoir en créer un autre." }, + "ledgerConnectionInstructionCloseOtherApps": { + "message": "Fermez tout autre logiciel connecté à votre appareil, puis cliquez ici pour actualiser." + }, + "ledgerConnectionInstructionHeader": { + "message": "Avant de cliquer sur confirmer :" + }, + "ledgerConnectionInstructionStepFour": { + "message": "Activez les « données de contrat intelligent » ou la « signature aveugle » sur votre dispositif Ledger" + }, + "ledgerConnectionInstructionStepOne": { + "message": "Activez l’option « Utiliser Ledger Live » sous Paramètres > Avancés" + }, + "ledgerConnectionInstructionStepThree": { + "message": "Branchez votre dispositif Ledger et sélectionnez l’appli Ethereum" + }, + "ledgerConnectionInstructionStepTwo": { + "message": "Ouvrez et déverrouillez l’appli Ledger Live" + }, + "ledgerConnectionPreferenceDescription": { + "message": "Personnalisez la façon dont vous souhaitez connecter votre Ledger à MetaMask. $1 est recommandé, mais d’autres options sont disponibles. En savoir plus ici : $2", + "description": "A description that appears above a dropdown where users can select between up to three options - Ledger Live, U2F or WebHID - depending on what is supported in their browser. $1 is the recommended browser option, it will be either WebHID or U2f. $2 is a link to an article where users can learn more, but will be the translation of the learnMore message." + }, + "ledgerDeviceOpenFailureMessage": { + "message": "Le dispositif Ledger n’a pas pu s’ouvrir. Votre Ledger est peut-être connecté à d’autres logiciels. Veuillez fermer Ledger Live ou toute autre appli connectée à votre périphérique Ledger, puis essayez de vous connecter à nouveau." + }, + "ledgerLive": { + "message": "Ledger Live", + "description": "The name of a desktop app that can be used with your ledger device. We can also use it to connect a users Ledger device to MetaMask." + }, + "ledgerLiveApp": { + "message": "Appli Ledger Live" + }, + "ledgerLocked": { + "message": "Impossible de se connecter au dispositif Ledger. Veuillez vous assurer que votre périphérique est déverrouillé et que l’appli Ethereum est ouverte." + }, + "ledgerTimeout": { + "message": "Ledger Live met trop de temps à répondre ou la connexion est interrompue. Assurez-vous que l’appli Ledger Live est bien ouverte et que votre appareil est déverrouillé." + }, + "ledgerTransportChangeWarning": { + "message": "Si l’appli Ledger Live est ouverte, déconnectez toute connexion à celle-ci en cours et fermez l’appli." + }, + "ledgerWebHIDNotConnectedErrorMessage": { + "message": "Le dispositif Ledger n’est pas connecté. Si vous souhaitez le connecter, veuillez cliquer à nouveau sur « Continuer » et approuver la connexion au HID", + "description": "An error message shown to the user during the hardware connect flow." + }, "letsGoSetUp": { "message": "Oui, passons à la configuration !" }, "likeToImportTokens": { "message": "Souhaitez-vous ajouter ces jetons ?" }, + "link": { + "message": "Associer" + }, "links": { "message": "Liens" }, @@ -545,33 +1558,175 @@ "loadingTokens": { "message": "Chargement des jetons..." }, + "localhost": { + "message": "Localhost 8545" + }, "lock": { "message": "Déconnexion" }, + "lockTimeTooGreat": { + "message": "Le temps de verrouillage est trop important" + }, + "low": { + "message": "Bas" + }, + "lowGasSettingToolTipMessage": { + "message": "Utilisez $1 pour attendre un prix inférieur. Les estimations de temps sont nettement moins précises, car les prix sont relativement imprévisibles.", + "description": "$1 is key 'low' separated here so that it can be passed in with bold fontweight" + }, + "lowLowercase": { + "message": "bas" + }, + "lowPriorityMessage": { + "message": "Les transactions ultérieures seront placées en file d’attente après celle-ci. Ce prix a été observé pour la dernière fois il y a un certain temps." + }, "mainnet": { "message": "Réseau principal Ethereum" }, + "makeAnotherSwap": { + "message": "Créer un nouveau swap" + }, + "makeSureNoOneWatching": { + "message": "Assurez-vous que personne ne regarde votre écran", + "description": "Warning to users to be care while creating and saving their new Secret Recovery Phrase" + }, + "max": { + "message": "Max" + }, + "maxBaseFee": { + "message": "Frais de base maximaux" + }, + "maxFee": { + "message": "Frais maximaux" + }, + "maxPriorityFee": { + "message": "Frais de priorité maximaux" + }, + "medium": { + "message": "Marché" + }, + "mediumGasSettingToolTipMessage": { + "message": "Utilisez $1 pour un traitement rapide au prix actuel du marché.", + "description": "$1 is key 'medium' (text: 'Market') separated here so that it can be passed in with bold fontweight" + }, "memo": { "message": "note" }, "memorizePhrase": { "message": "Mémorisez cette phrase." }, + "message": { + "message": "Message" + }, + "metaMaskConnectStatusParagraphOne": { + "message": "Vous avez maintenant davantage de contrôle sur les connexions de vos comptes dans MetaMask." + }, + "metaMaskConnectStatusParagraphThree": { + "message": "Cliquez pour gérer vos comptes connectés." + }, + "metaMaskConnectStatusParagraphTwo": { + "message": "Le bouton d’état de connexion indique si le site Web que vous visitez est connecté à votre compte actuellement sélectionné." + }, "metamaskDescription": { "message": "MetaMask est un coffre sécurisé pour votre identité sur Ethereum." }, + "metamaskSwapsOfflineDescription": { + "message": "MetaMask Swaps est en cours de maintenance. Nous vous invitons à revenir plus tard." + }, "metamaskVersion": { "message": "Version de MetaMask" }, + "metametricsCommitmentsAllowOptOut": { + "message": "Toujours pouvoir vous désinscrire via les Paramètres" + }, + "metametricsCommitmentsAllowOptOut2": { + "message": "Toujours pouvoir se désinscrire via les Paramètres" + }, + "metametricsCommitmentsBoldNever": { + "message": "jamais", + "description": "This string is localized separately from some of the commitments so that we can bold it" + }, + "metametricsCommitmentsIntro": { + "message": "MetaMask :" + }, + "metametricsCommitmentsNeverCollect": { + "message": "Ne collectera jamais vos clés, adresses, transactions, soldes, hachages ou toute autre information personnelle" + }, + "metametricsCommitmentsNeverCollectIP": { + "message": "Ne collectera $1 votre adresse IP complète", + "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" + }, + "metametricsCommitmentsNeverCollectKeysEtc": { + "message": "Ne collectera $1 vos clés, adresses, transactions, soldes, hachages ou toute autre information personnelle", + "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" + }, + "metametricsCommitmentsNeverIP": { + "message": "Ne collectera jamais votre adresse IP complète" + }, + "metametricsCommitmentsNeverSell": { + "message": "Ne vendra jamais de données à des fins lucratives. Jamais !" + }, + "metametricsCommitmentsNeverSellDataForProfit": { + "message": "Ne vendra $1 de données à des fins lucratives. Jamais !", + "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" + }, + "metametricsCommitmentsSendAnonymizedEvents": { + "message": "Enverra des événements de clics et de pages vues anonymisés" + }, + "metametricsHelpImproveMetaMask": { + "message": "Aidez-nous à améliorer MetaMask" + }, + "metametricsOptInDescription": { + "message": "MetaMask souhaite recueillir des données d’utilisation afin de mieux comprendre comment nos utilisateurs interagissent avec l’extension. Ces données seront utilisées pour améliorer en permanence la convivialité et l’expérience utilisateur de notre produit et de l’écosystème Ethereum." + }, + "metametricsOptInDescription2": { + "message": "Nous aimerions recueillir des données d’utilisation de base pour améliorer la convivialité de notre produit. Ces indicateurs seront…" + }, + "metametricsTitle": { + "message": "Rejoignez plus de 6 M d’utilisateurs pour améliorer MetaMask" + }, + "mismatchedChain": { + "message": "Les détails du réseau pour cet ID de chaîne ne correspondent pas à nos registres. Nous vous recommandons de $1 avant de poursuivre.", + "description": "$1 is a clickable link with text defined by the 'mismatchedChainLinkText' key" + }, + "mismatchedChainLinkText": { + "message": "vérifier les détails du réseau", + "description": "Serves as link text for the 'mismatchedChain' key. This text will be embedded inside the translation for that key." + }, + "missingNFT": { + "message": "Vous ne voyez pas votre NFT ?" + }, + "missingToken": { + "message": "Vous ne voyez pas votre jeton ?" + }, + "mobileSyncWarning": { + "message": "La fonction « Synchronisation avec l’extension » est temporairement désactivée. Si vous souhaitez utiliser votre portefeuille d’extension sur MetaMask mobile : sur votre appli mobile, revenez aux options de configuration du portefeuille et sélectionnez l’option « Importation avec Phrase secrète de récupération ». Utilisez la phrase secrète de votre portefeuille d’extension pour importer celui-ci sur votre mobile." + }, "mustSelectOne": { "message": "Vous devez selectionner au moins 1 jeton." }, "myAccounts": { "message": "Mes comptes" }, + "name": { + "message": "Nom" + }, "needEtherInWallet": { "message": "Pour interagir avec des applications décentralisées à l'aide de MetaMask, vous avez besoin d'Ether dans votre portefeuille." }, + "needHelp": { + "message": "Vous avez besoin d’aide ? Contactez $1", + "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" + }, + "needHelpFeedback": { + "message": "Partagez vos commentaires" + }, + "needHelpLinkText": { + "message": "Assistance MetaMask" + }, + "needHelpSubmitTicket": { + "message": "Envoyer un ticket" + }, "needImportFile": { "message": "Vous devez sélectionner un fichier à importer.", "description": "User is important an account and needs to add a file to continue" @@ -579,12 +1734,56 @@ "negativeETH": { "message": "Vous ne pouvez envoyer des montants négatifs d'ETH." }, + "networkDetails": { + "message": "Détails du réseau" + }, "networkName": { "message": "Nom du réseau" }, + "networkNameBSC": { + "message": "BSC" + }, + "networkNameDefinition": { + "message": "Le nom associé à ce réseau." + }, + "networkNameEthereum": { + "message": "Ethereum" + }, + "networkNamePolygon": { + "message": "Polygon" + }, + "networkNameRinkeby": { + "message": "Rinkeby" + }, + "networkNameTestnet": { + "message": "Testnet" + }, + "networkSettingsChainIdDescription": { + "message": "L’ID de la chaîne est utilisé pour la signature des transactions. Il doit correspondre à l’ID de la chaîne renvoyé par le réseau. Vous pouvez saisir un numéro décimal ou hexadécimal avec le préfixe « 0x », mais nous afficherons le numéro en décimal." + }, "networkSettingsDescription": { "message": "Ajoutez et modifiez des réseaux RPC personnalisés" }, + "networkStatus": { + "message": "Statut du réseau" + }, + "networkStatusBaseFeeTooltip": { + "message": "Les frais de base sont fixés par le réseau et varient toutes les 13-14 secondes. Nos options $1 et $2 tiennent compte des augmentations soudaines.", + "description": "$1 and $2 are bold text for Medium and Aggressive respectively." + }, + "networkStatusPriorityFeeTooltip": { + "message": "Éventail de frais de priorité (aussi appelés « pourboire du mineur »). Ils sont versés aux mineurs et les incitent à accorder la priorité à votre transaction." + }, + "networkStatusStabilityFeeTooltip": { + "message": "Le prix du carburant est de $1 au regard des 72 dernières heures.", + "description": "$1 is networks stability value - stable, low, high" + }, + "networkURL": { + "message": "URL du réseau" + }, + "networkURLDefinition": { + "message": "L’URL utilisée pour accéder à ce réseau." + }, "networks": { "message": "Réseaux" }, @@ -601,12 +1800,27 @@ "message": "Compte $1", "description": "Default name of next account to be created on create account screen" }, + "newCollectibleAddFailed": { + "message": "Le collectible n’a pas été ajouté, car : $1" + }, + "newCollectibleAddedMessage": { + "message": "Le collectible a été ajouté avec succès !" + }, "newContact": { "message": "Nouveau contact" }, "newContract": { "message": "Nouveau contrat" }, + "newNFTsDetected": { + "message": "Nouveau ! Détection de NFT" + }, + "newNFTsDetectedInfo": { + "message": "Cela permet à MetaMask de détecter automatiquement les NFT d’Opensea et de les afficher dans votre portefeuille MetaMask." + }, + "newNetworkAdded": { + "message": "« $1 » a été ajouté avec succès !" + }, "newPassword": { "message": "Nouveau mot de passe (min 8 caractères)" }, @@ -619,18 +1833,46 @@ "newTransactionFee": { "message": "Coût de la nouvelle transaction" }, + "newValues": { + "message": "nouvelles valeurs" + }, "next": { "message": "Suivant" }, + "nextNonceWarning": { + "message": "Le nonce est supérieur au nonce suggéré de $1", + "description": "The next nonce according to MetaMask's internal logic" + }, + "nftTokenIdPlaceholder": { + "message": "Saisissez l’ID du collectible" + }, + "nfts": { + "message": "NFT" + }, + "nickname": { + "message": "Pseudonyme" + }, + "noAccountsFound": { + "message": "Aucun compte trouvé pour la demande de recherche effectuée" + }, "noAddressForName": { "message": "Aucune adresse n'a été définie pour ce nom." }, "noAlreadyHaveSeed": { "message": "Non, j'ai déjà une phrase mnémotechnique" }, + "noConversionDateAvailable": { + "message": "Aucun taux de conversion de devise disponible" + }, "noConversionRateAvailable": { "message": "Aucun taux de conversion disponible" }, + "noNFTs": { + "message": "Aucun NFT pour le moment" + }, + "noThanks": { + "message": "Non merci" + }, "noTransactions": { "message": "Aucune transaction" }, @@ -640,18 +1882,204 @@ "noWebcamFoundTitle": { "message": "Webcam introuvable" }, + "nonce": { + "message": "Nonce" + }, + "nonceField": { + "message": "Personnaliser le nonce de transaction" + }, + "nonceFieldDescription": { + "message": "Activez cette option pour modifier le nonce (numéro de transaction) sur les écrans de confirmation. Il s’agit d’une fonctionnalité avancée, à utiliser avec précaution." + }, + "nonceFieldHeading": { + "message": "Nonce personnalisé" + }, + "notBusy": { + "message": "Pas occupé" + }, + "notCurrentAccount": { + "message": "S’agit-il du bon compte ? Il est différent de celui actuellement sélectionné dans votre portefeuille" + }, "notEnoughGas": { "message": "Pas assez d'essence" }, + "notifications1Description": { + "message": "Les utilisateurs de MetaMask Mobile peuvent désormais échanger des jetons dans leur portefeuille mobile. Scannez le code QR pour obtenir l’appli mobile et commencez à échanger.", + "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." + }, + "notifications1Title": { + "message": "Les swaps sur mobile sont enfin possibles !", + "description": "Title for a notification in the 'See What's New' popup. Tells users that they can now use MetaMask Swaps on Mobile." + }, + "notifications3ActionText": { + "message": "En savoir plus", + "description": "The 'call to action' on the button, or link, of the 'Stay secure' notification. Upon clicking, users will be taken to a page about security on the metamask support website." + }, + "notifications3Description": { + "message": "Restez à jour sur les meilleures pratiques de sécurité de MetaMask et bénéficiez des derniers conseils de sécurité du service d’assistance officiel de MetaMask.", + "description": "Description of a notification in the 'See What's New' popup. Describes the information they can get on security from the linked support page." + }, + "notifications3Title": { + "message": "Préservez votre sécurité", + "description": "Title for a notification in the 'See What's New' popup. Encourages users to consider security." + }, + "notifications4ActionText": { + "message": "Commencez à échanger", + "description": "The 'call to action' on the button, or link, of the 'Swap on Binance Smart Chain!' notification. Upon clicking, users will be taken to a page where then can swap tokens on Binance Smart Chain." + }, + "notifications4Description": { + "message": "Bénéficiez des meilleurs prix sur les swaps de jetons directement dans votre portefeuille. MetaMask vous connecte désormais à de multiples agrégateurs d’échanges décentralisés et à des teneurs de marché professionnels sur la Binance Smart Chain.", + "description": "Description of a notification in the 'See What's New' popup." + }, + "notifications4Title": { + "message": "Effectuer des swaps sur la Binance Smart Chain", + "description": "Title for a notification in the 'See What's New' popup. Encourages users to do swaps on Binance Smart Chain." + }, + "notifications5Description": { + "message": "Votre « phrase mnémonique » devient votre « Phrase secrète de récupération ».", + "description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update." + }, + "notifications6DescriptionOne": { + "message": "Depuis la version 91 de Chrome, l’API qui permettait la prise en charge de notre Ledger (U2F) ne gère plus les portefeuilles matériels. MetaMask a donc mis en place un nouveau système de prise en charge de Ledger Live qui vous permet de continuer à vous connecter à votre appareil Ledger via l’appli Ledger Live.", + "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." + }, + "notifications6DescriptionThree": { + "message": "Lorsque vous interagissez avec votre compte Ledger dans MetaMask, un nouvel onglet s’ouvre et vous êtes invité·e à ouvrir l’appli Ledger Live. Une fois l’appli lancée, vous serez prié·e d’autoriser une connexion WebSocket à votre compte MetaMask. Et le tour est joué !", + "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." + }, + "notifications6DescriptionTwo": { + "message": "Vous pouvez activer la prise en charge de Ledger Live en cliquant sur Paramètres > Avancés > Utiliser Ledger Live.", + "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." + }, + "notifications6Title": { + "message": "Mise à jour de la prise en charge de Ledger pour les utilisateurs de Chrome", + "description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update" + }, + "notifications7DescriptionOne": { + "message": "MetaMask v10.1.0 inclut une nouvelle prise en charge des transactions EIP-1559 en cas d’utilisation d’appareils Ledger.", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for ledger and EIP1559 in v10.1.0" + }, + "notifications7DescriptionTwo": { + "message": "Pour effectuer des transactions sur Ethereum Mainnet, assurez-vous que votre appareil Ledger dispose du dernier micrologiciel.", + "description": "Description of a notification in the 'See What's New' popup. Describes the need to update ledger firmware." + }, + "notifications7Title": { + "message": "Mise à jour du micrologiciel", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." + }, + "notifications8ActionText": { + "message": "Accédez aux Paramètres avancés", + "description": "Description on an action button that appears in the What's New popup. Tells the user that if they click it, they will go to our Advanced Settings page." + }, + "notifications8DescriptionOne": { + "message": "Depuis MetaMask v10.4.0, vous n’avez plus besoin de Ledger Live pour connecter votre appareil Ledger à MetaMask.", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for how Ledger Live is no longer needed to connect the device." + }, + "notifications8DescriptionTwo": { + "message": "Pour une expérience plus conviviale et plus stable, allez dans l’onglet des paramètres Avancés et changez « Type de connexion Ledger préféré » en « WebHID ».", + "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." + }, + "notifications8Title": { + "message": "Amélioration de la connexion Ledger", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users that there is an improvement in how they can connect their device." + }, + "notifications9DescriptionOne": { + "message": "Nous vous proposons désormais plus d’informations dans l’onglet « Données » lors de la confirmation des transactions de contrats intelligents." + }, + "notifications9DescriptionTwo": { + "message": "Vous pouvez à présent mieux cerner les détails de votre transaction avant de la confirmer, et ajouter plus aisément les adresses des transactions à votre carnet d’adresses, ce qui vous aidera à prendre des décisions sûres et éclairées." + }, + "notifications9Title": { + "message": "👓 Nous simplifions la lisibilité des transactions." + }, "ofTextNofM": { "message": "de" }, "off": { "message": "Désactivé" }, + "offlineForMaintenance": { + "message": "Hors ligne à des fins de maintenance" + }, + "ok": { + "message": "OK" + }, "on": { "message": "Activé" }, + "onboardingCreateWallet": { + "message": "Créer un nouveau portefeuille" + }, + "onboardingImportWallet": { + "message": "Importer un portefeuille existant" + }, + "onboardingPinExtensionBillboardAccess": { + "message": "Accès complet" + }, + "onboardingPinExtensionBillboardDescription": { + "message": "Ces extensions peuvent voir et modifier les informations" + }, + "onboardingPinExtensionBillboardDescription2": { + "message": "sur ce site." + }, + "onboardingPinExtensionBillboardTitle": { + "message": "Extensions" + }, + "onboardingPinExtensionChrome": { + "message": "Cliquez sur l’icône d’extension du navigateur" + }, + "onboardingPinExtensionDescription": { + "message": "Épinglez MetaMask dans votre navigateur pour qu’il soit accessible et qu’il soit facile de voir les confirmations de transaction." + }, + "onboardingPinExtensionDescription2": { + "message": "Vous pouvez ouvrir MetaMask en cliquant sur l’extension pour accéder à votre portefeuille en un seul clic." + }, + "onboardingPinExtensionDescription3": { + "message": "Cliquez sur l’icône d’extension du navigateur pour y accéder instantanément" + }, + "onboardingPinExtensionLabel": { + "message": "Épingler MetaMask" + }, + "onboardingPinExtensionStep1": { + "message": "1" + }, + "onboardingPinExtensionStep2": { + "message": "2" + }, + "onboardingPinExtensionTitle": { + "message": "Votre installation de MetaMask est terminée !" + }, + "onboardingReturnNotice": { + "message": "« $1 » va fermer cet onglet et vous rediriger vers $2", + "description": "Return the user to the site that initiated onboarding" + }, + "onboardingShowIncomingTransactionsDescription": { + "message": "L’affichage des transactions entrantes dans votre portefeuille repose sur la communication avec $1. Etherscan aura accès à votre adresse Ethereum et à votre adresse IP. Voir $2.", + "description": "$1 is a clickable link with text defined by the 'etherscan' key. $2 is a clickable link with text defined by the 'privacyMsg' key." + }, + "onboardingUsePhishingDetectionDescription": { + "message": "Les alertes de détection d’hameçonnage reposent sur la communication avec $1. jsDeliver aura accès à votre adresse IP. Voir $2.", + "description": "The $1 is the word 'jsDeliver', from key 'jsDeliver' and $2 is the words Privacy Policy from key 'privacyMsg', both separated here so that it can be wrapped as a link" + }, + "onlyAddTrustedNetworks": { + "message": "Un fournisseur de réseau malveillant peut mentir quant à l’état de la blockchain et enregistrer votre activité réseau. N’ajoutez que des réseaux personnalisés auxquels vous faites confiance." + }, + "onlyConnectTrust": { + "message": "Ne vous connectez qu’aux sites auxquels vous faites confiance." + }, + "openFullScreenForLedgerWebHid": { + "message": "Ouvrez MetaMask en mode plein écran pour connecter votre Ledger via WebHID.", + "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." + }, + "optional": { + "message": "Optionnel" + }, + "optionalWithParanthesis": { + "message": "(Facultatif)" + }, + "or": { + "message": "ou" + }, "origin": { "message": "Origine" }, @@ -670,6 +2098,12 @@ "passwordNotLongEnough": { "message": "Mot de passe trop court" }, + "passwordSetupDetails": { + "message": "Ce mot de passe permet de déverrouiller votre portefeuille MetaMask uniquement sur cet appareil. MetaMask ne peut pas récupérer ce mot de passe." + }, + "passwordTermsWarning": { + "message": "Je comprends que MetaMask ne peut pas me récupérer ce mot de passe. $1" + }, "passwordsDontMatch": { "message": "Les mots de passe ne correspondent pas" }, @@ -680,9 +2114,33 @@ "pending": { "message": "En attente" }, + "pendingTransactionInfo": { + "message": "Cette transaction ne sera pas traitée tant que la précédente ne sera pas terminée." + }, + "pendingTransactionMultiple": { + "message": "Vous avez ($1) transactions en attente." + }, + "pendingTransactionSingle": { + "message": "Vous avez (1) transaction en attente.", + "description": "$1 is count of pending transactions" + }, + "permissionRequest": { + "message": "Demande d’autorisation" + }, + "permissions": { + "message": "Autorisations" + }, "personalAddressDetected": { "message": "Votre adresse personnelle a été détectée. Veuillez saisir à la place l'adresse du contrat du jeton." }, + "plusXMore": { + "message": "+ $1 de plus", + "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" + }, + "preferredLedgerConnectionType": { + "message": "Type de connexion Ledger préféré", + "description": "A header for a dropdown in the advanced section of settings. Appears above the ledgerConnectionPreferenceDescription message" + }, "prev": { "message": "Préc." }, @@ -692,6 +2150,12 @@ "primaryCurrencySettingDescription": { "message": "Sélectionnez « natif » pour donner la priorité à l'affichage des valeurs dans la devise native de la chaîne (par ex. ETH). Sélectionnez « fiduciaire » pour donner la priorité à l'affichage des valeurs dans la devise de votre choix." }, + "priorityFee": { + "message": "Frais de priorité" + }, + "priorityFeeProperCase": { + "message": "Frais de priorité" + }, "privacyMsg": { "message": "Politique de Confidentialité" }, @@ -705,18 +2169,66 @@ "privateNetwork": { "message": "Réseau privé" }, + "proceedWithTransaction": { + "message": "Je veux tout de même continuer" + }, + "proposedApprovalLimit": { + "message": "Limite d’approbation proposée" + }, + "provide": { + "message": "Fournir" + }, + "publicAddress": { + "message": "Adresse publique" + }, "queue": { "message": "File d'attente" }, + "queued": { + "message": "En attente" + }, "readdToken": { "message": "Vous pourrez ajouter à nouveau ce jeton en allant sur “Ajouter un jeton” dans le menu des options de votre compte." }, + "receive": { + "message": "Recevoir" + }, "recents": { "message": "Récents" }, "recipientAddressPlaceholder": { "message": "Recherche, adresse publique (0x) ou ENS" }, + "recommendedGasLabel": { + "message": "Recommandé" + }, + "recoveryPhraseReminderBackupStart": { + "message": "Commencez ici" + }, + "recoveryPhraseReminderConfirm": { + "message": "C’est compris !" + }, + "recoveryPhraseReminderHasBackedUp": { + "message": "Conservez toujours votre Phrase secrète de récupération dans un endroit sûr et secret" + }, + "recoveryPhraseReminderHasNotBackedUp": { + "message": "Vous avez besoin de sauvegarder à nouveau votre Phrase secrète de récupération ?" + }, + "recoveryPhraseReminderItemOne": { + "message": "Ne partagez jamais votre Phrase secrète de récupération avec qui que ce soit" + }, + "recoveryPhraseReminderItemTwo": { + "message": "L’équipe MetaMask ne vous demandera jamais votre Phrase secrète de récupération" + }, + "recoveryPhraseReminderSubText": { + "message": "Votre Phrase secrète de récupération contrôle tous vos comptes." + }, + "recoveryPhraseReminderTitle": { + "message": "Protégez vos fonds" + }, + "refreshList": { + "message": "Rafraîchir la liste" + }, "reject": { "message": "Rejeter" }, @@ -732,6 +2244,9 @@ "rejected": { "message": "Rejeté" }, + "remember": { + "message": "Rappel :" + }, "remindMeLater": { "message": "Rappelez-moi plus tard" }, @@ -744,6 +2259,9 @@ "removeAccountDescription": { "message": "Ce compte va être supprimé de votre portefeuille. Veuillez vérifier que vous avez la phrase Seed originale de ce compte ou la clé privée pour ce compte importé avant de continuer. Vous pouvez importer ou créer à nouveau des comptes à partir du menu des comptes." }, + "removeNFT": { + "message": "Supprimer le NFT" + }, "requestsAwaitingAcknowledgement": { "message": "demandes en attente d'un accusé de réception" }, @@ -765,6 +2283,16 @@ "restoreAccountWithSeed": { "message": "Restaurer votre compte avec une phrase Seed." }, + "restoreWalletPreferences": { + "message": "Une sauvegarde de vos données de $1 a été trouvée. Voulez-vous restaurer vos préférences de portefeuille ?", + "description": "$1 is the date at which the data was backed up" + }, + "retryTransaction": { + "message": "Réessayer la transaction" + }, + "reusedTokenNameWarning": { + "message": "L’un de ces jetons réutilise le symbole d’un autre jeton que vous surveillez, ce qui peut être déroutant ou trompeur." + }, "revealSeedWords": { "message": "Révéler les mots Seed" }, @@ -798,9 +2326,15 @@ "scanQrCode": { "message": "Scannez le QR Code" }, + "scrollDown": { + "message": "Faites défiler vers le bas" + }, "search": { "message": "Rechercher" }, + "searchAccounts": { + "message": "Rechercher des comptes" + }, "searchResults": { "message": "Resultats de la recherche" }, @@ -813,51 +2347,155 @@ "secretBackupPhraseWarning": { "message": "AVERTISSEMENT : ne révélez jamais votre phrase de sauvegarde. N'importe qui avec cette phrase peut voler votre Ether pour toujours." }, + "secretPhrase": { + "message": "Seul le premier compte de ce portefeuille sera chargé automatiquement. Après avoir terminé ce processus, pour ajouter des comptes supplémentaires, cliquez sur le menu déroulant, puis sélectionnez Créer un compte." + }, + "secretPhraseWarning": { + "message": "Si vous effectuez une restauration à l’aide d’une autre Phrase secrète de récupération, votre portefeuille, vos comptes et vos actifs actuels seront définitivement supprimés de cette appli. Cette action est irréversible." + }, + "secretRecoveryPhrase": { + "message": "Confirmer la Phrase secrète de récupération" + }, + "secureWallet": { + "message": "Portefeuille sécurisé" + }, "securityAndPrivacy": { "message": "Sécurité et confidentialité" }, "securitySettingsDescription": { "message": "Paramètres de confidentialité et phrase de départ du portefeuille" }, + "seedPhraseConfirm": { + "message": "Confirmer la Phrase secrète de récupération" + }, + "seedPhraseEnterMissingWords": { + "message": "Confirmer la Phrase secrète de récupération" + }, + "seedPhraseIntroNotRecommendedButtonCopy": { + "message": "Me le rappeler plus tard (non recommandé)" + }, + "seedPhraseIntroRecommendedButtonCopy": { + "message": "Sécuriser mon portefeuille (recommandé)" + }, + "seedPhraseIntroSidebarBulletFour": { + "message": "Noter et conserver dans plusieurs endroits secrets." + }, + "seedPhraseIntroSidebarBulletOne": { + "message": "Sauvegarder dans un gestionnaire de mots de passe" + }, + "seedPhraseIntroSidebarBulletThree": { + "message": "Stocker dans un coffre-fort." + }, + "seedPhraseIntroSidebarBulletTwo": { + "message": "Stocker dans un coffre-fort de banque." + }, + "seedPhraseIntroSidebarCopyOne": { + "message": "Votre Phrase secrète de récupération est une formule de 12 mots qui constitue la « clé maîtresse » de votre portefeuille et de vos fonds" + }, + "seedPhraseIntroSidebarCopyThree": { + "message": "Si quelqu’un vous demande votre phrase de récupération, il est probable qu’il essaie de vous arnaquer pour dérober les fonds de votre portefeuille" + }, + "seedPhraseIntroSidebarCopyTwo": { + "message": "Ne partagez jamais, au grand jamais, votre Phrase secrète de récupération, pas même avec MetaMask !" + }, + "seedPhraseIntroSidebarTitleOne": { + "message": "Qu’est-ce qu’une Phrase secrète de récupération ?" + }, + "seedPhraseIntroSidebarTitleThree": { + "message": "Dois-je partager ma Phrase secrète de récupération ?" + }, + "seedPhraseIntroSidebarTitleTwo": { + "message": "Comment puis-je sauvegarder ma Phrase secrète de récupération ?" + }, + "seedPhraseIntroTitle": { + "message": "Sécurisez votre portefeuille" + }, + "seedPhraseIntroTitleCopy": { + "message": "Avant de commencer, regardez cette courte vidéo pour vous renseigner sur votre Phrase secrète de récupération et sur la manière de sécuriser votre portefeuille." + }, "seedPhrasePlaceholder": { "message": "Separez chaque mot avec un espace simple" }, + "seedPhrasePlaceholderPaste": { + "message": "Collez la Phrase secrète de récupération depuis le presse-papiers" + }, "seedPhraseReq": { "message": "Les phrases Seed sont composées de 12 mots" }, + "seedPhraseWriteDownDetails": { + "message": "Notez cette Phrase secrète de récupération de 12 mots et stockez-la dans un endroit de confiance où vous seul avez accès." + }, + "seedPhraseWriteDownHeader": { + "message": "Notez votre Phrase secrète de récupération" + }, "selectAHigherGasFee": { "message": "Choisissez des frais d'essence plus élevés pour accélérer le traitement de votre transaction*." }, + "selectAccounts": { + "message": "Sélectionnez le ou les comptes à utiliser sur ce site" + }, + "selectAll": { + "message": "Tout sélectionner" + }, "selectAnAccount": { "message": "Selectionner un compte" }, + "selectAnAccountAlreadyConnected": { + "message": "Ce compte a déjà été connecté à MetaMask" + }, "selectEachPhrase": { "message": "Veuillez sélectionner chaque phrase afin de vous assurer qu'elle est correcte." }, "selectHdPath": { "message": "Selectioner le \"Path HD\"" }, + "selectNFTPrivacyPreference": { + "message": "Activez la détection de NFT dans les Paramètres" + }, "selectPathHelp": { "message": "Si vos comptes Ledger n'apparaissent pas ci-dessous, essayez de selectionner le path \"Legacy (MEW / MyCrypto)\"" }, "selectType": { "message": "Selectionner le type" }, + "selectingAllWillAllow": { + "message": "En sélectionnant tout, vous autorisez ce site à voir tous vos comptes actuels. Assurez-vous de bien avoir confiance en ce site." + }, "send": { "message": "Envoyer" }, "sendAmount": { "message": "Envoyer le montant" }, + "sendSpecifiedTokens": { + "message": "Envoyer $1", + "description": "Symbol of the specified token" + }, + "sendTo": { + "message": "Envoyer à" + }, "sendTokens": { "message": "Envoyer des jetons" }, + "sendingNativeAsset": { + "message": "Envoi de $1", + "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" + }, "separateEachWord": { "message": "Separez chaque mot avec un espace simple" }, + "setAdvancedPrivacySettings": { + "message": "Définir des paramètres de confidentialité avancés" + }, + "setAdvancedPrivacySettingsDetails": { + "message": "MetaMask utilise ces services tiers de confiance pour améliorer la convivialité et la sécurité des produits." + }, "settings": { "message": "Paramètres" }, + "show": { + "message": "Afficher" + }, "showAdvancedGasInline": { "message": "Contrôles d'essence avancés" }, @@ -876,9 +2514,33 @@ "showHexDataDescription": { "message": "Selectionner ici pour afficher le champs de données hex dans l'écran d'envoi" }, + "showHide": { + "message": "Afficher/masquer" + }, + "showIncomingTransactions": { + "message": "Afficher les transactions entrantes" + }, + "showIncomingTransactionsDescription": { + "message": "Sélectionnez ceci pour utiliser Etherscan afin d’afficher les transactions entrantes dans la liste des transactions" + }, + "showPermissions": { + "message": "Afficher les autorisations" + }, "showPrivateKeys": { "message": "Afficher les clés privées" }, + "showRecommendations": { + "message": "Afficher les recommandations" + }, + "showSeedPhrase": { + "message": "Afficher la Phrase secrète de récupération" + }, + "showTestnetNetworks": { + "message": "Afficher les réseaux de test" + }, + "showTestnetNetworksDescription": { + "message": "Sélectionnez ceci pour afficher les réseaux de test dans la liste des réseaux" + }, "sigRequest": { "message": "Demande de signature" }, @@ -891,51 +2553,476 @@ "signatureRequest": { "message": "Demande de Signature" }, + "signatureRequest1": { + "message": "Message" + }, "signed": { "message": "Signé" }, + "simulationErrorMessage": { + "message": "Cette transaction devrait échouer. Si vous choisissez de l’exécuter, cela devrait à la fois être coûteux et voué à l’échec. Ce n’est donc pas recommandé." + }, + "simulationErrorMessageV2": { + "message": "Nous n’avons pas pu estimer le prix de carburant. Par conséquent, il se peut qu’il y ait une erreur dans le contrat et que cette transaction échoue." + }, + "skip": { + "message": "Ignorer" + }, + "skipAccountSecurity": { + "message": "Renoncer à la sécurité des comptes ?" + }, + "skipAccountSecurityDetails": { + "message": "Je suis conscient·e que tant que je n’aurai pas sauvegardé ma Phrase secrète de récupération, je risque de perdre mes comptes et tous leurs actifs." + }, "slow": { "message": "Lente" }, "somethingWentWrong": { "message": "Oups ! Quelque chose a mal tourné. " }, + "source": { + "message": "Source" + }, "speedUp": { "message": "accélérer" }, "speedUpCancellation": { "message": "Accélérer cette annulation" }, + "speedUpExplanation": { + "message": "Nous avons mis à jour le prix du carburant selon les conditions actuelles du réseau et l’avons augmenté d’au moins 10 % (requis par le réseau)." + }, + "speedUpPopoverTitle": { + "message": "Accélérer la transaction" + }, + "speedUpTooltipText": { + "message": "Nouveau prix de carburant" + }, "speedUpTransaction": { "message": "Accélérez cette transaction" }, + "spendLimitAmount": { + "message": "Montant limite de dépenses" + }, + "spendLimitInsufficient": { + "message": "Limite de dépenses insuffisante" + }, + "spendLimitInvalid": { + "message": "Limite de dépenses invalide ; cela doit être une valeur positive" + }, + "spendLimitPermission": { + "message": "Autorisation de limite de dépenses" + }, + "spendLimitRequestedBy": { + "message": "Limite de dépenses demandée par $1", + "description": "Origin of the site requesting the spend limit" + }, + "spendLimitTooLarge": { + "message": "Limite de dépenses trop élevée" + }, + "stable": { + "message": "Stable" + }, + "stableLowercase": { + "message": "stable" + }, "stateLogError": { "message": "Erreur lors du chargement des logs d'Etat." }, + "stateLogFileName": { + "message": "Registres d’état MetaMask" + }, "stateLogs": { "message": "Logs d'Etat" }, "stateLogsDescription": { "message": "Les logs d'Etat contiennent les adresses publiques de vos comptes et vos transactions envoyées." }, + "statusConnected": { + "message": "Connecté" + }, + "statusNotConnected": { + "message": "Non connecté" + }, + "step1LatticeWallet": { + "message": "Assurez-vous que votre Lattice1 est prêt à se connecter" + }, + "step1LatticeWalletMsg": { + "message": "Vous pouvez connecter MetaMask à votre dispositif Lattice1 une fois qu’il est configuré et en ligne. Déverrouillez votre appareil et munissez-vous de son ID. Pour en savoir plus sur l’utilisation des portefeuilles matériels, $1", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, + "step1LedgerWallet": { + "message": "Télécharger l’appli Ledger" + }, + "step1LedgerWalletMsg": { + "message": "Téléchargez, configurez et saisissez votre mot de passe pour déverrouiller $1.", + "description": "$1 represents the `ledgerLiveApp` localization value" + }, + "step1TrezorWallet": { + "message": "Brancher le portefeuille Trezor" + }, + "step1TrezorWalletMsg": { + "message": "Connectez votre portefeuille directement à votre ordinateur. Pour en savoir plus sur l’utilisation de votre portefeuille matériel, $1", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, + "step2LedgerWallet": { + "message": "Brancher le portefeuille Ledger" + }, + "step2LedgerWalletMsg": { + "message": "Connectez votre portefeuille directement à votre ordinateur. Déverrouillez votre Ledger et ouvrez l’appli Ethereum. Pour en savoir plus sur l’utilisation de votre portefeuille matériel, $1.", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, "storePhrase": { "message": "Stockez cette phrase dans un gestionnaire de mots de passe comme 1Password." }, + "submit": { + "message": "Envoyer" + }, "submitted": { "message": "Envoyé" }, + "support": { + "message": "Assistance" + }, "supportCenter": { "message": "Visitez notre centre d'aide" }, + "swap": { + "message": "Swap" + }, + "swapAdvancedSlippageInfo": { + "message": "Si le prix fluctue entre le passage de votre ordre et sa confirmation, on parle alors d’un « effet de glissement » (slippage). Votre swap sera automatiquement annulé si ce phénomène dépasse votre paramètre de « glissement maximal »." + }, + "swapAggregator": { + "message": "Agrégateur" + }, + "swapAllowSwappingOf": { + "message": "Autoriser le swap de $1", + "description": "Shows a user that they need to allow a token for swapping on their hardware wallet" + }, + "swapAmountReceived": { + "message": "Montant garanti" + }, + "swapAmountReceivedInfo": { + "message": "Il s’agit du montant minimal que vous recevrez. Vous pouvez recevoir plus en fonction du glissement." + }, + "swapApproval": { + "message": "Approuver $1 pour les swaps", + "description": "Used in the transaction display list to describe a transaction that is an approve call on a token that is to be swapped.. $1 is the symbol of a token that has been approved." + }, + "swapApproveNeedMoreTokens": { + "message": "Vous avez besoin de $1 $2 de plus pour effectuer ce swap", + "description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol." + }, + "swapBestOfNQuotes": { + "message": "Meilleures cotations de $1.", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, + "swapBuildQuotePlaceHolderText": { + "message": "Aucun jeton disponible correspondant à $1", + "description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text" + }, + "swapConfirmWithHwWallet": { + "message": "Confirmez avec votre portefeuille matériel" + }, + "swapContractDataDisabledErrorDescription": { + "message": "Dans l’appli Ethereum de votre Ledger, allez dans « Paramètres » et autorisez les données de contrat. Ensuite, retentez votre swap." + }, + "swapContractDataDisabledErrorTitle": { + "message": "Les données de contrat ne sont pas activées sur votre Ledger" + }, + "swapCustom": { + "message": "personnaliser" + }, + "swapDecentralizedExchange": { + "message": "Échange décentralisé" + }, + "swapDirectContract": { + "message": "Contrat direct" + }, + "swapEditLimit": { + "message": "Modifier la limite" + }, + "swapEnableDescription": { + "message": "Cette information est nécessaire et autorise MetaMask à effectuer le swap de vos $1.", + "description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps." + }, + "swapEnableTokenForSwapping": { + "message": "Ce sera $1 pour le swap", + "description": "$1 is for the 'enableToken' key, e.g. 'enable ETH'" + }, + "swapEstimatedNetworkFees": { + "message": "Frais de réseau estimés" + }, + "swapEstimatedNetworkFeesInfo": { + "message": "Il s’agit d’une estimation des frais de réseau qui seront utilisés pour effectuer votre swap. Le montant réel peut varier en fonction des conditions du réseau." + }, + "swapFailedErrorDescriptionWithSupportLink": { + "message": "Sachez que les transactions peuvent échouer et que nous sommes là pour vous aider. Si ce problème persiste, vous pouvez contacter notre service clientèle au $1 pour plus d’assistance.", + "description": "This message is shown to a user if their swap fails. The $1 will be replaced by support.metamask.io" + }, + "swapFailedErrorTitle": { + "message": "Échec du swap" + }, + "swapFetchingQuotes": { + "message": "Récupération des cotations" + }, + "swapFetchingQuotesErrorDescription": { + "message": "Euh… un problème est survenu. Essayez à nouveau et si les erreurs persistent, contactez le service clientèle." + }, + "swapFetchingQuotesErrorTitle": { + "message": "Erreur lors de la récupération des cotations" + }, + "swapFetchingTokens": { + "message": "Récupération des jetons…" + }, + "swapFromTo": { + "message": "Le swap de $1 vers $2", + "description": "Tells a user that they need to confirm on their hardware wallet a swap of 2 tokens. $1 is a source token and $2 is a destination token" + }, + "swapGasFeesDetails": { + "message": "Les frais de carburant sont estimés et fluctueront selon le trafic réseau et la complexité de la transaction." + }, + "swapGasFeesLearnMore": { + "message": "En savoir plus sur les frais de carburant" + }, + "swapGasFeesSplit": { + "message": "Les frais de carburant indiqués dans l’écran précédent sont répartis entre ces deux transactions." + }, + "swapGasFeesSummary": { + "message": "Les frais de carburant sont payés aux mineurs de cryptomonnaies qui traitent les transactions sur le réseau $1. MetaMask ne tire aucun profit des frais de carburant.", + "description": "$1 is the selected network, e.g. Ethereum or BSC" + }, + "swapHighSlippageWarning": { + "message": "Le montant du glissement est très élevé." + }, + "swapIncludesMMFee": { + "message": "Comprend des frais MetaMask à hauteur de $1 %.", + "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." + }, + "swapLowSlippageError": { + "message": "La transaction peut échouer, car le glissement maximal est trop faible." + }, + "swapMaxSlippage": { + "message": "Glissement maximal" + }, + "swapMetaMaskFee": { + "message": "Frais MetaMask" + }, + "swapMetaMaskFeeDescription": { + "message": "Nous recherchons systématiquement le meilleur prix auprès des meilleures sources de liquidité. Une commission de $1 % est automatiquement incluse dans cette cotation.", + "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." + }, + "swapNQuotesWithDot": { + "message": "$1 cotations.", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, + "swapNewQuoteIn": { + "message": "Nouvelles cotations dans $1", + "description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00" + }, + "swapOnceTransactionHasProcess": { + "message": "Vos $1 seront ajoutés à votre compte une fois que cette transaction sera traitée.", + "description": "This message communicates the token that is being transferred. It is shown on the awaiting swap screen. The $1 will be a token symbol." + }, + "swapPriceDifference": { + "message": "Vous êtes sur le point d’effectuer un swap de $1 $2 (~$3) contre $4 $5 (~$6).", + "description": "This message represents the price slippage for the swap. $1 and $4 are a number (ex: 2.89), $2 and $5 are symbols (ex: ETH), and $3 and $6 are fiat currency amounts." + }, + "swapPriceDifferenceTitle": { + "message": "Différence de prix de ~$1", + "description": "$1 is a number (ex: 1.23) that represents the price difference." + }, + "swapPriceImpactTooltip": { + "message": "L’incidence sur les prix correspond à la différence entre le prix actuel du marché et le montant reçu lors de l’exécution de la transaction. Cette répercussion dépend du volume de votre transaction par rapport au volume de la piscine de liquidités." + }, + "swapPriceUnavailableDescription": { + "message": "L’incidence sur les prix n’a pas pu être déterminée faute de données suffisantes sur les prix du marché. Veuillez confirmer que vous êtes satisfait·e du nombre de jetons que vous êtes sur le point de recevoir avant de procéder au swap." + }, + "swapPriceUnavailableTitle": { + "message": "Vérifiez votre taux avant de poursuivre" + }, + "swapProcessing": { + "message": "Traitement en cours" + }, + "swapQuoteDetails": { + "message": "Détails de la cotation" + }, + "swapQuoteDetailsSlippageInfo": { + "message": "Si le prix fluctue entre le passage de votre ordre et sa confirmation, on parle alors d’un « effet de glissement » (slippage). Votre swap sera automatiquement annulé si ce phénomène dépasse votre paramètre de « tolérance de glissement »." + }, + "swapQuoteNofN": { + "message": "Cotation $1 sur $2", + "description": "A count of loaded quotes shown to the user while they are waiting for quotes to be fetched. $1 is the number of quotes already loaded, and $2 is the total number of quotes to load." + }, + "swapQuoteSource": { + "message": "Origine de la cotation" + }, + "swapQuotesExpiredErrorDescription": { + "message": "Veuillez demander de nouvelles cotations pour obtenir les derniers taux." + }, + "swapQuotesExpiredErrorTitle": { + "message": "Les cotations ont expiré" + }, + "swapQuotesNotAvailableErrorDescription": { + "message": "Essayez d’ajuster le montant ou les paramètres de glissement, puis réessayez." + }, + "swapQuotesNotAvailableErrorTitle": { + "message": "Aucune cotation disponible" + }, + "swapRate": { + "message": "Taux" + }, + "swapReceiving": { + "message": "Réception" + }, + "swapReceivingInfoTooltip": { + "message": "Il s’agit d’une estimation. Le montant exact dépend du glissement." + }, + "swapRequestForQuotation": { + "message": "Demande de cotation" + }, + "swapReviewSwap": { + "message": "Vérifier le swap" + }, + "swapSearchForAToken": { + "message": "Rechercher un jeton" + }, + "swapSelect": { + "message": "Sélectionner" + }, + "swapSelectAQuote": { + "message": "Sélectionnez une cotation" + }, + "swapSelectAToken": { + "message": "Sélectionnez un jeton" + }, + "swapSelectQuotePopoverDescription": { + "message": "Vous trouverez ci-dessous toutes les cotations obtenues auprès de multiples sources de liquidité." + }, + "swapSlippageNegative": { + "message": "Le glissement doit être supérieur ou égal à zéro" + }, + "swapSource": { + "message": "Source de liquidité" + }, + "swapSourceInfo": { + "message": "Nous consultons de multiples sources de liquidité (bourses, agrégateurs et teneurs de marché professionnels) pour trouver les meilleurs taux et les frais de réseau les plus bas." + }, + "swapSuggested": { + "message": "Swap proposé" + }, + "swapSuggestedGasSettingToolTipMessage": { + "message": "Les swaps sont des transactions complexes et soumises à une contrainte de temps. Nous recommandons ce prix de carburant pour assurer un bon équilibre entre le coût et la garantie d’un swap réussi." + }, + "swapSwapFrom": { + "message": "Swap de" + }, + "swapSwapSwitch": { + "message": "Inverser les jetons de/vers" + }, + "swapSwapTo": { + "message": "Swap vers" + }, + "swapToConfirmWithHwWallet": { + "message": "pour confirmer avec votre portefeuille matériel" + }, + "swapTokenAvailable": { + "message": "Votre $1 a été ajouté à votre compte.", + "description": "This message is shown after a swap is successful and communicates the exact amount of tokens the user has received for a swap. The $1 is a decimal number of tokens followed by the token symbol." + }, + "swapTokenBalanceUnavailable": { + "message": "Nous n’avons pas pu récupérer votre solde de $1", + "description": "This message communicates to the user that their balance of a given token is currently unavailable. $1 will be replaced by a token symbol" + }, + "swapTokenToToken": { + "message": "Swap de $1 vers $2", + "description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap." + }, + "swapTokenVerificationAddedManually": { + "message": "Ce jeton a été ajouté manuellement." + }, + "swapTokenVerificationMessage": { + "message": "Confirmez toujours l’adresse du jeton sur $1.", + "description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover." + }, + "swapTokenVerificationOnlyOneSource": { + "message": "Vérification effectuée uniquement sur 1 source." + }, + "swapTokenVerificationSources": { + "message": "Vérification effectuée sur $1 sources.", + "description": "Indicates the number of token information sources that recognize the symbol + address. $1 is a decimal number." + }, + "swapTooManyDecimalsError": { + "message": "$1 accepte jusqu’à $2 décimales", + "description": "$1 is a token symbol and $2 is the max. number of decimals allowed for the token" + }, + "swapTransactionComplete": { + "message": "Transaction terminée" + }, + "swapTwoTransactions": { + "message": "2 transactions" + }, + "swapUnknown": { + "message": "Inconnu" + }, + "swapVerifyTokenExplanation": { + "message": "Attention, plusieurs jetons peuvent utiliser le même nom et le même symbole. Vérifiez $1 pour vous assurer qu’il s’agit bien du jeton que vous recherchez.", + "description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network." + }, + "swapYourTokenBalance": { + "message": "$1 $2 disponibles pour un swap", + "description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol" + }, + "swapZeroSlippage": { + "message": "0 % de glissement" + }, + "swapsAdvancedOptions": { + "message": "Options avancées" + }, + "swapsExcessiveSlippageWarning": { + "message": "Le montant du glissement est trop élevé et donnera lieu à un mauvais taux. Veuillez réduire votre tolérance de glissement à une valeur inférieure à 15 %." + }, + "swapsMaxSlippage": { + "message": "Tolérance de glissement" + }, + "swapsNotEnoughForTx": { + "message": "Pas assez de $1 pour effectuer cette transaction", + "description": "Tells the user that they don't have enough of a token for a proposed swap. $1 is a token symbol" + }, + "swapsViewInActivity": { + "message": "Afficher dans l’activité" + }, + "switchEthereumChainConfirmationDescription": { + "message": "Ceci permet de remplacer le réseau sélectionné dans MetaMask par un réseau précédemment ajouté :" + }, + "switchEthereumChainConfirmationTitle": { + "message": "Autoriser ce site à changer de réseau ?" + }, + "switchNetwork": { + "message": "Changer de réseau" + }, "switchNetworks": { "message": "Changer de réseau" }, + "switchToThisAccount": { + "message": "Basculer vers ce compte" + }, + "switchingNetworksCancelsPendingConfirmations": { + "message": "Le changement de réseau annulera toutes les confirmations en attente" + }, "symbol": { "message": "Symbole" }, "symbolBetweenZeroTwelve": { "message": "Le symbole doit comporter 11 caractères ou moins." }, + "syncFailed": { + "message": "Échec de la synchronisation" + }, + "syncInProgress": { + "message": "Synchronisation en cours" + }, "syncWithMobile": { "message": "Synchroniser avec le mobile" }, @@ -957,21 +3044,44 @@ "syncWithMobileTitle": { "message": "Synchroniser avec le mobile" }, + "syncWithThreeBox": { + "message": "Synchronisation des données avec 3Box (expérimental)" + }, + "syncWithThreeBoxDescription": { + "message": "Activez cette fonction pour que vos paramètres soient sauvegardés avec 3Box. Cette fonction est pour le moment expérimentale ; utilisez-la avec prudence." + }, + "syncWithThreeBoxDisabled": { + "message": "3Box a été désactivé en raison d’une erreur lors de la synchronisation initiale" + }, "terms": { "message": "Conditions d'Utilisation" }, + "termsOfService": { + "message": "Conditions de service" + }, "testFaucet": { "message": "Faucet Testnet" }, "thisWillCreate": { "message": "Cela créera un nouveau portefeuille et une nouvelle phrase mnémotechnique" }, + "time": { + "message": "Temps" + }, "tips": { "message": "Dons" }, "to": { "message": "Destinataire" }, + "toAddress": { + "message": "Vers : $1", + "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" + }, + "toggleTestNetworks": { + "message": "$1 réseaux de test", + "description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open to the advanced settings where users can enable the display of test networks in the network dropdown." + }, "token": { "message": "Jeton" }, @@ -981,9 +3091,24 @@ "tokenContractAddress": { "message": "Adresse du contrat de jeton" }, + "tokenDecimalFetchFailed": { + "message": "Décimale de jeton requise." + }, + "tokenDetectionAnnouncement": { + "message": "Nouveau ! Une détection améliorée des jetons est disponible sur le Mainnet d’Ethereum en tant que fonctionnalité expérimentale. $1" + }, "tokenSymbol": { "message": "Symbole du Jeton" }, + "tooltipApproveButton": { + "message": "Je comprends" + }, + "total": { + "message": "Total" + }, + "transaction": { + "message": "transaction" + }, "transactionCancelAttempted": { "message": "Tentative d'annulation de la transaction avec un prix du gaz de $1 à $2" }, @@ -996,6 +3121,48 @@ "transactionCreated": { "message": "Transaction crée avec une valeur de $1 sur $2." }, + "transactionData": { + "message": "Données de transaction" + }, + "transactionDecodingAccreditationDecoded": { + "message": "Décodé par Truffle" + }, + "transactionDecodingAccreditationVerified": { + "message": "Contrat vérifié sur $1" + }, + "transactionDecodingUnsupportedNetworkError": { + "message": "Le décodage de la transaction n’est pas disponible pour l’ID de chaîne $1" + }, + "transactionDetailDappGasMoreInfo": { + "message": "Site suggéré" + }, + "transactionDetailDappGasTooltip": { + "message": "Modifier pour utiliser les frais de carburant recommandé par MetaMask selon le dernier bloc." + }, + "transactionDetailGasHeading": { + "message": "Frais de carburant estimés" + }, + "transactionDetailGasInfoV2": { + "message": "estimé" + }, + "transactionDetailGasTooltipConversion": { + "message": "En savoir plus sur les frais de carburant" + }, + "transactionDetailGasTooltipExplanation": { + "message": "Les frais de carburant sont définis par le réseau et fluctuent selon le trafic réseau et la complexité de la transaction." + }, + "transactionDetailGasTooltipIntro": { + "message": "Les frais de carburant sont payés aux mineurs de cryptomonnaies qui traitent les transactions sur le réseau $1. MetaMask ne tire aucun profit des frais de carburant." + }, + "transactionDetailGasTotalSubtitle": { + "message": "Montant + frais de carburant" + }, + "transactionDetailLayer2GasHeading": { + "message": "Frais de carburant de couche 2 (L2)" + }, + "transactionDetailMultiLayerTotalSubtitle": { + "message": "Montant + frais" + }, "transactionDropped": { "message": "Transaction abandonnée sur $2." }, @@ -1011,6 +3178,27 @@ "transactionFee": { "message": "Frais de transaction" }, + "transactionHistoryBaseFee": { + "message": "Frais de base (GWEI)" + }, + "transactionHistoryL1GasLabel": { + "message": "Total des frais de carburant L 1" + }, + "transactionHistoryL2GasLimitLabel": { + "message": "Limite de carburant L2" + }, + "transactionHistoryL2GasPriceLabel": { + "message": "Prix de carburant L2" + }, + "transactionHistoryMaxFeePerGas": { + "message": "Frais maximaux pour carburant" + }, + "transactionHistoryPriorityFee": { + "message": "Frais de priorité (GWEI)" + }, + "transactionHistoryTotalGasFee": { + "message": "Total des frais de carburant" + }, "transactionResubmitted": { "message": "La transaction a été soumise à nouveau avec une augmentation du prix du gaz, désormais de $1 à $2" }, @@ -1029,16 +3217,39 @@ "transferFrom": { "message": "Transfert Depuis" }, + "troubleConnectingToWallet": { + "message": "Nous avons eu des difficultés à nous connecter à votre $1. Essayez de vérifier votre $2 et réessayez.", + "description": "$1 is the wallet device name; $2 is a link to wallet connection guide" + }, "troubleTokenBalances": { "message": "Nous avons eu du mal à charger votre balance de jetons, vous pouvez la consulter ici :", "description": "Followed by a link (here) to view token balances" }, + "trustSiteApprovePermission": { + "message": "En accordant cette autorisation, vous permettez aux $1 suivant·s d’accéder à vos fonds" + }, "tryAgain": { "message": "Essayez à nouveau" }, + "tryAnywayOption": { + "message": "Je veux quand même essayer" + }, + "turnOnTokenDetection": { + "message": "Activer la détection améliorée des jetons" + }, + "twelveHrTitle": { + "message": "12 h :" + }, + "txInsightsNotSupported": { + "message": "Les aperçus de transaction ne sont pas pris en charge pour ce contrat à l’heure actuelle." + }, "typePassword": { "message": "Entrez votre mot de passe" }, + "u2f": { + "message": "U2F", + "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." + }, "unapproved": { "message": "Non autorisé" }, @@ -1060,42 +3271,184 @@ "unknownQrCode": { "message": "Erreur: Nous n'avons pas pu identifier le QR code" }, + "unlimited": { + "message": "Illimitée" + }, "unlock": { "message": "Déverrouiller" }, "unlockMessage": { "message": "Le web décentralisé vous attend" }, + "unrecognizedChain": { + "message": "Ce réseau personnalisé n’est pas reconnu. Nous vous recommandons de $1 avant de continuer", + "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." + }, + "unrecognizedChainLinkText": { + "message": "vérifier les détails du réseau", + "description": "Serves as link text for the 'unrecognizedChain' key. This text will be embedded inside the translation for that key." + }, + "unsendableAsset": { + "message": "L’envoi de jetons collectibles (ERC-721) n’est pas pris en charge actuellement", + "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" + }, "updatedWithDate": { "message": "Mis à jour $1" }, "urlErrorMsg": { "message": "Les URLs requièrent un préfixe HTTP/HTTPS approprié." }, + "urlExistsErrorMsg": { + "message": "Cette URL est actuellement utilisée par le réseau $1." + }, + "useCollectibleDetection": { + "message": "Détection automatique des NFT" + }, + "useCollectibleDetectionDescription": { + "message": "L’affichage des médias et des données des NFT peut exposer votre adresse IP à des serveurs centralisés. Des API tierces (comme OpenSea) sont utilisées pour détecter les NFT dans votre portefeuille. Cela expose donc l’adresse de votre compte à ces services. Désactivez cette option si vous ne souhaitez pas que l’appli récupère des données auprès de ces services." + }, + "usePhishingDetection": { + "message": "Utiliser la fonction antihameçonnage" + }, + "usePhishingDetectionDescription": { + "message": "Cela permet d’afficher un avertissement pour les domaines d’hameçonnage ciblant les utilisateurs d’Ethereum" + }, + "useTokenDetection": { + "message": "Utiliser la détection des jetons" + }, + "useTokenDetectionDescription": { + "message": "Nous utilisons des API tierces pour détecter et afficher les nouveaux jetons envoyés à votre portefeuille. Désactivez cette option si vous ne souhaitez pas que MetaMask récupère les données de ces services." + }, "usedByClients": { "message": "Utilisé par une variété de clients différents" }, "userName": { "message": "Nom d'utilisateur" }, + "verifyThisTokenDecimalOn": { + "message": "Décimale de jeton disponible sur $1", + "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" + }, + "verifyThisTokenOn": { + "message": "Vérifier ce jeton sur $1", + "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" + }, + "verifyThisUnconfirmedTokenOn": { + "message": "Vérifiez ce jeton sur $1 et vérifiez si c’est bien celui que vous souhaitez échanger.", + "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" + }, "viewAccount": { "message": "Afficher le compte" }, + "viewAllDetails": { + "message": "Afficher tous les détails" + }, "viewContact": { "message": "Voir contact" }, + "viewFullTransactionDetails": { + "message": "Afficher tous les détails de la transaction" + }, + "viewMore": { + "message": "Afficher plus" + }, + "viewOnBlockExplorer": { + "message": "Afficher sur l’explorateur de blocs" + }, + "viewOnCustomBlockExplorer": { + "message": "Afficher $1 à $2", + "description": "$1 is the action type. e.g (Account, Transaction, Swap) and $2 is the Custom Block Exporer URL" + }, + "viewOnEtherscan": { + "message": "Afficher $1 sur Etherscan", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, + "viewOnOpensea": { + "message": "Afficher sur Opensea" + }, + "viewinExplorer": { + "message": "Afficher $1 sur Opensea", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, "visitWebSite": { "message": "Visitez notre site web" }, + "walletConnectionGuide": { + "message": "notre guide de connexion des portefeuilles matériels" + }, + "walletCreationSuccessDetail": { + "message": "Votre portefeuille est bien protégé. Conservez votre Phrase secrète de récupération en sécurité et en toute discrétion. C’est votre responsabilité !" + }, + "walletCreationSuccessReminder1": { + "message": "MetaMask ne peut pas récupérer votre Phrase secrète de récupération." + }, + "walletCreationSuccessReminder2": { + "message": "MetaMask ne vous demandera jamais votre Phrase secrète de récupération." + }, + "walletCreationSuccessReminder3": { + "message": "1$ avec n’importe qui, sinon vous risquez de voir vos fonds subtilisés", + "description": "$1 is separated as walletCreationSuccessReminder3BoldSection so that we can bold it" + }, + "walletCreationSuccessReminder3BoldSection": { + "message": "Ne partagez jamais votre Phrase secrète de récupération", + "description": "This string is localized separately from walletCreationSuccessReminder3 so that we can bold it" + }, + "walletCreationSuccessTitle": { + "message": "Portefeuille créé avec succès" + }, + "walletSeedRestore": { + "message": "Phrase secrète de récupération du portefeuille" + }, + "web3ShimUsageNotification": { + "message": "Nous avons remarqué que ce site Web a essayé d’utiliser l’API window.web3 supprimée. Si le site semble être défectueux, veuillez cliquer sur $1 pour plus d’informations.", + "description": "$1 is a clickable link." + }, + "webhid": { + "message": "WebHID", + "description": "Refers to a interface for connecting external devices to the browser. Used for connecting ledger to the browser. Read more here https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API" + }, "welcome": { "message": "Bienvenue dans la Beta de MetaMask" }, "welcomeBack": { "message": "Bienvenue à nouveau !" }, + "welcomeExploreDescription": { + "message": "Stockez, envoyez et dépensez des cryptomonnaies et des actifs." + }, + "welcomeExploreTitle": { + "message": "Explorez des applis décentralisées" + }, + "welcomeLoginDescription": { + "message": "Utilisez votre MetaMask pour vous connecter à des applis décentralisées. Nul besoin de vous inscrire !" + }, + "welcomeLoginTitle": { + "message": "Dites bonjour à votre portefeuille" + }, + "welcomeToMetaMask": { + "message": "C’est parti !" + }, + "welcomeToMetaMaskIntro": { + "message": "MetaMask est un portefeuille sécurisé utilisé par des millions de personnes qui rend l’univers du web3 accessible à toutes et à tous." + }, + "whatsNew": { + "message": "Nouveautés", + "description": "This is the title of a popup that gives users notifications about new features and updates to MetaMask." + }, + "whatsThis": { + "message": "Qu’est-ce que c’est ?" + }, "writePhrase": { "message": "Écrivez cette phrase sur une feuille de papier et rangez-la dans un endroit sûr. Si vous voulez encore plus de sécurité, notez-la sur plusieurs feuilles de papier et rangez-les dans deux ou trois endroits différents." }, + "xOfY": { + "message": "$1 sur $2", + "description": "$1 and $2 are intended to be two numbers, where $2 is a total, and $1 is a count towards that total" + }, + "xOfYPending": { + "message": "$1 sur $2 en attente", + "description": "$1 and $2 are intended to be two numbers, where $2 is a total number of pending confirmations, and $1 is a count towards that total" + }, "yesLetsTry": { "message": "Oui, essayons" }, diff --git a/app/_locales/gu/messages.json b/app/_locales/gu/messages.json index 42e898e1a..4dc737d9e 100644 --- a/app/_locales/gu/messages.json +++ b/app/_locales/gu/messages.json @@ -1,4 +1,7 @@ { + "QRHardwareSignRequestCancel": { + "message": "નકારો" + }, "about": { "message": "વિશે" }, @@ -44,6 +47,9 @@ "create": { "message": "બનાવો" }, + "custom": { + "message": "વિગતવાર" + }, "delete": { "message": "કાઢી નાખો" }, diff --git a/app/_locales/he/messages.json b/app/_locales/he/messages.json index e1f58025e..3d0df01d6 100644 --- a/app/_locales/he/messages.json +++ b/app/_locales/he/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "דחה" + }, + "QRHardwareWalletImporterTitle": { + "message": "סריקת קוד QR" + }, "about": { "message": "מידע כללי" }, @@ -256,6 +262,9 @@ "currentLanguage": { "message": "שפה נוכחית" }, + "custom": { + "message": "מתקדם" + }, "customGas": { "message": "התאמה אישית של דלק" }, @@ -530,6 +539,9 @@ "learnMore": { "message": "למדו עוד" }, + "learnMoreUpperCase": { + "message": "למדו עוד" + }, "ledgerAccountRestriction": { "message": "עליך להשתמש בחשבון האחרון שלך לפני שתוכל/י להוסיף חשבון חדש." }, diff --git a/app/_locales/hi/messages.json b/app/_locales/hi/messages.json index 16f493124..580fbdd35 100644 --- a/app/_locales/hi/messages.json +++ b/app/_locales/hi/messages.json @@ -1,4 +1,49 @@ { + "QRHardwareInvalidTransactionTitle": { + "message": "त्रुटि" + }, + "QRHardwareMismatchedSignId": { + "message": "असंगत लेनदेन डेटा। कृपया लेनदेन विवरण की जांच करें।" + }, + "QRHardwarePubkeyAccountOutOfRange": { + "message": "कोई और खाता नहीं। यदि आप नीचे असूचीबद्ध किसी अन्य खाते तक पहुंचना चाहते हैं, तो कृपया अपने हार्डवेयर वॉलेट को फिर से कनेक्ट करें और उसका चयन करें।" + }, + "QRHardwareScanInstructions": { + "message": "QR कोड को अपने कैमरे के सामने रखें। स्क्रीन धुंधली है, लेकिन इससे रीडिंग प्रभावित नहीं होगी।" + }, + "QRHardwareSignRequestCancel": { + "message": "अस्वीकार करें" + }, + "QRHardwareSignRequestDescription": { + "message": "अपने वॉलेट से साइन करने के बाद, हस्ताक्षर लेने के लिए 'हस्ताक्षर प्राप्त करें' पर क्लिक करें" + }, + "QRHardwareSignRequestGetSignature": { + "message": "हस्ताक्षर प्राप्त करें" + }, + "QRHardwareSignRequestSubtitle": { + "message": "अपने वॉलेट से QR कोड को स्कैन करें" + }, + "QRHardwareSignRequestTitle": { + "message": "हस्ताक्षर का अनुरोध करें" + }, + "QRHardwareUnknownQRCodeTitle": { + "message": "त्रुटि" + }, + "QRHardwareUnknownWalletQRCode": { + "message": "अमान्य QR कोड। कृपया हार्डवेयर वॉलेट के सिंक QR कोड को स्कैन करें।" + }, + "QRHardwareWalletImporterTitle": { + "message": "QR कोड स्कैन करें" + }, + "QRHardwareWalletSteps1Description": { + "message": "एक एयरगैप हार्डवेयर व़ॉलेट से कनेक्ट करें जो QR-कोड के जरिये संचार करता है। आधिकारिक रुप से सपोर्टेड एयरगैप हार्डवेयर में शामिल है:" + }, + "QRHardwareWalletSteps1Title": { + "message": "QR-आधारित HW वॉलेट" + }, + "QRHardwareWalletSteps2Description": { + "message": "एयरगैप वॉल्ट और Ngrave (जल्द आ रहा है)" + }, "about": { "message": "इसके बारे में" }, @@ -28,6 +73,10 @@ "accountName": { "message": "खाते का नाम" }, + "accountNameDuplicate": { + "message": "इस अकाउंट का नाम पहले से हीं मौजूद है", + "description": "This is an error message shown when the user enters a new account name that matches an existing account name" + }, "accountOptions": { "message": "खाता विकल्प" }, @@ -43,6 +92,15 @@ "activityLog": { "message": "गतिविधि लॉग" }, + "add": { + "message": "जोड़ें" + }, + "addANetwork": { + "message": "एक नेटवर्क जोड़ें" + }, + "addANickname": { + "message": "एक उपनाम जोड़ें" + }, "addAcquiredTokens": { "message": "आपके द्वारा MetaMask का उपयोग करके प्राप्त किए गए टोकन जोड़ें" }, @@ -52,6 +110,9 @@ "addContact": { "message": "संपर्क जोड़ें" }, + "addCustomToken": { + "message": "कस्टम टोकन जोड़ें" + }, "addCustomTokenByContractAddress": { "message": "टोकन नहीं मिल रहा है? आप अपने पते को चिपकाकर मैन्युअल रूप से किसी भी टोकन को जोड़ सकते हैं। टोकन अनुबंध पते $1 पर मिल सकते हैं।", "description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum" @@ -76,6 +137,12 @@ "addFriendsAndAddresses": { "message": "उन मित्रों और पतों को जोड़ें, जिन पर आप भरोसा करते हैं" }, + "addMemo": { + "message": "मेमो जोड़ें" + }, + "addNFT": { + "message": "NFT जोड़ें" + }, "addNetwork": { "message": "नेटवर्क जोड़ें" }, @@ -91,12 +158,36 @@ "addToken": { "message": "टोकन जोड़ें" }, + "address": { + "message": "पता" + }, + "addressBookIcon": { + "message": "पता पुस्तिका आइकन" + }, "advanced": { "message": "उन्नत" }, + "advancedBaseGasFeeToolTip": { + "message": "जब आपका लेन-देन ब्लॉक में शामिल हो जाता है, तो आपके अधिकतम आधार शुल्क और वास्तविक आधार शुल्क के बीच का कोई भी अंतर वापस कर दिया जाता है। कुल राशि की गणना अधिकतम आधार शुल्क (GWEI में) * गैस सीमा के रुप में की जाती है।" + }, + "advancedGasFeeDefaultOptIn": { + "message": "इन $1 को \"एडवांस\" के लिए मेरे डिफ़ॉल्ट के रूप में सहेजें" + }, + "advancedGasFeeDefaultOptOut": { + "message": "हमेशा इन मूल्यों और एडवांस सेटिंग को डिफ़ॉल्ट के रूप में उपयोग करें।" + }, + "advancedGasFeeModalTitle": { + "message": "एडवांस गैस शुल्क" + }, + "advancedGasPriceTitle": { + "message": "गैस की कीमत" + }, "advancedOptions": { "message": "उन्नत विकल्प" }, + "advancedPriorityFeeToolTip": { + "message": "प्राथमिकता शुल्क (उर्फ \"माइनर टिप\") सीधे खनिकों के पास जाता है और उन्हें आपके लेन-देन को प्राथमिकता देने के लिए प्रोत्साहित करता है।" + }, "advancedSettingsDescription": { "message": "डेवलपर सुविधाओं तक पहुँचें, स्टेट लॉग डाउनलोड करें, खाता रीसेट करें, टेस्टनेट और कस्टम RPC सेट करें" }, @@ -130,6 +221,10 @@ "allowExternalExtensionTo": { "message": "इस बाहरी एक्सटेंशन को इसकी अनुमति दें:" }, + "allowSpendToken": { + "message": "आपके $1 तक पहुंचने की अनुमति दें?", + "description": "$1 is the symbol of the token that are requesting to spend" + }, "allowThisSiteTo": { "message": "इस साइट को इसकी अनुमति दें:" }, @@ -175,6 +270,9 @@ "approved": { "message": "अनुमोदित" }, + "approvedAmountWithColon": { + "message": "स्वीकृत राशि:" + }, "asset": { "message": "परिसंपत्ति" }, @@ -229,9 +327,43 @@ "balanceOutdated": { "message": "शेषराशि पुरानी हो सकती है" }, + "baseFee": { + "message": "आधार शुल्क" + }, "basic": { "message": "बेसिक" }, + "betaMetamaskDescription": { + "message": "लाखों लोग का भरोसा, MetaMask एक सुरक्षित वॉलेट है जो वेब3 की दुनिया को सबके लिए सुलभ बनाता है।" + }, + "betaMetamaskDescriptionExplanation": { + "message": "आगामी फीचर के रिलीज़ होने से पहले उनके परीक्षण के लिए इस संस्करण का उपयोग करें। आपका उपयोग और फीडबैक हमें MetaMask के सर्वोत्तम संस्करण को संभव बनाने में मदद करता है। MetaMask बीटा का आपका उपयोग हमारे मानक $1 के साथ साथ $2 के अधीन है। बीटा के रूप में, वहां बग का खतरा बढ़ सकता है। आगे बढ़ने पर, आप इन खतरों को स्वीकार करते हैं और पहचानते हैं, साथ हीं साथ वो खतरे हमारे नियम औऱ बीटा नियम में पाए जाते हैं।", + "description": "$1 represents localization item betaMetamaskDescriptionExplanationTermsLinkText. $2 represents localization item betaMetamaskDescriptionExplanationBetaTermsLinkText" + }, + "betaMetamaskDescriptionExplanationBetaTermsLinkText": { + "message": "अनुपूरक बीटा नियम" + }, + "betaMetamaskDescriptionExplanationTermsLinkText": { + "message": "नियम" + }, + "betaMetamaskVersion": { + "message": "MetaMask बीटा संस्करण" + }, + "betaWelcome": { + "message": "MetaMask बीटा में आपका स्वागत है" + }, + "blockExplorerAccountAction": { + "message": "अकाउंट", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Account in Explorer" + }, + "blockExplorerAssetAction": { + "message": "संपत्ति", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Asset in Explorer" + }, + "blockExplorerSwapAction": { + "message": "विनिमय", + "description": "This is used with viewOnEtherscan e.g View Swap on Etherscan" + }, "blockExplorerUrl": { "message": "ब्लॉक एक्सप्लोरर URL" }, @@ -251,9 +383,21 @@ "buildContactList": { "message": "अपनी संपर्क सूची बनाएं" }, + "builtAroundTheWorld": { + "message": "MetaMask दुनिया भर में डिज़ाइन किया और बनाया गया है।" + }, + "busy": { + "message": "व्यस्त" + }, "buy": { "message": "खरीदें" }, + "buyWithTransak": { + "message": "Transak के साथ ETH खरीदें" + }, + "buyWithTransakDescription": { + "message": "Transak 59+ देशों में डेबिट कार्ड और बैंक हस्तांतरण (स्थान के आधार पर) का समर्थन करता है। ETH आपके MetaMask अकाउंट में जमा करता है।" + }, "buyWithWyre": { "message": "ETH को Wyre साथ खरीदें" }, @@ -269,6 +413,15 @@ "cancel": { "message": "रद्द करें" }, + "cancelEdit": { + "message": "संपादित करना रद्द करें" + }, + "cancelPopoverTitle": { + "message": "लेन-देन रद्द करें" + }, + "cancelSpeedUp": { + "message": "किसी लेन-देन को रद्द करना या बढ़ाना।" + }, "cancellationGasFee": { "message": "रद्दीकरण गैस शुल्क" }, @@ -287,6 +440,10 @@ "chromeRequiredForHardwareWallets": { "message": "अपने हार्डवेयर वॉलेट से कनेक्ट करने के लिए आपको Google Chrome पर MetaMask का उपयोग करने की आवश्यकता है।" }, + "clickToConnectLedgerViaWebHID": { + "message": "अपने लेजर को WebHID के ज़रिये कनेक्ट करने के लिए यहां क्लिक करें", + "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" + }, "clickToRevealSeed": { "message": "गुप्त शब्दों को प्रकट करने के लिए यहाँ क्लिक करें" }, @@ -299,6 +456,9 @@ "confirmPassword": { "message": "पासवर्ड की पुष्टि करें" }, + "confirmRecoveryPhrase": { + "message": "सीक्रेट रिकवरी फ्रेज़ की पुष्टि करें" + }, "confirmSecretBackupPhrase": { "message": "अपने गुप्त बैकअप वाक्यांश की पुष्टि करें" }, @@ -406,12 +566,18 @@ "continue": { "message": "जारी रखें" }, + "continueToTransak": { + "message": "Transak के लिए जारी रखें" + }, "continueToWyre": { "message": "Wyre पर जारी रखें" }, "contract": { "message": "अनुबंध" }, + "contractAddress": { + "message": "अनुबंध का पता" + }, "contractAddressError": { "message": "आप टोकन के अनुबंध पते पर टोकन भेज रहे हैं। इसके परिणामस्वरूप इन टोकनों का नुकसान हो सकता है।" }, @@ -430,6 +596,9 @@ "copyPrivateKey": { "message": "यह आपकी निजी कुंजी है (कॉपी करने के लिए क्लिक करें)" }, + "copyRawTransactionData": { + "message": "लेन-देन का कच्चा डेटा कॉपी करें" + }, "copyToClipboard": { "message": "क्लिपबोर्ड पर कॉपी करें" }, @@ -445,6 +614,9 @@ "createAccount": { "message": "खाता बनाएँ" }, + "createNewWallet": { + "message": "एक नया वॉलेट बनाएं" + }, "createPassword": { "message": "पासवर्ड बनाएँ" }, @@ -466,9 +638,22 @@ "currentLanguage": { "message": "वर्तमान भाषा" }, + "currentTitle": { + "message": "मौजूदा:" + }, + "currentlyUnavailable": { + "message": "इस नेटवर्क पर अनुपलब्ध" + }, + "custom": { + "message": "उन्नत" + }, "customGas": { "message": "गैस अनुकूलित करें" }, + "customGasSettingToolTipMessage": { + "message": "गैस की कीमत को अनुकूलित करने के लिए $1 का उपयोग करें। यदि आप परिचित नहीं हैं तो ये भ्रामक हो सकता है। अपनी ज़िम्मेदारी पर बातचीत करें।", + "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold fontweight" + }, "customGasSubTitle": { "message": "शुल्क बढ़ाने से प्रसंस्करण समय में कमी हो सकती है, लेकिन इसकी गारंटी नहीं होती है।" }, @@ -478,9 +663,29 @@ "customToken": { "message": "कस्टम टोकन" }, + "dappSuggested": { + "message": "साइट का सुझाव दिया गया" + }, + "dappSuggestedGasSettingToolTipMessage": { + "message": "$1 ने इस कीमत का सुझाव दिया है।", + "description": "$1 is url for the dapp that has suggested gas settings" + }, + "dappSuggestedShortLabel": { + "message": "साइट" + }, + "dappSuggestedTooltip": { + "message": "$1 ने इस कीमत की अनुशंसा की है।", + "description": "$1 represents the Dapp's origin" + }, + "data": { + "message": "डेटा" + }, "dataBackupFoundInfo": { "message": "MetaMask की पिछली स्थापना के दौरान आपके कुछ खाता डेटा का बैकअप लिया गया था। इसमें आपकी सेटिंग, संपर्क और टोकन शामिल हो सकते हैं। क्या आप अब इस डेटा को पुनर्स्थापित करना चाहेंगे?" }, + "dataHex": { + "message": "Hex" + }, "decimal": { "message": "टोकन दशमलव" }, @@ -522,6 +727,9 @@ "depositEther": { "message": "Ether जमा करें" }, + "description": { + "message": "विवरण" + }, "details": { "message": "विवरण" }, @@ -579,9 +787,122 @@ "edit": { "message": "संपादित करें" }, + "editANickname": { + "message": "उपनाम संपादित करें" + }, + "editAddressNickname": { + "message": "पता उपनाम संपादित करें" + }, "editContact": { "message": "संपर्क संपादित करें" }, + "editGasEducationButtonText": { + "message": "मुझे कैसे चुनना चाहिए?" + }, + "editGasEducationHighExplanation": { + "message": "समय के प्रति संवेदनशील लेन-देन (जैसे कि विनिमय) के लिए यह सबसे अच्छा है क्योंकि यह एक सफलतापूर्वक लेन-देन की संभावना को बढ़ाता है। यदि विनिमय को प्रोसेस होने में ज़्यादा समय लगता है तो यह विफल हो सकता है और इसके परिणामस्वरुप आपके गैस शुल्क की कुछ हानि हो सकती है।" + }, + "editGasEducationLowExplanation": { + "message": "एक निम्न गैस शुल्क का उपयोग केवल तभी किया जाना चाहिए जब प्रोसेस का समय कम महत्वपूर्ण हो। निम्न शुल्क से यह अनुमान लगाना मुश्किल हो जाता है कि आपका लेन-देन कब (या यदि) सफलतापूर्वक होगा।" + }, + "editGasEducationMediumExplanation": { + "message": "एक मध्यम गैस शुल्क भेजने, निकालने या अन्य गैर-समय संवेदनशील लेन-देन के लिए अच्छा है। इस सेटिंग के परिणामस्वरुप अक्सर एक सफल लेन-देन होता है।" + }, + "editGasEducationModalIntro": { + "message": "सही गैस शुल्क का चयन लेन-देन के प्रकार और यह आपके लिए कितना महत्वपूर्ण है इस पर निर्भर करता है।" + }, + "editGasEducationModalTitle": { + "message": "कैसे चुनें?" + }, + "editGasFeeModalTitle": { + "message": "गैस शुल्क संपादित करें" + }, + "editGasHigh": { + "message": "उच्च" + }, + "editGasLimitOutOfBounds": { + "message": "गैस की सीमा कम से कम $1 होनी चाहिए" + }, + "editGasLimitOutOfBoundsV2": { + "message": "गैस की सीमा $1 से अधिक और $2 से कम होनी चाहिए", + "description": "$1 is the minimum limit for gas and $2 is the maximum limit" + }, + "editGasLimitTooltip": { + "message": "गैस की सीमा, गैस की वो अधिकतम यूनिट है जितनी आप उपयोग करना चाहते हैं। गैस की यूनिट “अधिकतम प्राथमिकता शुल्क” और “अधिकतम शुल्क” का गुणक होती हैं।" + }, + "editGasLow": { + "message": "निम्न" + }, + "editGasMaxBaseFeeGWEIImbalance": { + "message": "अधिकतम आधार शुल्क प्राथमिकता शुल्क से कम नहीं हो सकता है।" + }, + "editGasMaxBaseFeeHigh": { + "message": "अधिकतम आधार शुल्क आवश्यकता से अधिक है" + }, + "editGasMaxBaseFeeLow": { + "message": "मौजूदा नेटवर्क स्थितियों के लिए अधिकतम आधार शुल्क कम है" + }, + "editGasMaxFeeHigh": { + "message": "अधिकतम शुल्क आवश्यकता से अधिक है" + }, + "editGasMaxFeeLow": { + "message": "नेटवर्क स्थितियों के लिए अधिकतम शुल्क बहुत कम है।" + }, + "editGasMaxFeePriorityImbalance": { + "message": "अधिकतम शुल्क अधिकतम प्राथमिकता शुल्क से कम नहीं हो सकता है" + }, + "editGasMaxFeeTooltip": { + "message": "अधिकतम शुल्क वह अधिकतम शुल्क है जिसका आप भुगतान करेंगे (आधार शुल्क + प्राथमिकता शुल्क)।" + }, + "editGasMaxPriorityFeeBelowMinimum": { + "message": "अधिकतम प्राथमिकता शुल्क 0 GWEI से अधिक होना चाहिए" + }, + "editGasMaxPriorityFeeBelowMinimumV2": { + "message": "प्राथमिकता शुल्क 0 से अधिक होना चाहिए।" + }, + "editGasMaxPriorityFeeHigh": { + "message": "अधिकतम प्राथमिकता शुल्क आवश्यकता से अधिक है। आप आवश्यकता से अधिक भुगतान कर सकते हैं।" + }, + "editGasMaxPriorityFeeHighV2": { + "message": "प्राथमिकता शुल्क आवश्यकता से अधिक है। आप आवश्यकता से अधिक भुगतान कर सकते हैं" + }, + "editGasMaxPriorityFeeLow": { + "message": "मौजूदा नेटवर्क स्थितियों के लिए अधिकतम आधार शुल्क कम है" + }, + "editGasMaxPriorityFeeLowV2": { + "message": "मौजूदा नेटवर्क स्थितियों के लिए प्राथमिकता शुल्क कम है" + }, + "editGasMaxPriorityFeeTooltip": { + "message": "अधिकतम प्राथमिकता शुल्क (उर्फ \"माइनर टिप\") सीधे खनिकों के पास जाता है और उन्हें आपके लेनदेन को प्राथमिकता देने के लिए प्रोत्साहित करता है। आप अक्सर अपनी अधिकतम सेटिंग का भुगतान करेंगे" + }, + "editGasMedium": { + "message": "माध्यम" + }, + "editGasPriceTooLow": { + "message": "गैस का मूल्य 0 से अधिक होना चाहिए" + }, + "editGasPriceTooltip": { + "message": "लेन-देन सबमिट करते समय इस नेटवर्क को \"गैस मूल्य\" फ़ील्ड की आवश्यकता होती है। गैस का मूल्य वह राशि है जो आप प्रति यूनिट गैस का भुगतान करेंगे।" + }, + "editGasSubTextAmountLabel": { + "message": "अधिकतम राशि:", + "description": "This is meant to be used as the $1 substitution editGasSubTextAmount" + }, + "editGasSubTextFeeLabel": { + "message": "अधिकतम शुल्क:" + }, + "editGasTitle": { + "message": "प्राथमिकता संपादित करें" + }, + "editGasTooLow": { + "message": "अज्ञात प्रोसेसिंग समय" + }, + "editGasTooLowTooltip": { + "message": "मौजूदा बाजार स्थितियों के लिए आपका अधिकतम शुल्क या अधिकतम प्राथमिकता शुल्क कम हो सकता है। हम नहीं जानते कि आपका लेन-देन कब (या यदि) प्रोसेस किया जाएगा। " + }, + "editGasTooLowWarningTooltip": { + "message": "यह आपके अधिकतम शुल्क को कम करता है लेकिन यदि नेटवर्क ट्रैफ़िक बढ़ता है तो आपके लेन-देन में देरी हो सकती है या लेन-देन विफल हो सकता है।" + }, "editNonceField": { "message": "नॉन्स संपादित करें" }, @@ -591,6 +912,22 @@ "editPermission": { "message": "अनुमति संपादित करें" }, + "enableAutoDetect": { + "message": " ऑटो डिटेक्ट इनेबल करें" + }, + "enableFromSettings": { + "message": " इसे सेटिंग्स से इनेबल करें।" + }, + "enableOpenSeaAPI": { + "message": "OpenSea API इनेबल करें" + }, + "enableOpenSeaAPIDescription": { + "message": "NFT डेटा लाने के लिए OpenSea के API का उपयोग करें। NFT ऑटो-डिटेक्शन OpenSea के API पर निर्भर करता है, और इसके बंद होने पर उपलब्ध नहीं होगा।" + }, + "enableToken": { + "message": "$1 इनेबल करें", + "description": "$1 is a token symbol, e.g. ETH" + }, "encryptionPublicKeyNotice": { "message": "$1 आपकी सार्वजनिक एन्क्रिप्शन कुंजी चाहता है। सहमति देने पर, यह साइट आपके लिए एन्क्रिप्ट किए गए संदेशों को लिखने में सक्षम होगी।", "description": "$1 is the web3 site name" @@ -633,12 +970,21 @@ "message": "समापन बिंदु ने अलग चेन ID लौटाई है: $1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "ensIllegalCharacter": { + "message": "ENS के लिए गैर-कानूनी कैरेक्टर।" + }, "ensNotFoundOnCurrentNetwork": { "message": "वर्तमान नेटवर्क पर ENS नाम नहीं मिला। Ethereum Mainnet पर स्विच करने का प्रयास करें।" }, + "ensNotSupportedOnNetwork": { + "message": "नेटवर्क ENS का समर्थन नहीं करता है" + }, "ensRegistrationError": { "message": "ENS नाम पंजीकरण में त्रुटि" }, + "ensUnknownError": { + "message": "ENS लुकअप विफल हुआ।" + }, "enterAnAlias": { "message": "एक उपनाम दर्ज करें" }, @@ -702,9 +1048,18 @@ "etherscanView": { "message": "Etherscan पर खाता देखें" }, + "etherscanViewOn": { + "message": "Etherscan पर देखें" + }, "expandView": { "message": "दृश्य का विस्तार करें" }, + "experimental": { + "message": "प्रयोगात्मक" + }, + "experimentalSettingsDescription": { + "message": "टोकन का डिटेक्शन करना और बहुत कुछ" + }, "exportPrivateKey": { "message": "निजी कुंजी निर्यात करें" }, @@ -724,6 +1079,9 @@ "failureMessage": { "message": "कुछ गलत हुआ और हम कार्रवाई को पूरा करने में असमर्थ थे" }, + "fakeTokenWarning": { + "message": "कोई भी टोकन बना सकता है, जिसमें मौजूदा टोकन के नकली संस्करण को बनाना शामिल है। $1 के बारे में और अधिक जानें" + }, "fast": { "message": "तेज़" }, @@ -741,6 +1099,21 @@ "message": "फ़ाइल आयात काम नहीं कर रहा है? यहाँ क्लिक करें!", "description": "Helps user import their account from a JSON file" }, + "flaskSnapSettingsCardButtonCta": { + "message": "विवरण देखें", + "description": "Call to action a user can take to see more information about the Snap that is installed" + }, + "flaskSnapSettingsCardDateAddedOn": { + "message": "जोड़ा गया", + "description": "Start of the sentence describing when and where snap was added" + }, + "flaskSnapSettingsCardFrom": { + "message": "से", + "description": "Part of the sentence describing when and where snap was added" + }, + "followUsOnTwitter": { + "message": "ट्विटर पर हमें फॉलो करें" + }, "forbiddenIpfsGateway": { "message": "निषिद्ध IPFS गेटवे: कृपया एक CID गेटवे निर्दिष्ट करें" }, @@ -760,6 +1133,19 @@ "functionType": { "message": "फ़ंक्शन का प्रकार" }, + "gas": { + "message": "गैस" + }, + "gasDisplayAcknowledgeDappButtonText": { + "message": "सुझाये गए गैस शुल्क को संपादित करें" + }, + "gasDisplayDappWarning": { + "message": "यह गैस शुल्क $1 द्वारा सुझाया गया है। इसे ओवरराइड करने से आपके लेन-देन में समस्या हो सकती है। यदि आपके पास कोई सवाल हैं तो कृपया $1 तक पहुंचें।", + "description": "$1 represents the Dapp's origin" + }, + "gasEstimatesUnavailableWarning": { + "message": "हमारे निम्न, मध्यम और उच्च अनुमान उपलब्ध नहीं हैं।" + }, "gasLimit": { "message": "गैस की सीमा" }, @@ -773,6 +1159,12 @@ "message": "गैस की सीमा कम से कम $1 होनी चाहिए", "description": "$1 is the custom gas limit, in decimal." }, + "gasLimitV2": { + "message": "गैस सीमा" + }, + "gasOption": { + "message": "गैस विकल्प" + }, "gasPrice": { "message": "गैस मूल्य (GWEI)" }, @@ -791,6 +1183,38 @@ "gasPriceInfoTooltipContent": { "message": "गैस मूल्य, Ether की उस राशि को निर्दिष्ट करता है, जिसे आप गैस की प्रत्येक इकाई के लिए भुगतान करना चाहते हैं।" }, + "gasTimingHoursShort": { + "message": "$1 घंटे", + "description": "$1 represents a number of hours" + }, + "gasTimingMinutes": { + "message": "$1 मिनट", + "description": "$1 represents a number of minutes" + }, + "gasTimingMinutesShort": { + "message": "$1मिनट", + "description": "$1 represents a number of minutes" + }, + "gasTimingNegative": { + "message": "शायद $1 में", + "description": "$1 represents an amount of time" + }, + "gasTimingPositive": { + "message": "संभवत < $1 में", + "description": "$1 represents an amount of time" + }, + "gasTimingSeconds": { + "message": "$1 सेकंड", + "description": "$1 represents a number of seconds" + }, + "gasTimingSecondsShort": { + "message": "$1 सेकंड", + "description": "$1 represents a number of seconds" + }, + "gasTimingVeryPositive": { + "message": "<$1 में बहुत संभावना है", + "description": "$1 represents an amount of time" + }, "gasUsed": { "message": "प्रयुक्त गैस" }, @@ -818,9 +1242,15 @@ "getStarted": { "message": "प्रारंभ करें" }, + "goBack": { + "message": "वापस जाएं" + }, "goerli": { "message": "Goerli टेस्ट नेटवर्क" }, + "grantedToWithColon": { + "message": "को प्रदान की गई:" + }, "happyToSeeYou": { "message": "हम आपसे मिलकर खुश हैं।" }, @@ -863,9 +1293,25 @@ "hideZeroBalanceTokens": { "message": "बिना शेष राशि वाले टोकन छिपाएं" }, + "high": { + "message": "आक्रामक" + }, + "highGasSettingToolTipDialog": { + "message": "उच्च संभावना, अस्थिर बाजारों में भी" + }, + "highGasSettingToolTipMessage": { + "message": "लोकप्रिय NFT ड्रॉप जैसी चीज़ों की वजह से नेटवर्क ट्रैफिक में वृद्धि को कवर करने के लिए $1 का उपयोग करें।", + "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" + }, + "highLowercase": { + "message": "उच्च" + }, "history": { "message": "इतिहास" }, + "id": { + "message": "ID" + }, "import": { "message": "आयात करें", "description": "Button to import an account from a selected file" @@ -873,6 +1319,9 @@ "importAccount": { "message": "खाता आयात करें" }, + "importAccountError": { + "message": "अकाउंट इम्पोर्ट करने में त्रुटि।" + }, "importAccountLinkText": { "message": "गुप्त रिकवरी फ्रेज़ का उपयोग करके आयात करें" }, @@ -886,12 +1335,31 @@ "message": "या $1", "description": "$1 represents the text from `importAccountLinkText` as a link" }, + "importExistingWalletDescription": { + "message": "अपना सीक्रेट रिकवरी फ्रेज़ (उर्फ़ सीड फ्रेज़) दर्ज करें जो आपको अपना वॉलेट बनाने पर दिया गया था। $1", + "description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link" + }, + "importExistingWalletTitle": { + "message": "सीक्रेट रिकवरी फ्रेज़ के साथ मौजूदा वॉलेट इम्पोर्ट करें" + }, + "importMyWallet": { + "message": "मेरा वॉलेट इम्पोर्ट करें" + }, + "importNFTs": { + "message": "NFT इम्पोर्ट करें" + }, "importTokenQuestion": { "message": "टोकन का आयात करें?" }, "importTokenWarning": { "message": "कोई भी किसी भी नाम के साथ एक टोकन बना सकता है, जिसमें मौजूदा टोकन के नकली संस्करण शामिल हैं। अपने जोखिम पर जोड़ें और व्यापार करें!" }, + "importTokens": { + "message": "टोकन इम्पोर्ट करें" + }, + "importTokensCamelCase": { + "message": "टोकन इम्पोर्ट करें" + }, "importWallet": { "message": "वॉलेट आयात करें" }, @@ -915,6 +1383,9 @@ "insufficientFunds": { "message": "अपर्याप्त धन।" }, + "insufficientFundsForGas": { + "message": "गैस के लिए अपर्याप्त फंड" + }, "insufficientTokens": { "message": "अपर्याप्त टोकन।" }, @@ -974,10 +1445,19 @@ "ipfsGatewayDescription": { "message": "ENS सामग्री रिज़ॉल्यूशन का उपयोग करने के लिए IPFS CID गेटवे का URL दर्ज करें।" }, + "jsDeliver": { + "message": "jsDeliver" + }, "jsonFile": { "message": "JSON फ़ाइल", "description": "format for importing an account" }, + "keystone": { + "message": "Keystone" + }, + "keystoneTutorial": { + "message": " (ट्यूटोरियल)" + }, "knownAddressRecipient": { "message": "ज्ञात अनुबंध पता।" }, @@ -990,12 +1470,57 @@ "lastConnected": { "message": "अंतिम बार कनेक्ट किया गया" }, + "layer1Fees": { + "message": "लेयर 1 शुल्क" + }, + "learmMoreAboutGas": { + "message": "गैस के बारे में $1 चाहते हैं?" + }, + "learnCancelSpeeedup": { + "message": "$1 करने का तरीका जानें", + "description": "$1 is link to cancel or speed up transactions" + }, "learnMore": { "message": "अधिक जानें" }, + "learnMoreUpperCase": { + "message": "अधिक जानें" + }, + "learnScamRisk": { + "message": "घोटाले और सुरक्षा जोखिम।" + }, "ledgerAccountRestriction": { "message": "नया खाता जोड़ने से पहले आपको अपने अंतिम खाते का उपयोग करना होगा।" }, + "ledgerConnectionInstructionCloseOtherApps": { + "message": "अपने डिवाइस से जुड़े किसी अन्य सॉफ़्टवेयर को बंद करें और फिर रिफ़्रेश करने के लिए यहां क्लिक करें।" + }, + "ledgerConnectionInstructionHeader": { + "message": "पुष्टि पर क्लिक करने से पहले:" + }, + "ledgerConnectionInstructionStepFour": { + "message": "अपने लेजर डिवाइस पर \"स्मार्ट कॉन्ट्रैक्ट डेटा\" या \"ब्लाइंड साइनिंग\" इनेबल करें" + }, + "ledgerConnectionInstructionStepOne": { + "message": "सेटिंग्स> एडवांस के तहत उपयोग लेजर लाइव इनेबल करें" + }, + "ledgerConnectionInstructionStepThree": { + "message": "अपने लेजर डिवाइस में प्लग इन करें और Ethereum ऐप चुनें" + }, + "ledgerConnectionInstructionStepTwo": { + "message": "लेजर लाइव ऐप खोलें और अनलॉक करें" + }, + "ledgerConnectionPreferenceDescription": { + "message": "अनुकूलित करें कि आप अपने लेजर को मेटामास्क से कैसे कनेक्ट करते हैं। $1 की अनुशंसा की जाती है, लेकिन अन्य विकल्प उपलब्ध हैं। यहां और पढ़ें: $2", + "description": "A description that appears above a dropdown where users can select between up to three options - Ledger Live, U2F or WebHID - depending on what is supported in their browser. $1 is the recommended browser option, it will be either WebHID or U2f. $2 is a link to an article where users can learn more, but will be the translation of the learnMore message." + }, + "ledgerDeviceOpenFailureMessage": { + "message": "लेजर डिवाइस खोलने में विफल रहा। आपका लेजर अन्य सॉफ्टवेयर से कनेक्ट हो सकता है। कृपया लेजर लाइव या अपने लेजर डिवाइस से जुड़े अन्य एप्लिकेशन को बंद करें, और फिर से कनेक्ट करने का प्रयास करें।" + }, + "ledgerLive": { + "message": "लेजर लाइव", + "description": "The name of a desktop app that can be used with your ledger device. We can also use it to connect a users Ledger device to MetaMask." + }, "ledgerLiveApp": { "message": "Ledger Live ऐप" }, @@ -1005,12 +1530,22 @@ "ledgerTimeout": { "message": "Ledger Live जवाब देने में बहुत अधिक समय ले रहा है या कनेक्शन समयबाह्य हो गया है। सुनिश्चित करें कि Ledger Live ऐप खुला है और आपका डिवाइस अनलॉक है।" }, + "ledgerTransportChangeWarning": { + "message": "यदि आपका लेजर लाइव ऐप खुला है, तो कृपया किसी भी खुले लेजर लाइव कनेक्शन को डिस्कनेक्ट करें और लेजर लाइव ऐप को बंद करें।" + }, + "ledgerWebHIDNotConnectedErrorMessage": { + "message": "लेज़र डिवाइस कनेक्ट नहीं था। यदि आप अपना लेजर कनेक्ट करना चाहते हैं, तो कृपया 'जारी रखें' पर फिर से क्लिक करें और HID कनेक्शन को स्वीकृत करें", + "description": "An error message shown to the user during the hardware connect flow." + }, "letsGoSetUp": { "message": "हाँ, आइए सेट करते हैं!" }, "likeToImportTokens": { "message": "क्या आप इन टोकन को जोड़ना चाहते हैं?" }, + "link": { + "message": "लिंक" + }, "links": { "message": "लिंक" }, @@ -1032,15 +1567,48 @@ "lockTimeTooGreat": { "message": "लॉक समय बहुत अधिक है" }, + "low": { + "message": "निम्न" + }, + "lowGasSettingToolTipMessage": { + "message": "एक सस्ती कीमत की प्रतीक्षा के लिए $1 का उपयोग करें। समय का अनुमान बहुत कम सही होता है क्योंकि कीमतें कुछ हद तक अप्रत्याशित होती हैं।", + "description": "$1 is key 'low' separated here so that it can be passed in with bold fontweight" + }, + "lowLowercase": { + "message": "निम्न" + }, + "lowPriorityMessage": { + "message": "इसके बाद भविष्य के लेन-देन होंगे। यह कीमत आखिरी बार कुछ समय पहले देखी गई थी।" + }, "mainnet": { "message": "Ethereum Mainnet" }, "makeAnotherSwap": { "message": "एक नया स्वैप बनाएँ" }, + "makeSureNoOneWatching": { + "message": "सुनिश्चित करें कि आपकी स्क्रीन कोई भी नहीं देख रहा है।", + "description": "Warning to users to be care while creating and saving their new Secret Recovery Phrase" + }, "max": { "message": "अधिकतम" }, + "maxBaseFee": { + "message": "अधिकतम आधार शुल्क" + }, + "maxFee": { + "message": "अधिकतम शुल्क" + }, + "maxPriorityFee": { + "message": "अधिकतम प्राथमिकता शुल्क" + }, + "medium": { + "message": "बाज़ार" + }, + "mediumGasSettingToolTipMessage": { + "message": "मौजूदा बाज़ार मूल्य पर तेज़ी से प्रोसेस करने के लिए $1का उपयोग करें।", + "description": "$1 is key 'medium' (text: 'Market') separated here so that it can be passed in with bold fontweight" + }, "memo": { "message": "मेमो" }, @@ -1071,6 +1639,9 @@ "metametricsCommitmentsAllowOptOut": { "message": "हमेशा आपको सेटिंग्स के माध्यम से ऑप्ट-आउट करने की अनुमति देगा" }, + "metametricsCommitmentsAllowOptOut2": { + "message": "सेटिंग्स के माध्यम से हमेशा ऑप्ट-आउट करने में सक्षम हों" + }, "metametricsCommitmentsBoldNever": { "message": "कभी नहीं", "description": "This string is localized separately from some of the commitments so that we can bold it" @@ -1078,6 +1649,9 @@ "metametricsCommitmentsIntro": { "message": "MetaMask निम्न चीज़ें करेगा.." }, + "metametricsCommitmentsNeverCollect": { + "message": "कभी भी चाभियां, पता, लेन-देन, शेष राशि, हैश, या कोई व्यक्तिगत सूचना एकत्र ना करें" + }, "metametricsCommitmentsNeverCollectIP": { "message": "$1 आपका पूरा IP पता एकत्र करेगा", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" @@ -1086,6 +1660,12 @@ "message": "$1 कुंजी, पते, लेनदेन, शेषराशि, हैश या कोई भी व्यक्तिगत जानकारी एकत्र करता है", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" }, + "metametricsCommitmentsNeverIP": { + "message": "कभी भी अपना पूरा IP पता एकत्र न करें" + }, + "metametricsCommitmentsNeverSell": { + "message": "फायदे के लिए कभी डेटा न बेचें। कभी भी!" + }, "metametricsCommitmentsNeverSellDataForProfit": { "message": "$1 लाभ के लिए डेटा बेचता है। हमेशा!", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" @@ -1099,6 +1679,12 @@ "metametricsOptInDescription": { "message": "MetaMask इस बात की बेहतर समझ प्राप्त करने के लिए डेटा एकत्र करना चाहता है कि हमारे उपयोगकर्ता विस्तार के साथ कैसे सहभागिता करते हैं। इस डेटा का उपयोग हमारे उत्पाद और Ethereum पारिस्थितिकी तंत्र की उपयोगिता और उपयोगकर्ता अनुभव को लगातार सुधारने के लिए किया जाएगा।" }, + "metametricsOptInDescription2": { + "message": "हम अपने उत्पाद की उपयोगिता में सुधार के लिए बुनियादी उपयोग डेटा एकत्र करना चाहते हैं। ये मेट्रिक्स करेंगे..." + }, + "metametricsTitle": { + "message": "मेटामास्क को बेहतर बनाने के लिए 6M+ यूज़र से जुड़ें" + }, "mismatchedChain": { "message": "इस चेन ID के लिए नेटवर्क विवरण हमारे रिकॉर्ड से मेल नहीं खाता। हम अनुशंसा करते हैं कि आप आगे बढ़ने से पहले $1।", "description": "$1 is a clickable link with text defined by the 'mismatchedChainLinkText' key" @@ -1107,6 +1693,15 @@ "message": "नेटवर्क विवरण सत्यापित करें", "description": "Serves as link text for the 'mismatchedChain' key. This text will be embedded inside the translation for that key." }, + "missingNFT": { + "message": "क्या अपना NFT नहीं देख रहे हैं?" + }, + "missingToken": { + "message": "क्या अपना टोकन नहीं देख रहे हैं?" + }, + "mobileSyncWarning": { + "message": "'एक्सटेंशन के साथ सिंक' फीचर अस्थायी रूप से अक्षम है। यदि आप MetaMask मोबाइल पर अपने एक्सटेंशन वॉलेट का उपयोग करना चाहते हैं, तो अपने मोबाइल ऐप पर: वॉलेट सेटअप ऑप्शन पर वापस जाएं और 'सीक्रेट रिकवरी फ्रेज़ के साथ इम्पोर्ट करें' विकल्प चुनें। फिर अपने वॉलेट को मोबाइल में इम्पोर्ट करने के लिए अपने एक्सटेंशन वॉलेट के सीक्रेट फ्रेज़ का उपयोग करें।" + }, "mustSelectOne": { "message": "कम से कम 1 टोकन का चयन करना चाहिए।" }, @@ -1123,9 +1718,15 @@ "message": "मदद चाहिए? $1 से संपर्क करें", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" }, + "needHelpFeedback": { + "message": "अपनी फीडबैक साझा करें" + }, "needHelpLinkText": { "message": "MetaMask सहायता" }, + "needHelpSubmitTicket": { + "message": "टिकट जमा करें" + }, "needImportFile": { "message": "आयात करने के लिए आपको एक फ़ाइल का चयन करना होगा।", "description": "User is important an account and needs to add a file to continue" @@ -1148,6 +1749,12 @@ "networkNameEthereum": { "message": "Ethereum" }, + "networkNamePolygon": { + "message": "बहुभुज" + }, + "networkNameRinkeby": { + "message": "Rinkeby" + }, "networkNameTestnet": { "message": "Testnet" }, @@ -1157,6 +1764,20 @@ "networkSettingsDescription": { "message": "कस्टम RPC नेटवर्क जोड़ें और संपादित करें" }, + "networkStatus": { + "message": "नेटवर्क की स्थिति" + }, + "networkStatusBaseFeeTooltip": { + "message": "आधार शुल्क नेटवर्क द्वारा निर्धारित किया जाता है और हर 13-14 सेकंड में बदलता है। हमारे $1 और $2 विकल्प अचानक वृद्धि के लिए ज़िम्मेदार हैं।", + "description": "$1 and $2 are bold text for Medium and Aggressive respectively." + }, + "networkStatusPriorityFeeTooltip": { + "message": "प्राथमिकता शुल्क की सीमा (उर्फ \"माइनर टिप\")। यह खनिकों के पास जाता है और उन्हें आपके लेनदेन को प्राथमिकता देने के लिए प्रोत्साहित करता है।" + }, + "networkStatusStabilityFeeTooltip": { + "message": "पिछले 72 घंटों के सापेक्ष गैस शुल्क $1 है।", + "description": "$1 is networks stability value - stable, low, high" + }, "networkURL": { "message": "नेटवर्क URL" }, @@ -1179,12 +1800,27 @@ "message": "खाता $1", "description": "Default name of next account to be created on create account screen" }, + "newCollectibleAddFailed": { + "message": "संग्रहणीय नहीं जोड़ा गया था क्योंकि: $1" + }, + "newCollectibleAddedMessage": { + "message": "संग्रहणीय सफलतापूर्वक जोड़ा गया था!" + }, "newContact": { "message": "नया संपर्क" }, "newContract": { "message": "नया अनुबंध" }, + "newNFTsDetected": { + "message": "नया! NFT का डिटेक्शन" + }, + "newNFTsDetectedInfo": { + "message": "MetaMask को Opensea से NFT का स्वचालित रूप से पता लगाने और अपने मेटामास्क वॉलेट में प्रदर्शित करने की अनुमति दें।" + }, + "newNetworkAdded": { + "message": "\"$1\" सफलतापूर्वक जोड़ा गया था!" + }, "newPassword": { "message": "नया पासवर्ड (न्यूनतम 8 वर्ण)" }, @@ -1197,6 +1833,9 @@ "newTransactionFee": { "message": "नया लेनदेन शुल्क" }, + "newValues": { + "message": "नए मान" + }, "next": { "message": "अगला" }, @@ -1204,6 +1843,15 @@ "message": "नॉन्स $1 के सुझाए गए नॉन्स से अधिक है", "description": "The next nonce according to MetaMask's internal logic" }, + "nftTokenIdPlaceholder": { + "message": "संग्रहणीय ID दर्ज करें" + }, + "nfts": { + "message": "NFT" + }, + "nickname": { + "message": "उपनाम" + }, "noAccountsFound": { "message": "दी गई खोज क्वेरी के लिए कोई खाता नहीं मिला" }, @@ -1213,9 +1861,15 @@ "noAlreadyHaveSeed": { "message": "नहीं, मेरे पास पहले से ही एक गुप्त रिकवरी फ्रेज़ है" }, + "noConversionDateAvailable": { + "message": "करेंसी के रुपांतरण की कोई तारीख उपलब्ध नहीं है" + }, "noConversionRateAvailable": { "message": "कोई भी रूपांतरण दर उपलब्ध नहीं है" }, + "noNFTs": { + "message": "अभी तक कोई NFT नहीं" + }, "noThanks": { "message": "जी नहीं, धन्यवाद" }, @@ -1240,6 +1894,9 @@ "nonceFieldHeading": { "message": "कस्टम नॉन्स" }, + "notBusy": { + "message": "व्यस्त नहीं" + }, "notCurrentAccount": { "message": "क्या यह सही खाता है? यह आपके वॉलेट में वर्तमान में चयनित खाते से अलग है" }, @@ -1298,6 +1955,43 @@ "message": "Chrome उपयोगकर्ताओं के लिए Ledger सहायता अद्यतन", "description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update" }, + "notifications7DescriptionOne": { + "message": "MetaMask v10.1.0 ने लेजर डिवाइस का उपयोग करते समय EIP-1559 लेन-देन के लिए नया समर्थन शामिल किया", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for ledger and EIP1559 in v10.1.0" + }, + "notifications7DescriptionTwo": { + "message": "Ethereum Mainnet पर लेनदेन पूरा करने के लिए, सुनिश्चित करें कि आपके लेजर डिवाइस में नवीनतम फर्मवेयर है।", + "description": "Description of a notification in the 'See What's New' popup. Describes the need to update ledger firmware." + }, + "notifications7Title": { + "message": "लेजर फर्मवेयर अपडेट", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." + }, + "notifications8ActionText": { + "message": "एडवांस सेटिंग्स पर जाएं", + "description": "Description on an action button that appears in the What's New popup. Tells the user that if they click it, they will go to our Advanced Settings page." + }, + "notifications8DescriptionOne": { + "message": "MetaMask v10.4.0 के अनुसार, अब आपको अपने लेजर डिवाइस को मेटामास्क से कनेक्ट करने के लिए लेजर लाइव की आवश्यकता नहीं है।", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for how Ledger Live is no longer needed to connect the device." + }, + "notifications8DescriptionTwo": { + "message": "एक आसान और अधिक स्थिर लेज़र अनुभव के लिए, सेटिंग्स के एडवांस टैब पर जाएं और 'पसंदीदा लेज़र कनेक्शन प्रकार' को 'WebHID' पर स्विच करें।", + "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." + }, + "notifications8Title": { + "message": "लेजर कनेक्शन में सुधार", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users that there is an improvement in how they can connect their device." + }, + "notifications9DescriptionOne": { + "message": "स्मार्ट अनुबंध लेन-देन की पुष्टि करते समय अब हम आपको 'डेटा' टैब पर अधिक जानकारी प्रदान करेंगे।" + }, + "notifications9DescriptionTwo": { + "message": "अब आप पुष्टि करने से पहले अपने लेन-देन के विवरण को बेहतर तरीके से समझ सकते हैं, और अधिक आसानी से अपनी पता पुस्तिका में लेन-देन के पते जोड़ सकते हैं, जिससे आपको सुरक्षित और सूचित निर्णय लेने में मदद मिलेगी।" + }, + "notifications9Title": { + "message": "हम लेन-देन को पढ़ना आसान बना रहे हैं।" + }, "ofTextNofM": { "message": "/" }, @@ -1313,16 +2007,79 @@ "on": { "message": "चालू" }, + "onboardingCreateWallet": { + "message": "एक नया वॉलेट बनाएं" + }, + "onboardingImportWallet": { + "message": "मौजूदा वॉलेट इम्पोर्ट करें" + }, + "onboardingPinExtensionBillboardAccess": { + "message": "पूरी तरह से पहुंच बनाएं" + }, + "onboardingPinExtensionBillboardDescription": { + "message": "ये एक्सटेंशन जानकारी देख और बदल सकते हैं" + }, + "onboardingPinExtensionBillboardDescription2": { + "message": "इस साइट पर।" + }, + "onboardingPinExtensionBillboardTitle": { + "message": "एक्सटेंशन" + }, + "onboardingPinExtensionChrome": { + "message": "ब्राउज़र एक्सटेंशन आइकन पर क्लिक करें" + }, + "onboardingPinExtensionDescription": { + "message": "अपने ब्राउज़र पर MetaMask को पिन करें ताकि यह सुलभ हो और लेन-देन की पुष्टि को देखना आसान हो सके।" + }, + "onboardingPinExtensionDescription2": { + "message": "आप एक्सटेंशन पर क्लिक करके MetaMask खोल सकते हैं और 1 क्लिक से अपने वॉलेट तक पहुंच सकते हैं।" + }, + "onboardingPinExtensionDescription3": { + "message": "ब्राउज़र एक्सटेंशन आइकन पर क्लिक करें ताकि इस तक तुरंत पहुंच सकें" + }, + "onboardingPinExtensionLabel": { + "message": "MetaMask को पिन करें" + }, + "onboardingPinExtensionStep1": { + "message": "1" + }, + "onboardingPinExtensionStep2": { + "message": "2" + }, + "onboardingPinExtensionTitle": { + "message": "आपका MetaMask इंस्टॉल पूरा हो गया है!" + }, "onboardingReturnNotice": { "message": "\"$1\" इस टैब को बंद कर देगा और वापस $2 पर ले जाएगा", "description": "Return the user to the site that initiated onboarding" }, + "onboardingShowIncomingTransactionsDescription": { + "message": "आपके वॉलेट में आने वाले लेन-देन को दिखाना $1 के साथ संचार पर निर्भर करता है। Etherscan की पहुंच आपके Ethereum और आपके IP पते तक होगी। $2 देखें।", + "description": "$1 is a clickable link with text defined by the 'etherscan' key. $2 is a clickable link with text defined by the 'privacyMsg' key." + }, + "onboardingUsePhishingDetectionDescription": { + "message": "फ़िशिंग डिटेक्शन अलर्ट $1 के साथ संचार पर निर्भर करते हैं। jsDeliver की पहुंच आपके IP पते तक होगी। $2 देखें।", + "description": "The $1 is the word 'jsDeliver', from key 'jsDeliver' and $2 is the words Privacy Policy from key 'privacyMsg', both separated here so that it can be wrapped as a link" + }, "onlyAddTrustedNetworks": { "message": "एक दुर्भावनापूर्ण नेटवर्क प्रदाता ब्लॉकचेन की स्थिति के बारे में झूठ बोल सकता है और आपकी नेटवर्क गतिविधि को रिकॉर्ड कर सकता है। केवल उन कस्टम नेटवर्क को जोड़ें, जिन पर आप भरोसा करते हैं।" }, "onlyConnectTrust": { "message": "केवल उन साइटों से कनेक्ट करें, जिन पर आप भरोसा करते हैं।" }, + "openFullScreenForLedgerWebHid": { + "message": "अपने लेज़र को WebHID के माध्यम से कनेक्ट करने के लिए MetaMask को पूर्ण स्क्रीन में खोलें।", + "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." + }, + "optional": { + "message": "वैकल्पिक" + }, + "optionalWithParanthesis": { + "message": "(वैकल्पिक)" + }, + "or": { + "message": "या" + }, "origin": { "message": "उत्पत्ति" }, @@ -1341,6 +2098,12 @@ "passwordNotLongEnough": { "message": "पासवर्ड की लंबाई पर्याप्त नहीं है" }, + "passwordSetupDetails": { + "message": "यह पासवर्ड आपके MetaMask वॉलेट को केवल इसी डिवाइस पर अनलॉक करेगा। MetaMask इस पासवर्ड को फिर से प्राप्त नहीं कर सकता है।" + }, + "passwordTermsWarning": { + "message": "मैं समझता हूं कि MetaMask मेरे लिए यह पासवर्ड फिर से प्राप्त नहीं कर सकता। $1" + }, "passwordsDontMatch": { "message": "पासवर्ड मेल नहीं खाते" }, @@ -1351,6 +2114,19 @@ "pending": { "message": "लंबित" }, + "pendingTransactionInfo": { + "message": "यह लेन-देन तब तक प्रोसेस नहीं होगा जब तक वह पूरा नहीं हो जाता।" + }, + "pendingTransactionMultiple": { + "message": "आपके पास ($1) लंबित लेन-देन हैं।" + }, + "pendingTransactionSingle": { + "message": "आपके पास (1) लंबित लेन-देन है।", + "description": "$1 is count of pending transactions" + }, + "permissionRequest": { + "message": "अनुमति अनुरोध" + }, "permissions": { "message": "अनुमतियाँ" }, @@ -1361,6 +2137,10 @@ "message": "+ $1 अधिक", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, + "preferredLedgerConnectionType": { + "message": "वरीयता वाले लेजर कनेक्शन के प्रकार", + "description": "A header for a dropdown in the advanced section of settings. Appears above the ledgerConnectionPreferenceDescription message" + }, "prev": { "message": "पिछला" }, @@ -1370,6 +2150,12 @@ "primaryCurrencySettingDescription": { "message": "चेन की मूल मुद्रा (जैसे ETH) में प्रदर्शित मूल्यों को प्राथमिकता देने के लिए मूल का चयन करें। अपनी चयनित फ़िएट मुद्रा में प्रदर्शित मूल्यों को प्राथमिकता देने के लिए फ़िएट का चयन करें।" }, + "priorityFee": { + "message": "प्राथमिकता शुल्क" + }, + "priorityFeeProperCase": { + "message": "प्राथमिकता शुल्क" + }, "privacyMsg": { "message": "गोपनीयता नीति" }, @@ -1383,6 +2169,9 @@ "privateNetwork": { "message": "निजी नेटवर्क" }, + "proceedWithTransaction": { + "message": "मैं फिर भी आगे बढ़ना चाहता हूं" + }, "proposedApprovalLimit": { "message": "प्रस्तावित अनुमोदन सीमा" }, @@ -1410,6 +2199,9 @@ "recipientAddressPlaceholder": { "message": "खोज, सार्वजनिक पता (0x) या ENS" }, + "recommendedGasLabel": { + "message": "अनुशंसित" + }, "recoveryPhraseReminderBackupStart": { "message": "यहाँ से प्रारंभ करें" }, @@ -1434,6 +2226,9 @@ "recoveryPhraseReminderTitle": { "message": "अपने धन को सुरक्षित रखें" }, + "refreshList": { + "message": "सूची रिफ्रेश करें" + }, "reject": { "message": "अस्वीकार करें" }, @@ -1449,6 +2244,9 @@ "rejected": { "message": "अस्वीकृत" }, + "remember": { + "message": "याद रखें:" + }, "remindMeLater": { "message": "मुझे बाद में याद दिलाएँ" }, @@ -1461,6 +2259,9 @@ "removeAccountDescription": { "message": "यह खाता आपके वॉलेट से निकाल दिया जाएगा। कृपया सुनिश्चित करें कि जारी रखने से पहले आपके पास इस आयातित खाते के लिए मूल गुप्त रिकवरी फ्रेज़ या निजी कुंजी है। आप खाता ड्रॉप-डाउन से फिर से खाते आयात कर सकते हैं या बना सकते हैं। " }, + "removeNFT": { + "message": "NFT हटाएं" + }, "requestsAwaitingAcknowledgement": { "message": "अनुरोधों के स्वीकार किए जाने की प्रतीक्षा की जा रही है" }, @@ -1549,12 +2350,33 @@ "secretPhrase": { "message": "अपनी तिजोरी को पुनर्स्थापित करने के लिए अपने गुप्त फ्रेज़ को यहाँ दर्ज करें।" }, + "secretPhraseWarning": { + "message": "यदि आप किसी दूसरे सीक्रेट रिकवरी फ्रेज़ के उपयोग को पुनर्स्थापित करते हैं, इस ऐप से आपके वर्तमान वॉलेट, अकाउंट, और संपति स्थायी रुप से हटा दिये जाएंगे। यह क्रिया पूर्ववत नहीं की जा सकती।" + }, + "secretRecoveryPhrase": { + "message": "सीक्रेट रिकवरी फ्रेज़" + }, + "secureWallet": { + "message": "सुरक्षित वॉलेट" + }, "securityAndPrivacy": { "message": "सुरक्षा और गोपनीयता" }, "securitySettingsDescription": { "message": "गोपनीयता सेटिंग्स और वॉलेट का गुप्त रिकवरी फ्रेज़" }, + "seedPhraseConfirm": { + "message": "सीक्रेट रिकवरी फ्रेज़ की पुष्टि करें" + }, + "seedPhraseEnterMissingWords": { + "message": "सीक्रेट रिकवरी फ्रेज़ की पुष्टि करें" + }, + "seedPhraseIntroNotRecommendedButtonCopy": { + "message": "मुझे बाद में याद दिलाएं (अनुशंसित नहीं)" + }, + "seedPhraseIntroRecommendedButtonCopy": { + "message": "मेरा वॉलेट सुरक्षित करें (अनुशंसित)" + }, "seedPhraseIntroSidebarBulletFour": { "message": "लिख लें और कई गुप्त स्थानों में स्टोर करें।" }, @@ -1600,6 +2422,12 @@ "seedPhraseReq": { "message": "गुप्त रिकवरी फ्रेज़ में 12, 15, 18, 21 या 24 शब्द होते हैं" }, + "seedPhraseWriteDownDetails": { + "message": "12-शब्दों के इस सीक्रेट रिकवरी फ्रेज़ को लिखें और ऐसे स्थान पर सहेजें, जहां आप भरोसा करते हैं और केवल आप ही पहुंच सकते हैं।" + }, + "seedPhraseWriteDownHeader": { + "message": "अपना सीक्रेट रिकवरी फ्रेज़ लिखें" + }, "selectAHigherGasFee": { "message": "अपने लेनदेन की प्रक्रिया में तेज़ी लाने के लिए उच्च गैस शुल्क का चयन करें। *" }, @@ -1621,6 +2449,9 @@ "selectHdPath": { "message": "HD पथ का चयन करें" }, + "selectNFTPrivacyPreference": { + "message": "सेटिंग्स में NFT डिटेक्शन चालू करें" + }, "selectPathHelp": { "message": "यदि आपको नीचे आपके मौजूदा लेजर खाते दिखाई नहीं देते हैं, तो पथ को \"लीगेसी (MEW / MyCrypto)\" पर स्विच करने का प्रयास करें।" }, @@ -1640,15 +2471,31 @@ "message": "$1 भेजें", "description": "Symbol of the specified token" }, + "sendTo": { + "message": "को भेजें" + }, "sendTokens": { "message": "टोकन भेजें" }, + "sendingNativeAsset": { + "message": "$1 भेजा जा रहा है", + "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" + }, "separateEachWord": { "message": "प्रत्येक शब्द को एक रिक्ति से अलग करें" }, + "setAdvancedPrivacySettings": { + "message": "एडवांस गोपनीयता सेटिंग्स निर्धारित करें" + }, + "setAdvancedPrivacySettingsDetails": { + "message": "MetaMask उत्पाद की उपयोगिता और सुरक्षा को बढ़ाने के लिए इन विश्वसनीय तीसरे-पक्ष की सेवाओं का उपयोग करता है।" + }, "settings": { "message": "सेटिंग" }, + "show": { + "message": "दिखाएं" + }, "showAdvancedGasInline": { "message": "उन्नत गैस नियंत्रण" }, @@ -1667,6 +2514,9 @@ "showHexDataDescription": { "message": "भेजने की स्क्रीन पर हेक्स डेटा फ़ील्ड दिखाने के लिए इसका चयन करें" }, + "showHide": { + "message": "दिखाएं/छिपाएं" + }, "showIncomingTransactions": { "message": "आने वाले लेनदेन दिखाएँ" }, @@ -1679,9 +2529,18 @@ "showPrivateKeys": { "message": "निजी कुंजियाँ दिखाएँ" }, + "showRecommendations": { + "message": "अनुशंसा दिखाएं" + }, "showSeedPhrase": { "message": "गुप्त रिकवरी फ्रेज़ दिखाएँ" }, + "showTestnetNetworks": { + "message": "परीक्षण नेटवर्क दिखाएं" + }, + "showTestnetNetworksDescription": { + "message": "नेटवर्क सूची में परीक्षण नेटवर्क दिखाने के लिए इसे चुनें" + }, "sigRequest": { "message": "हस्ताक्षर का अनुरोध" }, @@ -1700,18 +2559,45 @@ "signed": { "message": "हस्ताक्षर किया गया" }, + "simulationErrorMessage": { + "message": "यह लेन-देन विफल होने की उम्मीद है। इसे निष्पादित करने के प्रयास के महंगा होने की उम्मीद है लेकिन विफल है, और इसकी अनुशंसा नहीं की जाती है।" + }, + "simulationErrorMessageV2": { + "message": "हम गैस का अनुमान नहीं लगा पाए। अनुबंध में कोई त्रुटि हो सकती है और यह लेन-देन विफल हो सकता है।" + }, + "skip": { + "message": "छोड़ें" + }, + "skipAccountSecurity": { + "message": "अकाउंट सुरक्षा छोड़ें?" + }, + "skipAccountSecurityDetails": { + "message": "मैं समझता हूं कि जब तक मैं अपने सीक्रेट रिकवरी फ्रेज़ का बैकअप नहीं लेता, मैं अपने अकाउंट और उनकी सभी संपत्ति खो सकता हूं।" + }, "slow": { "message": "धीमा" }, "somethingWentWrong": { "message": "ओह! कुछ गलत हो गया।" }, + "source": { + "message": "स्रोत" + }, "speedUp": { "message": "जल्दी करें" }, "speedUpCancellation": { "message": "इस रद्दीकरण को गति दें" }, + "speedUpExplanation": { + "message": "हमने मौजूदा नेटवर्क स्थितियों के आधार पर गैस शुल्क को अपडेट किया है और इसे कम से कम 10% (नेटवर्क के लिए ज़रुरी) बढ़ा दिया है।" + }, + "speedUpPopoverTitle": { + "message": "लेन-देन में तेजी लाएं" + }, + "speedUpTooltipText": { + "message": "नया गैस शुल्क" + }, "speedUpTransaction": { "message": "इस लेनदेन को गति दें" }, @@ -1734,6 +2620,12 @@ "spendLimitTooLarge": { "message": "खर्च सीमा बहुत अधिक है" }, + "stable": { + "message": "स्थिर" + }, + "stableLowercase": { + "message": "स्थिर" + }, "stateLogError": { "message": "स्टेट लॉग को पुनर्प्राप्त करने में त्रुटि।" }, @@ -1752,6 +2644,13 @@ "statusNotConnected": { "message": "कनेक्ट नहीं है" }, + "step1LatticeWallet": { + "message": "सुनिश्चित करें कि आपका Lattice1 कनेक्ट होने के लिए तैयार है" + }, + "step1LatticeWalletMsg": { + "message": "MetaMask के सेट अप होने और ऑनलाइन होने के बाद आप उसे अपने Lattice1 डिवाइस से कनेक्ट कर सकते हैं। अपना डिवाइस अनलॉक करें और अपनी डिवाइस ID तैयार रखें। हार्डवेयर वॉलेट का उपयोग करने के बारे में अधिक जानकारी के लिए, $1", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, "step1LedgerWallet": { "message": "Ledger ऐप डाउनलोड करें" }, @@ -1815,6 +2714,10 @@ "message": "इस स्वैप को पूरा करने के लिए आपको $1 और $2 की आवश्यकता होगी", "description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol." }, + "swapBestOfNQuotes": { + "message": "$1 उद्धरणों में से सर्वश्रेष्ठ।", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, "swapBuildQuotePlaceHolderText": { "message": "$1 के मिलान वाले कोई भी टोकन उपलब्ध नहीं हैं", "description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text" @@ -1834,6 +2737,9 @@ "swapDecentralizedExchange": { "message": "विकेंद्रीकृत विनिमय" }, + "swapDirectContract": { + "message": "प्रत्यक्ष अनुबंध" + }, "swapEditLimit": { "message": "सीमा संपादित करें" }, @@ -1841,6 +2747,10 @@ "message": "यह आवश्यक है और MetaMask को आपके $1 को स्वैप करने की अनुमति देता है।", "description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps." }, + "swapEnableTokenForSwapping": { + "message": "विनिमय के लिए यह $1 होगा", + "description": "$1 is for the 'enableToken' key, e.g. 'enable ETH'" + }, "swapEstimatedNetworkFees": { "message": "अनुमानित नेटवर्क शुल्क" }, @@ -1854,6 +2764,9 @@ "swapFailedErrorTitle": { "message": "स्वैप विफल रहा" }, + "swapFetchingQuotes": { + "message": "उद्धरण प्राप्त करना" + }, "swapFetchingQuotesErrorDescription": { "message": "हम्म्म... कुछ गलत हो गया। पुनः प्रयास करें या यदि त्रुटियाँ बनी रहती हैं, तो ग्राहक सहायता से संपर्क करें।" }, @@ -1867,12 +2780,26 @@ "message": "$1 से $2 का स्वैप", "description": "Tells a user that they need to confirm on their hardware wallet a swap of 2 tokens. $1 is a source token and $2 is a destination token" }, + "swapGasFeesDetails": { + "message": "गैस शुल्क का अनुमान लगाया जाता है और नेटवर्क ट्रैफ़िक और लेन-देन की जटिलता के आधार पर इसमें उतार-चढ़ाव आएगा।" + }, + "swapGasFeesLearnMore": { + "message": "गैस शुल्क के बारे में और अधिक जानें" + }, "swapGasFeesSplit": { "message": "पिछली स्क्रीन पर गैस शुल्क इन दो लेनदेन के बीच विभाजित हैं।" }, + "swapGasFeesSummary": { + "message": "क्रिप्टो खनिकों को गैस शुल्क का भुगतान किया जाता है जो $1 नेटवर्क पर लेन-देन की प्रक्रिया करते हैं। MetaMask को गैस शुल्क से लाभ नहीं होता है।", + "description": "$1 is the selected network, e.g. Ethereum or BSC" + }, "swapHighSlippageWarning": { "message": "स्लिपेज राशि बहुत अधिक है।" }, + "swapIncludesMMFee": { + "message": "एक $1% MetaMask शुल्क शामिल है।", + "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." + }, "swapLowSlippageError": { "message": "लेनदेन विफल हो सकता है, अधिकतम स्लिपेज बहुत कम हो सकता है।" }, @@ -1886,6 +2813,10 @@ "message": "हम हर बार शीर्ष चलनिधि स्रोतों से सबसे अच्छे मूल्य पाते हैं। इस उद्धरण में $1% का शुल्क स्वतः ही शामिल हो जाता है।", "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." }, + "swapNQuotesWithDot": { + "message": "$ 1 उद्धरण।", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, "swapNewQuoteIn": { "message": "$1 में नए उद्धरण", "description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00" @@ -1978,6 +2909,12 @@ "swapSourceInfo": { "message": "हम सर्वोत्तम दरों और न्यूनतम नेटवर्क शुल्क का पता लगाने के लिए कई चलनिधि स्रोतों (एक्सचेंज, एग्रीगेटर और पेशेवर बाजार निर्माताओं) की खोज करते हैं।" }, + "swapSuggested": { + "message": "विनिमय का सुझाव दिया" + }, + "swapSuggestedGasSettingToolTipMessage": { + "message": "विनिमय जटिल और समय के प्रति संवेदनशील लेन-देन हैं। हम एक सफल विनिमय की लागत और विश्वास के बीच अच्छे संतुलन के लिए इस गैस शुल्क की अनुशंसा करते हैं।" + }, "swapSwapFrom": { "message": "इससे स्वैप करें" }, @@ -2016,6 +2953,10 @@ "message": "$1 स्रोतों पर सत्यापित।", "description": "Indicates the number of token information sources that recognize the symbol + address. $1 is a decimal number." }, + "swapTooManyDecimalsError": { + "message": "$1अनुमति देता है दशमलव $2 तक की", + "description": "$1 is a token symbol and $2 is the max. number of decimals allowed for the token" + }, "swapTransactionComplete": { "message": "लेनदेन पूर्ण" }, @@ -2076,6 +3017,12 @@ "symbolBetweenZeroTwelve": { "message": "प्रतीक 11 वर्ण या उससे कम का होना चाहिए।" }, + "syncFailed": { + "message": "सिंक विफल" + }, + "syncInProgress": { + "message": "सिंक प्रगति पर है" + }, "syncWithMobile": { "message": "मोबाइल के साथ सिंक करें" }, @@ -2118,6 +3065,9 @@ "thisWillCreate": { "message": "यह एक नया वॉलेट और गुप्त रिकवरी फ्रेज़ बनाएगा" }, + "time": { + "message": "समय" + }, "tips": { "message": "युक्तियाँ" }, @@ -2128,6 +3078,10 @@ "message": "प्रति: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, + "toggleTestNetworks": { + "message": "$1 परीक्षण नेटवर्क", + "description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open to the advanced settings where users can enable the display of test networks in the network dropdown." + }, "token": { "message": "टोकन" }, @@ -2140,6 +3094,9 @@ "tokenDecimalFetchFailed": { "message": "टोकन दशमलव आवश्यक है।" }, + "tokenDetectionAnnouncement": { + "message": "नया! प्रायोगिक फीचर के रूप में Ethereum Mainnet पर बेहतर टोकन डिटेक्शन उपलब्ध है। $1" + }, "tokenSymbol": { "message": "टोकन का प्रतीक" }, @@ -2164,6 +3121,48 @@ "transactionCreated": { "message": "$2 पर $1 के मूल्य के साथ लेनदेन बनाया गया।" }, + "transactionData": { + "message": "लेन-देन का डेटा" + }, + "transactionDecodingAccreditationDecoded": { + "message": "Truffle द्वारा डिकोड किया गया" + }, + "transactionDecodingAccreditationVerified": { + "message": "$1 पर सत्यापित अनुबंध" + }, + "transactionDecodingUnsupportedNetworkError": { + "message": "ChainId $1 के लिए लेन-देन डिकोडिंग उपलब्ध नहीं है" + }, + "transactionDetailDappGasMoreInfo": { + "message": "साइट का सुझाव दिया गया" + }, + "transactionDetailDappGasTooltip": { + "message": "नवीनतम ब्लॉक के आधार पर MetaMask द्वारा अनुशंसित गैस शुल्क का उपयोग करने के लिए संपादित करें।" + }, + "transactionDetailGasHeading": { + "message": "अनुमानित गैस शुल्क" + }, + "transactionDetailGasInfoV2": { + "message": "अनुमानित" + }, + "transactionDetailGasTooltipConversion": { + "message": "गैस शुल्क के बारे में और अधिक जानें" + }, + "transactionDetailGasTooltipExplanation": { + "message": "गैस शुल्क नेटवर्क द्वारा निर्धारित किया जाता है और नेटवर्क ट्रैफ़िक और लेनदेन की जटिलता के आधार पर उतार-चढ़ाव होता है।" + }, + "transactionDetailGasTooltipIntro": { + "message": "क्रिप्टो खनिकों को गैस शुल्क का भुगतान किया जाता है जो $1 नेटवर्क पर लेन-देन की प्रक्रिया करते हैं। MetaMask को गैस शुल्क से लाभ नहीं होता है।" + }, + "transactionDetailGasTotalSubtitle": { + "message": "राशि + गैस शुल्क" + }, + "transactionDetailLayer2GasHeading": { + "message": "लेयर 2 गैस शुल्क" + }, + "transactionDetailMultiLayerTotalSubtitle": { + "message": "राशि + शुल्क" + }, "transactionDropped": { "message": "लेनदेन $2 पर ड्रॉप किया गया।" }, @@ -2179,6 +3178,27 @@ "transactionFee": { "message": "लेनदेन शुल्क" }, + "transactionHistoryBaseFee": { + "message": "आधार शुल्क (GWEI)" + }, + "transactionHistoryL1GasLabel": { + "message": "कुल L1 गैस शुल्क" + }, + "transactionHistoryL2GasLimitLabel": { + "message": "L2 गैस सीमा" + }, + "transactionHistoryL2GasPriceLabel": { + "message": "L2 गैस की कीमत" + }, + "transactionHistoryMaxFeePerGas": { + "message": "अधिकतम शुल्क प्रति गैस" + }, + "transactionHistoryPriorityFee": { + "message": "प्राथमिकता शुल्क (GWEI)" + }, + "transactionHistoryTotalGasFee": { + "message": "कुल गैस शुल्क" + }, "transactionResubmitted": { "message": "$2 गैस शुल्क में $1 वृद्धि के साथ लेनदेन फिर से सबमिट किया गया" }, @@ -2205,12 +3225,31 @@ "message": "हमें आपके टोकन की शेषराशि लोड करने में परेशानी हुई। आप उन्हें देख सकते हैं ", "description": "Followed by a link (here) to view token balances" }, + "trustSiteApprovePermission": { + "message": "अनुमति प्रदान करके, आप निम्नलिखित $1 को अपने फंड तक पहुंचने की इजाजत दे रहे हैं" + }, "tryAgain": { "message": "पुनः प्रयास करें" }, + "tryAnywayOption": { + "message": "मैं फिर भी कोशिश करूँगा" + }, + "turnOnTokenDetection": { + "message": "एडवांस टोकन डिटेक्शन चालू करें" + }, + "twelveHrTitle": { + "message": "12 घंटे:" + }, + "txInsightsNotSupported": { + "message": "इस समय पर इस अनुबंध के लिए लेन-देन की जानकारी समर्थित नहीं है।" + }, "typePassword": { "message": "अपना MetaMask पासवर्ड टाइप करें" }, + "u2f": { + "message": "U2F", + "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." + }, "unapproved": { "message": "अननुमोदित" }, @@ -2249,6 +3288,10 @@ "message": "नेटवर्क विवरण सत्यापित करें", "description": "Serves as link text for the 'unrecognizedChain' key. This text will be embedded inside the translation for that key." }, + "unsendableAsset": { + "message": "संग्रहणीय (ERC-721) टोकन भेजना वर्तमान में समर्थित नहीं है", + "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" + }, "updatedWithDate": { "message": "अपडेट किया गया $1" }, @@ -2258,12 +3301,24 @@ "urlExistsErrorMsg": { "message": "यह URL वर्तमान में $1 नेटवर्क द्वारा उपयोग किया जाता है।" }, + "useCollectibleDetection": { + "message": "NFT को ऑटो-डिटेक्ट करें" + }, + "useCollectibleDetectionDescription": { + "message": "NFT के माध्यम और डेटा प्रदर्शित करना आपके IP पता को केंद्रीकृत सर्वर के सामने उजागर कर सकता है। आपके वॉलेट में NFT को डिटेक्ट करने के लिए तीसरे-पक्ष API (जैसे OpenSea) का उपयोग किया जाता है। यह उन सेवाओं के साथ आपके अकाउंट के पते को उजागर करता है। इसे अक्षम कर दें यदि आप नहीं चाहते कि ऐप उन सेवाओं से डेटा पुल करे।" + }, "usePhishingDetection": { "message": "फ़िशिंग डिटेक्शन का उपयोग करें" }, "usePhishingDetectionDescription": { "message": "Ethereum उपयोगकर्ताओं को लक्षित करने वाले फ़िशिंग डोमेन के लिए एक चेतावनी प्रदर्शित करें" }, + "useTokenDetection": { + "message": "टोकन डिटेक्शन का उपयोग करें" + }, + "useTokenDetectionDescription": { + "message": "हम आपके वॉलेट में भेजे गए नए टोकन का पता लगाने और प्रदर्शित करने के लिए तीसरे-पक्ष API का उपयोग करते हैं। बंद करें यदि आप नहीं चाहते कि MetaMask उन सेवाओं से डेटा पुल करे।" + }, "usedByClients": { "message": "विभिन्न क्लाइंट द्वारा उपयोग किया जाता है" }, @@ -2291,15 +3346,56 @@ "viewContact": { "message": "संपर्क देखें" }, + "viewFullTransactionDetails": { + "message": "लेन-देन की पूरी जानकारी देखें" + }, "viewMore": { "message": "और देखें" }, + "viewOnBlockExplorer": { + "message": "ब्लॉक एक्सप्लोरर पर देखें" + }, + "viewOnCustomBlockExplorer": { + "message": "$1 को $2 पर देखें", + "description": "$1 is the action type. e.g (Account, Transaction, Swap) and $2 is the Custom Block Exporer URL" + }, + "viewOnEtherscan": { + "message": "Etherscan पर $1 देखें", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, + "viewOnOpensea": { + "message": "Opensea पर देखें" + }, + "viewinExplorer": { + "message": "एक्सप्लोरर में $1 देखें", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, "visitWebSite": { "message": "हमारी वेबसाइट पर जाएँ" }, "walletConnectionGuide": { "message": "हमारी हार्डवेयर वॉलेट कनेक्शन गाइड" }, + "walletCreationSuccessDetail": { + "message": "आपने अपने वॉलेट को सफलतापूर्वक सुरक्षित कर लिया है। अपने सीक्रेट रिकवरी फ्रेज़ को सुरक्षित और गुप्त रखें -- यह आपकी ज़िम्मेदारी है!" + }, + "walletCreationSuccessReminder1": { + "message": "MetaMask आपके सीक्रेट रिकवरी फ्रेज़ को फिर से प्राप्त नहीं कर सकता है।" + }, + "walletCreationSuccessReminder2": { + "message": "MetaMask आपसे आपके सीक्रेट रिकवरी फ्रेज़ के बारे में कभी नहीं पूछेगा।" + }, + "walletCreationSuccessReminder3": { + "message": "$1 किसी के साथ या आपके फंड के चोरी होने का खतरा", + "description": "$1 is separated as walletCreationSuccessReminder3BoldSection so that we can bold it" + }, + "walletCreationSuccessReminder3BoldSection": { + "message": "अपने सीक्रेट रिकवरी फ्रेज़ को कभी साझा ना करें", + "description": "This string is localized separately from walletCreationSuccessReminder3 so that we can bold it" + }, + "walletCreationSuccessTitle": { + "message": "वॉलेट का निर्माण सफल हुआ" + }, "walletSeedRestore": { "message": "वॉलेट का गुप्त रिकवरी फ्रेज़" }, @@ -2307,12 +3403,34 @@ "message": "हमने देखा है कि वर्तमान वेबसाइट ने हटाए गए window.web3 API का उपयोग करने की कोशिश की। यदि साइट में गड़बड़ी लगती है, तो कृपया अधिक जानकारी के लिए $1 पर क्लिक करें।", "description": "$1 is a clickable link." }, + "webhid": { + "message": "WebHID", + "description": "Refers to a interface for connecting external devices to the browser. Used for connecting ledger to the browser. Read more here https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API" + }, "welcome": { "message": "MetaMask में आपका स्वागत है" }, "welcomeBack": { "message": "वापसी पर स्वागत है!" }, + "welcomeExploreDescription": { + "message": "क्रिप्टो करेंसी और संपत्तियों को स्टोर करें, भेजें और खर्च करें।" + }, + "welcomeExploreTitle": { + "message": "विकेन्द्रीकृत ऐप का अन्वेषण करें" + }, + "welcomeLoginDescription": { + "message": "विकेंद्रीकृत ऐप में लॉगिन करने के लिए अपने MetaMask का उपयोग करें - किसी साइनअप की ज़रुरत नहीं है।" + }, + "welcomeLoginTitle": { + "message": "अपने वॉलेट को हैलो कहें" + }, + "welcomeToMetaMask": { + "message": "चलिए शुरु करते हैं" + }, + "welcomeToMetaMaskIntro": { + "message": "लाखों लोग का भरोसा, MetaMask एक सुरक्षित वॉलेट है जो वेब3 की दुनिया को सबके लिए सुलभ बनाता है।" + }, "whatsNew": { "message": "नया क्या है", "description": "This is the title of a popup that gives users notifications about new features and updates to MetaMask." diff --git a/app/_locales/hr/messages.json b/app/_locales/hr/messages.json index eea6f8843..e325c5d3a 100644 --- a/app/_locales/hr/messages.json +++ b/app/_locales/hr/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Odbaci" + }, + "QRHardwareWalletImporterTitle": { + "message": "Skeniraj kôd QR" + }, "about": { "message": "O opcijama" }, @@ -256,6 +262,9 @@ "currentLanguage": { "message": "Trenutačni jezik" }, + "custom": { + "message": "Napredno" + }, "customGas": { "message": "Prilagodi gorivo" }, @@ -526,6 +535,9 @@ "learnMore": { "message": "Saznajte više" }, + "learnMoreUpperCase": { + "message": "Saznajte više" + }, "ledgerAccountRestriction": { "message": "Treba se koristiti zadnjim računom kako biste dodali novi račun." }, diff --git a/app/_locales/ht/messages.json b/app/_locales/ht/messages.json index 6380d5f63..b599ff203 100644 --- a/app/_locales/ht/messages.json +++ b/app/_locales/ht/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Rejte" + }, + "QRHardwareWalletImporterTitle": { + "message": "Enspeksyon QR Kòd" + }, "accessingYourCamera": { "message": "Aksè a Kamera" }, @@ -307,6 +313,9 @@ "learnMore": { "message": "Aprann plis" }, + "learnMoreUpperCase": { + "message": "Aprann plis" + }, "ledgerAccountRestriction": { "message": "Ou bezwen sèvi ak dènye kont ou anvan ou ka ajoute yon nouvo." }, diff --git a/app/_locales/hu/messages.json b/app/_locales/hu/messages.json index ed9c95dbe..fc596e0ce 100644 --- a/app/_locales/hu/messages.json +++ b/app/_locales/hu/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Elutasítás" + }, + "QRHardwareWalletImporterTitle": { + "message": "QR-kód beolvasása" + }, "about": { "message": "Névjegy" }, @@ -256,6 +262,9 @@ "currentLanguage": { "message": "Aktuális nyelv" }, + "custom": { + "message": "Speciális" + }, "customGas": { "message": "Gáz testreszabása" }, @@ -526,6 +535,9 @@ "learnMore": { "message": "Tudjon meg többet" }, + "learnMoreUpperCase": { + "message": "Tudjon meg többet" + }, "ledgerAccountRestriction": { "message": "Használnia kell a korábbi fiókját, mielőtt újat adhat hozzá. " }, diff --git a/app/_locales/id/messages.json b/app/_locales/id/messages.json index 0843011b8..18ac64d24 100644 --- a/app/_locales/id/messages.json +++ b/app/_locales/id/messages.json @@ -1,4 +1,49 @@ { + "QRHardwareInvalidTransactionTitle": { + "message": "Galat" + }, + "QRHardwareMismatchedSignId": { + "message": "Data transaksi tidak sesuai. Harap periksa detail transaksi." + }, + "QRHardwarePubkeyAccountOutOfRange": { + "message": "Tidak ada akun lainnya. Jika Anda ingin mengakses akun lain yang tidak terdaftar di bawah ini, harap hubungkan kembali dompet perangkat keras Anda dan pilih." + }, + "QRHardwareScanInstructions": { + "message": "Taruh kode QR di depan kamera Anda. Layar mengabur, tetapi tidak akan memengaruhi pembacaan." + }, + "QRHardwareSignRequestCancel": { + "message": "Tolak" + }, + "QRHardwareSignRequestDescription": { + "message": "Setelah masuk dengan dompet Anda, klik 'Dapatkan Tanda Tangan' untuk menerima tanda tangan" + }, + "QRHardwareSignRequestGetSignature": { + "message": "Dapatkan Tanda Tangan" + }, + "QRHardwareSignRequestSubtitle": { + "message": "Pindai kode QR dengan dompet Anda" + }, + "QRHardwareSignRequestTitle": { + "message": "Minta Tanda Tangan" + }, + "QRHardwareUnknownQRCodeTitle": { + "message": "Galat" + }, + "QRHardwareUnknownWalletQRCode": { + "message": "Kode QR tidak valid. Harap pindai kode QR sinkronisasi dari dompet perangkat keras." + }, + "QRHardwareWalletImporterTitle": { + "message": "Pindai Kode QR" + }, + "QRHardwareWalletSteps1Description": { + "message": "Hubungkan dompet perangkat keras bercelah udara yang berkomunikasi melalui kode QR. Dompet perangkat keras bercelah udara yang didukung secara resmi meliputi:" + }, + "QRHardwareWalletSteps1Title": { + "message": "Dompet HW berbasis QR" + }, + "QRHardwareWalletSteps2Description": { + "message": "AirGap Vault & Ngrave (Segera Hadir)" + }, "about": { "message": "Tentang" }, @@ -28,6 +73,10 @@ "accountName": { "message": "Nama Akun" }, + "accountNameDuplicate": { + "message": "Nama akun ini sudah digunakan", + "description": "This is an error message shown when the user enters a new account name that matches an existing account name" + }, "accountOptions": { "message": "Opsi Akun" }, @@ -43,6 +92,15 @@ "activityLog": { "message": "log aktivitas" }, + "add": { + "message": "Tambah" + }, + "addANetwork": { + "message": "Tambahkan jaringan" + }, + "addANickname": { + "message": "Tambahkan nama panggilan" + }, "addAcquiredTokens": { "message": "Tambahkan token yang Anda peroleh menggunakan MetaMask" }, @@ -52,6 +110,9 @@ "addContact": { "message": "Tambah kontak" }, + "addCustomToken": { + "message": "Tambahkan Token Kustom" + }, "addCustomTokenByContractAddress": { "message": "Tidak dapat menemukan token? Anda dapat menambahkan token secara manual dengan menempelkan alamatnya. Alamat kontrak token dapat ditemukan di $1.", "description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum" @@ -76,6 +137,12 @@ "addFriendsAndAddresses": { "message": "Tambahkan teman dan alamat yang Anda percayai" }, + "addMemo": { + "message": "Tambahkan memo" + }, + "addNFT": { + "message": "Tambahkan NFT" + }, "addNetwork": { "message": "Tambahkan Jaringan" }, @@ -91,12 +158,36 @@ "addToken": { "message": "Tambahkan Token" }, + "address": { + "message": "Alamat" + }, + "addressBookIcon": { + "message": "Ikon buku alamat" + }, "advanced": { "message": "Tingkat Lanjut" }, + "advancedBaseGasFeeToolTip": { + "message": "Saat transaksi Anda dimasukkan ke dalam blok, selisih antara biaya dasar maks dan biaya dasar aktual akan dikembalikan. Jumlah total dihitung sebagai biaya dasar maks (dalam GWEI) * batas gas." + }, + "advancedGasFeeDefaultOptIn": { + "message": "Simpan $1 ini sebagai default saya untuk \"Lanjutan\"" + }, + "advancedGasFeeDefaultOptOut": { + "message": "Selalu gunakan nilai ini dan pengaturan lanjutan sebagai default." + }, + "advancedGasFeeModalTitle": { + "message": "Biaya gas lanjutan" + }, + "advancedGasPriceTitle": { + "message": "Harga gas" + }, "advancedOptions": { "message": "Opsi Tingkat Lanjut" }, + "advancedPriorityFeeToolTip": { + "message": "Biaya prioritas (alias “tip penambang”) langsung masuk ke penambang dan memberi insentif kepada mereka untuk memprioritaskan transaksi Anda." + }, "advancedSettingsDescription": { "message": "Akses fitur pengembang, unduh Log Status, Atur Ulang Akun, siapkan testnet, dan sesuaikan RPC" }, @@ -130,6 +221,10 @@ "allowExternalExtensionTo": { "message": "Izinkan ekstensi eksternal ini untuk:" }, + "allowSpendToken": { + "message": "Berikan izin untuk mengakses $1 Anda?", + "description": "$1 is the symbol of the token that are requesting to spend" + }, "allowThisSiteTo": { "message": "Izinkan situs ini untuk:" }, @@ -175,6 +270,9 @@ "approved": { "message": "Disetujui" }, + "approvedAmountWithColon": { + "message": "Jumlah yang disetujui:" + }, "asset": { "message": "Aset" }, @@ -229,9 +327,43 @@ "balanceOutdated": { "message": "Saldo mungkin sudah usang" }, + "baseFee": { + "message": "Biaya dasar" + }, "basic": { "message": "Dasar" }, + "betaMetamaskDescription": { + "message": "MetaMask merupakan dompet aman yang dipercaya oleh jutaan orang, yang membuat dunia web3 dapat diakses oleh semua orang." + }, + "betaMetamaskDescriptionExplanation": { + "message": "Gunakan versi ini untuk menguji fitur mendatang sebelum dirilis. Penggunaan dan masukan Anda membantu kami membangun versi MetaMask terbaik. Penggunaan MetaMask Beta Anda tunduk pada $1 standar kami dan $2 kami. Sebagai Beta, akan ada peningkatan risiko kekutu. Dengan melanjutkan, Anda menerima dan mengakui risiko ini, serta risiko yang ditemukan dalam Syarat dan Ketentuan Beta kami.", + "description": "$1 represents localization item betaMetamaskDescriptionExplanationTermsLinkText. $2 represents localization item betaMetamaskDescriptionExplanationBetaTermsLinkText" + }, + "betaMetamaskDescriptionExplanationBetaTermsLinkText": { + "message": "Ketentuan Beta Tambahan" + }, + "betaMetamaskDescriptionExplanationTermsLinkText": { + "message": "Syarat" + }, + "betaMetamaskVersion": { + "message": "Versi Beta MetaMask" + }, + "betaWelcome": { + "message": "Selamat datang di MetaMask Beta" + }, + "blockExplorerAccountAction": { + "message": "Akun", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Account in Explorer" + }, + "blockExplorerAssetAction": { + "message": "Aset", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Asset in Explorer" + }, + "blockExplorerSwapAction": { + "message": "Swap", + "description": "This is used with viewOnEtherscan e.g View Swap on Etherscan" + }, "blockExplorerUrl": { "message": "URL Block Explorer" }, @@ -251,9 +383,21 @@ "buildContactList": { "message": "Buat daftar kontak Anda" }, + "builtAroundTheWorld": { + "message": "MetaMask dirancang dan dibangun di seluruh dunia." + }, + "busy": { + "message": "Sibuk" + }, "buy": { "message": "Beli" }, + "buyWithTransak": { + "message": "Beli ETH dengan Transak" + }, + "buyWithTransakDescription": { + "message": "Transak mendukung kartu debit dan transfer bank (tergantung lokasi) di 59+ negara. Deposito ETH ke akun MetaMask Anda." + }, "buyWithWyre": { "message": "Beli ETH dengan Wyre" }, @@ -269,6 +413,15 @@ "cancel": { "message": "Batal" }, + "cancelEdit": { + "message": "Batalkan Pengeditan" + }, + "cancelPopoverTitle": { + "message": "Batalkan transaksi" + }, + "cancelSpeedUp": { + "message": "batalkan atau percepat transaksi." + }, "cancellationGasFee": { "message": "Biaya Pembatalan Jaringan" }, @@ -287,6 +440,10 @@ "chromeRequiredForHardwareWallets": { "message": "Anda perlu menggunakan MetaMask di Google Chrome untuk terhubung ke Dompet Perangkat Keras Anda." }, + "clickToConnectLedgerViaWebHID": { + "message": "Klik di sini untuk menghubungkan Buku Besar Anda melalui WebHID", + "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" + }, "clickToRevealSeed": { "message": "Klik di sini untuk membuka kata rahasia" }, @@ -299,6 +456,9 @@ "confirmPassword": { "message": "Konfirmasikan kata sandi" }, + "confirmRecoveryPhrase": { + "message": "Konfirmasikan Frasa Pemulihan Rahasia" + }, "confirmSecretBackupPhrase": { "message": "Konfirmasikan Frasa Cadangan Rahasia" }, @@ -406,12 +566,18 @@ "continue": { "message": "Lanjutkan" }, + "continueToTransak": { + "message": "Lanjutkan ke Transak" + }, "continueToWyre": { "message": "Lanjutkan ke Wyre" }, "contract": { "message": "Kontrak" }, + "contractAddress": { + "message": "Alamat kontrak" + }, "contractAddressError": { "message": "Anda mengirim token ke alamat kontrak token. Ini dapat mengakibatkan token ini hilang." }, @@ -430,6 +596,9 @@ "copyPrivateKey": { "message": "Ini adalah kunci privat Anda (klik untuk menyalin)" }, + "copyRawTransactionData": { + "message": "Salin data transaksi mentah" + }, "copyToClipboard": { "message": "Salin ke clipboard" }, @@ -445,6 +614,9 @@ "createAccount": { "message": "Buat Akun" }, + "createNewWallet": { + "message": "Buat dompet baru" + }, "createPassword": { "message": "Buat Kata Sandi" }, @@ -466,9 +638,22 @@ "currentLanguage": { "message": "Bahasa Saat Ini" }, + "currentTitle": { + "message": "Saat ini:" + }, + "currentlyUnavailable": { + "message": "Tidak tersedia di jaringan ini" + }, + "custom": { + "message": "Tingkat Lanjut" + }, "customGas": { "message": "Sesuaikan Biaya Jaringan" }, + "customGasSettingToolTipMessage": { + "message": "Gunakan $1 untuk menyesuaikan harga gas. Anda akan bingung jika tidak terbiasa. Berinteraksi dengan risiko Anda sendiri.", + "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold fontweight" + }, "customGasSubTitle": { "message": "Menaikkan biaya dapat mengurangi waktu pemrosesan, namun tidak dijamin." }, @@ -478,9 +663,29 @@ "customToken": { "message": "Token Kustom" }, + "dappSuggested": { + "message": "Situs yang disarankan" + }, + "dappSuggestedGasSettingToolTipMessage": { + "message": "$1 telah menyarankan harga ini.", + "description": "$1 is url for the dapp that has suggested gas settings" + }, + "dappSuggestedShortLabel": { + "message": "Situs" + }, + "dappSuggestedTooltip": { + "message": "$1 telah merekomendasikan harga ini.", + "description": "$1 represents the Dapp's origin" + }, + "data": { + "message": "Data" + }, "dataBackupFoundInfo": { "message": "Beberapa data akun Anda telah dicadangkan selama penginstalan MetaMask yang lalu. Ini bisa mencakup pengaturan, kontak, dan token Anda. Apakah Anda ingin memulihkan data ini sekarang?" }, + "dataHex": { + "message": "Hex" + }, "decimal": { "message": "Desimal Token" }, @@ -520,7 +725,10 @@ "message": "Anda yakin ingin menghapus jaringan ini?" }, "depositEther": { - "message": "Deposit Ether" + "message": "Depositokan Ether" + }, + "description": { + "message": "Deskripsi" }, "details": { "message": "Detail" @@ -579,9 +787,122 @@ "edit": { "message": "Edit" }, + "editANickname": { + "message": "Edit nama panggilan" + }, + "editAddressNickname": { + "message": "Edit nama panggilan alamat" + }, "editContact": { "message": "Edit Kontak" }, + "editGasEducationButtonText": { + "message": "Bagaimana saya harus memilih?" + }, + "editGasEducationHighExplanation": { + "message": "Ini adalah pilihan terbaik untuk transaksi di waktu sensitif (seperti Swap) karena meningkatkan kemungkinan keberhasilan transaksi. Jika pemrosesan Swap terlalu lama, maka berpotensi gagal dan mengakibatkan hilangnya sebagian biaya gas Anda." + }, + "editGasEducationLowExplanation": { + "message": "Biaya gas yang lebih rendah hanya boleh digunakan saat waktu pemrosesan kurang penting. Biaya yang lebih rendah membuat sulit untuk memprediksi kapan (atau jika) transaksi Anda akan berhasil." + }, + "editGasEducationMediumExplanation": { + "message": "Biaya gas sedang cocok untuk mengirim, menarik, atau transaksi non-waktu sensitif lainnya. Pengaturan ini paling sering menghasilkan transaksi yang berhasil." + }, + "editGasEducationModalIntro": { + "message": "Memilih biaya gas yang tepat tergantung jenis transaksi dan seberapa penting bagi Anda." + }, + "editGasEducationModalTitle": { + "message": "Bagaimana cara memilihnya?" + }, + "editGasFeeModalTitle": { + "message": "Edit biaya gas" + }, + "editGasHigh": { + "message": "Tinggi" + }, + "editGasLimitOutOfBounds": { + "message": "Batas gas minimum adalah $1" + }, + "editGasLimitOutOfBoundsV2": { + "message": "Batas gas harus lebih besar dari $1 dan kurang dari $2", + "description": "$1 is the minimum limit for gas and $2 is the maximum limit" + }, + "editGasLimitTooltip": { + "message": "Batas gas merupakan unit maksimum gas yang ingin Anda gunakan. Unit gas adalah pengganda untuk “Biaya prioritas maks” dan “Biaya maks”." + }, + "editGasLow": { + "message": "Rendah" + }, + "editGasMaxBaseFeeGWEIImbalance": { + "message": "Biaya dasar maks tidak boleh lebih rendah dari biaya prioritas" + }, + "editGasMaxBaseFeeHigh": { + "message": "Biaya dasar maks lebih tinggi dari yang diperlukan" + }, + "editGasMaxBaseFeeLow": { + "message": "Biaya dasar maks rendah untuk kondisi jaringan saat ini" + }, + "editGasMaxFeeHigh": { + "message": "Biaya maks lebih tinggi dari yang diperlukan" + }, + "editGasMaxFeeLow": { + "message": "Biaya maks terlalu rendah untuk kondisi jaringan" + }, + "editGasMaxFeePriorityImbalance": { + "message": "Biaya maks tidak boleh lebih rendah dari biaya prioritas maks" + }, + "editGasMaxFeeTooltip": { + "message": "Biaya maks merupakan biaya tertinggi yang akan Anda bayarkan (biaya dasar + biaya prioritas)." + }, + "editGasMaxPriorityFeeBelowMinimum": { + "message": "Biaya prioritas maks harus lebih besar dari 0 GWEI" + }, + "editGasMaxPriorityFeeBelowMinimumV2": { + "message": "Biaya prioritas harus lebih besar dari 0." + }, + "editGasMaxPriorityFeeHigh": { + "message": "Biaya prioritas maks lebih tinggi dari yang diperlukan. Anda mungkin akan membayar lebih dari yang dibutuhkan." + }, + "editGasMaxPriorityFeeHighV2": { + "message": "Biaya prioritas lebih tinggi dari yang diperlukan. Anda mungkin akan membayar lebih dari yang dibutuhkan" + }, + "editGasMaxPriorityFeeLow": { + "message": "Biaya prioritas maks rendah untuk kondisi jaringan saat ini" + }, + "editGasMaxPriorityFeeLowV2": { + "message": "Biaya prioritas rendah untuk kondisi jaringan saat ini" + }, + "editGasMaxPriorityFeeTooltip": { + "message": "Biaya prioritas maks (alias “tip penambang”) langsung masuk ke penambang dan memberi insentif kepada mereka untuk memprioritaskan transaksi Anda. Pengaturan maks akan menjadi yang paling sering Anda bayar" + }, + "editGasMedium": { + "message": "Sedang" + }, + "editGasPriceTooLow": { + "message": "Harga gas harus lebih besar dari 0" + }, + "editGasPriceTooltip": { + "message": "Jaringan ini memerlukan kolom “Harga gas” saat mengirimkan transaksi. Harga gas merupakan jumlah yang akan Anda bayar per unit gas." + }, + "editGasSubTextAmountLabel": { + "message": "Jumlah maks:", + "description": "This is meant to be used as the $1 substitution editGasSubTextAmount" + }, + "editGasSubTextFeeLabel": { + "message": "Biaya maks:" + }, + "editGasTitle": { + "message": "Edit prioritas" + }, + "editGasTooLow": { + "message": "Waktu pemrosesan tak diketahui" + }, + "editGasTooLowTooltip": { + "message": "Biaya maks atau biaya prioritas maks Anda mungkin rendah untuk kondisi pasar saat ini. Kami tidak tahu kapan (atau jika) transaksi Anda akan diproses. " + }, + "editGasTooLowWarningTooltip": { + "message": "Ini akan menurunkan biaya maks Anda, tetapi jika lalu lintas jaringan meningkat, transaksi Anda mungkin tertunda atau gagal." + }, "editNonceField": { "message": "Edit Nonce" }, @@ -591,6 +912,22 @@ "editPermission": { "message": "Edit Izin" }, + "enableAutoDetect": { + "message": " Aktifkan Deteksi Otomatis" + }, + "enableFromSettings": { + "message": " Aktifkan dari Pengaturan." + }, + "enableOpenSeaAPI": { + "message": "Aktifkan API OpenSea" + }, + "enableOpenSeaAPIDescription": { + "message": "Gunakan API OpenSea untuk mengambil data NFT. Deteksi otomatis NFT bergantung pada API OpenSea, dan tidak akan tersedia saat API ditutup." + }, + "enableToken": { + "message": "aktifkan $1", + "description": "$1 is a token symbol, e.g. ETH" + }, "encryptionPublicKeyNotice": { "message": "$1 menginginkan kunci enkripsi publik Anda. Dengan menyetujui, situs ini akan dapat membuat pesan terenkripsi untuk Anda.", "description": "$1 is the web3 site name" @@ -633,12 +970,21 @@ "message": "Titik akhir memberikan hasil ID rantai yang berbeda: $1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "ensIllegalCharacter": { + "message": "Karakter Ilegal untuk ENS." + }, "ensNotFoundOnCurrentNetwork": { "message": "Nama ENS tidak ditemukan pada jaringan saat ini. Coba untuk beralih ke Ethereum Mainnet." }, + "ensNotSupportedOnNetwork": { + "message": "Jaringan tidak mendukung ENS" + }, "ensRegistrationError": { "message": "Kesalahan pada pendaftaran nama ENS" }, + "ensUnknownError": { + "message": "Pencarian ENS gagal." + }, "enterAnAlias": { "message": "Masukkan alias" }, @@ -702,9 +1048,18 @@ "etherscanView": { "message": "Lihat akun di Etherscan" }, + "etherscanViewOn": { + "message": "Lihat di Etherscan" + }, "expandView": { "message": "Perluas tampilan" }, + "experimental": { + "message": "Eksperimental" + }, + "experimentalSettingsDescription": { + "message": "Deteksi token & lainnya" + }, "exportPrivateKey": { "message": "Ekspor Kunci Privat" }, @@ -724,6 +1079,9 @@ "failureMessage": { "message": "Ada yang salah, dan kami tidak dapat menyelesaikan tindakan" }, + "fakeTokenWarning": { + "message": "Siapa pun dapat membuat token, termasuk membuat versi palsu dari token yang ada. Pelajari selengkapnya seputar $1" + }, "fast": { "message": "Cepat" }, @@ -741,6 +1099,21 @@ "message": "Impor file tidak bekerja? Klik di sini!", "description": "Helps user import their account from a JSON file" }, + "flaskSnapSettingsCardButtonCta": { + "message": "Lihat detailnya", + "description": "Call to action a user can take to see more information about the Snap that is installed" + }, + "flaskSnapSettingsCardDateAddedOn": { + "message": "Ditambahkan di", + "description": "Start of the sentence describing when and where snap was added" + }, + "flaskSnapSettingsCardFrom": { + "message": "dari", + "description": "Part of the sentence describing when and where snap was added" + }, + "followUsOnTwitter": { + "message": "Ikuti kami di Twitter" + }, "forbiddenIpfsGateway": { "message": "Gateway IPFS Terlarang: Tentukan gateway CID" }, @@ -760,6 +1133,19 @@ "functionType": { "message": "Jenis Fungsi" }, + "gas": { + "message": "Gas" + }, + "gasDisplayAcknowledgeDappButtonText": { + "message": "Edit biaya gas yang disarankan" + }, + "gasDisplayDappWarning": { + "message": "Biaya gas ini telah disarankan oleh $1. Pengabaian dapat menyebabkan masalah pada transaksi Anda. Hubungi $1 jika ada pertanyaan.", + "description": "$1 represents the Dapp's origin" + }, + "gasEstimatesUnavailableWarning": { + "message": "Estimasi rendah, sedang, dan tinggi kami tidak tersedia." + }, "gasLimit": { "message": "Batas Biaya Jaringan" }, @@ -773,6 +1159,12 @@ "message": "Batas biaya jaringan harus sekurangnya $1", "description": "$1 is the custom gas limit, in decimal." }, + "gasLimitV2": { + "message": "Batas gas" + }, + "gasOption": { + "message": "Opsi gas" + }, "gasPrice": { "message": "Biaya Jaringan (GWEI)" }, @@ -791,6 +1183,38 @@ "gasPriceInfoTooltipContent": { "message": "Biaya jaringan menentukan jumlah Ether yang ingin Anda bayar untuk masing-masing unit biaya jaringan." }, + "gasTimingHoursShort": { + "message": "$1 jam", + "description": "$1 represents a number of hours" + }, + "gasTimingMinutes": { + "message": "$1 menit", + "description": "$1 represents a number of minutes" + }, + "gasTimingMinutesShort": { + "message": "$1 mnt", + "description": "$1 represents a number of minutes" + }, + "gasTimingNegative": { + "message": "Mungkin dalam $1", + "description": "$1 represents an amount of time" + }, + "gasTimingPositive": { + "message": "Kemungkinan dalam < $1", + "description": "$1 represents an amount of time" + }, + "gasTimingSeconds": { + "message": "$1 detik", + "description": "$1 represents a number of seconds" + }, + "gasTimingSecondsShort": { + "message": "$1 dtk", + "description": "$1 represents a number of seconds" + }, + "gasTimingVeryPositive": { + "message": "Sangat mungkin dalam < $1", + "description": "$1 represents an amount of time" + }, "gasUsed": { "message": "Biaya Jaringan yang Digunakan" }, @@ -818,9 +1242,15 @@ "getStarted": { "message": "Persiapan." }, + "goBack": { + "message": "Kembali" + }, "goerli": { "message": "Jaringan Uji Goerli" }, + "grantedToWithColon": { + "message": "Diberikan kepada:" + }, "happyToSeeYou": { "message": "Kami senang melihat Anda." }, @@ -863,9 +1293,25 @@ "hideZeroBalanceTokens": { "message": "Menyembunyikan Token Tanpa Saldo" }, + "high": { + "message": "Agresif" + }, + "highGasSettingToolTipDialog": { + "message": "Probabilitas tinggi, bahkan di pasar yang tidak stabil" + }, + "highGasSettingToolTipMessage": { + "message": "Gunakan $1 untuk menutupi lonjakan lalu lintas jaringan karena hal-hal seperti penurunan NFT populer.", + "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" + }, + "highLowercase": { + "message": "tinggi" + }, "history": { "message": "Riwayat" }, + "id": { + "message": "ID" + }, "import": { "message": "Impor", "description": "Button to import an account from a selected file" @@ -873,6 +1319,9 @@ "importAccount": { "message": "Mengimpor Akun" }, + "importAccountError": { + "message": "Galat saat mengimpor akun." + }, "importAccountLinkText": { "message": "impor menggunakan Frasa Pemulihan Rahasia" }, @@ -886,12 +1335,31 @@ "message": "atau $1", "description": "$1 represents the text from `importAccountLinkText` as a link" }, + "importExistingWalletDescription": { + "message": "Masukkan Frasa Pemulihan Rahasia Anda (alias Frasa Benih) yang diberikan saat Anda membuat dompet. $1", + "description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link" + }, + "importExistingWalletTitle": { + "message": "Impor dompet yang ada dengan Frasa Pemulihan Rahasia" + }, + "importMyWallet": { + "message": "Impor Dompet Saya" + }, + "importNFTs": { + "message": "Impor NFT" + }, "importTokenQuestion": { "message": "Impor token?" }, "importTokenWarning": { "message": "Siapa pun dapat membuat token dengan nama apa pun, termasuk versi palsu dari token yang ada. Tambahkan dan perdagangkan dengan risiko Anda sendiri!" }, + "importTokens": { + "message": "impor token" + }, + "importTokensCamelCase": { + "message": "Impor Token" + }, "importWallet": { "message": "Impor dompet" }, @@ -915,6 +1383,9 @@ "insufficientFunds": { "message": "Dana tidak cukup." }, + "insufficientFundsForGas": { + "message": "Dana untuk gas tidak cukup" + }, "insufficientTokens": { "message": "Token tidak memadai." }, @@ -974,10 +1445,19 @@ "ipfsGatewayDescription": { "message": "Masukkan URL gateway CID IPFS untuk digunakan untuk resolusi konten ENS." }, + "jsDeliver": { + "message": "jsDeliver" + }, "jsonFile": { "message": "File JSON", "description": "format for importing an account" }, + "keystone": { + "message": "Keystone" + }, + "keystoneTutorial": { + "message": " (Tutorial)" + }, "knownAddressRecipient": { "message": "Alamat kontrak yang diketahui." }, @@ -990,12 +1470,57 @@ "lastConnected": { "message": "Terakhir Terhubung" }, + "layer1Fees": { + "message": "Biaya lapis 1" + }, + "learmMoreAboutGas": { + "message": "Ingin $1 seputar gas?" + }, + "learnCancelSpeeedup": { + "message": "Pelajari cara $1", + "description": "$1 is link to cancel or speed up transactions" + }, "learnMore": { "message": "Pelajari selengkapnya" }, + "learnMoreUpperCase": { + "message": "Pelajari selengkapnya" + }, + "learnScamRisk": { + "message": "penipuan dan risiko keamanan." + }, "ledgerAccountRestriction": { "message": "Anda perlu memanfaatkan akun terakhir Anda sebelum menambahkan yang baru." }, + "ledgerConnectionInstructionCloseOtherApps": { + "message": "Tutup perangkat lunak lain yang terhubung ke perangkat Anda, lalu klik di sini untuk memperbarui." + }, + "ledgerConnectionInstructionHeader": { + "message": "Sebelum mengeklik konfirmasi:" + }, + "ledgerConnectionInstructionStepFour": { + "message": "Aktifkan \"data kontrak pintar\" atau \"penandatanganan buta\" pada perangkat Buku Besar Anda" + }, + "ledgerConnectionInstructionStepOne": { + "message": "Aktifkan Gunakan Ledger Live di bawah Pengaturan > Lanjutan" + }, + "ledgerConnectionInstructionStepThree": { + "message": "Sambungkan perangkat Buku Besar Anda dan pilih aplikasi Ethereum" + }, + "ledgerConnectionInstructionStepTwo": { + "message": "Buka dan buka Aplikasi Ledger Live" + }, + "ledgerConnectionPreferenceDescription": { + "message": "Sesuaikan cara Anda menghubungkan Buku Besar ke MetaMask. Kami merekomendasikan $1, tetapi opsi lain tersedia. Baca selengkapnya di sini: $2", + "description": "A description that appears above a dropdown where users can select between up to three options - Ledger Live, U2F or WebHID - depending on what is supported in their browser. $1 is the recommended browser option, it will be either WebHID or U2f. $2 is a link to an article where users can learn more, but will be the translation of the learnMore message." + }, + "ledgerDeviceOpenFailureMessage": { + "message": "Perangkat Buku Besar gagal dibuka. Buku Besar Anda mungkin terhubung ke perangkat lunak lain. Tutup Ledger Live atau aplikasi lain yang terhubung ke perangkat Buku Besar Anda, dan coba hubungkan kembali." + }, + "ledgerLive": { + "message": "Ledger Live", + "description": "The name of a desktop app that can be used with your ledger device. We can also use it to connect a users Ledger device to MetaMask." + }, "ledgerLiveApp": { "message": "Aplikasi Ledger Live" }, @@ -1005,12 +1530,22 @@ "ledgerTimeout": { "message": "Ledger Live terlalu lama untuk merespons atau waktu koneksi habis. Pastikan aplikasi Ledger Live terbuka dan perangkat Anda tidak terkunci." }, + "ledgerTransportChangeWarning": { + "message": "Jika aplikasi Ledger Live Anda terbuka, putuskan koneksi Ledger Live yang terbuka dan tutup aplikasi Ledger Live." + }, + "ledgerWebHIDNotConnectedErrorMessage": { + "message": "Perangkat buku besar tidak terhubung. Jika ingin menghubungkan Buku Besar Anda, klik 'Lanjutkan' lagi dan setujui koneksi HID", + "description": "An error message shown to the user during the hardware connect flow." + }, "letsGoSetUp": { "message": "Ya, mari siap-siap!" }, "likeToImportTokens": { "message": "Apakah Anda ingin menambahkan token ini?" }, + "link": { + "message": "Tautan" + }, "links": { "message": "Tautan" }, @@ -1032,15 +1567,48 @@ "lockTimeTooGreat": { "message": "Lock time terlalu besar" }, + "low": { + "message": "Rendah" + }, + "lowGasSettingToolTipMessage": { + "message": "Gunakan $1 untuk menunggu harga yang lebih murah. Estimasi waktu kurang akurat karena harga sedang tidak dapat diprediksi.", + "description": "$1 is key 'low' separated here so that it can be passed in with bold fontweight" + }, + "lowLowercase": { + "message": "rendah" + }, + "lowPriorityMessage": { + "message": "Transaksi di masa mendatang akan mengantre setelah transaksi ini. Harga ini terakhir kali dilihat beberapa waktu lalu." + }, "mainnet": { "message": "Ethereum Mainnet" }, "makeAnotherSwap": { "message": "Buat penukaran baru" }, + "makeSureNoOneWatching": { + "message": "Pastikan tidak ada yang melihat layar Anda", + "description": "Warning to users to be care while creating and saving their new Secret Recovery Phrase" + }, "max": { "message": "Maks." }, + "maxBaseFee": { + "message": "Biaya dasar maks" + }, + "maxFee": { + "message": "Biaya maks" + }, + "maxPriorityFee": { + "message": "Biaya prioritas maks" + }, + "medium": { + "message": "Pasar" + }, + "mediumGasSettingToolTipMessage": { + "message": "Gunakan $1 untuk pemrosesan cepat dengan harga pasar saat ini.", + "description": "$1 is key 'medium' (text: 'Market') separated here so that it can be passed in with bold fontweight" + }, "memo": { "message": "memo" }, @@ -1071,6 +1639,9 @@ "metametricsCommitmentsAllowOptOut": { "message": "Selalu izinkan Anda untuk menyisih melalui Pengaturan" }, + "metametricsCommitmentsAllowOptOut2": { + "message": "Selalu dapat memilih keluar melalui Pengaturan" + }, "metametricsCommitmentsBoldNever": { "message": "Jangan", "description": "This string is localized separately from some of the commitments so that we can bold it" @@ -1078,6 +1649,9 @@ "metametricsCommitmentsIntro": { "message": "MetaMask akan.." }, + "metametricsCommitmentsNeverCollect": { + "message": "Jangan pernah mengumpulkan kunci, alamat, transaksi, saldo, hash, atau informasi pribadi apa pun" + }, "metametricsCommitmentsNeverCollectIP": { "message": "$1 mengumpulkan alamat IP lengkap Anda", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" @@ -1086,6 +1660,12 @@ "message": "$1 mengumpulkan kunci, alamat, transaksi, saldo, hash, atau informasi pribadi lainnya", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" }, + "metametricsCommitmentsNeverIP": { + "message": "Jangan pernah mengumpulkan alamat IP lengkap Anda" + }, + "metametricsCommitmentsNeverSell": { + "message": "Jangan pernah menjual data untuk mendapatkan keuntungan!" + }, "metametricsCommitmentsNeverSellDataForProfit": { "message": "$1 menjual data untuk mendapatkan keuntungan. Selamanya!", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" @@ -1099,6 +1679,12 @@ "metametricsOptInDescription": { "message": "MetaMask ingin mengumpulkan data penggunaan untuk lebih memahami cara pengguna berinteraksi dengan ekstensi. Data ini akan digunakan untuk secara kontinu memperbaiki kegunaan dan pengalaman pengguna atas produk kami dan ekosistem Ethereum." }, + "metametricsOptInDescription2": { + "message": "Kami ingin mengumpulkan data penggunaan dasar dalam rangka meningkatkan kegunaan produk kami. Metrik ini akan..." + }, + "metametricsTitle": { + "message": "Bergabunglah bersama 6 Jt+ pengguna untuk meningkatkan MetaMask" + }, "mismatchedChain": { "message": "Detail jaringan untuk ID rantai ini tidak cocok dengan catatan kami. Kami menyarankan agar Anda $1 sebelum melanjutkan.", "description": "$1 is a clickable link with text defined by the 'mismatchedChainLinkText' key" @@ -1107,6 +1693,15 @@ "message": "verifikasi detail jaringan", "description": "Serves as link text for the 'mismatchedChain' key. This text will be embedded inside the translation for that key." }, + "missingNFT": { + "message": "Tidak melihat NFT Anda?" + }, + "missingToken": { + "message": "Tidak melihat token Anda?" + }, + "mobileSyncWarning": { + "message": "Fitur 'Sinkronkan dengan ekstensi' dinonaktifkan untuk sementara waktu. Jika Anda ingin menggunakan dompet ekstensi Anda di ponsel MetaMask, maka pada aplikasi seluler Anda: kembali ke opsi pengaturan dompet dan pilih opsi 'Impor dengan Frasa Pemulihan Rahasia'. Gunakan frasa rahasia dompet ekstensi Anda untuk mengimpor dompet Anda ke ponsel nantinya." + }, "mustSelectOne": { "message": "Harus memilih sekurangnya 1 token." }, @@ -1123,9 +1718,15 @@ "message": "Butuh bantuan? Hubungi $1", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" }, + "needHelpFeedback": { + "message": "Bagikan Masukan Anda" + }, "needHelpLinkText": { "message": "Dukungan MetaMask" }, + "needHelpSubmitTicket": { + "message": "Kirimkan Tiket" + }, "needImportFile": { "message": "Anda harus memilih file untuk diimpor.", "description": "User is important an account and needs to add a file to continue" @@ -1148,6 +1749,12 @@ "networkNameEthereum": { "message": "Ethereum" }, + "networkNamePolygon": { + "message": "Polygon" + }, + "networkNameRinkeby": { + "message": "Rinkeby" + }, "networkNameTestnet": { "message": "Testnet" }, @@ -1157,6 +1764,20 @@ "networkSettingsDescription": { "message": "Tambahkan dan edit jaringan RPC kustom" }, + "networkStatus": { + "message": "Status jaringan" + }, + "networkStatusBaseFeeTooltip": { + "message": "Biaya dasar diatur oleh jaringan dan berubah setiap 13-14 detik. Akun opsi $1 dan $2 kami untuk kenaikan mendadak.", + "description": "$1 and $2 are bold text for Medium and Aggressive respectively." + }, + "networkStatusPriorityFeeTooltip": { + "message": "Rentang biaya prioritas (alias “tip penambang”). Ini berlaku bagi penambang dan memberi insentif kepada mereka untuk memprioritaskan transaksi Anda." + }, + "networkStatusStabilityFeeTooltip": { + "message": "Biaya gas relatif $1 dalam 72 jam terakhir.", + "description": "$1 is networks stability value - stable, low, high" + }, "networkURL": { "message": "URL Jaringan" }, @@ -1179,12 +1800,27 @@ "message": "Akun $1", "description": "Default name of next account to be created on create account screen" }, + "newCollectibleAddFailed": { + "message": "Koleksi tidak ditambahkan karena: $1" + }, + "newCollectibleAddedMessage": { + "message": "Koleksi berhasil ditambahkan!" + }, "newContact": { "message": "Kontak Baru" }, "newContract": { "message": "Kontrak Baru" }, + "newNFTsDetected": { + "message": "Baru! Deteksi NFT" + }, + "newNFTsDetectedInfo": { + "message": "Izinkan MetaMask untuk mendeteksi NFT dari Opensea secara otomatis dan menampilkannya di dompet MetaMask Anda." + }, + "newNetworkAdded": { + "message": "“$1” berhasil ditambahkan!" + }, "newPassword": { "message": "Kata sandi baru (min. 8 karakter)" }, @@ -1197,6 +1833,9 @@ "newTransactionFee": { "message": "Biaya Transaksi Baru" }, + "newValues": { + "message": "nilai baru" + }, "next": { "message": "Berikutnya" }, @@ -1204,6 +1843,15 @@ "message": "Nonce lebih tinggi dari nonce yang disarankan $1", "description": "The next nonce according to MetaMask's internal logic" }, + "nftTokenIdPlaceholder": { + "message": "Masukkan ID koleksi" + }, + "nfts": { + "message": "NFT" + }, + "nickname": { + "message": "Nama panggilan" + }, "noAccountsFound": { "message": "Tidak ditemukan akun untuk kueri pencarian yang diberikan" }, @@ -1213,9 +1861,15 @@ "noAlreadyHaveSeed": { "message": "Tidak, saya sudah memiliki Frasa Pemulihan Rahasia" }, + "noConversionDateAvailable": { + "message": "Tanggal Konversi Mata Uang Tidak Tersedia" + }, "noConversionRateAvailable": { "message": "Tidak Ada Nilai Konversi yang Tersedia" }, + "noNFTs": { + "message": "Belum ada NFT" + }, "noThanks": { "message": "Tidak, Terima Kasih" }, @@ -1240,6 +1894,9 @@ "nonceFieldHeading": { "message": "Sesuaikan Nonce" }, + "notBusy": { + "message": "Tidak sibuk" + }, "notCurrentAccount": { "message": "Apa ini akun yang benar? Ini berbeda dari akun yang saat ini dipilih di dompet Anda" }, @@ -1298,11 +1955,48 @@ "message": "Pembaruan Dukungan Ledger untuk Pengguna Chrome", "description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update" }, + "notifications7DescriptionOne": { + "message": "MetaMask v10.1.0 menyertakan dukungan baru untuk transaksi EIP-1559 saat menggunakan perangkat Buku Besar.", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for ledger and EIP1559 in v10.1.0" + }, + "notifications7DescriptionTwo": { + "message": "Untuk menyelesaikan transaksi di Ethereum Mainnet, pastikan perangkat Buku Besar Anda memiliki firmware terbaru.", + "description": "Description of a notification in the 'See What's New' popup. Describes the need to update ledger firmware." + }, + "notifications7Title": { + "message": "Pembaruan firmware buku besar", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." + }, + "notifications8ActionText": { + "message": "Buka Pengaturan Lanjutan", + "description": "Description on an action button that appears in the What's New popup. Tells the user that if they click it, they will go to our Advanced Settings page." + }, + "notifications8DescriptionOne": { + "message": "Pada MetaMask v10.4.0, Anda tidak lagi memerlukan Ledger Live untuk menghubungkan perangkat Buku Besar Anda ke MetaMask.", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for how Ledger Live is no longer needed to connect the device." + }, + "notifications8DescriptionTwo": { + "message": "Untuk pengalaman buku besar yang lebih mudah dan stabil, buka tab Pengaturan lanjutan dan alihkan 'Jenis Koneksi Buku Besar Pilihan' ke 'WebHID'.", + "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." + }, + "notifications8Title": { + "message": "Peningkatan koneksi buku besar", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users that there is an improvement in how they can connect their device." + }, + "notifications9DescriptionOne": { + "message": "Kini kami memberi Anda lebih banyak wawasan seputar tab 'Data' saat mengonfirmasi transaksi kontrak pintar." + }, + "notifications9DescriptionTwo": { + "message": "Sekarang Anda bisa mendapatkan pemahaman yang lebih baik seputar detail transaksi Anda sebelum mengonfirmasi, dan lebih mudah menambahkan alamat transaksi ke buku alamat Anda, membantu Anda membuat keputusan yang aman dan terinformasi." + }, + "notifications9Title": { + "message": ".👓 Kami membuat transaksi lebih mudah untuk dibaca." + }, "ofTextNofM": { "message": "dari" }, "off": { - "message": "Off" + "message": "Mati" }, "offlineForMaintenance": { "message": "Offline untuk pemeliharaan" @@ -1311,18 +2005,81 @@ "message": "Oke" }, "on": { - "message": "On" + "message": "Nyala" + }, + "onboardingCreateWallet": { + "message": "Buat dompet baru" + }, + "onboardingImportWallet": { + "message": "Impor dompet yang ada" + }, + "onboardingPinExtensionBillboardAccess": { + "message": "Akses Penuh" + }, + "onboardingPinExtensionBillboardDescription": { + "message": "Ekstensi ini dapat melihat dan mengubah informasi" + }, + "onboardingPinExtensionBillboardDescription2": { + "message": "di situs ini." + }, + "onboardingPinExtensionBillboardTitle": { + "message": "Ekstensi" + }, + "onboardingPinExtensionChrome": { + "message": "Klik ikon ekstensi peramban" + }, + "onboardingPinExtensionDescription": { + "message": "Sematkan MetaMask pada peramban Anda agar dapat diakses dan memudahkan dalam melihat konfirmasi transaksi." + }, + "onboardingPinExtensionDescription2": { + "message": "Anda dapat membuka MetaMask dengan mengeklik ekstensi dan mengakses dompet Anda dalam 1 klik." + }, + "onboardingPinExtensionDescription3": { + "message": "Klik ikon ekstensi peramban untuk mengaksesnya secara langsung" + }, + "onboardingPinExtensionLabel": { + "message": "Sematkan MetaMask" + }, + "onboardingPinExtensionStep1": { + "message": "1" + }, + "onboardingPinExtensionStep2": { + "message": "2" + }, + "onboardingPinExtensionTitle": { + "message": "Pemasangan MetaMask Anda selesai!" }, "onboardingReturnNotice": { "message": "\"$1\" akan menutup tab ini dan mengarahkan kembali ke $2", "description": "Return the user to the site that initiated onboarding" }, + "onboardingShowIncomingTransactionsDescription": { + "message": "Menampilkan transaksi masuk di dompet Anda bergantung pada komunikasi dengan $1. Etherscan akan mendapat akses ke alamat Ethereum dan alamat IP Anda. Lihat $2.", + "description": "$1 is a clickable link with text defined by the 'etherscan' key. $2 is a clickable link with text defined by the 'privacyMsg' key." + }, + "onboardingUsePhishingDetectionDescription": { + "message": "Peringatan deteksi pengelabuan bergantung pada komunikasi dengan $1. jsDeliver akan mendapat akses ke alamat IP Anda. Lihat $2.", + "description": "The $1 is the word 'jsDeliver', from key 'jsDeliver' and $2 is the words Privacy Policy from key 'privacyMsg', both separated here so that it can be wrapped as a link" + }, "onlyAddTrustedNetworks": { "message": "Penyedia jaringan jahat dapat berbohong tentang status blockchain dan merekam aktivitas jaringan Anda. Hanya tambahkan jaringan kustom yang Anda percayai." }, "onlyConnectTrust": { "message": "Hanya hubungkan ke situs yang Anda percayai." }, + "openFullScreenForLedgerWebHid": { + "message": "Buka MetaMask dalam layar penuh untuk menghubungkan buku besar Anda melalui WebHID.", + "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." + }, + "optional": { + "message": "Opsional" + }, + "optionalWithParanthesis": { + "message": "(Opsional)" + }, + "or": { + "message": "atau" + }, "origin": { "message": "Asal" }, @@ -1341,6 +2098,12 @@ "passwordNotLongEnough": { "message": "Kata sandi kurang panjang" }, + "passwordSetupDetails": { + "message": "Kata sandi ini akan membuka dompet MetaMask Anda hanya pada perangkat ini. MetaMask tidak dapat memulihkan kata sandi ini." + }, + "passwordTermsWarning": { + "message": "Saya memahami bahwa MetaMask tidak dapat memulihkan kata sandi ini untuk saya. $1" + }, "passwordsDontMatch": { "message": "Kata Sandi Tidak Cocok" }, @@ -1351,6 +2114,19 @@ "pending": { "message": "Tunda" }, + "pendingTransactionInfo": { + "message": "Transaksi ini tidak akan diproses sampai transaksi tersebut selesai." + }, + "pendingTransactionMultiple": { + "message": "Anda memiliki ($1) transaksi yang tertunda." + }, + "pendingTransactionSingle": { + "message": "Anda memiliki (1) transaksi yang tertunda.", + "description": "$1 is count of pending transactions" + }, + "permissionRequest": { + "message": "Permohonan izin" + }, "permissions": { "message": "Izin" }, @@ -1361,6 +2137,10 @@ "message": "+ $1 lagi", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, + "preferredLedgerConnectionType": { + "message": "Jenis Koneksi Buku Besar Pilihan", + "description": "A header for a dropdown in the advanced section of settings. Appears above the ledgerConnectionPreferenceDescription message" + }, "prev": { "message": "Sebelumnya" }, @@ -1370,6 +2150,12 @@ "primaryCurrencySettingDescription": { "message": "Pilih asal untuk memprioritaskan nilai yang ditampilkan dalam mata uang asal rantai (contoh, ETH). Pilih Fiat untuk memprioritaskan nilai yang ditampilkan dalam mata uang fiat yang Anda pilih." }, + "priorityFee": { + "message": "Biaya prioritas" + }, + "priorityFeeProperCase": { + "message": "Biaya Prioritas" + }, "privacyMsg": { "message": "Kebijakan Privasi" }, @@ -1383,6 +2169,9 @@ "privateNetwork": { "message": "Jaringan Privat" }, + "proceedWithTransaction": { + "message": "Saya tetap ingin melanjutkan" + }, "proposedApprovalLimit": { "message": "Batas Persetujuan yang Diajukan" }, @@ -1410,6 +2199,9 @@ "recipientAddressPlaceholder": { "message": "Cari, alamat publik (0x), atau ENS" }, + "recommendedGasLabel": { + "message": "Direkomendasikan" + }, "recoveryPhraseReminderBackupStart": { "message": "Mulai di sini" }, @@ -1434,6 +2226,9 @@ "recoveryPhraseReminderTitle": { "message": "Lindungi dana Anda" }, + "refreshList": { + "message": "Perbarui daftar" + }, "reject": { "message": "Tolak" }, @@ -1449,6 +2244,9 @@ "rejected": { "message": "Ditolak" }, + "remember": { + "message": "Ingatlah:" + }, "remindMeLater": { "message": "Ingatkan saya nanti" }, @@ -1461,6 +2259,9 @@ "removeAccountDescription": { "message": "Akun ini akan dihapus dari dompet Anda. Pastikan Anda memiliki Frasa Pemulihan Rahasia asli atau kunci privat untuk akun impor ini sebelum melanjutkan. Anda dapat mengimpor atau membuat akun lagi dari akun drop down. " }, + "removeNFT": { + "message": "Hapus NFT" + }, "requestsAwaitingAcknowledgement": { "message": "permintaan menunggu untuk diakui" }, @@ -1549,12 +2350,33 @@ "secretPhrase": { "message": "Masukkan frasa rahasia Anda untuk memulihkan vault Anda." }, + "secretPhraseWarning": { + "message": "Jika Anda memulihkan menggunakan Frasa Pemulihan Rahasia lainnya, dompet, akun, dan aset Anda saat ini akan dihapus dari aplikasi ini secara permanen. Tindakan ini tidak dapat dibatalkan." + }, + "secretRecoveryPhrase": { + "message": "Frasa Pemulihan Rahasia" + }, + "secureWallet": { + "message": "Dompet Aman" + }, "securityAndPrivacy": { "message": "Keamanan & Privasi" }, "securitySettingsDescription": { "message": "Pengaturan privasi dan Frasa Pemulihan Rahasia dompet" }, + "seedPhraseConfirm": { + "message": "Konfirmasikan Frasa Pemulihan Rahasia" + }, + "seedPhraseEnterMissingWords": { + "message": "Konfirmasikan Frasa Pemulihan Rahasia" + }, + "seedPhraseIntroNotRecommendedButtonCopy": { + "message": "Ingatkan saya nanti (tidak direkomendasikan)" + }, + "seedPhraseIntroRecommendedButtonCopy": { + "message": "Amankan dompet saya (direkomendasikan)" + }, "seedPhraseIntroSidebarBulletFour": { "message": "Tuliskan dan simpan di beberapa tempat rahasia." }, @@ -1600,6 +2422,12 @@ "seedPhraseReq": { "message": "Frasa Pemulihan Rahasia berisi 12, 15, 18, 21, atau 24 kata" }, + "seedPhraseWriteDownDetails": { + "message": "Tuliskan Frasa Pemulihan Rahasia 12 kata ini, simpan di tempat yang aman dan hanya Anda yang dapat mengaksesnya." + }, + "seedPhraseWriteDownHeader": { + "message": "Tuliskan Frasa Pemulihan Rahasia Anda" + }, "selectAHigherGasFee": { "message": "Pilih biaya jaringan yang lebih tinggi untuk mempercepat pemrosesan transaksi Anda.*" }, @@ -1621,6 +2449,9 @@ "selectHdPath": { "message": "Pilih Jalur HD" }, + "selectNFTPrivacyPreference": { + "message": "Aktifkan deteksi NFT pada Pengaturan" + }, "selectPathHelp": { "message": "Jika Anda tidak melihat akun Ledger Anda yang ada di bawah, coba untuk beralih jalur ke \"Warisan (MEW / MyCrypto)\"" }, @@ -1640,15 +2471,31 @@ "message": "Kirim $1", "description": "Symbol of the specified token" }, + "sendTo": { + "message": "Kirim ke" + }, "sendTokens": { "message": "Kirim Token" }, + "sendingNativeAsset": { + "message": "Mengirim $1", + "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" + }, "separateEachWord": { "message": "Pisahkan setiap kata dengan satu spasi" }, + "setAdvancedPrivacySettings": { + "message": "Atur pengaturan privasi lanjutan" + }, + "setAdvancedPrivacySettingsDetails": { + "message": "MetaMask menggunakan layanan pihak ketiga tepercaya ini untuk meningkatkan kegunaan dan keamanan produk." + }, "settings": { "message": "Pengaturan" }, + "show": { + "message": "Tampil" + }, "showAdvancedGasInline": { "message": "Kontrol biaya jaringan tingkat lanjut" }, @@ -1667,6 +2514,9 @@ "showHexDataDescription": { "message": "Pilih ini untuk menampilkan bidang data hex di layar kirim" }, + "showHide": { + "message": "Tampil/Sembunyi" + }, "showIncomingTransactions": { "message": "Menampilkan Transaksi yang Masuk" }, @@ -1679,9 +2529,18 @@ "showPrivateKeys": { "message": "Tampilkan Kunci Privat" }, + "showRecommendations": { + "message": "Tampilkan Rekomendasi" + }, "showSeedPhrase": { "message": "Menampilkan Frasa Pemulihan Rahasia" }, + "showTestnetNetworks": { + "message": "Tampilkan jaringan pengujian" + }, + "showTestnetNetworksDescription": { + "message": "Pilih opsi ini untuk menampilkan jaringan pengujian dalam daftar jaringan" + }, "sigRequest": { "message": "Permintaan Tanda Tangan" }, @@ -1700,18 +2559,45 @@ "signed": { "message": "Ditandatangani" }, + "simulationErrorMessage": { + "message": "Transaksi ini diperkirakan akan gagal. Pelaksanaannya diperkirakan akan mahal dan berpotensi gagal, dan tidak direkomendasikan." + }, + "simulationErrorMessageV2": { + "message": "Kami tidak dapat memperkirakan gas. Tampaknya ada kesalahan dalam kontrak dan transaksi ini berpotensi gagal." + }, + "skip": { + "message": "Lewati" + }, + "skipAccountSecurity": { + "message": "Lewati Keamanan Akun?" + }, + "skipAccountSecurityDetails": { + "message": "Saya memahami bahwa sampai saya mencadangkan Frasa Pemulihan Rahasia, saya dapat kehilangan akun saya dan semua aset yang ada." + }, "slow": { "message": "Lambat" }, "somethingWentWrong": { "message": "Ups! Ada yang salah." }, + "source": { + "message": "Sumber" + }, "speedUp": { "message": "Mempercepat" }, "speedUpCancellation": { "message": "Percepat pembatalan ini" }, + "speedUpExplanation": { + "message": "Kami telah memperbarui biaya gas berdasarkan kondisi jaringan saat ini dan telah meningkatkannya minimal 10% (diperlukan oleh jaringan)." + }, + "speedUpPopoverTitle": { + "message": "Percepat transaksi" + }, + "speedUpTooltipText": { + "message": "Biaya gas baru" + }, "speedUpTransaction": { "message": "Percepat transaksi ini" }, @@ -1734,6 +2620,12 @@ "spendLimitTooLarge": { "message": "Batas penggunaan terlalu besar" }, + "stable": { + "message": "Stabil" + }, + "stableLowercase": { + "message": "stabil" + }, "stateLogError": { "message": "Kesalahan dalam log status pengambilan." }, @@ -1752,6 +2644,13 @@ "statusNotConnected": { "message": "Tidak terhubung" }, + "step1LatticeWallet": { + "message": "Pastikan Lattice1 Anda siap terhubung" + }, + "step1LatticeWalletMsg": { + "message": "Anda dapat menghubungkan MetaMask ke perangkat Lattice1 setelah diatur dan online. Buka perangkat Anda dan siapkan ID Perangkat Anda. Untuk informasi selengkapnya seputar penggunaan dompet perangkat keras, $1", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, "step1LedgerWallet": { "message": "Unduh aplikasi Ledger" }, @@ -1815,6 +2714,10 @@ "message": "Anda memerlukan $1 lagi $2 untuk menyelesaikan penukaran ini", "description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol." }, + "swapBestOfNQuotes": { + "message": "Kuotasi terbaik dari $1.", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, "swapBuildQuotePlaceHolderText": { "message": "Tidak ada token yang cocok yang tersedia $1", "description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text" @@ -1834,6 +2737,9 @@ "swapDecentralizedExchange": { "message": "Penukaran terdesentralisasi" }, + "swapDirectContract": { + "message": "Kontrak langsung" + }, "swapEditLimit": { "message": "Edit batas" }, @@ -1841,6 +2747,10 @@ "message": "Ini wajib dan memberikan MetaMask izin untuk menukar $1 Anda.", "description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps." }, + "swapEnableTokenForSwapping": { + "message": "Ini akan $1 untuk ditukar", + "description": "$1 is for the 'enableToken' key, e.g. 'enable ETH'" + }, "swapEstimatedNetworkFees": { "message": "Biaya jaringan yang diperkirakan" }, @@ -1854,6 +2764,9 @@ "swapFailedErrorTitle": { "message": "Penukaran gagal" }, + "swapFetchingQuotes": { + "message": "Mengambil kuotasi" + }, "swapFetchingQuotesErrorDescription": { "message": "Hmmm... ada yang salah. Coba lagi, atau jika masalah masih ada, hubungi dukungan pelanggan." }, @@ -1867,12 +2780,26 @@ "message": "Penukaran dari $1 ke $2", "description": "Tells a user that they need to confirm on their hardware wallet a swap of 2 tokens. $1 is a source token and $2 is a destination token" }, + "swapGasFeesDetails": { + "message": "Biaya gas diperkirakan dan akan berfluktuasi berdasarkan lalu lintas jaringan dan kompleksitas transaksi." + }, + "swapGasFeesLearnMore": { + "message": "Pelajari selengkapnya seputar biaya gas" + }, "swapGasFeesSplit": { "message": "Biaya jaringan di layar sebelumnya dibagi antara kedua transaksi ini." }, + "swapGasFeesSummary": { + "message": "Biaya gas dibayarkan kepada penambang kripto yang memproses transaksi di jaringan $1. MetaMask tidak mengambil keuntungan dari biaya gas.", + "description": "$1 is the selected network, e.g. Ethereum or BSC" + }, "swapHighSlippageWarning": { "message": "Jumlah slippage sangat tinggi." }, + "swapIncludesMMFee": { + "message": "Termasuk $1% biaya MetaMask.", + "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." + }, "swapLowSlippageError": { "message": "Transaksi bisa gagal, slippage maks. terlalu rendah." }, @@ -1886,6 +2813,10 @@ "message": "Kami menemukan harga terbaik dari sumber likuiditas teratas, setiap waktu. Biaya sebesar $1% otomatis diperhitungkan ke kuota ini.", "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." }, + "swapNQuotesWithDot": { + "message": "$1 kuotasi.", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, "swapNewQuoteIn": { "message": "Kuota baru di $1", "description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00" @@ -1978,6 +2909,12 @@ "swapSourceInfo": { "message": "Kami mencari beberapa sumber likuiditas (penukaran, agregator, dan pembuat pasar profesional) untuk menemukan tarif terbaik dan biaya jaringan terendah." }, + "swapSuggested": { + "message": "Swap yang disarankan" + }, + "swapSuggestedGasSettingToolTipMessage": { + "message": "Swap adalah transaksi yang kompleks dan sensitif terhadap waktu. Kami merekomendasikan biaya gas ini untuk keseimbangan yang baik antara biaya dan konfidensi dari keberhasilan Swap." + }, "swapSwapFrom": { "message": "Tukar dari" }, @@ -2016,6 +2953,10 @@ "message": "Diverifikasi di $1 sumber.", "description": "Indicates the number of token information sources that recognize the symbol + address. $1 is a decimal number." }, + "swapTooManyDecimalsError": { + "message": "$1 memungkinkan hingga $2 desimal", + "description": "$1 is a token symbol and $2 is the max. number of decimals allowed for the token" + }, "swapTransactionComplete": { "message": "Transaksi selesai" }, @@ -2034,7 +2975,7 @@ "description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol" }, "swapZeroSlippage": { - "message": "0% Slippage" + "message": "Selip 0%" }, "swapsAdvancedOptions": { "message": "Opsi Tingkat Lanjut" @@ -2076,6 +3017,12 @@ "symbolBetweenZeroTwelve": { "message": "Simbol harus terdiri dari 11 karakter atau kurang." }, + "syncFailed": { + "message": "Sinkronisasi gagal" + }, + "syncInProgress": { + "message": "Sinkronisasi sedang berlangsung" + }, "syncWithMobile": { "message": "Sinkronisasi dengan seluler" }, @@ -2118,6 +3065,9 @@ "thisWillCreate": { "message": "Ini akan membuat Frasa Pemulihan Rahasia dan dompet baru" }, + "time": { + "message": "Waktu" + }, "tips": { "message": "Kiat" }, @@ -2128,6 +3078,10 @@ "message": "Untuk: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, + "toggleTestNetworks": { + "message": "$1 jaringan pengujian", + "description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open to the advanced settings where users can enable the display of test networks in the network dropdown." + }, "token": { "message": "Token" }, @@ -2140,6 +3094,9 @@ "tokenDecimalFetchFailed": { "message": "Desimal token diperlukan." }, + "tokenDetectionAnnouncement": { + "message": "Baru! Deteksi token yang ditingkatkan tersedia di Ethereum Mainnet sebagai fitur eksperimental. $1" + }, "tokenSymbol": { "message": "Simbol Token" }, @@ -2164,6 +3121,48 @@ "transactionCreated": { "message": "Transaksi dibuat dengan nilai sebesar $1 pada $2." }, + "transactionData": { + "message": "Data transaksi" + }, + "transactionDecodingAccreditationDecoded": { + "message": "Kode diuraikan oleh Truffle" + }, + "transactionDecodingAccreditationVerified": { + "message": "Kontrak diverifikasi pada $1" + }, + "transactionDecodingUnsupportedNetworkError": { + "message": "Penguraian kode transaksi tidak tersedia untuk chainId $1" + }, + "transactionDetailDappGasMoreInfo": { + "message": "Situs yang disarankan" + }, + "transactionDetailDappGasTooltip": { + "message": "Edit untuk menggunakan biaya gas yang direkomendasikan MetaMask berdasarkan blok terbaru." + }, + "transactionDetailGasHeading": { + "message": "Estimasi biaya gas" + }, + "transactionDetailGasInfoV2": { + "message": "estimasi" + }, + "transactionDetailGasTooltipConversion": { + "message": "Pelajari selengkapnya seputar biaya gas" + }, + "transactionDetailGasTooltipExplanation": { + "message": "Biaya gas ditetapkan oleh jaringan dan berfluktuasi berdasarkan lalu lintas jaringan dan kompleksitas transaksi." + }, + "transactionDetailGasTooltipIntro": { + "message": "Biaya gas dibayarkan kepada penambang kripto yang memproses transaksi di jaringan $1. MetaMask tidak mengambil keuntungan dari biaya gas." + }, + "transactionDetailGasTotalSubtitle": { + "message": "Jumlah + biaya gas" + }, + "transactionDetailLayer2GasHeading": { + "message": "Biaya gas lapis 2" + }, + "transactionDetailMultiLayerTotalSubtitle": { + "message": "Jumlah + biaya" + }, "transactionDropped": { "message": "Transaksi jatuh pada $2." }, @@ -2179,6 +3178,27 @@ "transactionFee": { "message": "Biaya Transaksi" }, + "transactionHistoryBaseFee": { + "message": "Biaya Dasar (GWEI)" + }, + "transactionHistoryL1GasLabel": { + "message": "Total Biaya Gas L1" + }, + "transactionHistoryL2GasLimitLabel": { + "message": "Batas Gas L2" + }, + "transactionHistoryL2GasPriceLabel": { + "message": "Harga Gas L2" + }, + "transactionHistoryMaxFeePerGas": { + "message": "Biaya Maks Per Gas" + }, + "transactionHistoryPriorityFee": { + "message": "Biaya Prioritas (GWEI)" + }, + "transactionHistoryTotalGasFee": { + "message": "Total Biaya Gas" + }, "transactionResubmitted": { "message": "Transaksi dikirim kembali dengan biaya jaringan naik $1 pada $2" }, @@ -2205,12 +3225,31 @@ "message": "Kami mengalami masalah saat memuat saldo token Anda. Anda dapat melihatnya ", "description": "Followed by a link (here) to view token balances" }, + "trustSiteApprovePermission": { + "message": "Dengan memberikan izin, Anda mengizinkan $1 berikut untuk mengakses dana Anda" + }, "tryAgain": { "message": "Coba lagi" }, + "tryAnywayOption": { + "message": "Saya akan tetap mencobanya" + }, + "turnOnTokenDetection": { + "message": "Nyalakan deteksi token yang ditingkatkan" + }, + "twelveHrTitle": { + "message": "12 j:" + }, + "txInsightsNotSupported": { + "message": "Pemahaman transaksi tidak didukung untuk kontrak ini saat ini." + }, "typePassword": { "message": "Ketikkan kata sandi MetaMask Anda" }, + "u2f": { + "message": "U2F", + "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." + }, "unapproved": { "message": "Tidak disetujui" }, @@ -2249,6 +3288,10 @@ "message": "verifikasi detail jaringan", "description": "Serves as link text for the 'unrecognizedChain' key. This text will be embedded inside the translation for that key." }, + "unsendableAsset": { + "message": "Tidak mendukung pengiriman token koleksi (ERC-721) untuk saat ini", + "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" + }, "updatedWithDate": { "message": "Diperbarui $1" }, @@ -2258,12 +3301,24 @@ "urlExistsErrorMsg": { "message": "URL ini saat ini digunakan oleh jaringan $1." }, + "useCollectibleDetection": { + "message": "Deteksi otomatis NFT" + }, + "useCollectibleDetectionDescription": { + "message": "Menampilkan media & data NFT dapat mengekspos alamat IP Anda ke server terpusat. API pihak ketiga (seperti OpenSea) digunakan untuk mendeteksi NFT di dompet Anda. API memperlihatkan alamat akun Anda dengan layanan tersebut. Biarkan nonaktif jika Anda tidak ingin aplikasi memakai data dari layanan tersebut." + }, "usePhishingDetection": { "message": "Menggunakan Deteksi Phishing" }, "usePhishingDetectionDescription": { "message": "Menampilkan peringatan untuk domain phishing yang menargetkan pengguna Ethereum" }, + "useTokenDetection": { + "message": "Gunakan Deteksi Token" + }, + "useTokenDetectionDescription": { + "message": "Kami menggunakan API pihak ketiga untuk mendeteksi dan menampilkan token baru yang dikirim ke dompet Anda. Matikan jika Anda tidak ingin MetaMask memakai data dari layanan tersebut." + }, "usedByClients": { "message": "Digunakan oleh berbagai klien yang berbeda" }, @@ -2291,15 +3346,56 @@ "viewContact": { "message": "Lihat Kontak" }, + "viewFullTransactionDetails": { + "message": "Lihat detail transaksi lengkap" + }, "viewMore": { "message": "Lihat Selengkapnya" }, + "viewOnBlockExplorer": { + "message": "Lihat di penjelajah blok" + }, + "viewOnCustomBlockExplorer": { + "message": "Lihat $1 di $2", + "description": "$1 is the action type. e.g (Account, Transaction, Swap) and $2 is the Custom Block Exporer URL" + }, + "viewOnEtherscan": { + "message": "Lihat $1 di Etherscan", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, + "viewOnOpensea": { + "message": "Lihat di Opensea" + }, + "viewinExplorer": { + "message": "Lihat $1 di Penjelajah", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, "visitWebSite": { "message": "Kunjungi situs web kami" }, "walletConnectionGuide": { "message": "panduan koneksi dompet perangkat keras kami" }, + "walletCreationSuccessDetail": { + "message": "Anda telah berhasil melindungi dompet Anda. Jaga agar Frasa Pemulihan Rahasia tetap aman dan terlindungi -- ini merupakan tanggung jawab Anda!" + }, + "walletCreationSuccessReminder1": { + "message": "MetaMask tidak dapat memulihkan Frasa Pemulihan Rahasia Anda." + }, + "walletCreationSuccessReminder2": { + "message": "MetaMask tidak akan pernah menanyakan Frasa Pemulihan Rahasia Anda." + }, + "walletCreationSuccessReminder3": { + "message": "$1 dengan siapa pun atau dana Anda berisiko dicuri", + "description": "$1 is separated as walletCreationSuccessReminder3BoldSection so that we can bold it" + }, + "walletCreationSuccessReminder3BoldSection": { + "message": "Jangan pernah membagikan Frasa Pemulihan Rahasia Anda", + "description": "This string is localized separately from walletCreationSuccessReminder3 so that we can bold it" + }, + "walletCreationSuccessTitle": { + "message": "Dompet berhasil dibuat" + }, "walletSeedRestore": { "message": "Frasa Pemulihan Rahasia Dompet" }, @@ -2307,12 +3403,34 @@ "message": "Kami melihat situs web saat ini mencoba menggunakan API window.web3 yang dihapus. Jika situs tersebut tampak bermasalah, silakan klik $1 untuk informasi selengkapnya.", "description": "$1 is a clickable link." }, + "webhid": { + "message": "WebHID", + "description": "Refers to a interface for connecting external devices to the browser. Used for connecting ledger to the browser. Read more here https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API" + }, "welcome": { "message": "Selamat datang di MetaMask" }, "welcomeBack": { "message": "Selamat Datang Kembali!" }, + "welcomeExploreDescription": { + "message": "Simpan, kirim, serta belanjakan mata uang dan aset kripto." + }, + "welcomeExploreTitle": { + "message": "Jelajahi aplikasi terdesentralisasi" + }, + "welcomeLoginDescription": { + "message": "Gunakan MetaMask Anda untuk masuk ke aplikasi terdesentralisasi - tak perlu mendaftar." + }, + "welcomeLoginTitle": { + "message": "Ucapkan halo pada dompet Anda" + }, + "welcomeToMetaMask": { + "message": "Mari kita mulai" + }, + "welcomeToMetaMaskIntro": { + "message": "MetaMask merupakan dompet aman yang dipercaya oleh jutaan orang, yang membuat dunia web3 dapat diakses oleh semua orang." + }, "whatsNew": { "message": "Apa yang baru", "description": "This is the title of a popup that gives users notifications about new features and updates to MetaMask." diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json index 952baa98a..171c4c4d1 100644 --- a/app/_locales/it/messages.json +++ b/app/_locales/it/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Annulla" + }, + "QRHardwareWalletImporterTitle": { + "message": "Scansiona Codice QR" + }, "about": { "message": "Informazioni" }, @@ -19,9 +25,6 @@ "accessingYourCamera": { "message": "Accesso alla fotocamera..." }, - "account": { - "message": "Account" - }, "accountDetails": { "message": "Dettagli Account" }, @@ -145,9 +148,6 @@ "approved": { "message": "Approvato" }, - "asset": { - "message": "Asset" - }, "assets": { "message": "Patrimonio" }, @@ -221,9 +221,6 @@ "buyWithWyreDescription": { "message": "Wyre ti consente di usare la carta di credito per depositare ETH direttamente nel tuo account MetaMask." }, - "bytes": { - "message": "Bytes" - }, "canToggleInSettings": { "message": "Puoi riabilitare questa notifica in Impostazioni -> Avvisi." }, @@ -236,9 +233,6 @@ "cancelled": { "message": "Annullata" }, - "chainId": { - "message": "Chain ID" - }, "chromeRequiredForHardwareWallets": { "message": "Devi usare MetaMask con Google Chrome per connettere il tuo Portafoglio Hardware" }, @@ -400,6 +394,9 @@ "currentLanguage": { "message": "Lingua Corrente" }, + "custom": { + "message": "Avanzate" + }, "customGas": { "message": "Personalizza Gas" }, @@ -586,10 +583,6 @@ "message": "MetaMask ha riscontrato un errore", "description": "Title of generic error page" }, - "errorStack": { - "message": "Stack:", - "description": "Title for error stack, which is displayed for debugging purposes" - }, "estimatedProcessingTimes": { "message": "Tempi di Elaborazione Stimati" }, @@ -600,9 +593,6 @@ "ethereumPublicAddress": { "message": "Indirizzo pubblico Ethereum " }, - "etherscan": { - "message": "Etherscan" - }, "etherscanView": { "message": "Vedi account su Etherscan" }, @@ -858,6 +848,9 @@ "learnMore": { "message": "Scopri di più" }, + "learnMoreUpperCase": { + "message": "Scopri di più" + }, "ledgerAccountRestriction": { "message": "E' necessario utilizzare l'ultimo account prima di poterne aggiungere uno nuovo." }, @@ -879,9 +872,6 @@ "loadingTokens": { "message": "Caricamento Tokens..." }, - "localhost": { - "message": "Localhost 8545" - }, "lock": { "message": "Disconnetti" }, @@ -989,10 +979,6 @@ "newAccountDetectedDialogMessage": { "message": "Rilevato un nuovo indirizzo! Clicca qui per aggiungerlo alla tua rubrica." }, - "newAccountNumberName": { - "message": "Account $1", - "description": "Default name of next account to be created on create account screen" - }, "newContact": { "message": "Nuovo contatto" }, @@ -1060,18 +1046,9 @@ "ofTextNofM": { "message": "di" }, - "off": { - "message": "Off" - }, "offlineForMaintenance": { "message": "Offline per manutenzione" }, - "ok": { - "message": "Ok" - }, - "on": { - "message": "On" - }, "onboardingReturnNotice": { "message": "\"$1\" chiuderà questa tab e ritornerà a $2", "description": "Return the user to the site that initiated onboarding" @@ -1094,9 +1071,6 @@ "participateInMetaMetricsDescription": { "message": "Participa in MetaMetrics per aiutarci a rendere MetaMask migliore" }, - "password": { - "message": "Password" - }, "passwordNotLongEnough": { "message": "Password non abbastanza lunga" }, @@ -1218,9 +1192,6 @@ "message": "È stato trovato un backup dei tuoi dati da $1. Vuoi ripristinare le preferenze del portafoglio?", "description": "$1 is the date at which the data was backed up" }, - "retryTransaction": { - "message": "Retry Transaction" - }, "reusedTokenNameWarning": { "message": "Un token usa un simbolo già usato da un altro token, ciò può confondere o ingannare." }, @@ -1384,9 +1355,6 @@ "signatureRequest": { "message": "Firma Richiesta" }, - "signatureRequest1": { - "message": "Message" - }, "signed": { "message": "Firmata" }, @@ -1647,9 +1615,6 @@ "message": "$1 $2 disponibili allo scambio", "description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol" }, - "swapZeroSlippage": { - "message": "0% Slippage" - }, "swapsAdvancedOptions": { "message": "Impostazioni Avanzate" }, @@ -1730,9 +1695,6 @@ "message": "A: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, - "token": { - "message": "Token" - }, "tokenAlreadyAdded": { "message": "Il token è già stato aggiunto." }, diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json index 6ef5f2282..381b4c943 100644 --- a/app/_locales/ja/messages.json +++ b/app/_locales/ja/messages.json @@ -1,4 +1,49 @@ { + "QRHardwareInvalidTransactionTitle": { + "message": "エラー" + }, + "QRHardwareMismatchedSignId": { + "message": "トランザクションデータが一致していません。トランザクションの詳細を確認してください。" + }, + "QRHardwarePubkeyAccountOutOfRange": { + "message": "他にアカウントはありません。以下のリストにない別のアカウントにアクセスする場合は、ハードウェアウォレットを接続しなおして選択してください。" + }, + "QRHardwareScanInstructions": { + "message": "QRコードをカメラの前に置いてください。画面がぼやけていますが、読み取りには影響しません。" + }, + "QRHardwareSignRequestCancel": { + "message": "拒否" + }, + "QRHardwareSignRequestDescription": { + "message": "ウォレットで署名したら、「署名を取得」をクリックして署名を受け取ります" + }, + "QRHardwareSignRequestGetSignature": { + "message": "署名を取得" + }, + "QRHardwareSignRequestSubtitle": { + "message": "ウォレットでQRコードをスキャンします" + }, + "QRHardwareSignRequestTitle": { + "message": "署名をリクエスト" + }, + "QRHardwareUnknownQRCodeTitle": { + "message": "エラー" + }, + "QRHardwareUnknownWalletQRCode": { + "message": "QR コードが無効です。ハードウェアの同期QR コードをスキャンしてください。" + }, + "QRHardwareWalletImporterTitle": { + "message": "QR コードのスキャン" + }, + "QRHardwareWalletSteps1Description": { + "message": "QRコードを介して通信するエアギャップハードウェアウォレットを接続します。正式にサポートされているエアギャップハードウェアウォレットは、次のとおりです。" + }, + "QRHardwareWalletSteps1Title": { + "message": "QRベースのHWウォレット" + }, + "QRHardwareWalletSteps2Description": { + "message": "AirGap Vault・Ngrave (近日追加予定)" + }, "about": { "message": "バージョン情報" }, @@ -28,6 +73,10 @@ "accountName": { "message": "アカウント名" }, + "accountNameDuplicate": { + "message": "このアカウント名は既に存在します", + "description": "This is an error message shown when the user enters a new account name that matches an existing account name" + }, "accountOptions": { "message": "アカウントのオプション" }, @@ -43,6 +92,15 @@ "activityLog": { "message": "アクティビティのログ" }, + "add": { + "message": "追加" + }, + "addANetwork": { + "message": "ネットワークを追加" + }, + "addANickname": { + "message": "ニックネームを追加" + }, "addAcquiredTokens": { "message": "MetaMask を使用して取得したトークンを追加します" }, @@ -52,6 +110,9 @@ "addContact": { "message": "連絡先の追加" }, + "addCustomToken": { + "message": "カスタムトークンを追加" + }, "addCustomTokenByContractAddress": { "message": "トークンを発見できませんか?アドレスをペーストすることで手動でトークンを追加することができます。トークン コントラクト アドレスは $1 にあります。", "description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum" @@ -76,6 +137,12 @@ "addFriendsAndAddresses": { "message": "信頼できる友達とアドレスを追加する" }, + "addMemo": { + "message": "メモを追加" + }, + "addNFT": { + "message": "NFTを追加" + }, "addNetwork": { "message": "ネットワークの追加" }, @@ -91,12 +158,36 @@ "addToken": { "message": "トークンの追加" }, + "address": { + "message": "アドレス" + }, + "addressBookIcon": { + "message": "アドレス帳アイコン" + }, "advanced": { "message": "詳細" }, + "advancedBaseGasFeeToolTip": { + "message": "トランザクションがブロックに含まれた場合、最大基本手数料と実際の基本手数料の差が返金されます。合計金額は、最大基本手数料 (GWEI内) * ガス限度額で計算されます。" + }, + "advancedGasFeeDefaultOptIn": { + "message": "これらの$1を「高度な設定」のデフォルトとして保存" + }, + "advancedGasFeeDefaultOptOut": { + "message": "常にこれらの値と高度な設定をデフォルトとして使用します。" + }, + "advancedGasFeeModalTitle": { + "message": "高度なガス代" + }, + "advancedGasPriceTitle": { + "message": "ガス代" + }, "advancedOptions": { "message": "詳細オプション" }, + "advancedPriorityFeeToolTip": { + "message": "優先手数料 (別名「マイナーチップ」) はマイナーに直接支払われ、トランザクションを優先するインセンティブとなります。" + }, "advancedSettingsDescription": { "message": "デベロッパー機能にアクセスして、状態ログをダウンロードし、アカウントをリセットして、Testnet とカスタム RPC をセットアップしてください" }, @@ -130,6 +221,10 @@ "allowExternalExtensionTo": { "message": "この外部拡張機能に次の操作を許可します" }, + "allowSpendToken": { + "message": "$1へのアクセス権限を与えますか?", + "description": "$1 is the symbol of the token that are requesting to spend" + }, "allowThisSiteTo": { "message": "このサイトに次の操作を許可します" }, @@ -175,6 +270,9 @@ "approved": { "message": "承認済み" }, + "approvedAmountWithColon": { + "message": "承認された金額:" + }, "asset": { "message": "アセット" }, @@ -229,9 +327,43 @@ "balanceOutdated": { "message": "残高が期限切れの可能性があります" }, + "baseFee": { + "message": "基本手数料" + }, "basic": { "message": "基本" }, + "betaMetamaskDescription": { + "message": "MetaMaskは何百万人もに信頼されている安全なウォレットで、すべての人々によるWeb3の世界へのアクセスを可能にしています。" + }, + "betaMetamaskDescriptionExplanation": { + "message": "このバージョンを使うと、リリース前に今後の機能をテストできます。皆様からのご意見は、可能な限り最高のバージョンのMetaMaskを開発するうえで参考にさせていただきます。MetaMaskベータの使用には、標準の$1および弊社の$2が適用されます。ベータ版のため、バグのリスクが高くなる可能性があります。 続行することにより、これらのリスクと、弊社の利用規約およびベータ規約に記載されているリスクを承認し、これらに同意したものとみなされます。", + "description": "$1 represents localization item betaMetamaskDescriptionExplanationTermsLinkText. $2 represents localization item betaMetamaskDescriptionExplanationBetaTermsLinkText" + }, + "betaMetamaskDescriptionExplanationBetaTermsLinkText": { + "message": "ベータ版の追加規約" + }, + "betaMetamaskDescriptionExplanationTermsLinkText": { + "message": "利用規約" + }, + "betaMetamaskVersion": { + "message": "MetaMaskベータバージョン" + }, + "betaWelcome": { + "message": "MetaMaskベータへようこそ" + }, + "blockExplorerAccountAction": { + "message": "アカウント", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Account in Explorer" + }, + "blockExplorerAssetAction": { + "message": "アセット", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Asset in Explorer" + }, + "blockExplorerSwapAction": { + "message": "スワップ", + "description": "This is used with viewOnEtherscan e.g View Swap on Etherscan" + }, "blockExplorerUrl": { "message": "ブロック エクスプローラーの URL" }, @@ -251,9 +383,21 @@ "buildContactList": { "message": "連絡先リストを作成する" }, + "builtAroundTheWorld": { + "message": "MetaMaskは、世界中で設計・開発されています。" + }, + "busy": { + "message": "ビジー状態" + }, "buy": { "message": "購入" }, + "buyWithTransak": { + "message": "TransakでETHを購入" + }, + "buyWithTransakDescription": { + "message": "Transakは59か国以上でデビットカードと銀行振込 (場所によって異なります) をサポートしています。ETHはMetaMaskアカウントに入金されます。" + }, "buyWithWyre": { "message": "Wyre で ETH を購入" }, @@ -269,6 +413,15 @@ "cancel": { "message": "キャンセル" }, + "cancelEdit": { + "message": "編集をキャンセル" + }, + "cancelPopoverTitle": { + "message": "トランザクションをキャンセル" + }, + "cancelSpeedUp": { + "message": "トランザクションをキャンセルまたはスピードアップ" + }, "cancellationGasFee": { "message": "キャンセルのガス手数料" }, @@ -287,6 +440,10 @@ "chromeRequiredForHardwareWallets": { "message": "ハードウェア ウォレットに接続するには、MetaMask on Google Chrome を使用する必要があります。" }, + "clickToConnectLedgerViaWebHID": { + "message": "ここをクリックして、WebHIDでLedgerを接続します", + "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" + }, "clickToRevealSeed": { "message": "秘密の言葉を表示するには、ここをクリックします" }, @@ -299,6 +456,9 @@ "confirmPassword": { "message": "パスワードの確認" }, + "confirmRecoveryPhrase": { + "message": "シークレットリカバリーフレーズの確認" + }, "confirmSecretBackupPhrase": { "message": "秘密のバックアップ フレーズの確認" }, @@ -406,12 +566,18 @@ "continue": { "message": "続行" }, + "continueToTransak": { + "message": "Transakに進む" + }, "continueToWyre": { "message": "Wyre に進む" }, "contract": { "message": "コントラクト" }, + "contractAddress": { + "message": "コントラクトアドレス" + }, "contractAddressError": { "message": "トークンのコントラクト アドレスにトークンを送信しています。これにより、これらのトークンが失われる可能性があります。" }, @@ -430,6 +596,9 @@ "copyPrivateKey": { "message": "これは秘密鍵です (クリックしてコピー)" }, + "copyRawTransactionData": { + "message": "未処理のトランザクションデータをコピー" + }, "copyToClipboard": { "message": "クリップボードにコピー" }, @@ -445,6 +614,9 @@ "createAccount": { "message": "アカウントの作成" }, + "createNewWallet": { + "message": "新規ウォレットを作成" + }, "createPassword": { "message": "パスワードの作成" }, @@ -466,9 +638,22 @@ "currentLanguage": { "message": "現在の言語" }, + "currentTitle": { + "message": "現在:" + }, + "currentlyUnavailable": { + "message": "このネットワークでは利用できません" + }, + "custom": { + "message": "詳細" + }, "customGas": { "message": "ガスのカスタマイズ" }, + "customGasSettingToolTipMessage": { + "message": "ガス代をカスタマイズするには$1を使用します。慣れていない場合はわかりにくい可能性があります。自己責任で操作してください。", + "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold fontweight" + }, "customGasSubTitle": { "message": "手数料を増やすと処理時間は減少する可能性がありますが、減少しない場合もあります。" }, @@ -478,9 +663,29 @@ "customToken": { "message": "カスタム トークン" }, + "dappSuggested": { + "message": "サイト提案" + }, + "dappSuggestedGasSettingToolTipMessage": { + "message": "$1はこの価格を提案しています。", + "description": "$1 is url for the dapp that has suggested gas settings" + }, + "dappSuggestedShortLabel": { + "message": "サイト" + }, + "dappSuggestedTooltip": { + "message": "$1はこの価格を推奨しています。", + "description": "$1 represents the Dapp's origin" + }, + "data": { + "message": "データ" + }, "dataBackupFoundInfo": { "message": "一部のアカウント データは MetaMask の前回のインストール時にバックアップされました。これには、設定、連絡先、およびトークンが含まれます。このデータを今すぐ復元しますか?" }, + "dataHex": { + "message": "16進法" + }, "decimal": { "message": "トークンの 10 進数" }, @@ -522,6 +727,9 @@ "depositEther": { "message": "Ether 入金" }, + "description": { + "message": "説明" + }, "details": { "message": "詳細" }, @@ -579,9 +787,122 @@ "edit": { "message": "編集" }, + "editANickname": { + "message": "ニックネームを編集" + }, + "editAddressNickname": { + "message": "アドレスのニックネームを編集" + }, "editContact": { "message": "連絡先の編集" }, + "editGasEducationButtonText": { + "message": "どのように選択すればいいですか?" + }, + "editGasEducationHighExplanation": { + "message": "これは、トランザクションが成功する可能性を高めるため、急ぎのトランザクション (スワップなど) に最適です。スワップは処理に時間がかかりすぎると失敗し、ガス代の一部が失われる可能性があります。" + }, + "editGasEducationLowExplanation": { + "message": "低いガス代は、処理時間が重要でない場合以外使用しないでください。ガス代を下げると、いつトランザクションが成功するか (または成功するかどうか) が予測しにくくなります。" + }, + "editGasEducationMediumExplanation": { + "message": "中程度のガス代は、送金、引き出し、その他急ぎではないトランザクションに適しています。この設定のトランザクションは、ほとんどの場合成功します。" + }, + "editGasEducationModalIntro": { + "message": "適切なガス代は、トランザクションのタイプと重要性によって異なります。" + }, + "editGasEducationModalTitle": { + "message": "選び方" + }, + "editGasFeeModalTitle": { + "message": "ガス代を編集" + }, + "editGasHigh": { + "message": "高" + }, + "editGasLimitOutOfBounds": { + "message": "ガスの限度額は$1以上にする必要があります" + }, + "editGasLimitOutOfBoundsV2": { + "message": "ガスの限度額は$1より大きく、$2未満でなければなりません", + "description": "$1 is the minimum limit for gas and $2 is the maximum limit" + }, + "editGasLimitTooltip": { + "message": "ガスの限度額は、使用しても構わない最大のガス代です。 ガス代は、「最大優先手数料」と「最大手数料」の乗数です。" + }, + "editGasLow": { + "message": "低" + }, + "editGasMaxBaseFeeGWEIImbalance": { + "message": "最大基本手数料を優先手数料よりも低くすることはできません" + }, + "editGasMaxBaseFeeHigh": { + "message": "最大基本手数料が必要以上です" + }, + "editGasMaxBaseFeeLow": { + "message": "現在のネットワーク状況に対して最大基本手数料が低いです" + }, + "editGasMaxFeeHigh": { + "message": "最大手数料が必要以上です" + }, + "editGasMaxFeeLow": { + "message": "ネットワークの状況に対して最大手数料が低すぎます" + }, + "editGasMaxFeePriorityImbalance": { + "message": "最大手数料を優先手数料よりも低くすることはできません" + }, + "editGasMaxFeeTooltip": { + "message": "最大手数料は、支払う可能性のある最高額です (基本手数料 + 優先手数料)。" + }, + "editGasMaxPriorityFeeBelowMinimum": { + "message": "最大優先手数料は0GWEIより高くなければなりません" + }, + "editGasMaxPriorityFeeBelowMinimumV2": { + "message": "優先手数料は0より高くなければなりません。" + }, + "editGasMaxPriorityFeeHigh": { + "message": "最大優先手数料が必要以上です。必要以上の額が支払われる可能性があります。" + }, + "editGasMaxPriorityFeeHighV2": { + "message": "優先手数料が必要以上です。必要以上の額が支払われる可能性があります。" + }, + "editGasMaxPriorityFeeLow": { + "message": "現在のネットワーク状況に対して最大優先手数料が低いです" + }, + "editGasMaxPriorityFeeLowV2": { + "message": "現在のネットワーク状況に対して優先手数料が低いです" + }, + "editGasMaxPriorityFeeTooltip": { + "message": "最大優先手数料 (別名「マイナーチップ」) はマイナーに直接支払われ、トランザクションを優先するインセンティブとなります。通常最大設定額が支払われます" + }, + "editGasMedium": { + "message": "中" + }, + "editGasPriceTooLow": { + "message": "ガス代は0より高くなければなりません" + }, + "editGasPriceTooltip": { + "message": "このネットワークは、トランザクションの送信時に「ガス代」フィールドが必要です。ガス代は、ガス1単位あたりに支払う金額です。" + }, + "editGasSubTextAmountLabel": { + "message": "最大額:", + "description": "This is meant to be used as the $1 substitution editGasSubTextAmount" + }, + "editGasSubTextFeeLabel": { + "message": "最大手数料:" + }, + "editGasTitle": { + "message": "優先度を編集" + }, + "editGasTooLow": { + "message": "不明な処理時間" + }, + "editGasTooLowTooltip": { + "message": "現在の市場の状況に対し、最大手数料または最大優先手数料が低い可能性があります。トランザクションがいつ処理されるか (または処理されるかどうか) わかりません。 " + }, + "editGasTooLowWarningTooltip": { + "message": "これにより最大手数料は下がりますが、ネットワークトラフィックが増加するとトランザクションが遅延または失敗する可能性があります。" + }, "editNonceField": { "message": "ナンスの編集" }, @@ -591,6 +912,22 @@ "editPermission": { "message": "アクセス許可の編集" }, + "enableAutoDetect": { + "message": " 自動検出を有効にする" + }, + "enableFromSettings": { + "message": " 設定で有効にします。" + }, + "enableOpenSeaAPI": { + "message": "OpenSea APIを有効にする" + }, + "enableOpenSeaAPIDescription": { + "message": "OpenSea APIを使用してNFTデータを取得します。NFT自動検出はOpenSea APIを使用するため、この設定をオフにすると利用できなくなります。" + }, + "enableToken": { + "message": "$1を有効にする", + "description": "$1 is a token symbol, e.g. ETH" + }, "encryptionPublicKeyNotice": { "message": "$1 は公開暗号鍵を必要とします。同意することによって、このサイトは暗号化されたメッセージを作成できます。", "description": "$1 is the web3 site name" @@ -633,12 +970,21 @@ "message": "エンドポイントが別のチェーン ID を返してきました。$1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "ensIllegalCharacter": { + "message": "ENSにサポートされていない文字が使用されています。" + }, "ensNotFoundOnCurrentNetwork": { "message": "ENS 名が現在のネットワーク上に見つかりませんでした。イーサリアム メインネットへの切り替えを試みてください。" }, + "ensNotSupportedOnNetwork": { + "message": "ネットワークがENSをサポートしていません" + }, "ensRegistrationError": { "message": "ENS 名の登録のエラーです" }, + "ensUnknownError": { + "message": "ENSの検索に失敗しました。" + }, "enterAnAlias": { "message": "別名を入力してください" }, @@ -702,9 +1048,18 @@ "etherscanView": { "message": "Etherscan でアカウントを表示" }, + "etherscanViewOn": { + "message": "Etherscanで表示" + }, "expandView": { "message": "ビューの展開" }, + "experimental": { + "message": "実験的" + }, + "experimentalSettingsDescription": { + "message": "トークンの検出・その他" + }, "exportPrivateKey": { "message": "秘密鍵のエクスポート" }, @@ -724,6 +1079,9 @@ "failureMessage": { "message": "問題が発生しました。アクションを完了することができません" }, + "fakeTokenWarning": { + "message": "既存のトークンの偽のバージョンの作成を含め、誰でもトークンを作成できます。$1に関する詳細をご覧ください" + }, "fast": { "message": "高速" }, @@ -741,6 +1099,21 @@ "message": "ファイルのインポートが機能していない場合ここをクリック!", "description": "Helps user import their account from a JSON file" }, + "flaskSnapSettingsCardButtonCta": { + "message": "詳細を表示", + "description": "Call to action a user can take to see more information about the Snap that is installed" + }, + "flaskSnapSettingsCardDateAddedOn": { + "message": "追加日", + "description": "Start of the sentence describing when and where snap was added" + }, + "flaskSnapSettingsCardFrom": { + "message": "元", + "description": "Part of the sentence describing when and where snap was added" + }, + "followUsOnTwitter": { + "message": "Twitterでフォロー" + }, "forbiddenIpfsGateway": { "message": "IPFS ゲートウェイの使用は禁止されています:CID ゲートウェイを指定してください" }, @@ -760,6 +1133,19 @@ "functionType": { "message": "機能の種類" }, + "gas": { + "message": "ガス" + }, + "gasDisplayAcknowledgeDappButtonText": { + "message": "ガス代の提案を編集" + }, + "gasDisplayDappWarning": { + "message": "このガス代は$1により提案されています。これを上書きすると、トランザクションに問題が発生する可能性があります。ご質問がございましたら、$1までお問い合わせください。", + "description": "$1 represents the Dapp's origin" + }, + "gasEstimatesUnavailableWarning": { + "message": "弊社の低・中・高の見積もりはご利用いただけません。" + }, "gasLimit": { "message": "ガス リミット" }, @@ -773,6 +1159,12 @@ "message": "ガス リミットは $1 以上にする必要があります", "description": "$1 is the custom gas limit, in decimal." }, + "gasLimitV2": { + "message": "ガスの限度額" + }, + "gasOption": { + "message": "ガスオプション" + }, "gasPrice": { "message": "ガス価格 (GWEI)" }, @@ -791,6 +1183,38 @@ "gasPriceInfoTooltipContent": { "message": "ガス価格は、ガスの単位ごとに支払う Ether の額を指定します。" }, + "gasTimingHoursShort": { + "message": "$1時間", + "description": "$1 represents a number of hours" + }, + "gasTimingMinutes": { + "message": "$1分", + "description": "$1 represents a number of minutes" + }, + "gasTimingMinutesShort": { + "message": "$1分", + "description": "$1 represents a number of minutes" + }, + "gasTimingNegative": { + "message": "おそらく$1", + "description": "$1 represents an amount of time" + }, + "gasTimingPositive": { + "message": "$1未満の可能性が高い", + "description": "$1 represents an amount of time" + }, + "gasTimingSeconds": { + "message": "$1秒", + "description": "$1 represents a number of seconds" + }, + "gasTimingSecondsShort": { + "message": "$1秒", + "description": "$1 represents a number of seconds" + }, + "gasTimingVeryPositive": { + "message": "$1未満の可能性が非常に高い", + "description": "$1 represents an amount of time" + }, "gasUsed": { "message": "ガスが使用されました" }, @@ -818,9 +1242,15 @@ "getStarted": { "message": "開始" }, + "goBack": { + "message": "戻る" + }, "goerli": { "message": "Goerli テストネットワーク" }, + "grantedToWithColon": { + "message": "付与先:" + }, "happyToSeeYou": { "message": "お会いできてうれしいです。" }, @@ -863,9 +1293,25 @@ "hideZeroBalanceTokens": { "message": "残高なしトークンを隠す" }, + "high": { + "message": "積極的" + }, + "highGasSettingToolTipDialog": { + "message": "変動の激しい市場においても高い確率" + }, + "highGasSettingToolTipMessage": { + "message": "人気のNFTドロップなどによるネットワークトラフィックの急増に備えるため、$1を使用してください。", + "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" + }, + "highLowercase": { + "message": "高" + }, "history": { "message": "履歴" }, + "id": { + "message": "ID" + }, "import": { "message": "インポート", "description": "Button to import an account from a selected file" @@ -873,6 +1319,9 @@ "importAccount": { "message": "アカウントのインポート" }, + "importAccountError": { + "message": "アカウントのインポート中にエラーが発生しました。" + }, "importAccountLinkText": { "message": "シークレット リカバリー フレーズを使用してインポートする" }, @@ -886,12 +1335,31 @@ "message": "または $1", "description": "$1 represents the text from `importAccountLinkText` as a link" }, + "importExistingWalletDescription": { + "message": "ウォレットの作成時に提供されたシークレットリカバリーフレーズ (シードフレーズ) を入力してください。$1", + "description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link" + }, + "importExistingWalletTitle": { + "message": "シークレットリカバリー フレーズでアカウントをインポート" + }, + "importMyWallet": { + "message": "ウォレットをインポート" + }, + "importNFTs": { + "message": "NFTをインポート" + }, "importTokenQuestion": { "message": "トークンをインポートしますか?" }, "importTokenWarning": { "message": "誰でも既存のトークンの偽バージョンを含めて、任意の名前でトークンを作成することができます。自己責任で追加およびトレードしてください。" }, + "importTokens": { + "message": "トークンをインポート" + }, + "importTokensCamelCase": { + "message": "トークンをインポート" + }, "importWallet": { "message": "ウォレットのインポート" }, @@ -915,6 +1383,9 @@ "insufficientFunds": { "message": "資金が不十分です。" }, + "insufficientFundsForGas": { + "message": "ガス代が足りません" + }, "insufficientTokens": { "message": "トークンが不十分です。" }, @@ -974,10 +1445,19 @@ "ipfsGatewayDescription": { "message": "ENS コンテンツの解決に使用する IPFS CID ゲートウェイの URL を入力します。" }, + "jsDeliver": { + "message": "jsDeliver" + }, "jsonFile": { "message": "JSON ファイル", "description": "format for importing an account" }, + "keystone": { + "message": "Keystone" + }, + "keystoneTutorial": { + "message": "(チュートリアル)" + }, "knownAddressRecipient": { "message": "既知のコントラクト アドレスです。" }, @@ -990,12 +1470,57 @@ "lastConnected": { "message": "最後に接続された" }, + "layer1Fees": { + "message": "レイヤー1手数料" + }, + "learmMoreAboutGas": { + "message": "ガスについて$1しますか?" + }, + "learnCancelSpeeedup": { + "message": "$1の方法を学ぶ", + "description": "$1 is link to cancel or speed up transactions" + }, "learnMore": { "message": "詳細を表示" }, + "learnMoreUpperCase": { + "message": "詳細を表示" + }, + "learnScamRisk": { + "message": "詐欺やセキュリティのリスク" + }, "ledgerAccountRestriction": { "message": "新しいアカウントを追加するには、その前に最後のアカウントを使用する必要があります。" }, + "ledgerConnectionInstructionCloseOtherApps": { + "message": "デバイスに接続されている他のソフトウェアを閉じてから、ここをクリックして更新してください。" + }, + "ledgerConnectionInstructionHeader": { + "message": "確認をクリックする前:に:" + }, + "ledgerConnectionInstructionStepFour": { + "message": "Ledgerデバイスで「スマートコントラクトデータ」または「ブラインド署名」を有効にしてください" + }, + "ledgerConnectionInstructionStepOne": { + "message": "設定 > 高度な設定でLedger Liveを有効にしてください" + }, + "ledgerConnectionInstructionStepThree": { + "message": "Ledgerデバイスを接続し、Ethereumアプリを選択してください" + }, + "ledgerConnectionInstructionStepTwo": { + "message": "Ledger Liveアプリを開いてロックを解除してください" + }, + "ledgerConnectionPreferenceDescription": { + "message": "LedgerをMetaMaskに接続する方法をカスタマイズします。$1が推奨されますが、他のオプションも利用できます。詳細はこちらをご覧ください: $2", + "description": "A description that appears above a dropdown where users can select between up to three options - Ledger Live, U2F or WebHID - depending on what is supported in their browser. $1 is the recommended browser option, it will be either WebHID or U2f. $2 is a link to an article where users can learn more, but will be the translation of the learnMore message." + }, + "ledgerDeviceOpenFailureMessage": { + "message": "Ledgerデバイスを開けませんでした。Ledgerが他のソフトウェアに接続されている可能性があります。Ledger LiveまたはLedgerデバイスに接続されている他のアプリケーションを閉じて、もう一度接続してみてください。" + }, + "ledgerLive": { + "message": "Ledger Live", + "description": "The name of a desktop app that can be used with your ledger device. We can also use it to connect a users Ledger device to MetaMask." + }, "ledgerLiveApp": { "message": "レジャー ライブのアプリ" }, @@ -1005,12 +1530,22 @@ "ledgerTimeout": { "message": "レジャー ライブが応答または接続タイムアウトに時間がかかりすぎています。レジャー ライブのアプリが開かれていて、デバイスのロックが解除されていることを確認します。" }, + "ledgerTransportChangeWarning": { + "message": "Ledger Liveアプリが開いている場合は、開いているLedger Live接続をすべて切断し、Ledger Liveアプリを閉じてください。" + }, + "ledgerWebHIDNotConnectedErrorMessage": { + "message": "Ledgerデバイスが接続されていません。Ledgerに接続する場合は、もう一度「続行」をクリックして、HID接続を承認してください。", + "description": "An error message shown to the user during the hardware connect flow." + }, "letsGoSetUp": { "message": "さあセットアップしましょう!" }, "likeToImportTokens": { "message": "これらのトークンを追加しますか?" }, + "link": { + "message": "リンク" + }, "links": { "message": "リンク" }, @@ -1032,15 +1567,48 @@ "lockTimeTooGreat": { "message": "ロック時間が大きすぎます" }, + "low": { + "message": "低" + }, + "lowGasSettingToolTipMessage": { + "message": "値下がりを待つには$1を使用してください。価格がやや予測不可能なため、予想時間はあまり正確ではありません。", + "description": "$1 is key 'low' separated here so that it can be passed in with bold fontweight" + }, + "lowLowercase": { + "message": "低" + }, + "lowPriorityMessage": { + "message": "今後のトランザクションはこのトランザクションの後でキューに入ります。この価格が最後に表示されたのはしばらく前のことです。" + }, "mainnet": { "message": "イーサリアム メインネット" }, "makeAnotherSwap": { "message": "新しいスワップの作成" }, + "makeSureNoOneWatching": { + "message": "誰にも画面を見られていないことを確認してください", + "description": "Warning to users to be care while creating and saving their new Secret Recovery Phrase" + }, "max": { "message": "最大" }, + "maxBaseFee": { + "message": "最大基本手数料" + }, + "maxFee": { + "message": "最大手数料" + }, + "maxPriorityFee": { + "message": "最大優先手数料" + }, + "medium": { + "message": "市場" + }, + "mediumGasSettingToolTipMessage": { + "message": "現在の市場価格での迅速な処理には、$1を使用してください。", + "description": "$1 is key 'medium' (text: 'Market') separated here so that it can be passed in with bold fontweight" + }, "memo": { "message": "メモ" }, @@ -1071,6 +1639,9 @@ "metametricsCommitmentsAllowOptOut": { "message": "いつでも設定からオプトアウトできるようにします" }, + "metametricsCommitmentsAllowOptOut2": { + "message": "いつでも設定でオプトアウトできます" + }, "metametricsCommitmentsBoldNever": { "message": "実行しない", "description": "This string is localized separately from some of the commitments so that we can bold it" @@ -1078,6 +1649,9 @@ "metametricsCommitmentsIntro": { "message": "MetaMask が実行する内容" }, + "metametricsCommitmentsNeverCollect": { + "message": "キー、アドレス、トランザクション、残高、ハッシュなど、いかなる個人情報も収集されることはありません" + }, "metametricsCommitmentsNeverCollectIP": { "message": "$1 が完全な IP アドレスを収集することはありません", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" @@ -1086,6 +1660,12 @@ "message": "$1 は、キー、アドレス、トランザクション、残高、ハッシュなど、いかなる個人情報も収集しません", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" }, + "metametricsCommitmentsNeverIP": { + "message": "完全なIPアドレスは収集されません" + }, + "metametricsCommitmentsNeverSell": { + "message": "決して利益目的にデータを販売することはありません!" + }, "metametricsCommitmentsNeverSellDataForProfit": { "message": "$1 が営利目的でデータを販売することは決してありません。", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" @@ -1099,6 +1679,12 @@ "metametricsOptInDescription": { "message": "MetaMask では、ユーザーによる拡張機能の操作方法についてよりよく理解するため、基本的な使用状況データを収集させていただきたいと考えています。このデータは、当社の製品およびイーサリアム エコシステムの使いやすさとユーザー エクスペリエンス継続的に改善するために使用されます。" }, + "metametricsOptInDescription2": { + "message": "弊社の製品の使いやすさを向上させるために、基本的な使用データを収集したいと考えています. これらの指標は..." + }, + "metametricsTitle": { + "message": "6百万人以上のユーザーと共に、MetaMaskの改善にご協力ください" + }, "mismatchedChain": { "message": "このチェーン ID のネットワーク詳細が、レコードと一致しません。続行する前に $1 をお勧めします。", "description": "$1 is a clickable link with text defined by the 'mismatchedChainLinkText' key" @@ -1107,6 +1693,15 @@ "message": "ネットワークの詳細を確認します", "description": "Serves as link text for the 'mismatchedChain' key. This text will be embedded inside the translation for that key." }, + "missingNFT": { + "message": "NFTが見当たりませんか?" + }, + "missingToken": { + "message": "トークンが見当たりませんか?" + }, + "mobileSyncWarning": { + "message": "「拡張機能と同期」機能は一時的に無効になっています。拡張ウォレットをMetaMaskモバイルで使用する場合は、モバイルアプリでウォレットの設定オプションに戻り、「シークレットリカバリーフレーズでインポート」オプションを選択します。拡張ウォレットのシークレットフレーズを使用して、ウォレットをモバイルにインポートします。" + }, "mustSelectOne": { "message": "トークンを 1 つ以上選択する必要があります。" }, @@ -1123,9 +1718,15 @@ "message": "お手伝いしましょうか?$1 に連絡", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" }, + "needHelpFeedback": { + "message": "フィードバックを提供" + }, "needHelpLinkText": { "message": "MetaMask のサポート" }, + "needHelpSubmitTicket": { + "message": "チケットを送信" + }, "needImportFile": { "message": "インポートするファイルの選択が必要です。", "description": "User is important an account and needs to add a file to continue" @@ -1148,6 +1749,12 @@ "networkNameEthereum": { "message": "イーサリアム" }, + "networkNamePolygon": { + "message": "Polygon" + }, + "networkNameRinkeby": { + "message": "Rinkeby" + }, "networkNameTestnet": { "message": "テストネット" }, @@ -1157,6 +1764,20 @@ "networkSettingsDescription": { "message": "カスタム RPC ネットワークの追加と編集" }, + "networkStatus": { + "message": "ネットワークステータス" + }, + "networkStatusBaseFeeTooltip": { + "message": "基本手数料はネットワークによって設定され、13~14秒ごとに変更されます。弊社の$1と$2のオプションは、突然の増加を考慮したものです。", + "description": "$1 and $2 are bold text for Medium and Aggressive respectively." + }, + "networkStatusPriorityFeeTooltip": { + "message": "優先手数料 (別名「マイナーチップ」) はマイナーに直接支払われ、トランザクションを優先するインセンティブとなります。" + }, + "networkStatusStabilityFeeTooltip": { + "message": "ガス代は過去72時間と比較して$1です。", + "description": "$1 is networks stability value - stable, low, high" + }, "networkURL": { "message": "ネットワーク URL" }, @@ -1179,12 +1800,27 @@ "message": "アカウント $1", "description": "Default name of next account to be created on create account screen" }, + "newCollectibleAddFailed": { + "message": "次の理由により、コレクティブルは追加されませんでした: $1" + }, + "newCollectibleAddedMessage": { + "message": "コレクティブルが追加されました!" + }, "newContact": { "message": "新しい連絡先" }, "newContract": { "message": "新しいコントラクト" }, + "newNFTsDetected": { + "message": "新機能!NFT検出" + }, + "newNFTsDetectedInfo": { + "message": "MetaMaskがOpenseからNFTを自動的に検出し、MetaMaskウォレットに表示できるようにします。" + }, + "newNetworkAdded": { + "message": "「$1」が追加されました!" + }, "newPassword": { "message": "新しいパスワード (最低 8 文字)" }, @@ -1197,6 +1833,9 @@ "newTransactionFee": { "message": "新しいトランザクション手数料" }, + "newValues": { + "message": "新しい値" + }, "next": { "message": "次へ" }, @@ -1204,6 +1843,15 @@ "message": "ナンスが $1 の提案されたナンスよりも大きいです", "description": "The next nonce according to MetaMask's internal logic" }, + "nftTokenIdPlaceholder": { + "message": "コレクティブルIDを入力してください" + }, + "nfts": { + "message": "NFT" + }, + "nickname": { + "message": "ニックネーム" + }, "noAccountsFound": { "message": "指定された検索クエリーでアカウントが見つかりませんでした" }, @@ -1213,9 +1861,15 @@ "noAlreadyHaveSeed": { "message": "いいえ、既にシークレット リカバリー フレーズを持っています" }, + "noConversionDateAvailable": { + "message": "通貨換算日がありません" + }, "noConversionRateAvailable": { "message": "どの換算率も利用できません" }, + "noNFTs": { + "message": "NFTはまだありません" + }, "noThanks": { "message": "同意しません" }, @@ -1240,6 +1894,9 @@ "nonceFieldHeading": { "message": "カスタム ナンス" }, + "notBusy": { + "message": "ビジーではありません" + }, "notCurrentAccount": { "message": "これは正しいアカウントですか?ウォレットで現在選択されているアカウントと異なっています" }, @@ -1298,6 +1955,43 @@ "message": "Chrome ユーザー向けのレジャーのサポートの更新", "description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update" }, + "notifications7DescriptionOne": { + "message": "MetaMask v10.1.0には、Ledgerデバイスを使用時のEIP-1559トランザクションのサポートが新たに追加されました。", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for ledger and EIP1559 in v10.1.0" + }, + "notifications7DescriptionTwo": { + "message": "Ethereum Mainnetでトランザクションを完了させるには、Ledgerデバイスに最新のファームウェアがインストールされていことを確認してください。", + "description": "Description of a notification in the 'See What's New' popup. Describes the need to update ledger firmware." + }, + "notifications7Title": { + "message": "Ledgerファームウェアのアップデート", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." + }, + "notifications8ActionText": { + "message": "高度な設定に移動", + "description": "Description on an action button that appears in the What's New popup. Tells the user that if they click it, they will go to our Advanced Settings page." + }, + "notifications8DescriptionOne": { + "message": "MetaMask v10.4.0以降では、LedgerデバイスのMetaMaskへの接続にLedger Liveが不要になりました。", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for how Ledger Live is no longer needed to connect the device." + }, + "notifications8DescriptionTwo": { + "message": "Ledgerをより簡単かつ安定してご利用いただくには、設定の「高度な設定」タブに移動し、「優先Ledger接続タイプ」を「WebHID」に切り替えてください。", + "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." + }, + "notifications8Title": { + "message": "Ledgerの接続の改善", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users that there is an improvement in how they can connect their device." + }, + "notifications9DescriptionOne": { + "message": "スマートコントラクトトランザクションの確定の際に、「データ」タブでより多くの情報が提供されるようになりました。" + }, + "notifications9DescriptionTwo": { + "message": "確定する前に、トランザクションの詳細をよりよく理解できるようになりました。また、アドレス帳にトランザクションアドレスを簡単に追加できるようにもなり、安全かつ情報に基づいた意思決定が可能になりました。" + }, + "notifications9Title": { + "message": "👓 トランザクションが読みやすくなりました。" + }, "ofTextNofM": { "message": "中の" }, @@ -1313,16 +2007,79 @@ "on": { "message": "オン" }, + "onboardingCreateWallet": { + "message": "新規ウォレットを作成" + }, + "onboardingImportWallet": { + "message": "既存のウォレットをインポート" + }, + "onboardingPinExtensionBillboardAccess": { + "message": "フルアクセス" + }, + "onboardingPinExtensionBillboardDescription": { + "message": "これらの拡張機能は、情報を表示および変更できます" + }, + "onboardingPinExtensionBillboardDescription2": { + "message": "このサイトで。" + }, + "onboardingPinExtensionBillboardTitle": { + "message": "拡張機能" + }, + "onboardingPinExtensionChrome": { + "message": "ブラウザの拡張機能アイコンをクリックします" + }, + "onboardingPinExtensionDescription": { + "message": "MetaMaskをブラウザにピン留めすることで、アクセスしやすくなり、トランザクションの確認を簡単に表示できるようになります。" + }, + "onboardingPinExtensionDescription2": { + "message": "拡張機能をクリックしてMetaMaskを開き、ワンクリックでウォレットにアクセスできます。" + }, + "onboardingPinExtensionDescription3": { + "message": "ブラウザの拡張機能アイコンをクリックすると、すぐにアクセスできます" + }, + "onboardingPinExtensionLabel": { + "message": "MetaMaskをピン留めする" + }, + "onboardingPinExtensionStep1": { + "message": "1" + }, + "onboardingPinExtensionStep2": { + "message": "2" + }, + "onboardingPinExtensionTitle": { + "message": "MetaMaskのインストールが完了しました!" + }, "onboardingReturnNotice": { "message": "\"$1\" はこのタブを閉じます。$2 に戻ってください。", "description": "Return the user to the site that initiated onboarding" }, + "onboardingShowIncomingTransactionsDescription": { + "message": "ウォレットに受け取ったトランザクションを表示するには、$1との通信が必要です。EtherscanはユーザーのEthereumアドレスとIPアドレスにアクセスできます。$2をご覧ください。", + "description": "$1 is a clickable link with text defined by the 'etherscan' key. $2 is a clickable link with text defined by the 'privacyMsg' key." + }, + "onboardingUsePhishingDetectionDescription": { + "message": "フィッシング検出アラートには$1との通信が必要です。jsDeliverはユーザーのIPアドレスにアクセスします。$2をご覧ください。", + "description": "The $1 is the word 'jsDeliver', from key 'jsDeliver' and $2 is the words Privacy Policy from key 'privacyMsg', both separated here so that it can be wrapped as a link" + }, "onlyAddTrustedNetworks": { "message": "悪意のあるネットワーク プロバイダは、ブロックチェーンの状態を偽り、お客様のネットワーク行動を記録することがあります。信頼するカスタム ネットワークのみを追加してください。" }, "onlyConnectTrust": { "message": "信頼するサイトにのみ接続します。" }, + "openFullScreenForLedgerWebHid": { + "message": "WebHIDでLedgerを接続するには、MetaMaskを全画面モードで開いてください。", + "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." + }, + "optional": { + "message": "任意" + }, + "optionalWithParanthesis": { + "message": "(任意)" + }, + "or": { + "message": "または" + }, "origin": { "message": "起点" }, @@ -1341,6 +2098,12 @@ "passwordNotLongEnough": { "message": "パスワードの長さが足りません" }, + "passwordSetupDetails": { + "message": "このパスワードは、このデバイスでのみMetaMaskウォレットのロックを解除します。MetaMaskはこのパスワードを復元できません。" + }, + "passwordTermsWarning": { + "message": "私はMetaMaskがこのパスワードを復元できないことを理解しています。$1" + }, "passwordsDontMatch": { "message": "パスワードが一致しません" }, @@ -1351,6 +2114,19 @@ "pending": { "message": "処理" }, + "pendingTransactionInfo": { + "message": "このトランザクションは、そのトランザクションが完了するまで処理されません。" + }, + "pendingTransactionMultiple": { + "message": "保留中のトランザクションが ($1) 件あります。" + }, + "pendingTransactionSingle": { + "message": "保留中のトランザクションが (1) 件あります。", + "description": "$1 is count of pending transactions" + }, + "permissionRequest": { + "message": "パーミッションリクエスト" + }, "permissions": { "message": "許可" }, @@ -1361,6 +2137,10 @@ "message": "+ $1 以上", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, + "preferredLedgerConnectionType": { + "message": "優先Ledger接続タイプ", + "description": "A header for a dropdown in the advanced section of settings. Appears above the ledgerConnectionPreferenceDescription message" + }, "prev": { "message": "前へ" }, @@ -1370,6 +2150,12 @@ "primaryCurrencySettingDescription": { "message": "チェーンのネイティブ通貨 (ETH など) による値の表示を優先するには、[ネイティブ] を選択します。選択したフィアット通貨による値の表示を優先するには、[フィアット] を選択します。" }, + "priorityFee": { + "message": "優先手数料" + }, + "priorityFeeProperCase": { + "message": "優先手数料" + }, "privacyMsg": { "message": "プライバシー ポリシー" }, @@ -1383,6 +2169,9 @@ "privateNetwork": { "message": "プライベート ネットワーク" }, + "proceedWithTransaction": { + "message": "それでも続行" + }, "proposedApprovalLimit": { "message": "提案された承認限度額" }, @@ -1410,6 +2199,9 @@ "recipientAddressPlaceholder": { "message": "検索、パブリック アドレス (0x)、または ENS" }, + "recommendedGasLabel": { + "message": "推奨" + }, "recoveryPhraseReminderBackupStart": { "message": "ここから開始" }, @@ -1434,6 +2226,9 @@ "recoveryPhraseReminderTitle": { "message": "資産を保護してください" }, + "refreshList": { + "message": "リストを更新" + }, "reject": { "message": "拒否" }, @@ -1449,6 +2244,9 @@ "rejected": { "message": "拒否されました" }, + "remember": { + "message": "ご注意:" + }, "remindMeLater": { "message": "後で通知する" }, @@ -1461,6 +2259,9 @@ "removeAccountDescription": { "message": "このアカウントはウォレットから削除されます。続行する前に、インポートしたアカウントの元のシークレット リカバリー フレーズまたは秘密鍵を持っていることを確認してください。アカウントはアカウント ドロップダウンから再度インポートまたは作成できます。" }, + "removeNFT": { + "message": "NFTを削除" + }, "requestsAwaitingAcknowledgement": { "message": "承認されるまで待機の要求" }, @@ -1549,12 +2350,33 @@ "secretPhrase": { "message": "ボールトを復元するには、秘密のフレーズをここに入力します。" }, + "secretPhraseWarning": { + "message": "別のシークレットリカバリーフレーズを使用して復元すると、現在のウォレット、アカウント、アセットは永久にこのアプリから削除されます。この操作は元に戻せません。" + }, + "secretRecoveryPhrase": { + "message": "シークレットリカバリーフレーズ" + }, + "secureWallet": { + "message": "安全なウォレット" + }, "securityAndPrivacy": { "message": "セキュリティとプライバシー" }, "securitySettingsDescription": { "message": "プライバシーの設定とシークレット リカバリー フレーズ" }, + "seedPhraseConfirm": { + "message": "シークレットリカバリーフレーズの確認" + }, + "seedPhraseEnterMissingWords": { + "message": "シークレットリカバリーフレーズの確認" + }, + "seedPhraseIntroNotRecommendedButtonCopy": { + "message": "後で通知 (非推奨)" + }, + "seedPhraseIntroRecommendedButtonCopy": { + "message": "ウォレットの安全を確保 (推奨)" + }, "seedPhraseIntroSidebarBulletFour": { "message": "書き留めて、複数の秘密の場所に保存します。" }, @@ -1600,6 +2422,12 @@ "seedPhraseReq": { "message": "シークレット リカバリー フレーズには、12、15、18、21、24 語が含まれます" }, + "seedPhraseWriteDownDetails": { + "message": "この12単語のシークレットリカバリーフレーズを書き留めて、自分だけがアクセスできる信頼できる場所に保管してください。" + }, + "seedPhraseWriteDownHeader": { + "message": "シークレットリカバリーフレーズを書き留めてください" + }, "selectAHigherGasFee": { "message": "トランザクションの処理を加速するには、より高いガス手数料を選択します。*" }, @@ -1621,6 +2449,9 @@ "selectHdPath": { "message": "HD パスの選択" }, + "selectNFTPrivacyPreference": { + "message": "設定でNFTの検出をオンにします" + }, "selectPathHelp": { "message": "既存の Ledger のアカウントが以下に表示されない場合は、パスを \"Legacy (MEW / MyCrypto)\" に変えてください。" }, @@ -1640,15 +2471,31 @@ "message": "$1 を送金", "description": "Symbol of the specified token" }, + "sendTo": { + "message": "送信先:" + }, "sendTokens": { "message": "トークンの送信" }, + "sendingNativeAsset": { + "message": "$1を送信中", + "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" + }, "separateEachWord": { "message": "単語ごとにスペースを 1 つ置いて分離します" }, + "setAdvancedPrivacySettings": { + "message": "高度なプライバシー設定を設定" + }, + "setAdvancedPrivacySettingsDetails": { + "message": "MetaMaskはこれらの信頼できるサードパーティーサービスを使用して、製品の使いやすさと安全性を向上させています。" + }, "settings": { "message": "設定" }, + "show": { + "message": "表示" + }, "showAdvancedGasInline": { "message": "高度なガス コントロール" }, @@ -1667,6 +2514,9 @@ "showHexDataDescription": { "message": "これを選択すると、送金画面に 16 進データフィールドが表示されます" }, + "showHide": { + "message": "表示/非表示" + }, "showIncomingTransactions": { "message": "入庫の表示" }, @@ -1679,9 +2529,18 @@ "showPrivateKeys": { "message": "秘密鍵の表示" }, + "showRecommendations": { + "message": "推奨を表示" + }, "showSeedPhrase": { "message": "シークレット リカバリー フレーズを表示する" }, + "showTestnetNetworks": { + "message": "テストネットワークを表示" + }, + "showTestnetNetworksDescription": { + "message": "ネットワークリストにテストネットワークを表示するには、こちらを選択してください" + }, "sigRequest": { "message": "署名の要求" }, @@ -1700,18 +2559,45 @@ "signed": { "message": "署名が完了しました" }, + "simulationErrorMessage": { + "message": "このトランザクションは失敗する見込みです。実行しようとすると多くのコストがかかるうえに失敗する可能性が高いため、お勧めしません。" + }, + "simulationErrorMessageV2": { + "message": "ガス代を見積もれませんでした。コントラクトにエラーがある可能性があり、このトランザクションは失敗するかもしれません。" + }, + "skip": { + "message": "スキップ" + }, + "skipAccountSecurity": { + "message": "アカウントのセキュリティをスキップしますか?" + }, + "skipAccountSecurityDetails": { + "message": "私は、シークレットリカバリーフレーズをバックアップするまで、アカウントとそのアセットのすべてを失う可能性があることを理解しています。" + }, "slow": { "message": "低速" }, "somethingWentWrong": { "message": "申し訳ありません。問題が発生しました。" }, + "source": { + "message": "ソース" + }, "speedUp": { "message": "高速化" }, "speedUpCancellation": { "message": "このキャンセルの高速化" }, + "speedUpExplanation": { + "message": "現在のネットワーク状況に基づきガス代を更新し、10%以上 (ネットワークによる要件) 増額させました。" + }, + "speedUpPopoverTitle": { + "message": "トランザクションをスピードアップ" + }, + "speedUpTooltipText": { + "message": "新しいガス代" + }, "speedUpTransaction": { "message": "このトランザクションの高速化" }, @@ -1734,6 +2620,12 @@ "spendLimitTooLarge": { "message": "使用限度額が大きすぎます" }, + "stable": { + "message": "安定" + }, + "stableLowercase": { + "message": "安定" + }, "stateLogError": { "message": "状態ログの検索時にエラーが発生しました。" }, @@ -1752,6 +2644,13 @@ "statusNotConnected": { "message": "接続されていません" }, + "step1LatticeWallet": { + "message": "Lattice1の接続準備ができていることを確認してください" + }, + "step1LatticeWalletMsg": { + "message": "セットアップが完了しオンラインになると、MetaMaskをLattice1デバイスに接続できます。デバイスのロックを解除し、デバイスIDを準備してください。ハードウェアウォレットの使用に関する詳細は、$1", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, "step1LedgerWallet": { "message": "レジャー ライブのアプリのダウンロード" }, @@ -1815,6 +2714,10 @@ "message": "このスワップを完了するには、さらに $1 個の $2 が必要です。", "description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol." }, + "swapBestOfNQuotes": { + "message": "最善の$1の見積もり。", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, "swapBuildQuotePlaceHolderText": { "message": "$1 と一致するトークンがありません", "description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text" @@ -1834,6 +2737,9 @@ "swapDecentralizedExchange": { "message": "分散型交換" }, + "swapDirectContract": { + "message": "ダイレクトコントラクト" + }, "swapEditLimit": { "message": "限度額の編集" }, @@ -1841,6 +2747,10 @@ "message": "これは必須であり、$1 をスワップするための MetaMask 許可を付与します。", "description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps." }, + "swapEnableTokenForSwapping": { + "message": "これはスワップ用に$1", + "description": "$1 is for the 'enableToken' key, e.g. 'enable ETH'" + }, "swapEstimatedNetworkFees": { "message": "推定のネットワーク手数料" }, @@ -1854,6 +2764,9 @@ "swapFailedErrorTitle": { "message": "スワップに失敗しました" }, + "swapFetchingQuotes": { + "message": "見積もりを取得中" + }, "swapFetchingQuotesErrorDescription": { "message": "問題が発生しました。もう一度実行してください。エラーが解消されない場合は、カスタマサポート担当者までお問い合わせください。" }, @@ -1867,12 +2780,26 @@ "message": "$1 から $2 のスワップ", "description": "Tells a user that they need to confirm on their hardware wallet a swap of 2 tokens. $1 is a source token and $2 is a destination token" }, + "swapGasFeesDetails": { + "message": "ガス代は、ネットワークトラフィックとトランザクションの複雑さに基づき推定され、変動します。" + }, + "swapGasFeesLearnMore": { + "message": "ガス代に関する詳細" + }, "swapGasFeesSplit": { "message": "前の画面のガス料金は、この 2 つのトランザクションに分けられています。" }, + "swapGasFeesSummary": { + "message": "ガス代は、$1ネットワークでトランザクションを処理するクリプトマイナーにに支払われます。MetaMaskはガス代から利益を得ません。", + "description": "$1 is the selected network, e.g. Ethereum or BSC" + }, "swapHighSlippageWarning": { "message": "スリッページ額が非常に大きいです。" }, + "swapIncludesMMFee": { + "message": "$1%のMetaMask手数料が含まれています。", + "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." + }, "swapLowSlippageError": { "message": "トランザクションが失敗する可能性があります。最大スリッページが低すぎます。" }, @@ -1886,6 +2813,10 @@ "message": "当社は毎回最上位の流動性のソースから最良の価格を見つけます。$1 の手数料が自動的にこの見積もりに含まれます。", "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." }, + "swapNQuotesWithDot": { + "message": "$1の見積もり.", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, "swapNewQuoteIn": { "message": "$1 での新規の見積もり", "description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00" @@ -1978,6 +2909,12 @@ "swapSourceInfo": { "message": "当社は、最良のレートと最小のネットワーク手数料を見つけるために、複数の流動性のソース (交換所、アグリゲーター、および専門のマーケットメーカー) を検索します。" }, + "swapSuggested": { + "message": "スワップが提案されました" + }, + "swapSuggestedGasSettingToolTipMessage": { + "message": "スワップは複雑で急を要するトランザクションです。コストとスワップの確実な成功のバランスが取れたこのガス代をお勧めします。" + }, "swapSwapFrom": { "message": "スワップ元" }, @@ -2016,6 +2953,10 @@ "message": "$1 のソースで検証済です。", "description": "Indicates the number of token information sources that recognize the symbol + address. $1 is a decimal number." }, + "swapTooManyDecimalsError": { + "message": "$1は小数点以下$2桁まで使用できます", + "description": "$1 is a token symbol and $2 is the max. number of decimals allowed for the token" + }, "swapTransactionComplete": { "message": "トランザクションが完了しました" }, @@ -2076,6 +3017,12 @@ "symbolBetweenZeroTwelve": { "message": "シンボルは 11 文字以下にする必要があります。" }, + "syncFailed": { + "message": "同期に失敗しました" + }, + "syncInProgress": { + "message": "同期中" + }, "syncWithMobile": { "message": "モバイルとの同期" }, @@ -2118,6 +3065,9 @@ "thisWillCreate": { "message": "これにより、新しいウォレットとシークレット リカバリー フレーズが作成されます" }, + "time": { + "message": "時間" + }, "tips": { "message": "ヒント" }, @@ -2128,6 +3078,10 @@ "message": "移動先:$1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, + "toggleTestNetworks": { + "message": "$1テストネットワーク", + "description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open to the advanced settings where users can enable the display of test networks in the network dropdown." + }, "token": { "message": "トークン" }, @@ -2140,6 +3094,9 @@ "tokenDecimalFetchFailed": { "message": "トークンの 10 進数が必要です。" }, + "tokenDetectionAnnouncement": { + "message": "新機能!実験的な機能として、Ethereum Mainnetでのトークン検出が改善されました。$1" + }, "tokenSymbol": { "message": "トークン シンボル" }, @@ -2164,6 +3121,48 @@ "transactionCreated": { "message": "トランザクションは $1の値が $2 で作成されました。" }, + "transactionData": { + "message": "トランザクションデータ" + }, + "transactionDecodingAccreditationDecoded": { + "message": "Truffleによるデコード" + }, + "transactionDecodingAccreditationVerified": { + "message": "$1でコントラクトを確認しました" + }, + "transactionDecodingUnsupportedNetworkError": { + "message": "トランザクションのデコードは、chainId $1で使用できません" + }, + "transactionDetailDappGasMoreInfo": { + "message": "サイトが提案されました" + }, + "transactionDetailDappGasTooltip": { + "message": "最新のブロックに基づくMetaMaskの推奨ガス代を使用するように編集します。" + }, + "transactionDetailGasHeading": { + "message": "ガス代見積もり" + }, + "transactionDetailGasInfoV2": { + "message": "見積もり" + }, + "transactionDetailGasTooltipConversion": { + "message": "ガス代に関する詳細" + }, + "transactionDetailGasTooltipExplanation": { + "message": "ガス代はネットワークにより設定され、ネットワークトラフィックとトランザクションの複雑さに基づき変動します。" + }, + "transactionDetailGasTooltipIntro": { + "message": "ガス代は、$1ネットワークでトランザクションを処理するクリプトマイナーにに支払われます。MetaMaskはガス代から利益を得ません。" + }, + "transactionDetailGasTotalSubtitle": { + "message": "金額 + ガス代" + }, + "transactionDetailLayer2GasHeading": { + "message": "レイヤー2のガス代" + }, + "transactionDetailMultiLayerTotalSubtitle": { + "message": "金額 + 手数料" + }, "transactionDropped": { "message": "トランザクションは $2 で削除されました。" }, @@ -2179,6 +3178,27 @@ "transactionFee": { "message": "トランザクション手数料" }, + "transactionHistoryBaseFee": { + "message": "基本手数料 (GWEI)" + }, + "transactionHistoryL1GasLabel": { + "message": "L1ガス代合計" + }, + "transactionHistoryL2GasLimitLabel": { + "message": "L2ガス代限度額" + }, + "transactionHistoryL2GasPriceLabel": { + "message": "L2ガス代" + }, + "transactionHistoryMaxFeePerGas": { + "message": "ガスあたりの最大手数料" + }, + "transactionHistoryPriorityFee": { + "message": "優先手数料 (GWEI)" + }, + "transactionHistoryTotalGasFee": { + "message": "ガス代合計" + }, "transactionResubmitted": { "message": "ガス手数料を $2 で $1 に増加して、トランザクションを再送信しました。" }, @@ -2205,12 +3225,31 @@ "message": "トークン バランスのロードに問題があります。トークン バランスを表示できます", "description": "Followed by a link (here) to view token balances" }, + "trustSiteApprovePermission": { + "message": "パーミッションを付与することで、次の$1による資金へのアクセスが許可されます" + }, "tryAgain": { "message": "再試行" }, + "tryAnywayOption": { + "message": "とにかく試してみる" + }, + "turnOnTokenDetection": { + "message": "強化されたトークン検出をオンにする" + }, + "twelveHrTitle": { + "message": "12時間:" + }, + "txInsightsNotSupported": { + "message": "現時点ではこのコントラクトでトランザクションインサイトはサポートされていません。" + }, "typePassword": { "message": "MetaMask パスワードを入力" }, + "u2f": { + "message": "U2F", + "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." + }, "unapproved": { "message": "未承認" }, @@ -2249,6 +3288,10 @@ "message": "ネットワークの詳細を確認します", "description": "Serves as link text for the 'unrecognizedChain' key. This text will be embedded inside the translation for that key." }, + "unsendableAsset": { + "message": "コレクティブル (ERC-721) トークンの送信は現在サポートされていません", + "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" + }, "updatedWithDate": { "message": "$1 に更新されました" }, @@ -2258,12 +3301,24 @@ "urlExistsErrorMsg": { "message": "この URL は現在 $1 ネットワークで使用しています。" }, + "useCollectibleDetection": { + "message": "NFTを自動検出" + }, + "useCollectibleDetectionDescription": { + "message": "NFTメディアとデータを表示すると、IPアドレスが一元化されたサーバーに開示される可能性があります。ウォレット内のNFTの検出には、サードパーティーAPI (OpenSeaなど) が使用されます。これにより、これらのサービスにアカウントのアドレスが公開されます。これらのサービスからデータを取得しない場合は、この機能を無効にしてください。" + }, "usePhishingDetection": { "message": "フィッシング検出を使用" }, "usePhishingDetectionDescription": { "message": "イーサリアムユーザーを対象としたドメインのフィッシングに対して警告を表示します" }, + "useTokenDetection": { + "message": "トークン検出を使用" + }, + "useTokenDetectionDescription": { + "message": "弊社はユーザーのウォレットに送信された新しいトークンを検出して表示するために、サードパーティーAPIを使用します。MetaMaskにこれらのサービスからデータを取得させたくない場合は、この機能をオフにしてください。" + }, "usedByClients": { "message": "さまざまな異なるクライアントによって使用されています" }, @@ -2291,15 +3346,56 @@ "viewContact": { "message": "連絡先を表示" }, + "viewFullTransactionDetails": { + "message": "トランザクションの完全な詳細を表示" + }, "viewMore": { "message": "詳細を表示" }, + "viewOnBlockExplorer": { + "message": "ブロックエクスプローラーで表示" + }, + "viewOnCustomBlockExplorer": { + "message": "$1を$2で表示", + "description": "$1 is the action type. e.g (Account, Transaction, Swap) and $2 is the Custom Block Exporer URL" + }, + "viewOnEtherscan": { + "message": "$1をEtherscanで表示", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, + "viewOnOpensea": { + "message": "Openseaで表示" + }, + "viewinExplorer": { + "message": "$1をエクスプローラーで表示", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, "visitWebSite": { "message": "当社の Web サイトにアクセス" }, "walletConnectionGuide": { "message": "当社のハードウェア ウォレット接続ガイド" }, + "walletCreationSuccessDetail": { + "message": "ウォレットが正常に保護されました。シークレットリカバリーフレーズを安全かつ機密に保管してください。これはユーザーの責任です!" + }, + "walletCreationSuccessReminder1": { + "message": "MetaMaskはシークレットリカバリーフレーズを復元できません。" + }, + "walletCreationSuccessReminder2": { + "message": "MetaMaskがユーザーのシークレットリカバリーフレーズを確認することは絶対にありません。" + }, + "walletCreationSuccessReminder3": { + "message": "誰に対しても$1しないと、資金が盗まれる恐れがあります", + "description": "$1 is separated as walletCreationSuccessReminder3BoldSection so that we can bold it" + }, + "walletCreationSuccessReminder3BoldSection": { + "message": "シークレットリカバリーフレーズは決して誰にも教えないでください", + "description": "This string is localized separately from walletCreationSuccessReminder3 so that we can bold it" + }, + "walletCreationSuccessTitle": { + "message": "ウォレットが作成されました" + }, "walletSeedRestore": { "message": "ウォレット シークレット リカバリー フレーズ" }, @@ -2307,12 +3403,34 @@ "message": "現在のウェブサイトが、削除済の window.web3 API の使用を検知しました。サイトが壊れているようであれば、$1 をクリックして詳細を確認してください。", "description": "$1 is a clickable link." }, + "webhid": { + "message": "WebHID", + "description": "Refers to a interface for connecting external devices to the browser. Used for connecting ledger to the browser. Read more here https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API" + }, "welcome": { "message": "MetaMask にようこそ" }, "welcomeBack": { "message": "ようこそ!" }, + "welcomeExploreDescription": { + "message": "暗号通貨やアセットを保管、送金、使用。" + }, + "welcomeExploreTitle": { + "message": "分散型アプリを閲覧" + }, + "welcomeLoginDescription": { + "message": "MetaMaskを使用して分散型アプリにログイン。サインアップは不要です。" + }, + "welcomeLoginTitle": { + "message": "ウォレットにようこそ" + }, + "welcomeToMetaMask": { + "message": "始めましょう" + }, + "welcomeToMetaMaskIntro": { + "message": "MetaMaskは何百万人もに信頼されている安全なウォレットで、すべての人々によるWeb3の世界へのアクセスを可能にしています。" + }, "whatsNew": { "message": "新機能", "description": "This is the title of a popup that gives users notifications about new features and updates to MetaMask." diff --git a/app/_locales/kn/messages.json b/app/_locales/kn/messages.json index eea50dfa4..7d0deac75 100644 --- a/app/_locales/kn/messages.json +++ b/app/_locales/kn/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "ತಿರಸ್ಕರಿಸಿ" + }, + "QRHardwareWalletImporterTitle": { + "message": "QR ಕೋಡ್ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ" + }, "about": { "message": "ಕುರಿತು" }, @@ -256,6 +262,9 @@ "currentLanguage": { "message": "ಪ್ರಸ್ತುತ ಭಾಷೆ" }, + "custom": { + "message": "ಸುಧಾರಿತ" + }, "customGas": { "message": "ಗ್ಯಾಸ್ ಕಸ್ಟಮೈಸ್ ಮಾಡಿ" }, @@ -530,6 +539,9 @@ "learnMore": { "message": "ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ" }, + "learnMoreUpperCase": { + "message": "ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ" + }, "ledgerAccountRestriction": { "message": "ನೀವು ಹೊಸದನ್ನು ಸೇರಿಸುವುದರ ಮೊದಲು ನಿಮ್ಮ ಹಿಂದಿನ ಖಾತೆಯನ್ನು ನೀವು ಬಳಸಬೇಕು." }, diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index 415a1adce..d2ab73621 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -1,4 +1,49 @@ { + "QRHardwareInvalidTransactionTitle": { + "message": "오류" + }, + "QRHardwareMismatchedSignId": { + "message": "일치하지 않는 거래 데이터. 거래내역을 확인해주세요." + }, + "QRHardwarePubkeyAccountOutOfRange": { + "message": "더 이상 계정이 없습니다. 아래 목록에 없는 다른 계정에 액세스하려면 하드웨어 지갑을 다시 연결하고 선택하세요." + }, + "QRHardwareScanInstructions": { + "message": "QR 코드를 카메라 앞에 놓습니다. 화면이 흐릿하지만 판독에 영향을 미치지 않습니다." + }, + "QRHardwareSignRequestCancel": { + "message": "거부" + }, + "QRHardwareSignRequestDescription": { + "message": "지갑으로 가입한 후 '서명 받기'를 클릭하여 서명을 받으세요." + }, + "QRHardwareSignRequestGetSignature": { + "message": "서명 받기" + }, + "QRHardwareSignRequestSubtitle": { + "message": "지갑으로 QR 코드 스캔" + }, + "QRHardwareSignRequestTitle": { + "message": "서명 요청" + }, + "QRHardwareUnknownQRCodeTitle": { + "message": "오류" + }, + "QRHardwareUnknownWalletQRCode": { + "message": "잘못된 QR 코드입니다. 하드웨어 지갑의 동기화 QR 코드를 스캔하세요." + }, + "QRHardwareWalletImporterTitle": { + "message": "QR 코드 스캔" + }, + "QRHardwareWalletSteps1Description": { + "message": "QR 코드를 통해 통신하는 에어갭 하드웨어 지갑을 연결합니다. 공식적으로 지원되는 에어갭 하드웨어 지갑은 다음과 같습니다." + }, + "QRHardwareWalletSteps1Title": { + "message": "QR 기반 HW 지갑" + }, + "QRHardwareWalletSteps2Description": { + "message": "AirGap Vault 및 Ngrave(출시 예정)" + }, "about": { "message": "정보" }, @@ -28,6 +73,10 @@ "accountName": { "message": "계정 이름" }, + "accountNameDuplicate": { + "message": "이 계정 이름은 이미 존재합니다.", + "description": "This is an error message shown when the user enters a new account name that matches an existing account name" + }, "accountOptions": { "message": "계정 옵션" }, @@ -43,6 +92,15 @@ "activityLog": { "message": "활동 로그" }, + "add": { + "message": "추가" + }, + "addANetwork": { + "message": "네트워크 추가" + }, + "addANickname": { + "message": "별명 추가" + }, "addAcquiredTokens": { "message": "MetaMask를 이용해 얻은 토큰 추가" }, @@ -52,6 +110,9 @@ "addContact": { "message": "연락처 추가" }, + "addCustomToken": { + "message": "맞춤형 토큰 추가" + }, "addCustomTokenByContractAddress": { "message": "이 토큰을 찾을 수 없으신가요? 토큰 주소를 붙여넣으면 토큰을 직접 추가할 수 있습니다. 토큰의 계약 주소는 $1에서 찾을 수 있습니다.", "description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum" @@ -76,6 +137,12 @@ "addFriendsAndAddresses": { "message": "신뢰하는 친구와 주소 추가하기" }, + "addMemo": { + "message": "메모 추가" + }, + "addNFT": { + "message": "NFT 추가" + }, "addNetwork": { "message": "네트워크 추가" }, @@ -91,12 +158,36 @@ "addToken": { "message": "토큰 추가" }, + "address": { + "message": "주소" + }, + "addressBookIcon": { + "message": "주소록 아이콘" + }, "advanced": { "message": "고급" }, + "advancedBaseGasFeeToolTip": { + "message": "거래가 블록에 포함되면 최대 기본 요금과 실제 기본 요금 간의 차액이 환불됩니다. 총 금액은 최대 기본 요금(GWEI) * 가스 한도로 계산됩니다." + }, + "advancedGasFeeDefaultOptIn": { + "message": "이 $1를 \"고급\"에 대한 기본값으로 저장합니다." + }, + "advancedGasFeeDefaultOptOut": { + "message": "항상 이 값과 고급 설정을 기본값으로 사용합니다." + }, + "advancedGasFeeModalTitle": { + "message": "고급 가스 요금" + }, + "advancedGasPriceTitle": { + "message": "가스 가격" + }, "advancedOptions": { "message": "고급 옵션" }, + "advancedPriorityFeeToolTip": { + "message": "우선 요금(일명 \"채굴자 팁\")은 채굴자에게 직접 전달되어 거래의 우선 순위를 정하도록 장려합니다." + }, "advancedSettingsDescription": { "message": "개발자 기능 액세스, 상태 로그 다운로드, 계정 재설정, 테스트넷 및 맞춤형 RPC 설정" }, @@ -130,6 +221,10 @@ "allowExternalExtensionTo": { "message": "이 외부 확장을 통해 다음을 하도록 허용:" }, + "allowSpendToken": { + "message": "$1에 액세스할 수 있는 권한을 부여하시겠습니까?", + "description": "$1 is the symbol of the token that are requesting to spend" + }, "allowThisSiteTo": { "message": "이 사이트에서 다음을 하도록 허용:" }, @@ -175,6 +270,9 @@ "approved": { "message": "승인됨" }, + "approvedAmountWithColon": { + "message": "승인 금액:" + }, "asset": { "message": "자산" }, @@ -229,9 +327,43 @@ "balanceOutdated": { "message": "최신 잔액이 아닐 수도 있습니다." }, + "baseFee": { + "message": "기본 요금" + }, "basic": { "message": "기본" }, + "betaMetamaskDescription": { + "message": "수백만 명이 신뢰하는 메타마스크(MetaMask)는 모든 사람이 web3의 세계에 접근할 수 있도록 하는 안전한 지갑입니다." + }, + "betaMetamaskDescriptionExplanation": { + "message": "이 버전을 사용하여 출시되기 전에 예정된 기능을 테스트해보세요. 귀하의 사용 및 피드백은 가능한 최고의 메타마스크 버전을 구축하는 데 도움이 됩니다. 메타마스크 베타 사용에는 표준 $1 및 $2가 적용됩니다. 베타는 버그의 위험이 증가할 수 있습니다. 계속하면 이러한 위험과 당사 약관 및 베타 약관에 있는 위험을 수락하고 인정하는 것입니다.", + "description": "$1 represents localization item betaMetamaskDescriptionExplanationTermsLinkText. $2 represents localization item betaMetamaskDescriptionExplanationBetaTermsLinkText" + }, + "betaMetamaskDescriptionExplanationBetaTermsLinkText": { + "message": "추가 베타 약관" + }, + "betaMetamaskDescriptionExplanationTermsLinkText": { + "message": "약관" + }, + "betaMetamaskVersion": { + "message": "메타마스크 베타 버전" + }, + "betaWelcome": { + "message": "메타마스크 베타 방문을 환영합니다" + }, + "blockExplorerAccountAction": { + "message": "계정", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Account in Explorer" + }, + "blockExplorerAssetAction": { + "message": "자산", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Asset in Explorer" + }, + "blockExplorerSwapAction": { + "message": "스왑", + "description": "This is used with viewOnEtherscan e.g View Swap on Etherscan" + }, "blockExplorerUrl": { "message": "블록 탐색기 URL" }, @@ -251,9 +383,21 @@ "buildContactList": { "message": "연락처 목록 작성하기" }, + "builtAroundTheWorld": { + "message": "메타마스크는 전 세계적으로 설계 및 구축되었습니다." + }, + "busy": { + "message": "바쁨" + }, "buy": { "message": "구매" }, + "buyWithTransak": { + "message": "Transak으로 ETH 구매" + }, + "buyWithTransakDescription": { + "message": "Transak은 59개 이상의 국가에서 직불 카드 및 은행 송금(지역에 따라 다름)을 지원합니다. ETH는 메타마스크 계정에 예치됩니다." + }, "buyWithWyre": { "message": "Wyre로 ETH 구매" }, @@ -269,6 +413,15 @@ "cancel": { "message": "취소" }, + "cancelEdit": { + "message": "편집 취소" + }, + "cancelPopoverTitle": { + "message": "거래 취소" + }, + "cancelSpeedUp": { + "message": "거래 취소 또는 속도 향상" + }, "cancellationGasFee": { "message": "취소 Gas 수수료" }, @@ -287,6 +440,10 @@ "chromeRequiredForHardwareWallets": { "message": "하드웨어 지갑에 연결하려면 Google Chrome에서 MetaMask를 사용해야 합니다." }, + "clickToConnectLedgerViaWebHID": { + "message": "WebHID를 통해 원장을 연결하려면 여기를 클릭하세요.", + "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" + }, "clickToRevealSeed": { "message": "비밀 단어를 표시하려면 여기를 클릭하세요." }, @@ -299,6 +456,9 @@ "confirmPassword": { "message": "암호 확인" }, + "confirmRecoveryPhrase": { + "message": "비밀 복구 문구 확인" + }, "confirmSecretBackupPhrase": { "message": "비밀 백업 구문 확인" }, @@ -406,12 +566,18 @@ "continue": { "message": "계속" }, + "continueToTransak": { + "message": "Transak으로 계속" + }, "continueToWyre": { "message": "Wyre로 넘어가기" }, "contract": { "message": "계약" }, + "contractAddress": { + "message": "계약 주소" + }, "contractAddressError": { "message": "토큰의 계약 주소로 토큰을 보냅니다. 이로 인해 토큰이 손실될 수 있습니다." }, @@ -430,6 +596,9 @@ "copyPrivateKey": { "message": "귀하의 비공개 키입니다(클릭하여 복사)" }, + "copyRawTransactionData": { + "message": "RawTransaction 데이터 복사" + }, "copyToClipboard": { "message": "클립보드에 복사" }, @@ -445,6 +614,9 @@ "createAccount": { "message": "계정 생성" }, + "createNewWallet": { + "message": "새 지갑 생성" + }, "createPassword": { "message": "암호 생성" }, @@ -466,9 +638,22 @@ "currentLanguage": { "message": "현재 언어" }, + "currentTitle": { + "message": "현재:" + }, + "currentlyUnavailable": { + "message": "이 네트워크에서 사용할 수 없음" + }, + "custom": { + "message": "고급" + }, "customGas": { "message": "Gas 맞춤화" }, + "customGasSettingToolTipMessage": { + "message": "$1을(를) 사용하여 가스 가격을 맞춤설정하세요. 익숙하지 않은 경우 혼동될 수 있습니다. 자신의 책임하에 상호 작용하세요.", + "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold fontweight" + }, "customGasSubTitle": { "message": "수수료를 올리면 처리 시간이 단축되기도 하지만 항상 그렇지는 않습니다." }, @@ -478,9 +663,29 @@ "customToken": { "message": "맞춤형 토큰" }, + "dappSuggested": { + "message": "제안 사이트" + }, + "dappSuggestedGasSettingToolTipMessage": { + "message": "$1에서 이 가격을 제안했습니다.", + "description": "$1 is url for the dapp that has suggested gas settings" + }, + "dappSuggestedShortLabel": { + "message": "사이트" + }, + "dappSuggestedTooltip": { + "message": "$1에서 이 가격을 추천했습니다.", + "description": "$1 represents the Dapp's origin" + }, + "data": { + "message": "데이터" + }, "dataBackupFoundInfo": { "message": "일부 계정 데이터가 이전의 MetaMask 설치 도중에 백업되었습니다. 여기에는 설정, 연락처, 토큰이 포함될 수 있습니다. 지금 이 데이터를 복구하시겠어요?" }, + "dataHex": { + "message": "Hex" + }, "decimal": { "message": "토큰 십진수" }, @@ -522,6 +727,9 @@ "depositEther": { "message": "Ether 예치" }, + "description": { + "message": "설명" + }, "details": { "message": "세부 정보" }, @@ -579,9 +787,122 @@ "edit": { "message": "편집" }, + "editANickname": { + "message": "별명 편집" + }, + "editAddressNickname": { + "message": "주소 별명 편집" + }, "editContact": { "message": "연락처 편집" }, + "editGasEducationButtonText": { + "message": "어떻게 선택해야 하나요?" + }, + "editGasEducationHighExplanation": { + "message": "이것은 성공적인 거래의 가능성을 증가시키기 때문에 시간에 민감한 거래(스왑과 같은)에 가장 적합합니다. 스왑을 처리하는 데 시간이 너무 오래 걸리면 실패하고 가스 요금의 일부를 잃을 수 있습니다." + }, + "editGasEducationLowExplanation": { + "message": "처리 시간이 덜 중요할 때만 더 낮은 가스 요금을 사용해야 합니다. 요금이 낮으면 거래가 성공할 때(또는 성공할 경우)를 예측하기 어렵습니다." + }, + "editGasEducationMediumExplanation": { + "message": "중간 가스 요금은 송금, 인출 또는 기타 시간에 민감한 거래에 적합합니다. 이 설정은 대부분 성공적인 거래로 이어집니다." + }, + "editGasEducationModalIntro": { + "message": "적절한 가스 요금을 선택하는 것은 거래 유형과 이것이 귀하에게 얼마나 중요한지에 따라 다릅니다." + }, + "editGasEducationModalTitle": { + "message": "어떻게 선택하나요?" + }, + "editGasFeeModalTitle": { + "message": "가스 요금 편집" + }, + "editGasHigh": { + "message": "높음" + }, + "editGasLimitOutOfBounds": { + "message": "가스 최소 한도는 $1입니다." + }, + "editGasLimitOutOfBoundsV2": { + "message": "가스 한도는 $1보다 크고 $2 미만이어야 합니다.", + "description": "$1 is the minimum limit for gas and $2 is the maximum limit" + }, + "editGasLimitTooltip": { + "message": "가스 한도는 사용하려는 가스의 최대 단위입니다. 가스 단위는 \"최대 우선 요금\" 및 \"최대 요금\"의 승수입니다." + }, + "editGasLow": { + "message": "낮음" + }, + "editGasMaxBaseFeeGWEIImbalance": { + "message": "최대 기본 요금은 우선 요금보다 낮을 수 없습니다." + }, + "editGasMaxBaseFeeHigh": { + "message": "최대 기본 요금이 필요 이상으로 높습니다." + }, + "editGasMaxBaseFeeLow": { + "message": "최대 기본 요금이 현재 네트워크 조건에 비해 낮습니다." + }, + "editGasMaxFeeHigh": { + "message": "최대 요금이 필요 이상으로 높습니다." + }, + "editGasMaxFeeLow": { + "message": "최대 요금이 네트워크 조건에 비해 너무 낮습니다." + }, + "editGasMaxFeePriorityImbalance": { + "message": "최대 요금은 최대 우선 요금보다 낮을 수 없습니다." + }, + "editGasMaxFeeTooltip": { + "message": "최대 요금은 지급할 최대 금액입니다(기본 요금 + 우선 요금)." + }, + "editGasMaxPriorityFeeBelowMinimum": { + "message": "최대 우선 요금은 0GWEI보다 커야 합니다." + }, + "editGasMaxPriorityFeeBelowMinimumV2": { + "message": "우선 요금은 0보다 커야 합니다." + }, + "editGasMaxPriorityFeeHigh": { + "message": "최대 우선 요금이 필요 이상으로 높습니다. 필요 이상으로 지급될 수 있습니다." + }, + "editGasMaxPriorityFeeHighV2": { + "message": "우선 요금이 필요 이상으로 높습니다. 필요 이상으로 지급될 수 있습니다" + }, + "editGasMaxPriorityFeeLow": { + "message": "최대 우선 요금이 현재 네트워크 조건에 비해 낮습니다." + }, + "editGasMaxPriorityFeeLowV2": { + "message": "우선 요금이 현재 네트워크 조건에 비해 낮습니다." + }, + "editGasMaxPriorityFeeTooltip": { + "message": "최대 우선 요금(일명 \"채굴자 팁\")은 채굴자에게 직접 전달되며 거래의 우선 순위를 정하도록 장려합니다. 대부분의 경우 최대 설정값을 지급합니다." + }, + "editGasMedium": { + "message": "중간" + }, + "editGasPriceTooLow": { + "message": "가스 가격은 0보다 커야 합니다." + }, + "editGasPriceTooltip": { + "message": "이 네트워크는 거래를 제출할 때 \"가스 가격\" 필드가 필요합니다. 가스 가격은 가스 단위당 지급할 금액입니다." + }, + "editGasSubTextAmountLabel": { + "message": "최대 금액:", + "description": "This is meant to be used as the $1 substitution editGasSubTextAmount" + }, + "editGasSubTextFeeLabel": { + "message": "최대 요금" + }, + "editGasTitle": { + "message": "우선 순위 편집" + }, + "editGasTooLow": { + "message": "알 수 없는 처리 시간" + }, + "editGasTooLowTooltip": { + "message": "귀하의 최대 요금 또는 최대 우선 요금은 현재 시장 상황에 비해 낮은 것 같습니다. 귀하의 거래가 언제 진행(또는 처리)되는지 알 수 없습니다." + }, + "editGasTooLowWarningTooltip": { + "message": "이렇게 하면 최대 요금이 낮아지지만 네트워크 트래픽이 증가하여 거래가 지연되거나 실패할 수 있습니다." + }, "editNonceField": { "message": "임시값 편집" }, @@ -591,6 +912,22 @@ "editPermission": { "message": "권한 편집" }, + "enableAutoDetect": { + "message": " 자동 감지 활성화" + }, + "enableFromSettings": { + "message": " 설정에서 이 기능을 활성화합니다." + }, + "enableOpenSeaAPI": { + "message": "OpenSea API 활성화" + }, + "enableOpenSeaAPIDescription": { + "message": "OpenSea의 API를 사용하여 NFT 데이터를 가져옵니다. NFT 자동 감지는 OpenSea의 API에 의존하며 이 API가 꺼져 있으면 사용할 수 없습니다." + }, + "enableToken": { + "message": "$1 활성화", + "description": "$1 is a token symbol, e.g. ETH" + }, "encryptionPublicKeyNotice": { "message": "$1에서 귀하의 공개 암호화 키를 요구합니다. 동의를 받으면 이 사이트에서 암호화된 메시지를 작성하여 귀하에게 전송할 수 있습니다.", "description": "$1 is the web3 site name" @@ -633,12 +970,21 @@ "message": "엔드포인트에서 다른 체인 ID를 반환했습니다. $1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "ensIllegalCharacter": { + "message": "ENS에 맞지 않는 문자입니다." + }, "ensNotFoundOnCurrentNetwork": { "message": "현재 네트워크에서 ENS 이름을 찾을 수 없습니다. 이더리움 메인넷으로 전환해 보세요." }, + "ensNotSupportedOnNetwork": { + "message": "네트워크가 ENS를 지원하지 않습니다." + }, "ensRegistrationError": { "message": "ENS 이름 등록 중 오류 발생" }, + "ensUnknownError": { + "message": "ENS를 조회하지 못했습니다." + }, "enterAnAlias": { "message": "별칭 입력" }, @@ -702,9 +1048,18 @@ "etherscanView": { "message": "Etherscan에서 계정 보기" }, + "etherscanViewOn": { + "message": "Etherscan에서 보기" + }, "expandView": { "message": "보기 확장" }, + "experimental": { + "message": "실험적" + }, + "experimentalSettingsDescription": { + "message": "토큰 감지 및 기타" + }, "exportPrivateKey": { "message": "비공개 키 내보내기" }, @@ -724,6 +1079,9 @@ "failureMessage": { "message": "문제가 발생했습니다. 작업을 완료할 수 없습니다." }, + "fakeTokenWarning": { + "message": "기존 토큰의 가짜 버전 생성을 포함하여 누구나 토큰을 생성할 수 있습니다. $1에 대해 자세히 알아보기" + }, "fast": { "message": "빠름" }, @@ -741,6 +1099,21 @@ "message": "파일 가져오기가 작동하지 않나요? 여기를 클릭하세요.", "description": "Helps user import their account from a JSON file" }, + "flaskSnapSettingsCardButtonCta": { + "message": "세부 정보 보기", + "description": "Call to action a user can take to see more information about the Snap that is installed" + }, + "flaskSnapSettingsCardDateAddedOn": { + "message": "추가하기", + "description": "Start of the sentence describing when and where snap was added" + }, + "flaskSnapSettingsCardFrom": { + "message": "발신", + "description": "Part of the sentence describing when and where snap was added" + }, + "followUsOnTwitter": { + "message": "트위터에서 저희를 팔로우하세요." + }, "forbiddenIpfsGateway": { "message": "금지된 IPFS 게이트웨이: CID 게이트웨이를 지정하세요." }, @@ -760,6 +1133,19 @@ "functionType": { "message": "기능 유형" }, + "gas": { + "message": "가스" + }, + "gasDisplayAcknowledgeDappButtonText": { + "message": "제안된 가스 요금 편집" + }, + "gasDisplayDappWarning": { + "message": "이 가스 요금은 $1에서 제안했습니다. 이를 무시하면 거래에 문제가 발생할 수 있습니다. 질문이 있는 경우 $1에 문의하세요.", + "description": "$1 represents the Dapp's origin" + }, + "gasEstimatesUnavailableWarning": { + "message": "당사의 낮은, 중간 및 높은 견적을 사용할 수 없습니다." + }, "gasLimit": { "message": "Gas 한도" }, @@ -773,6 +1159,12 @@ "message": "Gas 한도는 $1 이상이어야 합니다.", "description": "$1 is the custom gas limit, in decimal." }, + "gasLimitV2": { + "message": "가스 한도" + }, + "gasOption": { + "message": "가스 옵션" + }, "gasPrice": { "message": "Gas 가격(GWEI)" }, @@ -791,6 +1183,38 @@ "gasPriceInfoTooltipContent": { "message": "Gas 가격은 각 Gas 단위에 대해 지불할 Ether 금액을 지정합니다." }, + "gasTimingHoursShort": { + "message": "$1 시간", + "description": "$1 represents a number of hours" + }, + "gasTimingMinutes": { + "message": "$1 분", + "description": "$1 represents a number of minutes" + }, + "gasTimingMinutesShort": { + "message": "$1 분", + "description": "$1 represents a number of minutes" + }, + "gasTimingNegative": { + "message": "약 $1 후", + "description": "$1 represents an amount of time" + }, + "gasTimingPositive": { + "message": "아마도 < $1 후", + "description": "$1 represents an amount of time" + }, + "gasTimingSeconds": { + "message": "$1 초", + "description": "$1 represents a number of seconds" + }, + "gasTimingSecondsShort": { + "message": "$1 초", + "description": "$1 represents a number of seconds" + }, + "gasTimingVeryPositive": { + "message": "거의 < $1 후", + "description": "$1 represents an amount of time" + }, "gasUsed": { "message": "사용한 Gas" }, @@ -818,9 +1242,15 @@ "getStarted": { "message": "시작하기" }, + "goBack": { + "message": "되돌아가기" + }, "goerli": { "message": "Goerli 테스트 네트워크" }, + "grantedToWithColon": { + "message": "부여 대상:" + }, "happyToSeeYou": { "message": "반갑습니다." }, @@ -863,9 +1293,25 @@ "hideZeroBalanceTokens": { "message": "잔액이 없는 토큰 숨기기" }, + "high": { + "message": "공격적" + }, + "highGasSettingToolTipDialog": { + "message": "변동성이 큰 시장에서도 높은 확률" + }, + "highGasSettingToolTipMessage": { + "message": "인기 있는 NFT의 하락 등으로 인한 네트워크 트래픽 급증을 커버하려면 $1을 사용하세요.", + "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" + }, + "highLowercase": { + "message": "높음" + }, "history": { "message": "기록" }, + "id": { + "message": "ID" + }, "import": { "message": "가져오기", "description": "Button to import an account from a selected file" @@ -873,6 +1319,9 @@ "importAccount": { "message": "계정 가져오기" }, + "importAccountError": { + "message": "계정 가져오기 오류" + }, "importAccountLinkText": { "message": "비밀 복구 구문을 사용해 가져오기" }, @@ -886,12 +1335,31 @@ "message": "또는 $1", "description": "$1 represents the text from `importAccountLinkText` as a link" }, + "importExistingWalletDescription": { + "message": "지갑을 만들 때 받은 비밀 복구 문구(시드 문구)를 입력하세요. $1", + "description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link" + }, + "importExistingWalletTitle": { + "message": "비밀 복구 문구를 사용하여 기존 지갑 가져오기" + }, + "importMyWallet": { + "message": "내 지갑 가져오기" + }, + "importNFTs": { + "message": "NFT 가져오기" + }, "importTokenQuestion": { "message": "토큰을 가져오시겠어요?" }, "importTokenWarning": { "message": "기존 토큰의 가짜 버전을 포함하여 누구나 어떤 이름으로든 토큰을 만들 수 있습니다. 추가 및 거래는 사용자의 책임입니다." }, + "importTokens": { + "message": "토큰 가져오기" + }, + "importTokensCamelCase": { + "message": "토큰 가져오기" + }, "importWallet": { "message": "지갑 가져오기" }, @@ -915,6 +1383,9 @@ "insufficientFunds": { "message": "자금이 부족합니다." }, + "insufficientFundsForGas": { + "message": "가스에 대한 자금 부족" + }, "insufficientTokens": { "message": "토큰이 부족합니다." }, @@ -974,10 +1445,19 @@ "ipfsGatewayDescription": { "message": "ENS 콘텐츠 해결에 사용할 IPFS CID 게이트웨이의 URL을 입력하세요." }, + "jsDeliver": { + "message": "jsDeliver" + }, "jsonFile": { "message": "JSON 파일", "description": "format for importing an account" }, + "keystone": { + "message": "Keystone" + }, + "keystoneTutorial": { + "message": " (튜토리얼)" + }, "knownAddressRecipient": { "message": "알려진 계약 주소입니다." }, @@ -990,12 +1470,57 @@ "lastConnected": { "message": "마지막 연결" }, + "layer1Fees": { + "message": "레이어 1 요금" + }, + "learmMoreAboutGas": { + "message": "가스에 대해 $1하시겠습니까?" + }, + "learnCancelSpeeedup": { + "message": "$1하는 방법 알아보기", + "description": "$1 is link to cancel or speed up transactions" + }, "learnMore": { "message": "자세히 알아보기" }, + "learnMoreUpperCase": { + "message": "자세히 알아보기" + }, + "learnScamRisk": { + "message": "사기 및 보안 위험" + }, "ledgerAccountRestriction": { "message": "새 계정을 추가하려면 먼저 마지막 계정을 사용해야 합니다." }, + "ledgerConnectionInstructionCloseOtherApps": { + "message": "장치에 연결된 다른 소프트웨어를 닫은 다음 여기를 클릭하여 새로 고침하세요." + }, + "ledgerConnectionInstructionHeader": { + "message": "확인을 클릭하기 전:" + }, + "ledgerConnectionInstructionStepFour": { + "message": "원장 장치에서 \"스마트 계약 데이터\" 또는 \"블라인드 서명\" 활성화" + }, + "ledgerConnectionInstructionStepOne": { + "message": "설정 > 고급에서 Ledger Live 사용을 활성화하세요." + }, + "ledgerConnectionInstructionStepThree": { + "message": "원장 장치를 연결하고 이더리움 앱을 선택하세요." + }, + "ledgerConnectionInstructionStepTwo": { + "message": "Ledger Live 앱 열기 및 잠금 해제" + }, + "ledgerConnectionPreferenceDescription": { + "message": "원장을 메타마스크에 연결하는 방법을 지정하세요. $1가 권장되지만 다른 옵션도 사용할 수 있습니다. 여기에서 더 알아보세요: $2", + "description": "A description that appears above a dropdown where users can select between up to three options - Ledger Live, U2F or WebHID - depending on what is supported in their browser. $1 is the recommended browser option, it will be either WebHID or U2f. $2 is a link to an article where users can learn more, but will be the translation of the learnMore message." + }, + "ledgerDeviceOpenFailureMessage": { + "message": "원장 장치를 열지 못했습니다. 귀하의 원장이 다른 소프트웨어에 연결되어 있을 수 있습니다. Ledger Live 또는 원장 장치에 연결된 다른 응용 프로그램을 닫고 다시 연결하세요." + }, + "ledgerLive": { + "message": "Ledger Live", + "description": "The name of a desktop app that can be used with your ledger device. We can also use it to connect a users Ledger device to MetaMask." + }, "ledgerLiveApp": { "message": "Ledger Live 앱" }, @@ -1005,12 +1530,22 @@ "ledgerTimeout": { "message": "Ledger Live의 응답 시간이 너무 길거나 연결 시간을 초과하였습니다. Ledger Live 앱이 열려 있고 장치의 잠금이 해제되어 있는지 확인하세요." }, + "ledgerTransportChangeWarning": { + "message": "Ledger Live 앱이 열려 있으면 열려 있는 Ledger Live 연결을 끊고 Ledger Live 앱을 닫으세요." + }, + "ledgerWebHIDNotConnectedErrorMessage": { + "message": "원장 장치가 연결되지 않았습니다. 원장을 연결하려면 '계속'을 다시 클릭하고 HID 연결을 승인하세요.", + "description": "An error message shown to the user during the hardware connect flow." + }, "letsGoSetUp": { "message": "설정을 시작하죠!" }, "likeToImportTokens": { "message": "이 토큰을 추가하시겠어요?" }, + "link": { + "message": "링크" + }, "links": { "message": "링크" }, @@ -1032,15 +1567,48 @@ "lockTimeTooGreat": { "message": "잠금 시간이 너무 깁니다." }, + "low": { + "message": "낮음" + }, + "lowGasSettingToolTipMessage": { + "message": "$1을(를) 사용하고 더 저렴한 가격을 기다리세요. 시간 추정치는 가격을 다소 예측할 수 없기 때문에 훨씬 덜 정확합니다.", + "description": "$1 is key 'low' separated here so that it can be passed in with bold fontweight" + }, + "lowLowercase": { + "message": "낮음" + }, + "lowPriorityMessage": { + "message": "향후 거래는 이 거래 이후에 대기열에 추가됩니다. 이 가격은 얼마 전에 마지막으로 확인되었습니다." + }, "mainnet": { "message": "이더리움 메인넷" }, "makeAnotherSwap": { "message": "새 스왑 생성" }, + "makeSureNoOneWatching": { + "message": "귀하의 화면을 보고 있는 사람이 없는지 확인하세요.", + "description": "Warning to users to be care while creating and saving their new Secret Recovery Phrase" + }, "max": { "message": "최대" }, + "maxBaseFee": { + "message": "최대 기본 요금" + }, + "maxFee": { + "message": "최대 요금" + }, + "maxPriorityFee": { + "message": "최대 우선 요금" + }, + "medium": { + "message": "시장" + }, + "mediumGasSettingToolTipMessage": { + "message": "현재 시장 가격으로 빠르게 처리할 수 있도록 $1을(를) 사용하세요.", + "description": "$1 is key 'medium' (text: 'Market') separated here so that it can be passed in with bold fontweight" + }, "memo": { "message": "메모" }, @@ -1071,6 +1639,9 @@ "metametricsCommitmentsAllowOptOut": { "message": "언제든 설정을 통해 옵트아웃할 수 있습니다." }, + "metametricsCommitmentsAllowOptOut2": { + "message": "언제든 설정을 통해 옵트아웃할 수 있습니다." + }, "metametricsCommitmentsBoldNever": { "message": "안 함", "description": "This string is localized separately from some of the commitments so that we can bold it" @@ -1078,6 +1649,9 @@ "metametricsCommitmentsIntro": { "message": "MetaMask에서는.." }, + "metametricsCommitmentsNeverCollect": { + "message": "키, 주소, 거래, 잔액, 해시 또는 개인 정보를 절대 수집하지 않습니다." + }, "metametricsCommitmentsNeverCollectIP": { "message": "전체 IP 주소를 절대 수집하지 않습니다.", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" @@ -1086,6 +1660,12 @@ "message": "키, 주소, 거래, 잔액, 해시 또는 개인 정보를 절대 수집하지 않습니다.", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" }, + "metametricsCommitmentsNeverIP": { + "message": "전체 IP 주소를 절대 수집하지 않습니다." + }, + "metametricsCommitmentsNeverSell": { + "message": "수익을 위해 데이터를 절대 판매하지 않습니다. 결코 그렇지 않습니다." + }, "metametricsCommitmentsNeverSellDataForProfit": { "message": "수익을 위해 데이터를 절대 판매하지 않습니다. 결코 그렇습니다.", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" @@ -1099,6 +1679,12 @@ "metametricsOptInDescription": { "message": "MetaMask는 사용자가 확장 프로그램과 상호작용하는 방식을 자세히 이해하기 위해 사용 데이터를 수집하려 합니다. 이 데이터는 당사의 제품과 이더리움 에코시스템의 사용 편의성 및 사용자 경험을 지속적으로 개선하는 데 사용됩니다." }, + "metametricsOptInDescription2": { + "message": "당사 제품의 가용성 향상을 위해 기본적인 사용 데이터를 수집하고자 합니다. 이 측정항목은..." + }, + "metametricsTitle": { + "message": "6백만 명 이상의 사용자와 함께 메타마스크 개선에 동참하세요." + }, "mismatchedChain": { "message": "이 체인 ID의 네트워크 세부 정보가 기록과 일치하지 않습니다. 진행하기 전에 $1을(를) 권장합니다.", "description": "$1 is a clickable link with text defined by the 'mismatchedChainLinkText' key" @@ -1107,6 +1693,15 @@ "message": "네트워크 세부 정보 검증", "description": "Serves as link text for the 'mismatchedChain' key. This text will be embedded inside the translation for that key." }, + "missingNFT": { + "message": "NFT가 보이지 않나요?" + }, + "missingToken": { + "message": "토큰이 보이지 않나요?" + }, + "mobileSyncWarning": { + "message": "'확장 프로그램과 동기화' 기능이 일시적으로 비활성화됩니다. 메타마스크 모바일에서 확장 지갑을 사용하려면 모바일 앱에서 지갑 설정 옵션으로 돌아가 '비밀 백업 문구 가져오기' 옵션을 선택하세요. 확장 지갑의 비밀 문구를 사용하여 지갑을 모바일로 가져올 수 있습니다." + }, "mustSelectOne": { "message": "토큰을 1개 이상 선택해야 합니다." }, @@ -1123,9 +1718,15 @@ "message": "도움이 필요하신가요? $1에 문의하세요.", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" }, + "needHelpFeedback": { + "message": "피드백을 공유하세요." + }, "needHelpLinkText": { "message": "MetaMask 지원" }, + "needHelpSubmitTicket": { + "message": "티켓 제출" + }, "needImportFile": { "message": "가져올 파일을 선택해야 합니다.", "description": "User is important an account and needs to add a file to continue" @@ -1148,6 +1749,12 @@ "networkNameEthereum": { "message": "이더리움" }, + "networkNamePolygon": { + "message": "Polygon" + }, + "networkNameRinkeby": { + "message": "Rinkeby" + }, "networkNameTestnet": { "message": "테스트넷" }, @@ -1157,6 +1764,20 @@ "networkSettingsDescription": { "message": "맞춤형 RPC 네트워크 추가 및 편집" }, + "networkStatus": { + "message": "네트워크 상태" + }, + "networkStatusBaseFeeTooltip": { + "message": "기본 요금은 네트워크에 의해 설정되며 13-14초마다 변경됩니다. 당사의 $1 및 $2 옵션이 갑작스러운 증가를 설명해줍니다.", + "description": "$1 and $2 are bold text for Medium and Aggressive respectively." + }, + "networkStatusPriorityFeeTooltip": { + "message": "우선 요금의 범위(일명 \"채굴자 팁\"). 이것은 채굴자에게 전달되어 거래의 우선 순위를 정하도록 장려합니다." + }, + "networkStatusStabilityFeeTooltip": { + "message": "가스 요금이 지난 72시간에 비해 $1입니다.", + "description": "$1 is networks stability value - stable, low, high" + }, "networkURL": { "message": "네트워크 URL" }, @@ -1179,12 +1800,27 @@ "message": "계정 $1", "description": "Default name of next account to be created on create account screen" }, + "newCollectibleAddFailed": { + "message": "다음 이유 때문에 수집 금액이 추가되지 않았습니다: $1" + }, + "newCollectibleAddedMessage": { + "message": "수집이 성공적으로 추가되었습니다!" + }, "newContact": { "message": "새 연락처" }, "newContract": { "message": "새 계약" }, + "newNFTsDetected": { + "message": "신규! NFT 감지" + }, + "newNFTsDetectedInfo": { + "message": "메타마스크가 Opensea에서 자동으로 NFT를 감지하고 메타마스크 지갑에 표시하도록 허용합니다." + }, + "newNetworkAdded": { + "message": "“$1”가 성공적으로 추가되었습니다!" + }, "newPassword": { "message": "새 암호(8자 이상)" }, @@ -1197,6 +1833,9 @@ "newTransactionFee": { "message": "새 거래 수수료" }, + "newValues": { + "message": "새로운 가치" + }, "next": { "message": "다음" }, @@ -1204,6 +1843,15 @@ "message": "임시값이 추천 임시값($1)보다 큽니다.", "description": "The next nonce according to MetaMask's internal logic" }, + "nftTokenIdPlaceholder": { + "message": "수집 가능한 ID를 입력하세요." + }, + "nfts": { + "message": "NFT" + }, + "nickname": { + "message": "별명" + }, "noAccountsFound": { "message": "검색어에 해당하는 계정이 없습니다." }, @@ -1213,9 +1861,15 @@ "noAlreadyHaveSeed": { "message": "아니요. 이미 비밀 복구 구문이 있습니다." }, + "noConversionDateAvailable": { + "message": "사용 가능한 통화 변환 날짜 없음" + }, "noConversionRateAvailable": { "message": "사용 가능한 전환율이 없음" }, + "noNFTs": { + "message": "아직 NFT가 없음" + }, "noThanks": { "message": "괜찮습니다" }, @@ -1240,6 +1894,9 @@ "nonceFieldHeading": { "message": "맞춤형 임시값" }, + "notBusy": { + "message": "바쁘지 않음" + }, "notCurrentAccount": { "message": "올바른 계정인가요? 현재 지갑에서 선택된 계정과 다릅니다." }, @@ -1298,6 +1955,43 @@ "message": "Chrome 사용자용 Ledger 지원 업데이트", "description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update" }, + "notifications7DescriptionOne": { + "message": "메타마스크 v10.1.0에는 원장 장치를 사용할 때 EIP-1559 거래을 위한 새로운 지원이 포함되었습니다.", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for ledger and EIP1559 in v10.1.0" + }, + "notifications7DescriptionTwo": { + "message": "Ethereum Mainnet에서 거래를 완료하려면 원장 장치에 최신 펌웨어가 있는지 확인하세요.", + "description": "Description of a notification in the 'See What's New' popup. Describes the need to update ledger firmware." + }, + "notifications7Title": { + "message": "원장 폄웨어 업데이트", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." + }, + "notifications8ActionText": { + "message": "고급 설정으로 이동하기", + "description": "Description on an action button that appears in the What's New popup. Tells the user that if they click it, they will go to our Advanced Settings page." + }, + "notifications8DescriptionOne": { + "message": "메타마스크 v10.4.0부터는 더 이상 원장 장치를 메타마스크에 연결하기 위해 Ledger Live를 사용하지 않아도 됩니다.", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for how Ledger Live is no longer needed to connect the device." + }, + "notifications8DescriptionTwo": { + "message": "더 쉽고 안정적인 원장 경험을 위해 설정의 고급 탭으로 이동하여 '선호하는 원장 연결 유형'을 'WebHID'로 전환하세요.", + "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." + }, + "notifications8Title": { + "message": "원장 연결 개선 사항", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users that there is an improvement in how they can connect their device." + }, + "notifications9DescriptionOne": { + "message": "이제 스마트 계약 거래를 확인할 때 '데이터' 탭에서 더 많은 통찰력을 얻을 수 있습니다." + }, + "notifications9DescriptionTwo": { + "message": "이제 확인하기 전에 거래 세부 정보를 더 잘 이해할 수 있고 주소록에 거래 주소를 더 쉽게 추가할 수 있어 안전하며 정보에 입각한 결정을 내리는 데 도움이 됩니다." + }, + "notifications9Title": { + "message": "👓 당사는 거래를 이해하기 쉽게 도와드립니다." + }, "ofTextNofM": { "message": "/" }, @@ -1313,16 +2007,79 @@ "on": { "message": "켜기" }, + "onboardingCreateWallet": { + "message": "새 지갑 생성" + }, + "onboardingImportWallet": { + "message": "기존 지갑 가져오기" + }, + "onboardingPinExtensionBillboardAccess": { + "message": "전체 액세스" + }, + "onboardingPinExtensionBillboardDescription": { + "message": "이 확장 프로그램은 정보를 확인하고 변경할 수 있습니다." + }, + "onboardingPinExtensionBillboardDescription2": { + "message": "정보를 확인하고 변경할 수 있습니다." + }, + "onboardingPinExtensionBillboardTitle": { + "message": "확장 프로그램" + }, + "onboardingPinExtensionChrome": { + "message": "브라우저 확장 아이콘 클릭" + }, + "onboardingPinExtensionDescription": { + "message": "쉽게 액세스하여 거래를 확인할 있도록 브라우저에 메타마스크를 고정해 놓으세요." + }, + "onboardingPinExtensionDescription2": { + "message": "확장 프로그램을 클릭하여 메타마스크를 열고 클릭 한 번으로 지갑에 액세스할 수 있습니다." + }, + "onboardingPinExtensionDescription3": { + "message": "브라우저 확장 아이콘을 클릭하여 즉시 액세스하세요." + }, + "onboardingPinExtensionLabel": { + "message": "메타마스크 고정" + }, + "onboardingPinExtensionStep1": { + "message": "1" + }, + "onboardingPinExtensionStep2": { + "message": "2" + }, + "onboardingPinExtensionTitle": { + "message": "메타마스크 설치가 완료되었습니다!" + }, "onboardingReturnNotice": { "message": "\"$1\"이(가) 이 탭을 닫고 $2로 돌아갑니다.", "description": "Return the user to the site that initiated onboarding" }, + "onboardingShowIncomingTransactionsDescription": { + "message": "지갑에 들어오는 거래를 표시하려면 $1과(와)의 통신이 필요합니다. Etherscan은 이더리움 주소와 IP 주소에 액세스할 수 있습니다. $2 보기.", + "description": "$1 is a clickable link with text defined by the 'etherscan' key. $2 is a clickable link with text defined by the 'privacyMsg' key." + }, + "onboardingUsePhishingDetectionDescription": { + "message": "피싱 감지 경보는 $1과(와)의 통신에 의존합니다. jsDeliver는 귀하의 IP 주소에 액세스할 수 있습니다. $2 보기.", + "description": "The $1 is the word 'jsDeliver', from key 'jsDeliver' and $2 is the words Privacy Policy from key 'privacyMsg', both separated here so that it can be wrapped as a link" + }, "onlyAddTrustedNetworks": { "message": "악성 네트워크 공급업체는 블록체인 상태를 거짓으로 보고하고 네트워크 활동을 기록할 수 있습니다. 신뢰하는 맞춤형 네트워크만 추가하세요." }, "onlyConnectTrust": { "message": "신뢰하는 사이트만 연결하세요." }, + "openFullScreenForLedgerWebHid": { + "message": "WebHID를 통해 원장을 연결하려면 전체 화면에서 메타마스크를 엽니다.", + "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." + }, + "optional": { + "message": "선택적" + }, + "optionalWithParanthesis": { + "message": "(선택적)" + }, + "or": { + "message": "또는" + }, "origin": { "message": "원본" }, @@ -1341,6 +2098,12 @@ "passwordNotLongEnough": { "message": "암호가 짧습니다." }, + "passwordSetupDetails": { + "message": "이 비밀번호는 이 기기에서만 메타마스크 지갑의 잠금을 해제합니다. 메타마스크는 이 비밀번호를 복구할 수 없습니다." + }, + "passwordTermsWarning": { + "message": "메타마스크가 이 비밀번호를 복구할 수 없음을 이해합니다. $1" + }, "passwordsDontMatch": { "message": "암호가 일치하지 않습니다." }, @@ -1351,6 +2114,19 @@ "pending": { "message": "보류 중" }, + "pendingTransactionInfo": { + "message": "이 거래는 다른 거래가 완료될 때까지 처리되지 않습니다." + }, + "pendingTransactionMultiple": { + "message": "보류 중인 ($1) 거래가 있습니다." + }, + "pendingTransactionSingle": { + "message": "보류 중인 (1) 거래가 있습니다.", + "description": "$1 is count of pending transactions" + }, + "permissionRequest": { + "message": "승인 요청" + }, "permissions": { "message": "권한" }, @@ -1361,6 +2137,10 @@ "message": "+ 그 외 $1개", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, + "preferredLedgerConnectionType": { + "message": "선호하는 원장 연결 유형", + "description": "A header for a dropdown in the advanced section of settings. Appears above the ledgerConnectionPreferenceDescription message" + }, "prev": { "message": "이전" }, @@ -1370,6 +2150,12 @@ "primaryCurrencySettingDescription": { "message": "체인의 고유 통화(예: ETH)로 값을 우선 표시하려면 고유를 선택합니다. 선택한 명목 통화로 값을 우선 표시하려면 명목을 선택합니다." }, + "priorityFee": { + "message": "우선 요금" + }, + "priorityFeeProperCase": { + "message": "우선 요금" + }, "privacyMsg": { "message": "개인정보보호정책" }, @@ -1383,6 +2169,9 @@ "privateNetwork": { "message": "비공개 네트워크" }, + "proceedWithTransaction": { + "message": "어쨌든 진행하겠습니다." + }, "proposedApprovalLimit": { "message": "제안된 승인 한도" }, @@ -1410,6 +2199,9 @@ "recipientAddressPlaceholder": { "message": "검색, 공개 주소(0x) 또는 ENS" }, + "recommendedGasLabel": { + "message": "권장됨" + }, "recoveryPhraseReminderBackupStart": { "message": "여기에서 시작" }, @@ -1434,6 +2226,9 @@ "recoveryPhraseReminderTitle": { "message": "자금을 지키세요" }, + "refreshList": { + "message": "새로 고침 목록" + }, "reject": { "message": "거부" }, @@ -1449,6 +2244,9 @@ "rejected": { "message": "거부됨" }, + "remember": { + "message": "알림:" + }, "remindMeLater": { "message": "나중에 알림" }, @@ -1461,6 +2259,9 @@ "removeAccountDescription": { "message": "이 계정이 지갑에서 제거됩니다. 계속하기 전에 가져온 이 계정에 대한 원본 비밀 복구 구문이나 비공개 키가 있는지 확인하세요. 계정 드롭다운에서 계정을 가져오거나 다시 만들 수 있습니다. " }, + "removeNFT": { + "message": "NFT 제거" + }, "requestsAwaitingAcknowledgement": { "message": "확인 대기 중인 요청" }, @@ -1549,12 +2350,33 @@ "secretPhrase": { "message": "금고를 복구하려면 비밀 구문을 여기에 입력하세요." }, + "secretPhraseWarning": { + "message": "다른 비밀 복구 문구를 사용하여 복구하면 현재 지갑, 계정 및 자산이 이 앱에서 영구적으로 제거됩니다. 이 작업은 취소할 수 없습니다." + }, + "secretRecoveryPhrase": { + "message": "비밀 복구 문구" + }, + "secureWallet": { + "message": "보안 지갑" + }, "securityAndPrivacy": { "message": "보안 및 개인정보 보호" }, "securitySettingsDescription": { "message": "개인정보 설정 및 지갑 비밀 복구 구문" }, + "seedPhraseConfirm": { + "message": "비밀 복구 문구 확인" + }, + "seedPhraseEnterMissingWords": { + "message": "비밀 북구 문구 확인" + }, + "seedPhraseIntroNotRecommendedButtonCopy": { + "message": "나중에 알림(권장하지 않음)" + }, + "seedPhraseIntroRecommendedButtonCopy": { + "message": "내 지갑 보호(권장)" + }, "seedPhraseIntroSidebarBulletFour": { "message": "적어서 여러 비밀 장소에 보관하세요." }, @@ -1600,6 +2422,12 @@ "seedPhraseReq": { "message": "비밀 복구 구문은 12, 15, 18, 21 또는 24개의 단어를 포함합니다." }, + "seedPhraseWriteDownDetails": { + "message": "이 12단어 비밀 복구 문구를 기록하고 귀하만 접근 가능한 믿을 만한 장소에 저장하세요." + }, + "seedPhraseWriteDownHeader": { + "message": "비밀 복구 문구 기록" + }, "selectAHigherGasFee": { "message": "높은 Gas 수수료를 선택하면 거래 처리 속도를 높일 수 있습니다.*" }, @@ -1621,6 +2449,9 @@ "selectHdPath": { "message": "HD 경로 선택" }, + "selectNFTPrivacyPreference": { + "message": "설정에서 NFT 감지 켜기" + }, "selectPathHelp": { "message": "아래에 기존 Ledger 계정이 표시되지 않는다면 경로를 \"Legacy (MEW / MyCrypto)\"로 변경해 보세요." }, @@ -1640,15 +2471,31 @@ "message": "$1 보내기", "description": "Symbol of the specified token" }, + "sendTo": { + "message": "보내기 대상" + }, "sendTokens": { "message": "토큰 보내기" }, + "sendingNativeAsset": { + "message": "$1 보내기", + "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" + }, "separateEachWord": { "message": "공백 한 칸으로 각 단어를 구분하세요." }, + "setAdvancedPrivacySettings": { + "message": "개인정보 설정 고급 지정" + }, + "setAdvancedPrivacySettingsDetails": { + "message": "메타마스크는 이러한 신뢰할 수 있는 타사 서비스를 사용하여 제품 가용성과 안전성을 향상합니다." + }, "settings": { "message": "설정" }, + "show": { + "message": "보기" + }, "showAdvancedGasInline": { "message": "고급 Gas 제어 기능" }, @@ -1667,6 +2514,9 @@ "showHexDataDescription": { "message": "이 항목을 선택하면 보내기 화면에 16진수 데이터 필드가 표시됩니다." }, + "showHide": { + "message": "보기/숨기기" + }, "showIncomingTransactions": { "message": "수신 거래 표시" }, @@ -1679,9 +2529,18 @@ "showPrivateKeys": { "message": "비공개 키 표시" }, + "showRecommendations": { + "message": "추천 보기" + }, "showSeedPhrase": { "message": "비밀 복구 구문 표시" }, + "showTestnetNetworks": { + "message": "테스트 네트워크 보기" + }, + "showTestnetNetworksDescription": { + "message": "네트워크 목록에서 표시하려는 테스트 네트워크를 선택하세요." + }, "sigRequest": { "message": "서명 요청" }, @@ -1700,18 +2559,45 @@ "signed": { "message": "서명됨" }, + "simulationErrorMessage": { + "message": "이 거래는 실패할 것으로 예상됩니다. 실행하려면 비용이 많이 들지만 실패할 것으로 예상되어 권장하지 않습니다." + }, + "simulationErrorMessageV2": { + "message": "가스를 추정할 수 없었습니다. 계약에 오류가 있을 수 있으며 이 거래가 실패할 수 있습니다." + }, + "skip": { + "message": "건너뛰기" + }, + "skipAccountSecurity": { + "message": "계정 보안을 건너뛸까요?" + }, + "skipAccountSecurityDetails": { + "message": "나는 내 비밀 복구 문구를 백업할 때까지 내 계정과 모든 자산을 잃을 수 있음을 이해합니다." + }, "slow": { "message": "느림" }, "somethingWentWrong": { "message": "이런! 문제가 발생했습니다." }, + "source": { + "message": "소스" + }, "speedUp": { "message": "가속화" }, "speedUpCancellation": { "message": "이 취소 가속화" }, + "speedUpExplanation": { + "message": "현재 네트워크 상태를 기반으로 가스 요금을 업데이트하고 최소 10% 인상했습니다(네트워크에서 요구함)." + }, + "speedUpPopoverTitle": { + "message": "거래 가속화" + }, + "speedUpTooltipText": { + "message": "새로운 가스 요금" + }, "speedUpTransaction": { "message": "이 거래 가속화" }, @@ -1734,6 +2620,12 @@ "spendLimitTooLarge": { "message": "지출 한도가 너무 큼" }, + "stable": { + "message": "안정적" + }, + "stableLowercase": { + "message": "안정적" + }, "stateLogError": { "message": "상태 로그를 가져오는 도중 오류가 발생했습니다." }, @@ -1752,6 +2644,13 @@ "statusNotConnected": { "message": "연결되지 않음" }, + "step1LatticeWallet": { + "message": "Lattice1을 연결할 준비가 되었는지 확인하세요." + }, + "step1LatticeWalletMsg": { + "message": "Lattice1 장치가 설정되고 온라인 상태가 되면 메타마스크를 연결할 수 있습니다. 장치의 잠금을 해제하고 장치 ID를 준비하세요. 하드웨어 지갑 사용에 대한 자세한 내용은, $1", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, "step1LedgerWallet": { "message": "Ledger 앱 다운로드" }, @@ -1815,6 +2714,10 @@ "message": "이 스왑을 완료하려면 $1개의 추가 $2이(가) 필요합니다.", "description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol." }, + "swapBestOfNQuotes": { + "message": "$1의 최고 견적", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, "swapBuildQuotePlaceHolderText": { "message": "$1와(과) 일치하는 토큰이 없습니다.", "description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text" @@ -1834,6 +2737,9 @@ "swapDecentralizedExchange": { "message": "분산형 교환" }, + "swapDirectContract": { + "message": "직접 계약" + }, "swapEditLimit": { "message": "한도 편집" }, @@ -1841,6 +2747,10 @@ "message": "필수이며 MetaMask에게 $1을(를) 스왑할 권한을 부여합니다.", "description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps." }, + "swapEnableTokenForSwapping": { + "message": "스왑하려면 $1이(가) 필요합니다.", + "description": "$1 is for the 'enableToken' key, e.g. 'enable ETH'" + }, "swapEstimatedNetworkFees": { "message": "예상 네트워크 수수료" }, @@ -1854,6 +2764,9 @@ "swapFailedErrorTitle": { "message": "스왑 실패" }, + "swapFetchingQuotes": { + "message": "견적을 가져오는 중" + }, "swapFetchingQuotesErrorDescription": { "message": "음.... 문제가 발생했습니다. 다시 시도해 보고 오류가 해결되지 않는다면 고객 지원에 문의하세요." }, @@ -1867,12 +2780,26 @@ "message": "$1을(를) $2(으)로 스왑", "description": "Tells a user that they need to confirm on their hardware wallet a swap of 2 tokens. $1 is a source token and $2 is a destination token" }, + "swapGasFeesDetails": { + "message": "가스 요금은 예상 가능하며 네트워크 트래픽 및 거래 복잡성에 따라 변동됩니다." + }, + "swapGasFeesLearnMore": { + "message": "가스 요금 자세히 알아보기" + }, "swapGasFeesSplit": { "message": "이전 화면의 Gas 수수료는 이 두 거래로 나뉩니다." }, + "swapGasFeesSummary": { + "message": "$1 네트워크에서 거래를 처리하는 암호화폐 채굴자에게 가스 요금이 지급됩니다. 메타마스크는 가스 요금으로 이익을 얻지 않습니다.", + "description": "$1 is the selected network, e.g. Ethereum or BSC" + }, "swapHighSlippageWarning": { "message": "슬리패지 금액이 아주 큽니다." }, + "swapIncludesMMFee": { + "message": "$1%의 메타마스크 요금이 포함됩니다.", + "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." + }, "swapLowSlippageError": { "message": "거래가 실패할 수도 있습니다. 최대 슬리패지가 너무 낮습니다." }, @@ -1886,6 +2813,10 @@ "message": "당사는 매번 최상의 유동성 소스에서 최적의 가격을 찾습니다. 이 견적에는 $1%의 수수료가 자동으로 반영됩니다.", "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." }, + "swapNQuotesWithDot": { + "message": "$1 견적.", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, "swapNewQuoteIn": { "message": "$1의 새 견적", "description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00" @@ -1978,6 +2909,12 @@ "swapSourceInfo": { "message": "당사에서는 여러 유동성 소스(교환, 애그리게이터, 투자전문기관)를 검색하여 최상의 요율과 최저 네트워크 수수료를 찾습니다." }, + "swapSuggested": { + "message": "제안 스왑" + }, + "swapSuggestedGasSettingToolTipMessage": { + "message": "스왑은 복잡하고 시간에 민감한 거래입니다. 성공적인 스왑의 비용과 확신 사이의 적절한 균형을 위해 이 가스 요금을 권장합니다." + }, "swapSwapFrom": { "message": "다음에서 스왑" }, @@ -2016,6 +2953,10 @@ "message": "$1개 소스에서 확인되었습니다.", "description": "Indicates the number of token information sources that recognize the symbol + address. $1 is a decimal number." }, + "swapTooManyDecimalsError": { + "message": "$1은(는) 소수점 이하 $2까지 허용됩니다.", + "description": "$1 is a token symbol and $2 is the max. number of decimals allowed for the token" + }, "swapTransactionComplete": { "message": "거래 완료" }, @@ -2076,6 +3017,12 @@ "symbolBetweenZeroTwelve": { "message": "기호는 11자 이하여야 합니다." }, + "syncFailed": { + "message": "동기화 실패" + }, + "syncInProgress": { + "message": "동기화 진행 중" + }, "syncWithMobile": { "message": "모바일과 동기화" }, @@ -2118,6 +3065,9 @@ "thisWillCreate": { "message": "새 지갑과 시드 구문을 만듭니다." }, + "time": { + "message": "시간" + }, "tips": { "message": "팁" }, @@ -2128,6 +3078,10 @@ "message": "수신: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, + "toggleTestNetworks": { + "message": "$1 테스트 네트워크", + "description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open to the advanced settings where users can enable the display of test networks in the network dropdown." + }, "token": { "message": "토큰" }, @@ -2140,6 +3094,9 @@ "tokenDecimalFetchFailed": { "message": "필요한 토큰 십진수" }, + "tokenDetectionAnnouncement": { + "message": "신규! 개선된 토큰 감지는 실험적 기능으로 Ethereum Mainnet에서 사용할 수 있습니다. $1" + }, "tokenSymbol": { "message": "토큰 기호" }, @@ -2164,6 +3121,48 @@ "transactionCreated": { "message": "$2에서 $1 값으로 거래가 생성되었습니다." }, + "transactionData": { + "message": "거래 데이터" + }, + "transactionDecodingAccreditationDecoded": { + "message": "Truffle에 의한 디코딩" + }, + "transactionDecodingAccreditationVerified": { + "message": "$1에 대한 확인된 계약" + }, + "transactionDecodingUnsupportedNetworkError": { + "message": "ChainId $1에 대한 거래 디코딩을 사용할 수 없습니다." + }, + "transactionDetailDappGasMoreInfo": { + "message": "제안 사이트" + }, + "transactionDetailDappGasTooltip": { + "message": "최신 블록을 기반으로 메타마스크의 권장 가스 요금을 사용하도록 편집합니다." + }, + "transactionDetailGasHeading": { + "message": "예상 가스 요금" + }, + "transactionDetailGasInfoV2": { + "message": "예상됨" + }, + "transactionDetailGasTooltipConversion": { + "message": "가스 요금 자세히 알아보기" + }, + "transactionDetailGasTooltipExplanation": { + "message": "가스 요금은 네트워크에 의해 설정되며 네트워크 트래픽 및 거래의 복잡성에 따라 변동합니다." + }, + "transactionDetailGasTooltipIntro": { + "message": "$1 네트워크에서 거래를 처리하는 암호화폐 채굴자에게 가스 요금이 지급됩니다. 메타마스크는 가스 요금으로 이익을 얻지 않습니다." + }, + "transactionDetailGasTotalSubtitle": { + "message": "금액 + 가스 요금" + }, + "transactionDetailLayer2GasHeading": { + "message": "Layer 2 가스 요금" + }, + "transactionDetailMultiLayerTotalSubtitle": { + "message": "금액 + 요금" + }, "transactionDropped": { "message": "$2에서의 거래가 중단되었습니다." }, @@ -2179,6 +3178,27 @@ "transactionFee": { "message": "거래 수수료" }, + "transactionHistoryBaseFee": { + "message": "기본 요금(GWEI)" + }, + "transactionHistoryL1GasLabel": { + "message": "총 L1 가스 요금" + }, + "transactionHistoryL2GasLimitLabel": { + "message": "L2 가스 한도" + }, + "transactionHistoryL2GasPriceLabel": { + "message": "L2 가스 가격" + }, + "transactionHistoryMaxFeePerGas": { + "message": "가스당 최대 요금" + }, + "transactionHistoryPriorityFee": { + "message": "우선 요금(GWEI)" + }, + "transactionHistoryTotalGasFee": { + "message": "총 가스 요금" + }, "transactionResubmitted": { "message": "$2에서 Gas 수수료가 $1(으)로 증가한 거래가 다시 제출되었습니다." }, @@ -2205,12 +3225,31 @@ "message": "토큰 잔액을 로드하는 도중 문제가 발생했습니다. 다음에서 잔액을 확인하세요. ", "description": "Followed by a link (here) to view token balances" }, + "trustSiteApprovePermission": { + "message": "권한을 부여하면 다음 $1이(가) 귀하의 자금에 액세스할 수 있습니다." + }, "tryAgain": { "message": "다시 시도" }, + "tryAnywayOption": { + "message": "어쨌든 시도하겠습니다." + }, + "turnOnTokenDetection": { + "message": "향상된 토큰 감지 켜기" + }, + "twelveHrTitle": { + "message": "12시간:" + }, + "txInsightsNotSupported": { + "message": "현재 이 계약에 대해 거래 인사이트가 지원되지 않습니다." + }, "typePassword": { "message": "MetaMask 암호 입력" }, + "u2f": { + "message": "U2F", + "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." + }, "unapproved": { "message": "승인되지 않음" }, @@ -2249,6 +3288,10 @@ "message": "네트워크 세부 정보 검증", "description": "Serves as link text for the 'unrecognizedChain' key. This text will be embedded inside the translation for that key." }, + "unsendableAsset": { + "message": "수집 가능한(ERC-721) 토큰 전송은 현재 지원되지 않습니다.", + "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" + }, "updatedWithDate": { "message": "$1에 업데이트됨" }, @@ -2258,12 +3301,24 @@ "urlExistsErrorMsg": { "message": "이 URL은 현재 $1 네트워크에서 사용됩니다." }, + "useCollectibleDetection": { + "message": "NFT 자동 감지" + }, + "useCollectibleDetectionDescription": { + "message": "NFT 미디어 및 데이터를 표시하면 IP 주소가 중앙 서버에 노출될 수 있습니다. OpenSea와 같은 타사 API는 지갑에서 NFT를 감지하는 데 사용됩니다. 이렇게 하면 해당 서비스의 계정 주소가 노출됩니다. 앱이 해당 서비스에서 데이터를 가져오지 않도록 하려면 비활성화된 상태로 유지하세요." + }, "usePhishingDetection": { "message": "피싱 감지 사용" }, "usePhishingDetectionDescription": { "message": "이더리움 사용자를 노리는 피싱 도메인에 대한 경고를 표시합니다." }, + "useTokenDetection": { + "message": "토큰 감지 사용" + }, + "useTokenDetectionDescription": { + "message": "당사는 타사 API를 사용하여 지갑으로 전송된 새 토큰을 감지하고 표시합니다. 메타마스크가 해당 서비스에서 데이터를 가져오는 것을 원하지 않으면 꺼놓으세요." + }, "usedByClients": { "message": "다양한 클라이언트에서 사용합니다." }, @@ -2291,15 +3346,56 @@ "viewContact": { "message": "연락처 보기" }, + "viewFullTransactionDetails": { + "message": "전체 거래 세부정보 보기" + }, "viewMore": { "message": "더 보기" }, + "viewOnBlockExplorer": { + "message": "블록 탐색기에서 보기" + }, + "viewOnCustomBlockExplorer": { + "message": "$2에서 $1 보기", + "description": "$1 is the action type. e.g (Account, Transaction, Swap) and $2 is the Custom Block Exporer URL" + }, + "viewOnEtherscan": { + "message": "Etherscan에서 $1 보기", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, + "viewOnOpensea": { + "message": "Opensea에서 보기" + }, + "viewinExplorer": { + "message": "Explorer에서 $1 보기", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, "visitWebSite": { "message": "당사 웹사이트 방문하기" }, "walletConnectionGuide": { "message": "당사의 하드웨어 지갑 연결 가이드" }, + "walletCreationSuccessDetail": { + "message": "지갑을 성공적으로 보호했습니다. 비밀 복구 문구를 안전하게 비밀로 유지하세요. 이는 귀하의 책임입니다!" + }, + "walletCreationSuccessReminder1": { + "message": "메타마스크는는 비밀 복구 문구를 복구할 수 없습니다." + }, + "walletCreationSuccessReminder2": { + "message": "메타마스크는 귀하의 비밀 복구 문구를 절대 묻지 않습니다." + }, + "walletCreationSuccessReminder3": { + "message": "누군가와 $1 또는 귀하의 자금을 도난당할 위험이 있습니다.", + "description": "$1 is separated as walletCreationSuccessReminder3BoldSection so that we can bold it" + }, + "walletCreationSuccessReminder3BoldSection": { + "message": "비밀 복구 문구를 절대 공유하지 마세요.", + "description": "This string is localized separately from walletCreationSuccessReminder3 so that we can bold it" + }, + "walletCreationSuccessTitle": { + "message": "지갑 생성 성공" + }, "walletSeedRestore": { "message": "지갑 비밀 복구 구문" }, @@ -2307,12 +3403,34 @@ "message": "현재의 웹사이트가 제거된 window.web3 API를 이용하려고 합니다. 이 사이트가 제대로 작동하지 않는 경우, $1을(를) 클릭해 자세히 알아보세요.", "description": "$1 is a clickable link." }, + "webhid": { + "message": "WebHID", + "description": "Refers to a interface for connecting external devices to the browser. Used for connecting ledger to the browser. Read more here https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API" + }, "welcome": { "message": "MetaMask 방문을 환영합니다" }, "welcomeBack": { "message": "재방문을 환영합니다!" }, + "welcomeExploreDescription": { + "message": "암호화 통화 및 자산을 저장, 전송 및 사용합니다." + }, + "welcomeExploreTitle": { + "message": "Explore 분산화 앱" + }, + "welcomeLoginDescription": { + "message": "메타마스크를 사용하여 분산화 앱에 로그인하세요. 가입은 필요 없습니다." + }, + "welcomeLoginTitle": { + "message": "내 지갑 처음 알아보기" + }, + "welcomeToMetaMask": { + "message": "시작하기" + }, + "welcomeToMetaMaskIntro": { + "message": "수백만 명이 신뢰하는 메타마스크(MetaMask)는 모든 사람이 web3의 세계에 접근할 수 있도록 하는 안전한 지갑입니다." + }, "whatsNew": { "message": "최근 소식", "description": "This is the title of a popup that gives users notifications about new features and updates to MetaMask." diff --git a/app/_locales/lt/messages.json b/app/_locales/lt/messages.json index 22ce9259e..28ae956e0 100644 --- a/app/_locales/lt/messages.json +++ b/app/_locales/lt/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Atmesti" + }, + "QRHardwareWalletImporterTitle": { + "message": "Nuskaityti QR kodą" + }, "about": { "message": "Apie" }, @@ -67,7 +73,7 @@ "description": "The description of the application" }, "appName": { - "message": "„MetaMask“", + "message": "MetaMask", "description": "The name of the application" }, "appNameBeta": { @@ -256,6 +262,9 @@ "currentLanguage": { "message": "Dabartinė kalba" }, + "custom": { + "message": "Išplėstiniai" + }, "customGas": { "message": "Pritaikyti dujas" }, @@ -530,6 +539,9 @@ "learnMore": { "message": "Sužinokite daugiau" }, + "learnMoreUpperCase": { + "message": "Sužinokite daugiau" + }, "ledgerAccountRestriction": { "message": "Prieš įtraukdami naują, turite pasinaudoti paskutine paskyra." }, diff --git a/app/_locales/lv/messages.json b/app/_locales/lv/messages.json index 9f6912dee..a0cc249fa 100644 --- a/app/_locales/lv/messages.json +++ b/app/_locales/lv/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Noraidīt" + }, + "QRHardwareWalletImporterTitle": { + "message": "Ieskenēt QR kodu" + }, "about": { "message": "Par" }, @@ -256,6 +262,9 @@ "currentLanguage": { "message": "Pašreizējā valodā" }, + "custom": { + "message": "Papildu" + }, "customGas": { "message": "Pielāgot Gas" }, @@ -526,6 +535,9 @@ "learnMore": { "message": "Uzzināt vairāk" }, + "learnMoreUpperCase": { + "message": "Uzzināt vairāk" + }, "ledgerAccountRestriction": { "message": "Jums jāizmanto pēdējais konts pirms varat pievienot jaunu." }, diff --git a/app/_locales/ml/messages.json b/app/_locales/ml/messages.json index 022f67993..570fd93c9 100644 --- a/app/_locales/ml/messages.json +++ b/app/_locales/ml/messages.json @@ -1,4 +1,7 @@ { + "QRHardwareSignRequestCancel": { + "message": "നിരസിക്കുക" + }, "about": { "message": "വിവരം" }, @@ -44,6 +47,9 @@ "create": { "message": "സൃഷ്‌ടിക്കുക" }, + "custom": { + "message": "നൂതനം" + }, "delete": { "message": "ഇല്ലാതാക്കുക" }, diff --git a/app/_locales/mr/messages.json b/app/_locales/mr/messages.json index cc208d4b7..2948a9d12 100644 --- a/app/_locales/mr/messages.json +++ b/app/_locales/mr/messages.json @@ -1,4 +1,7 @@ { + "QRHardwareSignRequestCancel": { + "message": "नाकारा" + }, "about": { "message": "बद्दल" }, @@ -44,6 +47,9 @@ "create": { "message": "तयार करा" }, + "custom": { + "message": "प्रगत" + }, "delete": { "message": "हटवा" }, diff --git a/app/_locales/ms/messages.json b/app/_locales/ms/messages.json index 01da25482..345b85195 100644 --- a/app/_locales/ms/messages.json +++ b/app/_locales/ms/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Tolak" + }, + "QRHardwareWalletImporterTitle": { + "message": "Imbas Kod QR" + }, "about": { "message": "Mengenai" }, @@ -256,6 +262,9 @@ "currentLanguage": { "message": "Bahasa Semasa" }, + "custom": { + "message": "Lanjutan" + }, "customGas": { "message": "Suaikan Gas" }, @@ -516,6 +525,9 @@ "learnMore": { "message": "Maklumat lanjut" }, + "learnMoreUpperCase": { + "message": "Maklumat lanjut" + }, "ledgerAccountRestriction": { "message": "Anda perlu menggunakan akaun terakhir anda sebelum anda boleh menambah yang baru." }, diff --git a/app/_locales/nl/messages.json b/app/_locales/nl/messages.json index 695ddbaa3..e4031f28f 100644 --- a/app/_locales/nl/messages.json +++ b/app/_locales/nl/messages.json @@ -1,4 +1,7 @@ { + "QRHardwareSignRequestCancel": { + "message": "Afwijzen" + }, "accountDetails": { "message": "Accountgegevens" }, diff --git a/app/_locales/no/messages.json b/app/_locales/no/messages.json index 37e90ef85..e35df3860 100644 --- a/app/_locales/no/messages.json +++ b/app/_locales/no/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Avslå" + }, + "QRHardwareWalletImporterTitle": { + "message": "Skann QR-kode" + }, "about": { "message": "Info" }, @@ -253,6 +259,9 @@ "currentLanguage": { "message": "Nåværende språk " }, + "custom": { + "message": "Avansert" + }, "customGas": { "message": "Tilpass Gass" }, @@ -517,6 +526,9 @@ "learnMore": { "message": "Lær mer" }, + "learnMoreUpperCase": { + "message": "Lær mer" + }, "ledgerAccountRestriction": { "message": "Du må bruke den siste kontoen din før du kan legge til en ny." }, diff --git a/app/_locales/pl/messages.json b/app/_locales/pl/messages.json index f470bff4c..f496aaff4 100644 --- a/app/_locales/pl/messages.json +++ b/app/_locales/pl/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Odrzuć" + }, + "QRHardwareWalletImporterTitle": { + "message": "Skanuj kod QR" + }, "about": { "message": "Informacje" }, @@ -256,6 +262,9 @@ "currentLanguage": { "message": "Obecny język" }, + "custom": { + "message": "Zaawansowane" + }, "customGas": { "message": "Ustaw gaz" }, @@ -530,6 +539,9 @@ "learnMore": { "message": "Dowiedz się więcej" }, + "learnMoreUpperCase": { + "message": "Dowiedz się więcej" + }, "ledgerAccountRestriction": { "message": "Musisz użyć swojego poprzedniego konta zanim dodasz kolejne." }, diff --git a/app/_locales/pt_BR/messages.json b/app/_locales/pt_BR/messages.json index c96b73ab5..be2b97bbc 100644 --- a/app/_locales/pt_BR/messages.json +++ b/app/_locales/pt_BR/messages.json @@ -1,4 +1,7 @@ { + "QRHardwareSignRequestCancel": { + "message": "Rejeitar" + }, "about": { "message": "Sobre" }, @@ -260,9 +263,6 @@ "buyWithWyreDescription": { "message": "Com o Wyre, você pode usar um cartão de débito para depositar ETH diretamente na sua conta do MetaMask." }, - "bytes": { - "message": "Bytes" - }, "canToggleInSettings": { "message": "Você pode reabilitar essa notificação em Configurações -> Alertas." }, @@ -679,10 +679,6 @@ "message": "O MetaMask encontrou um erro", "description": "Title of generic error page" }, - "errorStack": { - "message": "Stack:", - "description": "Title for error stack, which is displayed for debugging purposes" - }, "estimatedProcessingTimes": { "message": "Tempo estimado de processamento" }, @@ -696,9 +692,6 @@ "ethereumPublicAddress": { "message": "Endereço público do Ethereum" }, - "etherscan": { - "message": "Etherscan" - }, "etherscanView": { "message": "Exibir conta no Etherscan" }, @@ -761,7 +754,7 @@ "message": "Tipo de função" }, "gasLimit": { - "message": "Gas Limit" + "message": "Limite de Gas" }, "gasLimitInfoTooltipContent": { "message": "O Gas Limit é o valor máximo das unidades de gas que você está disposto a gastar." @@ -774,7 +767,7 @@ "description": "$1 is the custom gas limit, in decimal." }, "gasPrice": { - "message": "Gas Price (GWEI)" + "message": "Preço Gas (GWEI)" }, "gasPriceExcessive": { "message": "Sua taxa de gas é desnecessariamente alta. Considere reduzir o valor." @@ -824,9 +817,6 @@ "happyToSeeYou": { "message": "Ficamos felizes em ver você." }, - "hardware": { - "message": "Hardware" - }, "hardwareWalletConnected": { "message": "Carteira de hardware conectada" }, @@ -1011,9 +1001,6 @@ "likeToImportTokens": { "message": "Você gostaria de adicionar esses tokens?" }, - "links": { - "message": "Links" - }, "loadMore": { "message": "Carregar mais" }, @@ -1023,9 +1010,6 @@ "loadingTokens": { "message": "Carregando tokens..." }, - "localhost": { - "message": "Localhost 8545" - }, "lock": { "message": "Bloquear" }, @@ -1139,18 +1123,9 @@ "networkName": { "message": "Nome da rede" }, - "networkNameBSC": { - "message": "BSC" - }, "networkNameDefinition": { "message": "O nome associado com esta rede." }, - "networkNameEthereum": { - "message": "Ethereum" - }, - "networkNameTestnet": { - "message": "Testnet" - }, "networkSettingsChainIdDescription": { "message": "O ID da chain é usado para assinar transações. É preciso ser igual ao ID da chain retornado pela rede. Você pode informar um número decimal ou um número hexadecimal com prefixo “0x”, mas exibiremos o número em casas decimais." }, @@ -1228,9 +1203,6 @@ "noWebcamFoundTitle": { "message": "Câmera não encontrada" }, - "nonce": { - "message": "Nonce" - }, "nonceField": { "message": "Personalizar nonce da transação" }, @@ -1788,9 +1760,6 @@ "supportCenter": { "message": "Visite nossa Central de Suporte" }, - "swap": { - "message": "Swap" - }, "swapAdvancedSlippageInfo": { "message": "Quando o preço varia entre o momento em que seu pedido é feito e o momento em que é confirmado, isso recebe o nome de “slippage”. Seu swap será automaticamente cancelado se o slippage for superior à configuração “slippage máximo”." }, @@ -2128,9 +2097,6 @@ "message": "Até: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, - "token": { - "message": "Token" - }, "tokenAlreadyAdded": { "message": "O token já foi adicionado." }, @@ -2146,9 +2112,6 @@ "tooltipApproveButton": { "message": "Eu entendo" }, - "total": { - "message": "Total" - }, "transaction": { "message": "transação" }, diff --git a/app/_locales/ro/messages.json b/app/_locales/ro/messages.json index 5c95bd4c9..f5ab292b9 100644 --- a/app/_locales/ro/messages.json +++ b/app/_locales/ro/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Respingeți" + }, + "QRHardwareWalletImporterTitle": { + "message": "Scanați codul QR" + }, "about": { "message": "Despre" }, @@ -256,6 +262,9 @@ "currentLanguage": { "message": "Limba actuală" }, + "custom": { + "message": "Avansate" + }, "customGas": { "message": "Particularizați Gas" }, @@ -520,6 +529,9 @@ "learnMore": { "message": "Aflați mai multe" }, + "learnMoreUpperCase": { + "message": "Aflați mai multe" + }, "ledgerAccountRestriction": { "message": "Trebuie să folosiți ultimul cont înainte să adăugați altul." }, diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json index ceb3f0ae2..e438e24b0 100644 --- a/app/_locales/ru/messages.json +++ b/app/_locales/ru/messages.json @@ -1,4 +1,49 @@ { + "QRHardwareInvalidTransactionTitle": { + "message": "Ошибка" + }, + "QRHardwareMismatchedSignId": { + "message": "Несоответствующие данные транзакции. Проверьте ее реквизиты." + }, + "QRHardwarePubkeyAccountOutOfRange": { + "message": "Больше нет счетов. Если вы хотите получить доступ к другому счету, не указанному ниже, повторно подключите аппаратный кошелек и выберите его." + }, + "QRHardwareScanInstructions": { + "message": "Поместите QR-код перед камерой. Экран размытый, но это не повлияет на считывание." + }, + "QRHardwareSignRequestCancel": { + "message": "Отклонить" + }, + "QRHardwareSignRequestDescription": { + "message": "После подписки с помощью кошелька нажмите «Получить подпись»." + }, + "QRHardwareSignRequestGetSignature": { + "message": "Получить подпись" + }, + "QRHardwareSignRequestSubtitle": { + "message": "Отсканируйте QR-код с помощью кошелька" + }, + "QRHardwareSignRequestTitle": { + "message": "Запросить подпись" + }, + "QRHardwareUnknownQRCodeTitle": { + "message": "Ошибка" + }, + "QRHardwareUnknownWalletQRCode": { + "message": "Недействительный QR-код. Отсканируйте QR-код синхронизации аппаратного кошелька." + }, + "QRHardwareWalletImporterTitle": { + "message": "Сканировать QR-код" + }, + "QRHardwareWalletSteps1Description": { + "message": "Подключите изолированный (airgapped) аппаратный кошелек, связь с которым осуществляется с помощью QR-кодов. Вот некоторые поддерживаемые кошельки такого типа:" + }, + "QRHardwareWalletSteps1Title": { + "message": "Аппаратный кошелек на основе QR-кодов" + }, + "QRHardwareWalletSteps2Description": { + "message": "AirGap Vault и Ngrave (скоро появятся)" + }, "about": { "message": "Общие сведения" }, @@ -28,6 +73,10 @@ "accountName": { "message": "Название счета" }, + "accountNameDuplicate": { + "message": "Такое имя счета уже существует", + "description": "This is an error message shown when the user enters a new account name that matches an existing account name" + }, "accountOptions": { "message": "Опции счета" }, @@ -43,6 +92,15 @@ "activityLog": { "message": "журнал активности" }, + "add": { + "message": "Добавить" + }, + "addANetwork": { + "message": "Добавить сеть" + }, + "addANickname": { + "message": "Добавить ник" + }, "addAcquiredTokens": { "message": "Добавьте токены, которые вы приобрели с помощью MetaMask" }, @@ -52,6 +110,9 @@ "addContact": { "message": "Добавить контакт" }, + "addCustomToken": { + "message": "Добавить пользовательский токен" + }, "addCustomTokenByContractAddress": { "message": "Невозможно найти токен? Вы можете вручную добавить любой токен, вставив его адрес. Контактные адреса токена можно найти на $1.", "description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum" @@ -76,6 +137,12 @@ "addFriendsAndAddresses": { "message": "Добавьте друзей и адреса, которым доверяете" }, + "addMemo": { + "message": "Добавить примечание" + }, + "addNFT": { + "message": "Добавить NFT" + }, "addNetwork": { "message": "Добавить сеть" }, @@ -91,12 +158,36 @@ "addToken": { "message": "Добавить токен" }, + "address": { + "message": "Адрес" + }, + "addressBookIcon": { + "message": "Значок адресной книги" + }, "advanced": { "message": "Дополнительно" }, + "advancedBaseGasFeeToolTip": { + "message": "После включения вашей транзакции в блок возмещается любая разница между вашей максимальной базовой комиссией и фактической базовой комиссией. Общая сумма рассчитывается следующим образом: максимальная базовая комиссия (в GWEI) x лимит газа." + }, + "advancedGasFeeDefaultOptIn": { + "message": "Сохранить этот $1 в качестве моего значения по умолчанию для «Дополнительной» настройки." + }, + "advancedGasFeeDefaultOptOut": { + "message": "Всегда использовать эти значения и дополнительную настройку по умолчанию." + }, + "advancedGasFeeModalTitle": { + "message": "Дополнительная плата за газ" + }, + "advancedGasPriceTitle": { + "message": "Цена газа" + }, "advancedOptions": { "message": "Расширенные опции" }, + "advancedPriorityFeeToolTip": { + "message": "Плата за приоритет (также известная как «чаевые майнеру») направляется непосредственно майнерам, чтобы они уделили приоритетное внимание вашей транзакции." + }, "advancedSettingsDescription": { "message": "Доступ к функциям разработчика, загрузка журналов состояния, сброс счета, настройка тестовых сетей и настраиваемый RPC" }, @@ -130,6 +221,10 @@ "allowExternalExtensionTo": { "message": "Разрешить этому внешнему расширению:" }, + "allowSpendToken": { + "message": "Разрешить доступ к вашему $1?", + "description": "$1 is the symbol of the token that are requesting to spend" + }, "allowThisSiteTo": { "message": "Разрешить этому сайту:" }, @@ -175,6 +270,9 @@ "approved": { "message": "Утвержден" }, + "approvedAmountWithColon": { + "message": "Одобренная сумма:" + }, "asset": { "message": "Актив" }, @@ -229,9 +327,43 @@ "balanceOutdated": { "message": "Баланс может быть устаревшим" }, + "baseFee": { + "message": "Базовая комиссия" + }, "basic": { "message": "Базовый" }, + "betaMetamaskDescription": { + "message": "MetaMask, которому доверяют миллионы, — это безопасный кошелек, предоставляющий всем доступ к миру web3." + }, + "betaMetamaskDescriptionExplanation": { + "message": "Используйте эту версию для тестирования будущих функций перед их выпуском. Ваше использование и отзывы помогают нам создать лучшую из возможных версий MetaMask. За использование бета-версии MetaMask взимается наша стандартная комиссия $1 и наша комиссия $2. В бета-версии может быть повышенный риск ошибок. Продолжая, вы принимаете и признаете эти риски, а также риски, указанные в наших Условиях и Условиях бета-версии.", + "description": "$1 represents localization item betaMetamaskDescriptionExplanationTermsLinkText. $2 represents localization item betaMetamaskDescriptionExplanationBetaTermsLinkText" + }, + "betaMetamaskDescriptionExplanationBetaTermsLinkText": { + "message": "Дополнительные условия бета-версии" + }, + "betaMetamaskDescriptionExplanationTermsLinkText": { + "message": "Условия" + }, + "betaMetamaskVersion": { + "message": "Бета-версия MetaMask" + }, + "betaWelcome": { + "message": "Добро пожаловать в бета-версию MetaMask" + }, + "blockExplorerAccountAction": { + "message": "Счет", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Account in Explorer" + }, + "blockExplorerAssetAction": { + "message": "Актив", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Asset in Explorer" + }, + "blockExplorerSwapAction": { + "message": "Своп", + "description": "This is used with viewOnEtherscan e.g View Swap on Etherscan" + }, "blockExplorerUrl": { "message": "URL-адрес проводника блока" }, @@ -251,9 +383,21 @@ "buildContactList": { "message": "Создайте список контактов" }, + "builtAroundTheWorld": { + "message": "MetaMask разработан и создан с учетом потребностей мира." + }, + "busy": { + "message": "Занят" + }, "buy": { "message": "Купить" }, + "buyWithTransak": { + "message": "Купить ETH с помощью Transak" + }, + "buyWithTransakDescription": { + "message": "Transak поддерживает дебетовые карты и банковские переводы (в зависимости от местоположения) в 59 странах. ETH будут зачислены на ваш счет MetaMask." + }, "buyWithWyre": { "message": "Купить ETH с Wyre" }, @@ -269,6 +413,15 @@ "cancel": { "message": "Отмена" }, + "cancelEdit": { + "message": "Отменить редактирование" + }, + "cancelPopoverTitle": { + "message": "Отменить транзакцию" + }, + "cancelSpeedUp": { + "message": "отменить или ускорить транзакцию." + }, "cancellationGasFee": { "message": "Комиссия за отмену топлива" }, @@ -287,6 +440,10 @@ "chromeRequiredForHardwareWallets": { "message": "Вам необходимо использовать MetaMask в Google Chrome, чтобы подключиться к аппаратному кошельку." }, + "clickToConnectLedgerViaWebHID": { + "message": "Нажмите здесь, чтобы подключить свой леджер через WebHID", + "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" + }, "clickToRevealSeed": { "message": "Нажмите здесь, чтобы раскрыть секретные слова" }, @@ -299,6 +456,9 @@ "confirmPassword": { "message": "Подтвердить пароль" }, + "confirmRecoveryPhrase": { + "message": "Подтвердите секретную фразу для восстановления" + }, "confirmSecretBackupPhrase": { "message": "Подтвердите свою секретную резервную фразу" }, @@ -406,12 +566,18 @@ "continue": { "message": "Продолжить" }, + "continueToTransak": { + "message": "Перейти в Transak" + }, "continueToWyre": { "message": "Продолжить к Wyre" }, "contract": { "message": "Контракт" }, + "contractAddress": { + "message": "Адрес контракта" + }, "contractAddressError": { "message": "Вы отправляете токены на адрес контракта токена. Это может привести к потере токенов." }, @@ -430,6 +596,9 @@ "copyPrivateKey": { "message": "Это ваш закрытый ключ (нажмите, чтобы скопировать)" }, + "copyRawTransactionData": { + "message": "Копировать необработанные данные транзакции" + }, "copyToClipboard": { "message": "Скопировать в буфер обмена" }, @@ -445,6 +614,9 @@ "createAccount": { "message": "Создать счет" }, + "createNewWallet": { + "message": "Создать новый кошелек" + }, "createPassword": { "message": "Создать пароль" }, @@ -466,9 +638,22 @@ "currentLanguage": { "message": "Текущий язык" }, + "currentTitle": { + "message": "Текущий:" + }, + "currentlyUnavailable": { + "message": "Недоступно в этой сети" + }, + "custom": { + "message": "Дополнительно" + }, "customGas": { "message": "Настроить топливо" }, + "customGasSettingToolTipMessage": { + "message": "Использовать $1, чтобы настроить цену на газ. Это может сбивать с толку, если вы не знакомы с этим. Взаимодействуйте на свой страх и риск.", + "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold fontweight" + }, "customGasSubTitle": { "message": "Увеличение комиссии может сократить время обработки, но это не гарантируется." }, @@ -478,9 +663,29 @@ "customToken": { "message": "Пользовательский токен" }, + "dappSuggested": { + "message": "Рекомендовано сайтом" + }, + "dappSuggestedGasSettingToolTipMessage": { + "message": "$1 рекомендовал эту цену.", + "description": "$1 is url for the dapp that has suggested gas settings" + }, + "dappSuggestedShortLabel": { + "message": "Сайт" + }, + "dappSuggestedTooltip": { + "message": "$1 рекомендовал эту цену.", + "description": "$1 represents the Dapp's origin" + }, + "data": { + "message": "Данные" + }, "dataBackupFoundInfo": { "message": "Некоторые данные вашего счета были скопированы во время предыдущей установки MetaMask. Они могли включать ваши настройки, контакты и токены. Хотите восстановить эти данные сейчас?" }, + "dataHex": { + "message": "Шестнадцатиричные" + }, "decimal": { "message": "Число десятичных знаков токена" }, @@ -522,6 +727,9 @@ "depositEther": { "message": "Внести Ether" }, + "description": { + "message": "Описание" + }, "details": { "message": "Детали" }, @@ -579,9 +787,122 @@ "edit": { "message": "Редактировать" }, + "editANickname": { + "message": "Изменить ник" + }, + "editAddressNickname": { + "message": "Изменить ник адреса" + }, "editContact": { "message": "Изменить контакт" }, + "editGasEducationButtonText": { + "message": "Как мне выбрать?" + }, + "editGasEducationHighExplanation": { + "message": "Это лучше всего подходит для транзакций, чувствительных ко времени (например, своп), поскольку увеличивает вероятность успешной транзакции. Если обработка свопа занимает слишком много времени, он может завершиться неудачно и привести к потере части вашей платы за газ." + }, + "editGasEducationLowExplanation": { + "message": "Более низкую плату за газ следует использовать только тогда, когда время обработки менее важно. При более низких суммах платы сложнее предсказать, когда ваша транзакция будет выполнена (и будет ли она вообще выполнена)." + }, + "editGasEducationMediumExplanation": { + "message": "Средняя плата за газ хорошо подходит для отправки и вывода средств или других транзакций, не зависящих от времени. Этот параметр чаще всего позволяет успешно выполнить транзакцию." + }, + "editGasEducationModalIntro": { + "message": "Выбор правильной платы за газ зависит от типа транзакции и ее важности для вас." + }, + "editGasEducationModalTitle": { + "message": "Как выбрать?" + }, + "editGasFeeModalTitle": { + "message": "Изменить плату за газ" + }, + "editGasHigh": { + "message": "Высокая" + }, + "editGasLimitOutOfBounds": { + "message": "Лимит газа должен быть не менее $1" + }, + "editGasLimitOutOfBoundsV2": { + "message": "Лимит газа должен быть больше $1 и меньше $2", + "description": "$1 is the minimum limit for gas and $2 is the maximum limit" + }, + "editGasLimitTooltip": { + "message": "Лимит газа — это максимальное количество единиц газа, которое вы готовы использовать. Единицы газа являются множителем «Максимальной платы за приоритет» и «Максимальной комиссии»." + }, + "editGasLow": { + "message": "Низкая" + }, + "editGasMaxBaseFeeGWEIImbalance": { + "message": "Максимальная базовая комиссия не может быть ниже платы за приоритет." + }, + "editGasMaxBaseFeeHigh": { + "message": "Максимальная базовая комиссия выше необходимой" + }, + "editGasMaxBaseFeeLow": { + "message": "Максимальная базовая комиссия низкая для текущих условий сети" + }, + "editGasMaxFeeHigh": { + "message": "Максимальная комиссия выше, чем необходимо" + }, + "editGasMaxFeeLow": { + "message": "Максимальная комиссия слишком низкая для условий сети" + }, + "editGasMaxFeePriorityImbalance": { + "message": "Максимальная комиссия не может быть меньше максимальной платы за приоритет" + }, + "editGasMaxFeeTooltip": { + "message": "Максимальная комиссия — это наибольшая сумма, которую вы заплатите (базовая комиссия + плата за приоритет)." + }, + "editGasMaxPriorityFeeBelowMinimum": { + "message": "Максимальная плата за приоритет должна быть больше 0 GWEI." + }, + "editGasMaxPriorityFeeBelowMinimumV2": { + "message": "Плата за приоритет должна быть больше 0." + }, + "editGasMaxPriorityFeeHigh": { + "message": "Максимальная плата за приоритет выше необходимой. Вы можете заплатить больше, чем нужно." + }, + "editGasMaxPriorityFeeHighV2": { + "message": "Плата за приоритет выше необходимой. Вы можете заплатить больше, чем нужно" + }, + "editGasMaxPriorityFeeLow": { + "message": "Максимальная плата за приоритет низкая для текущих условий сети" + }, + "editGasMaxPriorityFeeLowV2": { + "message": "Плата за приоритет низкая для текущих условий сети" + }, + "editGasMaxPriorityFeeTooltip": { + "message": "Максимальная плата за приоритет (также известная как «чаевые майнеру») направляется непосредственно майнерам, чтобы они уделили приоритетное внимание вашей транзакции." + }, + "editGasMedium": { + "message": "Средняя" + }, + "editGasPriceTooLow": { + "message": "Цена газа должна быть больше 0" + }, + "editGasPriceTooltip": { + "message": "В этой сети необходимо заполнить поле «Цена газа» при отправке транзакции. Цена газа — это сумма, которую вы будете платить за единицу газа." + }, + "editGasSubTextAmountLabel": { + "message": "Максимальная сумма:", + "description": "This is meant to be used as the $1 substitution editGasSubTextAmount" + }, + "editGasSubTextFeeLabel": { + "message": "Максимальная комиссия:" + }, + "editGasTitle": { + "message": "Изменить приоритет" + }, + "editGasTooLow": { + "message": "Время обработки неизвестно" + }, + "editGasTooLowTooltip": { + "message": "Ваша максимальная комиссия или максимальная плата за приоритет могут быть низкими для текущих рыночных условий. Мы не знаем, когда ваша транзакция будет выполнена (и будет ли она вообще выполнена)." + }, + "editGasTooLowWarningTooltip": { + "message": "Это снижает вашу максимальную комиссию, но, если трафик в сети увеличивается, ваша транзакция может быть отложена или завершиться ошибкой." + }, "editNonceField": { "message": "Изменить одноразовый номер" }, @@ -591,6 +912,22 @@ "editPermission": { "message": "Изменить разрешение" }, + "enableAutoDetect": { + "message": " Включить автообнаружение" + }, + "enableFromSettings": { + "message": " Включите его в Настройках." + }, + "enableOpenSeaAPI": { + "message": "Включить API OpenSea" + }, + "enableOpenSeaAPIDescription": { + "message": "Используйте API OpenSea для получения данных NFT. Для автоматического обнаружения NFT используется API OpenSea, и такое обнаружение будет недоступно, если этот API отключен." + }, + "enableToken": { + "message": "активирует для $1", + "description": "$1 is a token symbol, e.g. ETH" + }, "encryptionPublicKeyNotice": { "message": "$1 хотел бы получить ваш открытый ключ шифрования. После вашего согласия этот сайт сможет создавать вам зашифрованные сообщения.", "description": "$1 is the web3 site name" @@ -633,12 +970,21 @@ "message": "Конечная точка вернула другой идентификатор цепочки: $1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "ensIllegalCharacter": { + "message": "Недопустимый символ для ENS." + }, "ensNotFoundOnCurrentNetwork": { "message": "Имя ENS не найдено в текущей сети. Попробуйте переключиться на сеть Ethereum Mainnet." }, + "ensNotSupportedOnNetwork": { + "message": "Сеть не поддерживает ENS" + }, "ensRegistrationError": { "message": "Ошибка при регистрации имени ENS" }, + "ensUnknownError": { + "message": "Ошибка поиска ENS." + }, "enterAnAlias": { "message": "Ввести псевдоним" }, @@ -702,9 +1048,18 @@ "etherscanView": { "message": "Посмотреть счет на Etherscan" }, + "etherscanViewOn": { + "message": "Посмотреть на Etherscan" + }, "expandView": { "message": "Развернуть вид" }, + "experimental": { + "message": "Экспериментальный" + }, + "experimentalSettingsDescription": { + "message": "Обнаружение токенов и прочее" + }, "exportPrivateKey": { "message": "Экспортировать закрытый ключ" }, @@ -724,6 +1079,9 @@ "failureMessage": { "message": "Что-то пошло не так, и мы не смогли завершить действие" }, + "fakeTokenWarning": { + "message": "Кто угодно может создать токен, в том числе создать поддельные версии существующих токенов. Узнайте подробнее о $1" + }, "fast": { "message": "Быстрый" }, @@ -741,6 +1099,21 @@ "message": "Импорт файлов не работает? Нажмите здесь!", "description": "Helps user import their account from a JSON file" }, + "flaskSnapSettingsCardButtonCta": { + "message": "См. подробности", + "description": "Call to action a user can take to see more information about the Snap that is installed" + }, + "flaskSnapSettingsCardDateAddedOn": { + "message": "Добавлена", + "description": "Start of the sentence describing when and where snap was added" + }, + "flaskSnapSettingsCardFrom": { + "message": "от", + "description": "Part of the sentence describing when and where snap was added" + }, + "followUsOnTwitter": { + "message": "Подпишитесь на нас в Twitter" + }, "forbiddenIpfsGateway": { "message": "Запрещенный шлюз IPFS: Укажите шлюз CID" }, @@ -760,6 +1133,19 @@ "functionType": { "message": "Тип функции" }, + "gas": { + "message": "Газ" + }, + "gasDisplayAcknowledgeDappButtonText": { + "message": "Изменить рекомендуемую плату за газ" + }, + "gasDisplayDappWarning": { + "message": "Эта плата за газ была предложена $1. Ее переопредление может вызвать проблемы с вашей транзакцией. При наличии вопросов обратитесь к $1.", + "description": "$1 represents the Dapp's origin" + }, + "gasEstimatesUnavailableWarning": { + "message": "Наши примерные значения низкой, средней и высокой платы недоступны." + }, "gasLimit": { "message": "Предел топлива" }, @@ -773,6 +1159,12 @@ "message": "Лимит топлива должен быть не менее $1", "description": "$1 is the custom gas limit, in decimal." }, + "gasLimitV2": { + "message": "Лимит газа" + }, + "gasOption": { + "message": "Вариант газа" + }, "gasPrice": { "message": "Цена топлива (GWEI)" }, @@ -791,6 +1183,38 @@ "gasPriceInfoTooltipContent": { "message": "Цена топлива указывает количество Ether, которое вы готовы платить за каждую единицу топлива." }, + "gasTimingHoursShort": { + "message": "$1 ч", + "description": "$1 represents a number of hours" + }, + "gasTimingMinutes": { + "message": "$1 минут(-ы)", + "description": "$1 represents a number of minutes" + }, + "gasTimingMinutesShort": { + "message": "$1 мин.", + "description": "$1 represents a number of minutes" + }, + "gasTimingNegative": { + "message": "Может быть, через $1", + "description": "$1 represents an amount of time" + }, + "gasTimingPositive": { + "message": "Вероятно, через < $1", + "description": "$1 represents an amount of time" + }, + "gasTimingSeconds": { + "message": "$1 секунд(-ы)", + "description": "$1 represents a number of seconds" + }, + "gasTimingSecondsShort": { + "message": "$1 сек.", + "description": "$1 represents a number of seconds" + }, + "gasTimingVeryPositive": { + "message": "Весьма вероятно, через < $1", + "description": "$1 represents an amount of time" + }, "gasUsed": { "message": "Использовано топлива" }, @@ -818,9 +1242,15 @@ "getStarted": { "message": "Начать работу" }, + "goBack": { + "message": "Назад" + }, "goerli": { "message": "Тестовая сеть Goerli" }, + "grantedToWithColon": { + "message": "Предоставляется:" + }, "happyToSeeYou": { "message": "Мы рады вас видеть." }, @@ -863,9 +1293,25 @@ "hideZeroBalanceTokens": { "message": "Скрыть токены без баланса" }, + "high": { + "message": "Агрессивный" + }, + "highGasSettingToolTipDialog": { + "message": "Высокая вероятность даже на волатильных рынках" + }, + "highGasSettingToolTipMessage": { + "message": "Используйте $1, чтобы компенсировать скачки сетевого трафика из-за таких событий, как дропы популярных NFT.", + "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" + }, + "highLowercase": { + "message": "высокая" + }, "history": { "message": "История" }, + "id": { + "message": "Ид." + }, "import": { "message": "Импорт", "description": "Button to import an account from a selected file" @@ -873,6 +1319,9 @@ "importAccount": { "message": "Импортировать счет" }, + "importAccountError": { + "message": "Ошибка импорта счета." + }, "importAccountLinkText": { "message": "импортировать с использованием секретной фразы восстановления" }, @@ -886,12 +1335,31 @@ "message": "или $1", "description": "$1 represents the text from `importAccountLinkText` as a link" }, + "importExistingWalletDescription": { + "message": "Введите секретную фразу для восстановления (также известную как «сид-фраза»), которую вы получили при создании кошелька. $1", + "description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link" + }, + "importExistingWalletTitle": { + "message": "Импортируйте существующий кошелек с помощью секретной фразы для восстановления" + }, + "importMyWallet": { + "message": "Импорт моего кошелька" + }, + "importNFTs": { + "message": "Импорт NFT" + }, "importTokenQuestion": { "message": "Импортировать токен?" }, "importTokenWarning": { "message": "Кто угодно может создать токен с любым именем, включая поддельные версии существующих токенов. Добавляйте и торгуйте на свой страх и риск!" }, + "importTokens": { + "message": "импорт токенов" + }, + "importTokensCamelCase": { + "message": "Импорт токенов" + }, "importWallet": { "message": "Импортировать кошелек" }, @@ -915,6 +1383,9 @@ "insufficientFunds": { "message": "Недостаточно средств." }, + "insufficientFundsForGas": { + "message": "Недостаточно средств для оплаты газа" + }, "insufficientTokens": { "message": "Недостаточно токенов." }, @@ -974,10 +1445,19 @@ "ipfsGatewayDescription": { "message": "Введите URL-адрес шлюза IPFS CID, который будет использоваться для разрешения содержимого ENS." }, + "jsDeliver": { + "message": "jsDeliver" + }, "jsonFile": { "message": "Файл JSON", "description": "format for importing an account" }, + "keystone": { + "message": "Keystone" + }, + "keystoneTutorial": { + "message": " (Руководства)" + }, "knownAddressRecipient": { "message": "Известный адрес контракта." }, @@ -990,12 +1470,57 @@ "lastConnected": { "message": "Последнее подключение" }, + "layer1Fees": { + "message": "Комиссии 1-го уровня" + }, + "learmMoreAboutGas": { + "message": "Хотите $1 о газе?" + }, + "learnCancelSpeeedup": { + "message": "Узнайте, как $1", + "description": "$1 is link to cancel or speed up transactions" + }, "learnMore": { "message": "Дополнительная информация" }, + "learnMoreUpperCase": { + "message": "Дополнительная информация" + }, + "learnScamRisk": { + "message": "мошенничество и риски безопасности." + }, "ledgerAccountRestriction": { "message": "Вам необходимо использовать свой последний счет, прежде чем вы сможете добавить новый." }, + "ledgerConnectionInstructionCloseOtherApps": { + "message": "Закройте все остальные программы, подключенные к вашему устройству, и нажмите здесь для обновления." + }, + "ledgerConnectionInstructionHeader": { + "message": "Перед нажатием «Подтвердить»:" + }, + "ledgerConnectionInstructionStepFour": { + "message": "Включите «данные смарт-контракта» или «слепую подпись» на своем леджере" + }, + "ledgerConnectionInstructionStepOne": { + "message": "Включите «Использовать Ledger Live» в разделе «Настройки»> «Дополнительно»." + }, + "ledgerConnectionInstructionStepThree": { + "message": "Подключите леджер и выберите приложение Ethereum" + }, + "ledgerConnectionInstructionStepTwo": { + "message": "Откройте и разблокируйте приложение Ledger Live" + }, + "ledgerConnectionPreferenceDescription": { + "message": "Настройте подключение леджера к MetaMask. Рекомендуется $1, но возможны и другие варианты. См. подробнее здесь: $2", + "description": "A description that appears above a dropdown where users can select between up to three options - Ledger Live, U2F or WebHID - depending on what is supported in their browser. $1 is the recommended browser option, it will be either WebHID or U2f. $2 is a link to an article where users can learn more, but will be the translation of the learnMore message." + }, + "ledgerDeviceOpenFailureMessage": { + "message": "Не удалось открыть леджер. Он может быть подключен к другой программе. Закройте Ledger Live или другие приложения, подключенные к леджеру, и снова попробуйте подключиться." + }, + "ledgerLive": { + "message": "Ledger Live", + "description": "The name of a desktop app that can be used with your ledger device. We can also use it to connect a users Ledger device to MetaMask." + }, "ledgerLiveApp": { "message": "Приложение Ledger Live" }, @@ -1005,12 +1530,22 @@ "ledgerTimeout": { "message": "Ledger Live слишком долго не отвечает, или время ожидания подключения истекло. Убедитесь, что приложение Ledger Live открыто и устройство разблокировано." }, + "ledgerTransportChangeWarning": { + "message": "Если приложение Ledger Live открыто, отключите любое открытое соединение с Ledger Live и закройте это приложение." + }, + "ledgerWebHIDNotConnectedErrorMessage": { + "message": "Леджер не подключен. Если хотите подключить леджер, нажмите «Продолжить» еще раз и подтвердите HID-подключение", + "description": "An error message shown to the user during the hardware connect flow." + }, "letsGoSetUp": { "message": "Да, давайте настроим!" }, "likeToImportTokens": { "message": "Вы хотели бы добавить эти токены?" }, + "link": { + "message": "Привязать" + }, "links": { "message": "Ссылки" }, @@ -1032,15 +1567,48 @@ "lockTimeTooGreat": { "message": "Время блокировки слишком велико" }, + "low": { + "message": "Низкая" + }, + "lowGasSettingToolTipMessage": { + "message": "Используйте $1, чтобы дождаться более низкой цены. Оценки времени намного менее точны, поскольку цены в некоторой степени непредсказуемы.", + "description": "$1 is key 'low' separated here so that it can be passed in with bold fontweight" + }, + "lowLowercase": { + "message": "низкая" + }, + "lowPriorityMessage": { + "message": "Последующие транзакции будут помещены в очередь после этой. Последний раз эту цену видели некоторое время назад." + }, "mainnet": { "message": "Сеть Ethereum Mainnet" }, "makeAnotherSwap": { "message": "Создать новый своп" }, + "makeSureNoOneWatching": { + "message": "Убедитесь, что никто не смотрит на ваш экран", + "description": "Warning to users to be care while creating and saving their new Secret Recovery Phrase" + }, "max": { "message": "Макс." }, + "maxBaseFee": { + "message": "Максимальная базовая комиссия" + }, + "maxFee": { + "message": "Максимальная комиссия" + }, + "maxPriorityFee": { + "message": "Максимальная плата за приоритет" + }, + "medium": { + "message": "Рынок" + }, + "mediumGasSettingToolTipMessage": { + "message": "Используйте $1 для быстрой обработки по текущей рыночной цене.", + "description": "$1 is key 'medium' (text: 'Market') separated here so that it can be passed in with bold fontweight" + }, "memo": { "message": "памятка" }, @@ -1071,6 +1639,9 @@ "metametricsCommitmentsAllowOptOut": { "message": "Всегда разрешать вам отказаться через настройки" }, + "metametricsCommitmentsAllowOptOut2": { + "message": "Всегда можно отказаться в настройках" + }, "metametricsCommitmentsBoldNever": { "message": "Никогда", "description": "This string is localized separately from some of the commitments so that we can bold it" @@ -1078,6 +1649,9 @@ "metametricsCommitmentsIntro": { "message": "MetaMask не будет..." }, + "metametricsCommitmentsNeverCollect": { + "message": "Никогда не собирает ключи, адреса, транзакции, балансы, хэши или любую личную информацию" + }, "metametricsCommitmentsNeverCollectIP": { "message": "$1 не сохранять ваш полный IP-адрес", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" @@ -1086,6 +1660,12 @@ "message": "$1 не хранить ключи, адреса, транзакции, балансы, хэши или любую персональную информацию", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" }, + "metametricsCommitmentsNeverIP": { + "message": "Никогда не собирает ваш полный IP-адрес" + }, + "metametricsCommitmentsNeverSell": { + "message": "Никогда не продает данные ради прибыли. Никогда!" + }, "metametricsCommitmentsNeverSellDataForProfit": { "message": "$1 не продавать данные для прибыли. Никогда!", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" @@ -1099,6 +1679,12 @@ "metametricsOptInDescription": { "message": "MetaMask хотел бы собрать основные данные об использовании, чтобы лучше понять, как наши пользователи взаимодействуют с расширением. Эти данные будут использоваться для постоянного улучшения удобства и опыта использования нашего продукта и экосистемы Ethereum." }, + "metametricsOptInDescription2": { + "message": "Мы хотели бы получить базовые данные об использовании, чтобы повысить удобство использования нашего продукта. Эти показатели будут..." + }, + "metametricsTitle": { + "message": "Присоединяйтесь к более чем 6 млн пользователей, чтобы улучшить MetaMask" + }, "mismatchedChain": { "message": "Сведения о сети для этого идентификатора цепочки не совпадают с указанными в записях. Мы рекомендуем $1, прежде чем продолжить.", "description": "$1 is a clickable link with text defined by the 'mismatchedChainLinkText' key" @@ -1107,6 +1693,15 @@ "message": "проверить сведения о сети", "description": "Serves as link text for the 'mismatchedChain' key. This text will be embedded inside the translation for that key." }, + "missingNFT": { + "message": "Не видите свои NFT?" + }, + "missingToken": { + "message": "Не видите свой токен?" + }, + "mobileSyncWarning": { + "message": "Функция «Синхронизация с расширением» временно отключена. Если вы хотите использовать свой кошелек из расширения браузера в мобильной версии MetaMask, тогда в мобильном приложении вернитесь к параметрам настройки кошелька и выберите параметр «Импортировать с помощью секретной фразы для восстановления». Используйте секретную фразу своего кошелька из расширения, чтобы импортировать кошелек на мобильное устройство." + }, "mustSelectOne": { "message": "Необходимо выбрать хотя бы 1 токен." }, @@ -1123,9 +1718,15 @@ "message": "Нужна помощь? Обратитесь в $1", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" }, + "needHelpFeedback": { + "message": "Оставьте отзыв" + }, "needHelpLinkText": { "message": "Поддержка MetaMask" }, + "needHelpSubmitTicket": { + "message": "Отправить запрос о поддержке" + }, "needImportFile": { "message": "Вы должны выбрать файл для импорта.", "description": "User is important an account and needs to add a file to continue" @@ -1148,6 +1749,12 @@ "networkNameEthereum": { "message": "Ethereum" }, + "networkNamePolygon": { + "message": "Polygon" + }, + "networkNameRinkeby": { + "message": "Rinkeby" + }, "networkNameTestnet": { "message": "Тестовая сеть" }, @@ -1157,6 +1764,20 @@ "networkSettingsDescription": { "message": "Добавление и редактирование пользовательских сетей RPC" }, + "networkStatus": { + "message": "Состояние сети" + }, + "networkStatusBaseFeeTooltip": { + "message": "Базовая комиссия устанавливается сетью и меняется каждые 13–14 секунд. Наши варианты $1 и $2 учитывают внезапный рост комиссии.", + "description": "$1 and $2 are bold text for Medium and Aggressive respectively." + }, + "networkStatusPriorityFeeTooltip": { + "message": "Диапазон платы за приоритет (также известная как «чаевые майнеру»), которая направляется непосредственно майнерам, чтобы они уделили приоритетное внимание вашей транзакции." + }, + "networkStatusStabilityFeeTooltip": { + "message": "Относительная плата за газ составляет $1 за последние 72 часа.", + "description": "$1 is networks stability value - stable, low, high" + }, "networkURL": { "message": "URL-адрес сети" }, @@ -1179,12 +1800,27 @@ "message": "Счет $1", "description": "Default name of next account to be created on create account screen" }, + "newCollectibleAddFailed": { + "message": "Причина, по которой не был добавлен коллекционный актив: $1" + }, + "newCollectibleAddedMessage": { + "message": "Коллекционный актив успешно добавлен!" + }, "newContact": { "message": "Новый контакт" }, "newContract": { "message": "Новый контракт" }, + "newNFTsDetected": { + "message": "Новинка! Обнаружение NFT" + }, + "newNFTsDetectedInfo": { + "message": "Разрешите MetaMask автоматически обнаруживать NFT из Opensea и отображать их в вашем кошельке MetaMask." + }, + "newNetworkAdded": { + "message": "«$1» успешно добавлен!" + }, "newPassword": { "message": "Новый пароль (мин.8 знаков)" }, @@ -1197,6 +1833,9 @@ "newTransactionFee": { "message": "Новые комиссии за транзакцию" }, + "newValues": { + "message": "новые значения" + }, "next": { "message": "Далее" }, @@ -1204,6 +1843,15 @@ "message": "Одноразовый номер больше, чем предложенный одноразовый номер $1", "description": "The next nonce according to MetaMask's internal logic" }, + "nftTokenIdPlaceholder": { + "message": "Введите ид. коллекционного актива" + }, + "nfts": { + "message": "NFT" + }, + "nickname": { + "message": "Ник" + }, "noAccountsFound": { "message": "По данному поисковому запросу счетов не найдено" }, @@ -1213,9 +1861,15 @@ "noAlreadyHaveSeed": { "message": "Нет, у меня уже есть секретная фраза восстановления" }, + "noConversionDateAvailable": { + "message": "Дата конвертации валюты недоступна" + }, "noConversionRateAvailable": { "message": "Нет доступного курса обмена" }, + "noNFTs": { + "message": "Пока нет NFT" + }, "noThanks": { "message": "Нет, спасибо" }, @@ -1240,6 +1894,9 @@ "nonceFieldHeading": { "message": "Индивидуальные одноразовый номер" }, + "notBusy": { + "message": "Не занят" + }, "notCurrentAccount": { "message": "Это правильный счет? Он отличается от выбранного в настоящее время счета в вашем кошельке." }, @@ -1298,6 +1955,43 @@ "message": "Обновление поддержки Ledger для пользователей Chrome", "description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update" }, + "notifications7DescriptionOne": { + "message": "MetaMask v10.1.0 включает новую поддержку транзакций EIP-1559 при использовании леджеров.", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for ledger and EIP1559 in v10.1.0" + }, + "notifications7DescriptionTwo": { + "message": "Перед выполнением транзакций в сети Ethereum Mainnet убедитесь, что на вашем леджере установлена последняя версия прошивки.", + "description": "Description of a notification in the 'See What's New' popup. Describes the need to update ledger firmware." + }, + "notifications7Title": { + "message": "Обновление прошивки леджера", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." + }, + "notifications8ActionText": { + "message": "Перейти в Дополнительные настройки", + "description": "Description on an action button that appears in the What's New popup. Tells the user that if they click it, they will go to our Advanced Settings page." + }, + "notifications8DescriptionOne": { + "message": "Начиная с версии MetaMask 10.4.0, вам больше не требуется Ledger Live для подключения леджера к MetaMask.", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for how Ledger Live is no longer needed to connect the device." + }, + "notifications8DescriptionTwo": { + "message": "Чтобы упростить и повысить стабильность работы с леджером, перейдите на вкладку «Дополнительно» в настройках и переключите «Предпочитаемый тип подключения к леджеру» на «WebHID».", + "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." + }, + "notifications8Title": { + "message": "Улучшение связи с леджером", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users that there is an improvement in how they can connect their device." + }, + "notifications9DescriptionOne": { + "message": "Теперь мы предоставляем вам больше информации на вкладке «Данные» при подтверждении транзакций со смарт-контрактами." + }, + "notifications9DescriptionTwo": { + "message": "Теперь вы можете лучше понять реквизиты своей транзакции перед подтверждением и проще добавлять адреса транзакций в адресную книгу, что поможет вам принимать безопасные и обоснованные решения." + }, + "notifications9Title": { + "message": "👓 Мы упрощаем просмотр реквизитов транзакций." + }, "ofTextNofM": { "message": "из" }, @@ -1313,16 +2007,79 @@ "on": { "message": "Вкл." }, + "onboardingCreateWallet": { + "message": "Создать новый кошелек" + }, + "onboardingImportWallet": { + "message": "Импорт существующего кошелька" + }, + "onboardingPinExtensionBillboardAccess": { + "message": "Полный доступ" + }, + "onboardingPinExtensionBillboardDescription": { + "message": "Эти расширения могут просматривать и изменять информацию" + }, + "onboardingPinExtensionBillboardDescription2": { + "message": "на этом сайте." + }, + "onboardingPinExtensionBillboardTitle": { + "message": "Расширения" + }, + "onboardingPinExtensionChrome": { + "message": "Нажмите на значок расширения браузера" + }, + "onboardingPinExtensionDescription": { + "message": "Закрепите расширение MetaMask в браузере для его постоянной доступности и легкого просмотра подтверждений транзакций." + }, + "onboardingPinExtensionDescription2": { + "message": "Вы можете открыть MetaMask, нажав на расширение, и получить доступ к своему кошельку одним щелчком мыши." + }, + "onboardingPinExtensionDescription3": { + "message": "Нажмите на значок расширения браузера для мгновенного перехода к нему" + }, + "onboardingPinExtensionLabel": { + "message": "Закрепите MetaMask" + }, + "onboardingPinExtensionStep1": { + "message": "1" + }, + "onboardingPinExtensionStep2": { + "message": "2" + }, + "onboardingPinExtensionTitle": { + "message": "Установка MetaMask завершена!" + }, "onboardingReturnNotice": { "message": "Кнопка «$1» закрывает эту вкладку и возвращает на сайт $2", "description": "Return the user to the site that initiated onboarding" }, + "onboardingShowIncomingTransactionsDescription": { + "message": "Отображение входящих транзакций в вашем кошельке зависит от связи с $1. Etherscan будет иметь доступ к вашему адресу Ethereum и вашему IP-адресу. Посмотрите $2.", + "description": "$1 is a clickable link with text defined by the 'etherscan' key. $2 is a clickable link with text defined by the 'privacyMsg' key." + }, + "onboardingUsePhishingDetectionDescription": { + "message": "Оповещения об обнаружении фишинга зависят от связи с $1. jsDeliver получит доступ к вашему IP-адресу. Посмотрите $ 2.", + "description": "The $1 is the word 'jsDeliver', from key 'jsDeliver' and $2 is the words Privacy Policy from key 'privacyMsg', both separated here so that it can be wrapped as a link" + }, "onlyAddTrustedNetworks": { "message": "Вредоносный сетевой провайдер может дезинформировать о состоянии блокчейна и записывать ваши действия в сети. Добавляйте только те пользовательские сети, которым доверяете." }, "onlyConnectTrust": { "message": "Подключайтесь только к сайтам, которым доверяете." }, + "openFullScreenForLedgerWebHid": { + "message": "Откройте MetaMask в полноэкранном режиме, чтобы подключить свой леджер через WebHID.", + "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." + }, + "optional": { + "message": "Необязательно" + }, + "optionalWithParanthesis": { + "message": "(Необязательно)" + }, + "or": { + "message": "или" + }, "origin": { "message": "Источник" }, @@ -1341,6 +2098,12 @@ "passwordNotLongEnough": { "message": "Пароль недостаточно длинный" }, + "passwordSetupDetails": { + "message": "Этот пароль разблокирует ваш кошелек MetaMask только на этом устройстве. MetaMask не может восстановить этот пароль." + }, + "passwordTermsWarning": { + "message": "Я понимаю, что MetaMask не может восстановить этот пароль для меня. $1" + }, "passwordsDontMatch": { "message": "Пароли не совпадают" }, @@ -1351,6 +2114,19 @@ "pending": { "message": "В ожидании" }, + "pendingTransactionInfo": { + "message": "Эта транзакция не будет обработана до ее завершения." + }, + "pendingTransactionMultiple": { + "message": "У вас есть ($1) ожидающих транзакции(-ий)." + }, + "pendingTransactionSingle": { + "message": "У вас есть (1) ожидающая транзакция.", + "description": "$1 is count of pending transactions" + }, + "permissionRequest": { + "message": "Запрос разрешения" + }, "permissions": { "message": "Разрешения" }, @@ -1361,6 +2137,10 @@ "message": "+ $1 еще", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, + "preferredLedgerConnectionType": { + "message": "Предпочтительный тип подключения к леджеру", + "description": "A header for a dropdown in the advanced section of settings. Appears above the ledgerConnectionPreferenceDescription message" + }, "prev": { "message": "Предыдущее" }, @@ -1370,6 +2150,12 @@ "primaryCurrencySettingDescription": { "message": "Выберите Native, чтобы установить приоритет отображения значений в собственной валюте цепи (например, ETH). Выберите Fiat, чтобы установить приоритет отображения значений в выбранной валюте конвертации." }, + "priorityFee": { + "message": "Плата за приоритет" + }, + "priorityFeeProperCase": { + "message": "Плата за приоритет" + }, "privacyMsg": { "message": "Политика конфиденциальности" }, @@ -1383,6 +2169,9 @@ "privateNetwork": { "message": "Закрытая сеть" }, + "proceedWithTransaction": { + "message": "Я все равно хочу продолжить" + }, "proposedApprovalLimit": { "message": "Предлагаемый предел утверждения" }, @@ -1410,6 +2199,9 @@ "recipientAddressPlaceholder": { "message": "Поиск, публичный адрес (0x) или ENS" }, + "recommendedGasLabel": { + "message": "Рекомендовано" + }, "recoveryPhraseReminderBackupStart": { "message": "Начать здесь" }, @@ -1434,6 +2226,9 @@ "recoveryPhraseReminderTitle": { "message": "Защитите свои активы" }, + "refreshList": { + "message": "Обновить список" + }, "reject": { "message": "Отклонить" }, @@ -1449,6 +2244,9 @@ "rejected": { "message": "Отклонены" }, + "remember": { + "message": "Помните:" + }, "remindMeLater": { "message": "Напомните мне позже" }, @@ -1461,6 +2259,9 @@ "removeAccountDescription": { "message": "Этот счет будет удален из вашего кошелька. Перед продолжением убедитесь, что у вас есть секретная фраза восстановления или закрытый ключ для этой импортированного счета. Вы можете импортировать или снова создать счета из раскрывающегося списка. " }, + "removeNFT": { + "message": "Удалить NFT" + }, "requestsAwaitingAcknowledgement": { "message": "запросы, ожидающие подтверждения" }, @@ -1549,12 +2350,33 @@ "secretPhrase": { "message": "Введите здесь секретную фразу, чтобы восстановить хранилище." }, + "secretPhraseWarning": { + "message": "Если вы выполняете восстановление с использованием другой секретной фразы для восстановления, ваш текущий кошелек, счета и активы будут удалены из этого приложения без возможности восстановления. Это действие нельзя отменить." + }, + "secretRecoveryPhrase": { + "message": "Секретная фраза для восстановления" + }, + "secureWallet": { + "message": "Безопасный кошелек" + }, "securityAndPrivacy": { "message": "Безопасность и конфиденциальность" }, "securitySettingsDescription": { "message": "Настройки конфиденциальности и секретная фраза восстановления кошелька" }, + "seedPhraseConfirm": { + "message": "Подтвердите секретную фразу для восстановления" + }, + "seedPhraseEnterMissingWords": { + "message": "Подтвердите секретную фразу для восстановления" + }, + "seedPhraseIntroNotRecommendedButtonCopy": { + "message": "Напомнить позже (не рекомендуется)" + }, + "seedPhraseIntroRecommendedButtonCopy": { + "message": "Защитить мой кошелек (рекомендуется)" + }, "seedPhraseIntroSidebarBulletFour": { "message": "Запишите и храните в нескольких секретных местах." }, @@ -1600,6 +2422,12 @@ "seedPhraseReq": { "message": "Секретные фразы восстановления содержат 12, 15, 18, 21 или 24 слова" }, + "seedPhraseWriteDownDetails": { + "message": "Запишите эту секретную фразу для восстановления из 12 слов и сохраните ее в надежном месте, доступном только вам." + }, + "seedPhraseWriteDownHeader": { + "message": "Запишите секретную фразу для восстановления" + }, "selectAHigherGasFee": { "message": "Выберите более высокую плату за топливо, чтобы ускорить обработку транзакции. *" }, @@ -1621,6 +2449,9 @@ "selectHdPath": { "message": "Выберите путь HD" }, + "selectNFTPrivacyPreference": { + "message": "Включите обнаружение NFT в настройках" + }, "selectPathHelp": { "message": "Если вы не видите имеющиеся счета Ledger ниже, попробуйте изменить путь на «Legacy (MEW / MyCrypto)»" }, @@ -1640,15 +2471,31 @@ "message": "Отправить $1", "description": "Symbol of the specified token" }, + "sendTo": { + "message": "Отправить в адрес" + }, "sendTokens": { "message": "Отправить токены" }, + "sendingNativeAsset": { + "message": "Отправка $1...", + "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" + }, "separateEachWord": { "message": "Отделяйте каждое слово одним пробелом" }, + "setAdvancedPrivacySettings": { + "message": "Задать дополнительные настройки конфиденциальности" + }, + "setAdvancedPrivacySettingsDetails": { + "message": "MetaMask использует эти доверенные сторонние сервисы для повышения удобства использования и безопасности продукта." + }, "settings": { "message": "Настройки" }, + "show": { + "message": "Показать" + }, "showAdvancedGasInline": { "message": "Расширенное управление топливом" }, @@ -1667,6 +2514,9 @@ "showHexDataDescription": { "message": "Выберите эту опцию, чтобы отобразить поле шестнадцатеричных данных на экране отправки" }, + "showHide": { + "message": "Показать/скрыть" + }, "showIncomingTransactions": { "message": "Показать входящие транзакции" }, @@ -1679,9 +2529,18 @@ "showPrivateKeys": { "message": "Показать закрытые ключи" }, + "showRecommendations": { + "message": "Показать рекомендации" + }, "showSeedPhrase": { "message": "Показать секретную фразу восстановления" }, + "showTestnetNetworks": { + "message": "Показать тестовые сети" + }, + "showTestnetNetworksDescription": { + "message": "Выберите эту опцию, чтобы показать тестовые сети в списке сетей" + }, "sigRequest": { "message": "Запрос на подпись" }, @@ -1700,18 +2559,45 @@ "signed": { "message": "Подписан" }, + "simulationErrorMessage": { + "message": "Ожидается, что эта транзакция завершится неудачно. Предполагается, что попытка выполнить ее будет дорогостоящей, но потерпит неудачу, и поэтому ее не рекомендуется выполнять." + }, + "simulationErrorMessageV2": { + "message": "Мы не смогли оценить размер платы за газ. В контракте может быть ошибка, и эта транзакция может завершиться неудачно." + }, + "skip": { + "message": "Пропустить" + }, + "skipAccountSecurity": { + "message": "Пропустить безопасность счета?" + }, + "skipAccountSecurityDetails": { + "message": "Я понимаю, что до тех пор, пока я не создам резервную копию своей секретной фразы для восстановления, я могу потерять доступ ко всем своим счетам и всем средствам на них." + }, "slow": { "message": "Медленный" }, "somethingWentWrong": { "message": "Упс! Что-то пошло не так." }, + "source": { + "message": "Источник" + }, "speedUp": { "message": "Ускорить" }, "speedUpCancellation": { "message": "Ускорить эту отмену" }, + "speedUpExplanation": { + "message": "Мы обновили плату за газ с учетом текущих условий сети и увеличили ее как минимум на 10% (это требование сети)." + }, + "speedUpPopoverTitle": { + "message": "Ускорить транзакцию" + }, + "speedUpTooltipText": { + "message": "Новая плата за газ" + }, "speedUpTransaction": { "message": "Ускорить эту транзакцию" }, @@ -1734,6 +2620,12 @@ "spendLimitTooLarge": { "message": "Лимит расходов слишком велик" }, + "stable": { + "message": "Стабильная" + }, + "stableLowercase": { + "message": "стабильная" + }, "stateLogError": { "message": "Ошибка при получении журналов состояния." }, @@ -1752,6 +2644,13 @@ "statusNotConnected": { "message": "Не подключен" }, + "step1LatticeWallet": { + "message": "Убедитесь, что Lattice1 готово к подключению" + }, + "step1LatticeWalletMsg": { + "message": "Вы можете подключить MetaMask к своему устройству Lattice1, как только оно будет настроено и подключено к сети. Разблокируйте устройство и подготовьте свой идентификатор устройства. Подробнее об использовании аппаратных кошельков см. в $1", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, "step1LedgerWallet": { "message": "Скачать приложение Ledger" }, @@ -1815,6 +2714,10 @@ "message": "Вам нужно еще $1 $2 для завершения этого свопа", "description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol." }, + "swapBestOfNQuotes": { + "message": "Лучшие котировки $1.", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, "swapBuildQuotePlaceHolderText": { "message": "Нет доступных токенов соответствующих $1", "description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text" @@ -1834,6 +2737,9 @@ "swapDecentralizedExchange": { "message": "Децентрализованная обмен" }, + "swapDirectContract": { + "message": "Прямой контракт" + }, "swapEditLimit": { "message": "Изменить лимит" }, @@ -1841,6 +2747,10 @@ "message": "Это необходимо и дает MetaMask разрешение на своп вашего $1.", "description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps." }, + "swapEnableTokenForSwapping": { + "message": "Это $1 возможность свопа", + "description": "$1 is for the 'enableToken' key, e.g. 'enable ETH'" + }, "swapEstimatedNetworkFees": { "message": "Ориентировочные комиссии сети" }, @@ -1854,6 +2764,9 @@ "swapFailedErrorTitle": { "message": "Своп не удался" }, + "swapFetchingQuotes": { + "message": "Получение котировок..." + }, "swapFetchingQuotesErrorDescription": { "message": "Хмм... Что-то пошло не так. Повторите попытку или, если ошибка не исчезнет, обратитесь в службу поддержки." }, @@ -1867,12 +2780,26 @@ "message": "Своп $1 на $2", "description": "Tells a user that they need to confirm on their hardware wallet a swap of 2 tokens. $1 is a source token and $2 is a destination token" }, + "swapGasFeesDetails": { + "message": "Плата за газ является примерной и будет колебаться в зависимости от сетевого трафика и сложности транзакции." + }, + "swapGasFeesLearnMore": { + "message": "Узнать больше о плате за газ" + }, "swapGasFeesSplit": { "message": "Плата за газ, указанная на предыдущем экране, распределяется между этими двумя транзакциями." }, + "swapGasFeesSummary": { + "message": "Плата за газ выплачивается майнерам, которые обрабатывают транзакции в сети $1. MetaMask не получает прибыли от платы за газ.", + "description": "$1 is the selected network, e.g. Ethereum or BSC" + }, "swapHighSlippageWarning": { "message": "Величина проскальзывания очень велика." }, + "swapIncludesMMFee": { + "message": "Включает комиссию за использование MetaMask в размере $1%.", + "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." + }, "swapLowSlippageError": { "message": "Транзакции могут завершиться неудачей, максимальное проскальзывание слишком мало." }, @@ -1886,6 +2813,10 @@ "message": "Мы всегда находим лучшую цену из лучших источников ликвидности. В эту котировку автоматически включается комиссия в размере $1%.", "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." }, + "swapNQuotesWithDot": { + "message": "$1 котировки(-ок).", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, "swapNewQuoteIn": { "message": "Новые котировки в $1", "description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00" @@ -1978,6 +2909,12 @@ "swapSourceInfo": { "message": "Мы ищем несколько источников ликвидности (биржи, агрегаторы и профессиональные продавцы), чтобы найти лучшие цены и самые низкие сетевые комиссии." }, + "swapSuggested": { + "message": "Рекомендуется своп" + }, + "swapSuggestedGasSettingToolTipMessage": { + "message": "Своп — это сложная транзакция, выполнение которой зависят от отведенного времени. Мы рекомендуем эту плату за газ для хорошего баланса между стоимостью и уверенностью в успешном свопе." + }, "swapSwapFrom": { "message": "Своп с" }, @@ -2016,6 +2953,10 @@ "message": "Токен проверен в таком количестве источников: $1.", "description": "Indicates the number of token information sources that recognize the symbol + address. $1 is a decimal number." }, + "swapTooManyDecimalsError": { + "message": "$1 позволяет использовать до $2 десятичных знаков", + "description": "$1 is a token symbol and $2 is the max. number of decimals allowed for the token" + }, "swapTransactionComplete": { "message": "Транзакция завершена" }, @@ -2076,6 +3017,12 @@ "symbolBetweenZeroTwelve": { "message": "Символ должен состоять из 11 или менее знаков." }, + "syncFailed": { + "message": "Ошибка синхронизации" + }, + "syncInProgress": { + "message": "Выполняется синхронизация" + }, "syncWithMobile": { "message": "Синхронизировать с мобильным устройством" }, @@ -2118,6 +3065,9 @@ "thisWillCreate": { "message": "Это создаст новый кошелек и секретную фразу восстановления" }, + "time": { + "message": "Время" + }, "tips": { "message": "Советы" }, @@ -2128,6 +3078,10 @@ "message": "Адресат $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, + "toggleTestNetworks": { + "message": "$1 тестовых сетей", + "description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open to the advanced settings where users can enable the display of test networks in the network dropdown." + }, "token": { "message": "Токен" }, @@ -2140,6 +3094,9 @@ "tokenDecimalFetchFailed": { "message": "Укажите число десятичных знаков токена." }, + "tokenDetectionAnnouncement": { + "message": "Новинка! Улучшенное обнаружение токенов доступно в сети Ethereum Mainnet в качестве экспериментальной функции. $1" + }, "tokenSymbol": { "message": "Символ токена" }, @@ -2164,6 +3121,48 @@ "transactionCreated": { "message": "Сделка создана со стоимостью $1 в $2." }, + "transactionData": { + "message": "Данные транзакции" + }, + "transactionDecodingAccreditationDecoded": { + "message": "Расшифровано Truffle" + }, + "transactionDecodingAccreditationVerified": { + "message": "Подтвержденный контракт на $1" + }, + "transactionDecodingUnsupportedNetworkError": { + "message": "Расшифровка транзакции недоступна для chainId $1" + }, + "transactionDetailDappGasMoreInfo": { + "message": "Рекомендовано сайтом" + }, + "transactionDetailDappGasTooltip": { + "message": "Отредактируйте, чтобы использовать рекомендованную MetaMask плату за газ с учетом последнего блока." + }, + "transactionDetailGasHeading": { + "message": "Примерная плата за газ" + }, + "transactionDetailGasInfoV2": { + "message": "примерная" + }, + "transactionDetailGasTooltipConversion": { + "message": "Подробнее о плате за газ" + }, + "transactionDetailGasTooltipExplanation": { + "message": "Плата за газ устанавливается сетью и варьируется в зависимости от сетевого трафика и сложности транзакции." + }, + "transactionDetailGasTooltipIntro": { + "message": "Плата за газ выплачивается майнерам, которые обрабатывают транзакции в сети $1. MetaMask не получает прибыли от платы за газ." + }, + "transactionDetailGasTotalSubtitle": { + "message": "Сумма + плата за газ" + }, + "transactionDetailLayer2GasHeading": { + "message": "Плата за газ 2-го уровня" + }, + "transactionDetailMultiLayerTotalSubtitle": { + "message": "Сумма + комиссии" + }, "transactionDropped": { "message": "Транзакция прекращена в $2." }, @@ -2179,6 +3178,27 @@ "transactionFee": { "message": "Комиссия за транзакцию" }, + "transactionHistoryBaseFee": { + "message": "Базовая комиссия (GWEI)" + }, + "transactionHistoryL1GasLabel": { + "message": "Итого платы за газ L1" + }, + "transactionHistoryL2GasLimitLabel": { + "message": "Лимит газа L2" + }, + "transactionHistoryL2GasPriceLabel": { + "message": "Цена газа L2" + }, + "transactionHistoryMaxFeePerGas": { + "message": "Макс. плата за газ" + }, + "transactionHistoryPriorityFee": { + "message": "Плата за приоритет (GWEI)" + }, + "transactionHistoryTotalGasFee": { + "message": "Итого платы за газ" + }, "transactionResubmitted": { "message": "Попытка повторно отправить транзакцию с платой за топливо, увеличенной до $1 в $2" }, @@ -2205,12 +3225,31 @@ "message": "У нас возникли проблемы с загрузкой вашего баланса токенов. Вы можете просмотреть их ", "description": "Followed by a link (here) to view token balances" }, + "trustSiteApprovePermission": { + "message": "Предоставляя разрешение, вы предоставляете следующему $1 доступ к вашим средствам." + }, "tryAgain": { "message": "Попробуйте еще раз" }, + "tryAnywayOption": { + "message": "Я все равно попробую" + }, + "turnOnTokenDetection": { + "message": "Включите расширенное обнаружение токенов" + }, + "twelveHrTitle": { + "message": "12 ч:" + }, + "txInsightsNotSupported": { + "message": "Аналитика транзакций сейчас не поддерживается для этого контракта." + }, "typePassword": { "message": "Введите свой пароль MetaMask" }, + "u2f": { + "message": "U2F:", + "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." + }, "unapproved": { "message": "Одобрение снято" }, @@ -2249,6 +3288,10 @@ "message": "проверить сведения о сети", "description": "Serves as link text for the 'unrecognizedChain' key. This text will be embedded inside the translation for that key." }, + "unsendableAsset": { + "message": "Отправка коллекционных активов (ERC-721) сейчас не поддерживается", + "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" + }, "updatedWithDate": { "message": "Обновлено $1" }, @@ -2258,12 +3301,24 @@ "urlExistsErrorMsg": { "message": "Это URL в настоящее время используется сетью $1." }, + "useCollectibleDetection": { + "message": "Автообнаружение NFT" + }, + "useCollectibleDetectionDescription": { + "message": "Отображение медиафайлов и данных NFT может раскрыть ваш IP-адрес централизованным серверам. Сторонние API (например, OpenSea) используются для обнаружения NFT в вашем кошельке. При таком обнаружении адрес вашего счета становится известен этим службами. Оставьте этот параметр отключенным, если не хотите, чтобы приложение получало данные от этих служб." + }, "usePhishingDetection": { "message": "Использовать обнаружение фишинга" }, "usePhishingDetectionDescription": { "message": "Показывать предупреждение для фишинговых доменов, нацеленных на пользователей Ethereum" }, + "useTokenDetection": { + "message": "Использовать обнаружение токенов" + }, + "useTokenDetectionDescription": { + "message": "Мы используем сторонние API для обнаружения и отображения новых токенов, отправленных в ваш кошелек. Отключите, если не хотите, чтобы MetaMask получал данные от этих служб." + }, "usedByClients": { "message": "Используется множеством разных клиентов" }, @@ -2291,15 +3346,56 @@ "viewContact": { "message": "Посмотреть контакт" }, + "viewFullTransactionDetails": { + "message": "Смотреть все реквизиты транзакции" + }, "viewMore": { "message": "Посмотреть больше" }, + "viewOnBlockExplorer": { + "message": "Смотреть в проводнике блоков" + }, + "viewOnCustomBlockExplorer": { + "message": "Смотреть $1 и $2", + "description": "$1 is the action type. e.g (Account, Transaction, Swap) and $2 is the Custom Block Exporer URL" + }, + "viewOnEtherscan": { + "message": "Смотреть 1$ на Etherscan", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, + "viewOnOpensea": { + "message": "Смотреть на Opensea" + }, + "viewinExplorer": { + "message": "Смотреть $1 в Проводнике", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, "visitWebSite": { "message": "Посетите наш веб-сайт" }, "walletConnectionGuide": { "message": "наше руководство по подключению аппаратного кошелька" }, + "walletCreationSuccessDetail": { + "message": "Вы успешно защитили свой кошелек. Сохраните секретную фразу для восстановления в тайне — вы отвечаете за ее сохранность!" + }, + "walletCreationSuccessReminder1": { + "message": "MetaMask не сможет восстановить вашу секретную фразу для восстановления." + }, + "walletCreationSuccessReminder2": { + "message": "MetaMask никогда не запрашивает у вас секретную фразу для восстановления." + }, + "walletCreationSuccessReminder3": { + "message": "$1, чтобы предотвратить кражу ваших средств", + "description": "$1 is separated as walletCreationSuccessReminder3BoldSection so that we can bold it" + }, + "walletCreationSuccessReminder3BoldSection": { + "message": "Никогда не сообщайте никому свою секретную фразу для восстановления", + "description": "This string is localized separately from walletCreationSuccessReminder3 so that we can bold it" + }, + "walletCreationSuccessTitle": { + "message": "Кошелек создан" + }, "walletSeedRestore": { "message": "Секретная фраза восстановления кошелька" }, @@ -2307,12 +3403,34 @@ "message": "Мы заметили, что текущий веб-сайт пытался использовать удаленный API window.web3. Если сайт не работает, нажмите $1 для получения дополнительной информации.", "description": "$1 is a clickable link." }, + "webhid": { + "message": "WebHID", + "description": "Refers to a interface for connecting external devices to the browser. Used for connecting ledger to the browser. Read more here https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API" + }, "welcome": { "message": "Добро пожаловать в MetaMask" }, "welcomeBack": { "message": "Добро пожаловать обратно!" }, + "welcomeExploreDescription": { + "message": "Храните, отправляйте и тратьте криптовалюту и активы." + }, + "welcomeExploreTitle": { + "message": "Ознакомьтесь с децентрализованными приложениями" + }, + "welcomeLoginDescription": { + "message": "Используйте кошелек MetaMask для входа в децентрализованные приложения — регистрация не потребуется." + }, + "welcomeLoginTitle": { + "message": "Поприветствуйте свой кошелек" + }, + "welcomeToMetaMask": { + "message": "Давайте приступим к делу" + }, + "welcomeToMetaMaskIntro": { + "message": "MetaMask, которому доверяют миллионы, — это безопасный кошелек, предоставляющий всем доступ к миру web3." + }, "whatsNew": { "message": "Узнайте что нового", "description": "This is the title of a popup that gives users notifications about new features and updates to MetaMask." diff --git a/app/_locales/sk/messages.json b/app/_locales/sk/messages.json index 0f429c666..082edfbb8 100644 --- a/app/_locales/sk/messages.json +++ b/app/_locales/sk/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Odmítnout" + }, + "QRHardwareWalletImporterTitle": { + "message": "Skenovať QR kód" + }, "about": { "message": "Informácie" }, @@ -250,6 +256,9 @@ "currentLanguage": { "message": "Aktuálny jazyk" }, + "custom": { + "message": "Rozšírené" + }, "customGas": { "message": "Nastavit palivo" }, @@ -514,6 +523,9 @@ "learnMore": { "message": "Zjistěte více." }, + "learnMoreUpperCase": { + "message": "Zjistěte více." + }, "ledgerAccountRestriction": { "message": "Skôr ako budete môcť pridať nový účet, musíte použiť svoj posledný účet." }, diff --git a/app/_locales/sl/messages.json b/app/_locales/sl/messages.json index 4a96ee682..46bb81738 100644 --- a/app/_locales/sl/messages.json +++ b/app/_locales/sl/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Zavrni" + }, + "QRHardwareWalletImporterTitle": { + "message": "Skeniraj QR kodo" + }, "about": { "message": "O možnostih" }, @@ -256,6 +262,9 @@ "currentLanguage": { "message": "Trenutni jezik" }, + "custom": { + "message": "Napredno" + }, "customGas": { "message": "Prilagodi gas" }, @@ -524,6 +533,9 @@ "learnMore": { "message": "Preberite več" }, + "learnMoreUpperCase": { + "message": "Preberite več" + }, "ledgerAccountRestriction": { "message": "Za dodajanje novega računa morate uporabiti zadnji račun." }, diff --git a/app/_locales/sr/messages.json b/app/_locales/sr/messages.json index 02a6e600d..6318ff1b9 100644 --- a/app/_locales/sr/messages.json +++ b/app/_locales/sr/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Одбиј" + }, + "QRHardwareWalletImporterTitle": { + "message": "Skenirajte QR kod" + }, "about": { "message": "Основни подаци" }, @@ -253,6 +259,9 @@ "currentLanguage": { "message": "Trenutni jezik" }, + "custom": { + "message": "Напредне опције" + }, "customGas": { "message": "Prilagodi gas" }, @@ -527,6 +536,9 @@ "learnMore": { "message": "Nauči više" }, + "learnMoreUpperCase": { + "message": "Nauči više" + }, "ledgerAccountRestriction": { "message": "Treba da koristite svoj poslednji nalog pre nego što budete mogli da dodate novi." }, diff --git a/app/_locales/sv/messages.json b/app/_locales/sv/messages.json index e955c1ed3..fb176bad3 100644 --- a/app/_locales/sv/messages.json +++ b/app/_locales/sv/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Avvisa" + }, + "QRHardwareWalletImporterTitle": { + "message": "Skanna QR-koden" + }, "about": { "message": "Om" }, @@ -250,6 +256,9 @@ "currentLanguage": { "message": "Aktuellt språk" }, + "custom": { + "message": "Avancerat" + }, "customGas": { "message": "Anpassa gas" }, @@ -520,6 +529,9 @@ "learnMore": { "message": "Läs mer" }, + "learnMoreUpperCase": { + "message": "Läs mer" + }, "ledgerAccountRestriction": { "message": "Du måste använda ditt senaste konto innan du kan lägga till ett nytt." }, diff --git a/app/_locales/sw/messages.json b/app/_locales/sw/messages.json index d77b5a34f..aaa50bfee 100644 --- a/app/_locales/sw/messages.json +++ b/app/_locales/sw/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Kataa" + }, + "QRHardwareWalletImporterTitle": { + "message": "Kagua Msimbo wa QR" + }, "about": { "message": "Kuhusu" }, @@ -250,6 +256,9 @@ "currentLanguage": { "message": "Lugha ya Sasa" }, + "custom": { + "message": "Mipangilio ya kina" + }, "customGas": { "message": "Weka Mipangilio ya Gesi Upendavyo" }, @@ -517,6 +526,9 @@ "learnMore": { "message": "Jifunze zaidi" }, + "learnMoreUpperCase": { + "message": "Jifunze zaidi" + }, "ledgerAccountRestriction": { "message": "Unapaswa kutumia akaunti yako ya mwisho kabla hujaongeza mpya." }, diff --git a/app/_locales/ta/messages.json b/app/_locales/ta/messages.json index 13960d92d..3cb67630b 100644 --- a/app/_locales/ta/messages.json +++ b/app/_locales/ta/messages.json @@ -1,4 +1,7 @@ { + "QRHardwareSignRequestCancel": { + "message": "நிராகரி" + }, "about": { "message": "அறிமுகம்" }, @@ -108,6 +111,9 @@ "createAccount": { "message": "உங்கள் கணக்கை துவங்குங்கள்" }, + "custom": { + "message": "மேம்பட்டவை" + }, "customGas": { "message": "எரிவாயுவைத் தனிப்பயனாக்குங்கள்" }, @@ -250,6 +256,9 @@ "learnMore": { "message": "மேலும் அறிக" }, + "learnMoreUpperCase": { + "message": "மேலும் அறிக" + }, "likeToImportTokens": { "message": "இந்த டோக்கன்களைச் சேர்க்க விரும்புகிறீர்களா?" }, diff --git a/app/_locales/te/messages.json b/app/_locales/te/messages.json index 27c16eb04..f1c780d5b 100644 --- a/app/_locales/te/messages.json +++ b/app/_locales/te/messages.json @@ -1,4 +1,7 @@ { + "QRHardwareSignRequestCancel": { + "message": "తిరస్కరించు" + }, "about": { "message": "గురించి" }, @@ -44,6 +47,9 @@ "create": { "message": "సృష్టించు" }, + "custom": { + "message": "ఆధునిక" + }, "delete": { "message": "తొలగించు" }, diff --git a/app/_locales/th/messages.json b/app/_locales/th/messages.json index 1c4dc9862..c33d85790 100644 --- a/app/_locales/th/messages.json +++ b/app/_locales/th/messages.json @@ -1,4 +1,7 @@ { + "QRHardwareSignRequestCancel": { + "message": "ปฏิเสธ" + }, "about": { "message": "เกี่ยวกับ" }, @@ -268,6 +271,9 @@ "learnMore": { "message": "เรียนรู้เพิ่มเติม" }, + "learnMoreUpperCase": { + "message": "เรียนรู้เพิ่มเติม" + }, "likeToImportTokens": { "message": "คุณต้องการเพิ่มโทเค็นเหล่านี้หรือไม่?" }, diff --git a/app/_locales/tl/messages.json b/app/_locales/tl/messages.json index 150f48471..5f9eb4d03 100644 --- a/app/_locales/tl/messages.json +++ b/app/_locales/tl/messages.json @@ -1,4 +1,49 @@ { + "QRHardwareInvalidTransactionTitle": { + "message": "Error" + }, + "QRHardwareMismatchedSignId": { + "message": "Hindi tugmang data ng transaksyon. Pakisuriin ang mga detalye ng transaksyon." + }, + "QRHardwarePubkeyAccountOutOfRange": { + "message": "Wala nang mga account. Kung gusto mong mag-access ng iba pang account na hindi nakalista sa ibba, pakikonektang muli ang hardware wallet mo at piliin ito." + }, + "QRHardwareScanInstructions": { + "message": "Ilagay ang QR code sa harap ng iyong camera. Malabo ang screen, pero hindi ito makakaapekto sa pagbabasa." + }, + "QRHardwareSignRequestCancel": { + "message": "Tanggihan" + }, + "QRHardwareSignRequestDescription": { + "message": "Pagkatapos mong makapag-sign up sa iyong wallet, mag-click sa 'Kunin ang Pirma' para matanggap ang pirma" + }, + "QRHardwareSignRequestGetSignature": { + "message": "Kunin ang Pirma" + }, + "QRHardwareSignRequestSubtitle": { + "message": "I-scan ang QR code gamit ang wallet mo" + }, + "QRHardwareSignRequestTitle": { + "message": "Humiling ng Pirma" + }, + "QRHardwareUnknownQRCodeTitle": { + "message": "Error" + }, + "QRHardwareUnknownWalletQRCode": { + "message": "Maling QR code. paki-scan ang sync QR code ng hardware wallet." + }, + "QRHardwareWalletImporterTitle": { + "message": "Mag-scan ng QR Code" + }, + "QRHardwareWalletSteps1Description": { + "message": "Ikonekta ang isang airgapped na hardware wallet na nakikipag-ugnayan sa pamamagitan ng mga QR-code. Ang mga opisyal na sinusuportahang airgapped na hardware wallet ay kinabibilangan ng:" + }, + "QRHardwareWalletSteps1Title": { + "message": "HW Wallet na nakabatay sa QR" + }, + "QRHardwareWalletSteps2Description": { + "message": "AirGap Vault at Ngrave (Paparating Na)" + }, "about": { "message": "Tungkol Dito" }, @@ -28,6 +73,10 @@ "accountName": { "message": "Pangalan ng Account" }, + "accountNameDuplicate": { + "message": "May gumagamit na ng pangalan ng account na ito", + "description": "This is an error message shown when the user enters a new account name that matches an existing account name" + }, "accountOptions": { "message": "Mga Opsyon sa Account" }, @@ -43,12 +92,57 @@ "activityLog": { "message": "log ng aktibidad" }, + "add": { + "message": "Magdagdag" + }, + "addANetwork": { + "message": "Magdagdag ng network" + }, + "addANickname": { + "message": "Magdagdag ng palayaw" + }, "addAcquiredTokens": { "message": "Idagdag ang mga token na nakuha mo gamit ang MetaMask" }, "addAlias": { "message": "Magdagdag ng alias" }, + "addContact": { + "message": "Magdagdag ng contact" + }, + "addCustomToken": { + "message": "Magdagdag ng Custom na Token" + }, + "addCustomTokenByContractAddress": { + "message": "Hindi makahanap ng token? Maaari kang manu-manong magdagdag ng anumang token sa pamamagitan ng pag-paste ng address nito. Ang mga address ng token contract ay matatagpuan sa $1.", + "description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum" + }, + "addEthereumChainConfirmationDescription": { + "message": "Magpapahintulot ito sa network na ito na gamitin sa loob ng MetaMask." + }, + "addEthereumChainConfirmationRisks": { + "message": "Ang MetaMask ay hindi nag-ve-verify ng mga custom na network." + }, + "addEthereumChainConfirmationRisksLearnMore": { + "message": "Alamin ang tungkol sa $1.", + "description": "$1 is a link with text that is provided by the 'addEthereumChainConfirmationRisksLearnMoreLink' key" + }, + "addEthereumChainConfirmationRisksLearnMoreLink": { + "message": "mga scam at panganib ng seguridad ng network", + "description": "Link text for the 'addEthereumChainConfirmationRisksLearnMore' translation key" + }, + "addEthereumChainConfirmationTitle": { + "message": "Payagan ang site na ito na magdagdag ng network?" + }, + "addFriendsAndAddresses": { + "message": "Magdagdag ng mga kaibigan at address na pinagkakatiwalaan mo" + }, + "addMemo": { + "message": "Magdagdag ng memo" + }, + "addNFT": { + "message": "Magdagdag ng NFT" + }, "addNetwork": { "message": "Magdagdag ng Network" }, @@ -64,12 +158,36 @@ "addToken": { "message": "Magdagdag ng Token" }, + "address": { + "message": "Address" + }, + "addressBookIcon": { + "message": "Icon ng address book" + }, "advanced": { "message": "Advanced" }, + "advancedBaseGasFeeToolTip": { + "message": "Kapag nakasama ang iyong transaksyon sa block, i-re-refund ang anumang difference sa pagitan ng iyong max base fee at ang aktwal na base fee. Ang kabuuang halaga ay kinakalkula bilang max base fee (sa GWEI) * limit ng gas." + }, + "advancedGasFeeDefaultOptIn": { + "message": "I-save itong mga $1bilang aking default para sa \"Advanced\"" + }, + "advancedGasFeeDefaultOptOut": { + "message": "Laging gamitin ang mga value na ito at advanced setting bilang default." + }, + "advancedGasFeeModalTitle": { + "message": "Advanced na gas fee" + }, + "advancedGasPriceTitle": { + "message": "Presyo ng gas" + }, "advancedOptions": { "message": "Mga Advanced na Opsyon" }, + "advancedPriorityFeeToolTip": { + "message": "Ang priority fee (kilala rin bilang “tip ng miner”) ay direktang napupunta sa mga miner at ginagawang insentibo ang mga ito upang unahin ang iyong mga transaksyon." + }, "advancedSettingsDescription": { "message": "I-access ang mga pang-developer na feature, i-download ang Mga Log ng Estado, I-reset ang Account, i-set up ang mga testnet at custom na RPC" }, @@ -88,6 +206,12 @@ "alertSettingsUnconnectedAccountDescription": { "message": "Makikita ang alertong ito sa popup kapag nagba-browse ka sa isang nakakonektang Web3 site, pero hindi nakakonekta ang kasalukuyang napiling account." }, + "alertSettingsWeb3ShimUsage": { + "message": "Kapag sinubukan ng isang website na gamitin ang inalis na window.web3 API" + }, + "alertSettingsWeb3ShimUsageDescription": { + "message": "Ang alertong ito ay ipinapakita sa popup kapag nagba-browse ka sa isang site na sumusubok na gamitin ang inalis na window.web3 API, at maaaring masira bilang resulta." + }, "alerts": { "message": "Mga Alerto" }, @@ -97,6 +221,10 @@ "allowExternalExtensionTo": { "message": "Payagan ang external extension na ito na:" }, + "allowSpendToken": { + "message": "Magbigay ng pahintulot na ma-access ang iyong $1?", + "description": "$1 is the symbol of the token that are requesting to spend" + }, "allowThisSiteTo": { "message": "Payagan ang site na ito na:" }, @@ -127,11 +255,14 @@ "message": "Bayarin sa pag-apruba at aggregator network" }, "approvalTxGasCost": { - "message": "Approval Tx Gas Cost" + "message": "Pag-apruba Tx Halaga ng Gas" }, "approve": { "message": "Aprubahan ang limitasyon sa paggastos" }, + "approveButtonText": { + "message": "Aprubahan" + }, "approveSpendLimit": { "message": "Aprubahan ang limitasyon sa paggastos na $1", "description": "The token symbol that is being approved" @@ -139,9 +270,15 @@ "approved": { "message": "Inaprubahan" }, + "approvedAmountWithColon": { + "message": "Inaprubahang halaga:" + }, "asset": { "message": "Asset" }, + "assetOptions": { + "message": "Mga opsyon ng asset" + }, "assets": { "message": "Mga Asset" }, @@ -190,12 +327,49 @@ "balanceOutdated": { "message": "Maaaring hindi updated ang balanse" }, + "baseFee": { + "message": "Base fee" + }, "basic": { "message": "Basic" }, + "betaMetamaskDescription": { + "message": "Ang Metamask na pinagkakatiwalaan ng milyun-milyon ay isang ligtas na wallet na ginagawang accessible ang mundo ng web3 para sa lahat." + }, + "betaMetamaskDescriptionExplanation": { + "message": "Gamitin ang bersyong ito para subukan ang mga paparating na feature bago ilabas ang mga ito. Ang iyong paggamit at feedback ay nakakatulong sa amin na bumuo ng posibleng pinakamahusay na bersyon ng MetaMask. Ang paggamit mo ng MetaMask Beta ay napapailalim sa aming karaniwang $1 gayundin sa aming $2. Bilang Beta, maaaring tumaas ang panganib ng mga bug. Sa pagpapatuloy, tinatanggap at kinikilala mo ang mga panganib na ito, gayundin ang mga panganib na makikita sa aming Mga Tuntunin at Mga Tuntunin ng Beta.", + "description": "$1 represents localization item betaMetamaskDescriptionExplanationTermsLinkText. $2 represents localization item betaMetamaskDescriptionExplanationBetaTermsLinkText" + }, + "betaMetamaskDescriptionExplanationBetaTermsLinkText": { + "message": "Karagdagang Mga Tuntunin ng Beta" + }, + "betaMetamaskDescriptionExplanationTermsLinkText": { + "message": "Mga Tuntunin" + }, + "betaMetamaskVersion": { + "message": "Bersyon ng MetaMask Beta" + }, + "betaWelcome": { + "message": "Welcome sa MetaMask Beta" + }, + "blockExplorerAccountAction": { + "message": "Account", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Account in Explorer" + }, + "blockExplorerAssetAction": { + "message": "Asset", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Asset in Explorer" + }, + "blockExplorerSwapAction": { + "message": "Swap", + "description": "This is used with viewOnEtherscan e.g View Swap on Etherscan" + }, "blockExplorerUrl": { "message": "Block Explorer" }, + "blockExplorerUrlDefinition": { + "message": "Ang URL ay ginamit bilang block explorer para sa network na ito." + }, "blockExplorerView": { "message": "Tingnan ang account sa $1", "description": "$1 replaced by URL for custom block explorer" @@ -206,9 +380,24 @@ "browserNotSupported": { "message": "Hindi sinusuportahan ang iyong Browser..." }, + "buildContactList": { + "message": "Bumuo ng iyong listahan ng contact" + }, + "builtAroundTheWorld": { + "message": "Ang MetaMask ay dinisenyo at itinatag sa buong mundo." + }, + "busy": { + "message": "Busy" + }, "buy": { "message": "Bilhin" }, + "buyWithTransak": { + "message": "Bumili ng ETH gamit ang Transak" + }, + "buyWithTransakDescription": { + "message": "Magagamit sa Transak ang debit card at mga bank transfer (depende sa lokasyon) sa 59+ na bansa. Mga depositong ETH sa iyong MetaMask account." + }, "buyWithWyre": { "message": "Bumili ng ETH gamit ang Wyre" }, @@ -218,9 +407,21 @@ "bytes": { "message": "Bytes" }, + "canToggleInSettings": { + "message": "Maaari mong i-enable muli ang notipikasyong ito sa Settings -> Mga Alerto." + }, "cancel": { "message": "Kanselahin" }, + "cancelEdit": { + "message": "Kanselahin ang Pag-edit" + }, + "cancelPopoverTitle": { + "message": "Kanselahin ang transaksyon" + }, + "cancelSpeedUp": { + "message": "kanselahin o pabilisin ang transaksyon." + }, "cancellationGasFee": { "message": "Bayarin sa Gasolina para sa Pagkansela" }, @@ -230,9 +431,19 @@ "chainId": { "message": "Chain ID" }, + "chainIdDefinition": { + "message": "Ang chain ID na ginamit upang pirmahan ang mga transaksyon para sa network na ito." + }, + "chainIdExistsErrorMsg": { + "message": "Ang Chain ID na ito ay kasalukuyang ginagamit ng $1 network." + }, "chromeRequiredForHardwareWallets": { "message": "Kailangan mong gamitin ang MetaMask sa Google Chrome para maikonekta sa iyong Hardware Wallet." }, + "clickToConnectLedgerViaWebHID": { + "message": "Mag-click dito upang ikonekta ang iyong Ledger sa pamamagitan ng WebHID", + "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" + }, "clickToRevealSeed": { "message": "Mag-click dito para ipakita ang mga lihim na salita" }, @@ -245,12 +456,24 @@ "confirmPassword": { "message": "Kumpirmahin ang password" }, + "confirmRecoveryPhrase": { + "message": "Kumpirmahin ang Secret Recovery Phrase" + }, "confirmSecretBackupPhrase": { "message": "Kumpirmahin ang iyong Lihim na Parirala sa Pag-back up" }, "confirmed": { "message": "Nakumpirma" }, + "confusableUnicode": { + "message": "Ang '$1' ay katulad ng '$2'." + }, + "confusableZeroWidthUnicode": { + "message": "May nakitang karakter na zero ang luwang." + }, + "confusingEnsDomain": { + "message": "May na-detect kami na nakakalitong character sa pangalan ng ENS. Suriin ang pangalan ng ENS para maiwasan ang potensyal na scam." + }, "congratulations": { "message": "Congratulations" }, @@ -340,9 +563,24 @@ "contactsSettingsDescription": { "message": "Magdagdag, mag-edit, magtanggal, at mamahala ng iyong mga contact" }, + "continue": { + "message": "Magpatuloy" + }, + "continueToTransak": { + "message": "Magpatuloy sa Transak" + }, "continueToWyre": { "message": "Magpatuloy sa Wyre" }, + "contract": { + "message": "Contract" + }, + "contractAddress": { + "message": "Contract address" + }, + "contractAddressError": { + "message": "Nagpapadala ka ng mga token sa contract address ng token. Ito ay maaaring magresulta sa pagkawala ng mga token na ito." + }, "contractDeployment": { "message": "Deployment ng Kontrata" }, @@ -358,6 +596,9 @@ "copyPrivateKey": { "message": "Ito ang iyong pribadong key (i-click para kopyahin)" }, + "copyRawTransactionData": { + "message": "Kopyahin ang raw na data ng transaksyon" + }, "copyToClipboard": { "message": "Kopyahin sa clipboard" }, @@ -373,12 +614,21 @@ "createAccount": { "message": "Gumawa ng Account" }, + "createNewWallet": { + "message": "Gumawa ng bagong wallet" + }, "createPassword": { "message": "Gumawa ng Password" }, "currencyConversion": { "message": "Conversion ng Currency" }, + "currencySymbol": { + "message": "Symbol ng Currency" + }, + "currencySymbolDefinition": { + "message": "Ang symbol ng ticker ay ipinakita para sa pera ng network na ito." + }, "currentAccountNotConnected": { "message": "Hindi nakakonekta ang kasalukuyan mong account" }, @@ -388,9 +638,22 @@ "currentLanguage": { "message": "Kasalukuyang Wika" }, + "currentTitle": { + "message": "Current:" + }, + "currentlyUnavailable": { + "message": "Hindi available sa network na ito" + }, + "custom": { + "message": "Advanced" + }, "customGas": { "message": "I-customize ang Gasolina" }, + "customGasSettingToolTipMessage": { + "message": "Gamitin ang $1 para i-customize ang presyo ng gas. Ito ay maaaring nakakalito kung hindi ka pamilyar. Harapin ang sarili mong panganib.", + "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold fontweight" + }, "customGasSubTitle": { "message": "Kapag dinagdagan ang bayarin, mababawasan ang mga oras ng pagproseso, pero hindi ito garantisado." }, @@ -400,9 +663,29 @@ "customToken": { "message": "Custom na Token" }, + "dappSuggested": { + "message": "Minungkahing site" + }, + "dappSuggestedGasSettingToolTipMessage": { + "message": "Minungkahi ng $1 ang presyong ito.", + "description": "$1 is url for the dapp that has suggested gas settings" + }, + "dappSuggestedShortLabel": { + "message": "Site" + }, + "dappSuggestedTooltip": { + "message": "Nirekomenda ng $1 ang presyong ito.", + "description": "$1 represents the Dapp's origin" + }, + "data": { + "message": "Data" + }, "dataBackupFoundInfo": { "message": "Ang ilan sa data ng iyong account ay na-back up sa nakaraang pag-install ng MetaMask. Maaaring kasama rito ang iyong mga setting, contact, at token. Gusto mo bang i-restore na ang data na ito?" }, + "dataHex": { + "message": "Hex" + }, "decimal": { "message": "Mga Decimal ng Katumpakan" }, @@ -444,6 +727,9 @@ "depositEther": { "message": "Mag-deposit ng Ether" }, + "description": { + "message": "Deskripsyon" + }, "details": { "message": "Mga Detalye" }, @@ -474,6 +760,12 @@ "dismissReminderDescriptionField": { "message": "I-on ito para i-dismiss ang mensahe ng paalala ng pag-back up ng recovery phrase. Lubos naming inirerekomendang i-back up mo ang iyong Secret Recovery Phrase para maiwasan ang pagkawala ng pondo" }, + "dismissReminderField": { + "message": "I-dismiss ang back up na paalala ng Sikretong Recovert Phrase" + }, + "domain": { + "message": "Domain" + }, "done": { "message": "Tapos na" }, @@ -495,12 +787,147 @@ "edit": { "message": "I-edit" }, + "editANickname": { + "message": "I-edit ang palayaw" + }, + "editAddressNickname": { + "message": "I-edit ang address ng palayaw" + }, "editContact": { "message": "I-edit ang Contact" }, + "editGasEducationButtonText": { + "message": "Paano ako pipili?" + }, + "editGasEducationHighExplanation": { + "message": "Pinakamainam ito para sa mga transaksyong sensitibo sa oras (tulad ng Swap) dahil pinapataas nito ang posibilidad ng isang matagumpay na transaksyon. Kung ang isang Swap ay tumatagal ng masyadong mahaba upang maproseso ito ay maaaring mabigo at magresulta sa pagkawala ng ilan sa iyong gas fee." + }, + "editGasEducationLowExplanation": { + "message": "Ang mas mababang bayad sa gas ay dapat lamang gamitin kapag ang oras ng pagproseso ay hindi gaanong mahalaga. Dahil sa mas mababang mga bayarin, mahirap hulaan kung kailan (o kung) ang iyong transaksyon ay magiging matagumpay." + }, + "editGasEducationMediumExplanation": { + "message": "Ang katamtamang gas fee ay mainam para sa pagpapadala, pag-withdraw o iba pang wala oras na sensitibong mga transaksyon. Ang setting na ito ay kadalasang magreresulta sa isang matagumpay na transaksyon." + }, + "editGasEducationModalIntro": { + "message": "Ang pagpili ng tamang gas fee ay depende sa uri ng transaksyon at kung gaano ito kahalaga sa iyo." + }, + "editGasEducationModalTitle": { + "message": "Paano pipili?" + }, + "editGasFeeModalTitle": { + "message": "I-edit ang gas fee" + }, + "editGasHigh": { + "message": "Mataas" + }, + "editGasLimitOutOfBounds": { + "message": "Ang limit ng gas ay dapat na $1 man lamang" + }, + "editGasLimitOutOfBoundsV2": { + "message": "Ang limit ng gas ay dapat mas mataas sa $1 at hindi bababa sa $2", + "description": "$1 is the minimum limit for gas and $2 is the maximum limit" + }, + "editGasLimitTooltip": { + "message": "Ang limit ng gas ay ang pinakamataas na yunit ng gas na handa mong gamitin. Ang mga yunit ng gas ay isang multiplier sa “Max priority fee” at “Max fee”." + }, + "editGasLow": { + "message": "Mababa" + }, + "editGasMaxBaseFeeGWEIImbalance": { + "message": "Ang max base fee ay hindi dapat mas mababa sa priority fee" + }, + "editGasMaxBaseFeeHigh": { + "message": "Ang max base fee ay mas mataas kaysa kinakailangan" + }, + "editGasMaxBaseFeeLow": { + "message": "Ang max base fee ay mababa para sa kasalukuyang mga kundisyon ng network" + }, + "editGasMaxFeeHigh": { + "message": "Ang max fee ay mas mataas kaysa kinakailangan" + }, + "editGasMaxFeeLow": { + "message": "Ang max fee ay napakababa para sa mga kundisyon ng network" + }, + "editGasMaxFeePriorityImbalance": { + "message": "Ang max fee ay hindi dapat mas mababa kaysa max priority fee" + }, + "editGasMaxFeeTooltip": { + "message": "Ang max fee ay ang pinakamataas na babayaran mo (base fee + priority fee)." + }, + "editGasMaxPriorityFeeBelowMinimum": { + "message": "Ang max priority fee ay dapat mas mataas sa 0 GWEI" + }, + "editGasMaxPriorityFeeBelowMinimumV2": { + "message": "Ang priority fee ay dapat mas mataas sa 0." + }, + "editGasMaxPriorityFeeHigh": { + "message": "Ang max priority fee ay mas mataas sa kinakailangan. Maaari kang magbayad nang higit sa kinakailangan." + }, + "editGasMaxPriorityFeeHighV2": { + "message": "Ang priority fee ay mas mataas sa kinakailangan. Maaari kang magbayad nang higit sa kinakailangan" + }, + "editGasMaxPriorityFeeLow": { + "message": "Amg priority fee ay mababa para sa kasalukuyang mga kundisyon ng network" + }, + "editGasMaxPriorityFeeLowV2": { + "message": "Ang priority fee ay mababa para sa kasalukuyang mga kundisyon ng network" + }, + "editGasMaxPriorityFeeTooltip": { + "message": "Ang max priority fee (kilala rin bilang “tip ng miner”) ay direktang napupunta sa mga miner at ginagawang insentibo ang mga ito upang unahin ang iyong mga transaksyon. Madalas kang magbabayad sa iyong max setting" + }, + "editGasMedium": { + "message": "Medium" + }, + "editGasPriceTooLow": { + "message": "Ang presyo ng gas ay dapat mas mataas sa 0" + }, + "editGasPriceTooltip": { + "message": "Ang network na ito ay nangangailangan ng field ng “Presyo ng gas” kapag nagsusumite ng transaksyon. Ang presyo ng gas ay ang halaga na babayaran mo kada yunit ng gas." + }, + "editGasSubTextAmountLabel": { + "message": "Max na halaga:", + "description": "This is meant to be used as the $1 substitution editGasSubTextAmount" + }, + "editGasSubTextFeeLabel": { + "message": "Max fee:" + }, + "editGasTitle": { + "message": "I-edit ang priority" + }, + "editGasTooLow": { + "message": "Hindi kilalang oras ng pagproseso" + }, + "editGasTooLowTooltip": { + "message": "Ang iyong max fee o max priority fee ay maaaring mababa para sa kasalukuyang kondisyon ng market. Hindi namin alam kung kailan (o kung) ipoproseso ang iyong transaksyon. " + }, + "editGasTooLowWarningTooltip": { + "message": "Pinabababa nito ang iyong maximum fee ngunit kung network traffic ay maaaring maantala o mabigo ang iyong transaksyon." + }, + "editNonceField": { + "message": "I-edit sa Nonce" + }, + "editNonceMessage": { + "message": "Ito ay isang advanced feature, maingat na gamitin." + }, "editPermission": { "message": "Pahintulot sa Pag-edit" }, + "enableAutoDetect": { + "message": " Paganahin ang Autodetect" + }, + "enableFromSettings": { + "message": " Paganahin ito mula sa Settings." + }, + "enableOpenSeaAPI": { + "message": "Paganahin sa OpenSea API" + }, + "enableOpenSeaAPIDescription": { + "message": "Gamitin ang API ng Opensea upang kunin ang NFT data. ang NFT auto-detection ay umaasa sa API ng OpenSea, at hindi magiging available kapag ito ay isinara." + }, + "enableToken": { + "message": "paganahin ang $1", + "description": "$1 is a token symbol, e.g. ETH" + }, "encryptionPublicKeyNotice": { "message": "Kailangan ng $1 ang iyong pampublikong encryption key. Sa pamamagitan ng pagbibigay ng pahintulot, makakagawa ang site na ito ng mga naka-encrypt na mensahe para sa iyo.", "description": "$1 is the web3 site name" @@ -529,6 +956,10 @@ "endOfFlowMessage6": { "message": "Kung kailangan mong i-back up ulit ang iyong Secret Recovery Phrase, makikita mo ito sa Mga Setting -> Seguridad." }, + "endOfFlowMessage7": { + "message": "Sakaling may mga katanungan ka o may nakitang kahina-hinala, kontakin ang aming support sa $1.", + "description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." + }, "endOfFlowMessage8": { "message": "Hindi mababawi ng MetaMask ang iyong Secret Recovery Phrase." }, @@ -539,12 +970,21 @@ "message": "Nagbalik ang endpoint ng ibang chain ID: $1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "ensIllegalCharacter": { + "message": "Mga ilegal na Character para sa ENS." + }, "ensNotFoundOnCurrentNetwork": { "message": "Hindi nahanapa ang ENS name sa kasalukuyang network. Subukang lumipat sa Ethereum Mainnet." }, + "ensNotSupportedOnNetwork": { + "message": "Hindi sinusuportahan ng network ang ENS" + }, "ensRegistrationError": { "message": "Nagka-error sa pag-register ng ENS name" }, + "ensUnknownError": { + "message": "Bigong Makita ang ENS." + }, "enterAnAlias": { "message": "Maglagay ng alias" }, @@ -573,6 +1013,14 @@ "message": "Code: $1", "description": "Displayed error name for debugging purposes. $1 is the error name" }, + "errorPageMessage": { + "message": "Subukang muling i-reload ang page, o kontakin ang support $1.", + "description": "Message displayed on generic error page in the fullscreen or notification UI, $1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." + }, + "errorPagePopupMessage": { + "message": "Subukan muli sa pamamagitan ng pagsasara o muling pagbubukas ng pop-up, kontakin ang support $1.", + "description": "Message displayed on generic error page in the popup UI, $1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." + }, "errorPageTitle": { "message": "Nagkaroon ng error sa MetaMask", "description": "Title of generic error page" @@ -584,6 +1032,9 @@ "estimatedProcessingTimes": { "message": "Mga Tinatantyang Tagal ng Pagproseso" }, + "ethGasPriceFetchWarning": { + "message": "Ang backup gas price ay inilalaan dahil ang pangunahing pagtantiya ng presyo ng gas ay hindi available sa ngayon." + }, "eth_accounts": { "message": "Tingnan ang mga address ng iyong mga pinapayagang account (kinakailangan)", "description": "The description for the `eth_accounts` permission" @@ -597,9 +1048,18 @@ "etherscanView": { "message": "Tingnan ang account sa Etherscan" }, + "etherscanViewOn": { + "message": "Tingnan ang Etherscan" + }, "expandView": { "message": "I-expand ang view" }, + "experimental": { + "message": "Experimental" + }, + "experimentalSettingsDescription": { + "message": "Pag-detect ng token at iba pa" + }, "exportPrivateKey": { "message": "I-export ang Pribadong Key" }, @@ -619,6 +1079,9 @@ "failureMessage": { "message": "Nagkaproblema, at hindi namin makumpleto ang aksyon" }, + "fakeTokenWarning": { + "message": "Sinuman ay maaaring gumawa ng token, kabilang ang paggawa ng mga pekeng bersyon ng mga umiiral na token. Alamin pa ang tungkol sa $1" + }, "fast": { "message": "Mabilis" }, @@ -636,6 +1099,21 @@ "message": "Hindi gumagana ang pag-import ng file? Mag-click dito!", "description": "Helps user import their account from a JSON file" }, + "flaskSnapSettingsCardButtonCta": { + "message": "Tingnan ang mga detalye", + "description": "Call to action a user can take to see more information about the Snap that is installed" + }, + "flaskSnapSettingsCardDateAddedOn": { + "message": "Dinagdag sa", + "description": "Start of the sentence describing when and where snap was added" + }, + "flaskSnapSettingsCardFrom": { + "message": "mula sa", + "description": "Part of the sentence describing when and where snap was added" + }, + "followUsOnTwitter": { + "message": "I-follow kami sa Twitter" + }, "forbiddenIpfsGateway": { "message": "Forbidden IPFS Gateway: Tumukoy ng CID gateway" }, @@ -655,6 +1133,19 @@ "functionType": { "message": "Uri ng Function" }, + "gas": { + "message": "Gas" + }, + "gasDisplayAcknowledgeDappButtonText": { + "message": "In-edit ang minungkahing gas fee" + }, + "gasDisplayDappWarning": { + "message": "Ang gas fee na ito ay iminungkahi ng $1. Ang pag-override dito ay maaaring magdulot ng problema sa iyong transaksyon. Mangyaring makipag-ugnayan sa $1 kung mayroon kang mga tanong.", + "description": "$1 represents the Dapp's origin" + }, + "gasEstimatesUnavailableWarning": { + "message": "Ang aming low, medium at high na mga pagtantiya ay hindi available." + }, "gasLimit": { "message": "Limitasyon sa Gas" }, @@ -668,15 +1159,62 @@ "message": "Ang limitasyon sa gas ay dapat na hindi bababa sa $1", "description": "$1 is the custom gas limit, in decimal." }, + "gasLimitV2": { + "message": "Gas limit" + }, + "gasOption": { + "message": "Opsyon ng gas" + }, "gasPrice": { "message": "Presyo ng Gas (GWEI)" }, + "gasPriceExcessive": { + "message": "Ang iyong gas fee ay hindi kinakailangang mataas. Pag-isipan ang mas mababang halaga." + }, + "gasPriceExcessiveInput": { + "message": "Labis ang Presyo ng Gas" + }, "gasPriceExtremelyLow": { "message": "Sobrang Baba ng Presyo ng Gas" }, + "gasPriceFetchFailed": { + "message": "Ang pagtantiya ng presyo ng gas ay nabigo dahil sa network error." + }, "gasPriceInfoTooltipContent": { "message": "Tinutukoy ng presyo ng gas ang halaga ng Ether na handa mong bayaran para sa bawat unit ng gas." }, + "gasTimingHoursShort": { + "message": "$1 oras", + "description": "$1 represents a number of hours" + }, + "gasTimingMinutes": { + "message": "$1 minuto", + "description": "$1 represents a number of minutes" + }, + "gasTimingMinutesShort": { + "message": "$1 min", + "description": "$1 represents a number of minutes" + }, + "gasTimingNegative": { + "message": "Baka sa $1", + "description": "$1 represents an amount of time" + }, + "gasTimingPositive": { + "message": "Posible sa < $1", + "description": "$1 represents an amount of time" + }, + "gasTimingSeconds": { + "message": "$1 na segundo", + "description": "$1 represents a number of seconds" + }, + "gasTimingSecondsShort": { + "message": "$1 seg", + "description": "$1 represents a number of seconds" + }, + "gasTimingVeryPositive": { + "message": "Napakaposible sa < $1", + "description": "$1 represents an amount of time" + }, "gasUsed": { "message": "Nagamit na Gas" }, @@ -704,9 +1242,15 @@ "getStarted": { "message": "Magsimula" }, + "goBack": { + "message": "Bumalik" + }, "goerli": { "message": "Goerli Test Network" }, + "grantedToWithColon": { + "message": "Ipinagkaloob kay:" + }, "happyToSeeYou": { "message": "Nagagalak kaming makilala ka." }, @@ -716,6 +1260,13 @@ "hardwareWalletConnected": { "message": "Nakakonekta ang hardware wallet" }, + "hardwareWalletLegacyDescription": { + "message": "(legacy)", + "description": "Text representing the MEW path" + }, + "hardwareWalletSupportLinkConversion": { + "message": "mag-click dito" + }, "hardwareWallets": { "message": "Magkonekta ng hardware wallet" }, @@ -739,9 +1290,28 @@ "message": "Itago $1", "description": "$1 is the symbol for a token (e.g. 'DAI')" }, + "hideZeroBalanceTokens": { + "message": "I-hide ang mga oken na Walang Balanse" + }, + "high": { + "message": "Agresibo" + }, + "highGasSettingToolTipDialog": { + "message": "Mataas na probabilidad, kahit sa mga pabagu-bagong market" + }, + "highGasSettingToolTipMessage": { + "message": "Gamitin ang $1 upang pagtakpan ang mga surge sa network traffic dahil sa mga bagay tulad ng popular na pagbagsak ng NFT.", + "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" + }, + "highLowercase": { + "message": "mataas" + }, "history": { "message": "History" }, + "id": { + "message": "ID" + }, "import": { "message": "Mag-import", "description": "Button to import an account from a selected file" @@ -749,6 +1319,9 @@ "importAccount": { "message": "Mag-import ng Account" }, + "importAccountError": { + "message": "Error sa pag-import ng account." + }, "importAccountLinkText": { "message": "i-import gamit ang Secret Recovery Phrase" }, @@ -758,6 +1331,35 @@ "importAccountSeedPhrase": { "message": "Mag-import ng account gamit ang Secret Recovery Phrase" }, + "importAccountText": { + "message": "o $1", + "description": "$1 represents the text from `importAccountLinkText` as a link" + }, + "importExistingWalletDescription": { + "message": "Ilagay ang iyong Sirektong Recovery Phrase (kilala rin bilang Seed Phrase) na ibinigay sa iyo noong gumawa ka ng iyong wallet. $1", + "description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link" + }, + "importExistingWalletTitle": { + "message": "Mag-import ng umiiral na wallet gamit ang Secret Recovery Phrase" + }, + "importMyWallet": { + "message": "I-import ang Wallet Ko" + }, + "importNFTs": { + "message": "I-import ang mga NFT" + }, + "importTokenQuestion": { + "message": "I-import ang token?" + }, + "importTokenWarning": { + "message": "Sinumang ay maaaring lumikha ng token gamit ang alinmang pangalan, kabilang ang mga pekeng bersyon ng umiiral na mga token. Magdagdag at mag-trade sa sarili mong panganib!" + }, + "importTokens": { + "message": "mag-import ng mga token" + }, + "importTokensCamelCase": { + "message": "Mag-import ng mga Token" + }, "importWallet": { "message": "I-import ang wallet" }, @@ -768,6 +1370,10 @@ "message": "Na-import", "description": "status showing that an account has been fully loaded into the keyring" }, + "infuraBlockedNotification": { + "message": "Hindi makakonekta ang MetaMask sa blockchain host. I-review ang posibleng mga dahilan $1.", + "description": "$1 is a clickable link with with text defined by the 'here' key" + }, "initialTransactionConfirmed": { "message": "Nakumpirma na ng network ang iyong inisyal na transaksyon. I-click ang OK para bumalik." }, @@ -777,6 +1383,9 @@ "insufficientFunds": { "message": "Hindi sapat ang pondo." }, + "insufficientFundsForGas": { + "message": "Di sapat na pondo para sa gas" + }, "insufficientTokens": { "message": "Hindi sapat ang token." }, @@ -792,6 +1401,9 @@ "invalidBlockExplorerURL": { "message": "Hindi Valid ang URL ng Block Explorer" }, + "invalidChainIdTooBig": { + "message": "Maling chain ID. Napakalaki ng chain ID." + }, "invalidCustomNetworkAlertContent1": { "message": "Kailangang ilagay ulit ang chain ID para sa custom na network na '$1'.", "description": "$1 is the name/identifier of the network." @@ -833,10 +1445,19 @@ "ipfsGatewayDescription": { "message": "Ilagay ang URL ng IPFS CID gateway para magamit para sa resolusyon ng content ng ENS." }, + "jsDeliver": { + "message": "jsDeliver" + }, "jsonFile": { "message": "JSON File", "description": "format for importing an account" }, + "keystone": { + "message": "Keystone" + }, + "keystoneTutorial": { + "message": " (Mga Tutorial)" + }, "knownAddressRecipient": { "message": "Kilalang address ng kontrata." }, @@ -849,18 +1470,82 @@ "lastConnected": { "message": "Huling Kumonekta" }, + "layer1Fees": { + "message": "Layer 1 fees" + }, + "learmMoreAboutGas": { + "message": "Gusto mo bang $1 ang tungkol sa gas?" + }, + "learnCancelSpeeedup": { + "message": "Alamin kung paano sa $1", + "description": "$1 is link to cancel or speed up transactions" + }, "learnMore": { "message": "Matuto pa" }, + "learnMoreUpperCase": { + "message": "Matuto pa" + }, + "learnScamRisk": { + "message": "mga scam at panganib sa seguridad." + }, "ledgerAccountRestriction": { "message": "Kailangan mong gamitin ang huli mong account bago ka magdagdag ng panibago." }, + "ledgerConnectionInstructionCloseOtherApps": { + "message": "Isara ang alinman sa iba pang software na konektado sa iyong device at pagkatapos ay mag-click dito para mag-refresh." + }, + "ledgerConnectionInstructionHeader": { + "message": "Bago ang pag-click ang kumpirmahin ang:" + }, + "ledgerConnectionInstructionStepFour": { + "message": "Paganahin ang \"smart contract data\" o \"may takip na pagpirma\" sa iyong Ledger device" + }, + "ledgerConnectionInstructionStepOne": { + "message": "Paganahin ang Gamitin ang Ledger Live sa ilalim ng Settings > Advanced" + }, + "ledgerConnectionInstructionStepThree": { + "message": "I-plug in ang iyong Ledger device at piliin ang Ethereum app" + }, + "ledgerConnectionInstructionStepTwo": { + "message": "Buksan at i-unlock ang Ledger Live App" + }, + "ledgerConnectionPreferenceDescription": { + "message": "I-customize kung paano ka kokonekta sa iyong Ledger sa MetaMask. Ang $1 ay nirerekomenda, pero ang ibang mga opsyon ay available. Magbasa pa dito: $2", + "description": "A description that appears above a dropdown where users can select between up to three options - Ledger Live, U2F or WebHID - depending on what is supported in their browser. $1 is the recommended browser option, it will be either WebHID or U2f. $2 is a link to an article where users can learn more, but will be the translation of the learnMore message." + }, + "ledgerDeviceOpenFailureMessage": { + "message": "Bigong mabuksan ang Ledger device. Ang iyong Ledger ay maaaring konektado sa ibang software. Pakisara ang Ledger Live o iba pang mga application na konektado sa iyong Ledger device, at subukan muling ikonekta." + }, + "ledgerLive": { + "message": "Ledger Live", + "description": "The name of a desktop app that can be used with your ledger device. We can also use it to connect a users Ledger device to MetaMask." + }, + "ledgerLiveApp": { + "message": "Ledger Live App" + }, + "ledgerLocked": { + "message": "Hindi makakonekta sa Ledger device. Siguruhin na ang device mo ay naka-unlock at bukas ang Ethereum." + }, + "ledgerTimeout": { + "message": "Masyadong natatagalan ang Ledger Live upang tumugon o mag-timeout ng koneksyon. Tiyaking nakabukas ang Ledger Live app at naka-unlock ang iyong device." + }, + "ledgerTransportChangeWarning": { + "message": "Kung bukas ang iyong Ledger Live app, mangyaring idiskonekta ang anumang bukas na koneksyon sa Ledger Live at isara ang Ledger Live app." + }, + "ledgerWebHIDNotConnectedErrorMessage": { + "message": "Hindi nakakonekta ang ledger device. Kung nais mong ikonekta ang iyong Ledger, mangyaring i-click muli ang 'Magpatuloy' at aprubahan ang HID na koneksyon", + "description": "An error message shown to the user during the hardware connect flow." + }, "letsGoSetUp": { "message": "Sige, simulan na nating mag-set up!" }, "likeToImportTokens": { "message": "Gusto mo bang idagdag ang mga token na ito?" }, + "link": { + "message": "Link" + }, "links": { "message": "Mga Link" }, @@ -882,12 +1567,48 @@ "lockTimeTooGreat": { "message": "Masyadong matagal ang oras ng pag-lock" }, + "low": { + "message": "Low" + }, + "lowGasSettingToolTipMessage": { + "message": "Gamitin ang $1 para maghintay ng mas murang presyo. Ang mga pagtatantya sa oras ay hindi gaanong tumpak dahil ang mga presyo ay medyo hindi mahuhulaan.", + "description": "$1 is key 'low' separated here so that it can be passed in with bold fontweight" + }, + "lowLowercase": { + "message": "low" + }, + "lowPriorityMessage": { + "message": "Ang mga transaksyon sa hinaharap ay pipila pagkatapos nito. Ang presyong ito ay huling nakita noong nakaraan." + }, "mainnet": { "message": "Ethereum Mainnet" }, + "makeAnotherSwap": { + "message": "Gumawa ng bagong pag-swap" + }, + "makeSureNoOneWatching": { + "message": "Tiyaking walang nanonood sa iyong screen", + "description": "Warning to users to be care while creating and saving their new Secret Recovery Phrase" + }, "max": { "message": "Max" }, + "maxBaseFee": { + "message": "Max base fee" + }, + "maxFee": { + "message": "Max fee" + }, + "maxPriorityFee": { + "message": "Max priority fee" + }, + "medium": { + "message": "Market" + }, + "mediumGasSettingToolTipMessage": { + "message": "Gamitin ang $1 para sa pagproseso sa kasalukuyang market price.", + "description": "$1 is key 'medium' (text: 'Market') separated here so that it can be passed in with bold fontweight" + }, "memo": { "message": "memo" }, @@ -918,6 +1639,9 @@ "metametricsCommitmentsAllowOptOut": { "message": "Palagi kang papayagang mag-opt out sa pamamagitan ng Mga Setting" }, + "metametricsCommitmentsAllowOptOut2": { + "message": "Palaging mag-opt out sa pamamagitan ng Settings" + }, "metametricsCommitmentsBoldNever": { "message": "Huwag Kailanman", "description": "This string is localized separately from some of the commitments so that we can bold it" @@ -925,6 +1649,9 @@ "metametricsCommitmentsIntro": { "message": "Gagawin ng MetaMask ang sumusunod..." }, + "metametricsCommitmentsNeverCollect": { + "message": "Huwag mangolekta ng mga key, address, transaksyon, balanse, hash, o anumang personal na impormasyon" + }, "metametricsCommitmentsNeverCollectIP": { "message": "$1 kolektahin ang iyong IP address", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" @@ -933,6 +1660,12 @@ "message": "$1 nangongolekta ng mga key, address, transaksyon, balanse, hash, o anumang personal na impormasyon", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" }, + "metametricsCommitmentsNeverIP": { + "message": "Huwag magkolekta ng buong IP address" + }, + "metametricsCommitmentsNeverSell": { + "message": "Huwag magbenta ng data para sa profit. Kahit kailan!" + }, "metametricsCommitmentsNeverSellDataForProfit": { "message": "$1 nagbebenta ng data para pagkakitaan. Kahit kailan!", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" @@ -946,15 +1679,54 @@ "metametricsOptInDescription": { "message": "Gustong kunin ng MetaMask ang data ng paggamit para mas maunawaan kung paano ginagamit ng mga user namin ang extension. Gagamitin ang data na ito para patuloy na mapahusay ang kakayahang magamit at karanasan ng user sa paggamit ng produkto namin at Ethereum ecosystem." }, + "metametricsOptInDescription2": { + "message": "Nais naming mangalap ng pangunahing data ng paggamit upang mapabuti ang kakayahang magamit ang aming produkto. Ang mga sukatan na ito ay..." + }, + "metametricsTitle": { + "message": "Sumali sa 6M+ user upang mapabuti ang MetaMask" + }, + "mismatchedChain": { + "message": "Ang mga detalye ng network para sa chain ID na ito ay hindi tumutugma sa aming mga talaan. Inirerekomenda namin na $1 ka bago magpatuloy.", + "description": "$1 is a clickable link with text defined by the 'mismatchedChainLinkText' key" + }, + "mismatchedChainLinkText": { + "message": "i-verify ang mga detalye ng network", + "description": "Serves as link text for the 'mismatchedChain' key. This text will be embedded inside the translation for that key." + }, + "missingNFT": { + "message": "Hindi makita ang NFT mo?" + }, + "missingToken": { + "message": "Hindi makita ang token mo?" + }, + "mobileSyncWarning": { + "message": "Ang feature na 'I-sync gamit ang extension' ay pansamantalang hindi gumagana. Kung gusto mong gamitin ang iyong extension wallet sa MetaMask mobile, pagkatapos ay sa iyong mobile app: bumalik sa mga opsyon sa pag-setup ng wallet at piliin ang opsyong 'Mag-import gamit ang Secret Recovery Phrase'. Gamitin ang lihim na parirala ng iyong extension wallet upang pagkatapos ay i-import ang iyong wallet sa mobile." + }, "mustSelectOne": { "message": "Dapat pumili ng kahit 1 token lang." }, "myAccounts": { "message": "Mga Account Ko" }, + "name": { + "message": "Pangalan" + }, "needEtherInWallet": { "message": "Para makaugnayan ang mga decentralized ma application gamit ang MetaMask, kakailanganin mo ang Ether sa iyong wallet." }, + "needHelp": { + "message": "Kailangan ng tulong? Kontakin ang $1", + "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" + }, + "needHelpFeedback": { + "message": "Ibahagi ang iyong Feedback" + }, + "needHelpLinkText": { + "message": "MetaMask Support" + }, + "needHelpSubmitTicket": { + "message": "Magsumite ng Tiket" + }, "needImportFile": { "message": "Dapat kang pumili ng file na ii-import.", "description": "User is important an account and needs to add a file to continue" @@ -962,15 +1734,56 @@ "negativeETH": { "message": "Hindi makakapagpadala ng mga negatibong halaga ng ETH." }, + "networkDetails": { + "message": "Mga Detalye ng Network" + }, "networkName": { "message": "Pangalan ng Network" }, + "networkNameBSC": { + "message": "BSC" + }, + "networkNameDefinition": { + "message": "Ang panglan ay nauugnay sa network na ito." + }, + "networkNameEthereum": { + "message": "Ethereum" + }, + "networkNamePolygon": { + "message": "Polygon" + }, + "networkNameRinkeby": { + "message": "Rinkeby" + }, + "networkNameTestnet": { + "message": "Testnet" + }, "networkSettingsChainIdDescription": { "message": "Ginagaamit ang chain ID sa paglagda ng mga transaksyon. Dapat itong tumugma sa chain ID na ibinalik ng network. Puwede kang maglagay ng decimal o '0x'-prefixed hexadecimal number, pero ipapakita namin ang numero sa decimal." }, "networkSettingsDescription": { "message": "Magdagdag at mag-edit ng mga custom na RPC network" }, + "networkStatus": { + "message": "Network status" + }, + "networkStatusBaseFeeTooltip": { + "message": "Ang base fee ay itinakda ng network at nagbabago kada 12-14 na segundo. Ang aming $1 at $2 na options account para sa biglaang pagtaas.", + "description": "$1 and $2 are bold text for Medium and Aggressive respectively." + }, + "networkStatusPriorityFeeTooltip": { + "message": "Range ng priority fee (kilala rin bilang “miner tip”). Ito ay direktang napupunta sa mga miner at ginagawang insentibo ang mga ito upang unahin ang iyong transaksyon." + }, + "networkStatusStabilityFeeTooltip": { + "message": "Ang mga gas fee na $1 ay nauugnay sa huling 72 oras.", + "description": "$1 is networks stability value - stable, low, high" + }, + "networkURL": { + "message": "Network URL" + }, + "networkURLDefinition": { + "message": "Ang URL ay ginamit upang ma-access ang network na ito." + }, "networks": { "message": "Mga Network" }, @@ -987,12 +1800,27 @@ "message": "Account $1", "description": "Default name of next account to be created on create account screen" }, + "newCollectibleAddFailed": { + "message": "Ang collectible ay hindi idinagdag dahil: $1" + }, + "newCollectibleAddedMessage": { + "message": "Ang collectible ay tagumpay na naidagdag!" + }, "newContact": { "message": "Bagong Contact" }, "newContract": { "message": "Bagong Kontrata" }, + "newNFTsDetected": { + "message": "Bago! Pag-detect ng NFT" + }, + "newNFTsDetectedInfo": { + "message": "Payagan ang MetaMask na awtomatikong i-detect ang mga NFT mula sa Opensea at ipakita sa iyong MetaMask wallet." + }, + "newNetworkAdded": { + "message": "Ang “$1” matagumpay na naidagdag!" + }, "newPassword": { "message": "Bagong password (min na 8 char)" }, @@ -1005,6 +1833,9 @@ "newTransactionFee": { "message": "Bagong Bayarin sa Transaksyon" }, + "newValues": { + "message": "bagong value" + }, "next": { "message": "Susunod" }, @@ -1012,6 +1843,15 @@ "message": "Mas mataas ang noncesa iminumungkahing nonce na $1", "description": "The next nonce according to MetaMask's internal logic" }, + "nftTokenIdPlaceholder": { + "message": "Ilagay ang collectible ID" + }, + "nfts": { + "message": "Mga NFT" + }, + "nickname": { + "message": "Palayaw" + }, "noAccountsFound": { "message": "Walang nakitang account para sa ibinigay na query sa paghahanap" }, @@ -1021,9 +1861,15 @@ "noAlreadyHaveSeed": { "message": "Hindi, may Secret Recovery Phrase na ako" }, + "noConversionDateAvailable": { + "message": "Walang Available na Petsa sa Pag-convert ng Currency" + }, "noConversionRateAvailable": { "message": "Hindi Available ang Rate ng Conversion" }, + "noNFTs": { + "message": "Wala pang mga NFT" + }, "noThanks": { "message": "Huwag na lang" }, @@ -1036,6 +1882,9 @@ "noWebcamFoundTitle": { "message": "Hindi nakita ang webcam" }, + "nonce": { + "message": "Nonce" + }, "nonceField": { "message": "I-customize ang transaksyon nang isang beses" }, @@ -1045,12 +1894,104 @@ "nonceFieldHeading": { "message": "Custom na Nonce" }, + "notBusy": { + "message": "Hindi busy" + }, "notCurrentAccount": { "message": "Ito ba ang tamang account? Iba ito sa kasalukuyang napiling account sa iyong wallet" }, "notEnoughGas": { "message": "Hindi Sapat ang Gas" }, + "notifications1Description": { + "message": "Ang mga user ng MetaMask Mobile ay maaari na ngayong mag-swap ng mga token sa loob ng kanilang mobile wallet. I-scan ang QR code para makuha ang mobile app at magsimulang mag-swap.", + "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." + }, + "notifications1Title": { + "message": "Narito ang pag-swap sa mobile!", + "description": "Title for a notification in the 'See What's New' popup. Tells users that they can now use MetaMask Swaps on Mobile." + }, + "notifications3ActionText": { + "message": "Magbasa pa", + "description": "The 'call to action' on the button, or link, of the 'Stay secure' notification. Upon clicking, users will be taken to a page about security on the metamask support website." + }, + "notifications3Description": { + "message": "Manatiling may alam sa pinakamagagandang kasanayan sa seguridad ng MetaMask at kunin ang pinakabagong tips ng seguridad mula sa opisyal na suporta ng MetaMask.", + "description": "Description of a notification in the 'See What's New' popup. Describes the information they can get on security from the linked support page." + }, + "notifications3Title": { + "message": "Manatiling ligtas", + "description": "Title for a notification in the 'See What's New' popup. Encourages users to consider security." + }, + "notifications4ActionText": { + "message": "Simulan ang pag-swap", + "description": "The 'call to action' on the button, or link, of the 'Swap on Binance Smart Chain!' notification. Upon clicking, users will be taken to a page where then can swap tokens on Binance Smart Chain." + }, + "notifications4Description": { + "message": "Kunin ang pinakamagagandang papremyyo sa pag-swap ng token sa loob ng iyong wallet. Ikinokonekta ka na ngayon ng MetaMask sa maraming decentralized exchange aggregator at mga propesyonal na market maker sa Binance Smart Chain.", + "description": "Description of a notification in the 'See What's New' popup." + }, + "notifications4Title": { + "message": "Mag-swap sa Binance Smart Chain", + "description": "Title for a notification in the 'See What's New' popup. Encourages users to do swaps on Binance Smart Chain." + }, + "notifications5Description": { + "message": "Ang iyong \"Seed Phrase\" ay tinatawag na ngayon na iyong \"Sirektong Recovery Phrase.\"", + "description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update." + }, + "notifications6DescriptionOne": { + "message": "Simula sa Chrome version 91, ang API na nagpapagana ng aming Ledger support (U2F) ay hindi na sumusuporta sa mga hardware wallet. Ang MetaMask ay nagpatupad ng bagong Ledger Live support na nagpapahintulot sa iyo na magpatuloy na kumonekta sa iyong Ledger device sa pamamgitan ng Ledger Live desktop app.", + "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." + }, + "notifications6DescriptionThree": { + "message": "Kapag gingamit ang iyong Ledger account sa MetaMask, ang bagong tab ay magbubukas at hihilingin sa iyo ng buksan ang Ledger Live app. Kapag nabuksan na ang app, hihilingin sa iyo na payagan ang koneksyon ng WebSocket sa iyong MetaMask account. Ganun lang!", + "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." + }, + "notifications6DescriptionTwo": { + "message": "Maaari mong paganahin ang Ledger Live support sa pamamagitan ng pag-click sa Settings > Advanced > Gamitin ang Ledger Live.", + "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." + }, + "notifications6Title": { + "message": "Update ng Ledger Support para sa mga User ng Chrome", + "description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update" + }, + "notifications7DescriptionOne": { + "message": "Isinama ng MetaMask v10.1.0 ang bagong support para sa mga transaksyong EIP-1559 kapag gumagamit ng mga Ledger device.", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for ledger and EIP1559 in v10.1.0" + }, + "notifications7DescriptionTwo": { + "message": "Para makumpleto ang mga transaksyon sa Ethereum Mainnet, siguruhin na ang iyong Ledger device ay may pinakabagong firmware.", + "description": "Description of a notification in the 'See What's New' popup. Describes the need to update ledger firmware." + }, + "notifications7Title": { + "message": "Update ng Ledger firmware", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." + }, + "notifications8ActionText": { + "message": "Magpunta sa Advanced Settings", + "description": "Description on an action button that appears in the What's New popup. Tells the user that if they click it, they will go to our Advanced Settings page." + }, + "notifications8DescriptionOne": { + "message": "Para sa MetaMask v10.4.0, hindi mo na kailangang ikonekta ang Ledger Live sa iyong Ledger device sa MetaMask.", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for how Ledger Live is no longer needed to connect the device." + }, + "notifications8DescriptionTwo": { + "message": "Para sa mas madali at mas matatag na karanasan sa ledger, magpunta sa Advanced tab ng settings at ilipat sa 'Napiling Uri ng Koneksyon ng Ledger' sa 'WebHID'.", + "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." + }, + "notifications8Title": { + "message": "Pagpapabuti ng koneksyon ng ledger", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users that there is an improvement in how they can connect their device." + }, + "notifications9DescriptionOne": { + "message": "Binibigyan namin kayo ngayon ng mas maraming kaalaman sa tab na'Data' kapag kinukumpirma ang mga transaksyon ng smart contract." + }, + "notifications9DescriptionTwo": { + "message": "Mas maiintindihan mo na ngayon ang mga detalye ng transaksyon bago kumpirmahin, at mas madaling makakapagdagdag ng mga address ng transaksyon sa iyong address book, na nakaakatulong sa iyo na maging litas at malaman ang mga desisyon." + }, + "notifications9Title": { + "message": "👓 Pinadadali naming mabasa ang mga transaksyon." + }, "ofTextNofM": { "message": "ng" }, @@ -1066,13 +2007,79 @@ "on": { "message": "Naka-on" }, + "onboardingCreateWallet": { + "message": "Gumawa ng bagong wallet" + }, + "onboardingImportWallet": { + "message": "Mag-import ng umiiral na wallet" + }, + "onboardingPinExtensionBillboardAccess": { + "message": "Buong Access" + }, + "onboardingPinExtensionBillboardDescription": { + "message": "Makikita ang mga extension na ito at mababago ang impormasyon" + }, + "onboardingPinExtensionBillboardDescription2": { + "message": "sa site na ito." + }, + "onboardingPinExtensionBillboardTitle": { + "message": "Mga extension" + }, + "onboardingPinExtensionChrome": { + "message": "Mag-click sa con ng browser extension" + }, + "onboardingPinExtensionDescription": { + "message": "I-pin ang MetaMask sa iyong browser para madali itong ma-access at madaling makita ang mga kumpirmasyon ng transaksyon." + }, + "onboardingPinExtensionDescription2": { + "message": "Maaari mong buksan ang MetaMask sa pamamagitan ng pag-click sa ektensyon at pag-accesss sa wallet mo sa 1 click lang." + }, + "onboardingPinExtensionDescription3": { + "message": "Mag-click sa icon ng browser extension para agad itong ma-access" + }, + "onboardingPinExtensionLabel": { + "message": "I-pin ang MetaMask" + }, + "onboardingPinExtensionStep1": { + "message": "1" + }, + "onboardingPinExtensionStep2": { + "message": "2" + }, + "onboardingPinExtensionTitle": { + "message": "Ang pag-install ng iyong MetaMask ay kumpleto na!" + }, "onboardingReturnNotice": { "message": "Isasara ng \"$1\" ang tab na ito at ididirekta ka pabalik sa $2", "description": "Return the user to the site that initiated onboarding" }, + "onboardingShowIncomingTransactionsDescription": { + "message": "Ang pagpapakita ng mga papasok na transaksyon sa iyong wallet ay umaasa sa pakikipag-ugnayan sa $1. Magkakaroon ng access ang Etherscan sa iyong Ethereum address at iyong IP address. Tingnan ang $2.", + "description": "$1 is a clickable link with text defined by the 'etherscan' key. $2 is a clickable link with text defined by the 'privacyMsg' key." + }, + "onboardingUsePhishingDetectionDescription": { + "message": "Ang mga alerto sa pagtuklas ng phishing ay umaasa sa komunikasyon sa $1. Ang jsDeliver ay magkakaroon ng access sa iyong IP address. Tingnan ang $2.", + "description": "The $1 is the word 'jsDeliver', from key 'jsDeliver' and $2 is the words Privacy Policy from key 'privacyMsg', both separated here so that it can be wrapped as a link" + }, + "onlyAddTrustedNetworks": { + "message": "Ang isang malisyosong network provider ay maaaring magsinungaling tungkol sa estado ng blockchain at itala ang iyong aktibidad sa network. Magdagdag lamang ng mga custom na network na pinagkakatiwalaan mo." + }, "onlyConnectTrust": { "message": "Kumonekta lang sa mga site na pinagkakatiwalaan mo." }, + "openFullScreenForLedgerWebHid": { + "message": "Buksan ang MetaMask sa buong screen para ikonekta ang ledger mo sa pamamagitan ng WebHID.", + "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." + }, + "optional": { + "message": "Opsyonal" + }, + "optionalWithParanthesis": { + "message": "(Opsyonal)" + }, + "or": { + "message": "o" + }, "origin": { "message": "Pinagmulan" }, @@ -1091,6 +2098,12 @@ "passwordNotLongEnough": { "message": "Hindi sapat ang haba ng password" }, + "passwordSetupDetails": { + "message": "Ang password na ito ay magbubukas lamang ng iyong MetaMask wallet sa device na ito. Hindi matatakpan ng MetaMask ang password na ito." + }, + "passwordTermsWarning": { + "message": "Nauunawaan ko na hindi matatakpan ng MetaMask ang password na ito para sa akin. $1" + }, "passwordsDontMatch": { "message": "Hindi Magkatugma ang Mga Password" }, @@ -1101,6 +2114,19 @@ "pending": { "message": "Nakabinbin" }, + "pendingTransactionInfo": { + "message": "Hindi mapoproseso ang transaksyon na ito hangga't hindi nakukumpleto ang isang iyon." + }, + "pendingTransactionMultiple": { + "message": "Mayroon kang ($1) nakabinbin na mga transaksyon." + }, + "pendingTransactionSingle": { + "message": "Mayroon kang ($1) nakabinbin na transaksyon.", + "description": "$1 is count of pending transactions" + }, + "permissionRequest": { + "message": "Kahilingan sa pahintulot" + }, "permissions": { "message": "Mga Pahintulot" }, @@ -1111,6 +2137,10 @@ "message": "+ $1 pa", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, + "preferredLedgerConnectionType": { + "message": "Napiling Uri ng Ledger Connection", + "description": "A header for a dropdown in the advanced section of settings. Appears above the ledgerConnectionPreferenceDescription message" + }, "prev": { "message": "Nakaraan" }, @@ -1120,6 +2150,12 @@ "primaryCurrencySettingDescription": { "message": "Piliin ang native para maisapriyoridad ang pagpapakita ng mga value sa native na currency ng chain (hal. ETH). Piliin ang Fiat para maisapriyoridad ang pagpapakita ng mga value sa napili mong fiat currency." }, + "priorityFee": { + "message": "Priority fee" + }, + "priorityFeeProperCase": { + "message": "Priority Fee" + }, "privacyMsg": { "message": "Patakaran sa Pagkapribado" }, @@ -1133,14 +2169,20 @@ "privateNetwork": { "message": "Pribadong Network" }, + "proceedWithTransaction": { + "message": "Gusto ko pa ring magpatuloy" + }, "proposedApprovalLimit": { "message": "Iminumungkahing Limitasyon sa Pag-apruba" }, "provide": { "message": "Ibigay" }, + "publicAddress": { + "message": "Public Address" + }, "queue": { - "message": "Queue" + "message": "Pila" }, "queued": { "message": "Naka-queue" @@ -1157,6 +2199,36 @@ "recipientAddressPlaceholder": { "message": "Maghanap, pampublikong address (0x), o ENS" }, + "recommendedGasLabel": { + "message": "Nirekomenda" + }, + "recoveryPhraseReminderBackupStart": { + "message": "Magsimula rito" + }, + "recoveryPhraseReminderConfirm": { + "message": "Nakuha ko" + }, + "recoveryPhraseReminderHasBackedUp": { + "message": "Palaging panatilihin ang iyong Secret Recovery Phrase sa isang ligtas at sikretong lugar" + }, + "recoveryPhraseReminderHasNotBackedUp": { + "message": "Kailangang i-backup muli ang iyong Secret Recovery Phrase?" + }, + "recoveryPhraseReminderItemOne": { + "message": "Huwag kailanman ibahagi ang iyong Secret Recovery Phrase sa sinuman" + }, + "recoveryPhraseReminderItemTwo": { + "message": "Hindi kailanman hihingin ng MetaMask team ang iyong Secret Recovery Phrase" + }, + "recoveryPhraseReminderSubText": { + "message": "Kinokontrol ng iyong Secret Recovery Phrase ang lahat ng iyong account." + }, + "recoveryPhraseReminderTitle": { + "message": "Protektahan ang iyong pondo" + }, + "refreshList": { + "message": "I-refresh ang listahan" + }, "reject": { "message": "Tanggihan" }, @@ -1172,6 +2244,9 @@ "rejected": { "message": "Tinanggihan" }, + "remember": { + "message": "Tandaan:" + }, "remindMeLater": { "message": "Paalalahanan ako mamaya" }, @@ -1184,6 +2259,9 @@ "removeAccountDescription": { "message": "Tatanggalin ang account na ito sa iyong wallet. Tiyaking nasa iyo ang orihinal na Secret Recovery Phrase o private key para sa na-import na account na ito bago magpatuloy. Puwede kang mag-import o gumawa ulit ng mga account mula sa drop-down ng account. " }, + "removeNFT": { + "message": "Tanggalin ang NFT" + }, "requestsAwaitingAcknowledgement": { "message": "mga request na hinihintay na tanggapin" }, @@ -1269,12 +2347,72 @@ "secretBackupPhraseWarning": { "message": "BABALA: Huwag kailanman ipaalam ang iyong phrase sa pag-back up. Ang sinumang may phrase na ito ay maaaring angkinin ang iyong Ether." }, + "secretPhrase": { + "message": "Ang unang account lang sa wallet na ito ang awtomatikong maglo-load. Pagkatapos makumpleto ang prosesong ito, upang magdagdag ng mga karagdagang account, i-click ang drop down na menu, pagkatapos ay piliin ang Gumawa ng Account." + }, + "secretPhraseWarning": { + "message": "Kapag nagre-restore ka gamit ang isa pang Secret Recovery Phrase, permanenteng aalisin sa app na ito ang iyong kasalukuyang wallet, mga account, at asset. Ang gawaing ito ay hindi pwedeng baguhin." + }, + "secretRecoveryPhrase": { + "message": "Secret Recovery Phrase" + }, + "secureWallet": { + "message": "Secure Wallet" + }, "securityAndPrivacy": { "message": "Seguridad at Pagkapribado" }, "securitySettingsDescription": { "message": "Mga setting ng privacy at Secret Recovery Phrase ng wallet" }, + "seedPhraseConfirm": { + "message": "Kumpirmahin ang Secret Recovery Phrase" + }, + "seedPhraseEnterMissingWords": { + "message": "Kumpirmahin ang Secret Recovery Phrase" + }, + "seedPhraseIntroNotRecommendedButtonCopy": { + "message": "Ipaalala sa amin sa ibang pagkakataon (hindi nirerekomenda)" + }, + "seedPhraseIntroRecommendedButtonCopy": { + "message": "I-secure ang aking wallet (nirerekomenda)" + }, + "seedPhraseIntroSidebarBulletFour": { + "message": "Isulat at itago sa maraming sikretong lugar." + }, + "seedPhraseIntroSidebarBulletOne": { + "message": "I-save sa password manager" + }, + "seedPhraseIntroSidebarBulletThree": { + "message": "Itago sa safe-deposit box." + }, + "seedPhraseIntroSidebarBulletTwo": { + "message": "Itago sa bank vault." + }, + "seedPhraseIntroSidebarCopyOne": { + "message": "Ang iyong Secret Recovery Phrase ay isang 12 salitang parirala na \"master key\" sa iyong wallet at sa iyong pondo" + }, + "seedPhraseIntroSidebarCopyThree": { + "message": "Kung may humingi ng iyong recovery phrase, malamang na sinusubukan ka nilang i-scam at nakawin ang mga pondo ng iyong wallet" + }, + "seedPhraseIntroSidebarCopyTwo": { + "message": "Huwag kailanman ibahagi ang iyong Secret Recovery Phrase, kahit sa MetaMask!" + }, + "seedPhraseIntroSidebarTitleOne": { + "message": "Ano ang Secret Recovery Phrase?" + }, + "seedPhraseIntroSidebarTitleThree": { + "message": "Maaari ko bang ibahagi ang aking Secret Recovery Phrase?" + }, + "seedPhraseIntroSidebarTitleTwo": { + "message": "Paano ko masi-save ang aking Secret Recovery Phrase?" + }, + "seedPhraseIntroTitle": { + "message": "I-secure ang wallet mo" + }, + "seedPhraseIntroTitleCopy": { + "message": "Bago magsimula, panoorin ang maikling video na ito upang malaman ang tungkol sa iyong Secret Recovery Phrase at paano mapapanatiling ligtas ang wallet mo." + }, "seedPhrasePlaceholder": { "message": "Paghiwa-hiwalayin ang bawat salita gamit ang espasyo" }, @@ -1284,6 +2422,12 @@ "seedPhraseReq": { "message": "Ang mga Secret Recovery Phrase ay naglalaman ng 12, 15, 18, 21, o 24 na salita" }, + "seedPhraseWriteDownDetails": { + "message": "Isulat ang 12 salitang Secret Recovery Phrase at i-save sa lugar na pinagkakatiwalaan mo at ikaw ang ang makaka-access." + }, + "seedPhraseWriteDownHeader": { + "message": "Isulat ang iyong Secret Recovery Phrase" + }, "selectAHigherGasFee": { "message": "Pumili ng mas malaking bayarin sa gas para mapabilis ang pagproseso ng iyong transaksyon.*" }, @@ -1296,12 +2440,18 @@ "selectAnAccount": { "message": "Pumili ng Account" }, + "selectAnAccountAlreadyConnected": { + "message": "Ang acount na ito ay nakakonekta na sa MetaMask" + }, "selectEachPhrase": { "message": "Pakipili ang bawat phrase para matiyak na tama ito." }, "selectHdPath": { "message": "Pumili ng HD Path" }, + "selectNFTPrivacyPreference": { + "message": "I-on ang pag-detect ng NFT sa Settings" + }, "selectPathHelp": { "message": "Kung hindi mo makita ang mga kasalukuyan mong Ledger account sa ibaba, subukang ilipat ang path sa \"Legacy (MEW / MyCrypto)\"" }, @@ -1321,15 +2471,31 @@ "message": "Magpadala ng $1", "description": "Symbol of the specified token" }, + "sendTo": { + "message": "Ipadala kay" + }, "sendTokens": { "message": "Magpadala ng Mga Token" }, + "sendingNativeAsset": { + "message": "Nagpapadala ng $1", + "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" + }, "separateEachWord": { "message": "Paghiwa-hiwalayin ang bawat salita gamit ang espasyo" }, + "setAdvancedPrivacySettings": { + "message": "Magtakda ng advanced privacy settings" + }, + "setAdvancedPrivacySettingsDetails": { + "message": "Ginagamit ng MetaMask ang mga pinagkakatiwalaang serbisyo ng third-party na ito para mapahusay ang kakayahang magamit at kaligtasan ng produkto." + }, "settings": { "message": "Mga Setting" }, + "show": { + "message": "Ipakita" + }, "showAdvancedGasInline": { "message": "Mga advanced na kontrol sa gas" }, @@ -1348,6 +2514,9 @@ "showHexDataDescription": { "message": "Piliin ito para ipakita ang field ng hex data sa screen ng pagpapadala" }, + "showHide": { + "message": "Ipakita/itago" + }, "showIncomingTransactions": { "message": "Ipakita ang Mga Papasok na Transaksyon" }, @@ -1360,9 +2529,18 @@ "showPrivateKeys": { "message": "Ipakita ang Mga Pribadong Key" }, + "showRecommendations": { + "message": "Ipakita ang mga Rekomendasyon" + }, "showSeedPhrase": { "message": "Ipakita ang Secret Recovery Phrase" }, + "showTestnetNetworks": { + "message": "Ipakita ang mga test network" + }, + "showTestnetNetworksDescription": { + "message": "Piliin ito para ipakita ang mga test network sa listahan ng network" + }, "sigRequest": { "message": "Request na Paglagda" }, @@ -1381,18 +2559,45 @@ "signed": { "message": "Nilagdaan" }, + "simulationErrorMessage": { + "message": "Inaasahang mabibigo ang transaksyong ito. Ang pagsisikap na isagawa ito ay inaasahang magastos ngunit nabigo, at hindi inirerekomenda." + }, + "simulationErrorMessageV2": { + "message": "Hindi namin nagawang tantyahin ang gas. Maaaring may error sa kontrata at maaaring mabigo ang transaksyong ito." + }, + "skip": { + "message": "Laktawan" + }, + "skipAccountSecurity": { + "message": "Laktawan ang Account Security?" + }, + "skipAccountSecurityDetails": { + "message": "Nauunawaan ko na hanggang sa i-back up ko ang aking Secret Recovery Phrase, maaari kong maiwala ang aking mga account at lahat ng kanilang mga asset." + }, "slow": { "message": "Mabagal" }, "somethingWentWrong": { "message": "Oops! Nagkaproblema." }, + "source": { + "message": "Source" + }, "speedUp": { "message": "Pabilisin" }, "speedUpCancellation": { "message": "Pabilisin ang pagkanselang ito" }, + "speedUpExplanation": { + "message": "Na-update na namin ang bayad sa gas batay sa kasalukuyang kundisyon ng network at tinaasan namin ito ng hindi bababa sa 10% (kinakailangan ng network)." + }, + "speedUpPopoverTitle": { + "message": "Pabilisin ang transaksyon" + }, + "speedUpTooltipText": { + "message": "Bagong gas fee" + }, "speedUpTransaction": { "message": "Pabilisin ang transaksyong ito" }, @@ -1415,6 +2620,12 @@ "spendLimitTooLarge": { "message": "Masyadong malaki ang limitasyon sa paggastos" }, + "stable": { + "message": "Stable" + }, + "stableLowercase": { + "message": "stable" + }, "stateLogError": { "message": "Error sa pagkuha ng mga log ng estado." }, @@ -1433,6 +2644,34 @@ "statusNotConnected": { "message": "Hindi nakakonekta" }, + "step1LatticeWallet": { + "message": "Siguruhin na ang iyong Lattice1 ay handang ikonekta" + }, + "step1LatticeWalletMsg": { + "message": "Maaari mong ikonekta ang MetaMask sa iyong Lattice1 device kapag na-set up na ito at online. I-unlock ang iyong device at ihanda ang iyong Device ID. Para sa higit pa sa paggamit ng mga wallet ng hardware, $1", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, + "step1LedgerWallet": { + "message": "Mag-download ng Ledger app" + }, + "step1LedgerWalletMsg": { + "message": "Mag-download, mag-set up, at maglagay ng password para ma-unlock ang $1.", + "description": "$1 represents the `ledgerLiveApp` localization value" + }, + "step1TrezorWallet": { + "message": "I-plug sa Trezor wallet" + }, + "step1TrezorWalletMsg": { + "message": "Direktang ikonekta ang iyong wallet sa iyong computer. Para sa higit pa sa paggamit ng iyong hardware wallet device, $1", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, + "step2LedgerWallet": { + "message": "I-plug sa Ledger wallet" + }, + "step2LedgerWalletMsg": { + "message": "Direktang ikonekta ang iyong wallet sa iyong computer. I-unlock ang iyong Ledger at buksan ang Ethereum app. Para sa higit pa sa paggamit ng iyong hardware wallet device, $1.", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, "storePhrase": { "message": "I-store ang phrase na ito sa isang password manager gaya ng 1Password." }, @@ -1442,6 +2681,9 @@ "submitted": { "message": "Isinumite" }, + "support": { + "message": "Support" + }, "supportCenter": { "message": "Bisitahin ang aming Support Center" }, @@ -1454,6 +2696,10 @@ "swapAggregator": { "message": "Aggregator" }, + "swapAllowSwappingOf": { + "message": "Payagan ang pag-swap ng $1", + "description": "Shows a user that they need to allow a token for swapping on their hardware wallet" + }, "swapAmountReceived": { "message": "Garantisadong halaga" }, @@ -1468,15 +2714,31 @@ "message": "Kailangan mo ng $1 pa $2 para makumpleto ang pag-swap na ito", "description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol." }, + "swapBestOfNQuotes": { + "message": "Pinakamaganda ng $1 na quote.", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, "swapBuildQuotePlaceHolderText": { "message": "Walang available na token na tumutugma sa $1", "description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text" }, + "swapConfirmWithHwWallet": { + "message": "Kumpirmahin gamit ang iyong hardware wallet" + }, + "swapContractDataDisabledErrorDescription": { + "message": "Sa Ethereum app sa iyong Ledger, magpunta sa \"Settings\" at payagan ang contract data. Pagkatapos ay subukan muli ang iyong pag-swap." + }, + "swapContractDataDisabledErrorTitle": { + "message": "Ang data ng contract ay hindi pinagagana sa iyong Ledger" + }, "swapCustom": { "message": "custom" }, "swapDecentralizedExchange": { - "message": "Decentralized exchange" + "message": "Decentralized na palitan" + }, + "swapDirectContract": { + "message": "Direktang contract" }, "swapEditLimit": { "message": "I-edit ang limitasyon" @@ -1485,15 +2747,26 @@ "message": "Kinakailangan ito at nagbibigay ito ng pahintulot sa MetaMask na i-swap ang iyong $1.", "description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps." }, + "swapEnableTokenForSwapping": { + "message": "Ito ay $1 para sa pag-swap", + "description": "$1 is for the 'enableToken' key, e.g. 'enable ETH'" + }, "swapEstimatedNetworkFees": { "message": "Mga tinatayang bayarin sa network" }, "swapEstimatedNetworkFeesInfo": { "message": "Ito ay pagtatantya ng bayarin sa network na gagamitin para kumpletuhin ang iyong pag-swap. Maaaring magbago ang aktuwal na halaga ayon sa mga kundisyon ng network." }, + "swapFailedErrorDescriptionWithSupportLink": { + "message": "Nangyayari ang mga pagkabigo sa transaksyon at narito kami upang tumulong. Kung magpapatuloy ang isyung ito, maaari kapag makipag-ugnay sa aming suporta sa customer sa $1 para sa karagdagang tulong.", + "description": "This message is shown to a user if their swap fails. The $1 will be replaced by support.metamask.io" + }, "swapFailedErrorTitle": { "message": "Hindi matagumpay ang pag-swap" }, + "swapFetchingQuotes": { + "message": "Kinukuha ang mga quote" + }, "swapFetchingQuotesErrorDescription": { "message": "Hmmm... nagkaproblema. Subukan ulit, o kung magpapatuloy ang mga error, makipag-ugnayan sa customer support." }, @@ -1503,6 +2776,30 @@ "swapFetchingTokens": { "message": "Kinukuha ang mga token..." }, + "swapFromTo": { + "message": "Ang swap ng $1 hanggang $2", + "description": "Tells a user that they need to confirm on their hardware wallet a swap of 2 tokens. $1 is a source token and $2 is a destination token" + }, + "swapGasFeesDetails": { + "message": "Ang mga bayarin sa gas ay tinatantya at magbabago batay sa trapiko sa network at pagiging kumplikado ng transaksyon." + }, + "swapGasFeesLearnMore": { + "message": "Alamin pa ang tungkol sa mga gas fee" + }, + "swapGasFeesSplit": { + "message": "Ang mga gas fee sa nakaraang screen ay hinati sa dalawang transaksyon." + }, + "swapGasFeesSummary": { + "message": "Ang mga gas fee ay binabayaran sa mga crypto miner na nagpoproseso ng mga transaksyon sa $1 na network. Ang MetaMask ay hindi kumikita mula sa mga gas fee.", + "description": "$1 is the selected network, e.g. Ethereum or BSC" + }, + "swapHighSlippageWarning": { + "message": "Napakataas ng halaga ng slippage." + }, + "swapIncludesMMFee": { + "message": "Kasama ang $1% MetaMask fee.", + "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." + }, "swapLowSlippageError": { "message": "Maaaring hindi magtagumpay ang transaksyon, masyadong mababa ang max na slippage." }, @@ -1516,6 +2813,10 @@ "message": "Hinahanap namin ang pinakasulit na presyo mula sa mga nangungunang pinagkukunan ng liquidity, sa lahat ng pagkakataon. Ang bayarin na $1% ay awtomatikong fina-factor sa bawat quote, na sumusuporta sa kasalukuyang development para mas mapahusay ang MetaMask.", "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." }, + "swapNQuotesWithDot": { + "message": "$1 quote.", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, "swapNewQuoteIn": { "message": "Mga bagong quote sa $1", "description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00" @@ -1524,6 +2825,23 @@ "message": "Idaragdag ang iyong $1 sa account mo sa oras na maiproseso ang transaksyong ito.", "description": "This message communicates the token that is being transferred. It is shown on the awaiting swap screen. The $1 will be a token symbol." }, + "swapPriceDifference": { + "message": "Gagawin mo na ang pag-swap ng $1 $2 (~$3) para sa $4 $5 (~$6).", + "description": "This message represents the price slippage for the swap. $1 and $4 are a number (ex: 2.89), $2 and $5 are symbols (ex: ETH), and $3 and $6 are fiat currency amounts." + }, + "swapPriceDifferenceTitle": { + "message": "Deperensya ng presyo ng ~$1%", + "description": "$1 is a number (ex: 1.23) that represents the price difference." + }, + "swapPriceImpactTooltip": { + "message": "Ang price impact ay ang pagkakaiba sa pagitan ng kasalukuyang market price at ang halagang natanggap sa panahon ng pagpapatupad ng transaksyon. Ang price impact ay isang function ng laki ng iyong trade kaugnay sa laki ng liquidity pool." + }, + "swapPriceUnavailableDescription": { + "message": "Hindi matukoy ang price impact dahil sa kakulangan ng data ng market price. Pakikumpirma na kumportable ka sa dami ng mga token na matatanggap mo bago mag-swap." + }, + "swapPriceUnavailableTitle": { + "message": "Tingnan ang iyong rate bago magpatuloy" + }, "swapProcessing": { "message": "Pagproseso" }, @@ -1564,6 +2882,9 @@ "swapRequestForQuotation": { "message": "Mag-request ng quotation" }, + "swapReviewSwap": { + "message": "I-review ang Pag-swap" + }, "swapSearchForAToken": { "message": "Maghanap ng token" }, @@ -1579,12 +2900,21 @@ "swapSelectQuotePopoverDescription": { "message": "Makikita sa ibaba ang lahat ng quote na nakuha mula sa maraming pinagkukunan ng liquidity." }, + "swapSlippageNegative": { + "message": "Ang slippage ay dapat mas malaki o katumbas ng zero" + }, "swapSource": { "message": "Pinagkunan ng liquidity" }, "swapSourceInfo": { "message": "Naghahanap kami ng maraming pinagkukunan ng liquidity (mga exchange, aggregator at propesyonal na market maker) para mahanap ang mga pinakasulit na rate at pinakamababang bayarin sa network." }, + "swapSuggested": { + "message": "Minungkahing pag-swap" + }, + "swapSuggestedGasSettingToolTipMessage": { + "message": "Ang mga swap ay kumpikado at sensitibo sa oras na mga transaksyon. Nirerekomenda namin ang gas fee na ito para sa magandang balanse sa pagitan ng halaga at kumpiyansa ng matagumpay na Pag-swap." + }, "swapSwapFrom": { "message": "Ipalit mula sa" }, @@ -1594,17 +2924,45 @@ "swapSwapTo": { "message": "Palitan ng" }, + "swapToConfirmWithHwWallet": { + "message": "para kumpirmahin gamit ang iyong hardware wallet" + }, "swapTokenAvailable": { "message": "Naidagdag na ang $1 sa iyong account.", "description": "This message is shown after a swap is successful and communicates the exact amount of tokens the user has received for a swap. The $1 is a decimal number of tokens followed by the token symbol." }, + "swapTokenBalanceUnavailable": { + "message": "Hindi namin nabawi ang iyong $1 na balanse", + "description": "This message communicates to the user that their balance of a given token is currently unavailable. $1 will be replaced by a token symbol" + }, "swapTokenToToken": { "message": "I-swap ang $1 sa $2", "description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap." }, + "swapTokenVerificationAddedManually": { + "message": "Manwal na naidagdag ang token na ito." + }, + "swapTokenVerificationMessage": { + "message": "Palaging kumpirmahin ang token address sa $1.", + "description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover." + }, + "swapTokenVerificationOnlyOneSource": { + "message": "Na-verify lamang sa 1 source." + }, + "swapTokenVerificationSources": { + "message": "Na-verify sa $1 na source.", + "description": "Indicates the number of token information sources that recognize the symbol + address. $1 is a decimal number." + }, + "swapTooManyDecimalsError": { + "message": "Ang $1 ay nagpapahintulot sa hanggang $2 na decimal", + "description": "$1 is a token symbol and $2 is the max. number of decimals allowed for the token" + }, "swapTransactionComplete": { "message": "Nakumpleto ang transaksyon" }, + "swapTwoTransactions": { + "message": "2 transakasyon" + }, "swapUnknown": { "message": "Hindi Alam" }, @@ -1622,6 +2980,9 @@ "swapsAdvancedOptions": { "message": "Mga Advanced na Opsyon" }, + "swapsExcessiveSlippageWarning": { + "message": "Masyadong mataas ang halaga ng slippage at magreresulta sa masamang rate. Mangyaring bawasan ang iyong slippage tolerance sa halagang mas mababa sa 15%." + }, "swapsMaxSlippage": { "message": "Max na slippage" }, @@ -1632,18 +2993,36 @@ "swapsViewInActivity": { "message": "Tingnan sa aktibidad" }, + "switchEthereumChainConfirmationDescription": { + "message": "Maglilipat ito sa napiling network sa loob ng MetaMask sa dating idinagdag na network:" + }, + "switchEthereumChainConfirmationTitle": { + "message": "Payagan ang site na ito para lumipat ng network?" + }, + "switchNetwork": { + "message": "Lumipat ng network" + }, "switchNetworks": { "message": "Lumipat ng Network" }, "switchToThisAccount": { "message": "Lumipat sa account na ito" }, + "switchingNetworksCancelsPendingConfirmations": { + "message": "Ang paglipat ng mga network ay magkakansela ng lahat ng nakabinbin na mga kumpirmasyon" + }, "symbol": { "message": "Simbolo" }, "symbolBetweenZeroTwelve": { "message": "Dapat ay 11 character o mas kaunti ang simbolo." }, + "syncFailed": { + "message": "Bigong ma-sync" + }, + "syncInProgress": { + "message": "Kasalukuyang nagsi-sync" + }, "syncWithMobile": { "message": "I-sync sa mobile" }, @@ -1686,6 +3065,9 @@ "thisWillCreate": { "message": "Gagawa ito ng bagong wallet at Secret Recovery Phrase" }, + "time": { + "message": "Oras" + }, "tips": { "message": "Mga Tip" }, @@ -1696,6 +3078,10 @@ "message": "Para kay/sa: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, + "toggleTestNetworks": { + "message": "$1 na test network", + "description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open to the advanced settings where users can enable the display of test networks in the network dropdown." + }, "token": { "message": "Token" }, @@ -1705,9 +3091,18 @@ "tokenContractAddress": { "message": "Address ng Kontrata ng Token" }, + "tokenDecimalFetchFailed": { + "message": "Kailangan ng token decimal." + }, + "tokenDetectionAnnouncement": { + "message": "Bago! Ang pinahusay na pagtukoy ng token ay magagamit sa Ethereum Mainnet bilang isang pang-eksperimentong feature. $1" + }, "tokenSymbol": { "message": "Simbolo ng Token" }, + "tooltipApproveButton": { + "message": "Nauunawaan ko" + }, "total": { "message": "Kabuuan" }, @@ -1726,6 +3121,48 @@ "transactionCreated": { "message": "Nagawa ang transaksyon na nagkakahalagang $1 sa $2." }, + "transactionData": { + "message": "Data ng transaksyon" + }, + "transactionDecodingAccreditationDecoded": { + "message": "Na-decode ng Truffle" + }, + "transactionDecodingAccreditationVerified": { + "message": "Na-verify na contract sa $1" + }, + "transactionDecodingUnsupportedNetworkError": { + "message": "Ang pag-decode ng transaksyon ay hindi available para sa chainId $1" + }, + "transactionDetailDappGasMoreInfo": { + "message": "Minungkahing site" + }, + "transactionDetailDappGasTooltip": { + "message": "I-edit upang gamitin ang nirerekomendang gas fee ng MetaMask batay sa pinakabagong block." + }, + "transactionDetailGasHeading": { + "message": "Tinantiyang gas fee" + }, + "transactionDetailGasInfoV2": { + "message": "tinantiya" + }, + "transactionDetailGasTooltipConversion": { + "message": "Alamin pa ang tungkol sa mga gas fee" + }, + "transactionDetailGasTooltipExplanation": { + "message": "Ang mga gas fee ay itinakda ng network at nagbabago-bago batay sa network traffic at pagiging kumplikado ng transaksyon." + }, + "transactionDetailGasTooltipIntro": { + "message": "Ang mga gas fee ay binabayaran sa mga crypto miner na nagpoproseso ng mga transaksyon sa $1 na network. Ang MetaMask ay hindi kumikita mula sa mga gas fee." + }, + "transactionDetailGasTotalSubtitle": { + "message": "Halaga + gas fee" + }, + "transactionDetailLayer2GasHeading": { + "message": "Layer 2 gas fee" + }, + "transactionDetailMultiLayerTotalSubtitle": { + "message": "Halaga + fees" + }, "transactionDropped": { "message": "Tinanggihan ang transaksyon sa $2." }, @@ -1741,6 +3178,27 @@ "transactionFee": { "message": "Bayarin sa Transaksyon" }, + "transactionHistoryBaseFee": { + "message": "Base Fee (GWEI)" + }, + "transactionHistoryL1GasLabel": { + "message": "Kabuuang L1 Gas Fee" + }, + "transactionHistoryL2GasLimitLabel": { + "message": "L2 Gas Limit" + }, + "transactionHistoryL2GasPriceLabel": { + "message": "L2 Gas Price" + }, + "transactionHistoryMaxFeePerGas": { + "message": "Max Fee Bawat Gas" + }, + "transactionHistoryPriorityFee": { + "message": "Priority Fee (GWEI)" + }, + "transactionHistoryTotalGasFee": { + "message": "Kabuuang Gas Fee" + }, "transactionResubmitted": { "message": "Isinumite ulit ang transaksyon nang may bayarin sa gas na tumaas at naging $1 sa $2" }, @@ -1767,12 +3225,31 @@ "message": "Nagkaproblema kami sa pag-load ng mga balanse ng iyong token. Puwede mong tingnan ang mga iyon ", "description": "Followed by a link (here) to view token balances" }, + "trustSiteApprovePermission": { + "message": "Sa pamamagitan ng pagbibigay ng pahintulot, pinapayagan mo ang sumusunod na $1 para ma-access ang pondo mo" + }, "tryAgain": { "message": "Subukan ulit" }, + "tryAnywayOption": { + "message": "Susubukan ko pa rin" + }, + "turnOnTokenDetection": { + "message": "I-on ang pinahusay na pag-detect ng token" + }, + "twelveHrTitle": { + "message": "12 oras:" + }, + "txInsightsNotSupported": { + "message": "Hindi magagamit ang mga pag-alam sa transaksyon para sa contract na ito sa oras na ito." + }, "typePassword": { "message": "Uri ng password ng iyong MetaMask" }, + "u2f": { + "message": "U2F", + "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." + }, "unapproved": { "message": "Hindi inaprubahan" }, @@ -1803,6 +3280,18 @@ "unlockMessage": { "message": "Naghihintay ang decentralized web" }, + "unrecognizedChain": { + "message": "Hindi nakikilala ang custom network na ito. Nirerekomenda namin na ikaw ay $1 bago magpatuloy", + "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." + }, + "unrecognizedChainLinkText": { + "message": "i-verify ang mga detalye ng network", + "description": "Serves as link text for the 'unrecognizedChain' key. This text will be embedded inside the translation for that key." + }, + "unsendableAsset": { + "message": "Ang pagpapadala ng collectible (ERC-721) token ay kasalukuyang hindi magagamit", + "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" + }, "updatedWithDate": { "message": "Na-update noong $1" }, @@ -1812,42 +3301,139 @@ "urlExistsErrorMsg": { "message": "Nasa kasalukuyang listahan ng mga network na ang URL" }, + "useCollectibleDetection": { + "message": "Autodetect ng mga NFT" + }, + "useCollectibleDetectionDescription": { + "message": "Ang pagpapakita ng media at data ng mga NFT ay maaaring maglantad sa IP address sa iyong mga centralized server. Ang mga Third-party API (tulad ng OpenSea) ay ginagamit upang ma-detect ang mga NFT sa iyong wallet. Maglalantad ito sa iyong account address sa mga serbisyong iyon. Hayaan itong naka-disable kung ayaw mong kunin ng app ang data mula sa mga serbisyong iyon." + }, "usePhishingDetection": { "message": "Gumamit ng Pag-detect ng Phishing" }, "usePhishingDetectionDescription": { "message": "Magpakita ng babala para sa mga phishing domain na nagta-target sa mga user ng Ethereum" }, + "useTokenDetection": { + "message": "Gamitin ang Pag-detect ng Token" + }, + "useTokenDetectionDescription": { + "message": "Gumagamit kami ng mga third-party na API para makita at magpakita ng mga bagong token na ipinadala sa iyong wallet. I-off kung ayaw mong makuha ng MetaMask ang data mula sa mga serbisyong iyon." + }, "usedByClients": { "message": "Ginagamit ng iba't ibang client" }, "userName": { "message": "Username" }, + "verifyThisTokenDecimalOn": { + "message": "Ang token decimal ay maaaring matagpuan sa $1", + "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" + }, "verifyThisTokenOn": { "message": "I-verify ang token na ito sa $1", "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" }, + "verifyThisUnconfirmedTokenOn": { + "message": "I-verify ang token na ito sa $1 at siguruhin na ito ang token na gusto mong i-trade.", + "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" + }, "viewAccount": { "message": "Tingnan ang Account" }, + "viewAllDetails": { + "message": "Tingnan ang lahat ng detalye" + }, "viewContact": { "message": "Tingnan ang Contact" }, + "viewFullTransactionDetails": { + "message": "Tingnan ang buong detalye ng transaksyon" + }, + "viewMore": { + "message": "Tingnan Pa" + }, + "viewOnBlockExplorer": { + "message": "Tingnan sa block explorer" + }, + "viewOnCustomBlockExplorer": { + "message": "Tingnan ang $1 sa $2", + "description": "$1 is the action type. e.g (Account, Transaction, Swap) and $2 is the Custom Block Exporer URL" + }, + "viewOnEtherscan": { + "message": "Tingnan ang $1 sa Etherscan", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, + "viewOnOpensea": { + "message": "Tingnan sa Opensea" + }, + "viewinExplorer": { + "message": "Tingnan ang $1 sa Explorer", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, "visitWebSite": { "message": "Bisitahin ang aming website" }, "walletConnectionGuide": { "message": "ang aming gabay sa pagkonekta ng hardware wallet" }, + "walletCreationSuccessDetail": { + "message": "Tagumpay mong naprotektahan ang iyong wallet. Panatilihing ligtas ang iyong Secret Recovery Phrase at sikreto - pananagutan mo ito!" + }, + "walletCreationSuccessReminder1": { + "message": "Di mababawi ng MetaMask ang iyong Secret Recovery Phrase." + }, + "walletCreationSuccessReminder2": { + "message": "Kailanman ay hindi hihingin ng MetaMask ang iyong Secret Recovery Phrase." + }, + "walletCreationSuccessReminder3": { + "message": "$1 sa sinuman o panganib na manakaw ang iyong pondo", + "description": "$1 is separated as walletCreationSuccessReminder3BoldSection so that we can bold it" + }, + "walletCreationSuccessReminder3BoldSection": { + "message": "Huwag kailanman ibahagi ang iyong Secret Recovery Phrase", + "description": "This string is localized separately from walletCreationSuccessReminder3 so that we can bold it" + }, + "walletCreationSuccessTitle": { + "message": "Matagumpay ang paggawa ng wallet" + }, "walletSeedRestore": { "message": "Recovery Phrase ng Wallet Secret" }, + "web3ShimUsageNotification": { + "message": "Napansin namin na sinubukan ng kasalukuyang website na gamitin ang inalis na window.web3 API. Kung mukhang sira ang site, paki-click ang $1 para sa karagdagang impormasyon.", + "description": "$1 is a clickable link." + }, + "webhid": { + "message": "WebHID", + "description": "Refers to a interface for connecting external devices to the browser. Used for connecting ledger to the browser. Read more here https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API" + }, "welcome": { "message": "Welcome sa MetaMask" }, "welcomeBack": { - "message": "Welcome Back!" + "message": "Maligayang Pagbabalik!" + }, + "welcomeExploreDescription": { + "message": "Mag-imbak, magpadala at gumastos ng mga cryto currency at asset." + }, + "welcomeExploreTitle": { + "message": "Magsaliksik sa mga decentralized app" + }, + "welcomeLoginDescription": { + "message": "Gamitin ang iyong MetaMask para mag-login sa mga decentralized app, hindi na kailangang mag-sign up." + }, + "welcomeLoginTitle": { + "message": "Mag-hello sa iyong wallet" + }, + "welcomeToMetaMask": { + "message": "Magsimula na tayo" + }, + "welcomeToMetaMaskIntro": { + "message": "Ang Metamask na pinagkakatiwalaan ng milyun-milyon ay isang ligtas na wallet na ginagawang accessible ang mundo ng web3 para sa lahat." + }, + "whatsNew": { + "message": "Ano'ng bago", + "description": "This is the title of a popup that gives users notifications about new features and updates to MetaMask." }, "whatsThis": { "message": "Ano ito?" @@ -1859,6 +3445,10 @@ "message": "$1 ng $2", "description": "$1 and $2 are intended to be two numbers, where $2 is a total, and $1 is a count towards that total" }, + "xOfYPending": { + "message": "$1 ng $2 ang nakabinbin", + "description": "$1 and $2 are intended to be two numbers, where $2 is a total number of pending confirmations, and $1 is a count towards that total" + }, "yesLetsTry": { "message": "Oo, subukan natin" }, diff --git a/app/_locales/tr/messages.json b/app/_locales/tr/messages.json index 254d956c7..2fc5cba1c 100644 --- a/app/_locales/tr/messages.json +++ b/app/_locales/tr/messages.json @@ -1,4 +1,69 @@ { + "QRHardwareInvalidTransactionTitle": { + "message": "Hata" + }, + "QRHardwareMismatchedSignId": { + "message": "Uyumsuz işlem verisi. Lütfen işlem ayrıntılarını kontrol edin." + }, + "QRHardwarePubkeyAccountOutOfRange": { + "message": "Başka hesap yok. Aşağıda listelenmeyen başka bir hesaba erişmek istiyorsanız lütfen donanım cüzdanınızı yeniden bağlayın ve seçin." + }, + "QRHardwareScanInstructions": { + "message": "QR kodunu kameranızın önüne getirin. Ekran bulanık, ancak bu okumayı etkilemeyecektir." + }, + "QRHardwareSignRequestCancel": { + "message": "Reddet" + }, + "QRHardwareSignRequestDescription": { + "message": "Cüzdanınızla imzaladıktan sonra imzayı almak için \"İmza Al\" öğesine tıklayın" + }, + "QRHardwareSignRequestGetSignature": { + "message": "İmza Al" + }, + "QRHardwareSignRequestSubtitle": { + "message": "Cüzdanınızı QR kodu ile tarayın" + }, + "QRHardwareSignRequestTitle": { + "message": "İmza İste" + }, + "QRHardwareUnknownQRCodeTitle": { + "message": "Hata" + }, + "QRHardwareUnknownWalletQRCode": { + "message": "Geçersiz QR kodu. Lütfen donanım cüzdanın senkronizasyon QR kodunu tarayın." + }, + "QRHardwareWalletImporterTitle": { + "message": "QR Kodu Tara" + }, + "QRHardwareWalletSteps1Description": { + "message": "QR kodları üzerinden iletişim kuran bir airgap donanım cüzdan bağlayın. Resmi olarak desteklenen airgap donanım cüzdanlar şunlardır:" + }, + "QRHardwareWalletSteps1Title": { + "message": "QR Tabanlı Donanım Cüzdan" + }, + "QRHardwareWalletSteps2Description": { + "message": "AirGap Vault & Ngrave (Çok Yakında)" + }, + "about": { + "message": "Hakkında" + }, + "aboutSettingsDescription": { + "message": "Sürüm, destek merkezi ve iletişim bilgileri" + }, + "acceleratingATransaction": { + "message": "* Daha yüksek bir gaz fiyatı kullanarak bir işlemi hızlandırmak ağ tarafından daha hızlı işlenme şansını artırır ancak her zaman garanti etmez." + }, + "acceptTermsOfUse": { + "message": "Şunu okudum ve kabul ettim: $1", + "description": "$1 is the `terms` message" + }, + "accessAndSpendNotice": { + "message": "$1 bu maksimum miktara kadar erişebilir ve harcayabilir", + "description": "$1 is the url of the site requesting ability to spend" + }, + "accessingYourCamera": { + "message": "Kameranıza erişiyor..." + }, "account": { "message": "Hesap" }, @@ -8,9 +73,165 @@ "accountName": { "message": "Hesap İsmi" }, + "accountNameDuplicate": { + "message": "Bu hesap adı zaten mevcut", + "description": "This is an error message shown when the user enters a new account name that matches an existing account name" + }, + "accountOptions": { + "message": "Hesap Seçenekleri" + }, + "accountSelectionRequired": { + "message": "Bir hesap seçmeniz gerekli!" + }, + "active": { + "message": "Etkin" + }, + "activity": { + "message": "Etkinlik" + }, + "activityLog": { + "message": "Etkinlik günlüğü" + }, + "add": { + "message": "Ekle" + }, + "addANetwork": { + "message": "Bir ağ ekle" + }, + "addANickname": { + "message": "Bir takma ad ekle" + }, + "addAcquiredTokens": { + "message": "MetaMask kullanarak elde ettiğiniz tokenleri ekleyin" + }, + "addAlias": { + "message": "Tam ad ekle" + }, + "addContact": { + "message": "Kişi ekle" + }, + "addCustomToken": { + "message": "Özel Token Ekle" + }, + "addCustomTokenByContractAddress": { + "message": "Bir tokeni bulamadınız mı? Adresini yapıştırarak dilediğiniz tokeni manuel olarak ekleyebilirsiniz. Token sözleşme adreslerini şurada bulabilirsiniz: $1.", + "description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum" + }, + "addEthereumChainConfirmationDescription": { + "message": "Bu, bu ağın MetaMas dahilinde kullanılmasına olanak tanıyacaktır." + }, + "addEthereumChainConfirmationRisks": { + "message": "MetaMask özel ağları doğrulamaz." + }, + "addEthereumChainConfirmationRisksLearnMore": { + "message": "$1 hakkında bilgi edinin.", + "description": "$1 is a link with text that is provided by the 'addEthereumChainConfirmationRisksLearnMoreLink' key" + }, + "addEthereumChainConfirmationRisksLearnMoreLink": { + "message": "dolandırıcılık ve ağ güvenliği riskleri", + "description": "Link text for the 'addEthereumChainConfirmationRisksLearnMore' translation key" + }, + "addEthereumChainConfirmationTitle": { + "message": "Bu sitenin bir ağ eklemesine izin verilsin mi?" + }, + "addFriendsAndAddresses": { + "message": "Güvendiğiniz arkadaşlarınızı ve adresleri ekleyin" + }, + "addMemo": { + "message": "Not ekleyin" + }, + "addNFT": { + "message": "NFT ekleyin" + }, + "addNetwork": { + "message": "Ağ ekleyin" + }, + "addSuggestedTokens": { + "message": "Önerilen Tokenleri ekleyin" + }, + "addToAddressBook": { + "message": "Adres defterine ekleyin" + }, + "addToAddressBookModalPlaceholder": { + "message": "ör. Hüseyin M." + }, "addToken": { "message": "Jeton ekle" }, + "address": { + "message": "Adres" + }, + "addressBookIcon": { + "message": "Adres defteri simgesi" + }, + "advanced": { + "message": "Gelişmiş" + }, + "advancedBaseGasFeeToolTip": { + "message": "İşleminiz bloka dahil edildiğinde maks. baz ücretiniz ile gerçek paz ücret arasındaki fark iade edilecektir. Toplam miktar, maks. baz ücreti (GWEI'de) * gaz limiti olarak hesaplanacaktır." + }, + "advancedGasFeeDefaultOptIn": { + "message": "\"Gelişmiş\" için şunları varsayılanım olarak kaydet: $1" + }, + "advancedGasFeeDefaultOptOut": { + "message": "Varsayılan olarak her zaman bu değerleri ve gelişmiş ayarları kullanın." + }, + "advancedGasFeeModalTitle": { + "message": "Gelişmiş gaz ücreti" + }, + "advancedGasPriceTitle": { + "message": "Gaz fiyatı" + }, + "advancedOptions": { + "message": "Gelişmiş Seçenekler" + }, + "advancedPriorityFeeToolTip": { + "message": "Maks. öncelik ücreti (başka bir deyişle \"madenci bahşişi\") doğrudan madencilere gider ve işleminizin öncelikli olarak gerçekleştirilmesini teşvik eder." + }, + "advancedSettingsDescription": { + "message": "Geliştirici özelliklerine erişin, Durum Günlüklerini indirin, Hesabı Sıfırlayın, test ağlarını ve özel RPC kurun" + }, + "affirmAgree": { + "message": "Kabul ediyorum" + }, + "aggregatorFeeCost": { + "message": "Toplayıcı ağ ücreti" + }, + "alertDisableTooltip": { + "message": "Bu, \"Ayarlar > Uyarları\" öğesinden değiştirilebilir" + }, + "alertSettingsUnconnectedAccount": { + "message": "Bağlı olmayan bir hesap ile bir web sitesine göz atma seçildi" + }, + "alertSettingsUnconnectedAccountDescription": { + "message": "Bu uyarı, bir bağlı web3 sitesine göz attığınızda gösteirlir ancak şu anda seçili hesap bağlı değildir." + }, + "alertSettingsWeb3ShimUsage": { + "message": "Bir web sitesi kaldırılmış window.web3 API'sini kullanmaya çalıştığında" + }, + "alertSettingsWeb3ShimUsageDescription": { + "message": "Bu uyarı, kaldırılmış window.web3 API kullanmaya çalışan bir ve bunun sonucu olarak bozulmuş olan bir siteye göz attığında bir açılır pencerede gösterilir." + }, + "alerts": { + "message": "Uyarılar" + }, + "alertsSettingsDescription": { + "message": "Her uyarıyı etkinleştirin ya da devre dışı bırakın" + }, + "allowExternalExtensionTo": { + "message": "Bu harici uzantının şunu yapmasına izin verin:" + }, + "allowSpendToken": { + "message": "Şuna erişim için izin verin: $1?", + "description": "$1 is the symbol of the token that are requesting to spend" + }, + "allowThisSiteTo": { + "message": "Bu sitenin şunu yapmasına izin verin:" + }, + "allowWithdrawAndSpend": { + "message": "$1 için şu miktara kadar para çekme ve harcama izni ver:", + "description": "The url of the site that requested permission to 'withdraw and spend'" + }, "amount": { "message": "Tutar" }, @@ -30,39 +251,297 @@ "message": "MetaMask Flask", "description": "The name of the application (Flask)" }, + "approvalAndAggregatorTxFeeCost": { + "message": "Onaylayıcı ve toplayıcı ağ ücreti" + }, + "approvalTxGasCost": { + "message": "Onaylayıcı İşlem Gaz Maliyeti" + }, "approve": { "message": "Onaylamak" }, + "approveButtonText": { + "message": "Onayla" + }, + "approveSpendLimit": { + "message": "$1 harcama limitini onaylayın", + "description": "The token symbol that is being approved" + }, "approved": { "message": "Onaylandı" }, + "approvedAmountWithColon": { + "message": "Onaylanan miktar:" + }, + "asset": { + "message": "Varlık" + }, + "assetOptions": { + "message": "Varlık seçenekleri" + }, + "assets": { + "message": "Varlıklar" + }, + "attemptToCancel": { + "message": "İptal etmeyi dene?" + }, + "attemptToCancelDescription": { + "message": "Bu denemeyi göndermek asıl işleminizin iptal edileceğini garanti etmez. İptal etme denemesi başarılı olursa sizden yukarıdaki ücret tahsil edilecektir." + }, "attemptingConnect": { "message": "Blockchain'e bağlanmayı deniyor" }, "attributions": { "message": "Atıflar" }, + "authorizedPermissions": { + "message": "Aşağıdaki izinleri verdiniz" + }, + "autoLockTimeLimit": { + "message": "Otomatik Kilitleme Sayacı (dakika)" + }, + "autoLockTimeLimitDescription": { + "message": "MetaMask kilitlenmeden önce dakika cinsinden boşta kalma süresini ayarlayın." + }, + "average": { + "message": "Ortalama" + }, "back": { "message": "Geri" }, + "backToAll": { + "message": "Tümüne Geri Git" + }, + "backupApprovalInfo": { + "message": "Bu gizli kod, cihazınızı kaybetmeniz, parolanızı unutmanız, MetaMask'ı yeniden kurmanızın gerektiği ya da cüzdanınıza başka bir cihazdan oturum açmak istemeniz durumunda cüzdanınıza erişmeniz için gereklidir." + }, + "backupApprovalNotice": { + "message": "Cüzdanınızı ve paralarınız güvende tutmak için Gizli Kurtarma İfadenizi yedekleyin." + }, + "backupNow": { + "message": "Şimdi yedekle" + }, "balance": { "message": "Bakiye:" }, + "balanceOutdated": { + "message": "Bakiye eski olabilir" + }, + "baseFee": { + "message": "Baz ücret" + }, + "basic": { + "message": "Temel" + }, + "betaMetamaskDescription": { + "message": "Milyonların güvendiği MetaMask, web3 dünyasını herkes için erişilebilir kılan güvenli bir cüzdandır." + }, + "betaMetamaskDescriptionExplanation": { + "message": "Yayınlanmadan önce gelecek özellikleri test etmek için bu sürümü kullanın. Kullanımınız ve geri bildiriminiz mümkün olan en iyi MetaMask sürümünü oluşturmamıza yardımcı oluyor. MetMask Beta kullanımınız standart $1 ile ayrıca $2 uyarınca gerçekleşir. Bir Beta sürüm olarak hata ile karşılaşma riskiniz daha yüksektir. Devam ederek bu riskler ile ayrıca Şartlar ve Koşular Hükümlerimizde yer alan riskleri kabul etmiş ve onaylamış olursunuz.", + "description": "$1 represents localization item betaMetamaskDescriptionExplanationTermsLinkText. $2 represents localization item betaMetamaskDescriptionExplanationBetaTermsLinkText" + }, + "betaMetamaskDescriptionExplanationBetaTermsLinkText": { + "message": "Ek Beta Koşulları" + }, + "betaMetamaskDescriptionExplanationTermsLinkText": { + "message": "Koşullar" + }, + "betaMetamaskVersion": { + "message": "MetaMask Beta Sürümü" + }, + "betaWelcome": { + "message": "MetaMask Beta'ya Hoş Geldiniz" + }, + "blockExplorerAccountAction": { + "message": "Hesap", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Account in Explorer" + }, + "blockExplorerAssetAction": { + "message": "Varlık", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Asset in Explorer" + }, + "blockExplorerSwapAction": { + "message": "Takas", + "description": "This is used with viewOnEtherscan e.g View Swap on Etherscan" + }, + "blockExplorerUrl": { + "message": "Blok Gezgini URL'si" + }, + "blockExplorerUrlDefinition": { + "message": "Bu ağ için blok gezgini olarak kullanılan URL." + }, + "blockExplorerView": { + "message": "Hesabı şurada görüntüleyin: $1", + "description": "$1 replaced by URL for custom block explorer" + }, "blockiesIdenticon": { "message": "Blockies Identicon kullan" }, + "browserNotSupported": { + "message": "Tarayıcınız desteklenmiyor..." + }, + "buildContactList": { + "message": "Kişi listenizi oluşturun" + }, + "builtAroundTheWorld": { + "message": "MetaMask dünyanın farklı ülkelerinde geliştirilmiş ve yapılmıştır." + }, + "busy": { + "message": "Meşgul" + }, + "buy": { + "message": "Satın Al" + }, + "buyWithTransak": { + "message": "Transak ile ETH satın alın" + }, + "buyWithTransakDescription": { + "message": "Transak 59'dan fazla ülkede banka kartı ve banka transferlerini (konuma bağlı olarak) destekler. MetaMask hesabınıza ETH para yatırma işlemleri." + }, + "buyWithWyre": { + "message": "Wyre ile ETH satın alın" + }, + "buyWithWyreDescription": { + "message": "Wyre, doğrudan MetaMask hesabınıza ETH yatırma işlemleri için bir banka kartı kullanmanıza izin verir." + }, + "bytes": { + "message": "Bayt" + }, + "canToggleInSettings": { + "message": "Ayarlar -> Uyarılar öğesinden bu bildirimi yeniden etkinleştirebilirsiniz." + }, "cancel": { "message": "Vazgeç" }, + "cancelEdit": { + "message": "Düzenlemeyi İptal Et" + }, + "cancelPopoverTitle": { + "message": "İşlemi iptal et" + }, + "cancelSpeedUp": { + "message": "bir işlemi iptal et ya da hızlandır." + }, + "cancellationGasFee": { + "message": "İptal İşlemi Gaz Ücreti" + }, + "cancelled": { + "message": "İptal edildi" + }, + "chainId": { + "message": "Zincir Kimliği" + }, + "chainIdDefinition": { + "message": "Zincir kimliği, bu ağda işlemleri imzalamak için kullanılır." + }, + "chainIdExistsErrorMsg": { + "message": "Bu Zincir Kimliği şu anda $1 ağı tarafından kullanılıyor." + }, + "chromeRequiredForHardwareWallets": { + "message": "Donanım Cüzdanınıza bağlamak için MetaMask'ı Google Chrome'da kullanmanız gereklidir." + }, + "clickToConnectLedgerViaWebHID": { + "message": "WebHID üzerinden Kayıt Defterinizi bağlamak için tıklayın", + "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" + }, + "clickToRevealSeed": { + "message": "Gizli kelimeleri görmek için buraya tıklayın" + }, + "close": { + "message": "Kapat" + }, "confirm": { "message": "Onayla" }, "confirmPassword": { "message": "Şifreyi onayla" }, + "confirmRecoveryPhrase": { + "message": "Gizli Kurtarma İfadesini Onaylayın" + }, + "confirmSecretBackupPhrase": { + "message": "Gizli Kurtarma İfadenizi Onaylayın" + }, "confirmed": { "message": "Onaylandı" }, + "confusableUnicode": { + "message": "\"$1\" ile \"$2\" benzer." + }, + "confusableZeroWidthUnicode": { + "message": "Sıfır genişlikte karakter bulundu." + }, + "confusingEnsDomain": { + "message": "ENS adında karıştırılabilir bir karakter tespit ettik. Olası bir dolandırıcılığı önlemek için ENS adını kontrol edin." + }, + "congratulations": { + "message": "Tebrikler" + }, + "connect": { + "message": "Bağla" + }, + "connectAccountOrCreate": { + "message": "Hesabı bağla ya da yeni hesap oluştur" + }, + "connectHardwareWallet": { + "message": "Donanım Cüzdanı Bağla" + }, + "connectManually": { + "message": "Mevcut siteye manuel olarak bağlanın" + }, + "connectTo": { + "message": "Şuna bağlanın: $1", + "description": "$1 is the name/origin of a web3 site/application that the user can connect to metamask" + }, + "connectToAll": { + "message": "Tüm $1 bağlanın", + "description": "$1 will be replaced by the translation of connectToAllAccounts" + }, + "connectToAllAccounts": { + "message": "hesaplarınıza", + "description": "will replace $1 in connectToAll, completing the sentence 'connect to all of your accounts', will be text that shows list of accounts on hover" + }, + "connectToMultiple": { + "message": "$1 bağlanın", + "description": "$1 will be replaced by the translation of connectToMultipleNumberOfAccounts" + }, + "connectToMultipleNumberOfAccounts": { + "message": "$1 hesabınıza", + "description": "$1 is the number of accounts to which the web3 site/application is asking to connect; this will substitute $1 in connectToMultiple" + }, + "connectWithMetaMask": { + "message": "MetaMask ile Bağlanın" + }, + "connectedAccountsDescriptionPlural": { + "message": "Bu siteye bağlanmış $1 hesabınız var.", + "description": "$1 is the number of accounts" + }, + "connectedAccountsDescriptionSingular": { + "message": "Bu siteye bağlanmış 1 hesabınız var." + }, + "connectedAccountsEmptyDescription": { + "message": "MetaMask bu siteye bağlı değil. Bir web3 sitesine bağlanmak için siteyi bulun ve bağlan düğmesine tıklayın." + }, + "connectedSites": { + "message": "Bağlı siteler" + }, + "connectedSitesDescription": { + "message": "$1 bu sitelere bağlanmış. Bu siteler hesap adresinizi görüntüleyebilir.", + "description": "$1 is the account name" + }, + "connectedSitesEmptyDescription": { + "message": "$1 herhangi bir siteye bağlanmamış.", + "description": "$1 is the account name" + }, + "connecting": { + "message": "Bağlanıyor..." + }, + "connectingTo": { + "message": "Şuna bağlanılıyor: $1" + }, + "connectingToGoerli": { + "message": "Goerli Test Ağına Bağlanıyor" + }, "connectingToKovan": { "message": "Kovan Test Ağına bağlanıyor" }, @@ -75,39 +554,182 @@ "connectingToRopsten": { "message": "Ropsten Test Ağına bağlanıyor" }, + "contactUs": { + "message": "Bize ulaşın" + }, + "contacts": { + "message": "Kişiler" + }, + "contactsSettingsDescription": { + "message": "Kişilerinizi ekleyin, düzenleyin, silin ve yönetin" + }, + "continue": { + "message": "Devam et" + }, + "continueToTransak": { + "message": "Transak'a Devam Edin" + }, + "continueToWyre": { + "message": "Wyre'a Devam Edin" + }, + "contract": { + "message": "Sözleşme" + }, + "contractAddress": { + "message": "Sözleşme adresi" + }, + "contractAddressError": { + "message": "Tokenin sözleşme adresine token gönderiyorsunuz. Bu, tokenlerin kaybedilmesine neden olabilir." + }, "contractDeployment": { "message": "Sözleşme kurulumu" }, + "contractInteraction": { + "message": "Sözleşme Etkileşimi" + }, "copiedExclamation": { "message": "Kopyalandı!" }, + "copyAddress": { + "message": "Adresi hafıza panosuna kopyala" + }, "copyPrivateKey": { "message": "Bu sizin özel anahtarınız (kopyalamak için tıklayın)" }, + "copyRawTransactionData": { + "message": "Ham işlem verisini kopyala" + }, "copyToClipboard": { "message": "Panoya kopyala" }, + "copyTransactionId": { + "message": "İşlem Kimliğini Kopyala" + }, "create": { "message": "Yarat" }, + "createAWallet": { + "message": "Bir Cüzdan Oluştur" + }, "createAccount": { "message": "Hesap Oluştur" }, + "createNewWallet": { + "message": "Yeni bir cüzdan oluşturun" + }, + "createPassword": { + "message": "Parola Oluştur" + }, + "currencyConversion": { + "message": "Para Birimi Dönüşümü" + }, + "currencySymbol": { + "message": "Para Birimi Sembolü" + }, + "currencySymbolDefinition": { + "message": "Bu ağın para birimi için görüntülenen sembol." + }, + "currentAccountNotConnected": { + "message": "Mevcut hesabınız bağlı değil" + }, + "currentExtension": { + "message": "Mevcut uzantı sayfası" + }, + "currentLanguage": { + "message": "Mevcut Dil" + }, + "currentTitle": { + "message": "Mevcut:" + }, + "currentlyUnavailable": { + "message": "Bu ağda kullanılamaz" + }, + "custom": { + "message": "Gelişmiş" + }, "customGas": { "message": "Gas'i özelleştir" }, + "customGasSettingToolTipMessage": { + "message": "Gaz fiyatını özelleştirmek için $1 kullanın. Bu, bilgi sahibi değilseniz kafa karıştırıcı olabilir. Riski size ait olmak üzere kullanın.", + "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold fontweight" + }, + "customGasSubTitle": { + "message": "Ücretin artırılması işlem süresini kısaltabilir ancak bu garanti edilmez." + }, + "customSpendLimit": { + "message": "Özel Harcama Limiti" + }, "customToken": { "message": "Özel Jeton" }, + "dappSuggested": { + "message": "Site önerisi" + }, + "dappSuggestedGasSettingToolTipMessage": { + "message": "$1 bu fiyatı önerdi.", + "description": "$1 is url for the dapp that has suggested gas settings" + }, + "dappSuggestedShortLabel": { + "message": "Site" + }, + "dappSuggestedTooltip": { + "message": "$1 bu fiyatı önerdi.", + "description": "$1 represents the Dapp's origin" + }, + "data": { + "message": "Veri" + }, + "dataBackupFoundInfo": { + "message": "MetaMask'ın önceki bir kurulumu sırasında hesap hesap verilerinizden bazıları yedeklenmiştir. Buna ayarlar, kişiler ve tokenler dahil olabilir. Bu verileri şimdi geri yüklemek ister misiniz?" + }, + "dataHex": { + "message": "Onaltılı" + }, "decimal": { "message": "Ondalık hassasiyeti" }, "decimalsMustZerotoTen": { "message": "Ondalıklar en azından 0 olmalı ve 36'dan büyük olmamalı." }, + "decrypt": { + "message": "Şifre çöz" + }, + "decryptCopy": { + "message": "Şifreli mesajı kopyala" + }, + "decryptInlineError": { + "message": "Hata nedeniyle bu mesajın şifresi çözülemez: $1", + "description": "$1 is error message" + }, + "decryptMessageNotice": { + "message": "Eyleminizi tamamlamak için $1 bu mesajı okumak istiyor", + "description": "$1 is the web3 site name" + }, + "decryptMetamask": { + "message": "Mesajın şifresini çöz" + }, + "decryptRequest": { + "message": "Şifre çözme talebi" + }, + "delete": { + "message": "Sil" + }, + "deleteAccount": { + "message": "Hesabı Sil" + }, + "deleteNetwork": { + "message": "Ağı Sil?" + }, + "deleteNetworkDescription": { + "message": "Bu ağı silmek istediğinizden emin misiniz?" + }, "depositEther": { "message": "Ether yatır" }, + "description": { + "message": "Açıklama" + }, "details": { "message": "Ayrıntılar" }, @@ -117,9 +739,45 @@ "directDepositEtherExplainer": { "message": "Eğer çoktan Etheriniz varsa, yeni hesabınıza Ether aktarmanın en kolay yolu direk yatırmadır." }, + "disconnect": { + "message": "Bağlantıyı kes" + }, + "disconnectAllAccounts": { + "message": "Tüm hesapların bağlantısını kes" + }, + "disconnectAllAccountsConfirmationDescription": { + "message": "Bağlantıyı kesmek istediğinizden emin misiniz? Sitenin işlevselliğini kaybedebilirsiniz." + }, + "disconnectPrompt": { + "message": "$1 bağlantısını kes" + }, + "disconnectThisAccount": { + "message": "Bu hesabın bağlantısını kes" + }, + "dismiss": { + "message": "Yok Say" + }, + "dismissReminderDescriptionField": { + "message": "Gizli Kurtarma İfadesi yedekleme hatırlatma mesajını yok saymak için bunu açın. Paranızın kaybedilmesini önlemek için Gizli Kurtarma İfadenizi yedeklemenizi kesinlikle tavsiye ederiz" + }, + "dismissReminderField": { + "message": "Gizli Kurtarma İfadesi yedekleme hatırlatma uyarısını yok say" + }, + "domain": { + "message": "Alan" + }, "done": { "message": "Bitti" }, + "dontShowThisAgain": { + "message": "Bunu yeniden gösterme" + }, + "downloadGoogleChrome": { + "message": "Google Chrome'u indir" + }, + "downloadSecretBackup": { + "message": "Bu Gizli Kurtarma İfadesini indirin ve harici bir şifrelenmiş sabit sürücü ya da depolama ortamında güvenli bir şekilde saklayın." + }, "downloadStateLogs": { "message": "Durum kayıtlarını indir" }, @@ -129,18 +787,310 @@ "edit": { "message": "Düzenle" }, + "editANickname": { + "message": "Takma adı düzenle" + }, + "editAddressNickname": { + "message": "Adres takma adını düzenle" + }, + "editContact": { + "message": "Kişiyi düzenle" + }, + "editGasEducationButtonText": { + "message": "Nasıl seçim yapmalıyım?" + }, + "editGasEducationHighExplanation": { + "message": "Başarılı işlem şansını artırdığından zaman hassas işlemler (Takaslar gibi) için en iyi seçenektir. Bir Takas işleminin gerçekleşmesi çok uzun sürerse başarısız olabilir ya da gaz ücretini kaybetmenize neden olabilir." + }, + "editGasEducationLowExplanation": { + "message": "Daha az bir gaz ücreti sadece işlem süresi daha az önemli olduğunda kullanılabilir. Daha az ücretler işleminizin ne zaman başarılı olacağını (ya da başarılı olup olamayacağını) öngörmeyi zorlaştırır." + }, + "editGasEducationMediumExplanation": { + "message": "Orta düzey bir gaz ücreti gönderme, çekme ya da zamanlaması önemli olmayan diğer işlemler için iyidir. Bu ayar büyük sıklıkla başarılı bir işleme neden olacaktır." + }, + "editGasEducationModalIntro": { + "message": "Doğru gaz ücretinin seçilmesi işlem türüne ve işlemin sizin için ne kadar önemli olduğuna bağlıdır." + }, + "editGasEducationModalTitle": { + "message": "Seçim nasıl yapılmalıdır?" + }, + "editGasFeeModalTitle": { + "message": "Gaz ücretini düzenle" + }, + "editGasHigh": { + "message": "Yüksek" + }, + "editGasLimitOutOfBounds": { + "message": "Gaz limiti en az $1 olmalıdır" + }, + "editGasLimitOutOfBoundsV2": { + "message": "Gaz limiti $1 üzerinde ve $2 altında olmalıdır", + "description": "$1 is the minimum limit for gas and $2 is the maximum limit" + }, + "editGasLimitTooltip": { + "message": "Gaz limiti, kullanmak istediğiniz maksimum gaz birimidir. Gaz birimleri \"Maks. öncelik ücreti\" ve \"Maks. ücretin\" bir çarpanıdır." + }, + "editGasLow": { + "message": "Düşük" + }, + "editGasMaxBaseFeeGWEIImbalance": { + "message": "Maks. baz ücret, öncelik ücretinden daha düşük olamaz" + }, + "editGasMaxBaseFeeHigh": { + "message": "Maks. baz ücreti gerekenden daha yüksek" + }, + "editGasMaxBaseFeeLow": { + "message": "Maks. baz ücreti mevcut ağ koşulları için düşük" + }, + "editGasMaxFeeHigh": { + "message": "Maks. ücret gerekenden daha yüksek" + }, + "editGasMaxFeeLow": { + "message": "Maks. ücret ağ koşulları için çok düşük" + }, + "editGasMaxFeePriorityImbalance": { + "message": "Maks. ücret maks. öncelik ücretinden daha düşük olamaz" + }, + "editGasMaxFeeTooltip": { + "message": "Maks. ücret ödeyeceğiniz en yüksek ücrettir (baz ücret + öncelik ücret)." + }, + "editGasMaxPriorityFeeBelowMinimum": { + "message": "Maks. öncelik ücreti 0 GWEI üzerinde olmalıdır" + }, + "editGasMaxPriorityFeeBelowMinimumV2": { + "message": "Öncelik ücreti 0'dan fazla olmalıdır." + }, + "editGasMaxPriorityFeeHigh": { + "message": "Maks. öncelik ücreti gerekenden yüksek. Gerekenden fazla ödeme yapabilirsiniz." + }, + "editGasMaxPriorityFeeHighV2": { + "message": "Öncelik ücreti gerekenden yüksek. Gerekenden fazla ödeme yapabilirsiniz" + }, + "editGasMaxPriorityFeeLow": { + "message": "Maks. öncelik ücreti mevcut ağ koşulları için düşük" + }, + "editGasMaxPriorityFeeLowV2": { + "message": "Öncelik ücreti mevcut ağ koşulları için düşük" + }, + "editGasMaxPriorityFeeTooltip": { + "message": "Maks. öncelik ücreti (başka bir deyişle \"madenci bahşişi\") doğrudan madencilere gider ve işleminizin öncelikli olarak gerçekleştirilmesini teşvik eder. Sıklıkla maks. ayarı ödersiniz" + }, + "editGasMedium": { + "message": "Orta" + }, + "editGasPriceTooLow": { + "message": "Gaz fiyatı 0'dan büyük olmalıdır" + }, + "editGasPriceTooltip": { + "message": "Bu ağ, bir işlem gönderirken bir \"Gaz fiyatı\" alanı gerektirir. Gaz fiyatı, gaz birimi başına ödeyeceğiniz miktardır." + }, + "editGasSubTextAmountLabel": { + "message": "Maks. miktar:", + "description": "This is meant to be used as the $1 substitution editGasSubTextAmount" + }, + "editGasSubTextFeeLabel": { + "message": "Maks. ücret:" + }, + "editGasTitle": { + "message": "Önceliği düenle" + }, + "editGasTooLow": { + "message": "Bilinmeyen işlem zamanı" + }, + "editGasTooLowTooltip": { + "message": "Maks. ücretiniz ya da maks. öncelik ücretiniz mevcut piyasa koşulları için düşük olabilir. İşleminizin ne zaman gerçekleştirileceğini (ya da gerçekleştirilip gerçekleştirilmeyeceğini) bilmiyoruz. " + }, + "editGasTooLowWarningTooltip": { + "message": "Bu, maksimum ücretinizi düşürür ancak ağ trafiğiniz artarsa işleminiz gecikebilir ya da gerçekleşmeyebilir." + }, + "editNonceField": { + "message": "Geçici anahtarı düzenle" + }, + "editNonceMessage": { + "message": "Bu gelişmiş bir özelliktir, dikkatli kullanın." + }, + "editPermission": { + "message": "İzni düzenle" + }, + "enableAutoDetect": { + "message": " Otomatik algılamayı etkinleştir" + }, + "enableFromSettings": { + "message": " Ayarlardan etkinleştir." + }, + "enableOpenSeaAPI": { + "message": "OpenSea API'yi etkinleştir" + }, + "enableOpenSeaAPIDescription": { + "message": "NFT verilerini almak için OpenSea API'sini kullanın. NFT otomatik algılama OpenSea API'ye dayalıdır ve bu kapatılırsa mevcut olmayacaktır." + }, + "enableToken": { + "message": "şunu etkinleştir: $1", + "description": "$1 is a token symbol, e.g. ETH" + }, + "encryptionPublicKeyNotice": { + "message": "$1 genel şifreleme anahtarınızı istiyor. Bunu onaylayarak bu site sizin için şifrelenmiş mesajlar oluşturabilecektir.", + "description": "$1 is the web3 site name" + }, + "encryptionPublicKeyRequest": { + "message": "Genel şifreleme anahtarı talep edin" + }, + "endOfFlowMessage1": { + "message": "Testi geçtiniz - Gizli Kurtarma İfadenizi güvende tutun, bu sizin sorumluluğunuzdadır!" + }, + "endOfFlowMessage10": { + "message": "Tümü Bitti" + }, + "endOfFlowMessage2": { + "message": "Güvenli şekilde depolama ipuçları" + }, + "endOfFlowMessage3": { + "message": "Birden fazla yerde bir yedek tutun." + }, + "endOfFlowMessage4": { + "message": "İfadeyi hiç kimseyle paylaşmayın." + }, + "endOfFlowMessage5": { + "message": "Kimlik avına karşı dikkatli olun! MetaMask asla kendiliğinde Gizli Kurtarma İfadenizi istemez." + }, + "endOfFlowMessage6": { + "message": "Gizli Kurtarma İfadenizi yedeklemeniz gerekiyorsa Ayarlar -> Güvenlik öğesinden bulabilirsiniz." + }, + "endOfFlowMessage7": { + "message": "Şüphe duyarsanız ya da şüpheli bir şeyler görürseniz $1 desteğimiz ile iletişim kurun.", + "description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." + }, + "endOfFlowMessage8": { + "message": "MetaMask Gizli Kurtarma İfadenizi kurtaramıyor." + }, + "endOfFlowMessage9": { + "message": "Daha fazla bilgi edinin." + }, + "endpointReturnedDifferentChainId": { + "message": "Bitiş noktası farklı bir zincir kimliğine ulaştı: $1", + "description": "$1 is the return value of eth_chainId from an RPC endpoint" + }, + "ensIllegalCharacter": { + "message": "ENS için Uygun Olmayan Karakter." + }, + "ensNotFoundOnCurrentNetwork": { + "message": "ENS adı mevcut ağda bulunamadı. Ethereum Mainnet'e geçmeyi deneyin." + }, + "ensNotSupportedOnNetwork": { + "message": "Ağ ENS desteklemiyor" + }, + "ensRegistrationError": { + "message": "ENS adı kaydında hata" + }, + "ensUnknownError": { + "message": "ENS Arama başarısız oldu." + }, + "enterAnAlias": { + "message": "Bir takma ad girin" + }, + "enterMaxSpendLimit": { + "message": "Maks. Harcama Limiti Gir" + }, "enterPassword": { "message": "Parolanızı girin" }, + "enterPasswordContinue": { + "message": "Devam etmek için parola girin" + }, + "errorCode": { + "message": "Kod: $1", + "description": "Displayed error code for debugging purposes. $1 is the error code" + }, + "errorDetails": { + "message": "Hata Ayrıntıları", + "description": "Title for collapsible section that displays error details for debugging purposes" + }, + "errorMessage": { + "message": "Mesaj: $1", + "description": "Displayed error message for debugging purposes. $1 is the error message" + }, + "errorName": { + "message": "Kod: $1", + "description": "Displayed error name for debugging purposes. $1 is the error name" + }, + "errorPageMessage": { + "message": "Sayfayı yeniden yükleyerek yeniden deneyin ya da $1 destek ile iletişim kurun.", + "description": "Message displayed on generic error page in the fullscreen or notification UI, $1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." + }, + "errorPagePopupMessage": { + "message": "Açılır pencereyi kapatarak ve yeniden açarak tekrar deneyin ya da $1 destek ile iletişim kurun.", + "description": "Message displayed on generic error page in the popup UI, $1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." + }, + "errorPageTitle": { + "message": "MetaMask bir hata ile karşılaştı", + "description": "Title of generic error page" + }, + "errorStack": { + "message": "Yığın:", + "description": "Title for error stack, which is displayed for debugging purposes" + }, + "estimatedProcessingTimes": { + "message": "Tahmini işleme Alınma Süreleri" + }, + "ethGasPriceFetchWarning": { + "message": "Ana gaz tahmini hizmeti olarak sunulan yedek gaz fiyatı şu anda kullanılamıyor." + }, + "eth_accounts": { + "message": "Adrese, hesap bakiyesine, aktiviteye bakın ve işlemleri başlatın", + "description": "The description for the `eth_accounts` permission" + }, + "ethereumPublicAddress": { + "message": "Ethereum Genel Adresi" + }, + "etherscan": { + "message": "Etherscan" + }, "etherscanView": { "message": "Hesabı Etherscan üzerinde izle" }, + "etherscanViewOn": { + "message": "Etherscan'de görüntüle" + }, + "expandView": { + "message": "Görünümü genişlet" + }, + "experimental": { + "message": "Deneysel" + }, + "experimentalSettingsDescription": { + "message": "Token algılama ve daha fazlası" + }, "exportPrivateKey": { "message": "Özel anahtarı ver" }, + "externalExtension": { + "message": "Harici Uzantı" + }, + "extraApprovalGas": { + "message": "+1$ onay gazı", + "description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas" + }, "failed": { "message": "Başarısız oldu" }, + "failedToFetchChainId": { + "message": "Zincir kimliği alınamadı. RPC URL'niz doğru mu?" + }, + "failureMessage": { + "message": "Bir sorun oluştu ve eylemi tamamlayamadık" + }, + "fakeTokenWarning": { + "message": "Mevcut tokenlerin sahteleri de dahil olmak üzere herkes bir token oluşturabilir. $1 hakkında daha fazla bilgi edinin" + }, + "fast": { + "message": "Hızlı" + }, + "fastest": { + "message": "En hızlı" + }, + "feeAssociatedRequest": { + "message": "Bu talep ile ilişkili bir ücret mevcuttur." + }, "fiat": { "message": "Para", "description": "Exchange type" @@ -149,18 +1099,139 @@ "message": "Dosya alma çalışmıyor mu? Buraya tıklayın!", "description": "Helps user import their account from a JSON file" }, + "flaskSnapSettingsCardButtonCta": { + "message": "Ayrıntılara bakın", + "description": "Call to action a user can take to see more information about the Snap that is installed" + }, + "flaskSnapSettingsCardDateAddedOn": { + "message": "Şu tarihte eklendi:", + "description": "Start of the sentence describing when and where snap was added" + }, + "flaskSnapSettingsCardFrom": { + "message": "şurada:", + "description": "Part of the sentence describing when and where snap was added" + }, + "followUsOnTwitter": { + "message": "Bizi Twitter'da takip edin" + }, + "forbiddenIpfsGateway": { + "message": "İzinsiz IPFS Ağ Geçidi: Lütfen bir CID ağ geçidi belirtin" + }, + "forgetDevice": { + "message": "Bu cihazı unut" + }, "from": { "message": "Kimden" }, + "fromAddress": { + "message": "Kaynak: $1", + "description": "$1 is the address to include in the From label. It is typically shortened first using shortenAddress" + }, + "functionApprove": { + "message": "Fonksiyon: Onayla" + }, + "functionType": { + "message": "Fonksiyon Türü" + }, + "gas": { + "message": "Gaz" + }, + "gasDisplayAcknowledgeDappButtonText": { + "message": "Önerilen gaz ücretini düzenle" + }, + "gasDisplayDappWarning": { + "message": "Bu gaz ücreti $1 tarafından önerilmiştir. Bu değerin başka bir değerle değiştirilmesi işleminizle ilgili bir soruna neden olabilir. Herhangi bir sorunuz varsa lütfen $1 ile iletişim kurun.", + "description": "$1 represents the Dapp's origin" + }, + "gasEstimatesUnavailableWarning": { + "message": "Düşük, orta ve yüksek öngörülerimiz mevcut değil." + }, "gasLimit": { "message": "Gas Limiti" }, + "gasLimitInfoTooltipContent": { + "message": "Gaz limiti, harcamak istediğiniz maksimum gaz birimi miktarıdır." + }, "gasLimitTooLow": { "message": "Gas limiti en az 21000 olmalıdır" }, + "gasLimitTooLowWithDynamicFee": { + "message": "Gaz limiti en az $1 olmalıdır", + "description": "$1 is the custom gas limit, in decimal." + }, + "gasLimitV2": { + "message": "Gas limiti" + }, + "gasOption": { + "message": "Gaz seçeneği" + }, "gasPrice": { "message": "Gas Fiyatı (GWEI)" }, + "gasPriceExcessive": { + "message": "Gaz ücretiniz gereksiz derecede yüksek. Miktarı azaltmayı düşünün." + }, + "gasPriceExcessiveInput": { + "message": "Gaz Fiyatı Aşırı Yüksek" + }, + "gasPriceExtremelyLow": { + "message": "Faz Fiyatı Aşırı Düşük" + }, + "gasPriceFetchFailed": { + "message": "Ağ hatası nedeniyle faz fiyatı öngörüsü başarısız oldu." + }, + "gasPriceInfoTooltipContent": { + "message": "Gaz fiyatı, her gaz birimi için ödemek istediğiniz Ether miktarını belirler." + }, + "gasTimingHoursShort": { + "message": "$1 sa.", + "description": "$1 represents a number of hours" + }, + "gasTimingMinutes": { + "message": "$1 dakika", + "description": "$1 represents a number of minutes" + }, + "gasTimingMinutesShort": { + "message": "$1 dk.", + "description": "$1 represents a number of minutes" + }, + "gasTimingNegative": { + "message": "Muhtemelen $1 içinde", + "description": "$1 represents an amount of time" + }, + "gasTimingPositive": { + "message": "Olasılıkla < $1 içinde", + "description": "$1 represents an amount of time" + }, + "gasTimingSeconds": { + "message": "$1 saniye", + "description": "$1 represents a number of seconds" + }, + "gasTimingSecondsShort": { + "message": "$1 sn.", + "description": "$1 represents a number of seconds" + }, + "gasTimingVeryPositive": { + "message": "> $1 içinde çok olası", + "description": "$1 represents an amount of time" + }, + "gasUsed": { + "message": "Gaz Kullanıldı" + }, + "gdprMessage": { + "message": "Bu veri toplanmış olup 2016/679 sayılı Genel Veri Koruma Düzenlemesi (AB) amaçları kapsamında anonimdir. Gizlilik uygulamalarımız hakkında daha fazla bilgi edinmek için lütfen bkz. $1.", + "description": "$1 refers to the gdprMessagePrivacyPolicy message, the translation of which is meant to be used exclusively in the context of gdprMessage" + }, + "gdprMessagePrivacyPolicy": { + "message": "Gizlilik Politikamız", + "description": "this translation is intended to be exclusively used as the replacement for the $1 in the gdprMessage translation" + }, + "general": { + "message": "Genel" + }, + "generalSettingsDescription": { + "message": "Para birimi dönüşümü, ana para birimi, dil, blockies identicon" + }, "getEther": { "message": "Ether Al" }, @@ -168,16 +1239,79 @@ "message": "Musluktan $1 karşılığı Ether alın", "description": "Displays network name for Ether faucet" }, + "getStarted": { + "message": "Başlarken" + }, + "goBack": { + "message": "Geri Git" + }, + "goerli": { + "message": "Goerli Test Ağı" + }, + "grantedToWithColon": { + "message": "İzin verilen:" + }, + "happyToSeeYou": { + "message": "Sizi gördüğümüze sevindik." + }, + "hardware": { + "message": "Donanım" + }, + "hardwareWalletConnected": { + "message": "Donanım cüzdan bağlandı" + }, + "hardwareWalletLegacyDescription": { + "message": "(eski)", + "description": "Text representing the MEW path" + }, + "hardwareWalletSupportLinkConversion": { + "message": "buraya tıklayın" + }, + "hardwareWallets": { + "message": "Bir donanım cüzdana bağlanın" + }, + "hardwareWalletsMsg": { + "message": "MetaMask ile kullanmak istediğiniz bir donanım cüzdan seçin." + }, "here": { "message": "burada", "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, + "hexData": { + "message": "Onaltılı Veri" + }, "hide": { "message": "Gizle" }, "hideTokenPrompt": { "message": "Jetonu gizle?" }, + "hideTokenSymbol": { + "message": "$1 gizle", + "description": "$1 is the symbol for a token (e.g. 'DAI')" + }, + "hideZeroBalanceTokens": { + "message": "Bakiyesi Olmayan Tokenleri Gizle" + }, + "high": { + "message": "Agresif" + }, + "highGasSettingToolTipDialog": { + "message": "Dalgalı piyasalarda dahi yüksek olasılık" + }, + "highGasSettingToolTipMessage": { + "message": "Popüler NFT düşüşleri gibi şeyler nedeniyle ağ trafiğindeki dalgalanmaları kapsayacak şekilde $1 kullanın.", + "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" + }, + "highLowercase": { + "message": "yüksek" + }, + "history": { + "message": "Geçmiş" + }, + "id": { + "message": "Kimlik" + }, "import": { "message": "Al", "description": "Button to import an account from a selected file" @@ -185,16 +1319,73 @@ "importAccount": { "message": "Hesap Al" }, + "importAccountError": { + "message": "Hesap içe aktarılırken hata oluştu." + }, + "importAccountLinkText": { + "message": "Gizli Kurtarma İfadesi kullanarak içe aktarın" + }, "importAccountMsg": { "message": " Alınan hesaplar orjinal kaynakifadenizle yarattığınız MetaMask hesabınızla ilişkilendirilmez. Alınan hesaplar ile ilgili daha fazla bilgi edinin " }, + "importAccountSeedPhrase": { + "message": "Gizli Kurtarma İfadesi ile bir cüzdan içe aktarın" + }, + "importAccountText": { + "message": "ya da $1", + "description": "$1 represents the text from `importAccountLinkText` as a link" + }, + "importExistingWalletDescription": { + "message": "Cüzdanınızı oluşturduğunuzda size verilen Gizli Kurtarma İfadenizi (başka bir deyişle Tohum İfadesi) girin. $1", + "description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link" + }, + "importExistingWalletTitle": { + "message": "Gizli Kurtarma İfadesi ile mevcut cüzdanı içe aktarın" + }, + "importMyWallet": { + "message": "Cüzdanımı içe aktar" + }, + "importNFTs": { + "message": "NFS'leri içe aktar" + }, + "importTokenQuestion": { + "message": "Tokeni içe aktar?" + }, + "importTokenWarning": { + "message": "Herkes, mevcut tokenlerin sahte sürümleri de dahil olmak üzere herhangi bir ada sahip bir token oluşturabilir. Riski tamamen size ait olmak üzere token ekleyin ve işlem yapın!" + }, + "importTokens": { + "message": "tokenleri içe aktar" + }, + "importTokensCamelCase": { + "message": "Tokenleri İçe Aktar" + }, + "importWallet": { + "message": "Cüzdanı içe aktar" + }, + "importYourExisting": { + "message": "Bir Gizli Kurtarma İfadesi kullanarak mevcut cüzdanınızı içe aktarın" + }, "imported": { "message": "Alındı", "description": "status showing that an account has been fully loaded into the keyring" }, + "infuraBlockedNotification": { + "message": "MetaMask blokzincir ana bilgisayarına bağlanamıyor. $1 olası nedenlere göz atın.", + "description": "$1 is a clickable link with with text defined by the 'here' key" + }, + "initialTransactionConfirmed": { + "message": "İlk işleminiz ağ tarafından onaylanmıştır. Geri gitmek için Tamam düğmesine tıklayın." + }, + "insufficientBalance": { + "message": "Yetersiz bakiye." + }, "insufficientFunds": { "message": "Yetersiz kaynak." }, + "insufficientFundsForGas": { + "message": "Gaz için yetersiz kaynak" + }, "insufficientTokens": { "message": "Yetersiz Jeton." }, @@ -204,58 +1395,338 @@ "invalidAddressRecipient": { "message": "Alıcı adresi geçersiz" }, + "invalidAddressRecipientNotEthNetwork": { + "message": "ETH ağı yok, küçük harf olarak ayarlayın" + }, "invalidBlockExplorerURL": { "message": "Geçersiz Block Explorer URI" }, + "invalidChainIdTooBig": { + "message": "Geçersiz zincir kimliği. Zincir kimliği çok büyük." + }, + "invalidCustomNetworkAlertContent1": { + "message": "\"$1\" özel ağı için zincir kimliğinin yeniden girilmesi gerekli.", + "description": "$1 is the name/identifier of the network." + }, + "invalidCustomNetworkAlertContent2": { + "message": "Sizi kötü niyetli ya da hatalı ağ sağlayıcılarından korumak için zincir kimlikleri artık tüm özel ağlar için gereklidir." + }, + "invalidCustomNetworkAlertContent3": { + "message": "Ayarlar > Ağ öğesine gidin ve zincir kimliğini girin. $1 adresinde en popüler ağların zincir kimliklerini bulabilirsiniz.", + "description": "$1 is a link to https://chainid.network" + }, + "invalidCustomNetworkAlertTitle": { + "message": "Geçersiz Özel Ağ" + }, + "invalidHexNumber": { + "message": "Geçersiz onaltılık sayı." + }, + "invalidHexNumberLeadingZeros": { + "message": "Geçersiz onaltılık sayı. Baştaki tüm sıfırları kaldırın." + }, + "invalidIpfsGateway": { + "message": "Geçersiz IPFS Ağ Geçidi: Değer geçerli bir URL olmalıdır" + }, + "invalidNumber": { + "message": "Geçersiz sayı. Bir ondalık sayı ya da \"0x\"-ön ekli onaltılık sayı girin." + }, + "invalidNumberLeadingZeros": { + "message": "Geçersiz sayı. Baştaki tüm sıfırları kaldırın." + }, "invalidRPC": { "message": "Geçersiz RPC URI" }, + "invalidSeedPhrase": { + "message": "Geçersiz Gizli Kurtarma İfadesi" + }, + "ipfsGateway": { + "message": "IPFS Ağ Geçidi" + }, + "ipfsGatewayDescription": { + "message": "ENS içerik çözülümü için kullanmak üzere IPFS CID ağ geçidi URL'sini girin." + }, + "jsDeliver": { + "message": "jsDeliver" + }, "jsonFile": { "message": "JSON Dosyası", "description": "format for importing an account" }, + "keystone": { + "message": "Ana İlke" + }, + "keystoneTutorial": { + "message": " (Eğitimler)" + }, + "knownAddressRecipient": { + "message": "Bilinen sözleşme adresi." + }, + "knownTokenWarning": { + "message": "Bu eylem kimlik avı için kullanılabilecek şekilde cüzdanınızda zaten listelenmiş olan tokenleri düzenleyecektir. Sadece bu tokenlerin neyi temsil ettiğini değiştirmek istediğinizden eminseniz onaylayın." + }, "kovan": { "message": "Kovan Test Ağı" }, + "lastConnected": { + "message": "Son Bağlanma" + }, + "layer1Fees": { + "message": "Aşama 1 ücretler" + }, + "learmMoreAboutGas": { + "message": "Gaz hakkında $1 istiyor musunuz?" + }, + "learnCancelSpeeedup": { + "message": "Nasıl $1 yapacağınızı öğrenin", + "description": "$1 is link to cancel or speed up transactions" + }, "learnMore": { "message": "Daha fazla bilgi." }, + "learnMoreUpperCase": { + "message": "Daha fazla bilgi." + }, + "learnScamRisk": { + "message": "dolandırıcılıklar ve güvenlik riskleri." + }, + "ledgerAccountRestriction": { + "message": "Yeni bir hesap eklemeden önce son hesabınızı kullanmanız gereklidir." + }, + "ledgerConnectionInstructionCloseOtherApps": { + "message": "Cihazınızla bağlantılı her türlü diğer yazılımı kapatın ve ardından yenilemek için buraya tıklayın." + }, + "ledgerConnectionInstructionHeader": { + "message": "Onaylaya tıklmadan önce:" + }, + "ledgerConnectionInstructionStepFour": { + "message": "Kayıt Defteri cihazınızda \"akıllı sözleşme verileri\" ya da \"kör imzalama\" özelliğini etkinleştirin" + }, + "ledgerConnectionInstructionStepOne": { + "message": "Ayarlar > Gelişmiş öğesi altında Ledger Live'i Kullan özelliğini etkinleştirin" + }, + "ledgerConnectionInstructionStepThree": { + "message": "Kayıt Defter cihazınızı takın ve Ethereum uygulamasını seçin" + }, + "ledgerConnectionInstructionStepTwo": { + "message": "Ledger Live Uygulamasını açın ve kilidini açın" + }, + "ledgerConnectionPreferenceDescription": { + "message": "Kayıt Defterinizi MetaMask'a nasıl bağladığınızı özelleştirin. $1 tavsiye edilir ancak başka seçenekler de mevcuttur. Buradan daha fazlasını okuyun: $2", + "description": "A description that appears above a dropdown where users can select between up to three options - Ledger Live, U2F or WebHID - depending on what is supported in their browser. $1 is the recommended browser option, it will be either WebHID or U2f. $2 is a link to an article where users can learn more, but will be the translation of the learnMore message." + }, + "ledgerDeviceOpenFailureMessage": { + "message": "Kayıt Defteri cihazı açılamadı. Kayıt Defteriniz başka bir yazılıma bağlanmış olabilir. Lütfen Ledger Live'ı ya da Kayıt Defteri cihazınızla bağlantılı diğer uygulamaları kapatın ve yeniden bağlanmayı deneyin." + }, + "ledgerLive": { + "message": "Ledger Live", + "description": "The name of a desktop app that can be used with your ledger device. We can also use it to connect a users Ledger device to MetaMask." + }, + "ledgerLiveApp": { + "message": "Ledger Live Uygulaması" + }, + "ledgerLocked": { + "message": "Ledger cihazınız açılamıyor. Lütfen cihazınızın kilidinin açık ve Ethereum uygulamasının açılmış olduğundan emin olun." + }, + "ledgerTimeout": { + "message": "Ledger Live'ın yanıt vermesi çok uzun sürdü ya da bağlantı zaman aşımına uğradı. Ledger Live uygulamasının açılmış olduğundan ve cihazınızın kilidinin açık olduğundan emin olun." + }, + "ledgerTransportChangeWarning": { + "message": "Ledger Live uygulamanız açıksa lütfen her türlü açık Ledger Live bağlantısını kesin ve Ledger Live uygulamasını kapatın." + }, + "ledgerWebHIDNotConnectedErrorMessage": { + "message": "Kayıt defteri cihazı bağlı değil. Kayıt Defterinizi bağlamak istiyorsanız lütfen \"Devam Et\" öğesine yeniden tıklayın ve HID bağlantısını onaylayın", + "description": "An error message shown to the user during the hardware connect flow." + }, + "letsGoSetUp": { + "message": "Evet, haydı ayarlayalım!" + }, "likeToImportTokens": { "message": "Bu jetonlara adres eklemek ister misiniz?" }, + "link": { + "message": "Bağlantı" + }, "links": { "message": "Bağlantılar" }, + "loadMore": { + "message": "Daha Fazla Yükle" + }, "loading": { "message": "Yükleniyor..." }, "loadingTokens": { "message": "Jetonlar yükleniyor..." }, + "localhost": { + "message": "Localhost 8545" + }, "lock": { "message": "Çıkış" }, + "lockTimeTooGreat": { + "message": "Kilitlenme süresi çok büyük" + }, + "low": { + "message": "Düşük" + }, + "lowGasSettingToolTipMessage": { + "message": "Daha ucuz bir fiyat için beklemek üzere $1 kullanın. Fiyatlar bir şekilde öngörülemez olduğunda süre tahminleri daha az hassastır.", + "description": "$1 is key 'low' separated here so that it can be passed in with bold fontweight" + }, + "lowLowercase": { + "message": "düşük" + }, + "lowPriorityMessage": { + "message": "Gelecekteki işlemleri bu işlemden sonrasında kuyruğa alınacaktır. Bu fiyat bir süre önce son defa görülmüştür." + }, "mainnet": { "message": "Main Ethereum Ağı" }, + "makeAnotherSwap": { + "message": "Yeni bir takas oluştur" + }, + "makeSureNoOneWatching": { + "message": "Hiç kimsenin ekranınıza bakmadığından emin olun", + "description": "Warning to users to be care while creating and saving their new Secret Recovery Phrase" + }, "max": { "message": "Maksimum" }, + "maxBaseFee": { + "message": "Maks. baz ücreti" + }, + "maxFee": { + "message": "Maks. ücret" + }, + "maxPriorityFee": { + "message": "Maks. öncelik ücreti" + }, + "medium": { + "message": "Pazar" + }, + "mediumGasSettingToolTipMessage": { + "message": "Mevcut piyasa fiyatında hızlı işleme almak için $1 kullanın.", + "description": "$1 is key 'medium' (text: 'Market') separated here so that it can be passed in with bold fontweight" + }, + "memo": { + "message": "not" + }, + "memorizePhrase": { + "message": "Bu ifadeyi ezberleyin." + }, "message": { "message": "Mesaj" }, + "metaMaskConnectStatusParagraphOne": { + "message": "Artık MetaMask'de hesabınızın bağlantıları üzerinde daha fazla kontrole sahipsiniz." + }, + "metaMaskConnectStatusParagraphThree": { + "message": "Bağlı hesaplarınızı yönetmek için tıklayın." + }, + "metaMaskConnectStatusParagraphTwo": { + "message": "Ziyaret ettiğiniz web sitesi mevcut seçili hesabınız ile bağlantılıysa bağlantı durumu düğmesi gösterilir." + }, "metamaskDescription": { "message": "MetaMask Ethereum için güvenli bir kimlik kasasıdır." }, + "metamaskSwapsOfflineDescription": { + "message": "MetaMask Takas İşlemlerinde bakım yapılıyor. Lütfen daha sonra yeniden kontrol edin." + }, + "metamaskVersion": { + "message": "MetaMask Sürümü" + }, + "metametricsCommitmentsAllowOptOut": { + "message": "Her zaman Ayarlar üzerinden ayrılmanıza olanak tanır" + }, + "metametricsCommitmentsAllowOptOut2": { + "message": "Her zaman Ayarlar üzerinden aayrılabilirsiniz" + }, + "metametricsCommitmentsBoldNever": { + "message": "Asla", + "description": "This string is localized separately from some of the commitments so that we can bold it" + }, + "metametricsCommitmentsIntro": { + "message": "MetaMask şunları yapmaz..." + }, + "metametricsCommitmentsNeverCollect": { + "message": "Asla anahtarları, adresleri, işlemleri, bakiyeler, doğrulama değerlerini ya da herhangi bir kişisel bilgiyi toplamaz" + }, + "metametricsCommitmentsNeverCollectIP": { + "message": "$1 tüm IP adresinizi alacaktır", + "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" + }, + "metametricsCommitmentsNeverCollectKeysEtc": { + "message": "$1 anahtarları, adresleri, işlemleri, bakiyeler, doğrulama değerlerini ya da herhangi bir kişisel bilgiyi toplar", + "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" + }, + "metametricsCommitmentsNeverIP": { + "message": "Asla tüm IP adresinizi toplamaz" + }, + "metametricsCommitmentsNeverSell": { + "message": "Kar için verilerinizi asla satmaz. Asla!" + }, + "metametricsCommitmentsNeverSellDataForProfit": { + "message": "Kar için verilerinizi $1 satmaz. Asla!", + "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" + }, + "metametricsCommitmentsSendAnonymizedEvents": { + "message": "İsimsizleştirilmiş tıklama ve sayfa görüntüleme olaylarını gönderir" + }, + "metametricsHelpImproveMetaMask": { + "message": "MetaMask'i geliştirmemize yardımcı olun" + }, + "metametricsOptInDescription": { + "message": "Kullanıcılarımızın uzantıyı nasıl kullandıklarını daha iyi anlamak için MetaMask kullanım verilerini toplamak istiyor. Bu veriler ürünümüzün ve Ethereum eko-sisteminin kullanılabilirliği ve kullanıcı deneyimini geliştirmek için sürekli olarak kullanılacaktır." + }, + "metametricsOptInDescription2": { + "message": "Ürünümüzün kullanılabilirliğini geliştirmek için temel kullanım verilerini toplamak istiyoruz. Bu ölçümler..." + }, + "metametricsTitle": { + "message": "MetaMask'i geliştirmek için 6 milyonun üzerindeki kullanıcının arasında katılın" + }, + "mismatchedChain": { + "message": "Bu zincir kimliği için ağ ayrıntıları kayıtlarımızla eşleşmiyor. Devam etmeden önce şunu yapmanızı öneriyoruz: $1.", + "description": "$1 is a clickable link with text defined by the 'mismatchedChainLinkText' key" + }, + "mismatchedChainLinkText": { + "message": "ağ ayrıntılarını doğrulama", + "description": "Serves as link text for the 'mismatchedChain' key. This text will be embedded inside the translation for that key." + }, + "missingNFT": { + "message": "NFT'nizi görmüyor musunuz?" + }, + "missingToken": { + "message": "Tokeninizi görmüyor musunuz?" + }, + "mobileSyncWarning": { + "message": "\"Uzantı ile senkronize et\" özelliği geçici olarak devre dışı bırakılmış. MetaMask mobilde uzantı cüzdanınızı kullanmak istiyorsanız mobil uygulamaya gidin: cüzdan kurulum ayarlarına geri dönün ve \"Gizli Kurtarma İfadesi ile İçe Aktar\" seçeneğini seçin. Ardından cüzdanınızı mobil uygulamada içe aktarmak için uzantı cüzdanınızın gizli ifadesini kullanın." + }, "mustSelectOne": { "message": "En az bir jeton seçilmeli" }, "myAccounts": { "message": "Hesaplarım" }, + "name": { + "message": "Adı" + }, "needEtherInWallet": { "message": "MetaMask kullanarak merkezi olamayan uygulamalarla etkileşmek için cüzdanınızda Ether bulunmalıdır." }, + "needHelp": { + "message": "Yardıma mı ihtiyacınız var? $1 ile iletişim kurun", + "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" + }, + "needHelpFeedback": { + "message": "Geri bildiriminizi paylaşın" + }, + "needHelpLinkText": { + "message": "MetaMask Desteği" + }, + "needHelpSubmitTicket": { + "message": "Bir Bilet gönder" + }, "needImportFile": { "message": "Almak için bir dosya seçmelisiniz.", "description": "User is important an account and needs to add a file to continue" @@ -263,37 +1734,376 @@ "negativeETH": { "message": "Negatif ETH miktarları gönderilemez." }, + "networkDetails": { + "message": "Ağ Ayrıntıları" + }, + "networkName": { + "message": "Ağ Adı" + }, + "networkNameBSC": { + "message": "BSC" + }, + "networkNameDefinition": { + "message": "Bu ağ ile ilişkilendirilmiş ad." + }, + "networkNameEthereum": { + "message": "Ethereum" + }, + "networkNamePolygon": { + "message": "Polygon" + }, + "networkNameRinkeby": { + "message": "Rinkeby" + }, + "networkNameTestnet": { + "message": "Testnet" + }, + "networkSettingsChainIdDescription": { + "message": "İşlemlerin imzalanması için kullanılan zincir kimliği. Ağ tarafından yanıt olarak sunulan zincir kimliği ile eşleşmelidir. Bir ondalık ya da \"0x\" ön ekli on altılık sayı girebilirsiniz ancak biz sayıyı ondalık olarak görüntüleyeceğiz." + }, + "networkSettingsDescription": { + "message": "Özel RPC ağlarını ekleyin ve düzenleyin" + }, + "networkStatus": { + "message": "Ağ durumu" + }, + "networkStatusBaseFeeTooltip": { + "message": "Ağ tarafından belirlenen ve her 13-14 saniyede bir değişen baz ücret. $1 ve $2 seçeneklerimiz ani artışlar içindir.", + "description": "$1 and $2 are bold text for Medium and Aggressive respectively." + }, + "networkStatusPriorityFeeTooltip": { + "message": "Öncelik ücretleri (başka bir deyişle \"madenci bahşişi\") aralıkları. Bu ücretler doğrudan madencilere gider ve işleminizin öncelikli olarak gerçekleştirilmesini teşvik eder." + }, + "networkStatusStabilityFeeTooltip": { + "message": "Son 72 saate göre gaz ücretleri $1.", + "description": "$1 is networks stability value - stable, low, high" + }, + "networkURL": { + "message": "Ağ URL'si" + }, + "networkURLDefinition": { + "message": "Bu ağa erişmek için kullanılan URL." + }, "networks": { "message": "Ağlar" }, + "nevermind": { + "message": "Her neyse" + }, "newAccount": { "message": "Yeni Hesap" }, + "newAccountDetectedDialogMessage": { + "message": "Yeni adres algılandı! Adres defterinize eklemek için buraya tıklayın." + }, "newAccountNumberName": { "message": "Hesap $1", "description": "Default name of next account to be created on create account screen" }, + "newCollectibleAddFailed": { + "message": "Şu nedenle toplanabilir eklenemedi: $1" + }, + "newCollectibleAddedMessage": { + "message": "Toplanabilir başarılı bir şekilde eklendi!" + }, + "newContact": { + "message": "Yeni Kişi" + }, "newContract": { "message": "Yeni Sözleşme" }, + "newNFTsDetected": { + "message": "Yeni! NFT algılama" + }, + "newNFTsDetectedInfo": { + "message": "MetaMask'in otomatik olarak Opensea'den NFT'leri algılamasına ve MetaMask cüzdanınızda görüntülemesine izin verin." + }, + "newNetworkAdded": { + "message": "\"$1\" başarılı bir şekilde eklendi!" + }, "newPassword": { "message": "Yeni Parola (min 8 karakter)" }, + "newToMetaMask": { + "message": "MetaMask'te yeni misiniz?" + }, + "newTotal": { + "message": "Yeni Toplam" + }, + "newTransactionFee": { + "message": "Yeni İşlem Ücreti" + }, + "newValues": { + "message": "yeni değerler" + }, "next": { "message": "Sonraki" }, + "nextNonceWarning": { + "message": "Geçici anahtar, önerilen $1 geçici anahtarından daha yüksek", + "description": "The next nonce according to MetaMask's internal logic" + }, + "nftTokenIdPlaceholder": { + "message": "Toplanabilir kimliğini girin" + }, + "nfts": { + "message": "NFT'ler" + }, + "nickname": { + "message": "Takma ad" + }, + "noAccountsFound": { + "message": "Verilen arama sorgusu için herhangi bir hesap bulunamadı" + }, "noAddressForName": { "message": "Bu isim için bir adres tanımlanmamış." }, + "noAlreadyHaveSeed": { + "message": "Hayır, zaten bir Gizli Kurtarma İfadem var" + }, + "noConversionDateAvailable": { + "message": "Herhangi Bir Para Birimi Dönüşüm Oranı Mevcut Değil" + }, + "noConversionRateAvailable": { + "message": "Herhangi Bir Dönüşüm Oranı Mevcut Değil" + }, + "noNFTs": { + "message": "Henüz herhangi bir NFT yok" + }, + "noThanks": { + "message": "Hayıt, istemiyorum" + }, "noTransactions": { "message": "İşlem yok" }, + "noWebcamFound": { + "message": "Bilgisayarınızın web kamerası bulunamadı. Lütfen yeniden deneyin." + }, + "noWebcamFoundTitle": { + "message": "Web kamerası bulunamadı" + }, + "nonce": { + "message": "Geçici anahtar" + }, + "nonceField": { + "message": "İşlem geçici anahtarını özelleştirin" + }, + "nonceFieldDescription": { + "message": "Onay ekranlarında geçici anahtarı (işlem numarası) değiştirmek için bunu açın. Bu gelişmiş bir özelliktir, dikkatli kullanın." + }, + "nonceFieldHeading": { + "message": "Özel Geçici Anahtar" + }, + "notBusy": { + "message": "Meşgul değil" + }, + "notCurrentAccount": { + "message": "Bu hesap doğru mu? Cüzdanınızdaki mevcut seçili hesaptan farklı" + }, + "notEnoughGas": { + "message": "Yeterli Gaz" + }, + "notifications1Description": { + "message": "MetaMask Mobile kullanıcıları artık mobil cüzdanları içinde tokenleri takas edebilirler. Mobil uygulamayı indirmek ve takas yapmaya başlamak için QR kodu tarayın.", + "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." + }, + "notifications1Title": { + "message": "Mobilde takas burada!", + "description": "Title for a notification in the 'See What's New' popup. Tells users that they can now use MetaMask Swaps on Mobile." + }, + "notifications3ActionText": { + "message": "Daha fazla bilgi edinin", + "description": "The 'call to action' on the button, or link, of the 'Stay secure' notification. Upon clicking, users will be taken to a page about security on the metamask support website." + }, + "notifications3Description": { + "message": "MetaMask en iyi güvenlik uygulamalarında güncel kalın ve resmi MetaMask desteğinden en son güvenlik ipuçlarını alın.", + "description": "Description of a notification in the 'See What's New' popup. Describes the information they can get on security from the linked support page." + }, + "notifications3Title": { + "message": "Güvende kalın", + "description": "Title for a notification in the 'See What's New' popup. Encourages users to consider security." + }, + "notifications4ActionText": { + "message": "Takasa başlayın", + "description": "The 'call to action' on the button, or link, of the 'Swap on Binance Smart Chain!' notification. Upon clicking, users will be taken to a page where then can swap tokens on Binance Smart Chain." + }, + "notifications4Description": { + "message": "Doğrudan cüzdanınızdan token takaslarında en iyi fiyatlara sahip olun. MetaMask artık Binance Smart Chain'deki birden fazla ademi merkeziyetçi borsa toplayıcısı ve profesyonel piyasa piyasa oluşturucuyu bağlıyor.", + "description": "Description of a notification in the 'See What's New' popup." + }, + "notifications4Title": { + "message": "Binance Smart Chain'de Takas Yapın", + "description": "Title for a notification in the 'See What's New' popup. Encourages users to do swaps on Binance Smart Chain." + }, + "notifications5Description": { + "message": "\"Tohum İfadeniz\" artık \"Gizli Kurtarma İfadeniz\" oldu", + "description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update." + }, + "notifications6DescriptionOne": { + "message": "Chrome 91 sürümünden itibaren Kayıt Defteri desteğimize olanak tanıyan API (U2F) artık donanım cüzdanları desteklememektedir. MetaMask Kayıt Defteri cihazınızı Ledger Live masaüstü uygulaması üzerinden bağlamanıza olanak tanıyan yeni bir Ledger Live desteğini hayata geçirmiştir.", + "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." + }, + "notifications6DescriptionThree": { + "message": "MetaMask'te Kayıt Defteri hesabınız ile etkileşim kurarken yeni bir sekme açılacak ve sizden Ledger Live uygulamasını açmanız istenecektir. Uygulama açıldıktan sonra sizden MetaMask hesabınızla bir WebSocket bağlantısı kurulmasına izin vermeniz istenecektir. Hepsi bu!", + "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." + }, + "notifications6DescriptionTwo": { + "message": "Ayarlar > Gelişmiş > Ledger Live Kullan öğesine tıklayarak Ledger Live desteğini etkinleştirebilirsiniz.", + "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." + }, + "notifications6Title": { + "message": "Chrome Kullanıcıları için Kayıt Defteri Desteği", + "description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update" + }, + "notifications7DescriptionOne": { + "message": "MetaMask v10.1.0, Kayıt Defteri cihazları kullanıldığında EIP-1559 işlemleri için yeni destek içerir.", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for ledger and EIP1559 in v10.1.0" + }, + "notifications7DescriptionTwo": { + "message": "İşlemleri Ethereum Mainnet'te tamamlamak için Kayıt Defteri cihazınızın son donanım yazılımına sahip olduğundan emin olun.", + "description": "Description of a notification in the 'See What's New' popup. Describes the need to update ledger firmware." + }, + "notifications7Title": { + "message": "Kayıt Defter donanım yazılımı güncellemesi", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." + }, + "notifications8ActionText": { + "message": "Gelişmiş ayarlara gidin", + "description": "Description on an action button that appears in the What's New popup. Tells the user that if they click it, they will go to our Advanced Settings page." + }, + "notifications8DescriptionOne": { + "message": "MetaMask v10.4.0 itibariyle Kayıt Defteri cihazınızı Metamask'e bağlamak için artık Ledger Live gerekli değildir.", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for how Ledger Live is no longer needed to connect the device." + }, + "notifications8DescriptionTwo": { + "message": "Daha kolay ve daha kararlı kayıt defteri deneyimi için ayarlarda Gelişmiş sekmesine gidin ve \"Tercih Edilen Kayıt Defteri Bağlantı Türünü\" \"WebHID\" olarak değiştirin.", + "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." + }, + "notifications8Title": { + "message": "Kayıt defteri bağlantı iyileştirmesi", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users that there is an improvement in how they can connect their device." + }, + "notifications9DescriptionOne": { + "message": "Akıllı sözleşme işlemlerini onaylarken \"Veri\" sekmesinde size artık daha fazla içgörü sunuyoruz." + }, + "notifications9DescriptionTwo": { + "message": "Daha güvenli ve bilgiye dayalı kararlar vermenize yardımcı olmak için artık onaylamadan önce işleminizin ayrıntılarını daha iyi anlayabilir ve işlem adresini adres defterinize çok daha kolay ekleyebilirsiniz." + }, + "notifications9Title": { + "message": "👓 İşlemlerin okunmasını daha kolay hale getiriyoruz." + }, + "ofTextNofM": { + "message": "/" + }, + "off": { + "message": "Kapalı" + }, + "offlineForMaintenance": { + "message": "Bakım için çevrimdışı" + }, "ok": { "message": "Tamam" }, + "on": { + "message": "Açık" + }, + "onboardingCreateWallet": { + "message": "Yeni bir cüzdan oluşturun" + }, + "onboardingImportWallet": { + "message": "Mevcut bir cüzdanı içe aktarın" + }, + "onboardingPinExtensionBillboardAccess": { + "message": "Tam Erişim" + }, + "onboardingPinExtensionBillboardDescription": { + "message": "Bu uzantılar, bu sitedeki bilgileri görebilir" + }, + "onboardingPinExtensionBillboardDescription2": { + "message": "ve değiştirebilir." + }, + "onboardingPinExtensionBillboardTitle": { + "message": "Uzantılar" + }, + "onboardingPinExtensionChrome": { + "message": "Tarayıcı uzantısı simgesine tıklayın" + }, + "onboardingPinExtensionDescription": { + "message": "İşlem onaylarını erişilebilir ve kolay görüntülenebilir kılmak için MetaMask'i tarayıcınıza sabitleyin." + }, + "onboardingPinExtensionDescription2": { + "message": "Uzantıya tıklayarak MetaMask'i açabilir ve 1 tık ile cüzdanınıza erişebilirsiniz." + }, + "onboardingPinExtensionDescription3": { + "message": "Derhal erişmek için tarayıcı uzantısı simgesine tıklayın" + }, + "onboardingPinExtensionLabel": { + "message": "Metamask'i sabitle" + }, + "onboardingPinExtensionStep1": { + "message": "1" + }, + "onboardingPinExtensionStep2": { + "message": "2" + }, + "onboardingPinExtensionTitle": { + "message": "MetaMask kurulumunuz tamamlandı!" + }, + "onboardingReturnNotice": { + "message": "\"$\" bu sekmeyi kapatacak şuraya geri dönmenizi sağlayacaktır: $2", + "description": "Return the user to the site that initiated onboarding" + }, + "onboardingShowIncomingTransactionsDescription": { + "message": "Cüzdanınıza gelen işlemlerin gösterilmesi $1 ile iletişime dayalıdır. Etherscan, Ethereum adresinize ve IP adresinize erişecektir. Şunu görüntüleyin: $2.", + "description": "$1 is a clickable link with text defined by the 'etherscan' key. $2 is a clickable link with text defined by the 'privacyMsg' key." + }, + "onboardingUsePhishingDetectionDescription": { + "message": "Kimlik avı tespiti uyarıları $1 ile iletişime dayalıdır. jsDeliver IP adresinize erişecektir. Şunu görüntüleyin: $2.", + "description": "The $1 is the word 'jsDeliver', from key 'jsDeliver' and $2 is the words Privacy Policy from key 'privacyMsg', both separated here so that it can be wrapped as a link" + }, + "onlyAddTrustedNetworks": { + "message": "Kötü amaçlı bir ağ sağlayıcı blokzincir durumu hakkında yalan söyleyebilir ve ağ aktivitenizi kaydedebilir. Sadece güvendiğiniz özel ağları ekleyin." + }, + "onlyConnectTrust": { + "message": "Sadece güvendiğiniz sitelerle bağlantı kurun." + }, + "openFullScreenForLedgerWebHid": { + "message": "Kayıt defterinizi WebHID üzerinden bağlamak için MetaMask'i tam ekran açın.", + "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." + }, + "optional": { + "message": "İsteğe bağlı" + }, + "optionalWithParanthesis": { + "message": "(İsteğe bağlı)" + }, + "or": { + "message": "veya" + }, + "origin": { + "message": "Köken" + }, + "parameters": { + "message": "Parametreler" + }, + "participateInMetaMetrics": { + "message": "MetaMetrics'e Katıl" + }, + "participateInMetaMetricsDescription": { + "message": "MetaMask'i daha iyi yapmamıza yardımcı olmak için MetaMetrics'e katılın" + }, + "password": { + "message": "Parola" + }, "passwordNotLongEnough": { "message": "Parola yeterince uzun değil" }, + "passwordSetupDetails": { + "message": "Bu parola MetaMask cüzdanınızın kilidini sadece bu cihazda açacaktır. MetaMask bu parolayı kurtaramaz." + }, + "passwordTermsWarning": { + "message": "MetaMask'in benim için bu parolayı kurtaramayacağını biliyorum. $1" + }, "passwordsDontMatch": { "message": "Parolalar eşleşmiyor" }, @@ -301,9 +2111,51 @@ "message": "Özel anahtar dizinizi buraya yapıştırın:", "description": "For importing an account from a private key" }, + "pending": { + "message": "Bekliyor" + }, + "pendingTransactionInfo": { + "message": "O işlem tamamlanana kadar bu işlem işleme alınmayacaktır." + }, + "pendingTransactionMultiple": { + "message": "Bekleyen ($1) işleminiz var." + }, + "pendingTransactionSingle": { + "message": "Bekleyen (1) işleminiz var.", + "description": "$1 is count of pending transactions" + }, + "permissionRequest": { + "message": "İzin talebi" + }, + "permissions": { + "message": "İzinler" + }, "personalAddressDetected": { "message": "Kişisel adres tespit edilidi. Jeton sözleşme adresini girin." }, + "plusXMore": { + "message": "+ $1 daha fazla", + "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" + }, + "preferredLedgerConnectionType": { + "message": "Tercih Edilen Kayıt Defteri Bağlantı Türü", + "description": "A header for a dropdown in the advanced section of settings. Appears above the ledgerConnectionPreferenceDescription message" + }, + "prev": { + "message": "Önceki" + }, + "primaryCurrencySetting": { + "message": "Ana Para birimi" + }, + "primaryCurrencySettingDescription": { + "message": "Değerlerin zincirin yerli para biriminde (ör. ETH) görüntülenmesini önceliklendirmek için yerli seçimi yapın. Değerleri seçtiğiniz itibari para biriminde görüntülemek için İtibari Para seçimi yapın." + }, + "priorityFee": { + "message": "Öncelik ücreti" + }, + "priorityFeeProperCase": { + "message": "Öncelik Ücreti" + }, "privacyMsg": { "message": "Gizlilik Şartları" }, @@ -317,60 +2169,378 @@ "privateNetwork": { "message": "Özel Ağ" }, + "proceedWithTransaction": { + "message": "Yine de devam etmek istiyorum" + }, + "proposedApprovalLimit": { + "message": "Önerilen Onay Limiti" + }, + "provide": { + "message": "Sağla" + }, + "publicAddress": { + "message": "Genel Adres" + }, + "queue": { + "message": "Kuyruğa al" + }, + "queued": { + "message": "Kuyruğa alındı" + }, "readdToken": { "message": "Gelecekte Bu jetonu hesap seçenekleri menüsünde “Jeton ekle”'ye giderek geri ekleyebilirsiniz." }, + "receive": { + "message": "Al" + }, + "recents": { + "message": "Güncel" + }, + "recipientAddressPlaceholder": { + "message": "Ara, genel adres (0x) ya da ENS" + }, + "recommendedGasLabel": { + "message": "Önerilen" + }, + "recoveryPhraseReminderBackupStart": { + "message": "Buradan başlayın" + }, + "recoveryPhraseReminderConfirm": { + "message": "Anladım" + }, + "recoveryPhraseReminderHasBackedUp": { + "message": "Gizli Kurtarma İfadenizi her zaman güvende ve gizli bir yerde tutun" + }, + "recoveryPhraseReminderHasNotBackedUp": { + "message": "Gizli Kurtarma İfadenizi yeniden yedeklemeniz mi gerekli?" + }, + "recoveryPhraseReminderItemOne": { + "message": "Gizli Kurtarma İfadenizi asla başkasıyla paylaşmayın" + }, + "recoveryPhraseReminderItemTwo": { + "message": "MetaMask ekibi sizden asla Gizli Kurtarma İfadenizi istemeyecektir" + }, + "recoveryPhraseReminderSubText": { + "message": "Gizli Kurtarma İfadeniz tüm hesaplarınızı kontrol eder." + }, + "recoveryPhraseReminderTitle": { + "message": "Paranızı koruyun" + }, + "refreshList": { + "message": "Listeyi yenile" + }, "reject": { "message": "Reddet" }, + "rejectAll": { + "message": "Tümünü Reddet" + }, + "rejectTxsDescription": { + "message": "$1 işlemi toplu olarak reddetmek üzeresiniz." + }, + "rejectTxsN": { + "message": "$1 işlemi reddet" + }, "rejected": { "message": "Rededildi" }, + "remember": { + "message": "Unutmayın:" + }, + "remindMeLater": { + "message": "Bana daha sonra hatırlat" + }, + "remove": { + "message": "Kaldır" + }, + "removeAccount": { + "message": "Hesabı kaldır" + }, + "removeAccountDescription": { + "message": "Bu hesap cüzdanınızdan kaldırılacaktır. Devam etmeden önce içe aktarılmış olan bu hesap için orijinal Gizli Kurtarma İfadesine ya da özel anahtara sahip olduğunuzdan lütfen emin olun. Hesap açılır menüsünden hesapları yeniden içe aktarabilir ya da hesap oluşturabilirsiniz. " + }, + "removeNFT": { + "message": "NFT'yi kaldır" + }, + "requestsAwaitingAcknowledgement": { + "message": "onaylanmayı bekleyen talepler" + }, "required": { "message": "Gerekli" }, + "reset": { + "message": "Sıfırla" + }, "resetAccount": { "message": "Hesabı sıfıla" }, + "resetAccountDescription": { + "message": "Hesabınızı sıfırlamak işlem geçmişinizi temizleyecektir. Bu işlem, hesaplarınızdaki bakiyeyi değiştirmeyecek ya da Gizli Kurtarma İfadenizi yeniden girmenizi gerektirmeyecektir." + }, + "restore": { + "message": "Geri Yükle" + }, + "restoreAccountWithSeed": { + "message": "Gizli Kurtarma İfadesi ile Hesabınızı geri yükleyin" + }, + "restoreWalletPreferences": { + "message": "$1 kaynaklı verilerinizin bir yedeği bulundu. Cüzdan tercihlerinizi geri yüklemek ister misiniz?", + "description": "$1 is the date at which the data was backed up" + }, + "retryTransaction": { + "message": "İşlemi Yeniden Dene" + }, + "reusedTokenNameWarning": { + "message": "Buradaki bir token izlediğiniz başka bir tokenden sembol kullanıyor, bu kafa karıştırıcı ya da aldatıcı olabilir." + }, "revealSeedWords": { "message": "Kaynak kelimelerini göster" }, + "revealSeedWordsDescription": { + "message": "Tarayıcılarınızı değiştirirseniz ya da başka bir bilgisayar kullanmaya başlarsanız hesaplarınıza erişmek için bu Gizli Kurtarma İfadesine ihtiyacınız olacaktır. Güvenli ve gizli bir yerde saklayın." + }, "revealSeedWordsWarning": { "message": "Açık bir yerde kaynak kelimeliriniz geri getirmeyin! Bu kelimeler tüm hesaplarınızı çalmak için kullanılabilir." }, + "revealSeedWordsWarningTitle": { + "message": "Bu ifadeyi hiç kimseyle PAYLAŞMAYIN!" + }, "rinkeby": { "message": "Rinkeby Test Ağı" }, "ropsten": { "message": "Ropsten Test Ağı" }, + "rpcUrl": { + "message": "Yeni RPC URL'si" + }, "save": { "message": "Kaydet" }, + "saveAsCsvFile": { + "message": "CSV Dosyası olarak kaydet" + }, + "scanInstructions": { + "message": "QR kodu kameranızın önüne getirin" + }, + "scanQrCode": { + "message": "QR Kodunu Tara" + }, + "scrollDown": { + "message": "Aşağı kaydır" + }, "search": { "message": "Ara" }, + "searchAccounts": { + "message": "Hesapları Ara" + }, + "searchResults": { + "message": "Arama Sonuçları" + }, "searchTokens": { "message": "Jeton ara" }, + "secretBackupPhraseDescription": { + "message": "Gizli Kurtarma İfadeniz hesabınızı yedeklemeyi ve geri yüklemeyi çok daha kolay hale getirir." + }, + "secretBackupPhraseWarning": { + "message": "UYARI: Gizli Kurtarma İfadenizi asla açıklamayın. Bu ifadeye sahip herhangi bir kişi Ether'inizi sonsuza kadar ele geçirebilir." + }, + "secretPhrase": { + "message": "Sadece bu cüzdandaki ilk hesap otomatik olarak yüklenecektir. Bu işlem tamamlandıktan sonra ilave hesaplar eklemek için açılır menüye tıklayın ardından Hesap Oluştur öğesini seçin." + }, + "secretPhraseWarning": { + "message": "Başka bir Gizli Kurtarma İfadesini kullanarak geri yükleme işlemi yaparsanız mevcut cüzdan, hesap ve varlıklarınız bu uygulamadan kalıcı olarak silinecektir. Bu işlem geri alınamaz." + }, + "secretRecoveryPhrase": { + "message": "Gizli Kurtarma İfadesi" + }, + "secureWallet": { + "message": "Güvenli Cüzdan" + }, + "securityAndPrivacy": { + "message": "Güvenlik ve Gizlilik" + }, + "securitySettingsDescription": { + "message": "Gizlilik ayarları ve cüzdan Gizli Kurtarma İfadesi" + }, + "seedPhraseConfirm": { + "message": "Gizli Kurtarma İfadesini Onaylayın" + }, + "seedPhraseEnterMissingWords": { + "message": "Gizli Kurtarma İfadesini Onaylayın" + }, + "seedPhraseIntroNotRecommendedButtonCopy": { + "message": "Bana daha sonra hatırlat (tavsiye edilmez)" + }, + "seedPhraseIntroRecommendedButtonCopy": { + "message": "Cüzdanımı güvenceye al (tavsiye edilir)" + }, + "seedPhraseIntroSidebarBulletFour": { + "message": "Not edin ve birden fazla gizli konumda saklayın." + }, + "seedPhraseIntroSidebarBulletOne": { + "message": "Bir parola yöneticisinde kaydedin" + }, + "seedPhraseIntroSidebarBulletThree": { + "message": "Bir kasada saklayın." + }, + "seedPhraseIntroSidebarBulletTwo": { + "message": "Bir banka kasasında saklayın." + }, + "seedPhraseIntroSidebarCopyOne": { + "message": "Gizli Kurtarma İfadesi, cüzdanınız ve paralarınız için \"ana anahtar\" niteliği taşıyan bir 12 kelimelik ifadedir" + }, + "seedPhraseIntroSidebarCopyThree": { + "message": "Birileri sizden kurtarma ifadenizi istiyorsa büyük olasılıkla sizi dolandırmaya ve cüzdanınızdaki paraları çalmaya çalışıyordur" + }, + "seedPhraseIntroSidebarCopyTwo": { + "message": "Gizli Kurtarma İfadenizi MetaMask de dahil olmak üzere asla paylaşmayın!" + }, + "seedPhraseIntroSidebarTitleOne": { + "message": "Gizli Kurtarma İfadesi nedir?" + }, + "seedPhraseIntroSidebarTitleThree": { + "message": "Gizli Kurtarma İfademi paylaşabilir miyim?" + }, + "seedPhraseIntroSidebarTitleTwo": { + "message": "Gizli Kurtarma İfademi nasıl kaydederim?" + }, + "seedPhraseIntroTitle": { + "message": "Cüzdanınızı güvence altına alın" + }, + "seedPhraseIntroTitleCopy": { + "message": "Başlamadan önce Gizli Kurtarma İfadeniz ve cüzdanınızı nasıl güvende tutacağınız hakkında bilgi edinmek için bu kısa videoyu izleyin." + }, + "seedPhrasePlaceholder": { + "message": "Her kelimeyi tek bir boşluk ile ayırın" + }, + "seedPhrasePlaceholderPaste": { + "message": "Hafıza panosundan Gizli Kurtarma İfadesini yapıştır" + }, "seedPhraseReq": { "message": "Kaynak ifadeleri 12 kelimedir." }, + "seedPhraseWriteDownDetails": { + "message": "Bu 12 kelimelik Gizli Kurtarma İfadesini not ederek güvendiğiniz ve sadece sizin erişebileceğiniz bir yerde saklayın." + }, + "seedPhraseWriteDownHeader": { + "message": "Gizli Kurtarma İfadenizi not edin" + }, + "selectAHigherGasFee": { + "message": "İşleminizin gerçekleşmesini hızlandırmak için daha yüksek bir gaz ücreti seçin.*" + }, + "selectAccounts": { + "message": "Bu sitede kullanmak üzere hesap(lar) seçin" + }, + "selectAll": { + "message": "Tümünü seçin" + }, + "selectAnAccount": { + "message": "Bir Hesap seçin" + }, + "selectAnAccountAlreadyConnected": { + "message": "Bu hesap zaten MetaMask'e bağlanmış" + }, + "selectEachPhrase": { + "message": "Doğru olduğundan emin olmak için lütfen her ifadeyi seçin." + }, + "selectHdPath": { + "message": "HD Yolunu seçin" + }, + "selectNFTPrivacyPreference": { + "message": "Ayarlarda NFT algılamayı açın" + }, + "selectPathHelp": { + "message": "Beklediğiniz hesapları görmüyorsanız HD yoluna geçmeyi deneyin." + }, "selectType": { "message": "Tip Seç" }, + "selectingAllWillAllow": { + "message": "Tümü seçimi bu sitenin mevcut tüm hesaplarınızı görüntülemesine izin verecektir. Bu siteye güvendiğinizden emin olun." + }, "send": { "message": "Gönder" }, + "sendAmount": { + "message": "Gönderilecek Miktar" + }, + "sendSpecifiedTokens": { + "message": "$1 gönder", + "description": "Symbol of the specified token" + }, + "sendTo": { + "message": "Şuraya gönder:" + }, "sendTokens": { "message": "Jeton Gönder" }, + "sendingNativeAsset": { + "message": "$1 gönderiliyor", + "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" + }, + "separateEachWord": { + "message": "Her kelimeyi tek bir boşluk ile ayırın" + }, + "setAdvancedPrivacySettings": { + "message": "Gelişmiş gizlilik ayarlarını ayarlayın" + }, + "setAdvancedPrivacySettingsDetails": { + "message": "MetaMask, ürün kullanılabilirliği ve güvenliğini iyileştirmek için bu güvenilir üçüncü taraf hizmetlerini kullanır." + }, "settings": { "message": "Ayarlar" }, + "show": { + "message": "Göster" + }, + "showAdvancedGasInline": { + "message": "Gelişmiş gaz kontrolleri" + }, + "showAdvancedGasInlineDescription": { + "message": "Gaz fiyatı ve limit kontrollerini doğrudan gönder ve onayla ekranlarında göstermek için bunu seçin." + }, + "showFiatConversionInTestnets": { + "message": "Test ağlarında Dönüşümü göster" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Test ağlarında itibari para dönüşümünü göstermek için bunu seçin" + }, + "showHexData": { + "message": "On Altılık Verileri Göster" + }, + "showHexDataDescription": { + "message": "Gönder ekranında on altılık veri alanını göstermek için bunu seçin" + }, + "showHide": { + "message": "Göster/gizle" + }, + "showIncomingTransactions": { + "message": "Gelen İşlemleri Göster" + }, + "showIncomingTransactionsDescription": { + "message": "Etherscan'in işlemler listesinde gelecek işlemleri göstermesi için bunu seçin" + }, + "showPermissions": { + "message": "İzinleri göster" + }, "showPrivateKeys": { "message": "Özel anahtarları göster" }, + "showRecommendations": { + "message": "Önerileri Göster" + }, + "showSeedPhrase": { + "message": "Gizli Kurtarma İfadesini Göster" + }, + "showTestnetNetworks": { + "message": "Test ağlarını göster" + }, + "showTestnetNetworksDescription": { + "message": "Ağ listesinde test ağlarını göstermek için bunu seçin" + }, "sigRequest": { "message": "İmza isteği" }, @@ -383,83 +2553,915 @@ "signatureRequest": { "message": "İmza isteği" }, + "signatureRequest1": { + "message": "Mesaj" + }, "signed": { "message": "İmzalandı" }, + "simulationErrorMessage": { + "message": "Bu işlemin başarısız olması beklenmektedir. Bu işlemin yürütülmesini denemenin pahalı ve başarısız olması beklenmekte olup önerilmez." + }, + "simulationErrorMessageV2": { + "message": "Gaz tahmini yapamıyoruz. Sözleşmede bir hata olabilir ve bu işlem başarısız olabilir." + }, + "skip": { + "message": "Atla" + }, + "skipAccountSecurity": { + "message": "Hesap Güvenliğini Atla?" + }, + "skipAccountSecurityDetails": { + "message": "Gizli Kurtarma İfademi yedekleyene kadar hesaplarımı ve tüm varlıkları kaybedebileceğimi anlıyorum." + }, + "slow": { + "message": "Yavaş" + }, + "somethingWentWrong": { + "message": "Hoppala! Bir şeyler yanlış gitti." + }, + "source": { + "message": "Kaynak" + }, + "speedUp": { + "message": "Hızlandır" + }, + "speedUpCancellation": { + "message": "Bu iptal işlemini hızlandır" + }, + "speedUpExplanation": { + "message": "Mevcut ağ koşullarına göre gaz ücretini güncelledik ve en az %10 artırdık (ağ tarafından gereklidir)." + }, + "speedUpPopoverTitle": { + "message": "İşlemi hızlandır" + }, + "speedUpTooltipText": { + "message": "Yeni gaz ücreti" + }, + "speedUpTransaction": { + "message": "Bu işlemi hızlandır" + }, + "spendLimitAmount": { + "message": "Harcama limiti miktarı" + }, + "spendLimitInsufficient": { + "message": "Harcama limiti yetersiz" + }, + "spendLimitInvalid": { + "message": "Harcama limiti geçersiz; pozitif bir sayı olmalıdır" + }, + "spendLimitPermission": { + "message": "Harcama limiti izni" + }, + "spendLimitRequestedBy": { + "message": "$1 tarafından talep edilen harcama limiti", + "description": "Origin of the site requesting the spend limit" + }, + "spendLimitTooLarge": { + "message": "Harcama limiti çok büyük" + }, + "stable": { + "message": "Kararlı" + }, + "stableLowercase": { + "message": "kararlı" + }, "stateLogError": { "message": "Durum kayıtlarını alma hatası" }, + "stateLogFileName": { + "message": "MetaMask Durum Günlükleri" + }, "stateLogs": { "message": "Durum Kayıtları" }, "stateLogsDescription": { "message": "Durum kayıtları açık hesap adresinizi ve gönderilen işlemleri içerir." }, + "statusConnected": { + "message": "Bağlandı" + }, + "statusNotConnected": { + "message": "Bağlı değil" + }, + "step1LatticeWallet": { + "message": "Lattice1'inizin bağlanmaya hazır olduğundan emin olun" + }, + "step1LatticeWalletMsg": { + "message": "Kurulduktan ve çevrimiçi olduktan sonra Lattice1'inizi MetaMask'e bağlayabilirsiniz. Cihazınızın kilidini açın ve Cihaz Kimliğini hazırlayın. Donanım cüzdanlarının kullanımı hakkında daha fazla bilgi için, $1", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, + "step1LedgerWallet": { + "message": "Kayıt defteri uygulaması indirin" + }, + "step1LedgerWalletMsg": { + "message": "$1 kilidini açmak için indirin, kurun ve parolanızı girin.", + "description": "$1 represents the `ledgerLiveApp` localization value" + }, + "step1TrezorWallet": { + "message": "Trezor cüzdanınızı takın" + }, + "step1TrezorWalletMsg": { + "message": "Cüzdanınızı doğrudan bilgisayara bağlayın. Donanım cüzdan cihazı kullanma hakkında daha fazla bilgi için 1", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, + "step2LedgerWallet": { + "message": "Kayıt defteri cüzdanını takın" + }, + "step2LedgerWalletMsg": { + "message": "Cüzdanınızı doğrudan bilgisayara bağlayın. Kayıt defterinizin kilidini açın ve Ethereum uygulamasını açın. Donanım cüzdanı cihazınızın kullanımı hakkında daha fazla bilgi için $1.", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, + "storePhrase": { + "message": "Bu ifadeyi 1Password gibi bir parola yöneticisinde saklayın." + }, + "submit": { + "message": "Gönder" + }, "submitted": { "message": "Gönderildi" }, + "support": { + "message": "Destek" + }, "supportCenter": { "message": "Destek merkezimizi ziyaret edin" }, + "swap": { + "message": "Takas" + }, + "swapAdvancedSlippageInfo": { + "message": "Emrinizin verildiği ve onaylandığı zamanlar arasında fiyat farkı oluşursa buna \"fark\" denir. Fark, \"maks. fark\" ayarınızı aşarsa takas işleminiz otomatik olarak iptal edilecektir." + }, + "swapAggregator": { + "message": "Toplayıcı" + }, + "swapAllowSwappingOf": { + "message": "$1 takasına izin verin", + "description": "Shows a user that they need to allow a token for swapping on their hardware wallet" + }, + "swapAmountReceived": { + "message": "Garanti edilen miktar" + }, + "swapAmountReceivedInfo": { + "message": "Bu, alacağınız minimum miktardır. Farka dayalı olarak daha fazla alabilirsiniz." + }, + "swapApproval": { + "message": "Takas için şunu onayla: $1", + "description": "Used in the transaction display list to describe a transaction that is an approve call on a token that is to be swapped.. $1 is the symbol of a token that has been approved." + }, + "swapApproveNeedMoreTokens": { + "message": "Bu takası tamamlamak için $1 daha $2 gerekli", + "description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol." + }, + "swapBestOfNQuotes": { + "message": "En iyi $1 teklifleri.", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, + "swapBuildQuotePlaceHolderText": { + "message": "$1 ile eşleşen token yok", + "description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text" + }, + "swapConfirmWithHwWallet": { + "message": "Donanım cüzdanınız ile onaylayın" + }, + "swapContractDataDisabledErrorDescription": { + "message": "Kayıt defterinizdeki Ethereum uygulamasında \"Ayarlar\" öğesine gidin ve sözleşme verilerine izin verin. Ardından takas işleminizi yeniden deneyin." + }, + "swapContractDataDisabledErrorTitle": { + "message": "Sözleşme verileriniz Kayıt Defterinizde etkinleştirilmemiş" + }, + "swapCustom": { + "message": "özel" + }, + "swapDecentralizedExchange": { + "message": "Ademi merkezi borsa" + }, + "swapDirectContract": { + "message": "Doğrudan sözleşme" + }, + "swapEditLimit": { + "message": "Limiti düzenle" + }, + "swapEnableDescription": { + "message": "Bu gereklidir ve MetaMask'e $1 takası yapma izni verir.", + "description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps." + }, + "swapEnableTokenForSwapping": { + "message": "Bu takas için şunu yapacaktır: $1", + "description": "$1 is for the 'enableToken' key, e.g. 'enable ETH'" + }, + "swapEstimatedNetworkFees": { + "message": "Öngörülen ağ ücretleri" + }, + "swapEstimatedNetworkFeesInfo": { + "message": "Bu, takas işleminizi tamamlamak için kullanılacak ağ ücretinin bir öngörüsüdür. Gerçek miktar ağ koşullarına göre değişebilir." + }, + "swapFailedErrorDescriptionWithSupportLink": { + "message": "İşlemler başarısız olabilir ve size yardımcı olmak için buradayız. Bu sorun devam ederse daha fazla destek için $1 adresinden müşteri desteği ile iletişim kurabilirsiniz.", + "description": "This message is shown to a user if their swap fails. The $1 will be replaced by support.metamask.io" + }, + "swapFailedErrorTitle": { + "message": "Takas işlemi başarısız oldu" + }, + "swapFetchingQuotes": { + "message": "Teklifler alınıyor" + }, + "swapFetchingQuotesErrorDescription": { + "message": "Hımmm... bir hata oluştu. Yeniden deneyin ya da sorun devam ederse müşteri desteği ile iletişim kurun." + }, + "swapFetchingQuotesErrorTitle": { + "message": "Teklifler alınırken hata" + }, + "swapFetchingTokens": { + "message": "Tokenler alınıyor..." + }, + "swapFromTo": { + "message": "$1 ile $2 takası", + "description": "Tells a user that they need to confirm on their hardware wallet a swap of 2 tokens. $1 is a source token and $2 is a destination token" + }, + "swapGasFeesDetails": { + "message": "Gaz ücretleri öngörülmektedir ve ağ trafiği ve işlem karmaşıklığına göre dalgalanacaktır." + }, + "swapGasFeesLearnMore": { + "message": "Gaz ücretleri hakkında daha fazla bilgi edinin" + }, + "swapGasFeesSplit": { + "message": "Önceki ekrandaki gaz ücretleri bu iki işlem arasında bölünmüştür." + }, + "swapGasFeesSummary": { + "message": "Gaz ücretleri, $1 ağında işlemleri gerçekleştiren kripto madencilerine ödenir. MetaMask gaz ücretlerinden herhangi bir kazanç elde etmemektedir.", + "description": "$1 is the selected network, e.g. Ethereum or BSC" + }, + "swapHighSlippageWarning": { + "message": "Fark miktarı çok yüksek." + }, + "swapIncludesMMFee": { + "message": "%$1 MetaMask ücreti dahildir.", + "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." + }, + "swapLowSlippageError": { + "message": "İşlem başarısız olabilir, maks. fark miktarı çok düşük." + }, + "swapMaxSlippage": { + "message": "Maks. fark" + }, + "swapMetaMaskFee": { + "message": "MetaMask ücreti" + }, + "swapMetaMaskFeeDescription": { + "message": "Her defasında en iyi likidite kaynaklarından en iyi fiyatı buluyoruz. %$1 oranında bir ücret otomatik olarak bu teklife dahil edilmiştir.", + "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." + }, + "swapNQuotesWithDot": { + "message": "$1 teklif.", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, + "swapNewQuoteIn": { + "message": "$1 içinde yeni teklifler sunulacak", + "description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00" + }, + "swapOnceTransactionHasProcess": { + "message": "Bu işlem gerçekleştikten sonra $1 hesabınıza eklenecek.", + "description": "This message communicates the token that is being transferred. It is shown on the awaiting swap screen. The $1 will be a token symbol." + }, + "swapPriceDifference": { + "message": "$4 $5 (~$6) için $1 $2 (~$3) takas etmek üzeresiniz.", + "description": "This message represents the price slippage for the swap. $1 and $4 are a number (ex: 2.89), $2 and $5 are symbols (ex: ETH), and $3 and $6 are fiat currency amounts." + }, + "swapPriceDifferenceTitle": { + "message": "~%$1 fiyat farkı", + "description": "$1 is a number (ex: 1.23) that represents the price difference." + }, + "swapPriceImpactTooltip": { + "message": "Fiyat etkisi, mevcut piyasa fiyatı ile işlem gerçekleştirildiği sırada alınan miktar arasındaki farktır. Fiyat etkisi, likidite havuzunun boyutuna bağlı olarak işleminizin boyutunun bir fonksiyonudur." + }, + "swapPriceUnavailableDescription": { + "message": "Fiyat etkisi, piyasa fiyat verisinin mevcut olmaması nedeniyle belirlenememiştir. Takas işlemini gerçekleştirmeden önce lütfen almak üzere olduğunuz token miktarının sizin için uygun olduğunu onaylayın." + }, + "swapPriceUnavailableTitle": { + "message": "Devam etmenden önce oranınızı kontrol edin" + }, + "swapProcessing": { + "message": "Gerçekleştiriliyor" + }, + "swapQuoteDetails": { + "message": "Teklif ayrıntıları" + }, + "swapQuoteDetailsSlippageInfo": { + "message": "Emrinizin verildiği ve onaylandığı zamanlar arasında fiyat farkı oluşursa buna \"fark\" denir. Fark, \"fark toleransı\" ayarınızı aşarsa Takas işleminiz otomatik olarak iptal edilecektir." + }, + "swapQuoteNofN": { + "message": "Teklif $1 / $2", + "description": "A count of loaded quotes shown to the user while they are waiting for quotes to be fetched. $1 is the number of quotes already loaded, and $2 is the total number of quotes to load." + }, + "swapQuoteSource": { + "message": "Teklif kaynağı" + }, + "swapQuotesExpiredErrorDescription": { + "message": "En son oranları almak için lütfen yeni teklifler talep edin." + }, + "swapQuotesExpiredErrorTitle": { + "message": "Teklif zaman aşımı" + }, + "swapQuotesNotAvailableErrorDescription": { + "message": "Lütfen miktarı ya da fark ayarlarını değiştirmeyi deneyin ve yeniden deneyin." + }, + "swapQuotesNotAvailableErrorTitle": { + "message": "Herhangi bir teklif mevcut değil" + }, + "swapRate": { + "message": "Oran" + }, + "swapReceiving": { + "message": "Alınıyor" + }, + "swapReceivingInfoTooltip": { + "message": "Bu bir öngörüdür. Gerçek miktar farka dayalı olarak belirlenecektir." + }, + "swapRequestForQuotation": { + "message": "Teklif talebi" + }, + "swapReviewSwap": { + "message": "Takası incele" + }, + "swapSearchForAToken": { + "message": "Bir token ara" + }, + "swapSelect": { + "message": "Seç" + }, + "swapSelectAQuote": { + "message": "Bir teklif seç" + }, + "swapSelectAToken": { + "message": "Bir token seç" + }, + "swapSelectQuotePopoverDescription": { + "message": "Birden fazla likidite kaynağından alınmış tüm teklifler aşağıdadır." + }, + "swapSlippageNegative": { + "message": "Fark sıfırdan büyük ya da eşit olmalıdır" + }, + "swapSource": { + "message": "Likidite kaynağı" + }, + "swapSourceInfo": { + "message": "En iyi fiyatı ve en düşük ağ ücretlerini bulmak için birden fazla likidite kaynağından arama yapıyoruz (borsalar, toplayıcılar ve profesyonel piyasa yapıcıları)." + }, + "swapSuggested": { + "message": "Önerilen takas" + }, + "swapSuggestedGasSettingToolTipMessage": { + "message": "Takas işlemleri karmaşık ve zamana duyarlı işlemlerdir. Başarılı bir Takas için maliyet ve güven arasında iyi bir denge için bu gaz ücretini öneriyoruz." + }, + "swapSwapFrom": { + "message": "Şuradan takas yap:" + }, + "swapSwapSwitch": { + "message": "Şu iki token arasında geçiş yap:" + }, + "swapSwapTo": { + "message": "Şununla takas yap:" + }, + "swapToConfirmWithHwWallet": { + "message": "donanım cüzdanınızla onaylamak için" + }, + "swapTokenAvailable": { + "message": "$1 cüzdanınıza eklendi.", + "description": "This message is shown after a swap is successful and communicates the exact amount of tokens the user has received for a swap. The $1 is a decimal number of tokens followed by the token symbol." + }, + "swapTokenBalanceUnavailable": { + "message": "$1 bakiyenizi alamadık", + "description": "This message communicates to the user that their balance of a given token is currently unavailable. $1 will be replaced by a token symbol" + }, + "swapTokenToToken": { + "message": "$1 ile $2 arasında takas yap", + "description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap." + }, + "swapTokenVerificationAddedManually": { + "message": "Bu token manuel olarak eklendi." + }, + "swapTokenVerificationMessage": { + "message": "Token adresini her zaman şurada onaylayın: $1.", + "description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover." + }, + "swapTokenVerificationOnlyOneSource": { + "message": "Sadece 1 kaynakta doğrulandı." + }, + "swapTokenVerificationSources": { + "message": "$1 kaynakta doğrulandı.", + "description": "Indicates the number of token information sources that recognize the symbol + address. $1 is a decimal number." + }, + "swapTooManyDecimalsError": { + "message": "$1, en fazla $2 ondalık basamağına izin verir", + "description": "$1 is a token symbol and $2 is the max. number of decimals allowed for the token" + }, + "swapTransactionComplete": { + "message": "İşlem tamamlandı" + }, + "swapTwoTransactions": { + "message": "2 işlem" + }, + "swapUnknown": { + "message": "Bilinmiyor" + }, + "swapVerifyTokenExplanation": { + "message": "Birden fazla token aynı adı ve sembolü kullanabilir. Aradığınız tokenin bu olup olmadığını doğrulamak için şunu kontrol edin: $1.", + "description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network." + }, + "swapYourTokenBalance": { + "message": "Takas etmek için $1 $2 mevcut", + "description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol" + }, + "swapZeroSlippage": { + "message": "%0 Fark" + }, + "swapsAdvancedOptions": { + "message": "Gelişmiş Seçenekler" + }, + "swapsExcessiveSlippageWarning": { + "message": "Fark miktarı çok yüksek ve kötü bir orana neden olacak. Lütfen fark toleransını %15'in altında bir değere indirin." + }, + "swapsMaxSlippage": { + "message": "Fark Toleransı" + }, + "swapsNotEnoughForTx": { + "message": "Bu işlemi tamamlamak için yeterli $1 yok", + "description": "Tells the user that they don't have enough of a token for a proposed swap. $1 is a token symbol" + }, + "swapsViewInActivity": { + "message": "Aktivitede görüntüle" + }, + "switchEthereumChainConfirmationDescription": { + "message": "Bu, MetaMask'te seçili bir ağı önceden eklenmiş bir ağa dönüştürecektir:" + }, + "switchEthereumChainConfirmationTitle": { + "message": "Bu sitenin ağı değiştirmesine izin ver?" + }, + "switchNetwork": { + "message": "Ağı değiştir" + }, + "switchNetworks": { + "message": "Ağları Değiştir" + }, + "switchToThisAccount": { + "message": "Bu hesabı değiştir" + }, + "switchingNetworksCancelsPendingConfirmations": { + "message": "Ağları değiştirmek bekleyen tüm onayları iptal edecektir" + }, + "symbol": { + "message": "Sembol" + }, "symbolBetweenZeroTwelve": { "message": "Sembol 11 karakter veya daha az olmalıdır." }, + "syncFailed": { + "message": "Senkronizasyon başarısız oldu" + }, + "syncInProgress": { + "message": "Senkronizasyon devam ediyor" + }, + "syncWithMobile": { + "message": "Mobil ile senkronizasyon" + }, + "syncWithMobileBeCareful": { + "message": "Bu kodu taradığınızda ekranınıza hiç kimsenin bakmadığından emin olun" + }, + "syncWithMobileComplete": { + "message": "Verileriniz başarılı bir şekilde senkronize edildi. MetaMask mobil uygulamanın keyfini çıkarın!" + }, + "syncWithMobileDesc": { + "message": "Hesaplarınızı ve bilgilerinizi mobil mobil cihazınız ile senkronize edebilirsiniz. MetaMask mobil uygulamasını açın, \"Ayarlar\" öğesine gidin ve \"Tarayıcı Uzantısından Senkronize Edin\"" + }, + "syncWithMobileDescNewUsers": { + "message": "Metamask Mobile uygulamasını ilk defa açtıysanız telefonunuzda şu adımları takip edin." + }, + "syncWithMobileScanThisCode": { + "message": "MetaMask mobil uygulamanız ile bu kodu tarayın" + }, + "syncWithMobileTitle": { + "message": "Mobil ile senkronizasyon" + }, + "syncWithThreeBox": { + "message": "Verileri 3Box ile senkronize et (deneysel)" + }, + "syncWithThreeBoxDescription": { + "message": "Ayarlarınızın 3Box ile yedeklenmesini sağlamak için açın. Bu özellik şu anda deneyseldir; kullanım riski size aittir." + }, + "syncWithThreeBoxDisabled": { + "message": "İlk senkronizasyon işlemi sırasındaki bir hata nedeniyle 3Box devre dışı bırakıldı" + }, "terms": { "message": "Kullanım şartları" }, + "termsOfService": { + "message": "Hizmet Koşulları" + }, "testFaucet": { "message": "Test Musluğu" }, + "thisWillCreate": { + "message": "Bu, yeni bir cüzdan ve Gizli Kurtarma İfadesi oluşturacaktır" + }, + "time": { + "message": "Zaman" + }, + "tips": { + "message": "İpuçları" + }, "to": { "message": "Kime" }, + "toAddress": { + "message": "Alıcı: $1", + "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" + }, + "toggleTestNetworks": { + "message": "Test ağlarını $1", + "description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open to the advanced settings where users can enable the display of test networks in the network dropdown." + }, + "token": { + "message": "Token" + }, "tokenAlreadyAdded": { "message": "Jeton çoktan eklenmiş." }, + "tokenContractAddress": { + "message": "Token Sözleşme Adresi" + }, + "tokenDecimalFetchFailed": { + "message": "Token ondalık değeri gereklidir." + }, + "tokenDetectionAnnouncement": { + "message": "Yeni! Deneysel bir özellik olarak Ethereum Mainnet'te gelişmiş token algılama mevcut. $1" + }, "tokenSymbol": { "message": "Jeton Sembolü" }, + "tooltipApproveButton": { + "message": "Anlıyorum" + }, "total": { "message": "Toplam" }, + "transaction": { + "message": "işlem" + }, + "transactionCancelAttempted": { + "message": "Şu tarihte öngörülen gaz ücreti $1 olan işlem iptali yapılması denendi" + }, + "transactionCancelSuccess": { + "message": "İşlem şu saatte başarılı bir şekilde iptal edildi: $2" + }, + "transactionConfirmed": { + "message": "İşlem şu saatte başarılı bir şekilde onaylandı: $2." + }, + "transactionCreated": { + "message": "İşlem şu saatte $1 değeri ile oluşturuldu: $2." + }, + "transactionData": { + "message": "İşlem verileri" + }, + "transactionDecodingAccreditationDecoded": { + "message": "Şifresi Truffle ile çözüldü" + }, + "transactionDecodingAccreditationVerified": { + "message": "Sözleşme $1 ile doğrulandı" + }, + "transactionDecodingUnsupportedNetworkError": { + "message": "$1 zincir kimliği için işlem şifre çözme mümkün değil" + }, + "transactionDetailDappGasMoreInfo": { + "message": "Site önerisi" + }, + "transactionDetailDappGasTooltip": { + "message": "En son bloka dayalı olarak MetaMask'in önerilen gaz ücretini kullanmak için düzenleyin." + }, + "transactionDetailGasHeading": { + "message": "Öngörülen gaz ücreti" + }, + "transactionDetailGasInfoV2": { + "message": "öngörülen" + }, + "transactionDetailGasTooltipConversion": { + "message": "Gaz ücretleri hakkında daha fazla bilgi edinin" + }, + "transactionDetailGasTooltipExplanation": { + "message": "Gaz ücretleri ağ tarafından belirlenir ve ağ trafiği ve işlem karmaşıklığına göre dalgalanır." + }, + "transactionDetailGasTooltipIntro": { + "message": "Gaz ücretleri, $1 ağında işlemleri gerçekleştiren kripto madencilerine ödenir. MetaMask gaz ücretlerinden herhangi bir kazanç elde etmemektedir." + }, + "transactionDetailGasTotalSubtitle": { + "message": "Miktar + gaz ücreti" + }, + "transactionDetailLayer2GasHeading": { + "message": "Aşama 2 gaz ücreti" + }, + "transactionDetailMultiLayerTotalSubtitle": { + "message": "Miktar + ücretler" + }, + "transactionDropped": { + "message": "İşlem şu saatte bırakıldı: $2." + }, "transactionError": { "message": "İşlem Hatası. Sözleşme kodundan kural dışı durum fırlatıldı." }, + "transactionErrorNoContract": { + "message": "Sözleşme olmayan bir adreste bir fonksiyon çağrılmaya çalışıldı." + }, + "transactionErrored": { + "message": "İşlem bir hatayla karşılaştı." + }, + "transactionFee": { + "message": "İşlem ücreti" + }, + "transactionHistoryBaseFee": { + "message": "Baz Ücreti (GEWI)" + }, + "transactionHistoryL1GasLabel": { + "message": "Toplam L1 Gaz Ücreti" + }, + "transactionHistoryL2GasLimitLabel": { + "message": "L2 Gaz Limiti" + }, + "transactionHistoryL2GasPriceLabel": { + "message": "L2 Gaz Fiyatı" + }, + "transactionHistoryMaxFeePerGas": { + "message": "Gaz Başına Maks. Ücret" + }, + "transactionHistoryPriorityFee": { + "message": "Öncelik Ücreti (GWEI)" + }, + "transactionHistoryTotalGasFee": { + "message": "Toplam Gaz Ücreti" + }, + "transactionResubmitted": { + "message": "İşlem, $1 olan öngörülen gaz ücreti $2 olacak şekilde artırılarak yeniden gönderildi" + }, + "transactionSubmitted": { + "message": "Şu saatte öngörülen gaz ücreti $1 olan işlem gönderildi: $2." + }, + "transactionUpdated": { + "message": "İşlem şu saatte güncellendi: $2." + }, + "transfer": { + "message": "Transfer" + }, + "transferBetweenAccounts": { + "message": "Hesaplarım arası transfer" + }, + "transferFrom": { + "message": "Transfer Kaynağı:" + }, + "troubleConnectingToWallet": { + "message": "$1 ile bağlantı kurmada sorun yaşıyoruz, şuna göz atarak yeniden deneyin: $2.", + "description": "$1 is the wallet device name; $2 is a link to wallet connection guide" + }, "troubleTokenBalances": { "message": "Jeton bakiyelerinizi yüklerken sorun yaşadık. Buradan izleyebilirsiniz ", "description": "Followed by a link (here) to view token balances" }, + "trustSiteApprovePermission": { + "message": "İzin vererek şunun paranıza erişmesine izin vermiş oluyorsunuz: $1" + }, + "tryAgain": { + "message": "Yeniden deneyin" + }, + "tryAnywayOption": { + "message": "Yine de deneyeceğim" + }, + "turnOnTokenDetection": { + "message": "Gelişmiş token algılamayı açın" + }, + "twelveHrTitle": { + "message": "12 sa.:" + }, + "txInsightsNotSupported": { + "message": "Şu anda işlem içgörüleri bu sözleşme için desteklenmiyor." + }, "typePassword": { "message": "Parolanızı girin" }, + "u2f": { + "message": "U2F", + "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." + }, "unapproved": { "message": "Onaylanmadı" }, + "units": { + "message": "birim" + }, "unknown": { "message": "Bilinmeyen" }, + "unknownCameraError": { + "message": "Kameranıza erişmeye çalışırken bir hata oluştu. Lütfen yeniden deneyin..." + }, + "unknownCameraErrorTitle": { + "message": "Hoppala! Bir şeyler yanlış gitti...." + }, "unknownNetwork": { "message": "Bilinmeyen özel ağ" }, + "unknownQrCode": { + "message": "Hata. QR kodunu tanımlayamadık" + }, + "unlimited": { + "message": "Limitsiz" + }, "unlock": { "message": "Giriş yap" }, + "unlockMessage": { + "message": "Ademi merkezi web sizi bekliyor" + }, + "unrecognizedChain": { + "message": "Bu özel ağ tanınmadı. Devam etmeden önce şunu yapmanızı öneriyoruz: $1", + "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." + }, + "unrecognizedChainLinkText": { + "message": "ağ ayrıntılarını doğrulayın", + "description": "Serves as link text for the 'unrecognizedChain' key. This text will be embedded inside the translation for that key." + }, + "unsendableAsset": { + "message": "Toplanabilir (ERC-721) tokenlerin gönderilmesi şu anda desteklenmiyor", + "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" + }, + "updatedWithDate": { + "message": "Güncellendi: $1" + }, "urlErrorMsg": { "message": "URIler için HTTP/HTTPS öneki gerekmektedir." }, + "urlExistsErrorMsg": { + "message": "Bu URL şu anda $1 ağı tarafından kullanılıyor." + }, + "useCollectibleDetection": { + "message": "Otomatik Algılanılan NFT'ler" + }, + "useCollectibleDetectionDescription": { + "message": "NFT'lerin medya ve verilerinin görüntülenmesi IP adresinizin merkezi sunuculara açıklanmasına neden olabilir. Üçüncü taraf API'ler (OpenSea gibi) cüzdanınızda NFT'leri algılamak için kullanılır. Bu, hesap adresinizin bu hizmetlere açıklanmasını sağlar. Uygulamanın bu sunuculardan veri çekmesini istemiyorsanız bunu devre dışı bırakın." + }, + "usePhishingDetection": { + "message": "Kimlik Avı Algılama Kullan" + }, + "usePhishingDetectionDescription": { + "message": "Ethereum kullanıcılarını hedefleyen kimlik avı alanları için bir uyarı görüntüler" + }, + "useTokenDetection": { + "message": "Token Algılama Kullan" + }, + "useTokenDetectionDescription": { + "message": "Cüzdanınıza gönderilen yeni tokenleri algılamak ve görüntülemek için üçüncü taraf API'leri kullanıyoruz. MetaMask tarafından bu hizmetlerden veri çekilmesini istemiyorsanız bunu kapatın." + }, "usedByClients": { "message": "Farklı istemciler tarafından kullanılmakta" }, + "userName": { + "message": "Kullanıcı adı" + }, + "verifyThisTokenDecimalOn": { + "message": "Token ondalık değeri şrada bulunabilir: $1", + "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" + }, + "verifyThisTokenOn": { + "message": "Şurada bu tokeni doğrula: $1", + "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" + }, + "verifyThisUnconfirmedTokenOn": { + "message": "Bu tokeni $1 ile doğrulayın ve işlem yapmak istediğiniz tokenin bu olduğundan emin olun.", + "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" + }, "viewAccount": { "message": "Hesabı İncele" }, + "viewAllDetails": { + "message": "Tüm ayrıntıları görüntüle" + }, + "viewContact": { + "message": "Kişiyi görüntüle" + }, + "viewFullTransactionDetails": { + "message": "Tüm işlem ayrıntılarını görüntüle" + }, + "viewMore": { + "message": "Daha fazlasını görüntüle" + }, + "viewOnBlockExplorer": { + "message": "Blok gezgininde görüntüle" + }, + "viewOnCustomBlockExplorer": { + "message": "Şurada: $2 şunu görüntüle: $1", + "description": "$1 is the action type. e.g (Account, Transaction, Swap) and $2 is the Custom Block Exporer URL" + }, + "viewOnEtherscan": { + "message": "Etherscan'de şunu görüntüle: $1", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, + "viewOnOpensea": { + "message": "Opensea'de görüntüle" + }, + "viewinExplorer": { + "message": "Explorer'da şunu görüntüle: $1", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, "visitWebSite": { "message": "Web sitemizi ziyaret edin" }, + "walletConnectionGuide": { + "message": "donanım cüzdanı bağlantı kılavuzumuz" + }, + "walletCreationSuccessDetail": { + "message": "Cüzdanınızı başarılı bir şekilde koruyun. Gizli Kurtarma İfadenizi güvenli ve gizli tutun -- bunun sorumluluğu size aittir!" + }, + "walletCreationSuccessReminder1": { + "message": "MetaMask Gizli Kurtarma İfadenizi kurtaramıyor." + }, + "walletCreationSuccessReminder2": { + "message": "MetaMask asla Gizli Kurtarma İfadenizi istemeyecektir." + }, + "walletCreationSuccessReminder3": { + "message": "$1 asla başkasıyla paylaşmayın aksi halde çalınma riskiyle karşı karşıya kalırsınız", + "description": "$1 is separated as walletCreationSuccessReminder3BoldSection so that we can bold it" + }, + "walletCreationSuccessReminder3BoldSection": { + "message": "Gizli Kurtarma İfadenizi", + "description": "This string is localized separately from walletCreationSuccessReminder3 so that we can bold it" + }, + "walletCreationSuccessTitle": { + "message": "Cüzdan oluşturma başarılı" + }, + "walletSeedRestore": { + "message": "Cüzdan Gizli Kurtarma İfadesi" + }, + "web3ShimUsageNotification": { + "message": "Mevcut web sitesinin kaldırılmış olan window.web3 API'sini kullanmaya çalıştığını fark ettik. Site bozuk olarak görülüyorsa daha fazla bilgi için lütfen şuna tıklayın: $1.", + "description": "$1 is a clickable link." + }, + "webhid": { + "message": "WebHID", + "description": "Refers to a interface for connecting external devices to the browser. Used for connecting ledger to the browser. Read more here https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API" + }, "welcome": { "message": "MetaMask'ya Hoşgeldiniz" }, + "welcomeBack": { + "message": "Yeniden Hoş Geldiniz!" + }, + "welcomeExploreDescription": { + "message": "Kripto paraları ve varlıkları saklayın, gönderin ve harcayın." + }, + "welcomeExploreTitle": { + "message": "Ademi merkezi uygulamaları keşfedin" + }, + "welcomeLoginDescription": { + "message": "Ademi merkezi uygulamalarda oturum açmak için MetaMask'inizi kullanın - kayıt olmaya gerek yoktur." + }, + "welcomeLoginTitle": { + "message": "Cüzdanınıza merhaba deyin" + }, + "welcomeToMetaMask": { + "message": "Haydi başlayalım" + }, + "welcomeToMetaMaskIntro": { + "message": "Milyonların güvendiği MetaMask, web3 dünyasını herkes için erişilebilir kılan güvenli bir cüzdandır." + }, + "whatsNew": { + "message": "Yenilikler", + "description": "This is the title of a popup that gives users notifications about new features and updates to MetaMask." + }, + "whatsThis": { + "message": "Bu nedir?" + }, + "writePhrase": { + "message": "Bu ifadeyi bir kağıda not edin ve güvenli bir yerde saklayın. Daha da fazla güvenlik isterseniz birden fazla kağıda not edin ve her kağıdı farklı 2 - 3 konumda saklayın." + }, + "xOfY": { + "message": "$1 / $2", + "description": "$1 and $2 are intended to be two numbers, where $2 is a total, and $1 is a count towards that total" + }, + "xOfYPending": { + "message": "$1 / $2 bekliyor", + "description": "$1 and $2 are intended to be two numbers, where $2 is a total number of pending confirmations, and $1 is a count towards that total" + }, + "yesLetsTry": { + "message": "Evet, deneyelim" + }, + "youNeedToAllowCameraAccess": { + "message": "Bu özelliği kullanmak için kamera erişimine izin vermeniz gereklidir." + }, "youSign": { "message": "İmzalıyorsunuz" + }, + "yourPrivateSeedPhrase": { + "message": "Özel Gizli Kurtarma İfadeniz" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Hızlandırma için sıfır gaz fiyatı" } } diff --git a/app/_locales/uk/messages.json b/app/_locales/uk/messages.json index a2eba6386..95bded6b8 100644 --- a/app/_locales/uk/messages.json +++ b/app/_locales/uk/messages.json @@ -1,4 +1,10 @@ { + "QRHardwareSignRequestCancel": { + "message": "Відхилити" + }, + "QRHardwareWalletImporterTitle": { + "message": "Сканувати QR-код" + }, "about": { "message": "Про Google Chrome" }, @@ -256,6 +262,9 @@ "currentLanguage": { "message": "Поточна мова" }, + "custom": { + "message": "Розширені" + }, "customGas": { "message": "Налаштувати пальне" }, @@ -530,6 +539,9 @@ "learnMore": { "message": "Дізнатись більше" }, + "learnMoreUpperCase": { + "message": "Дізнатись більше" + }, "ledgerAccountRestriction": { "message": "Потрібно скористатися своїм останнім обліковим записом, перш ніж додавати новий." }, diff --git a/app/_locales/vi/messages.json b/app/_locales/vi/messages.json index b7d58fef7..060c5e485 100644 --- a/app/_locales/vi/messages.json +++ b/app/_locales/vi/messages.json @@ -1,4 +1,49 @@ { + "QRHardwareInvalidTransactionTitle": { + "message": "Lỗi" + }, + "QRHardwareMismatchedSignId": { + "message": "Dữ liệu giao dịch không đồng nhất. Vui lòng kiểm tra chi tiết giao dịch." + }, + "QRHardwarePubkeyAccountOutOfRange": { + "message": "Không còn tài khoản nào. Nếu bạn muốn truy cập một tài khoản khác không được liệt kê bên dưới, vui lòng kết nối lại với ví lạnh và chọn tài khoản đó." + }, + "QRHardwareScanInstructions": { + "message": "Đặt mã QR phía trước máy ảnh. Màn hình bị mờ nhưng không ảnh hưởng đến khả năng đọc." + }, + "QRHardwareSignRequestCancel": { + "message": "Từ chối" + }, + "QRHardwareSignRequestDescription": { + "message": "Sau khi bạn đã ký bằng ví của mình, nhấn vào 'Lấy Chữ Ký' để nhận chữ ký" + }, + "QRHardwareSignRequestGetSignature": { + "message": "Lấy Chữ Ký" + }, + "QRHardwareSignRequestSubtitle": { + "message": "Quét mã QR bằng ví của bạn" + }, + "QRHardwareSignRequestTitle": { + "message": "Yêu Cầu Chữ Ký" + }, + "QRHardwareUnknownQRCodeTitle": { + "message": "Lỗi" + }, + "QRHardwareUnknownWalletQRCode": { + "message": "Mã QR không hợp lệ. Vui lòng quét mã QR đồng bộ của ví lạnh." + }, + "QRHardwareWalletImporterTitle": { + "message": "Quét mã QR" + }, + "QRHardwareWalletSteps1Description": { + "message": "Kết nối với một ví lạnh ngoại tuyến hoàn toàn có thể truyền tin bằng mã QR. Các ví lạnh ngoại tuyến hoàn toàn được hỗ trợ chính thức bao gồm:" + }, + "QRHardwareWalletSteps1Title": { + "message": "Ví Lạnh dựa trên QR" + }, + "QRHardwareWalletSteps2Description": { + "message": "AirGap Vault & Ngrave (Sắp Ra Mắt)" + }, "about": { "message": "Giới thiệu" }, @@ -28,6 +73,10 @@ "accountName": { "message": "Tên tài khoản" }, + "accountNameDuplicate": { + "message": "Tên tài khoản này đã tồn tại", + "description": "This is an error message shown when the user enters a new account name that matches an existing account name" + }, "accountOptions": { "message": "Tùy chọn tài khoản" }, @@ -43,6 +92,15 @@ "activityLog": { "message": "nhật ký hoạt động" }, + "add": { + "message": "Thêm" + }, + "addANetwork": { + "message": "Thêm mạng" + }, + "addANickname": { + "message": "Thêm tên riêng" + }, "addAcquiredTokens": { "message": "Thêm token mà bạn đã mua bằng MetaMask" }, @@ -52,6 +110,9 @@ "addContact": { "message": "Thêm người liên hệ" }, + "addCustomToken": { + "message": "Thêm Token Tùy Chỉnh" + }, "addCustomTokenByContractAddress": { "message": "Bạn không tìm thấy token? Bạn có thể dán địa chỉ của bất kỳ token nào để thêm token đó theo cách thủ công. Bạn có thể tìm thấy địa chỉ hợp đồng token trên $1.", "description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum" @@ -76,6 +137,12 @@ "addFriendsAndAddresses": { "message": "Thêm bạn bè và địa chỉ bạn tin cậy" }, + "addMemo": { + "message": "Thêm bản ghi nhớ" + }, + "addNFT": { + "message": "Thêm NFT" + }, "addNetwork": { "message": "Thêm mạng" }, @@ -91,12 +158,36 @@ "addToken": { "message": "Thêm token" }, + "address": { + "message": "Địa chỉ" + }, + "addressBookIcon": { + "message": "Biểu tượng sổ địa chỉ" + }, "advanced": { "message": "Nâng cao" }, + "advancedBaseGasFeeToolTip": { + "message": "Khi các giao dịch của bạn được đưa vào khối, mọi phần chênh lệch giữa phí cơ bản tối đa và phí cơ bản thực tế đều sẽ được hoàn lại. Tổng số tiền sẽ được tính bằng phí cơ bản tối đa (theo GWEI) * giới hạn gas." + }, + "advancedGasFeeDefaultOptIn": { + "message": "Lưu $1 này làm mặc định của tôi cho \"Nâng cao\"" + }, + "advancedGasFeeDefaultOptOut": { + "message": "Luôn sử dụng các giá trị và thiết lập nâng cao này làm mặc định." + }, + "advancedGasFeeModalTitle": { + "message": "Phí gas nâng cao" + }, + "advancedGasPriceTitle": { + "message": "Giá gas" + }, "advancedOptions": { "message": "Tùy chọn nâng cao" }, + "advancedPriorityFeeToolTip": { + "message": "Phí ưu tiên (hay còn được gọi là \"phí khích lệ thợ đào\") được chuyển trực tiếp cho các thợ đào và khuyến khích họ ưu tiên giao dịch của bạn." + }, "advancedSettingsDescription": { "message": "Truy cập các tính năng dành cho nhà phát triển, tải Nhật ký trạng thái xuống, Đặt lại tài khoản, thiết lập mạng thử nghiệm và RPC tùy chỉnh" }, @@ -130,6 +221,10 @@ "allowExternalExtensionTo": { "message": "Cho phép tiện ích bên ngoài này:" }, + "allowSpendToken": { + "message": "Cấp quyền truy cập vào $1 của bạn?", + "description": "$1 is the symbol of the token that are requesting to spend" + }, "allowThisSiteTo": { "message": "Cho phép trang web này:" }, @@ -175,6 +270,9 @@ "approved": { "message": "Đã phê duyệt" }, + "approvedAmountWithColon": { + "message": "Số lượng được chấp nhận:" + }, "asset": { "message": "Tài sản" }, @@ -229,9 +327,43 @@ "balanceOutdated": { "message": "Số dư có thể đã cũ" }, + "baseFee": { + "message": "Phí cơ bản" + }, "basic": { "message": "Cơ bản" }, + "betaMetamaskDescription": { + "message": "Được hàng triệu người tin dùng, MetaMask là một ví an toàn cho phép mọi người có thể truy cập vào thế giới web3." + }, + "betaMetamaskDescriptionExplanation": { + "message": "Sử dụng phiên bản này để thử nghiệm các tính năng sắp ra mắt trước khi chúng được phát hành. Việc sử dụng và phản hồi của bạn sẽ giúp chúng tôi xây dựng phiên bản MetaMask tốt nhất có thể. Việc bạn sử dụng MetaMask Beta phải tuân theo $1 tiêu chuẩn cũng như $2 của chúng tôi. Vì đây là phiên bản Beta, nguy cơ xuất hiện lỗi sẽ nhiều hơn bình thường. Bằng cách tiếp tục, bạn chấp nhận và thừa nhận những nguy cơ này, cũng như những nguy cơ theo Điều Khoản Beta và Điều Khoản của chúng tôi.", + "description": "$1 represents localization item betaMetamaskDescriptionExplanationTermsLinkText. $2 represents localization item betaMetamaskDescriptionExplanationBetaTermsLinkText" + }, + "betaMetamaskDescriptionExplanationBetaTermsLinkText": { + "message": "Điều Khoản Beta Bổ Sung" + }, + "betaMetamaskDescriptionExplanationTermsLinkText": { + "message": "Điều khoản" + }, + "betaMetamaskVersion": { + "message": "Phiên Bản MetaMask Beta" + }, + "betaWelcome": { + "message": "Chào mừng đến với MetaMask Beta" + }, + "blockExplorerAccountAction": { + "message": "Tài khoản", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Account in Explorer" + }, + "blockExplorerAssetAction": { + "message": "Tài sản", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Asset in Explorer" + }, + "blockExplorerSwapAction": { + "message": "Hoán đổi", + "description": "This is used with viewOnEtherscan e.g View Swap on Etherscan" + }, "blockExplorerUrl": { "message": "URL trình khám phá khối" }, @@ -251,9 +383,21 @@ "buildContactList": { "message": "Xây dựng danh sách liên hệ của bạn" }, + "builtAroundTheWorld": { + "message": "MetaMask được thiết kế và xây dựng trên khắp thế giới." + }, + "busy": { + "message": "Đang bận" + }, "buy": { "message": "Mua" }, + "buyWithTransak": { + "message": "Mua ETH bằng Transak" + }, + "buyWithTransakDescription": { + "message": "Transak hỗ trợ thẻ ghi nợ và chuyển khoản ngân hàng (tùy vào địa điểm) tại hơn 59 quốc gia. Nạp ETH vào tài khoản MetaMask của bạn." + }, "buyWithWyre": { "message": "Mua ETH qua Wyre" }, @@ -269,6 +413,15 @@ "cancel": { "message": "Hủy" }, + "cancelEdit": { + "message": "Hủy Chỉnh Sửa" + }, + "cancelPopoverTitle": { + "message": "Hủy giao dịch" + }, + "cancelSpeedUp": { + "message": "hủy hoặc tăng tốc giao dịch." + }, "cancellationGasFee": { "message": "Phí gas hủy" }, @@ -287,6 +440,10 @@ "chromeRequiredForHardwareWallets": { "message": "Bạn cần sử dụng MetaMask trên Google Chrome để kết nối với Ví cứng của bạn." }, + "clickToConnectLedgerViaWebHID": { + "message": "Nhấn vào đây để kết nối với thiết bị Ledger của bạn qua WebHID", + "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" + }, "clickToRevealSeed": { "message": "Nhấp vào đây để hiện các từ bí mật" }, @@ -299,6 +456,9 @@ "confirmPassword": { "message": "Xác nhận mật khẩu" }, + "confirmRecoveryPhrase": { + "message": "Xác nhận Cụm Mật Khẩu Khôi Phục Bí Mật" + }, "confirmSecretBackupPhrase": { "message": "Xác nhận Cụm mật khẩu sao lưu bí mật" }, @@ -406,12 +566,18 @@ "continue": { "message": "Tiếp tục" }, + "continueToTransak": { + "message": "Tiếp tục đến Transak" + }, "continueToWyre": { "message": "Tiếp tục chuyển đến Wyre" }, "contract": { "message": "Hợp đồng" }, + "contractAddress": { + "message": "Địa chỉ hợp đồng" + }, "contractAddressError": { "message": "Bạn đang gửi token đến địa chỉ hợp đồng của token. Điều này có thể khiến bạn bị mất những token này." }, @@ -430,6 +596,9 @@ "copyPrivateKey": { "message": "Đây là khóa riêng tư của bạn (hãy nhấp vào để sao chép)" }, + "copyRawTransactionData": { + "message": "Sao chép dữ liệu giao dịch thô" + }, "copyToClipboard": { "message": "Sao chép vào khay nhớ tạm" }, @@ -445,6 +614,9 @@ "createAccount": { "message": "Tạo tài khoản" }, + "createNewWallet": { + "message": "Tạo ví mới" + }, "createPassword": { "message": "Tạo mật khẩu" }, @@ -466,9 +638,22 @@ "currentLanguage": { "message": "Ngôn ngữ hiện tại" }, + "currentTitle": { + "message": "Hiện tại:" + }, + "currentlyUnavailable": { + "message": "Không có sẵn trên mạng này" + }, + "custom": { + "message": "Nâng cao" + }, "customGas": { "message": "Tùy chỉnh gas" }, + "customGasSettingToolTipMessage": { + "message": "Sử dụng $1 để tùy chỉnh giá gas. Việc này có thể gây nhầm lẫn nếu bạn không quen thuộc. Bạn phải tự chịu trách nhiệm nếu thực hiện.", + "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold fontweight" + }, "customGasSubTitle": { "message": "Việc tăng phí có thể giúp giảm thời gian xử lý, nhưng điều này không được đảm bảo." }, @@ -478,9 +663,29 @@ "customToken": { "message": "Token tùy chỉnh" }, + "dappSuggested": { + "message": "Trang web gợi ý" + }, + "dappSuggestedGasSettingToolTipMessage": { + "message": "$1 đã gợi ý mức giá này.", + "description": "$1 is url for the dapp that has suggested gas settings" + }, + "dappSuggestedShortLabel": { + "message": "Trang web" + }, + "dappSuggestedTooltip": { + "message": "$1 đã đề xuất mức giá này.", + "description": "$1 represents the Dapp's origin" + }, + "data": { + "message": "Dữ liệu" + }, "dataBackupFoundInfo": { "message": "Một số dữ liệu tài khoản của bạn đã được sao lưu trong lần cài đặt MetaMask trước đó. Dữ liệu này có thể bao gồm các tùy chọn cài đặt, danh bạ và token. Bạn có muốn khôi phục dữ liệu này bây giờ không?" }, + "dataHex": { + "message": "Thập lục phân" + }, "decimal": { "message": "Vị trí thập phân của token" }, @@ -522,6 +727,9 @@ "depositEther": { "message": "Nộp Ether" }, + "description": { + "message": "Mô tả" + }, "details": { "message": "Chi tiết" }, @@ -579,9 +787,122 @@ "edit": { "message": "Chỉnh sửa" }, + "editANickname": { + "message": "Chỉnh sửa tên riêng" + }, + "editAddressNickname": { + "message": "Chỉnh sửa tên riêng địa chỉ" + }, "editContact": { "message": "Chỉnh sửa người liên hệ" }, + "editGasEducationButtonText": { + "message": "Tôi nên chọn như thế nào?" + }, + "editGasEducationHighExplanation": { + "message": "Đây là lựa chọn tốt nhất cho các giao dịch nhạy cảm với thời gian (chẳng hạn như Hoán đổi) vì nó làm tăng khả năng giao dịch thành công. Quá trình Hoán đổi diễn ra quá lâu có thể khiến giao dịch thất bại và bạn bị mất một phần phí gas." + }, + "editGasEducationLowExplanation": { + "message": "Bạn nên sử dụng phí gas thấp hơn cho các giao dịch không quá quan trọng đến thời gian. Mức phí thấp hơn khiến khó dự đoán được khi nào (hoặc liệu) giao dịch của bạn thành công." + }, + "editGasEducationMediumExplanation": { + "message": "Phí gas trung bình phù hợp để gửi, rút hoặc thực hiện các giao dịch không nhạy cảm với thời gian khác. Thiết lập này thường cho kết quả giao dịch thành công." + }, + "editGasEducationModalIntro": { + "message": "Lựa chọn phí gas phù hợp tùy thuộc vào loại giao dịch và tầm quan trọng của nó đối với bạn." + }, + "editGasEducationModalTitle": { + "message": "Cách chọn?" + }, + "editGasFeeModalTitle": { + "message": "Chỉnh sửa phí gas" + }, + "editGasHigh": { + "message": "Cao" + }, + "editGasLimitOutOfBounds": { + "message": "Giới hạn gas tối thiểu phải là $1" + }, + "editGasLimitOutOfBoundsV2": { + "message": "Giới hạn gas phải lớn hơn $1 và nhỏ hơn $2", + "description": "$1 is the minimum limit for gas and $2 is the maximum limit" + }, + "editGasLimitTooltip": { + "message": "Giới hạn gas là đơn vị gas tối đa mà bạn sẵn sàng sử dụng. Đơn vị gas là hệ số nhân của \"Phí ưu tiên tối đa\" và \"Phí tối đa\"." + }, + "editGasLow": { + "message": "Thấp" + }, + "editGasMaxBaseFeeGWEIImbalance": { + "message": "Phí cơ bản tối đa không thể thấp hơn phí ưu tiên" + }, + "editGasMaxBaseFeeHigh": { + "message": "Phí cơ bản tối đa cao hơn cần thiết" + }, + "editGasMaxBaseFeeLow": { + "message": "Phí cơ bản tối đa thấp so với tình trạng mạng hiện tại" + }, + "editGasMaxFeeHigh": { + "message": "Phí tối đa cao hơn cần thiết" + }, + "editGasMaxFeeLow": { + "message": "Phí tối đa quá thấp so với tình trạng mạng" + }, + "editGasMaxFeePriorityImbalance": { + "message": "Phí tối đa không thể thấp hơn phí ưu tiên tối đa" + }, + "editGasMaxFeeTooltip": { + "message": "Phí tối đa là phí cao nhất mà bạn sẽ trả (phí cơ bản + phí ưu tiên)." + }, + "editGasMaxPriorityFeeBelowMinimum": { + "message": "Phí ưu tiên tối đa phải lớn hơn 0 GWEI" + }, + "editGasMaxPriorityFeeBelowMinimumV2": { + "message": "Phí ưu tiên phải lớn hơn 0." + }, + "editGasMaxPriorityFeeHigh": { + "message": "Phí ưu tiên tối đa cao hơn cần thiết. Bạn có thể phải trả nhiều hơn mức cần thiết." + }, + "editGasMaxPriorityFeeHighV2": { + "message": "Phí ưu tiên cao hơn cần thiết. Bạn có thể phải trả nhiều hơn mức cần thiết" + }, + "editGasMaxPriorityFeeLow": { + "message": "Phí ưu tiên tối đa thấp so với tình trạng mạng hiện tại" + }, + "editGasMaxPriorityFeeLowV2": { + "message": "Phí ưu tiên thấp so với tình trạng mạng hiện tại" + }, + "editGasMaxPriorityFeeTooltip": { + "message": "Phí ưu tiên tối đa (hay còn được gọi là \"phí khích lệ thợ đào\") được chuyển trực tiếp cho các thợ đào và khuyến khích họ ưu tiên giao dịch của bạn. Thường thì bạn sẽ chi trả theo mức thiết lập tối đa của mình" + }, + "editGasMedium": { + "message": "Trung bình" + }, + "editGasPriceTooLow": { + "message": "Giá gas phải lớn hơn 0" + }, + "editGasPriceTooltip": { + "message": "Mạng này yêu cầu trường \"Giá gas\" khi gửi giao dịch. Giá gas là số tiền bạn sẽ trả cho mỗi đơn vị gas." + }, + "editGasSubTextAmountLabel": { + "message": "Số lượng tối đa:", + "description": "This is meant to be used as the $1 substitution editGasSubTextAmount" + }, + "editGasSubTextFeeLabel": { + "message": "Phí tối đa:" + }, + "editGasTitle": { + "message": "Chỉnh sửa ưu tiên" + }, + "editGasTooLow": { + "message": "Thời gian xử lý không rõ" + }, + "editGasTooLowTooltip": { + "message": "Phí tối đa hoặc phí ưu tiên tối đa của bạn có thể thấp so với tình trạng mạng hiện tại. Chúng tôi không biết khi nào (hoặc liệu) giao dịch của bạn được xử lý. " + }, + "editGasTooLowWarningTooltip": { + "message": "Việc này sẽ giảm mức phí tối đa, nhưng nếu lưu lượng mạng tăng lên, giao dịch của bạn có thể bị trì hoãn hoặc thất bại." + }, "editNonceField": { "message": "Chỉnh sửa số chỉ dùng một lần" }, @@ -591,6 +912,22 @@ "editPermission": { "message": "Chỉnh sửa quyền" }, + "enableAutoDetect": { + "message": " Bật Tự Động Phát Hiện" + }, + "enableFromSettings": { + "message": " Bật lên trong Cài Đặt." + }, + "enableOpenSeaAPI": { + "message": "Bật API OpenSea" + }, + "enableOpenSeaAPIDescription": { + "message": "Sử dụng API của OpenSea để tìm nạp dữ liệu NFT. Tính năng tự động phát hiện NFT dựa vào API của OpenSea và sẽ không khả dụng nếu tính năng này bị tắt." + }, + "enableToken": { + "message": "bật $1", + "description": "$1 is a token symbol, e.g. ETH" + }, "encryptionPublicKeyNotice": { "message": "$1 muốn biết khóa mã hóa công khai của bạn. Bằng việc đồng ý, trang web này sẽ có thể gửi thông báo được mã hóa cho bạn.", "description": "$1 is the web3 site name" @@ -633,12 +970,21 @@ "message": "Điểm cuối đã trả về một mã chuỗi khác: $1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "ensIllegalCharacter": { + "message": "Ký Tự Không Hợp Lệ đối với ENS." + }, "ensNotFoundOnCurrentNetwork": { "message": "Không tìm thấy tên ENS trên mạng hiện tại. Đang chuyển sang mạng chính thức của Ethereum." }, + "ensNotSupportedOnNetwork": { + "message": "Mạng không hỗ trợ ENS" + }, "ensRegistrationError": { "message": "Lỗi khi đăng ký tên ENS" }, + "ensUnknownError": { + "message": "Tra Cứu ENS thất bại." + }, "enterAnAlias": { "message": "Nhập một biệt danh" }, @@ -702,9 +1048,18 @@ "etherscanView": { "message": "Xem tài khoản trên Etherscan" }, + "etherscanViewOn": { + "message": "Xem trên Etherscan" + }, "expandView": { "message": "Mở rộng cửa sổ xem" }, + "experimental": { + "message": "Thử nghiệm" + }, + "experimentalSettingsDescription": { + "message": "Phát hiện token và hơn thế nữa" + }, "exportPrivateKey": { "message": "Xuất khóa riêng tư" }, @@ -724,6 +1079,9 @@ "failureMessage": { "message": "Đã xảy ra sự cố và chúng tôi không thể hoàn tất hành động" }, + "fakeTokenWarning": { + "message": "Bất kỳ ai cũng có thể tạo token, bao gồm cả phiên bản giả mạo của các token hiện tại. Tìm hiểu thêm về $1" + }, "fast": { "message": "Nhanh" }, @@ -741,6 +1099,21 @@ "message": "Tính năng nhập tệp không hoạt động? Nhấp vào đây!", "description": "Helps user import their account from a JSON file" }, + "flaskSnapSettingsCardButtonCta": { + "message": "Xem chi tiết", + "description": "Call to action a user can take to see more information about the Snap that is installed" + }, + "flaskSnapSettingsCardDateAddedOn": { + "message": "Đã thêm vào", + "description": "Start of the sentence describing when and where snap was added" + }, + "flaskSnapSettingsCardFrom": { + "message": "từ", + "description": "Part of the sentence describing when and where snap was added" + }, + "followUsOnTwitter": { + "message": "Theo dõi chúng tôi trên Twitter" + }, "forbiddenIpfsGateway": { "message": "Cổng kết nối IPFS không được phép: Vui lòng chỉ định một cổng kết nối CID" }, @@ -760,6 +1133,19 @@ "functionType": { "message": "Loại chức năng" }, + "gas": { + "message": "Gas" + }, + "gasDisplayAcknowledgeDappButtonText": { + "message": "Chỉnh sửa phí gas gợi ý" + }, + "gasDisplayDappWarning": { + "message": "Phí gas này đã được gợi ý bởi $1. Việc sửa đổi có thể khiến giao dịch của bạn gặp sự cố. Vui lòng liên hệ với $1 nếu bạn có câu hỏi.", + "description": "$1 represents the Dapp's origin" + }, + "gasEstimatesUnavailableWarning": { + "message": "Các ước tính thấp, trung bình và cao của chúng tôi hiện không có sẵn." + }, "gasLimit": { "message": "Giới hạn gas" }, @@ -773,6 +1159,12 @@ "message": "Giới hạn gas ít nhất phải là $1", "description": "$1 is the custom gas limit, in decimal." }, + "gasLimitV2": { + "message": "Giới hạn gas" + }, + "gasOption": { + "message": "Tùy chọn gas" + }, "gasPrice": { "message": "Giá gas (GWEI)" }, @@ -791,6 +1183,38 @@ "gasPriceInfoTooltipContent": { "message": "Giá gas xác định khoản Ether mà bạn sẵn sàng thanh toán cho mỗi đơn vị gas." }, + "gasTimingHoursShort": { + "message": "$1 giờ", + "description": "$1 represents a number of hours" + }, + "gasTimingMinutes": { + "message": "$1 phút", + "description": "$1 represents a number of minutes" + }, + "gasTimingMinutesShort": { + "message": "$1 phút", + "description": "$1 represents a number of minutes" + }, + "gasTimingNegative": { + "message": "Có thể sau $1", + "description": "$1 represents an amount of time" + }, + "gasTimingPositive": { + "message": "Có khả năng sau < $1", + "description": "$1 represents an amount of time" + }, + "gasTimingSeconds": { + "message": "$1 giây", + "description": "$1 represents a number of seconds" + }, + "gasTimingSecondsShort": { + "message": "$1 giây", + "description": "$1 represents a number of seconds" + }, + "gasTimingVeryPositive": { + "message": "Nhiều khả năng sau < $1", + "description": "$1 represents an amount of time" + }, "gasUsed": { "message": "Đã dùng gas" }, @@ -818,9 +1242,15 @@ "getStarted": { "message": "Bắt đầu" }, + "goBack": { + "message": "Quay Lại" + }, "goerli": { "message": "Mạng thử nghiệm Goerli" }, + "grantedToWithColon": { + "message": "Cấp cho:" + }, "happyToSeeYou": { "message": "Chúng tôi rất vui khi được gặp bạn." }, @@ -863,9 +1293,25 @@ "hideZeroBalanceTokens": { "message": "Ẩn các token không có số dư" }, + "high": { + "message": "Linh hoạt" + }, + "highGasSettingToolTipDialog": { + "message": "Có khả năng cao, ngay cả trong thị trường biến động" + }, + "highGasSettingToolTipMessage": { + "message": "Sử dụng $1 để bù đắp khi lưu lượng mạng lưới tăng vọt trong những trường hợp như phát hành NFT nổi tiếng.", + "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" + }, + "highLowercase": { + "message": "cao" + }, "history": { "message": "Lịch sử" }, + "id": { + "message": "ID" + }, "import": { "message": "Nhập", "description": "Button to import an account from a selected file" @@ -873,6 +1319,9 @@ "importAccount": { "message": "Nhập tài khoản" }, + "importAccountError": { + "message": "Lỗi khi nhập tài khoản." + }, "importAccountLinkText": { "message": "nhập bằng Cụm mật khẩu khôi phục bí mật" }, @@ -886,12 +1335,31 @@ "message": "hoặc $1", "description": "$1 represents the text from `importAccountLinkText` as a link" }, + "importExistingWalletDescription": { + "message": "Nhập Cụm Mật Khẩu Khôi Phục Bí Mật (còn được gọi là Cụm Mật Khẩu Gốc) mà bạn được cấp khi tạo ví. $1", + "description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link" + }, + "importExistingWalletTitle": { + "message": "Nhập ví hiện tại bằng Cụm Mật Khẩu Khôi Phục Bí Mật" + }, + "importMyWallet": { + "message": "Nhập Ví Của Tôi" + }, + "importNFTs": { + "message": "Nhập NFT" + }, "importTokenQuestion": { "message": "Bạn muốn nhập token?" }, "importTokenWarning": { "message": "Bất kỳ ai cũng tạo được token bằng bất kỳ tên nào, kể cả phiên bản giả của token hiện có. Bạn tự chịu rủi ro khi thêm và giao dịch!" }, + "importTokens": { + "message": "nhập token" + }, + "importTokensCamelCase": { + "message": "Nhập Token" + }, "importWallet": { "message": "Nhập ví" }, @@ -915,6 +1383,9 @@ "insufficientFunds": { "message": "Không đủ tiền." }, + "insufficientFundsForGas": { + "message": "Không đủ tiền cho gas" + }, "insufficientTokens": { "message": "Không đủ token." }, @@ -974,10 +1445,19 @@ "ipfsGatewayDescription": { "message": "Nhập URL của cổng kết nối IPFS CID để dùng cho quá trình phân giải nội dung ENS." }, + "jsDeliver": { + "message": "jsDeliver" + }, "jsonFile": { "message": "Tệp JSON", "description": "format for importing an account" }, + "keystone": { + "message": "Keystone" + }, + "keystoneTutorial": { + "message": " (Hướng dẫn)" + }, "knownAddressRecipient": { "message": "Địa chỉ hợp đồng đã biết." }, @@ -990,12 +1470,57 @@ "lastConnected": { "message": "Đã kết nối lần gần đây nhất" }, + "layer1Fees": { + "message": "Phí Lớp 1" + }, + "learmMoreAboutGas": { + "message": "Muốn $1 về gas?" + }, + "learnCancelSpeeedup": { + "message": "Tìm hiểu cách $1", + "description": "$1 is link to cancel or speed up transactions" + }, "learnMore": { "message": "Tìm hiểu thêm" }, + "learnMoreUpperCase": { + "message": "Tìm hiểu thêm" + }, + "learnScamRisk": { + "message": "lừa đảo và nguy cơ bảo mật." + }, "ledgerAccountRestriction": { "message": "Bạn cần sử dụng tài khoản gần đây nhất thì mới có thể thêm một tài khoản mới." }, + "ledgerConnectionInstructionCloseOtherApps": { + "message": "Đóng bất kỳ phần mềm nào khác được kết nối với thiết bị của bạn và sau đó nhấn vào đây để làm mới." + }, + "ledgerConnectionInstructionHeader": { + "message": "Trước khi nhấn xác nhận:" + }, + "ledgerConnectionInstructionStepFour": { + "message": "Bật \"dữ liệu hợp đồng thông minh\" hoặc \"ký mù\" trên thiết bị Ledger của bạn" + }, + "ledgerConnectionInstructionStepOne": { + "message": "Bật Sử Dụng Ledger Live trong Cài Đặt > Nâng Cao" + }, + "ledgerConnectionInstructionStepThree": { + "message": "Cắm thiết bị Ledger và chọn ứng dụng Ethereum" + }, + "ledgerConnectionInstructionStepTwo": { + "message": "Mở và mở khóa Ứng Dụng Ledger Live" + }, + "ledgerConnectionPreferenceDescription": { + "message": "Tùy chỉnh cách thức kết nối Ledger với MetaMask. Nên dùng $1, nhưng cũng có sẵn các tùy chọn khác. Đọc thêm tại đây: $2", + "description": "A description that appears above a dropdown where users can select between up to three options - Ledger Live, U2F or WebHID - depending on what is supported in their browser. $1 is the recommended browser option, it will be either WebHID or U2f. $2 is a link to an article where users can learn more, but will be the translation of the learnMore message." + }, + "ledgerDeviceOpenFailureMessage": { + "message": "Mở thiết bị Ledger không thành công. Ledger của bạn có thể đã được kết nối với phần mềm khác. Vui lòng đóng Ledger Live hoặc các ứng dụng khác được kết nối với thiết bị Ledger của bạn và thử kết nối lại." + }, + "ledgerLive": { + "message": "Ledger Live", + "description": "The name of a desktop app that can be used with your ledger device. We can also use it to connect a users Ledger device to MetaMask." + }, "ledgerLiveApp": { "message": "Ứng dụng Ledger Live" }, @@ -1005,12 +1530,22 @@ "ledgerTimeout": { "message": "Ledger Live mất quá nhiều thời gian để phản hồi hoặc đã hết thời gian chờ kết nối. Hãy đảm bảo bạn đã mở ứng dụng Ledger Live và đã mở khóa thiết bị." }, + "ledgerTransportChangeWarning": { + "message": "Nếu ứng dụng Ledger Live của bạn đang mở, vui lòng ngắt mọi kết nối Ledger Live đang mở và đóng ứng dụng Ledger Live." + }, + "ledgerWebHIDNotConnectedErrorMessage": { + "message": "Thiết bị Ledger chưa được kết nối. Nếu bạn muốn kết nối với Ledger, vui lòng nhấn lại vào \"Tiếp tục\" và chấp thuận kết nối HID", + "description": "An error message shown to the user during the hardware connect flow." + }, "letsGoSetUp": { "message": "Có, hãy thiết lập!" }, "likeToImportTokens": { "message": "Bạn có muốn thêm những token này không?" }, + "link": { + "message": "Liên kết" + }, "links": { "message": "Đường liên kết" }, @@ -1032,15 +1567,48 @@ "lockTimeTooGreat": { "message": "Thời gian khóa quá lớn" }, + "low": { + "message": "Thấp" + }, + "lowGasSettingToolTipMessage": { + "message": "Sử dụng $1 để chờ mức giá rẻ hơn. Thời gian dự kiến sẽ kém chính xác hơn nhiều do mức giá tương đối khó dự đoán.", + "description": "$1 is key 'low' separated here so that it can be passed in with bold fontweight" + }, + "lowLowercase": { + "message": "thấp" + }, + "lowPriorityMessage": { + "message": "Các giao dịch trong tương lai sẽ được xếp sau giao dịch này. Mức giá này được nhìn thấy lần cuối cách đây một thời gian." + }, "mainnet": { "message": "Mạng chính thức của Ethereum" }, "makeAnotherSwap": { "message": "Tạo một giao dịch hoán đổi mới" }, + "makeSureNoOneWatching": { + "message": "Đảm bảo không có ai đang nhìn màn hình của bạn", + "description": "Warning to users to be care while creating and saving their new Secret Recovery Phrase" + }, "max": { "message": "Tối đa" }, + "maxBaseFee": { + "message": "Phí cơ bản tối đa" + }, + "maxFee": { + "message": "Phí tối đa" + }, + "maxPriorityFee": { + "message": "Phí ưu tiên tối đa" + }, + "medium": { + "message": "Thị trường" + }, + "mediumGasSettingToolTipMessage": { + "message": "Sử dụng $1 để xử lý nhanh theo giá thị trường hiện tại.", + "description": "$1 is key 'medium' (text: 'Market') separated here so that it can be passed in with bold fontweight" + }, "memo": { "message": "thư báo" }, @@ -1071,6 +1639,9 @@ "metametricsCommitmentsAllowOptOut": { "message": "Luôn cho phép bạn chọn không tham gia thông qua phần Cài đặt" }, + "metametricsCommitmentsAllowOptOut2": { + "message": "Luôn có thể chọn không tham gia trong phần Cài Đặt" + }, "metametricsCommitmentsBoldNever": { "message": "Không bao giờ", "description": "This string is localized separately from some of the commitments so that we can bold it" @@ -1078,6 +1649,9 @@ "metametricsCommitmentsIntro": { "message": "MetaMask sẽ.." }, + "metametricsCommitmentsNeverCollect": { + "message": "Không bao giờ thu thập mã khóa, địa chỉ, giao dịch, số dư, mã băm hoặc bất kỳ thông tin cá nhân nào" + }, "metametricsCommitmentsNeverCollectIP": { "message": "$1 thu thập địa chỉ IP đầy đủ của bạn", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" @@ -1086,6 +1660,12 @@ "message": "$1 thu thập mã khóa, địa chỉ, giao dịch, số dư, mã băm hoặc bất kỳ thông tin cá nhân nào", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" }, + "metametricsCommitmentsNeverIP": { + "message": "Không bao giờ thu thập địa chỉ IP đầy đủ của bạn" + }, + "metametricsCommitmentsNeverSell": { + "message": "Không bao giờ bán dữ liệu để thu lợi. Tuyệt đối không bao giờ!" + }, "metametricsCommitmentsNeverSellDataForProfit": { "message": "$1 bán dữ liệu để thu lợi. Tuyệt đối không bao giờ!", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" @@ -1099,6 +1679,12 @@ "metametricsOptInDescription": { "message": "MetaMask muốn thu thập dữ liệu sử dụng để hiểu rõ hơn về cách người dùng tương tác với tiện ích. Chúng tôi sẽ dùng dữ liệu này để liên tục cải thiện độ hữu ích và trải nghiệm người dùng trên sản phẩm của mình và hệ sinh thái Ethereum." }, + "metametricsOptInDescription2": { + "message": "Chúng tôi muốn thu thập dữ liệu sử dụng cơ bản để cải thiện mức độ hữu ích của sản phẩm. Các chỉ số này sẽ..." + }, + "metametricsTitle": { + "message": "Tham gia cùng hơn 6 Triệu người dùng để cải thiện MetaMask" + }, "mismatchedChain": { "message": "Thông tin về mạng cho mã chuỗi này không khớp với hồ sơ của chúng tôi. Bạn nên $1 trước khi tiếp tục.", "description": "$1 is a clickable link with text defined by the 'mismatchedChainLinkText' key" @@ -1107,6 +1693,15 @@ "message": "xác minh thông tin về mạng", "description": "Serves as link text for the 'mismatchedChain' key. This text will be embedded inside the translation for that key." }, + "missingNFT": { + "message": "Không thấy NFT của mình?" + }, + "missingToken": { + "message": "Không thấy token của mình?" + }, + "mobileSyncWarning": { + "message": "Tính năng 'Đồng bộ với tiện ích' tạm thời bị tắt. Nếu bạn muốn sử dụng ví tiện ích trên thiết bị di động MetaMask, thì trên ứng dụng di động: hãy quay lại các tùy chọn thiết lập ví và chọn phương án 'Nhập bằng Cụm Mật Khẩu Khôi Phục Bí Mật'. Sử dụng cụm mật khẩu bí mật của ví tiện ích để nhập ví của bạn vào thiết bị di động." + }, "mustSelectOne": { "message": "Phải chọn ít nhất 1 token." }, @@ -1123,9 +1718,15 @@ "message": "Bạn cần trợ giúp? Liên hệ $1", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" }, + "needHelpFeedback": { + "message": "Chia sẻ Phản Hồi của bạn" + }, "needHelpLinkText": { "message": "Hỗ trợ về MetaMask" }, + "needHelpSubmitTicket": { + "message": "Gửi Phiếu" + }, "needImportFile": { "message": "Bạn phải chọn tệp để nhập.", "description": "User is important an account and needs to add a file to continue" @@ -1148,6 +1749,12 @@ "networkNameEthereum": { "message": "Ethereum" }, + "networkNamePolygon": { + "message": "Polygon" + }, + "networkNameRinkeby": { + "message": "Rinkeby" + }, "networkNameTestnet": { "message": "Mạng thử nghiệm" }, @@ -1157,6 +1764,20 @@ "networkSettingsDescription": { "message": "Thêm và chỉnh sửa mạng RPC tùy chỉnh" }, + "networkStatus": { + "message": "Trạng thái mạng" + }, + "networkStatusBaseFeeTooltip": { + "message": "Phí cơ bản do mạng thiết lập và thay đổi sau mỗi 13-14 giây. Các tùy chọn $1 và $2 của chúng tôi tính đến các mức tăng đột biến.", + "description": "$1 and $2 are bold text for Medium and Aggressive respectively." + }, + "networkStatusPriorityFeeTooltip": { + "message": "Khoảng phí ưu tiên (hay còn được gọi là \"phí khích lệ thợ đào). Phí ưu tiên sẽ được chuyển cho thợ đào và khuyến khích họ ưu tiên giao dịch của bạn." + }, + "networkStatusStabilityFeeTooltip": { + "message": "Phí gas tương đối $1 so với 72 giờ qua.", + "description": "$1 is networks stability value - stable, low, high" + }, "networkURL": { "message": "URL mạng" }, @@ -1179,12 +1800,27 @@ "message": "Tài khoản $1", "description": "Default name of next account to be created on create account screen" }, + "newCollectibleAddFailed": { + "message": "Bộ sưu tập đã không được thêm vì: $1" + }, + "newCollectibleAddedMessage": { + "message": "Bộ sưu tập đã được thêm thành công!" + }, "newContact": { "message": "Người liên hệ mới" }, "newContract": { "message": "Hợp đồng mới" }, + "newNFTsDetected": { + "message": "Mới! Phát hiện NFT" + }, + "newNFTsDetectedInfo": { + "message": "Cho phép MetaMask tự động phát hiện NFT từ Opensea và hiển thị trong ví MetaMask của bạn." + }, + "newNetworkAdded": { + "message": "“$1” đã được thêm thành công!" + }, "newPassword": { "message": "Mật khẩu mới (tối thiểu 8 ký tự)" }, @@ -1197,6 +1833,9 @@ "newTransactionFee": { "message": "Phí giao dịch mới" }, + "newValues": { + "message": "giá trị mới" + }, "next": { "message": "Tiếp theo" }, @@ -1204,6 +1843,15 @@ "message": "Số chỉ dùng một lần lớn hơn số chỉ dùng một lần gợi ý là $1", "description": "The next nonce according to MetaMask's internal logic" }, + "nftTokenIdPlaceholder": { + "message": "Nhập ID bộ sưu tập" + }, + "nfts": { + "message": "NFT" + }, + "nickname": { + "message": "Tên riêng" + }, "noAccountsFound": { "message": "Không tìm thấy tài khoản nào cho cụm từ tìm kiếm đã đưa ra" }, @@ -1213,9 +1861,15 @@ "noAlreadyHaveSeed": { "message": "Không, tôi đã có Cụm mật khẩu bí mật" }, + "noConversionDateAvailable": { + "message": "Hiện Không Có Ngày Chuyển Đổi Tiền Tệ Nào" + }, "noConversionRateAvailable": { "message": "Không có sẵn tỷ lệ quy đổi nào" }, + "noNFTs": { + "message": "Chưa có NFT" + }, "noThanks": { "message": "Không, cảm ơn" }, @@ -1240,6 +1894,9 @@ "nonceFieldHeading": { "message": "Số dùng một lần tùy chỉnh" }, + "notBusy": { + "message": "Không bận" + }, "notCurrentAccount": { "message": "Tài khoản này có chính xác không? Tài khoản này khác với tài khoản bạn đang chọn trong ví của mình" }, @@ -1298,6 +1955,43 @@ "message": "Thông tin cập nhật về việc hỗ trợ Ledger cho người dùng Chrome", "description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update" }, + "notifications7DescriptionOne": { + "message": "MetaMask v10.1.0 bao gồm hỗ trợ mới cho các giao dịch EIP-1559 khi sử dụng thiết bị Ledger.", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for ledger and EIP1559 in v10.1.0" + }, + "notifications7DescriptionTwo": { + "message": "Để hoàn thành các giao dịch trên Mạng chính thức của Ethereum, hãy chắc chắn thiết bị Ledger của bạn đã được cập nhật lên phiên bản phần mềm mới nhất.", + "description": "Description of a notification in the 'See What's New' popup. Describes the need to update ledger firmware." + }, + "notifications7Title": { + "message": "Cập nhật phiên bản phần mềm Ledger", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." + }, + "notifications8ActionText": { + "message": "Đến Cài Đặt Nâng Cao", + "description": "Description on an action button that appears in the What's New popup. Tells the user that if they click it, they will go to our Advanced Settings page." + }, + "notifications8DescriptionOne": { + "message": "Kể từ phiên bản MetaMask v10.4.0, bạn không cần phần mềm Ledger Live để kết nối thiết bị Ledger của mình với MetaMask nữa.", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for how Ledger Live is no longer needed to connect the device." + }, + "notifications8DescriptionTwo": { + "message": "Để có trải nghiệm sử dụng thiết bị Ledger dễ dàng và ổn định hơn, hãy đến thẻ Nâng Cao trong phần cài đặt và chuyển 'Dạng Kết Nối Ledger Ưu Tiên' thành 'WebHID'.", + "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." + }, + "notifications8Title": { + "message": "Cải thiện kết nối Ledger", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users that there is an improvement in how they can connect their device." + }, + "notifications9DescriptionOne": { + "message": "Giờ đây chúng tôi sẽ cung cấp cho bạn thêm nhiều thông tin chi tiết hơn trong thẻ 'Dữ Liệu' khi xác nhận các giao dịch hợp đồng thông minh." + }, + "notifications9DescriptionTwo": { + "message": "Giờ đây bạn có thể hiểu rõ hơn về các chi tiết trong giao dịch của mình và dễ dàng thêm địa chỉ giao dịch vào sổ địa chỉ, giúp bạn đưa ra những quyết định an toàn và sáng suốt." + }, + "notifications9Title": { + "message": "👓 Chúng tôi đang làm cho các giao dịch dễ đọc hơn." + }, "ofTextNofM": { "message": "trên" }, @@ -1313,16 +2007,79 @@ "on": { "message": "Bật" }, + "onboardingCreateWallet": { + "message": "Tạo ví mới" + }, + "onboardingImportWallet": { + "message": "Nhập ví có sẵn" + }, + "onboardingPinExtensionBillboardAccess": { + "message": "Toàn Quyền Truy Cập" + }, + "onboardingPinExtensionBillboardDescription": { + "message": "Các tiện ích này có thể xem và thay đổi thông tin" + }, + "onboardingPinExtensionBillboardDescription2": { + "message": "trên trang web này." + }, + "onboardingPinExtensionBillboardTitle": { + "message": "Tiện ích" + }, + "onboardingPinExtensionChrome": { + "message": "Nhấn vào biểu tượng tiện ích trên trình duyệt" + }, + "onboardingPinExtensionDescription": { + "message": "Ghim MetaMask trên trình duyệt để bạn có thể truy cập và dễ dàng xem các xác nhận giao dịch." + }, + "onboardingPinExtensionDescription2": { + "message": "Bạn có thể mở MetaMask bằng cách nhấn vào tiện ích và truy cập ví của mình chỉ với 1 cú nhấp chuột." + }, + "onboardingPinExtensionDescription3": { + "message": "Nhấn vào biểu tượng tiện ích trên trình duyệt để truy cập tức thì" + }, + "onboardingPinExtensionLabel": { + "message": "Ghim MetaMask" + }, + "onboardingPinExtensionStep1": { + "message": "1" + }, + "onboardingPinExtensionStep2": { + "message": "2" + }, + "onboardingPinExtensionTitle": { + "message": "Quá trình cài đặt MetaMask đã hoàn tất!" + }, "onboardingReturnNotice": { "message": "\"$1\" sẽ đóng tab này và quay về $2", "description": "Return the user to the site that initiated onboarding" }, + "onboardingShowIncomingTransactionsDescription": { + "message": "Việc hiển thị các giao dịch đến trong ví của bạn tùy thuộc vào quá trình truyền tin với $1. Etherscan sẽ có quyền truy cập vào địa chỉ Ethereum và địa chỉ IP của bạn. Xem $2.", + "description": "$1 is a clickable link with text defined by the 'etherscan' key. $2 is a clickable link with text defined by the 'privacyMsg' key." + }, + "onboardingUsePhishingDetectionDescription": { + "message": "Thông báo phát hiện dấu hiệu lừa đảo tùy thuộc vào quá trình truyền tin với $1. jsDeliver sẽ có quyền truy cập vào địa chỉ IP của bạn. Xem $2.", + "description": "The $1 is the word 'jsDeliver', from key 'jsDeliver' and $2 is the words Privacy Policy from key 'privacyMsg', both separated here so that it can be wrapped as a link" + }, "onlyAddTrustedNetworks": { "message": "Một nhà cung cấp mạng độc hại có thể nói dối về trạng thái của chuỗi khối và ghi lại hoạt động của bạn trên mạng. Chỉ thêm các mạng tùy chỉnh mà bạn tin tưởng." }, "onlyConnectTrust": { "message": "Chỉ kết nối với các trang web mà bạn tin tưởng." }, + "openFullScreenForLedgerWebHid": { + "message": "Mở MetaMask ở chế độ toàn màn hình để kết nối thiết bị Ledger của bạn qua WebHID.", + "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." + }, + "optional": { + "message": "Tùy chọn" + }, + "optionalWithParanthesis": { + "message": "(Tùy chọn)" + }, + "or": { + "message": "hoặc" + }, "origin": { "message": "Nguồn gốc" }, @@ -1341,6 +2098,12 @@ "passwordNotLongEnough": { "message": "Mật khẩu không đủ dài" }, + "passwordSetupDetails": { + "message": "Mật khẩu này sẽ chỉ mở khóa ví MetaMask của bạn trên thiết bị này. MetaMask không thể khôi phục mật khẩu này." + }, + "passwordTermsWarning": { + "message": "Tôi hiểu rằng MetaMask không thể khôi phục mật khẩu này cho tôi. $1" + }, "passwordsDontMatch": { "message": "Mật khẩu không khớp" }, @@ -1351,6 +2114,19 @@ "pending": { "message": "Đang chờ xử lý" }, + "pendingTransactionInfo": { + "message": "Không thể xử lý giao dịch này cho đến khi hoàn tất." + }, + "pendingTransactionMultiple": { + "message": "Bạn có ($1) giao dịch đang chờ xử lý." + }, + "pendingTransactionSingle": { + "message": "Bạn có (1) giao dịch đang chờ xử lý.", + "description": "$1 is count of pending transactions" + }, + "permissionRequest": { + "message": "Yêu cầu quyền" + }, "permissions": { "message": "Quyền" }, @@ -1361,6 +2137,10 @@ "message": "+ $1 khác", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, + "preferredLedgerConnectionType": { + "message": "Dạng Kết Nối Ledger Ưu Tiên", + "description": "A header for a dropdown in the advanced section of settings. Appears above the ledgerConnectionPreferenceDescription message" + }, "prev": { "message": "Trước" }, @@ -1370,6 +2150,12 @@ "primaryCurrencySettingDescription": { "message": "Chọn Gốc để ưu tiên hiển thị giá trị bằng đơn vị tiền gốc của chuỗi (ví dụ: ETH). Chọn Pháp định để ưu tiên hiển thị giá trị bằng đơn vị tiền pháp định mà bạn chọn." }, + "priorityFee": { + "message": "Phí ưu tiên" + }, + "priorityFeeProperCase": { + "message": "Phí Ưu Tiên" + }, "privacyMsg": { "message": "Chính sách quyền riêng tư" }, @@ -1383,6 +2169,9 @@ "privateNetwork": { "message": "Mạng riêng" }, + "proceedWithTransaction": { + "message": "Tôi vẫn muốn xử lý" + }, "proposedApprovalLimit": { "message": "Giới hạn phê duyệt đề xuất" }, @@ -1410,6 +2199,9 @@ "recipientAddressPlaceholder": { "message": "Tìm kiếm, địa chỉ công khai (0x) hoặc ENS" }, + "recommendedGasLabel": { + "message": "Được đề xuất" + }, "recoveryPhraseReminderBackupStart": { "message": "Bắt đầu tại đây" }, @@ -1434,6 +2226,9 @@ "recoveryPhraseReminderTitle": { "message": "Bảo vệ tiền của bạn" }, + "refreshList": { + "message": "Làm mới danh sách" + }, "reject": { "message": "Từ chối" }, @@ -1449,6 +2244,9 @@ "rejected": { "message": "Đã từ chối" }, + "remember": { + "message": "Ghi nhớ:" + }, "remindMeLater": { "message": "Nhắc tôi sau" }, @@ -1461,6 +2259,9 @@ "removeAccountDescription": { "message": "Tài khoản này sẽ được xóa khỏi ví của bạn. Hãy đảm bảo rằng bạn có Cụm mật khẩu khôi phục bí mật ban đầu hoặc khóa riêng tư cho tài khoản được nhập trước khi tiếp tục. Bạn có thể nhập hoặc tạo lại tài khoản từ trình đơn tài khoản thả xuống. " }, + "removeNFT": { + "message": "Xóa NFT" + }, "requestsAwaitingAcknowledgement": { "message": "yêu cầu đang chờ xác nhận" }, @@ -1549,12 +2350,33 @@ "secretPhrase": { "message": "Nhập cụm mật khẩu bí mật của bạn vào đây để khôi phục két của bạn." }, + "secretPhraseWarning": { + "message": "Nếu bạn khôi phục bằng cách sử dụng một Cụm Mật Khẩu Khôi Phục Bí Mật khác, thì ví, tài khoản và tài sản hiện tại của bạn sẽ bị xóa khỏi ứng dụng này vĩnh viễn. Không thể hoàn tác hành động này." + }, + "secretRecoveryPhrase": { + "message": "Cụm Mật Khẩu Khôi Phục Bí Mật" + }, + "secureWallet": { + "message": "Ví An Toàn" + }, "securityAndPrivacy": { "message": "Bảo mật và quyền riêng tư" }, "securitySettingsDescription": { "message": "Các cài đặt quyền riêng tư và Cụm mật khẩu khôi phục bí mật của ví" }, + "seedPhraseConfirm": { + "message": "Xác nhận Cụm Mật Khẩu Khôi Phục Bí Mật" + }, + "seedPhraseEnterMissingWords": { + "message": "Xác nhận Cụm Mật Khẩu Khôi Phục Bí Mật" + }, + "seedPhraseIntroNotRecommendedButtonCopy": { + "message": "Nhắc tôi sau (không khuyến khích)" + }, + "seedPhraseIntroRecommendedButtonCopy": { + "message": "Bảo mật ví của tôi (khuyến khích)" + }, "seedPhraseIntroSidebarBulletFour": { "message": "Viết ra và cất ở nhiều nơi bí mật." }, @@ -1600,6 +2422,12 @@ "seedPhraseReq": { "message": "Cụm mật khẩu khôi phục bí mật gồm 12, 15, 18, 21 hoặc 24 từ" }, + "seedPhraseWriteDownDetails": { + "message": "Viết ra Cụm Mật Khẩu Khôi Phục Bí Mật gồm 12 từ này, sau đó lưu ở một nơi mà bạn tin tưởng và chỉ có bạn mới được phép truy cập." + }, + "seedPhraseWriteDownHeader": { + "message": "Viết ra Cụm Mật Khẩu Khôi Phục Bí Mật của bạn" + }, "selectAHigherGasFee": { "message": "Chọn phí gas cao hơn để tăng tốc quá trình xử lý giao dịch của bạn.*" }, @@ -1621,6 +2449,9 @@ "selectHdPath": { "message": "Chọn đường dẫn phân cấp xác định" }, + "selectNFTPrivacyPreference": { + "message": "Bật phát hiện NFT trong phần Cài Đặt" + }, "selectPathHelp": { "message": "Nếu bạn không thấy các tài khoản Ledger hiện có của bạn dưới đây, hãy thử chuyển đường dẫn thành \"Legacy (MEW / MyCrypto)\"" }, @@ -1640,15 +2471,31 @@ "message": "Gửi $1", "description": "Symbol of the specified token" }, + "sendTo": { + "message": "Gửi đến" + }, "sendTokens": { "message": "Gửi token" }, + "sendingNativeAsset": { + "message": "Gửi $1", + "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" + }, "separateEachWord": { "message": "Phân tách mỗi từ bằng một dấu cách" }, + "setAdvancedPrivacySettings": { + "message": "Thiết lập cài đặt quyền riêng tư nâng cao" + }, + "setAdvancedPrivacySettingsDetails": { + "message": "MetaMask sử dụng các dịch vụ của bên thứ ba đáng tin cậy này để nâng cao sự hữu ích và an toàn của sản phẩm." + }, "settings": { "message": "Cài đặt" }, + "show": { + "message": "Hiển thị" + }, "showAdvancedGasInline": { "message": "Quyền kiểm soát gas nâng cao" }, @@ -1667,6 +2514,9 @@ "showHexDataDescription": { "message": "Chọn tùy chọn này để hiển thị trường dữ liệu thập lục phân trên màn hình gửi" }, + "showHide": { + "message": "Hiển thị/ẩn" + }, "showIncomingTransactions": { "message": "Hiển thị các giao dịch đến" }, @@ -1679,9 +2529,18 @@ "showPrivateKeys": { "message": "Hiện khóa riêng tư" }, + "showRecommendations": { + "message": "Hiển Thị Đề Xuất" + }, "showSeedPhrase": { "message": "Hiển thị Cụm mật khẩu khôi phục bí mật" }, + "showTestnetNetworks": { + "message": "Hiển thị các mạng thử nghiệm" + }, + "showTestnetNetworksDescription": { + "message": "Chọn cái này để hiển thị các mạng thử nghiệm trong danh sách mạng" + }, "sigRequest": { "message": "Yêu cầu chữ ký" }, @@ -1700,18 +2559,45 @@ "signed": { "message": "Đã ký" }, + "simulationErrorMessage": { + "message": "Giao dịch này có khả năng thất bại. Việc cố gắng thực hiện sẽ được cho là gây tốn kém nhưng lại không thành công và không được khuyến khích." + }, + "simulationErrorMessageV2": { + "message": "Chúng tôi không thể ước tính gas. Có thể đã xảy ra lỗi trong hợp đồng và giao dịch này có thể thất bại." + }, + "skip": { + "message": "Bỏ qua" + }, + "skipAccountSecurity": { + "message": "Bỏ qua Bảo Mật Tài Khoản?" + }, + "skipAccountSecurityDetails": { + "message": "Tôi hiểu rằng nếu chưa sao lưu Cụm Mật Khẩu Khôi Phục Bí Mật của mình, tôi có thể bị mất tài khoản và toàn bộ tài sản bên trong." + }, "slow": { "message": "Chậm" }, "somethingWentWrong": { "message": "Rất tiếc! Đã xảy ra sự cố." }, + "source": { + "message": "Nguồn" + }, "speedUp": { "message": "Tăng tốc" }, "speedUpCancellation": { "message": "Tăng tốc lệnh hủy này" }, + "speedUpExplanation": { + "message": "Chúng tôi đã cập nhật phí gas dựa trên tình trạng mạng hiện tại và đã tăng ít nhất 10% (theo yêu cầu của mạng)." + }, + "speedUpPopoverTitle": { + "message": "Tăng tốc giao dịch" + }, + "speedUpTooltipText": { + "message": "Phí gas mới" + }, "speedUpTransaction": { "message": "Tăng tốc giao dịch này" }, @@ -1734,6 +2620,12 @@ "spendLimitTooLarge": { "message": "Giới hạn chi tiêu quá lớn" }, + "stable": { + "message": "Ổn định" + }, + "stableLowercase": { + "message": "ổn định" + }, "stateLogError": { "message": "Lỗi khi truy xuất nhật ký trạng thái." }, @@ -1752,6 +2644,13 @@ "statusNotConnected": { "message": "Chưa kết nối" }, + "step1LatticeWallet": { + "message": "Đảm bảo Lattice1 của bạn đã sẵn sàng để kết nối" + }, + "step1LatticeWalletMsg": { + "message": "Bạn có thể kết nối MetaMask với Lattice1 sau khi thiết bị đã được thiết lập và trực tuyến. Mở khóa thiết bị và chuẩn bị sẵn ID Thiết Bị. Để biết thêm về cách sử dụng ví lạnh, $1", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, "step1LedgerWallet": { "message": "Tải ứng dụng Ledger xuống" }, @@ -1815,6 +2714,10 @@ "message": "Bạn cần $1 $2 nữa để hoàn tất giao dịch hoán đổi này", "description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol." }, + "swapBestOfNQuotes": { + "message": "Tốt nhất trong $1 báo giá.", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, "swapBuildQuotePlaceHolderText": { "message": "Không có token nào khớp với $1", "description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text" @@ -1834,6 +2737,9 @@ "swapDecentralizedExchange": { "message": "Sàn giao dịch phi tập trung" }, + "swapDirectContract": { + "message": "Hợp đồng trực tiếp" + }, "swapEditLimit": { "message": "Chỉnh sửa giới hạn" }, @@ -1841,6 +2747,10 @@ "message": "Thao tác này là bắt buộc và cấp cho MetaMask quyền hoán đổi $1 của bạn.", "description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps." }, + "swapEnableTokenForSwapping": { + "message": "Điều này sẽ $1 để hoán đổi", + "description": "$1 is for the 'enableToken' key, e.g. 'enable ETH'" + }, "swapEstimatedNetworkFees": { "message": "Phí mạng ước tính" }, @@ -1854,6 +2764,9 @@ "swapFailedErrorTitle": { "message": "Hoán đổi không thành công" }, + "swapFetchingQuotes": { + "message": "Tìm nạp báo giá" + }, "swapFetchingQuotesErrorDescription": { "message": "Rất tiếc... đã xảy ra sự cố. Hãy thử lại. Nếu lỗi vẫn tiếp diễn, hãy liên hệ với bộ phận hỗ trợ khách hàng." }, @@ -1867,12 +2780,26 @@ "message": "Giao dịch hoán đổi $1 sang $2", "description": "Tells a user that they need to confirm on their hardware wallet a swap of 2 tokens. $1 is a source token and $2 is a destination token" }, + "swapGasFeesDetails": { + "message": "Phí gas được ước tính và sẽ dao động dựa trên lưu lượng mạng và độ phức tạp của giao dịch." + }, + "swapGasFeesLearnMore": { + "message": "Tìm hiểu thêm về phí gas" + }, "swapGasFeesSplit": { "message": "Phí gas trên màn hình trước được chia đôi giữa hai giao dịch này." }, + "swapGasFeesSummary": { + "message": "Phí gas được trả cho thợ đào tiền điện tử, họ là những người xử lý các giao dịch trên mạng $1. MetaMask không thu lợi nhuận từ phí gas.", + "description": "$1 is the selected network, e.g. Ethereum or BSC" + }, "swapHighSlippageWarning": { "message": "Số tiền trượt giá rất cao." }, + "swapIncludesMMFee": { + "message": "Bao gồm $1% phí của MetaMask.", + "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." + }, "swapLowSlippageError": { "message": "Giao dịch có thể không thành công, mức trượt giá tối đa quá thấp." }, @@ -1886,6 +2813,10 @@ "message": "Chúng tôi luôn tìm giá tốt nhất từ các nguồn thanh khoản hàng đầu. Phí $1% được tự động tính vào báo giá này.", "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." }, + "swapNQuotesWithDot": { + "message": "$1 báo giá.", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, "swapNewQuoteIn": { "message": "Báo giá mới sẽ có sau $1", "description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00" @@ -1978,6 +2909,12 @@ "swapSourceInfo": { "message": "Chúng tôi tìm kiếm nhiều nguồn thanh khoản (các sàn giao dịch, trình tổng hợp và nhà tạo lập thị trường) để tìm được mức tỷ lệ tốt nhất và phí mạng thấp nhất." }, + "swapSuggested": { + "message": "Hoán đổi gợi ý" + }, + "swapSuggestedGasSettingToolTipMessage": { + "message": "Hoán đổi là các giao dịch phức tạp và nhạy cảm với thời gian. Chúng tôi đề xuất mức phí gas này để có sự cân bằng tốt giữa chi phí và tỉ lệ Hoán đổi thành công." + }, "swapSwapFrom": { "message": "Hoán đổi từ" }, @@ -2016,6 +2953,10 @@ "message": "Đã xác minh trên $1 nguồn.", "description": "Indicates the number of token information sources that recognize the symbol + address. $1 is a decimal number." }, + "swapTooManyDecimalsError": { + "message": "$1 cho phép tối đa $2 số thập phân", + "description": "$1 is a token symbol and $2 is the max. number of decimals allowed for the token" + }, "swapTransactionComplete": { "message": "Đã hoàn tất giao dịch" }, @@ -2076,6 +3017,12 @@ "symbolBetweenZeroTwelve": { "message": "Ký hiệu không được dài quá 11 ký tự." }, + "syncFailed": { + "message": "Đồng bộ thất bại" + }, + "syncInProgress": { + "message": "Đang đồng bộ" + }, "syncWithMobile": { "message": "Đồng bộ hóa với thiết bị di động" }, @@ -2118,6 +3065,9 @@ "thisWillCreate": { "message": "Thao tác này sẽ tạo một ví mới và Cụm mật khẩu khôi phục bí mật" }, + "time": { + "message": "Thời gian" + }, "tips": { "message": "Mẹo" }, @@ -2128,6 +3078,10 @@ "message": "Đến: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, + "toggleTestNetworks": { + "message": "$1 mạng thử nghiệm", + "description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open to the advanced settings where users can enable the display of test networks in the network dropdown." + }, "token": { "message": "Token" }, @@ -2140,6 +3094,9 @@ "tokenDecimalFetchFailed": { "message": "Cần có vị trí thập phân của token." }, + "tokenDetectionAnnouncement": { + "message": "Mới! Tính năng phát hiện token được cải tiến hiện đã có sẵn trên Mạng chính thức của Ethereum dưới dạng một tính năng thử nghiệm. $1" + }, "tokenSymbol": { "message": "Ký hiệu token" }, @@ -2164,6 +3121,48 @@ "transactionCreated": { "message": "Đã tạo giao dịch với giá trị $1 lúc $2." }, + "transactionData": { + "message": "Dữ liệu giao dịch" + }, + "transactionDecodingAccreditationDecoded": { + "message": "Được giải mã bởi Truffle" + }, + "transactionDecodingAccreditationVerified": { + "message": "Đã xác minh hợp đồng trên $1" + }, + "transactionDecodingUnsupportedNetworkError": { + "message": "Giải mã giao dịch hiện không khả dụng cho chainId $1" + }, + "transactionDetailDappGasMoreInfo": { + "message": "Trang web gợi ý" + }, + "transactionDetailDappGasTooltip": { + "message": "Chỉnh sửa để sử dụng mức phí gas được đề xuất của MetaMask dựa trên khối mới nhất." + }, + "transactionDetailGasHeading": { + "message": "Phí gas ước tính" + }, + "transactionDetailGasInfoV2": { + "message": "ước tính" + }, + "transactionDetailGasTooltipConversion": { + "message": "Tìm hiểu thêm về phí gas" + }, + "transactionDetailGasTooltipExplanation": { + "message": "Phí gas do mạng thiết lập và sẽ dao động dựa trên lưu lượng mạng và độ phức tạp của giao dịch." + }, + "transactionDetailGasTooltipIntro": { + "message": "Phí gas được trả cho thợ đào tiền điện tử, họ là những người xử lý các giao dịch trên mạng $1. MetaMask không thu lợi nhuận từ phí gas." + }, + "transactionDetailGasTotalSubtitle": { + "message": "Số lượng + phí gas" + }, + "transactionDetailLayer2GasHeading": { + "message": "Phí gas Lớp 2" + }, + "transactionDetailMultiLayerTotalSubtitle": { + "message": "Số lượng + phí" + }, "transactionDropped": { "message": "Đã ngừng giao dịch lúc $2." }, @@ -2179,6 +3178,27 @@ "transactionFee": { "message": "Phí giao dịch" }, + "transactionHistoryBaseFee": { + "message": "Phí Cơ Bản (GWEI)" + }, + "transactionHistoryL1GasLabel": { + "message": "Tổng Phí Gas L1" + }, + "transactionHistoryL2GasLimitLabel": { + "message": "Giới Hạn Gas L2" + }, + "transactionHistoryL2GasPriceLabel": { + "message": "Giá Gas L2" + }, + "transactionHistoryMaxFeePerGas": { + "message": "Phí Tối Đa Mỗi Gas" + }, + "transactionHistoryPriorityFee": { + "message": "Phí Ưu Tiên (GWEI)" + }, + "transactionHistoryTotalGasFee": { + "message": "Tổng Phí Gas" + }, "transactionResubmitted": { "message": "Đã gửi lại giao dịch với mức phí gas tăng lên $1 lúc $2" }, @@ -2205,12 +3225,31 @@ "message": "Chúng tôi đã gặp phải vấn đề khi tải số dư token của bạn. Bạn có thể xem số dư ", "description": "Followed by a link (here) to view token balances" }, + "trustSiteApprovePermission": { + "message": "Bằng cách cấp quyền, bạn cho phép $1 sau đây truy cập vào các khoản tiền của mình" + }, "tryAgain": { "message": "Thử lại" }, + "tryAnywayOption": { + "message": "Tôi vẫn sẽ thử" + }, + "turnOnTokenDetection": { + "message": "Bật phát hiện token nâng cao" + }, + "twelveHrTitle": { + "message": "12 giờ:" + }, + "txInsightsNotSupported": { + "message": "Thông tin chi tiết về giao dịch không được hỗ trợ cho hợp đồng này tại thời điểm này." + }, "typePassword": { "message": "Nhập mật khẩu MetaMask của bạn" }, + "u2f": { + "message": "U2F", + "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." + }, "unapproved": { "message": "Chưa phê duyệt" }, @@ -2249,6 +3288,10 @@ "message": "xác minh thông tin về mạng", "description": "Serves as link text for the 'unrecognizedChain' key. This text will be embedded inside the translation for that key." }, + "unsendableAsset": { + "message": "Hiện không hỗ trợ gửi token sưu tập (ERC-721)", + "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" + }, "updatedWithDate": { "message": "Đã cập nhật vào $1" }, @@ -2258,12 +3301,24 @@ "urlExistsErrorMsg": { "message": "Mạng $1 hiện đang sử dụng URL này." }, + "useCollectibleDetection": { + "message": "Tự động phát hiện NFT" + }, + "useCollectibleDetectionDescription": { + "message": "Việc hiển thị nội dung đa phương tiện và dữ liệu NFT có thể làm lộ địa chỉ IP của bạn cho các máy chủ tập trung. API của bên thứ ba (như OpenSea) được dùng để phát hiện NFT trong ví của bạn. Điều này sẽ làm lộ địa chỉ tài khoản của bạn với các dịch vụ đó. Hãy tắt tính năng này nếu bạn không muốn ứng dụng lấy dữ liệu từ các dịch vụ đó." + }, "usePhishingDetection": { "message": "Sử dụng tính năng Phát hiện lừa đảo" }, "usePhishingDetectionDescription": { "message": "Hiển thị cảnh báo đối với các miền lừa đảo nhắm đến người dùng Ethereum" }, + "useTokenDetection": { + "message": "Sử Dụng Phát Hiện Token" + }, + "useTokenDetectionDescription": { + "message": "Chúng tôi sử dụng API của bên thứ ba để phát hiện và hiển thị các token mới được gửi vào ví của bạn. Hãy tắt tính năng này nếu bạn không muốn MetaMask lấy dữ liệu từ các dịch vụ đó." + }, "usedByClients": { "message": "Được nhiều ví khác nhau sử dụng" }, @@ -2291,15 +3346,56 @@ "viewContact": { "message": "Xem người liên hệ" }, + "viewFullTransactionDetails": { + "message": "Xem chi tiết giao dịch đầy đủ" + }, "viewMore": { "message": "Xem thêm" }, + "viewOnBlockExplorer": { + "message": "Xem trên trình khám phá khối" + }, + "viewOnCustomBlockExplorer": { + "message": "Xem $1 tại $2", + "description": "$1 is the action type. e.g (Account, Transaction, Swap) and $2 is the Custom Block Exporer URL" + }, + "viewOnEtherscan": { + "message": "Xem $1 trên Etherscan", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, + "viewOnOpensea": { + "message": "Xem trên Opensea" + }, + "viewinExplorer": { + "message": "Xem $1 trong Trình khám phá", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, "visitWebSite": { "message": "Truy cập trang web của chúng tôi" }, "walletConnectionGuide": { "message": "hướng dẫn của chúng tôi về cách kết nối ví cứng" }, + "walletCreationSuccessDetail": { + "message": "Bạn đã bảo vệ thành công ví của mình. Hãy đảm bảo an toàn và bí mật cho Cụm Mật Khẩu Khôi Phục Bí Mật của bạn -- đây là trách nhiệm của bạn!" + }, + "walletCreationSuccessReminder1": { + "message": "MetaMask không thể khôi phục Cụm Mật Khẩu Khôi Phục Bí Mật của bạn." + }, + "walletCreationSuccessReminder2": { + "message": "MetaMask sẽ không bao giờ hỏi về Cụm Mật Khẩu Khôi Phục Bí Mật của bạn." + }, + "walletCreationSuccessReminder3": { + "message": "$1 với bất kỳ ai, nếu không bạn sẽ có nguy cơ bị mất tiền", + "description": "$1 is separated as walletCreationSuccessReminder3BoldSection so that we can bold it" + }, + "walletCreationSuccessReminder3BoldSection": { + "message": "Không bao giờ chia sẻ Cụm Mật Khẩu Khôi Phục Bí Mật của bạn", + "description": "This string is localized separately from walletCreationSuccessReminder3 so that we can bold it" + }, + "walletCreationSuccessTitle": { + "message": "Tạo ví thành công" + }, "walletSeedRestore": { "message": "Cụm mật khẩu khôi phục bí mật của ví" }, @@ -2307,12 +3403,34 @@ "message": "Chúng tôi nhận thấy rằng trang web hiện tại đã cố dùng API window.web3 đã bị xóa. Nếu trang web có vẻ như đã bị lỗi, vui lòng nhấp vào $1 để biết thêm thông tin.", "description": "$1 is a clickable link." }, + "webhid": { + "message": "WebHID", + "description": "Refers to a interface for connecting external devices to the browser. Used for connecting ledger to the browser. Read more here https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API" + }, "welcome": { "message": "Chào mừng bạn đến với MetaMask" }, "welcomeBack": { "message": "Chào mừng bạn trở lại!" }, + "welcomeExploreDescription": { + "message": "Lưu trữ, gửi và chi tiêu các loại tiền và tài sản tiền điện tử." + }, + "welcomeExploreTitle": { + "message": "Khám phá các ứng dụng phi tập trung" + }, + "welcomeLoginDescription": { + "message": "Sử dụng MetaMask của bạn để đăng nhập vào các ứng dụng phi tập trung - không cần đăng ký." + }, + "welcomeLoginTitle": { + "message": "Gửi lời chào đến ví của bạn" + }, + "welcomeToMetaMask": { + "message": "Bắt đầu nào" + }, + "welcomeToMetaMaskIntro": { + "message": "Được hàng triệu người tin dùng, MetaMask là một ví an toàn cho phép mọi người có thể truy cập vào thế giới web3." + }, "whatsNew": { "message": "Xem tính năng mới", "description": "This is the title of a popup that gives users notifications about new features and updates to MetaMask." diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index 3f8ad2e39..d1fb4e637 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -38,6 +38,9 @@ "QRHardwareWalletSteps1Description": { "message": "该类硬件钱包通过二维码实现通讯交互,做到完全脱网。官方支持的钱包有:" }, + "QRHardwareWalletSteps1Title": { + "message": "基于 QR 的硬件钱包" + }, "QRHardwareWalletSteps2Description": { "message": "AirGap Vault & Ngrave (即将上线)" }, @@ -70,6 +73,10 @@ "accountName": { "message": "账户名称" }, + "accountNameDuplicate": { + "message": "此帐户名称已存在", + "description": "This is an error message shown when the user enters a new account name that matches an existing account name" + }, "accountOptions": { "message": "账户选项" }, @@ -85,12 +92,57 @@ "activityLog": { "message": "活动日志" }, + "add": { + "message": "添加" + }, + "addANetwork": { + "message": "添加网络" + }, + "addANickname": { + "message": "添加昵称" + }, "addAcquiredTokens": { "message": "在 MetaMask 上添加获得的代币" }, "addAlias": { "message": "添加别名" }, + "addContact": { + "message": "添加联系人" + }, + "addCustomToken": { + "message": "添加自定义代币" + }, + "addCustomTokenByContractAddress": { + "message": "找不到代币?您可以通过粘贴地址手动添加任何代币。代币合同地址可以在$1上找到。", + "description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum" + }, + "addEthereumChainConfirmationDescription": { + "message": "这将允许在MetaMask中使用此网络。" + }, + "addEthereumChainConfirmationRisks": { + "message": "MetaMask不验证自定义网络。" + }, + "addEthereumChainConfirmationRisksLearnMore": { + "message": "了解$1。", + "description": "$1 is a link with text that is provided by the 'addEthereumChainConfirmationRisksLearnMoreLink' key" + }, + "addEthereumChainConfirmationRisksLearnMoreLink": { + "message": "欺诈和网络安全风险", + "description": "Link text for the 'addEthereumChainConfirmationRisksLearnMore' translation key" + }, + "addEthereumChainConfirmationTitle": { + "message": "允许此站点添加一个网络?" + }, + "addFriendsAndAddresses": { + "message": "添加您信任的朋友和地址" + }, + "addMemo": { + "message": "添加备忘录" + }, + "addNFT": { + "message": "添加NFT" + }, "addNetwork": { "message": "添加网络" }, @@ -106,12 +158,36 @@ "addToken": { "message": "添加代币" }, + "address": { + "message": "地址" + }, + "addressBookIcon": { + "message": "地址簿图标" + }, "advanced": { "message": "高级" }, + "advancedBaseGasFeeToolTip": { + "message": "当您的交易被包含在区块中,您的最大基础费用与实际基本费用之间的任何差额将被退还。 总金额按最大基费计算(GWEI) *燃料限额。" + }, + "advancedGasFeeDefaultOptIn": { + "message": "保存$1为“高级”默认值" + }, + "advancedGasFeeDefaultOptOut": { + "message": "总是使用这些值和高级设置为默认值。" + }, + "advancedGasFeeModalTitle": { + "message": "高级燃料费" + }, + "advancedGasPriceTitle": { + "message": "燃料价格" + }, "advancedOptions": { "message": "高级选项" }, + "advancedPriorityFeeToolTip": { + "message": "优先收费(又称“矿工费”)直接向矿工支付,并鼓励他们确定您的交易的优先次序。" + }, "advancedSettingsDescription": { "message": "访问开发者功能,下载状态日志,重置账户,设置测试网和自定义 RPC。" }, @@ -145,6 +221,10 @@ "allowExternalExtensionTo": { "message": "允许这个外部扩展到:" }, + "allowSpendToken": { + "message": "授予访问您的$1的权限?", + "description": "$1 is the symbol of the token that are requesting to spend" + }, "allowThisSiteTo": { "message": "允许本网站:" }, @@ -180,6 +260,9 @@ "approve": { "message": "批准消费限额" }, + "approveButtonText": { + "message": "批准" + }, "approveSpendLimit": { "message": "批准 $1 消费限额", "description": "The token symbol that is being approved" @@ -187,9 +270,15 @@ "approved": { "message": "已批准" }, + "approvedAmountWithColon": { + "message": "已批准金额:" + }, "asset": { "message": "资产" }, + "assetOptions": { + "message": "资源选项" + }, "assets": { "message": "资产" }, @@ -238,12 +327,49 @@ "balanceOutdated": { "message": "余额可能已过期" }, + "baseFee": { + "message": "基础费用" + }, "basic": { "message": "基本" }, + "betaMetamaskDescription": { + "message": "MetaMask受数百万人信任,是一个安全的钱包,使所有人都能访问网络3。" + }, + "betaMetamaskDescriptionExplanation": { + "message": "使用此版本来测试即将发布的功能。您的使用和反馈有助于我们构建最好可能版本MetaMask。 您对MetaMaskBeta的使用须遵守我们$1以及我们$2的标准。作为一种测试,出现错误的风险可能会增加。通过继续,您接受并承认这些风险,以及我们条款和测试版条款 (Terms and Beta Terms) 中发现的风险。", + "description": "$1 represents localization item betaMetamaskDescriptionExplanationTermsLinkText. $2 represents localization item betaMetamaskDescriptionExplanationBetaTermsLinkText" + }, + "betaMetamaskDescriptionExplanationBetaTermsLinkText": { + "message": "补充测试条款 (Supplemental Beta Terms)" + }, + "betaMetamaskDescriptionExplanationTermsLinkText": { + "message": "条款" + }, + "betaMetamaskVersion": { + "message": "MetaMask测试版本" + }, + "betaWelcome": { + "message": "欢迎使用 MetaMask测试版" + }, + "blockExplorerAccountAction": { + "message": "账户", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Account in Explorer" + }, + "blockExplorerAssetAction": { + "message": "资产", + "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Asset in Explorer" + }, + "blockExplorerSwapAction": { + "message": "兑换 Swap", + "description": "This is used with viewOnEtherscan e.g View Swap on Etherscan" + }, "blockExplorerUrl": { "message": "区块浏览器" }, + "blockExplorerUrlDefinition": { + "message": "此网络使用区块浏览器的 URL。" + }, "blockExplorerView": { "message": "通过 $1 查看账户", "description": "$1 replaced by URL for custom block explorer" @@ -254,9 +380,24 @@ "browserNotSupported": { "message": "您的浏览器不支持该功能……" }, + "buildContactList": { + "message": "建立您的联系人列表" + }, + "builtAroundTheWorld": { + "message": "MetaMask是在世界各地设计和建造的。" + }, + "busy": { + "message": "忙碌中" + }, "buy": { "message": "购买" }, + "buyWithTransak": { + "message": "使用Transak购买ETH" + }, + "buyWithTransakDescription": { + "message": "Transak 支持在59多个国家/地区的借记卡和银行转账(取决于地点)。ETH可存款到您的MetaMask账户。" + }, "buyWithWyre": { "message": "使用 Wyre 购买 ETH" }, @@ -272,6 +413,15 @@ "cancel": { "message": "取消" }, + "cancelEdit": { + "message": "取消编辑" + }, + "cancelPopoverTitle": { + "message": "取消交易" + }, + "cancelSpeedUp": { + "message": "取消或加快交易。" + }, "cancellationGasFee": { "message": "取消交易燃料费用" }, @@ -281,9 +431,19 @@ "chainId": { "message": "链 ID" }, + "chainIdDefinition": { + "message": "用于签署此网络交易的链路ID。" + }, + "chainIdExistsErrorMsg": { + "message": "链路ID已经存在于现有的网络列表中。" + }, "chromeRequiredForHardwareWallets": { "message": "您需要在谷歌浏览器(Google Chrome)上使用 MetaMask 才能连接到您的硬件钱包。" }, + "clickToConnectLedgerViaWebHID": { + "message": "点击这里通过WebHID连接到您的Ledger", + "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" + }, "clickToRevealSeed": { "message": "点击此处显示密语" }, @@ -296,12 +456,24 @@ "confirmPassword": { "message": "确认密码" }, + "confirmRecoveryPhrase": { + "message": "请确认账户助记词" + }, "confirmSecretBackupPhrase": { "message": "请确认您的账户助记词" }, "confirmed": { "message": "确认" }, + "confusableUnicode": { + "message": "'$1' 与 '$2' 相似。" + }, + "confusableZeroWidthUnicode": { + "message": "找到零宽字符。" + }, + "confusingEnsDomain": { + "message": "我们在ENS名称中检测到一个令人混淆的字符。请检查ENS名称以避免潜在骗案的可能。" + }, "congratulations": { "message": "恭喜" }, @@ -391,9 +563,24 @@ "contactsSettingsDescription": { "message": "添加、编辑、删除和管理您的联系人。" }, + "continue": { + "message": "继续" + }, + "continueToTransak": { + "message": "继续到Transak" + }, "continueToWyre": { "message": "继续前往 Wyre" }, + "contract": { + "message": "合同" + }, + "contractAddress": { + "message": "合同地址" + }, + "contractAddressError": { + "message": "您正在向代币合同地址发送代币。这可能导致丢失这些代币。" + }, "contractDeployment": { "message": "合约部署" }, @@ -409,6 +596,9 @@ "copyPrivateKey": { "message": "这是您的私钥(点击复制)" }, + "copyRawTransactionData": { + "message": "复制原始交易数据" + }, "copyToClipboard": { "message": "复制到剪贴板" }, @@ -424,12 +614,21 @@ "createAccount": { "message": "创建账户" }, + "createNewWallet": { + "message": "创建新的钱包" + }, "createPassword": { "message": "创建密码" }, "currencyConversion": { "message": "货币转换" }, + "currencySymbol": { + "message": "货币符号" + }, + "currencySymbolDefinition": { + "message": "此网络货币显示的牌照符号。" + }, "currentAccountNotConnected": { "message": "您的当前账户没有连接" }, @@ -439,9 +638,22 @@ "currentLanguage": { "message": "当前语言" }, + "currentTitle": { + "message": "当前:" + }, + "currentlyUnavailable": { + "message": "在此网络上不可用" + }, + "custom": { + "message": "高级" + }, "customGas": { "message": "自定义燃料" }, + "customGasSettingToolTipMessage": { + "message": "使用$1来定制燃料价格。如果您不熟悉这可能会引起混淆。操作风险自付。", + "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold fontweight" + }, "customGasSubTitle": { "message": "提升费用可能会缩短处理时间,但不保证绝对有效。" }, @@ -451,9 +663,29 @@ "customToken": { "message": "自定义代币" }, + "dappSuggested": { + "message": "推荐站点" + }, + "dappSuggestedGasSettingToolTipMessage": { + "message": "$1建议了这个价格。", + "description": "$1 is url for the dapp that has suggested gas settings" + }, + "dappSuggestedShortLabel": { + "message": "站点" + }, + "dappSuggestedTooltip": { + "message": "$1推荐了这个价格。", + "description": "$1 represents the Dapp's origin" + }, + "data": { + "message": "数据" + }, "dataBackupFoundInfo": { "message": "您的部分账户数据已在之前安装的 MetaMask 时备份。其中可能包括您的设置、联系人和代币。您现在想恢复这些数据吗?" }, + "dataHex": { + "message": "十六进制文件" + }, "decimal": { "message": "小数精度" }, @@ -495,6 +727,9 @@ "depositEther": { "message": "存入 Ether" }, + "description": { + "message": "描述" + }, "details": { "message": "详情" }, @@ -522,6 +757,15 @@ "dismiss": { "message": "关闭" }, + "dismissReminderDescriptionField": { + "message": "开启此选项以关闭账户助记词备份提醒消息。 我们强烈建议您备份您的账户助记词,以避免资金损失" + }, + "dismissReminderField": { + "message": "消除账户助记词备份提醒" + }, + "domain": { + "message": "网域" + }, "done": { "message": "完成" }, @@ -543,12 +787,147 @@ "edit": { "message": "编辑" }, + "editANickname": { + "message": "编辑昵称" + }, + "editAddressNickname": { + "message": "编辑地址昵称" + }, "editContact": { "message": "编辑联系人" }, + "editGasEducationButtonText": { + "message": "我应该如何选择?" + }, + "editGasEducationHighExplanation": { + "message": "这对时间敏感的交易(例如兑换 Swap)最好,因为它增加了交易成功的可能性。 如果兑换处理时间过长,它可能会失败并导致丢失您的一些燃料费用。" + }, + "editGasEducationLowExplanation": { + "message": "只有在加工时间不太重要时才能使用较低的燃料费用。 较低的费用使我们难以预测您的交易何时(或会否)成功。" + }, + "editGasEducationMediumExplanation": { + "message": "中型燃料费用费用对于发送、取出或其他非时间敏感交易很好。此设置通常会导致交易成功。" + }, + "editGasEducationModalIntro": { + "message": "取决于交易类型和它对您的重要性,选择正确的燃料费用。" + }, + "editGasEducationModalTitle": { + "message": "如何选择?" + }, + "editGasFeeModalTitle": { + "message": "编辑燃料费用" + }, + "editGasHigh": { + "message": "高" + }, + "editGasLimitOutOfBounds": { + "message": "燃料限制至少要 $1" + }, + "editGasLimitOutOfBoundsV2": { + "message": "燃料限制必须大于$1且小于 $2", + "description": "$1 is the minimum limit for gas and $2 is the maximum limit" + }, + "editGasLimitTooltip": { + "message": "燃料限制是您愿意使用的最大燃料单位。 燃料单位是达到“最高优先收费”和“最高收费”的乘数。" + }, + "editGasLow": { + "message": "低" + }, + "editGasMaxBaseFeeGWEIImbalance": { + "message": "最大基本费用不能低于优先费用" + }, + "editGasMaxBaseFeeHigh": { + "message": "最大基本费用高于必须" + }, + "editGasMaxBaseFeeLow": { + "message": "当前网络条件的最高基本费用很低" + }, + "editGasMaxFeeHigh": { + "message": "最大费用高于必须" + }, + "editGasMaxFeeLow": { + "message": "对于网络条件来说,最高费用太低" + }, + "editGasMaxFeePriorityImbalance": { + "message": "最大费用不能低于最大优先费用" + }, + "editGasMaxFeeTooltip": { + "message": "最大费用是您将支付的最多(基本费用+优先费用)。" + }, + "editGasMaxPriorityFeeBelowMinimum": { + "message": "最大优先费用必须大于0 GWEI。" + }, + "editGasMaxPriorityFeeBelowMinimumV2": { + "message": "优先费用必须大于0。" + }, + "editGasMaxPriorityFeeHigh": { + "message": "最高优先收费高于必要的。您可以支付超过需要的费用。" + }, + "editGasMaxPriorityFeeHighV2": { + "message": "优先收费高于必要的。您可以支付超过需要的费用" + }, + "editGasMaxPriorityFeeLow": { + "message": "当前网络条件的最高优先费用很低" + }, + "editGasMaxPriorityFeeLowV2": { + "message": "当前网络条件的优先收费很低" + }, + "editGasMaxPriorityFeeTooltip": { + "message": "最高优先收费(又称“矿工费”)直接向矿工支付,并鼓励他们确定您的交易的优先次序。您最常支付的是您的最大设置" + }, + "editGasMedium": { + "message": "中度" + }, + "editGasPriceTooLow": { + "message": "燃料价格必须大于 0" + }, + "editGasPriceTooltip": { + "message": "此网络在提交交易时需要一个“燃料价格”栏。燃料价格是您将按单位支付的金额。" + }, + "editGasSubTextAmountLabel": { + "message": "最大金额:", + "description": "This is meant to be used as the $1 substitution editGasSubTextAmount" + }, + "editGasSubTextFeeLabel": { + "message": "最高收费:" + }, + "editGasTitle": { + "message": "编辑优先级" + }, + "editGasTooLow": { + "message": "未知处理时间" + }, + "editGasTooLowTooltip": { + "message": "在当前市场条件下,您的最大费用或最大优先费用可能很低。我们不知道您的交易将在何时(或会否)处理。" + }, + "editGasTooLowWarningTooltip": { + "message": "这会降低您的最大费用,但如果网络流量增加,您的交易可能会被延迟或失败。" + }, + "editNonceField": { + "message": "编辑空格" + }, + "editNonceMessage": { + "message": "这是一个高级功能,请谨慎使用。" + }, "editPermission": { "message": "编辑权限" }, + "enableAutoDetect": { + "message": " 启用自动检测" + }, + "enableFromSettings": { + "message": " 从设置中启用它。" + }, + "enableOpenSeaAPI": { + "message": "启用 OpenSea API" + }, + "enableOpenSeaAPIDescription": { + "message": "使用 OpenSea's API 获取NFT 数据。NFT 自动检测依赖于 OpenSea 的 API,在此关闭时将不可用。" + }, + "enableToken": { + "message": "启用 $1", + "description": "$1 is a token symbol, e.g. ETH" + }, "encryptionPublicKeyNotice": { "message": "$1 希望得到您的加密公钥。同意后该网站将可以向您发送加密信息。", "description": "$1 is the web3 site name" @@ -577,6 +956,10 @@ "endOfFlowMessage6": { "message": "如果您需要再次备份账户助记词,请通过设置 -> 安全选项完成该操作。" }, + "endOfFlowMessage7": { + "message": "如果您有问题或看到一些可疑情況,请联系我们的$1支持。", + "description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." + }, "endOfFlowMessage8": { "message": "MetaMask 无法恢复您的账户助记词。" }, @@ -587,12 +970,21 @@ "message": "RPC 端点使用链不同的链 ID: $1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "ensIllegalCharacter": { + "message": "ENS的非法字符。" + }, "ensNotFoundOnCurrentNetwork": { "message": "未在当前网络找到 ENS 名称。请尝试切换至主以太坊网络。" }, + "ensNotSupportedOnNetwork": { + "message": "网络不支持 ENS" + }, "ensRegistrationError": { "message": "ENS 名称登记错误" }, + "ensUnknownError": { + "message": "ENS 查找失败。" + }, "enterAnAlias": { "message": "输入别名" }, @@ -621,6 +1013,14 @@ "message": "代码:$1", "description": "Displayed error name for debugging purposes. $1 is the error name" }, + "errorPageMessage": { + "message": "重新加载页面或联系$1支持。", + "description": "Message displayed on generic error page in the fullscreen or notification UI, $1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." + }, + "errorPagePopupMessage": { + "message": "关闭并重新打开弹出窗口,或联系$1支持。", + "description": "Message displayed on generic error page in the popup UI, $1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." + }, "errorPageTitle": { "message": "MetaMask 遇到了一个错误", "description": "Title of generic error page" @@ -632,6 +1032,9 @@ "estimatedProcessingTimes": { "message": "预计处理时间" }, + "ethGasPriceFetchWarning": { + "message": "由于目前主要的燃料估算服务不可用,因此提供了备用燃料价格。" + }, "eth_accounts": { "message": "查看您允许的账户的地址(必填)", "description": "The description for the `eth_accounts` permission" @@ -645,9 +1048,18 @@ "etherscanView": { "message": "在 Etherscan(以太坊浏览器)上查看账户" }, + "etherscanViewOn": { + "message": "在Etherscan上查看" + }, "expandView": { "message": "展开视图" }, + "experimental": { + "message": "实验性" + }, + "experimentalSettingsDescription": { + "message": "代币检测及更多" + }, "exportPrivateKey": { "message": "导出私钥" }, @@ -667,6 +1079,9 @@ "failureMessage": { "message": "出了点问题,我们无法完成这个操作。" }, + "fakeTokenWarning": { + "message": "任何人都可以创建代币,包括创建现有代币的假版本。了解更多关于 $1" + }, "fast": { "message": "快" }, @@ -684,6 +1099,21 @@ "message": "文件导入失败? 点击这里!", "description": "Helps user import their account from a JSON file" }, + "flaskSnapSettingsCardButtonCta": { + "message": "查看详细信息", + "description": "Call to action a user can take to see more information about the Snap that is installed" + }, + "flaskSnapSettingsCardDateAddedOn": { + "message": "添加于", + "description": "Start of the sentence describing when and where snap was added" + }, + "flaskSnapSettingsCardFrom": { + "message": "从", + "description": "Part of the sentence describing when and where snap was added" + }, + "followUsOnTwitter": { + "message": "在Twitter上关注我们" + }, "forbiddenIpfsGateway": { "message": "禁用的 IPFS 网关:请指定一个 CID 网关" }, @@ -703,6 +1133,19 @@ "functionType": { "message": "功能类型" }, + "gas": { + "message": "燃料" + }, + "gasDisplayAcknowledgeDappButtonText": { + "message": "编辑建议的燃料费" + }, + "gasDisplayDappWarning": { + "message": "这笔燃料气费是由$1建议的,覆盖这可能会导致您的交易出现问题。 如果您有问题,请联系$1。", + "description": "$1 represents the Dapp's origin" + }, + "gasEstimatesUnavailableWarning": { + "message": "我们的低、中、高估计数字无法获得。" + }, "gasLimit": { "message": "燃料限制" }, @@ -716,15 +1159,62 @@ "message": "燃料限制至少要 $1", "description": "$1 is the custom gas limit, in decimal." }, + "gasLimitV2": { + "message": "燃料限制" + }, + "gasOption": { + "message": "燃料选项" + }, "gasPrice": { "message": "燃料价格(GWEI)" }, + "gasPriceExcessive": { + "message": "您的燃料费设置得不必要地高。请考虑降低金额。" + }, + "gasPriceExcessiveInput": { + "message": "燃料价格过高" + }, "gasPriceExtremelyLow": { "message": "燃料价格极低" }, + "gasPriceFetchFailed": { + "message": "由于网络错误,燃料价格估算失败。" + }, "gasPriceInfoTooltipContent": { "message": "燃料价格规定了您愿意为每单位燃料支付的 Ether 数量。" }, + "gasTimingHoursShort": { + "message": "$1 小时", + "description": "$1 represents a number of hours" + }, + "gasTimingMinutes": { + "message": "$1分钟", + "description": "$1 represents a number of minutes" + }, + "gasTimingMinutesShort": { + "message": "$1 分钟", + "description": "$1 represents a number of minutes" + }, + "gasTimingNegative": { + "message": "可能在$1内", + "description": "$1 represents an amount of time" + }, + "gasTimingPositive": { + "message": "有可能在 < $1", + "description": "$1 represents an amount of time" + }, + "gasTimingSeconds": { + "message": "$1 秒", + "description": "$1 represents a number of seconds" + }, + "gasTimingSecondsShort": { + "message": "$1 秒", + "description": "$1 represents a number of seconds" + }, + "gasTimingVeryPositive": { + "message": "非常可能在 < $1", + "description": "$1 represents an amount of time" + }, "gasUsed": { "message": "燃料使用" }, @@ -752,9 +1242,15 @@ "getStarted": { "message": "开始使用" }, + "goBack": { + "message": "返回" + }, "goerli": { "message": "Goerli 测试网络" }, + "grantedToWithColon": { + "message": "授予:" + }, "happyToSeeYou": { "message": "我们很高兴见到您。" }, @@ -764,6 +1260,13 @@ "hardwareWalletConnected": { "message": "已连接的硬件钱包" }, + "hardwareWalletLegacyDescription": { + "message": "(旧)", + "description": "Text representing the MEW path" + }, + "hardwareWalletSupportLinkConversion": { + "message": "点击这里" + }, "hardwareWallets": { "message": "连接硬件钱包" }, @@ -787,9 +1290,28 @@ "message": "隐藏 $1", "description": "$1 is the symbol for a token (e.g. 'DAI')" }, + "hideZeroBalanceTokens": { + "message": "隐藏没有余额的代币" + }, + "high": { + "message": "进取" + }, + "highGasSettingToolTipDialog": { + "message": "高概率,即使在不稳定的市场中也是如此。" + }, + "highGasSettingToolTipMessage": { + "message": "使用$1来覆盖网络流量因像流行的 NFT 丢弃而出现的剧增。", + "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" + }, + "highLowercase": { + "message": "高" + }, "history": { "message": "历史记录" }, + "id": { + "message": "ID" + }, "import": { "message": "导入", "description": "Button to import an account from a selected file" @@ -797,19 +1319,61 @@ "importAccount": { "message": "导入账户" }, + "importAccountError": { + "message": "导入帐户时出错。" + }, + "importAccountLinkText": { + "message": "使用账户助记词导入" + }, "importAccountMsg": { "message": "导入的账户将不会与最初创建的 MetaMask 账户助记词相关联。了解更多有关导入账户的信息 。" }, "importAccountSeedPhrase": { "message": "使用账户助记词导入账户" }, + "importAccountText": { + "message": "或 $1", + "description": "$1 represents the text from `importAccountLinkText` as a link" + }, + "importExistingWalletDescription": { + "message": "输入您创建$1钱包时提供的保密恢复短语(或Seed Phrase)。", + "description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link" + }, + "importExistingWalletTitle": { + "message": "使用账户助记词导入现有钱包" + }, + "importMyWallet": { + "message": "导入我的钱包" + }, + "importNFTs": { + "message": "导入NFT" + }, + "importTokenQuestion": { + "message": "导入代币?" + }, + "importTokenWarning": { + "message": "任何人都可以用任何名称创建代币,包括现有代币的假版本。添加和交易风险自付!" + }, + "importTokens": { + "message": "导入代币" + }, + "importTokensCamelCase": { + "message": "导入代币" + }, "importWallet": { "message": "导入钱包" }, + "importYourExisting": { + "message": "使用账户助记词导入您的现有钱包" + }, "imported": { "message": "已导入", "description": "status showing that an account has been fully loaded into the keyring" }, + "infuraBlockedNotification": { + "message": "MetaMask无法连接到区块链主机。请检查可能的原因 $1。", + "description": "$1 is a clickable link with with text defined by the 'here' key" + }, "initialTransactionConfirmed": { "message": "您的初始交易已通过网络确认。请点击“确定”返回。" }, @@ -819,6 +1383,9 @@ "insufficientFunds": { "message": "余额不足。" }, + "insufficientFundsForGas": { + "message": "燃料资金不足" + }, "insufficientTokens": { "message": "代币余额不足。" }, @@ -878,6 +1445,9 @@ "ipfsGatewayDescription": { "message": "输入用于 ENS 内容解析的 IPFS CID 网关的 URL。" }, + "jsDeliver": { + "message": "jsDeliver" + }, "jsonFile": { "message": "JSON 文件", "description": "format for importing an account" @@ -900,18 +1470,82 @@ "lastConnected": { "message": "最后连接" }, + "layer1Fees": { + "message": "1层费用" + }, + "learmMoreAboutGas": { + "message": "想要有关燃料$1?" + }, + "learnCancelSpeeedup": { + "message": "学习如何$1", + "description": "$1 is link to cancel or speed up transactions" + }, "learnMore": { "message": "查看更多" }, + "learnMoreUpperCase": { + "message": "查看更多" + }, + "learnScamRisk": { + "message": "欺诈和安全风险." + }, "ledgerAccountRestriction": { "message": "在添加新的账户之前,需要使用您的最后一个账户。" }, + "ledgerConnectionInstructionCloseOtherApps": { + "message": "关闭任何连接到您设备的其他软件,然后点击这里刷新。" + }, + "ledgerConnectionInstructionHeader": { + "message": "点击确认前:" + }, + "ledgerConnectionInstructionStepFour": { + "message": "在您的Ledger设备上启用\"智能合同数据\"或\"盲目签名\"" + }, + "ledgerConnectionInstructionStepOne": { + "message": "启用在“设置 > 高级”下使用Ledger Live" + }, + "ledgerConnectionInstructionStepThree": { + "message": "在您的Ledger设备中插入并选择Ethereum应用" + }, + "ledgerConnectionInstructionStepTwo": { + "message": "打开和解锁Ledger Live应用程序" + }, + "ledgerConnectionPreferenceDescription": { + "message": "自定义您如何连接您的Ledger到Metamask。建议$1 但其他选项可用。请阅读更多信息:$2", + "description": "A description that appears above a dropdown where users can select between up to three options - Ledger Live, U2F or WebHID - depending on what is supported in their browser. $1 is the recommended browser option, it will be either WebHID or U2f. $2 is a link to an article where users can learn more, but will be the translation of the learnMore message." + }, + "ledgerDeviceOpenFailureMessage": { + "message": "Ledger设备打开失败。您的Ledger可能已连接到其他软件。 请关闭Ledger Live或其他连接到您Ledger设备的应用程序,并尝试再次连接。" + }, + "ledgerLive": { + "message": "Ledger Live", + "description": "The name of a desktop app that can be used with your ledger device. We can also use it to connect a users Ledger device to MetaMask." + }, + "ledgerLiveApp": { + "message": "Ledger Live应用程序" + }, + "ledgerLocked": { + "message": "无法连接到Ledger设备。请确保您的设备已解锁并打开Etherum应用程序。" + }, + "ledgerTimeout": { + "message": "Ledger Live需要太长时间才能响应或连接超时。请确保Ledger Live应用已打开,您的设备已解锁。" + }, + "ledgerTransportChangeWarning": { + "message": "如果您的Ledger Live应用程序已打开,请断开任何打开的Ledger Live连接并关闭 Ledger Live应用程序。" + }, + "ledgerWebHIDNotConnectedErrorMessage": { + "message": "Ledger设备未连接。如果您想要连接您的Ledger,请再次点击“继续”并批准HID连接", + "description": "An error message shown to the user during the hardware connect flow." + }, "letsGoSetUp": { "message": "第一次,立即开始设置!" }, "likeToImportTokens": { "message": "您想添加这些代币吗?" }, + "link": { + "message": "链接" + }, "links": { "message": "链接" }, @@ -933,12 +1567,48 @@ "lockTimeTooGreat": { "message": "锁定时间过长" }, + "low": { + "message": "低" + }, + "lowGasSettingToolTipMessage": { + "message": "使用$1等待较便宜的价格。时间估计远不准确,因为价格有些难以预测。", + "description": "$1 is key 'low' separated here so that it can be passed in with bold fontweight" + }, + "lowLowercase": { + "message": "低" + }, + "lowPriorityMessage": { + "message": "以后的交易将在这个时候之后排队。最后一次看到的价格是在一段时间之前。" + }, "mainnet": { "message": "以太坊 Ethereum 主网络" }, + "makeAnotherSwap": { + "message": "创建一个新的交换" + }, + "makeSureNoOneWatching": { + "message": "请确保没有人在观看您的屏幕", + "description": "Warning to users to be care while creating and saving their new Secret Recovery Phrase" + }, "max": { "message": "最大" }, + "maxBaseFee": { + "message": "最大基本费用" + }, + "maxFee": { + "message": "最高收费" + }, + "maxPriorityFee": { + "message": "最高优先费用" + }, + "medium": { + "message": "市场" + }, + "mediumGasSettingToolTipMessage": { + "message": "使用$1按当前市场价格快速处理。", + "description": "$1 is key 'medium' (text: 'Market') separated here so that it can be passed in with bold fontweight" + }, "memo": { "message": "备忘" }, @@ -969,6 +1639,9 @@ "metametricsCommitmentsAllowOptOut": { "message": "始终允许您通过设置选择退出" }, + "metametricsCommitmentsAllowOptOut2": { + "message": "始终可通过设置选择退出" + }, "metametricsCommitmentsBoldNever": { "message": "从不", "description": "This string is localized separately from some of the commitments so that we can bold it" @@ -976,6 +1649,9 @@ "metametricsCommitmentsIntro": { "message": "MetaMask……" }, + "metametricsCommitmentsNeverCollect": { + "message": "永不收集密钥、地址、交易记录、余额、哈希或任何个人信息" + }, "metametricsCommitmentsNeverCollectIP": { "message": "$1收集您的完整IP地址", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" @@ -984,6 +1660,12 @@ "message": "$1收集密钥、地址、交易记录、余额、哈希或任何个人信息", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" }, + "metametricsCommitmentsNeverIP": { + "message": "永不收集您的完整IP地址" + }, + "metametricsCommitmentsNeverSell": { + "message": "永不为利益而出售您的数据,永远不会!" + }, "metametricsCommitmentsNeverSellDataForProfit": { "message": "$1为利益而出售您的数据,永远不会!", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" @@ -997,15 +1679,54 @@ "metametricsOptInDescription": { "message": "MetaMask 希望收集使用数据,以更好地了解我们的用户如何与扩展进行互动。这些数据将被用于持续改进我们产品和 Ethereum 生态系统的可用性和用户体验。" }, + "metametricsOptInDescription2": { + "message": "我们想要收集基本使用数据以提高我们产品的可用性。这些数据将..." + }, + "metametricsTitle": { + "message": "加入 6M+ 用户来改进MetaMask" + }, + "mismatchedChain": { + "message": "此链路的网络详细信息与我们的记录不匹配。我们建议您在继续操作之前$1。", + "description": "$1 is a clickable link with text defined by the 'mismatchedChainLinkText' key" + }, + "mismatchedChainLinkText": { + "message": "验证网络详细信息", + "description": "Serves as link text for the 'mismatchedChain' key. This text will be embedded inside the translation for that key." + }, + "missingNFT": { + "message": "找不到您的NFT?" + }, + "missingToken": { + "message": "找不到您的代币?" + }, + "mobileSyncWarning": { + "message": "“同步扩展”功能暂时被禁用。 如果您想要在MetaMask手机上使用您的扩展钱包,在您的手机应用上:返回钱包设置选项并选择“使用账户助记词导入”选项。 使用您的扩展钱包的助记词来导入您的钱包。" + }, "mustSelectOne": { "message": "至少选择 1 种代币。" }, "myAccounts": { "message": "我的账户" }, + "name": { + "message": "名称" + }, "needEtherInWallet": { "message": "使用 MetaMask 与分布式应用交互,需要您的钱包里需要有 Ether。" }, + "needHelp": { + "message": "需要帮助?请联系 $1", + "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" + }, + "needHelpFeedback": { + "message": "分享您的反馈" + }, + "needHelpLinkText": { + "message": "MetaMask支持" + }, + "needHelpSubmitTicket": { + "message": "提交问题" + }, "needImportFile": { "message": "必须选择一个文件来导入。", "description": "User is important an account and needs to add a file to continue" @@ -1013,15 +1734,56 @@ "negativeETH": { "message": "不能发负值的 ETH。" }, + "networkDetails": { + "message": "网络详细信息" + }, "networkName": { "message": "网络名称" }, + "networkNameBSC": { + "message": "BSC" + }, + "networkNameDefinition": { + "message": "与此网络关联的名称。" + }, + "networkNameEthereum": { + "message": "Ethereum" + }, + "networkNamePolygon": { + "message": "Polygon" + }, + "networkNameRinkeby": { + "message": "Rinkeby" + }, + "networkNameTestnet": { + "message": "Testnet" + }, "networkSettingsChainIdDescription": { "message": "链 ID 用于签署交易。它必须与网络返回的链 ID 相匹配。您可以输入十进制或'0x'前缀的十六进制数字,但我们将以十进制显示。" }, "networkSettingsDescription": { "message": "添加和编辑自定义 RPC 网络" }, + "networkStatus": { + "message": "网络状态" + }, + "networkStatusBaseFeeTooltip": { + "message": "基本费用由网络设定,每13-14秒更改一次。我们的$1 和 $2 选项用于突然增加。", + "description": "$1 and $2 are bold text for Medium and Aggressive respectively." + }, + "networkStatusPriorityFeeTooltip": { + "message": "优先收费范围(又称“矿工费”)直接向矿工支付,并鼓励他们确定您的交易的优先次序。" + }, + "networkStatusStabilityFeeTooltip": { + "message": "燃料费用相对过去72小时的$1。", + "description": "$1 is networks stability value - stable, low, high" + }, + "networkURL": { + "message": "网络网址" + }, + "networkURLDefinition": { + "message": "用于访问此网络的URL。" + }, "networks": { "message": "网络" }, @@ -1038,12 +1800,27 @@ "message": "账户 $1", "description": "Default name of next account to be created on create account screen" }, + "newCollectibleAddFailed": { + "message": "未添加收藏,因为:$1" + }, + "newCollectibleAddedMessage": { + "message": "收藏已成功添加!" + }, "newContact": { "message": "新联系人" }, "newContract": { "message": "新合约" }, + "newNFTsDetected": { + "message": "新功能!NFT 检测" + }, + "newNFTsDetectedInfo": { + "message": "允许 MetaMask自动检测Opensea 的 NFT,并在您的 MetaMask钱包中显示。" + }, + "newNetworkAdded": { + "message": "成功添加了“$1”!" + }, "newPassword": { "message": "新密码(至少 8 个字符)" }, @@ -1056,6 +1833,9 @@ "newTransactionFee": { "message": "新交易费用" }, + "newValues": { + "message": "新的值" + }, "next": { "message": "下一步" }, @@ -1063,6 +1843,15 @@ "message": "Nonce 高于建议的 nouce 值 $1", "description": "The next nonce according to MetaMask's internal logic" }, + "nftTokenIdPlaceholder": { + "message": "输入收藏ID" + }, + "nfts": { + "message": "NFT" + }, + "nickname": { + "message": "昵称" + }, "noAccountsFound": { "message": "没找到查询的账户" }, @@ -1072,9 +1861,15 @@ "noAlreadyHaveSeed": { "message": "不,我已经有一个账户助记词了。" }, + "noConversionDateAvailable": { + "message": "没有可用的货币转换日期" + }, "noConversionRateAvailable": { "message": "无可用转换率" }, + "noNFTs": { + "message": "尚无NFT" + }, "noThanks": { "message": "不,谢谢" }, @@ -1087,6 +1882,9 @@ "noWebcamFoundTitle": { "message": "未找到摄像头" }, + "nonce": { + "message": "Nonce" + }, "nonceField": { "message": "自定义交易 nonce" }, @@ -1096,12 +1894,104 @@ "nonceFieldHeading": { "message": "自定义 Nonce" }, + "notBusy": { + "message": "非忙碌中" + }, "notCurrentAccount": { "message": "这是正确的账户吗?这与您钱包中当前选择的账户不同。" }, "notEnoughGas": { "message": "燃料不足" }, + "notifications1Description": { + "message": "MetaMask移动用户现在可以在他们的移动钱包中交换令牌。扫描二维码以获取移动应用并开始交换。", + "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." + }, + "notifications1Title": { + "message": "在移动设备上交换!", + "description": "Title for a notification in the 'See What's New' popup. Tells users that they can now use MetaMask Swaps on Mobile." + }, + "notifications3ActionText": { + "message": "阅读更多", + "description": "The 'call to action' on the button, or link, of the 'Stay secure' notification. Upon clicking, users will be taken to a page about security on the metamask support website." + }, + "notifications3Description": { + "message": "随时更新MetaMask安全最佳做法,并从官方MetaMask支持中获得最新的安全提示。", + "description": "Description of a notification in the 'See What's New' popup. Describes the information they can get on security from the linked support page." + }, + "notifications3Title": { + "message": "保持安全", + "description": "Title for a notification in the 'See What's New' popup. Encourages users to consider security." + }, + "notifications4ActionText": { + "message": "开始交换", + "description": "The 'call to action' on the button, or link, of the 'Swap on Binance Smart Chain!' notification. Upon clicking, users will be taken to a page where then can swap tokens on Binance Smart Chain." + }, + "notifications4Description": { + "message": "在您的钱包内立即获取代币交换的最佳价格。 MetaMask现在将您连接到Binance Smart Chain上的多个分散化交易聚合器和专业市场制造商。", + "description": "Description of a notification in the 'See What's New' popup." + }, + "notifications4Title": { + "message": "交换Binance Smart Chain", + "description": "Title for a notification in the 'See What's New' popup. Encourages users to do swaps on Binance Smart Chain." + }, + "notifications5Description": { + "message": "您的“Seed Phrase”现在叫做“保密恢复短语”。", + "description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update." + }, + "notifications6DescriptionOne": { + "message": "到Chrome版本91,启用我们Ledger支持 (U2F) 的API不再支持硬件钱包。 MetaMask实现了新的Ledger Live支持,允许您继续通过Ledger Live 桌面应用程序连接到您的Ledger设备。", + "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." + }, + "notifications6DescriptionThree": { + "message": "当与您在Metamask中的Ledger账户交互时,将打开一个新标签,您将被要求打开Ledger Live应用程序。 一旦应用程序打开,您将被要求允许WebSocket连接到您的MetaMask帐户。就是这样!", + "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." + }, + "notifications6DescriptionTwo": { + "message": "您可以通过单击设置 > 高级> 使用Ledger Live来启用Ledger Live支持。", + "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." + }, + "notifications6Title": { + "message": "Chrome用户的Ledger支持更新", + "description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update" + }, + "notifications7DescriptionOne": { + "message": "MetaMaskv10.1.0包括使用Ledger设备时对EIP-1559交易的新支持。", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for ledger and EIP1559 in v10.1.0" + }, + "notifications7DescriptionTwo": { + "message": "要完成Ethereum Mainnet上的交易,请确保您的Ledger设备有最新的固件。", + "description": "Description of a notification in the 'See What's New' popup. Describes the need to update ledger firmware." + }, + "notifications7Title": { + "message": "Ledger固件更新", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." + }, + "notifications8ActionText": { + "message": "转到高级设置", + "description": "Description on an action button that appears in the What's New popup. Tells the user that if they click it, they will go to our Advanced Settings page." + }, + "notifications8DescriptionOne": { + "message": "从MetaMaskv10.4.0开始,您不再需要Ledger Live连接您的Ledger设备到Metamask。", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for how Ledger Live is no longer needed to connect the device." + }, + "notifications8DescriptionTwo": { + "message": "为了更容易和更稳定的ledger体验,转到高级设置选项卡,然后切换“首选Ledger连接类型”到“WebHID”。", + "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." + }, + "notifications8Title": { + "message": "Ledger连接改进", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users that there is an improvement in how they can connect their device." + }, + "notifications9DescriptionOne": { + "message": "我们现在让您在确认智能合同交易时对“数据”选项卡有更多的了解。" + }, + "notifications9DescriptionTwo": { + "message": "您现在可以在确认之前更好地了解您的交易详情, 并且更容易添加交易地址到您的地址簿,帮助您做出安全和知情的决定。" + }, + "notifications9Title": { + "message": "👓 我们正在使交易更易明。" + }, "ofTextNofM": { "message": "/" }, @@ -1117,13 +2007,79 @@ "on": { "message": "启用" }, + "onboardingCreateWallet": { + "message": "创建新的钱包" + }, + "onboardingImportWallet": { + "message": "导入现有钱包" + }, + "onboardingPinExtensionBillboardAccess": { + "message": "完全访问" + }, + "onboardingPinExtensionBillboardDescription": { + "message": "这些扩展可以" + }, + "onboardingPinExtensionBillboardDescription2": { + "message": "在此站点看到和更改信息。" + }, + "onboardingPinExtensionBillboardTitle": { + "message": "扩展" + }, + "onboardingPinExtensionChrome": { + "message": "点击浏览器扩展图标" + }, + "onboardingPinExtensionDescription": { + "message": "在您的浏览器上固定MetaMask,所以可以轻松查看交易确认。" + }, + "onboardingPinExtensionDescription2": { + "message": "您可以点击扩展并通过单击打开MetaMask以打开您的钱包。" + }, + "onboardingPinExtensionDescription3": { + "message": "点击浏览器扩展图标即时访问" + }, + "onboardingPinExtensionLabel": { + "message": "固定MetaMask" + }, + "onboardingPinExtensionStep1": { + "message": "1" + }, + "onboardingPinExtensionStep2": { + "message": "2" + }, + "onboardingPinExtensionTitle": { + "message": "您的 MetaMask安装完成!" + }, "onboardingReturnNotice": { "message": "“$1”会关闭此标签,直接回到 $2", "description": "Return the user to the site that initiated onboarding" }, + "onboardingShowIncomingTransactionsDescription": { + "message": "显示您钱包中依赖于与$1通信的交易。Etherscan 将能访问您的Etherum地址和您的 IP 地址。查看 $2。", + "description": "$1 is a clickable link with text defined by the 'etherscan' key. $2 is a clickable link with text defined by the 'privacyMsg' key." + }, + "onboardingUsePhishingDetectionDescription": { + "message": "钓鱼侦测警报依赖于与 $1的通信。jsDeliver 将能访问您的 IP 地址。查看 $2。", + "description": "The $1 is the word 'jsDeliver', from key 'jsDeliver' and $2 is the words Privacy Policy from key 'privacyMsg', both separated here so that it can be wrapped as a link" + }, + "onlyAddTrustedNetworks": { + "message": "恶意网络提供商可能会显示区块链的状态并记录您的网络活动。只添加您信任的自定义网络。" + }, "onlyConnectTrust": { "message": "只连接您信任的网站。" }, + "openFullScreenForLedgerWebHid": { + "message": "全屏打开MetaMask以通过WebHID连接您的ledger。", + "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." + }, + "optional": { + "message": "可选" + }, + "optionalWithParanthesis": { + "message": "(可选)" + }, + "or": { + "message": "或" + }, "origin": { "message": "来源" }, @@ -1142,6 +2098,12 @@ "passwordNotLongEnough": { "message": "密码长度不足" }, + "passwordSetupDetails": { + "message": "此密码只会在此设备上解锁您的 MetaMask钱包。MetaMask无法恢复此密码。" + }, + "passwordTermsWarning": { + "message": "我了解MetaMask无法为我恢复此密码。$1" + }, "passwordsDontMatch": { "message": "密码不匹配" }, @@ -1152,6 +2114,19 @@ "pending": { "message": "待处理" }, + "pendingTransactionInfo": { + "message": "这笔交易在完成之前不会被处理。" + }, + "pendingTransactionMultiple": { + "message": "您有 ($1) 待处理的交易" + }, + "pendingTransactionSingle": { + "message": "您有 (1) 个待处理的交易。", + "description": "$1 is count of pending transactions" + }, + "permissionRequest": { + "message": "权限请求" + }, "permissions": { "message": "权限" }, @@ -1162,6 +2137,10 @@ "message": "+ $1", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, + "preferredLedgerConnectionType": { + "message": "首选Ledger连接类型", + "description": "A header for a dropdown in the advanced section of settings. Appears above the ledgerConnectionPreferenceDescription message" + }, "prev": { "message": "上一个" }, @@ -1171,6 +2150,12 @@ "primaryCurrencySettingDescription": { "message": "请选择“本地”,优先显示当地货币链价值(如 ETH )。选择“货币”则优先以所选货币作为价值显示单位。" }, + "priorityFee": { + "message": "优先费用" + }, + "priorityFeeProperCase": { + "message": "优先费用" + }, "privacyMsg": { "message": "隐私政策" }, @@ -1184,12 +2169,18 @@ "privateNetwork": { "message": "私有网络" }, + "proceedWithTransaction": { + "message": "我仍然想继续操作" + }, "proposedApprovalLimit": { "message": "拟议的审批上限" }, "provide": { "message": "提供" }, + "publicAddress": { + "message": "公开地址" + }, "queue": { "message": "队列" }, @@ -1208,6 +2199,36 @@ "recipientAddressPlaceholder": { "message": "查找、公用地址 (0x) 或 ENS" }, + "recommendedGasLabel": { + "message": "建议" + }, + "recoveryPhraseReminderBackupStart": { + "message": "从这里开始" + }, + "recoveryPhraseReminderConfirm": { + "message": "明白了" + }, + "recoveryPhraseReminderHasBackedUp": { + "message": "总是在一个安全和保密的地方保存您的账户助记词" + }, + "recoveryPhraseReminderHasNotBackedUp": { + "message": "需要再次备份您的账户助记词?" + }, + "recoveryPhraseReminderItemOne": { + "message": "永远不要与任何人分享您的账户助记词" + }, + "recoveryPhraseReminderItemTwo": { + "message": "MetaMask团队将永远不会询问您的账户助记词" + }, + "recoveryPhraseReminderSubText": { + "message": "您的账户助记词控制了您所有的帐户。" + }, + "recoveryPhraseReminderTitle": { + "message": "保护您的资金" + }, + "refreshList": { + "message": "刷新列表" + }, "reject": { "message": "拒绝" }, @@ -1223,6 +2244,9 @@ "rejected": { "message": "拒绝" }, + "remember": { + "message": "记住:" + }, "remindMeLater": { "message": "稍后提醒" }, @@ -1235,6 +2259,9 @@ "removeAccountDescription": { "message": "该账户已从您的钱包中删除。请在继续后续操作前,确认您是否已拥有该导入账户的原始账户助记词或账户密钥。您可以通过账户下拉菜单再次导入或创建账户。" }, + "removeNFT": { + "message": "删除 NFT" + }, "requestsAwaitingAcknowledgement": { "message": "待确认的请求" }, @@ -1320,12 +2347,72 @@ "secretBackupPhraseWarning": { "message": "警告:切勿向他人透露您的账户助记词。任何人一旦持有该账户助记词,即可控制您的 Ether。" }, + "secretPhrase": { + "message": "只有这个钱包上的第一个帐户将自动加载。 完成此流程后,点击下拉菜单,然后选择创建账户。" + }, + "secretPhraseWarning": { + "message": "如果您使用另一个账户助记词来还原,您当前的钱包、帐户和资产将永久从这个应用中移除。 此操作不能撤消。" + }, + "secretRecoveryPhrase": { + "message": "账户助记词" + }, + "secureWallet": { + "message": "保密钱包" + }, "securityAndPrivacy": { "message": "安全与隐私" }, "securitySettingsDescription": { "message": "隐私设置和账户助记词" }, + "seedPhraseConfirm": { + "message": "请确认账户助记词" + }, + "seedPhraseEnterMissingWords": { + "message": "请确认账户助记词" + }, + "seedPhraseIntroNotRecommendedButtonCopy": { + "message": "稍后提醒我(不推荐)" + }, + "seedPhraseIntroRecommendedButtonCopy": { + "message": "保护我的钱包 (推荐)" + }, + "seedPhraseIntroSidebarBulletFour": { + "message": "写下并存储在多个秘密位置。" + }, + "seedPhraseIntroSidebarBulletOne": { + "message": "保存到密码管理器" + }, + "seedPhraseIntroSidebarBulletThree": { + "message": "存放在保险箱内。" + }, + "seedPhraseIntroSidebarBulletTwo": { + "message": "储存在银行保险库。" + }, + "seedPhraseIntroSidebarCopyOne": { + "message": "您的秘密恢复短语是一个12个词,它是您钱包和资金的“主密钥”" + }, + "seedPhraseIntroSidebarCopyThree": { + "message": "如果有人要求您的恢复短语,他们可能会试图欺骗您并偷窃您的钱包资金" + }, + "seedPhraseIntroSidebarCopyTwo": { + "message": "永远不要分享您的账户助记词,甚至不和MetaMask分享!" + }, + "seedPhraseIntroSidebarTitleOne": { + "message": "什么是账户助记词?" + }, + "seedPhraseIntroSidebarTitleThree": { + "message": "我是否应该分享我的账户助记词?" + }, + "seedPhraseIntroSidebarTitleTwo": { + "message": "如何保存我的账户助记词?" + }, + "seedPhraseIntroTitle": { + "message": "保护您的钱包" + }, + "seedPhraseIntroTitleCopy": { + "message": "在开始之前,观看这个简短的视频来了解您的账户助记词以及如何保护您的钱包安全。" + }, "seedPhrasePlaceholder": { "message": "用空格分隔每个单词" }, @@ -1335,6 +2422,12 @@ "seedPhraseReq": { "message": "账户助记词由 12、15、18、21 或 24 个单词组成" }, + "seedPhraseWriteDownDetails": { + "message": "请写下这个12个字的账户助记词,然后将其保存到您信任并且只有您可以访问的地方。" + }, + "seedPhraseWriteDownHeader": { + "message": "请写下您的账户助记词" + }, "selectAHigherGasFee": { "message": "选择更高的燃料费用,提高交易处理速度。*" }, @@ -1347,12 +2440,18 @@ "selectAnAccount": { "message": "选择一个账户" }, + "selectAnAccountAlreadyConnected": { + "message": "此帐户已连接到MetaMask" + }, "selectEachPhrase": { "message": "请选择每个单词,以确保其正确性。" }, "selectHdPath": { "message": "选择 HD 路径" }, + "selectNFTPrivacyPreference": { + "message": "在设置中打开NFT检测" + }, "selectPathHelp": { "message": "如果下列账户中没有您当前所持有的 Ledger 账户,请将路径切换至“Legacy (MEW / MyCrypto)”" }, @@ -1372,15 +2471,31 @@ "message": "发送 $1", "description": "Symbol of the specified token" }, + "sendTo": { + "message": "发送至" + }, "sendTokens": { "message": "发送代币" }, + "sendingNativeAsset": { + "message": "正在发送$1", + "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" + }, "separateEachWord": { "message": "用空格分隔每个单词" }, + "setAdvancedPrivacySettings": { + "message": "设置高级隐私设置" + }, + "setAdvancedPrivacySettingsDetails": { + "message": "MetaMask使用这些可信的第三方服务来提高产品可用性和安全性。" + }, "settings": { "message": "设置" }, + "show": { + "message": "显示" + }, "showAdvancedGasInline": { "message": "高级燃料控制" }, @@ -1399,6 +2514,9 @@ "showHexDataDescription": { "message": "请选择该选项,在发送页面显示十六进制数据字域" }, + "showHide": { + "message": "显示/隐藏" + }, "showIncomingTransactions": { "message": "显示收到的交易" }, @@ -1411,9 +2529,18 @@ "showPrivateKeys": { "message": "显示私钥" }, + "showRecommendations": { + "message": "显示建议" + }, "showSeedPhrase": { "message": "显示账户助记词" }, + "showTestnetNetworks": { + "message": "显示测试网络" + }, + "showTestnetNetworksDescription": { + "message": "选择此项以在网络列表中显示测试网络" + }, "sigRequest": { "message": "请求签名" }, @@ -1432,18 +2559,45 @@ "signed": { "message": "已签名" }, + "simulationErrorMessage": { + "message": "此交易预计将失败。尝试执行该交易预计将是昂贵的,但失败,不推荐。" + }, + "simulationErrorMessageV2": { + "message": "我们无法估计燃料。合同中可能有一个错误,这笔交易可能失败。" + }, + "skip": { + "message": "跳过" + }, + "skipAccountSecurity": { + "message": "跳过帐户安全?" + }, + "skipAccountSecurityDetails": { + "message": "我了解,在我备份我的账户助记词之前,我可能会失去我的帐户和他们的所有资产。" + }, "slow": { "message": "慢" }, "somethingWentWrong": { "message": "糟糕!出问题了。" }, + "source": { + "message": "来源" + }, "speedUp": { "message": "加速" }, "speedUpCancellation": { "message": "加速该取消操作" }, + "speedUpExplanation": { + "message": "我们根据当前网络条件更新了燃料费用,并且至少增加了10% (网络要求)。" + }, + "speedUpPopoverTitle": { + "message": "加速该交易操作" + }, + "speedUpTooltipText": { + "message": "新增燃料费用" + }, "speedUpTransaction": { "message": "加速该交易操作" }, @@ -1466,6 +2620,12 @@ "spendLimitTooLarge": { "message": "消费限制过大" }, + "stable": { + "message": "稳定的" + }, + "stableLowercase": { + "message": "稳定的" + }, "stateLogError": { "message": "检索状态日志时出错。" }, @@ -1484,6 +2644,34 @@ "statusNotConnected": { "message": "未连接" }, + "step1LatticeWallet": { + "message": "请确保您的 Lattice1 已准备好连接" + }, + "step1LatticeWalletMsg": { + "message": "您可以在设置后在线连接MetaMask到您的 Lattice1 设备。 解锁您的设备并准备好您的设备ID。若要更多地使用硬件钱包,$1", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, + "step1LedgerWallet": { + "message": "下载Ledger应用" + }, + "step1LedgerWalletMsg": { + "message": "下载、设置和输入您的密码以解锁 $1。", + "description": "$1 represents the `ledgerLiveApp` localization value" + }, + "step1TrezorWallet": { + "message": "插入Trezor钱包" + }, + "step1TrezorWalletMsg": { + "message": "将您的钱包直接连接到电脑。如果使用硬件钱包设备,關於使用您的钱包更多詳情,$1", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, + "step2LedgerWallet": { + "message": "插入Ledger钱包" + }, + "step2LedgerWalletMsg": { + "message": "将您的钱包直接连接到电脑。解锁Ledger并打开Ethereum应用程序。关于使用您的硬件钱包设备的更多,$1。", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, "storePhrase": { "message": "通过如 1Password 等密码管理工具保存该账户助记词。" }, @@ -1493,6 +2681,9 @@ "submitted": { "message": "已提交" }, + "support": { + "message": "支持" + }, "supportCenter": { "message": "访问我们的支持中心" }, @@ -1505,6 +2696,10 @@ "swapAggregator": { "message": "聚合商" }, + "swapAllowSwappingOf": { + "message": "允许交换$1", + "description": "Shows a user that they need to allow a token for swapping on their hardware wallet" + }, "swapAmountReceived": { "message": "保证数额" }, @@ -1519,16 +2714,32 @@ "message": "您还需 $1 $2 来完成这笔兑换", "description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol." }, + "swapBestOfNQuotes": { + "message": "最好的$1报价。", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, "swapBuildQuotePlaceHolderText": { "message": "没有匹配的代币符合 $1", "description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text" }, + "swapConfirmWithHwWallet": { + "message": "使用您的硬件钱包确认" + }, + "swapContractDataDisabledErrorDescription": { + "message": "在您的Ledger的Etherum应用中,转到“设置”并允许合同数据。然后再次尝试交换。" + }, + "swapContractDataDisabledErrorTitle": { + "message": "合同数据未在您的Ledger上启用" + }, "swapCustom": { "message": "自定义" }, "swapDecentralizedExchange": { "message": "去中心化交易所" }, + "swapDirectContract": { + "message": "直接合同" + }, "swapEditLimit": { "message": "修改限制" }, @@ -1536,15 +2747,26 @@ "message": "这是必须的,并且允许 MetaMask 兑换您的 $1。", "description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps." }, + "swapEnableTokenForSwapping": { + "message": "这需要$1进行交换。", + "description": "$1 is for the 'enableToken' key, e.g. 'enable ETH'" + }, "swapEstimatedNetworkFees": { "message": "预计网络手续费" }, "swapEstimatedNetworkFeesInfo": { "message": "这是预估的用于完成您的兑换所使用的网络手续费。实际数额可能会根据网络条件而变化。" }, + "swapFailedErrorDescriptionWithSupportLink": { + "message": "交易有时会失败,我们会提供帮助。如果这个问题仍然存在,您可以通过$1来获得我们的客户支持来获得进一步的帮助。", + "description": "This message is shown to a user if their swap fails. The $1 will be replaced by support.metamask.io" + }, "swapFailedErrorTitle": { "message": "兑换失败" }, + "swapFetchingQuotes": { + "message": "正在获取报价" + }, "swapFetchingQuotesErrorDescription": { "message": "呃……出错了。再试一次,如果错误仍存在,请联系客户支持。" }, @@ -1554,6 +2776,30 @@ "swapFetchingTokens": { "message": "获取代币中……" }, + "swapFromTo": { + "message": "$1 到 $2 的交换", + "description": "Tells a user that they need to confirm on their hardware wallet a swap of 2 tokens. $1 is a source token and $2 is a destination token" + }, + "swapGasFeesDetails": { + "message": "燃料费用是根据网络流量和交易复杂性估算,并会波动。" + }, + "swapGasFeesLearnMore": { + "message": "了解更多关于燃料费用的信息" + }, + "swapGasFeesSplit": { + "message": "上一个屏幕上的燃料费用在这两笔交易之间进行分配。" + }, + "swapGasFeesSummary": { + "message": "燃料费用支付给在$1网络上处理交易的加密矿工。MetaMask不会从燃料费用中获利。", + "description": "$1 is the selected network, e.g. Ethereum or BSC" + }, + "swapHighSlippageWarning": { + "message": "翻转数量非常高。" + }, + "swapIncludesMMFee": { + "message": "包括1%的MetaMask收费。", + "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." + }, "swapLowSlippageError": { "message": "交易可能失败,最大滑点过低。" }, @@ -1567,6 +2813,10 @@ "message": "我们每次都能从顶级流动性资源中找到最好的价格。每次报价都会自动收取1%的手续费用,以支持 MetaMask 的持续发展,使其更加完善。", "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." }, + "swapNQuotesWithDot": { + "message": "$1 报价。", + "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" + }, "swapNewQuoteIn": { "message": "$1 后更新报价", "description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00" @@ -1583,6 +2833,15 @@ "message": "价格差异 ~$1%", "description": "$1 is a number (ex: 1.23) that represents the price difference." }, + "swapPriceImpactTooltip": { + "message": "价格影响是当前市场价格与执行交易期间收到的金额之间的差额。 价格影响是您的交易规模与流动资金池规模之间的一个函数。" + }, + "swapPriceUnavailableDescription": { + "message": "由于缺乏市场价格数据,无法确定价格的影响。 请确认您同意即将收到的代币数量。" + }, + "swapPriceUnavailableTitle": { + "message": "在继续之前检查您的价格" + }, "swapProcessing": { "message": "处理中" }, @@ -1623,6 +2882,9 @@ "swapRequestForQuotation": { "message": "请求报价" }, + "swapReviewSwap": { + "message": "审查交换" + }, "swapSearchForAToken": { "message": "搜索代币" }, @@ -1638,12 +2900,21 @@ "swapSelectQuotePopoverDescription": { "message": "以下是从多个流动资金来源收集到的所有报价。" }, + "swapSlippageNegative": { + "message": "翻转必须大于或等于 0" + }, "swapSource": { "message": "流动资金来源" }, "swapSourceInfo": { "message": "我们搜索多个流动性来源(交易所、聚合商和专业做市商),以找到最好的利率和最低的网络手续费。" }, + "swapSuggested": { + "message": "交换建议" + }, + "swapSuggestedGasSettingToolTipMessage": { + "message": "交换是复杂和时间敏感的交易。我们推荐此燃料费用,以便在成功交换的成本和信心之间保持良好的平衡。" + }, "swapSwapFrom": { "message": "兑换自" }, @@ -1653,17 +2924,45 @@ "swapSwapTo": { "message": "兑换到" }, + "swapToConfirmWithHwWallet": { + "message": "使用您的硬件钱包确认" + }, "swapTokenAvailable": { "message": "您的 $1 已添加到您的账户。", "description": "This message is shown after a swap is successful and communicates the exact amount of tokens the user has received for a swap. The $1 is a decimal number of tokens followed by the token symbol." }, + "swapTokenBalanceUnavailable": { + "message": "我们无法获取您的$1余额", + "description": "This message communicates to the user that their balance of a given token is currently unavailable. $1 will be replaced by a token symbol" + }, "swapTokenToToken": { "message": "兑换 $1 到 $2", "description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap." }, + "swapTokenVerificationAddedManually": { + "message": "已手动添加此代币。" + }, + "swapTokenVerificationMessage": { + "message": "总是在$1上确认代币地址。", + "description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover." + }, + "swapTokenVerificationOnlyOneSource": { + "message": "仅在 1 个源上验证。" + }, + "swapTokenVerificationSources": { + "message": "在$1资源上验证。", + "description": "Indicates the number of token information sources that recognize the symbol + address. $1 is a decimal number." + }, + "swapTooManyDecimalsError": { + "message": "$1 最多允许$2小数", + "description": "$1 is a token symbol and $2 is the max. number of decimals allowed for the token" + }, "swapTransactionComplete": { "message": "交易完成" }, + "swapTwoTransactions": { + "message": "2 交易" + }, "swapUnknown": { "message": "未知的" }, @@ -1694,18 +2993,36 @@ "swapsViewInActivity": { "message": "在活动中查看" }, + "switchEthereumChainConfirmationDescription": { + "message": "这将切换MetaMask中选定的网络到以前添加的网络:" + }, + "switchEthereumChainConfirmationTitle": { + "message": "允许此站点切换网络?" + }, + "switchNetwork": { + "message": "切换网络" + }, "switchNetworks": { "message": "切换网络" }, "switchToThisAccount": { "message": "切换到该账户" }, + "switchingNetworksCancelsPendingConfirmations": { + "message": "切换网络将取消所有待处理的确认" + }, "symbol": { "message": "符号" }, "symbolBetweenZeroTwelve": { "message": "符号不得超过 11 个字符。" }, + "syncFailed": { + "message": "同步失败" + }, + "syncInProgress": { + "message": "同步进行中" + }, "syncWithMobile": { "message": "使用移动设备同步" }, @@ -1748,6 +3065,9 @@ "thisWillCreate": { "message": "将为您创建新的钱包账户和账户助记词" }, + "time": { + "message": "时间" + }, "tips": { "message": "小贴士" }, @@ -1758,6 +3078,10 @@ "message": "至:$1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, + "toggleTestNetworks": { + "message": "$1 测试网络", + "description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open to the advanced settings where users can enable the display of test networks in the network dropdown." + }, "token": { "message": "代币" }, @@ -1767,9 +3091,18 @@ "tokenContractAddress": { "message": "代币合约地址" }, + "tokenDecimalFetchFailed": { + "message": "需要代币十进制。" + }, + "tokenDetectionAnnouncement": { + "message": "新功能!改进的代币检测可以作为实验功能在Ethereum Mainnet上进行。$1" + }, "tokenSymbol": { "message": "代币符号" }, + "tooltipApproveButton": { + "message": "我了解" + }, "total": { "message": "总额" }, @@ -1788,6 +3121,48 @@ "transactionCreated": { "message": "交易已创建 $2,交易数额:$1。" }, + "transactionData": { + "message": "交易数据" + }, + "transactionDecodingAccreditationDecoded": { + "message": "由Truffle解码" + }, + "transactionDecodingAccreditationVerified": { + "message": "已在$1验证的合同" + }, + "transactionDecodingUnsupportedNetworkError": { + "message": "交易解码对链ID $1不可用" + }, + "transactionDetailDappGasMoreInfo": { + "message": "推荐站点" + }, + "transactionDetailDappGasTooltip": { + "message": "编辑以使用MetaMask基于最新区块的推荐燃料费。" + }, + "transactionDetailGasHeading": { + "message": "估计燃料费用" + }, + "transactionDetailGasInfoV2": { + "message": "估计" + }, + "transactionDetailGasTooltipConversion": { + "message": "了解更多关于燃料费用的信息" + }, + "transactionDetailGasTooltipExplanation": { + "message": "燃料费用由网络设定,并根据网络流量和交易复杂性产生波动。" + }, + "transactionDetailGasTooltipIntro": { + "message": "燃料费用支付给在$1网络上处理交易的加密矿工。MetaMask不会从燃料费用中获利。" + }, + "transactionDetailGasTotalSubtitle": { + "message": "金额 + 燃料费" + }, + "transactionDetailLayer2GasHeading": { + "message": "2层燃料费用" + }, + "transactionDetailMultiLayerTotalSubtitle": { + "message": "金额 + 费用" + }, "transactionDropped": { "message": "交易终止 $2。" }, @@ -1803,6 +3178,27 @@ "transactionFee": { "message": "交易费" }, + "transactionHistoryBaseFee": { + "message": "基本费用 (GWEI)" + }, + "transactionHistoryL1GasLabel": { + "message": "总共L1煤气费" + }, + "transactionHistoryL2GasLimitLabel": { + "message": "L2 燃料限制" + }, + "transactionHistoryL2GasPriceLabel": { + "message": "L2 燃料价格" + }, + "transactionHistoryMaxFeePerGas": { + "message": "每燃料的最大费用" + }, + "transactionHistoryPriorityFee": { + "message": "优先费用(GWEI)" + }, + "transactionHistoryTotalGasFee": { + "message": "总共煤气费" + }, "transactionResubmitted": { "message": "重新提交交易 $2,交易费升至:$1。" }, @@ -1829,12 +3225,31 @@ "message": "我们无法加载您的代币余额。您可以查看它们", "description": "Followed by a link (here) to view token balances" }, + "trustSiteApprovePermission": { + "message": "通过授予许可,您正在允许以下$1访问您的资金" + }, "tryAgain": { "message": "重试" }, + "tryAnywayOption": { + "message": "我仍然会试" + }, + "turnOnTokenDetection": { + "message": "打开增强代币检测" + }, + "twelveHrTitle": { + "message": "12小时:" + }, + "txInsightsNotSupported": { + "message": "此时此合同不支持交易见解。" + }, "typePassword": { "message": "输入您的 MetaMask 密码" }, + "u2f": { + "message": "U2F", + "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." + }, "unapproved": { "message": "未批准" }, @@ -1865,6 +3280,18 @@ "unlockMessage": { "message": "即将进入去中心化网络" }, + "unrecognizedChain": { + "message": "这个自定义网络无法识别。我们建议您在继续操作之前$1", + "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." + }, + "unrecognizedChainLinkText": { + "message": "验证网络详细信息", + "description": "Serves as link text for the 'unrecognizedChain' key. This text will be embedded inside the translation for that key." + }, + "unsendableAsset": { + "message": "当前不支持发送可收藏的 (ERC-721) 代币", + "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" + }, "updatedWithDate": { "message": "已更新 $1" }, @@ -1874,44 +3301,140 @@ "urlExistsErrorMsg": { "message": "URL 已经存在于现有的网络列表中" }, + "useCollectibleDetection": { + "message": "自动检测 NFT" + }, + "useCollectibleDetectionDescription": { + "message": "显示 NFTs 媒体和数据可能会将您的 IP 地址暴露于中央服务器。第三方API(例如OpenSea)用于在您的钱包中检测NFT。 这将显示您的账户地址与这些服务。如果您不想让应用程序从这些服务中拉取数据,请将其禁用。" + }, "usePhishingDetection": { "message": "使用网络钓鱼检测" }, "usePhishingDetectionDescription": { "message": "显示针对 Ethereum 用户钓鱼域名的警告。" }, + "useTokenDetection": { + "message": "使用代币检测" + }, + "useTokenDetectionDescription": { + "message": "我们使用第三方API来检测和显示发送到您钱包的新代币。 如果您不想从这些服务中拉取数据,请关闭" + }, "usedByClients": { "message": "可用于各种不同的客户端" }, "userName": { "message": "名称" }, + "verifyThisTokenDecimalOn": { + "message": "代币小数在$1上找到", + "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" + }, "verifyThisTokenOn": { "message": "在 $1 上验证此代币", "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" }, + "verifyThisUnconfirmedTokenOn": { + "message": "在$1上验证此代币,并确保这是您想要交易的代币。", + "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" + }, "viewAccount": { "message": "查看账户" }, + "viewAllDetails": { + "message": "查看所有详细信息" + }, "viewContact": { "message": "查看联系人" }, + "viewFullTransactionDetails": { + "message": "查看全部交易详情" + }, + "viewMore": { + "message": "查看更多" + }, + "viewOnBlockExplorer": { + "message": "在区块浏览器上查看" + }, + "viewOnCustomBlockExplorer": { + "message": "在 $2 查看 $1", + "description": "$1 is the action type. e.g (Account, Transaction, Swap) and $2 is the Custom Block Exporer URL" + }, + "viewOnEtherscan": { + "message": "在Etherscan上查看$1", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, + "viewOnOpensea": { + "message": "在Opensea上查看" + }, + "viewinExplorer": { + "message": "在资源管理器中查看 $1", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, "visitWebSite": { "message": "访问我们的网站" }, "walletConnectionGuide": { "message": "我们的硬件钱包连接指南" }, + "walletCreationSuccessDetail": { + "message": "您已经成功地保护了您的钱包。请确保您的账户助记词安全和秘密——这是您的责任!" + }, + "walletCreationSuccessReminder1": { + "message": "MetaMask无法恢复您的账户助记词。" + }, + "walletCreationSuccessReminder2": { + "message": "MetaMask团队将永远不会询问您账户助记词." + }, + "walletCreationSuccessReminder3": { + "message": "对任何人$1或有可能被盗用您的资金", + "description": "$1 is separated as walletCreationSuccessReminder3BoldSection so that we can bold it" + }, + "walletCreationSuccessReminder3BoldSection": { + "message": "永远不要与任何人分享您的账户助记词", + "description": "This string is localized separately from walletCreationSuccessReminder3 so that we can bold it" + }, + "walletCreationSuccessTitle": { + "message": "钱包创建成功" + }, + "walletSeedRestore": { + "message": "钱包账户助记词" + }, "web3ShimUsageNotification": { "message": "我们发现当前的网站尝试使用已经删除的 window.web3 API。如果这个网站网站已经无法正常使用,请点击 $1 获取更多信息。", "description": "$1 is a clickable link." }, + "webhid": { + "message": "WebHID", + "description": "Refers to a interface for connecting external devices to the browser. Used for connecting ledger to the browser. Read more here https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API" + }, "welcome": { "message": "欢迎使用 MetaMask" }, "welcomeBack": { "message": "欢迎回来!" }, + "welcomeExploreDescription": { + "message": "存储、发送和使用加密货币和资产。" + }, + "welcomeExploreTitle": { + "message": "探索去中心化应用" + }, + "welcomeLoginDescription": { + "message": "使用您的 MetaMask登录到去中心化的应用 - 无需注册。" + }, + "welcomeLoginTitle": { + "message": "对您的钱包说您好吧" + }, + "welcomeToMetaMask": { + "message": "让我们开始吧" + }, + "welcomeToMetaMaskIntro": { + "message": "MetaMask受数百万人信任,是一个安全的钱包,使所有人都能访问web3。" + }, + "whatsNew": { + "message": "新功能", + "description": "This is the title of a popup that gives users notifications about new features and updates to MetaMask." + }, "whatsThis": { "message": "这是什么?" }, @@ -1922,6 +3445,10 @@ "message": "$1 / $2", "description": "$1 and $2 are intended to be two numbers, where $2 is a total, and $1 is a count towards that total" }, + "xOfYPending": { + "message": "$1 / $2待处理", + "description": "$1 and $2 are intended to be two numbers, where $2 is a total number of pending confirmations, and $1 is a count towards that total" + }, "yesLetsTry": { "message": "是的,尝试下" }, From 241ee2f1d94edcdfaea9d0e5b5c94d7d7b633ca2 Mon Sep 17 00:00:00 2001 From: ryanml Date: Thu, 27 Jan 2022 15:50:42 -0700 Subject: [PATCH 056/115] Fix policies --- lavamoat/browserify/beta/policy.json | 1 + lavamoat/browserify/flask/policy.json | 1 + lavamoat/browserify/main/policy.json | 1 + lavamoat/build-system/policy.json | 201 ++++++++++++++++++++++++++ package.json | 1 - 5 files changed, 204 insertions(+), 1 deletion(-) diff --git a/lavamoat/browserify/beta/policy.json b/lavamoat/browserify/beta/policy.json index 0b8705b65..27fbf0195 100644 --- a/lavamoat/browserify/beta/policy.json +++ b/lavamoat/browserify/beta/policy.json @@ -3649,6 +3649,7 @@ "document": true, "jQuery": true, "localStorage": true, + "location": true, "navigator": true, "postMessage": true, "removeEventListener": true, diff --git a/lavamoat/browserify/flask/policy.json b/lavamoat/browserify/flask/policy.json index 0b8705b65..27fbf0195 100644 --- a/lavamoat/browserify/flask/policy.json +++ b/lavamoat/browserify/flask/policy.json @@ -3649,6 +3649,7 @@ "document": true, "jQuery": true, "localStorage": true, + "location": true, "navigator": true, "postMessage": true, "removeEventListener": true, diff --git a/lavamoat/browserify/main/policy.json b/lavamoat/browserify/main/policy.json index 0b8705b65..27fbf0195 100644 --- a/lavamoat/browserify/main/policy.json +++ b/lavamoat/browserify/main/policy.json @@ -3649,6 +3649,7 @@ "document": true, "jQuery": true, "localStorage": true, + "location": true, "navigator": true, "postMessage": true, "removeEventListener": true, diff --git a/lavamoat/build-system/policy.json b/lavamoat/build-system/policy.json index e95acc4d6..7d6167325 100644 --- a/lavamoat/build-system/policy.json +++ b/lavamoat/build-system/policy.json @@ -1052,6 +1052,16 @@ "buffer-equal": true } }, + "are-we-there-yet": { + "builtin": { + "events.EventEmitter": true, + "util.inherits": true + }, + "packages": { + "delegates": true, + "readable-stream": true + } + }, "arr-diff": { "packages": { "arr-flatten": true, @@ -1460,6 +1470,7 @@ "anymatch": true, "async-each": true, "braces": true, + "fsevents": true, "glob-parent": true, "inherits": true, "is-binary-path": true, @@ -1726,6 +1737,16 @@ "through2": true } }, + "detect-libc": { + "builtin": { + "child_process.spawnSync": true, + "fs.readdirSync": true, + "os.platform": true + }, + "globals": { + "process.env": true + } + }, "detective": { "packages": { "acorn-node": true, @@ -2429,6 +2450,45 @@ "process.version": true } }, + "fsevents": { + "builtin": { + "events.EventEmitter": true, + "fs.stat": true, + "path.join": true, + "util.inherits": true + }, + "globals": { + "__dirname": true, + "process.nextTick": true, + "process.platform": true, + "setImmediate": true + }, + "native": true, + "packages": { + "node-pre-gyp": true + } + }, + "gauge": { + "builtin": { + "util.format": true + }, + "globals": { + "clearInterval": true, + "process": true, + "setImmediate": true, + "setInterval": true + }, + "packages": { + "aproba": true, + "console-control-strings": true, + "has-unicode": true, + "object-assign": true, + "signal-exit": true, + "string-width": true, + "strip-ansi": true, + "wide-align": true + } + }, "get-assigned-identifiers": { "builtin": { "assert.equal": true @@ -2807,6 +2867,16 @@ "process.argv": true } }, + "has-unicode": { + "builtin": { + "os.type": true + }, + "globals": { + "process.env.LANG": true, + "process.env.LC_ALL": true, + "process.env.LC_CTYPE": true + } + }, "has-value": { "packages": { "get-value": true, @@ -2978,6 +3048,11 @@ "is-plain-object": true } }, + "is-fullwidth-code-point": { + "packages": { + "number-is-nan": true + } + }, "is-glob": { "packages": { "is-extglob": true @@ -3508,6 +3583,56 @@ "setTimeout": true } }, + "node-pre-gyp": { + "builtin": { + "events.EventEmitter": true, + "fs.existsSync": true, + "fs.readFileSync": true, + "fs.renameSync": true, + "path.dirname": true, + "path.existsSync": true, + "path.join": true, + "path.resolve": true, + "url.parse": true, + "url.resolve": true, + "util.inherits": true + }, + "globals": { + "__dirname": true, + "console.log": true, + "process.arch": true, + "process.cwd": true, + "process.env": true, + "process.platform": true, + "process.version.substr": true, + "process.versions": true + }, + "packages": { + "detect-libc": true, + "nopt": true, + "npmlog": true, + "rimraf": true, + "semver": true + } + }, + "nopt": { + "builtin": { + "path": true, + "stream.Stream": true, + "url": true + }, + "globals": { + "console": true, + "process.argv": true, + "process.env.DEBUG_NOPT": true, + "process.env.NOPT_DEBUG": true, + "process.platform": true + }, + "packages": { + "abbrev": true, + "osenv": true + } + }, "normalize-package-data": { "builtin": { "url.parse": true, @@ -3535,6 +3660,22 @@ "once": true } }, + "npmlog": { + "builtin": { + "events.EventEmitter": true, + "util": true + }, + "globals": { + "process.nextTick": true, + "process.stderr": true + }, + "packages": { + "are-we-there-yet": true, + "console-control-strings": true, + "gauge": true, + "set-blocking": true + } + }, "object-copy": { "packages": { "copy-descriptor": true, @@ -3616,6 +3757,54 @@ "readable-stream": true } }, + "os-homedir": { + "builtin": { + "os.homedir": true + }, + "globals": { + "process.env": true, + "process.getuid": true, + "process.platform": true + } + }, + "os-tmpdir": { + "globals": { + "process.env.SystemRoot": true, + "process.env.TEMP": true, + "process.env.TMP": true, + "process.env.TMPDIR": true, + "process.env.windir": true, + "process.platform": true + } + }, + "osenv": { + "builtin": { + "child_process.exec": true, + "path": true + }, + "globals": { + "process.env.COMPUTERNAME": true, + "process.env.ComSpec": true, + "process.env.EDITOR": true, + "process.env.HOSTNAME": true, + "process.env.PATH": true, + "process.env.PROMPT": true, + "process.env.PS1": true, + "process.env.Path": true, + "process.env.SHELL": true, + "process.env.USER": true, + "process.env.USERDOMAIN": true, + "process.env.USERNAME": true, + "process.env.VISUAL": true, + "process.env.path": true, + "process.nextTick": true, + "process.platform": true + }, + "packages": { + "os-homedir": true, + "os-tmpdir": true + } + }, "p-limit": { "packages": { "p-try": true @@ -4325,6 +4514,12 @@ "lru-cache": true } }, + "set-blocking": { + "globals": { + "process.stderr": true, + "process.stdout": true + } + }, "set-value": { "packages": { "extend-shallow": true, @@ -4588,6 +4783,7 @@ }, "string-width": { "packages": { + "code-point-at": true, "emoji-regex": true, "is-fullwidth-code-point": true, "strip-ansi": true @@ -5240,6 +5436,11 @@ "isexe": true } }, + "wide-align": { + "packages": { + "string-width": true + } + }, "write": { "builtin": { "fs.createWriteStream": true, diff --git a/package.json b/package.json index 8c3d422b4..9cb43e831 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,6 @@ "3box/**/libp2p-crypto/node-forge": "^1.0.0", "3box/**/libp2p-keychain/node-forge": "^1.0.0", "analytics-node/axios": "^0.21.2", - "analytics-node/axios/follow-redirects": "^1.14.7", "ganache-core/lodash": "^4.17.21", "netmask": "^2.0.1", "pubnub/superagent-proxy": "^3.0.0", From 851fce9a3b155265c3eac3efe82474a0181de99e Mon Sep 17 00:00:00 2001 From: David Walsh Date: Fri, 28 Jan 2022 07:46:26 -0600 Subject: [PATCH 057/115] Enable buying MATIC on Polygon, BNB on BSC, AVAX on Avalanche, FTM on Fantom, CELO on Celo, and respective stablecoins on Transak (#13398) --- app/_locales/am/messages.json | 6 - app/_locales/ar/messages.json | 6 - app/_locales/bg/messages.json | 6 - app/_locales/bn/messages.json | 6 - app/_locales/ca/messages.json | 6 - app/_locales/cs/messages.json | 6 - app/_locales/da/messages.json | 6 - app/_locales/de/messages.json | 6 - app/_locales/el/messages.json | 12 -- app/_locales/en/messages.json | 20 +-- app/_locales/es/messages.json | 6 - app/_locales/es_419/messages.json | 6 - app/_locales/et/messages.json | 6 - app/_locales/fa/messages.json | 6 - app/_locales/fi/messages.json | 6 - app/_locales/fil/messages.json | 6 - app/_locales/fr/messages.json | 12 -- app/_locales/he/messages.json | 6 - app/_locales/hi/messages.json | 12 -- app/_locales/hn/messages.json | 6 - app/_locales/hr/messages.json | 6 - app/_locales/ht/messages.json | 6 - app/_locales/hu/messages.json | 6 - app/_locales/id/messages.json | 12 -- app/_locales/it/messages.json | 6 - app/_locales/ja/messages.json | 12 -- app/_locales/kn/messages.json | 6 - app/_locales/ko/messages.json | 12 -- app/_locales/lt/messages.json | 6 - app/_locales/lv/messages.json | 6 - app/_locales/ms/messages.json | 3 - app/_locales/nl/messages.json | 6 - app/_locales/no/messages.json | 6 - app/_locales/ph/messages.json | 6 - app/_locales/pl/messages.json | 6 - app/_locales/pt/messages.json | 6 - app/_locales/pt_BR/messages.json | 6 - app/_locales/ro/messages.json | 6 - app/_locales/ru/messages.json | 12 -- app/_locales/sk/messages.json | 6 - app/_locales/sl/messages.json | 6 - app/_locales/sr/messages.json | 6 - app/_locales/sv/messages.json | 6 - app/_locales/sw/messages.json | 6 - app/_locales/ta/messages.json | 6 - app/_locales/th/messages.json | 6 - app/_locales/tl/messages.json | 12 -- app/_locales/tr/messages.json | 12 -- app/_locales/uk/messages.json | 6 - app/_locales/vi/messages.json | 12 -- app/_locales/zh_CN/messages.json | 12 -- app/_locales/zh_TW/messages.json | 6 - app/scripts/lib/buy-eth-url.test.js | 75 ----------- .../lib/{buy-eth-url.js => buy-url.js} | 19 ++- app/scripts/lib/buy-url.test.js | 117 ++++++++++++++++++ shared/constants/network.js | 58 +++++++++ .../deposit-ether-modal.component.js | 41 +++--- .../deposit-ether-modal.container.js | 6 +- .../app/wallet-overview/eth-overview.js | 8 +- ui/selectors/selectors.js | 11 ++ ui/store/actions.js | 4 +- 61 files changed, 244 insertions(+), 484 deletions(-) delete mode 100644 app/scripts/lib/buy-eth-url.test.js rename app/scripts/lib/{buy-eth-url.js => buy-url.js} (87%) create mode 100644 app/scripts/lib/buy-url.test.js diff --git a/app/_locales/am/messages.json b/app/_locales/am/messages.json index c2def5c2f..6c747ac6e 100644 --- a/app/_locales/am/messages.json +++ b/app/_locales/am/messages.json @@ -283,9 +283,6 @@ "deleteNetworkDescription": { "message": "ይህን አውታረ መረብ ለመሰረዝ እንደሚፈልጉ እርግጠኛ ነዎት?" }, - "depositEther": { - "message": "Ether አስቀምጥ" - }, "details": { "message": "ዝርዝሮች" }, @@ -581,9 +578,6 @@ "myAccounts": { "message": "የእኔ መለያዎች" }, - "needEtherInWallet": { - "message": "MetaMask በመጠቀም ያልተማከሉ መተግበሪያዎች ጋር ግንኙነት ለማድረግ፣ በቋትዎ ውስጥ Ether ያስፈልግዎታል።" - }, "needImportFile": { "message": "የሚያስመጡትን ፋይል መምረጥ አለብዎት።", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/ar/messages.json b/app/_locales/ar/messages.json index ab092254e..b64d23ccb 100644 --- a/app/_locales/ar/messages.json +++ b/app/_locales/ar/messages.json @@ -300,9 +300,6 @@ "deleteNetworkDescription": { "message": "هل أنت متأكد أنك تريد حذف هذه الشبكة؟" }, - "depositEther": { - "message": "إيداع عملة إيثير" - }, "details": { "message": "التفاصيل" }, @@ -597,9 +594,6 @@ "myAccounts": { "message": "حساباتي" }, - "needEtherInWallet": { - "message": "للتفاعل مع التطبيقات اللامركزية باستخدام MetaMask، ستحتاج إلى الإيثير في محفظتك." - }, "needImportFile": { "message": "يلزم تحديد ملف للاستيراد.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/bg/messages.json b/app/_locales/bg/messages.json index 0f8320b6c..ee655931b 100644 --- a/app/_locales/bg/messages.json +++ b/app/_locales/bg/messages.json @@ -292,9 +292,6 @@ "deleteNetworkDescription": { "message": "Наистина ли искате да изтриете тази мрежа?" }, - "depositEther": { - "message": "Депозирайте етер" - }, "details": { "message": "Подробности" }, @@ -592,9 +589,6 @@ "myAccounts": { "message": "Моите акаунти" }, - "needEtherInWallet": { - "message": "За да взаимодействате с децентрализираните приложения, използвайки MetaMask, ще ви е необходим етер в портфейла ви." - }, "needImportFile": { "message": "Трябва да изберете файл за импортиране.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/bn/messages.json b/app/_locales/bn/messages.json index fc3d0bad1..df49e9050 100644 --- a/app/_locales/bn/messages.json +++ b/app/_locales/bn/messages.json @@ -292,9 +292,6 @@ "deleteNetworkDescription": { "message": "আপনি কি এই নেটওয়ার্কটি মোছার বিষয়ে নিশ্চিত?" }, - "depositEther": { - "message": "ইথার জমা করুন" - }, "details": { "message": "বিশদ বিবরণ" }, @@ -596,9 +593,6 @@ "myAccounts": { "message": "আমার অ্যাকাউন্টগুলি" }, - "needEtherInWallet": { - "message": "MetaMask ব্যবহার করে ছড়িয়ে ছিটিয়ে থাকা অ্যাপ্লিকেশনগুলির সাথে যোগাযোগ করতে, আপনার ওয়ালেটে ইথার লাগবে।" - }, "needImportFile": { "message": "আমদানি করার জন্য আপনাকে অবশ্যই একটি ফাইল নির্বাচন করতে হবে।", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/ca/messages.json b/app/_locales/ca/messages.json index 7f901d6a6..bebf48582 100644 --- a/app/_locales/ca/messages.json +++ b/app/_locales/ca/messages.json @@ -289,9 +289,6 @@ "deleteNetworkDescription": { "message": "Estàs segur que vols eliminar aquesta xarxa?" }, - "depositEther": { - "message": "Diposita Ether" - }, "details": { "message": "Detalls" }, @@ -580,9 +577,6 @@ "myAccounts": { "message": "Els meus Comptes" }, - "needEtherInWallet": { - "message": "Per a interactuar amb aplicacions descentralitzades fent servir MetaMask, necessitaràs Ether al teu moneder." - }, "needImportFile": { "message": "Has de seleccionar un arxiu per a importar.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/cs/messages.json b/app/_locales/cs/messages.json index 8fe8abacb..45f437aee 100644 --- a/app/_locales/cs/messages.json +++ b/app/_locales/cs/messages.json @@ -108,9 +108,6 @@ "decimalsMustZerotoTen": { "message": "Desetinných míst musí být od 0 do 36." }, - "depositEther": { - "message": "Vložit Ether" - }, "details": { "message": "Podrobnosti" }, @@ -246,9 +243,6 @@ "myAccounts": { "message": "Moje účty" }, - "needEtherInWallet": { - "message": "Potřebujete Ether v peněžence, abyste mohli pomocí MetaMasku interagovat s decentralizovanými aplikacemi." - }, "needImportFile": { "message": "Musíte zvolit soubor k importu.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/da/messages.json b/app/_locales/da/messages.json index 3041f971b..4a45e5e43 100644 --- a/app/_locales/da/messages.json +++ b/app/_locales/da/messages.json @@ -292,9 +292,6 @@ "deleteNetworkDescription": { "message": "Er du sikker på, at du vil slette dette netværk?" }, - "depositEther": { - "message": "Indbetal Ether" - }, "details": { "message": "Detaljer" }, @@ -580,9 +577,6 @@ "myAccounts": { "message": "Mine Konti" }, - "needEtherInWallet": { - "message": "Du skal have Ether i din tegnebog for at interagere med decentraliserede applikationer, der bruger MetaMask." - }, "needImportFile": { "message": "Du skal vælge en fil, der skal importeres.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/de/messages.json b/app/_locales/de/messages.json index 63ffe3d6e..19e5ecf54 100644 --- a/app/_locales/de/messages.json +++ b/app/_locales/de/messages.json @@ -283,9 +283,6 @@ "deleteNetworkDescription": { "message": "Sind Sie sicher, dass Sie dieses Netzwerk löschen möchten?" }, - "depositEther": { - "message": "Ether einzahlen" - }, "directDepositEther": { "message": "Sofort Ether einzahlen" }, @@ -569,9 +566,6 @@ "myAccounts": { "message": "Meine Accounts" }, - "needEtherInWallet": { - "message": "Um dezentralisierte Applikationen mit MetaMask verwenden zu können, benötigst du Ether in deiner Wallet." - }, "needImportFile": { "message": "Für den Import musst du eine Datei auswählen.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/el/messages.json b/app/_locales/el/messages.json index 9512aa32e..54bfac435 100644 --- a/app/_locales/el/messages.json +++ b/app/_locales/el/messages.json @@ -389,12 +389,6 @@ "buy": { "message": "Αγορά" }, - "buyWithTransak": { - "message": "Αγοράστε ETH με Transak" - }, - "buyWithTransakDescription": { - "message": "Η Transak υποστηρίζει χρεωστική κάρτα και τραπεζικές μεταφορές (ανάλογα με τη τοποθεσία σας) σε 59+ χώρες. Το ETH κατατίθεται στο λογαριασμό σας MetaMask." - }, "buyWithWyre": { "message": "Αγοράστε ETH με το Wyre" }, @@ -721,9 +715,6 @@ "deleteNetworkDescription": { "message": "Θέλετε σίγουρα να διαγράψετε αυτό το δίκτυο;" }, - "depositEther": { - "message": "Κατάθεση Ether" - }, "description": { "message": "Περιγραφή" }, @@ -1702,9 +1693,6 @@ "name": { "message": "Όνομα" }, - "needEtherInWallet": { - "message": "Για να αλληλεπιδράσετε με αποκεντρωμένες εφαρμογές χρησιμοποιώντας το MetaMask, θα χρειαστείτε Ether στο πορτοφόλι σας." - }, "needHelp": { "message": "Χρειάζεστε βοήθεια? Επικοινωνήστε με $1", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index fde592a29..57d75d983 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -389,11 +389,13 @@ "buy": { "message": "Buy" }, - "buyWithTransak": { - "message": "Buy ETH with Transak" + "buyCryptoWithTransak": { + "message": "Buy $1 with Transak", + "description": "$1 represents the cypto symbol to be purchased" }, - "buyWithTransakDescription": { - "message": "Transak supports debit card and bank transfers (depending on location) in 59+ countries. ETH deposits into your MetaMask account." + "buyCryptoWithTransakDescription": { + "message": "Transak supports debit card and bank transfers (depending on location) in 59+ countries. $1 deposits into your MetaMask account.", + "description": "$1 represents the cypto symbol to be purchased" }, "buyWithWyre": { "message": "Buy ETH with Wyre" @@ -745,8 +747,9 @@ "deleteNetworkDescription": { "message": "Are you sure you want to delete this network?" }, - "depositEther": { - "message": "Deposit Ether" + "depositCrypto": { + "message": "Deposit $1", + "description": "$1 represents the cypto symbol to be purchased" }, "description": { "message": "Description" @@ -1796,8 +1799,9 @@ "name": { "message": "Name" }, - "needEtherInWallet": { - "message": "To interact with decentralized applications using MetaMask, you’ll need Ether in your wallet." + "needCryptoInWallet": { + "message": "To interact with decentralized applications using MetaMask, you’ll need $1 in your wallet.", + "description": "$1 represents the cypto symbol to be purchased" }, "needHelp": { "message": "Need help? Contact $1", diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index b02cbb3f7..110ff0fee 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -516,9 +516,6 @@ "deleteNetworkDescription": { "message": "¿Está seguro de que quiere eliminar esta red?" }, - "depositEther": { - "message": "Depositar ether" - }, "details": { "message": "Detalles" }, @@ -1100,9 +1097,6 @@ "name": { "message": "Nombre" }, - "needEtherInWallet": { - "message": "Para interactuar con aplicaciones descentralizadas mediante MetaMask, necesitará ethers en su cartera." - }, "needHelp": { "message": "¿Necesita ayuda? Comuníquese con $1", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" diff --git a/app/_locales/es_419/messages.json b/app/_locales/es_419/messages.json index ec53a44a2..2d0b0c652 100644 --- a/app/_locales/es_419/messages.json +++ b/app/_locales/es_419/messages.json @@ -525,9 +525,6 @@ "deleteNetworkDescription": { "message": "¿Está seguro de que quiere eliminar esta red?" }, - "depositEther": { - "message": "Depositar ether" - }, "details": { "message": "Detalles" }, @@ -1112,9 +1109,6 @@ "name": { "message": "Nombre" }, - "needEtherInWallet": { - "message": "Para interactuar con aplicaciones descentralizadas mediante MetaMask, necesitará ethers en su cartera." - }, "needHelp": { "message": "¿Necesita ayuda? Comuníquese con $1", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" diff --git a/app/_locales/et/messages.json b/app/_locales/et/messages.json index 2a0d62d82..9e60e88de 100644 --- a/app/_locales/et/messages.json +++ b/app/_locales/et/messages.json @@ -292,9 +292,6 @@ "deleteNetworkDescription": { "message": "Olete kindel, et soovite selle võrgu kustutada?" }, - "depositEther": { - "message": "Eetri sissemakse" - }, "details": { "message": "Üksikasjad" }, @@ -586,9 +583,6 @@ "myAccounts": { "message": "Minu kontod" }, - "needEtherInWallet": { - "message": "Selleks, et suhelda MetaMaski abil detsentraliseeritud rakendustega, peab teil rahakotis eetrit olema." - }, "needImportFile": { "message": "Peate importimiseks faili valima.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/fa/messages.json b/app/_locales/fa/messages.json index 19440d60c..8f875e8f9 100644 --- a/app/_locales/fa/messages.json +++ b/app/_locales/fa/messages.json @@ -292,9 +292,6 @@ "deleteNetworkDescription": { "message": "آیا مطمئن هستید که این شبکه حذف شود؟" }, - "depositEther": { - "message": "پرداخت ایتر" - }, "details": { "message": "جزئیات" }, @@ -596,9 +593,6 @@ "myAccounts": { "message": "حساب های من" }, - "needEtherInWallet": { - "message": "برای تعامل با اپلیکیشن های غیر متمرکز شده با استفاده از MetaMask، شما نیاز به ایتر در کیف تان خواهید داشت." - }, "needImportFile": { "message": "شما باید یک فایل برای وارد کردن را انتخاب کنید.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/fi/messages.json b/app/_locales/fi/messages.json index 13307c372..ef644d7ba 100644 --- a/app/_locales/fi/messages.json +++ b/app/_locales/fi/messages.json @@ -292,9 +292,6 @@ "deleteNetworkDescription": { "message": "Haluatko varmasti poistaa tämän verkon?" }, - "depositEther": { - "message": "Talleta Etheriä" - }, "details": { "message": "Tiedot" }, @@ -596,9 +593,6 @@ "myAccounts": { "message": "Omat tilit" }, - "needEtherInWallet": { - "message": "Ollaksesi vuorovaikutuksessa hajautettujen sovellusten kanssa sinulla on oltava lompakossasi Ether." - }, "needImportFile": { "message": "Sinun tarvitsee valita tuotava tiedosto.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/fil/messages.json b/app/_locales/fil/messages.json index 7d85bfe7d..b712d7644 100644 --- a/app/_locales/fil/messages.json +++ b/app/_locales/fil/messages.json @@ -268,9 +268,6 @@ "deleteNetworkDescription": { "message": "Sigurado ka bang gusto mong i-delete ang network na ito?" }, - "depositEther": { - "message": "Magdeposito ng Ether" - }, "details": { "message": "Mga Detalye" }, @@ -534,9 +531,6 @@ "myAccounts": { "message": "Mga Account Ko" }, - "needEtherInWallet": { - "message": "Para gumamit ng mga decentralized na application gamit ang MetaMask, mangangailangan ka ng Ether sa iyong wallet." - }, "needImportFile": { "message": "Dapat kang pumili ng file na ii-import.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json index 7d3fe77dc..0ffc814c2 100644 --- a/app/_locales/fr/messages.json +++ b/app/_locales/fr/messages.json @@ -389,12 +389,6 @@ "buy": { "message": "Acheter" }, - "buyWithTransak": { - "message": "Achetez des ETH avec Transak" - }, - "buyWithTransakDescription": { - "message": "Transak prend en charge les cartes de débit et les virements bancaires (en fonction de l’emplacement) dans plus de 59 pays. Les ETH sont ensuite déposés sur votre compte MetaMask." - }, "buyWithWyre": { "message": "Acheter ETH avec Wyre" }, @@ -721,9 +715,6 @@ "deleteNetworkDescription": { "message": "Êtes-vous sûr de vouloir supprimer ce réseau ?" }, - "depositEther": { - "message": "Déposer de l'Ether" - }, "description": { "message": "Description" }, @@ -1702,9 +1693,6 @@ "name": { "message": "Nom" }, - "needEtherInWallet": { - "message": "Pour interagir avec des applications décentralisées à l'aide de MetaMask, vous avez besoin d'Ether dans votre portefeuille." - }, "needHelp": { "message": "Vous avez besoin d’aide ? Contactez $1", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" diff --git a/app/_locales/he/messages.json b/app/_locales/he/messages.json index 3d0df01d6..5a8a936b3 100644 --- a/app/_locales/he/messages.json +++ b/app/_locales/he/messages.json @@ -292,9 +292,6 @@ "deleteNetworkDescription": { "message": "הנך בטוח/ה שברצונך למחוק רשת זו?" }, - "depositEther": { - "message": "הפקדת את'ר" - }, "details": { "message": "פרטים" }, @@ -593,9 +590,6 @@ "myAccounts": { "message": "החשבונות שלי" }, - "needEtherInWallet": { - "message": "כדי לתקשר עם אפליקציות מבוזרות באמצעות MetaMask, צריך להיות לך את'ר בארנק." - }, "needImportFile": { "message": "יש לבחור קובץ לייצוא.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/hi/messages.json b/app/_locales/hi/messages.json index c70180b6c..a8d4771f6 100644 --- a/app/_locales/hi/messages.json +++ b/app/_locales/hi/messages.json @@ -389,12 +389,6 @@ "buy": { "message": "खरीदें" }, - "buyWithTransak": { - "message": "Transak के साथ ETH खरीदें" - }, - "buyWithTransakDescription": { - "message": "Transak 59+ देशों में डेबिट कार्ड और बैंक हस्तांतरण (स्थान के आधार पर) का समर्थन करता है। ETH आपके MetaMask अकाउंट में जमा करता है।" - }, "buyWithWyre": { "message": "ETH को Wyre साथ खरीदें" }, @@ -721,9 +715,6 @@ "deleteNetworkDescription": { "message": "क्या आप वाकई इस नेटवर्क को हटाना चाहते हैं?" }, - "depositEther": { - "message": "Ether जमा करें" - }, "description": { "message": "विवरण" }, @@ -1702,9 +1693,6 @@ "name": { "message": "नाम" }, - "needEtherInWallet": { - "message": "MetaMask का उपयोग करके विकेंद्रीकृत एप्लिकेशन के साथ सहभागिता करने के लिए, आपको अपने वॉलेट में Ether की आवश्यकता होगी।" - }, "needHelp": { "message": "मदद चाहिए? $1 से संपर्क करें", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" diff --git a/app/_locales/hn/messages.json b/app/_locales/hn/messages.json index 7b80aa545..82883518f 100644 --- a/app/_locales/hn/messages.json +++ b/app/_locales/hn/messages.json @@ -84,9 +84,6 @@ "decimalsMustZerotoTen": { "message": "दशमलव कम से कम 0 होनी चाहिए, और 36 से अधिक नहीं होनी चाहिए।" }, - "depositEther": { - "message": "जमा - Ether" - }, "details": { "message": "संदेश विवरण" }, @@ -223,9 +220,6 @@ "myAccounts": { "message": "मेरे खाते" }, - "needEtherInWallet": { - "message": "मेटामास्क का उपयोग करने वाले विकेन्द्रीकृत अनुप्रयोगों के साथ बातचीत करने के लिए, आपको अपने वॉलेट में ईथर की आवश्यकता होगी।" - }, "needImportFile": { "message": "आयात करने के लिए आपको एक फ़ाइल का चयन करना होगा।", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/hr/messages.json b/app/_locales/hr/messages.json index e325c5d3a..ea8254d9d 100644 --- a/app/_locales/hr/messages.json +++ b/app/_locales/hr/messages.json @@ -292,9 +292,6 @@ "deleteNetworkDescription": { "message": "Sigurno želite izbrisati ovu mrežu?" }, - "depositEther": { - "message": "Položi Ether" - }, "details": { "message": "Detalji" }, @@ -589,9 +586,6 @@ "myAccounts": { "message": "Moji računi" }, - "needEtherInWallet": { - "message": "Trebate Ether u svojem novčaniku kako biste ostvarili interakciju s decentraliziranim aplikacijama uporabom usluge MetaMask. " - }, "needImportFile": { "message": "Morate odabrati datoteku za uvoz.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/ht/messages.json b/app/_locales/ht/messages.json index b599ff203..60edde94d 100644 --- a/app/_locales/ht/messages.json +++ b/app/_locales/ht/messages.json @@ -159,9 +159,6 @@ "decimalsMustZerotoTen": { "message": "Desimal yo dwe omwen 0, epi pa dwe plis pase 36." }, - "depositEther": { - "message": "Depo Ether" - }, "details": { "message": "Detay yo" }, @@ -355,9 +352,6 @@ "myAccounts": { "message": "Kont mwen" }, - "needEtherInWallet": { - "message": "Pou kominike avèk aplikasyon desantralize ou dwe itilize MetaMask, ou pral bezwen Ether nan Wallet ou." - }, "needImportFile": { "message": "Ou dwe chwazi yon dosye pou enpòte.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/hu/messages.json b/app/_locales/hu/messages.json index fc596e0ce..c13dcc19b 100644 --- a/app/_locales/hu/messages.json +++ b/app/_locales/hu/messages.json @@ -292,9 +292,6 @@ "deleteNetworkDescription": { "message": "Biztosan törli ezt a hálózatot?" }, - "depositEther": { - "message": "Ether befizetése" - }, "details": { "message": "Részletek" }, @@ -589,9 +586,6 @@ "myAccounts": { "message": "Fiókjaim" }, - "needEtherInWallet": { - "message": "Ha a MetaMaskon keresztül szeretne interakcióba lépni decentralizált alkalmazással, ahhoz a tárcájában Ethernek kell lennie." - }, "needImportFile": { "message": "Ki kell választania az importálni kívánt fájlt.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/id/messages.json b/app/_locales/id/messages.json index 624d4f4b3..517246dba 100644 --- a/app/_locales/id/messages.json +++ b/app/_locales/id/messages.json @@ -389,12 +389,6 @@ "buy": { "message": "Beli" }, - "buyWithTransak": { - "message": "Beli ETH dengan Transak" - }, - "buyWithTransakDescription": { - "message": "Transak mendukung kartu debit dan transfer bank (tergantung lokasi) di 59+ negara. Deposito ETH ke akun MetaMask Anda." - }, "buyWithWyre": { "message": "Beli ETH dengan Wyre" }, @@ -721,9 +715,6 @@ "deleteNetworkDescription": { "message": "Anda yakin ingin menghapus jaringan ini?" }, - "depositEther": { - "message": "Depositokan Ether" - }, "description": { "message": "Deskripsi" }, @@ -1702,9 +1693,6 @@ "name": { "message": "Nama" }, - "needEtherInWallet": { - "message": "Untuk berinteraksi dengan aplikasi yang terdesentralisasi menggunakan MetaMask, Anda memerlukan Ether di dompet Anda." - }, "needHelp": { "message": "Butuh bantuan? Hubungi $1", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json index 171c4c4d1..7bad7940d 100644 --- a/app/_locales/it/messages.json +++ b/app/_locales/it/messages.json @@ -450,9 +450,6 @@ "deleteNetworkDescription": { "message": "Sei sicuro di voler eliminare questa rete?" }, - "depositEther": { - "message": "Deposita Ether" - }, "details": { "message": "Dettagli" }, @@ -948,9 +945,6 @@ "myAccounts": { "message": "Miei Account" }, - "needEtherInWallet": { - "message": "Per interagire con applicazioni decentralizzate con MetaMask, devi possedere Ether nel tuo portafoglio." - }, "needImportFile": { "message": "Devi selezionare un file da importare.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json index aa098370c..5ee38a574 100644 --- a/app/_locales/ja/messages.json +++ b/app/_locales/ja/messages.json @@ -389,12 +389,6 @@ "buy": { "message": "購入" }, - "buyWithTransak": { - "message": "TransakでETHを購入" - }, - "buyWithTransakDescription": { - "message": "Transakは59か国以上でデビットカードと銀行振込 (場所によって異なります) をサポートしています。ETHはMetaMaskアカウントに入金されます。" - }, "buyWithWyre": { "message": "Wyre で ETH を購入" }, @@ -721,9 +715,6 @@ "deleteNetworkDescription": { "message": "このネットワークを削除しますか?" }, - "depositEther": { - "message": "Ether 入金" - }, "description": { "message": "説明" }, @@ -1702,9 +1693,6 @@ "name": { "message": "名前" }, - "needEtherInWallet": { - "message": "MetaMask を使用して分散型アプリケーションとやりとりするには、ウォレットに Ether が必要です。" - }, "needHelp": { "message": "お手伝いしましょうか?$1 に連絡", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" diff --git a/app/_locales/kn/messages.json b/app/_locales/kn/messages.json index 7d0deac75..5126c5b97 100644 --- a/app/_locales/kn/messages.json +++ b/app/_locales/kn/messages.json @@ -292,9 +292,6 @@ "deleteNetworkDescription": { "message": "ನೀವು ಈ ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ಖಚಿತವಾಗಿ ಅಳಿಸಲು ಬಯಸುತ್ತೀರಾ?" }, - "depositEther": { - "message": "ಎಥರ್ ಠೇವಣಿ ಮಾಡಿ" - }, "details": { "message": "ವಿವರಗಳು" }, @@ -596,9 +593,6 @@ "myAccounts": { "message": "ನನ್ನ ಖಾತೆಗಳು" }, - "needEtherInWallet": { - "message": "MetaMask ಬಳಸಿಕೊಂಡು ವಿಕೇಂದ್ರೀಕೃತ ಖಾತೆಗಳೊಂದಿಗೆ ಸಂವಹನ ನಡೆಸಲು, ನಿಮ್ಮ ವ್ಯಾಲೆಟ್‌ನಲ್ಲಿ ನಿಮಗೆ ಎಥರ್ ಅಗತ್ಯವಿದೆ." - }, "needImportFile": { "message": "ಆಮದು ಮಾಡಲು ನೀವು ಫೈಲ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಬೇಕು.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index d6663d856..5e0f350f8 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -389,12 +389,6 @@ "buy": { "message": "구매" }, - "buyWithTransak": { - "message": "Transak으로 ETH 구매" - }, - "buyWithTransakDescription": { - "message": "Transak은 59개 이상의 국가에서 직불 카드 및 은행 송금(지역에 따라 다름)을 지원합니다. ETH는 메타마스크 계정에 예치됩니다." - }, "buyWithWyre": { "message": "Wyre로 ETH 구매" }, @@ -721,9 +715,6 @@ "deleteNetworkDescription": { "message": "이 네트워크를 삭제하시겠어요?" }, - "depositEther": { - "message": "Ether 예치" - }, "description": { "message": "설명" }, @@ -1702,9 +1693,6 @@ "name": { "message": "이름" }, - "needEtherInWallet": { - "message": "MetaMask를 이용하는 분산형 애플리케이션과 상호작용하려면 지갑에 Ether가 있어야 합니다." - }, "needHelp": { "message": "도움이 필요하신가요? $1에 문의하세요.", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" diff --git a/app/_locales/lt/messages.json b/app/_locales/lt/messages.json index 28ae956e0..9a6df90fd 100644 --- a/app/_locales/lt/messages.json +++ b/app/_locales/lt/messages.json @@ -292,9 +292,6 @@ "deleteNetworkDescription": { "message": "Ar tikrai norite panaikinti šį tinklą?" }, - "depositEther": { - "message": "Įnešti eterių" - }, "details": { "message": "Išsami informacija" }, @@ -596,9 +593,6 @@ "myAccounts": { "message": "Mano paskyros" }, - "needEtherInWallet": { - "message": "Norėdami dirbti su decentralizuotomis programomis „MetaMask“, savo piniginėje turite turėti eterių." - }, "needImportFile": { "message": "Turite pasirinkti failą, kurį pageidaujate importuoti.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/lv/messages.json b/app/_locales/lv/messages.json index a0cc249fa..fea8634a8 100644 --- a/app/_locales/lv/messages.json +++ b/app/_locales/lv/messages.json @@ -292,9 +292,6 @@ "deleteNetworkDescription": { "message": "Vai tiešām vēlaties dzēst šo tīklu?" }, - "depositEther": { - "message": "Noguldīt Ether" - }, "details": { "message": "Informācija" }, @@ -592,9 +589,6 @@ "myAccounts": { "message": "Mani konti" }, - "needEtherInWallet": { - "message": "Lai izmantotu decentralizētas lietotnes ar MetaMask, jūsu makā jābūt Ether." - }, "needImportFile": { "message": "Jums jāatlasa fails, ko importēt", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/ms/messages.json b/app/_locales/ms/messages.json index 345b85195..af2f7244e 100644 --- a/app/_locales/ms/messages.json +++ b/app/_locales/ms/messages.json @@ -576,9 +576,6 @@ "myAccounts": { "message": "Akaun Saya" }, - "needEtherInWallet": { - "message": "Untuk berinteraksi dengan aplikasi ternyahpusat menggunakan MetaMask, anda memerlukan Ether di dalam dompet anda." - }, "needImportFile": { "message": "Anda mesti pilih fail untuk diimport.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/nl/messages.json b/app/_locales/nl/messages.json index e4031f28f..af0b7a014 100644 --- a/app/_locales/nl/messages.json +++ b/app/_locales/nl/messages.json @@ -84,9 +84,6 @@ "decimalsMustZerotoTen": { "message": "Decimalen moeten minimaal 0 en niet meer dan 36 zijn." }, - "depositEther": { - "message": "Stort Ether" - }, "directDepositEther": { "message": "Directe Ether storten" }, @@ -217,9 +214,6 @@ "myAccounts": { "message": "Mijn accounts" }, - "needEtherInWallet": { - "message": "Om te communiceren met gedecentraliseerde applicaties met MetaMask, heb je Ether nodig in je portemonnee." - }, "needImportFile": { "message": "U moet een bestand selecteren om te importeren.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/no/messages.json b/app/_locales/no/messages.json index e35df3860..4c17be907 100644 --- a/app/_locales/no/messages.json +++ b/app/_locales/no/messages.json @@ -289,9 +289,6 @@ "deleteNetworkDescription": { "message": "Er du sikker på at du vil slette dette nettverket?" }, - "depositEther": { - "message": "Sett inn Ether " - }, "details": { "message": "Detaljer" }, @@ -583,9 +580,6 @@ "myAccounts": { "message": "Mine kontoer " }, - "needEtherInWallet": { - "message": "Du må ha Ether i lommeboken din for å samhandle med desentraliserte applikasjoner gjennom MateMask." - }, "needImportFile": { "message": "Du må velge en fil å importere.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/ph/messages.json b/app/_locales/ph/messages.json index 2adc639a0..5aff3d204 100644 --- a/app/_locales/ph/messages.json +++ b/app/_locales/ph/messages.json @@ -519,9 +519,6 @@ "deleteNetworkDescription": { "message": "Sigurado ka bang gusto mong i-delete ang network na ito?" }, - "depositEther": { - "message": "Mag-deposit ng Ether" - }, "details": { "message": "Mga Detalye" }, @@ -1116,9 +1113,6 @@ "name": { "message": "Pangalan" }, - "needEtherInWallet": { - "message": "Para makaugnayan ang mga decentralized na application gamit ang MetaMask, kakailanganin mo ang Ether sa iyong wallet." - }, "needHelp": { "message": "Kailangan ng tulong? Makipag-ugnayan sa $1", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" diff --git a/app/_locales/pl/messages.json b/app/_locales/pl/messages.json index f496aaff4..13a43808b 100644 --- a/app/_locales/pl/messages.json +++ b/app/_locales/pl/messages.json @@ -292,9 +292,6 @@ "deleteNetworkDescription": { "message": "Czy na pewno chcesz usunąć tę sieć?" }, - "depositEther": { - "message": "Zdeponuj Eter" - }, "details": { "message": "Szczegóły" }, @@ -593,9 +590,6 @@ "myAccounts": { "message": "Moje konta" }, - "needEtherInWallet": { - "message": "Żeby skorzystać ze zdecentraliowanych aplikacji (dApps) przy pomocy MetaMask, potrzebujesz Eteru w swoim portfelu." - }, "needImportFile": { "message": "Musisz wybrać plik do zaimportowania.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/pt/messages.json b/app/_locales/pt/messages.json index 4cf536f08..55196d7b5 100644 --- a/app/_locales/pt/messages.json +++ b/app/_locales/pt/messages.json @@ -84,9 +84,6 @@ "decimalsMustZerotoTen": { "message": "Decimais devem ser no mínimo 0 e não passar de 36." }, - "depositEther": { - "message": "Depositar Ether" - }, "details": { "message": "Detalhes" }, @@ -220,9 +217,6 @@ "myAccounts": { "message": "As minhas contas" }, - "needEtherInWallet": { - "message": "Para interagir com applicações descentralizadas usando MetaMask tem de ter Ether na sua carteira." - }, "needImportFile": { "message": "Deve selecionar um ficheiro para importar.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/pt_BR/messages.json b/app/_locales/pt_BR/messages.json index be2b97bbc..8fc76849b 100644 --- a/app/_locales/pt_BR/messages.json +++ b/app/_locales/pt_BR/messages.json @@ -519,9 +519,6 @@ "deleteNetworkDescription": { "message": "Tem certeza de que deseja excluir esta rede?" }, - "depositEther": { - "message": "Depositar ether" - }, "details": { "message": "Detalhes" }, @@ -1100,9 +1097,6 @@ "name": { "message": "Nome" }, - "needEtherInWallet": { - "message": "Para interagir com aplicativos descentralizados usando o MetaMask, você precisará de ethers na sua carteira." - }, "needHelp": { "message": "Precisa de ajuda? Contato $1", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" diff --git a/app/_locales/ro/messages.json b/app/_locales/ro/messages.json index f5ab292b9..21fe2cafe 100644 --- a/app/_locales/ro/messages.json +++ b/app/_locales/ro/messages.json @@ -292,9 +292,6 @@ "deleteNetworkDescription": { "message": "Sigur vreți să ștergeți această rețea?" }, - "depositEther": { - "message": "Depuneți Ether" - }, "details": { "message": "Detalii" }, @@ -583,9 +580,6 @@ "myAccounts": { "message": "Conturile mele" }, - "needEtherInWallet": { - "message": "Pentru a interacționa cu aplicațiile descentralizate prin intermediul MetaMask, trebuie să aveți Ether în portofel." - }, "needImportFile": { "message": "Trebuie să selectați un fișier pentru importare.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json index 0b2d31fd2..75eec4dad 100644 --- a/app/_locales/ru/messages.json +++ b/app/_locales/ru/messages.json @@ -389,12 +389,6 @@ "buy": { "message": "Купить" }, - "buyWithTransak": { - "message": "Купить ETH с помощью Transak" - }, - "buyWithTransakDescription": { - "message": "Transak поддерживает дебетовые карты и банковские переводы (в зависимости от местоположения) в 59 странах. ETH будут зачислены на ваш счет MetaMask." - }, "buyWithWyre": { "message": "Купить ETH с Wyre" }, @@ -721,9 +715,6 @@ "deleteNetworkDescription": { "message": "Вы уверены, что хотите удалить эту сеть?" }, - "depositEther": { - "message": "Внести Ether" - }, "description": { "message": "Описание" }, @@ -1702,9 +1693,6 @@ "name": { "message": "Название" }, - "needEtherInWallet": { - "message": "Для взаимодействия с децентрализованными приложениями с помощью MetaMask вам понадобится Ether в вашем кошельке." - }, "needHelp": { "message": "Нужна помощь? Обратитесь в $1", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" diff --git a/app/_locales/sk/messages.json b/app/_locales/sk/messages.json index 082edfbb8..1b7217cad 100644 --- a/app/_locales/sk/messages.json +++ b/app/_locales/sk/messages.json @@ -286,9 +286,6 @@ "deleteNetworkDescription": { "message": "Naozaj chcete túto sieť odstrániť?" }, - "depositEther": { - "message": "Vložit Ether" - }, "details": { "message": "Podrobnosti" }, @@ -568,9 +565,6 @@ "myAccounts": { "message": "Moje účty" }, - "needEtherInWallet": { - "message": "Potřebujete Ether v peněžence, abyste mohli pomocí MetaMasku interagovat s decentralizovanými aplikacemi." - }, "needImportFile": { "message": "Musíte zvolit soubor k importu.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/sl/messages.json b/app/_locales/sl/messages.json index 46bb81738..75ce873a5 100644 --- a/app/_locales/sl/messages.json +++ b/app/_locales/sl/messages.json @@ -292,9 +292,6 @@ "deleteNetworkDescription": { "message": "Ali ste prepričani, da želite izbrisati to omrežje?" }, - "depositEther": { - "message": "Vplačilo ethra" - }, "details": { "message": "Podrobnosti" }, @@ -584,9 +581,6 @@ "myAccounts": { "message": "Moji računi" }, - "needEtherInWallet": { - "message": "Za interakcijo z decentraliziranimi aplikacijami boste v svoji denarnici potrebovali Eter." - }, "needImportFile": { "message": "Za uvoz morate izbrati datoteko.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/sr/messages.json b/app/_locales/sr/messages.json index 6318ff1b9..7f6354378 100644 --- a/app/_locales/sr/messages.json +++ b/app/_locales/sr/messages.json @@ -289,9 +289,6 @@ "deleteNetworkDescription": { "message": "Da li ste sigurni da želite da izbrišete ovu mrežu?" }, - "depositEther": { - "message": "Dajte depozit Ether-u" - }, "details": { "message": "Детаљи" }, @@ -587,9 +584,6 @@ "myAccounts": { "message": "Moji nalozi" }, - "needEtherInWallet": { - "message": "Da biste stupili u interakciju sa decentralizovanim aplikacijama koristeći MetaMask, biće vam potreban Ether u vašem novčaniku." - }, "needImportFile": { "message": "Morate izabrati fajl koji ćete uvesti.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/sv/messages.json b/app/_locales/sv/messages.json index fb176bad3..22930ea92 100644 --- a/app/_locales/sv/messages.json +++ b/app/_locales/sv/messages.json @@ -286,9 +286,6 @@ "deleteNetworkDescription": { "message": "Är du säker på att du vill ta bort detta nätverk?" }, - "depositEther": { - "message": "Sätt in Ether" - }, "details": { "message": "Info" }, @@ -580,9 +577,6 @@ "myAccounts": { "message": "Mina konton" }, - "needEtherInWallet": { - "message": "För att interagera med decentraliserade applikationer med MetaMask behöver du Ether i din plånbok." - }, "needImportFile": { "message": "Du måste välja en fil att importera.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/sw/messages.json b/app/_locales/sw/messages.json index aaa50bfee..01ad96959 100644 --- a/app/_locales/sw/messages.json +++ b/app/_locales/sw/messages.json @@ -286,9 +286,6 @@ "deleteNetworkDescription": { "message": "Una uhakika unataka kufuta mtandao huu?" }, - "depositEther": { - "message": "Weka Ether" - }, "details": { "message": "Maelezo" }, @@ -574,9 +571,6 @@ "myAccounts": { "message": "Akaunti zangu" }, - "needEtherInWallet": { - "message": "Ili kuingiliana na programu zilizosambazwa kwa kutumia MetaMask, utahitaji kuwa na Ether kwenye waleti yako." - }, "needImportFile": { "message": "Unapaswa kuchagua faili la kuhamisha.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/ta/messages.json b/app/_locales/ta/messages.json index 3cb67630b..45c32fe84 100644 --- a/app/_locales/ta/messages.json +++ b/app/_locales/ta/messages.json @@ -129,9 +129,6 @@ "delete": { "message": "நீக்கு" }, - "depositEther": { - "message": "வைப்புத்தொகை எதிர் " - }, "details": { "message": "விவரங்கள்" }, @@ -295,9 +292,6 @@ "myAccounts": { "message": "எனது கணக்குகள்" }, - "needEtherInWallet": { - "message": "மேடமஸ்க் ஐ பயன்படுத்தி பரவலாக்கப்பட்ட பயன்பாடுகளுடன் தொடர்பு கொள்ள, உங்கள் பணப்பரிமாற்றத்தில் ஈதர் தேவை." - }, "needImportFile": { "message": "இறக்குமதி செய்ய ஒரு கோப்பை நீங்கள் தேர்ந்தெடுக்க வேண்டும்.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/th/messages.json b/app/_locales/th/messages.json index c33d85790..7cfafedd7 100644 --- a/app/_locales/th/messages.json +++ b/app/_locales/th/messages.json @@ -132,9 +132,6 @@ "deleteNetwork": { "message": "ลบเครือข่าย?" }, - "depositEther": { - "message": "การฝากอีเธอร์" - }, "details": { "message": "รายละเอียด" }, @@ -301,9 +298,6 @@ "myAccounts": { "message": "บัญชีของฉัน" }, - "needEtherInWallet": { - "message": "คุณจะต้องมีอีเธอร์ในกระเป๋าเงินของคุณในการใช้งานกับแอพพลิเคชันแบบกระจายด้วย MetaMask" - }, "needImportFile": { "message": "คุณต้องเลือกไฟล์ที่จะนำเข้า", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/tl/messages.json b/app/_locales/tl/messages.json index 7b9460350..02d2ccda2 100644 --- a/app/_locales/tl/messages.json +++ b/app/_locales/tl/messages.json @@ -389,12 +389,6 @@ "buy": { "message": "Bilhin" }, - "buyWithTransak": { - "message": "Bumili ng ETH gamit ang Transak" - }, - "buyWithTransakDescription": { - "message": "Magagamit sa Transak ang debit card at mga bank transfer (depende sa lokasyon) sa 59+ na bansa. Mga depositong ETH sa iyong MetaMask account." - }, "buyWithWyre": { "message": "Bumili ng ETH gamit ang Wyre" }, @@ -721,9 +715,6 @@ "deleteNetworkDescription": { "message": "Sigurado ka bang gusto mong i-delete ang network na ito?" }, - "depositEther": { - "message": "Mag-deposit ng Ether" - }, "description": { "message": "Deskripsyon" }, @@ -1702,9 +1693,6 @@ "name": { "message": "Pangalan" }, - "needEtherInWallet": { - "message": "Para makaugnayan ang mga decentralized ma application gamit ang MetaMask, kakailanganin mo ang Ether sa iyong wallet." - }, "needHelp": { "message": "Kailangan ng tulong? Kontakin ang $1", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" diff --git a/app/_locales/tr/messages.json b/app/_locales/tr/messages.json index fb58a4f41..42e5c4e2e 100644 --- a/app/_locales/tr/messages.json +++ b/app/_locales/tr/messages.json @@ -389,12 +389,6 @@ "buy": { "message": "Satın Al" }, - "buyWithTransak": { - "message": "Transak ile ETH satın alın" - }, - "buyWithTransakDescription": { - "message": "Transak 59'dan fazla ülkede banka kartı ve banka transferlerini (konuma bağlı olarak) destekler. MetaMask hesabınıza ETH para yatırma işlemleri." - }, "buyWithWyre": { "message": "Wyre ile ETH satın alın" }, @@ -721,9 +715,6 @@ "deleteNetworkDescription": { "message": "Bu ağı silmek istediğinizden emin misiniz?" }, - "depositEther": { - "message": "Ether yatır" - }, "description": { "message": "Açıklama" }, @@ -1702,9 +1693,6 @@ "name": { "message": "Adı" }, - "needEtherInWallet": { - "message": "MetaMask kullanarak merkezi olamayan uygulamalarla etkileşmek için cüzdanınızda Ether bulunmalıdır." - }, "needHelp": { "message": "Yardıma mı ihtiyacınız var? $1 ile iletişim kurun", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" diff --git a/app/_locales/uk/messages.json b/app/_locales/uk/messages.json index 95bded6b8..89c53568d 100644 --- a/app/_locales/uk/messages.json +++ b/app/_locales/uk/messages.json @@ -292,9 +292,6 @@ "deleteNetworkDescription": { "message": "Ви впевнені, що хочете видалити цю мережу?" }, - "depositEther": { - "message": "Депонувати Ether" - }, "details": { "message": "Деталі" }, @@ -596,9 +593,6 @@ "myAccounts": { "message": "Мої облікові записи" }, - "needEtherInWallet": { - "message": "Щоб взаємодіяти з децентралізованими застосунками використовуючи MetaMask, вам буде потрібен Ether у вашому гаманці." - }, "needImportFile": { "message": "Потрібно вибрати файл для імпорту.", "description": "User is important an account and needs to add a file to continue" diff --git a/app/_locales/vi/messages.json b/app/_locales/vi/messages.json index b3d64447e..08e7c9211 100644 --- a/app/_locales/vi/messages.json +++ b/app/_locales/vi/messages.json @@ -389,12 +389,6 @@ "buy": { "message": "Mua" }, - "buyWithTransak": { - "message": "Mua ETH bằng Transak" - }, - "buyWithTransakDescription": { - "message": "Transak hỗ trợ thẻ ghi nợ và chuyển khoản ngân hàng (tùy vào địa điểm) tại hơn 59 quốc gia. Nạp ETH vào tài khoản MetaMask của bạn." - }, "buyWithWyre": { "message": "Mua ETH qua Wyre" }, @@ -721,9 +715,6 @@ "deleteNetworkDescription": { "message": "Bạn có chắc chắn muốn xóa mạng này không?" }, - "depositEther": { - "message": "Nộp Ether" - }, "description": { "message": "Mô tả" }, @@ -1702,9 +1693,6 @@ "name": { "message": "Tên" }, - "needEtherInWallet": { - "message": "Để tương tác với các ứng dụng phi tập trung bằng MetaMask, bạn sẽ cần phải có Ether trong ví của mình." - }, "needHelp": { "message": "Bạn cần trợ giúp? Liên hệ $1", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index a2d28f57e..5d8c4c2a8 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -389,12 +389,6 @@ "buy": { "message": "购买" }, - "buyWithTransak": { - "message": "使用Transak购买ETH" - }, - "buyWithTransakDescription": { - "message": "Transak 支持在59多个国家/地区的借记卡和银行转账(取决于地点)。ETH可存款到您的MetaMask账户。" - }, "buyWithWyre": { "message": "使用 Wyre 购买 ETH" }, @@ -721,9 +715,6 @@ "deleteNetworkDescription": { "message": "是否确认要删除该网络?" }, - "depositEther": { - "message": "存入 Ether" - }, "description": { "message": "描述" }, @@ -1702,9 +1693,6 @@ "name": { "message": "名称" }, - "needEtherInWallet": { - "message": "使用 MetaMask 与分布式应用交互,需要您的钱包里需要有 Ether。" - }, "needHelp": { "message": "需要帮助?请联系 $1", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" diff --git a/app/_locales/zh_TW/messages.json b/app/_locales/zh_TW/messages.json index 0500babae..c662ad2e8 100644 --- a/app/_locales/zh_TW/messages.json +++ b/app/_locales/zh_TW/messages.json @@ -292,9 +292,6 @@ "deleteNetworkDescription": { "message": "你確定要刪除網路嗎?" }, - "depositEther": { - "message": "存入以太幣" - }, "details": { "message": "詳情" }, @@ -590,9 +587,6 @@ "myAccounts": { "message": "我的帳戶" }, - "needEtherInWallet": { - "message": "要使用 MetaMask 存取去中心化應用服務時,您的錢包中需要有以太幣。" - }, "needImportFile": { "message": "您必須選擇一個檔案來匯入", "description": "User is important an account and needs to add a file to continue" diff --git a/app/scripts/lib/buy-eth-url.test.js b/app/scripts/lib/buy-eth-url.test.js deleted file mode 100644 index 4545f36d3..000000000 --- a/app/scripts/lib/buy-eth-url.test.js +++ /dev/null @@ -1,75 +0,0 @@ -import nock from 'nock'; -import { - KOVAN_CHAIN_ID, - MAINNET_CHAIN_ID, - RINKEBY_CHAIN_ID, - ROPSTEN_CHAIN_ID, -} from '../../../shared/constants/network'; -import { TRANSAK_API_KEY } from '../constants/on-ramp'; -import { SWAPS_API_V2_BASE_URL } from '../../../shared/constants/swaps'; -import getBuyEthUrl from './buy-eth-url'; - -const WYRE_ACCOUNT_ID = 'AC-7AG3W4XH4N2'; -const ETH_ADDRESS = '0x0dcd5d886577d5581b0c524242ef2ee70be3e7bc'; -const MAINNET = { - chainId: MAINNET_CHAIN_ID, - amount: 5, - address: ETH_ADDRESS, -}; -const ROPSTEN = { - chainId: ROPSTEN_CHAIN_ID, -}; -const RINKEBY = { - chainId: RINKEBY_CHAIN_ID, -}; -const KOVAN = { - chainId: KOVAN_CHAIN_ID, -}; - -describe('buy-eth-url', () => { - it('returns Wyre url with an ETH address for Ethereum mainnet', async () => { - nock(SWAPS_API_V2_BASE_URL) - .get( - `/networks/1/fiatOnRampUrl?serviceName=wyre&destinationAddress=${ETH_ADDRESS}`, - ) - .reply(200, { - url: `https://pay.sendwyre.com/purchase?accountId=${WYRE_ACCOUNT_ID}&utm_campaign=${WYRE_ACCOUNT_ID}&destCurrency=ETH&utm_medium=widget&paymentMethod=debit-card&reservation=MLZVUF8FMXZUMARJC23B&dest=ethereum%3A${ETH_ADDRESS}&utm_source=checkout`, - }); - const wyreUrl = await getBuyEthUrl(MAINNET); - expect(wyreUrl).toStrictEqual( - `https://pay.sendwyre.com/purchase?accountId=${WYRE_ACCOUNT_ID}&utm_campaign=${WYRE_ACCOUNT_ID}&destCurrency=ETH&utm_medium=widget&paymentMethod=debit-card&reservation=MLZVUF8FMXZUMARJC23B&dest=ethereum%3A${ETH_ADDRESS}&utm_source=checkout`, - ); - nock.cleanAll(); - }); - - it('returns a fallback Wyre url if /orders/reserve API call fails', async () => { - const wyreUrl = await getBuyEthUrl(MAINNET); - - expect(wyreUrl).toStrictEqual( - `https://pay.sendwyre.com/purchase?dest=ethereum:${ETH_ADDRESS}&destCurrency=ETH&accountId=${WYRE_ACCOUNT_ID}&paymentMethod=debit-card`, - ); - }); - - it('returns Transak url with an ETH address for Ethereum mainnet', async () => { - const transakUrl = await getBuyEthUrl({ ...MAINNET, service: 'transak' }); - - expect(transakUrl).toStrictEqual( - `https://global.transak.com/?apiKey=${TRANSAK_API_KEY}&hostURL=https%3A%2F%2Fmetamask.io&defaultCryptoCurrency=ETH&walletAddress=${ETH_ADDRESS}`, - ); - }); - - it('returns metamask ropsten faucet for network 3', async () => { - const ropstenUrl = await getBuyEthUrl(ROPSTEN); - expect(ropstenUrl).toStrictEqual('https://faucet.metamask.io/'); - }); - - it('returns rinkeby dapp for network 4', async () => { - const rinkebyUrl = await getBuyEthUrl(RINKEBY); - expect(rinkebyUrl).toStrictEqual('https://www.rinkeby.io/'); - }); - - it('returns kovan github test faucet for network 42', async () => { - const kovanUrl = await getBuyEthUrl(KOVAN); - expect(kovanUrl).toStrictEqual('https://github.com/kovan-testnet/faucet'); - }); -}); diff --git a/app/scripts/lib/buy-eth-url.js b/app/scripts/lib/buy-url.js similarity index 87% rename from app/scripts/lib/buy-eth-url.js rename to app/scripts/lib/buy-url.js index 8fc6af184..a7f23ccc3 100644 --- a/app/scripts/lib/buy-eth-url.js +++ b/app/scripts/lib/buy-url.js @@ -8,6 +8,7 @@ import { RINKEBY_CHAIN_ID, ROPSTEN_CHAIN_ID, MAINNET_NETWORK_ID, + BUYABLE_CHAINS_MAP, } from '../../../shared/constants/network'; import { SECOND } from '../../../shared/constants/time'; import getFetchWithTimeout from '../../../shared/modules/fetch-with-timeout'; @@ -47,16 +48,22 @@ const createWyrePurchaseUrl = async (address) => { * Create a Transak Checkout URL. * API docs here: https://www.notion.so/Query-Parameters-9ec523df3b874ec58cef4fa3a906f238 * - * @param {string} address - Ethereum destination address + * @param {string} walletAddress - Ethereum destination address + * @param {string} chainId - Current chain ID * @returns String */ -const createTransakUrl = (address) => { +const createTransakUrl = (walletAddress, chainId) => { + const { transakCurrencies, network } = BUYABLE_CHAINS_MAP[chainId]; + const queryParams = new URLSearchParams({ apiKey: TRANSAK_API_KEY, hostURL: 'https://metamask.io', - defaultCryptoCurrency: 'ETH', - walletAddress: address, + cryptoCurrencyList: transakCurrencies.join(','), + defaultCryptoCurrency: transakCurrencies[0], + networks: network, + walletAddress, }); + return `https://global.transak.com/?${queryParams}`; }; @@ -70,7 +77,7 @@ const createTransakUrl = (address) => { * @returns {string|undefined} The url at which the user can access ETH, while in the given chain. If the passed * chainId does not match any of the specified cases, or if no chainId is given, returns undefined. */ -export default async function getBuyEthUrl({ chainId, address, service }) { +export default async function getBuyUrl({ chainId, address, service }) { // default service by network if not specified if (!service) { // eslint-disable-next-line no-param-reassign @@ -81,7 +88,7 @@ export default async function getBuyEthUrl({ chainId, address, service }) { case 'wyre': return await createWyrePurchaseUrl(address); case 'transak': - return createTransakUrl(address); + return createTransakUrl(address, chainId); case 'metamask-faucet': return 'https://faucet.metamask.io/'; case 'rinkeby-faucet': diff --git a/app/scripts/lib/buy-url.test.js b/app/scripts/lib/buy-url.test.js new file mode 100644 index 000000000..71c270fae --- /dev/null +++ b/app/scripts/lib/buy-url.test.js @@ -0,0 +1,117 @@ +import nock from 'nock'; +import { + KOVAN_CHAIN_ID, + MAINNET_CHAIN_ID, + RINKEBY_CHAIN_ID, + ROPSTEN_CHAIN_ID, + BSC_CHAIN_ID, + POLYGON_CHAIN_ID, + ETH_SYMBOL, + BUYABLE_CHAINS_MAP, +} from '../../../shared/constants/network'; +import { TRANSAK_API_KEY } from '../constants/on-ramp'; +import { SWAPS_API_V2_BASE_URL } from '../../../shared/constants/swaps'; +import getBuyUrl from './buy-url'; + +const WYRE_ACCOUNT_ID = 'AC-7AG3W4XH4N2'; +const ETH_ADDRESS = '0x0dcd5d886577d5581b0c524242ef2ee70be3e7bc'; +const MAINNET = { + chainId: MAINNET_CHAIN_ID, + amount: 5, + address: ETH_ADDRESS, +}; +const ROPSTEN = { + chainId: ROPSTEN_CHAIN_ID, +}; +const RINKEBY = { + chainId: RINKEBY_CHAIN_ID, +}; +const KOVAN = { + chainId: KOVAN_CHAIN_ID, +}; +const BSC = { + chainId: BSC_CHAIN_ID, + amount: 5, + address: ETH_ADDRESS, +}; +const POLYGON = { + chainId: POLYGON_CHAIN_ID, + amount: 5, + address: ETH_ADDRESS, +}; + +describe('buy-url', () => { + it('returns Wyre url with an ETH address for Ethereum mainnet', async () => { + nock(SWAPS_API_V2_BASE_URL) + .get( + `/networks/1/fiatOnRampUrl?serviceName=wyre&destinationAddress=${ETH_ADDRESS}`, + ) + .reply(200, { + url: `https://pay.sendwyre.com/purchase?accountId=${WYRE_ACCOUNT_ID}&utm_campaign=${WYRE_ACCOUNT_ID}&destCurrency=${ETH_SYMBOL}&utm_medium=widget&paymentMethod=debit-card&reservation=MLZVUF8FMXZUMARJC23B&dest=ethereum%3A${ETH_ADDRESS}&utm_source=checkout`, + }); + const wyreUrl = await getBuyUrl(MAINNET); + expect(wyreUrl).toStrictEqual( + `https://pay.sendwyre.com/purchase?accountId=${WYRE_ACCOUNT_ID}&utm_campaign=${WYRE_ACCOUNT_ID}&destCurrency=${ETH_SYMBOL}&utm_medium=widget&paymentMethod=debit-card&reservation=MLZVUF8FMXZUMARJC23B&dest=ethereum%3A${ETH_ADDRESS}&utm_source=checkout`, + ); + nock.cleanAll(); + }); + + it('returns a fallback Wyre url if /orders/reserve API call fails', async () => { + const wyreUrl = await getBuyUrl(MAINNET); + + expect(wyreUrl).toStrictEqual( + `https://pay.sendwyre.com/purchase?dest=ethereum:${ETH_ADDRESS}&destCurrency=${ETH_SYMBOL}&accountId=${WYRE_ACCOUNT_ID}&paymentMethod=debit-card`, + ); + }); + + it('returns Transak url with an ETH address for Ethereum mainnet', async () => { + const transakUrl = await getBuyUrl({ ...MAINNET, service: 'transak' }); + const buyableChain = BUYABLE_CHAINS_MAP[MAINNET.chainId]; + const buyableCurrencies = encodeURIComponent( + buyableChain.transakCurrencies.join(','), + ); + + expect(transakUrl).toStrictEqual( + `https://global.transak.com/?apiKey=${TRANSAK_API_KEY}&hostURL=https%3A%2F%2Fmetamask.io&cryptoCurrencyList=${buyableCurrencies}&defaultCryptoCurrency=${buyableChain.transakCurrencies[0]}&networks=${buyableChain.network}&walletAddress=${ETH_ADDRESS}`, + ); + }); + + it('returns Transak url with an BNB address for Binance Smart Chain', async () => { + const transakUrl = await getBuyUrl({ ...BSC, service: 'transak' }); + const buyableChain = BUYABLE_CHAINS_MAP[BSC.chainId]; + const buyableCurrencies = encodeURIComponent( + buyableChain.transakCurrencies.join(','), + ); + + expect(transakUrl).toStrictEqual( + `https://global.transak.com/?apiKey=${TRANSAK_API_KEY}&hostURL=https%3A%2F%2Fmetamask.io&cryptoCurrencyList=${buyableCurrencies}&defaultCryptoCurrency=${buyableChain.transakCurrencies[0]}&networks=${buyableChain.network}&walletAddress=${ETH_ADDRESS}`, + ); + }); + + it('returns Transak url with an MATIC address for Polygon', async () => { + const transakUrl = await getBuyUrl({ ...POLYGON, service: 'transak' }); + const buyableChain = BUYABLE_CHAINS_MAP[POLYGON.chainId]; + const buyableCurrencies = encodeURIComponent( + buyableChain.transakCurrencies.join(','), + ); + + expect(transakUrl).toStrictEqual( + `https://global.transak.com/?apiKey=${TRANSAK_API_KEY}&hostURL=https%3A%2F%2Fmetamask.io&cryptoCurrencyList=${buyableCurrencies}&defaultCryptoCurrency=${buyableChain.transakCurrencies[0]}&networks=${buyableChain.network}&walletAddress=${ETH_ADDRESS}`, + ); + }); + + it('returns metamask ropsten faucet for network 3', async () => { + const ropstenUrl = await getBuyUrl(ROPSTEN); + expect(ropstenUrl).toStrictEqual('https://faucet.metamask.io/'); + }); + + it('returns rinkeby dapp for network 4', async () => { + const rinkebyUrl = await getBuyUrl(RINKEBY); + expect(rinkebyUrl).toStrictEqual('https://www.rinkeby.io/'); + }); + + it('returns kovan github test faucet for network 42', async () => { + const kovanUrl = await getBuyUrl(KOVAN); + expect(kovanUrl).toStrictEqual('https://github.com/kovan-testnet/faucet'); + }); +}); diff --git a/shared/constants/network.js b/shared/constants/network.js index d6dc7c58d..a678dd270 100644 --- a/shared/constants/network.js +++ b/shared/constants/network.js @@ -23,6 +23,9 @@ export const BSC_CHAIN_ID = '0x38'; export const OPTIMISM_CHAIN_ID = '0xa'; export const OPTIMISM_TESTNET_CHAIN_ID = '0x45'; export const POLYGON_CHAIN_ID = '0x89'; +export const AVALANCHE_CHAIN_ID = '0xa86a'; +export const FANTOM_CHAIN_ID = '0xfa'; +export const CELO_CHAIN_ID = '0xa4ec'; /** * The largest possible chain ID we can handle. @@ -53,6 +56,9 @@ export const WETH_SYMBOL = 'WETH'; export const TEST_ETH_SYMBOL = 'TESTETH'; export const BNB_SYMBOL = 'BNB'; export const MATIC_SYMBOL = 'MATIC'; +export const AVALANCHE_SYMBOL = 'AVAX'; +export const FANTOM_SYMBOL = 'FTM'; +export const CELO_SYMBOL = 'CELO'; export const ETH_TOKEN_IMAGE_URL = './images/eth_logo.svg'; export const TEST_ETH_TOKEN_IMAGE_URL = './images/black-eth-logo.svg'; @@ -173,3 +179,55 @@ export const UNSUPPORTED_RPC_METHODS = new Set([ ]); export const IPFS_DEFAULT_GATEWAY_URL = 'dweb.link'; + +// The first item in transakCurrencies must be the +// default crypto currency for the network +const BUYABLE_CHAIN_ETHEREUM_NETWORK_NAME = 'ethereum'; +export const BUYABLE_CHAINS_MAP = { + [MAINNET_CHAIN_ID]: { + nativeCurrency: ETH_SYMBOL, + network: BUYABLE_CHAIN_ETHEREUM_NETWORK_NAME, + transakCurrencies: [ETH_SYMBOL, 'USDT', 'USDC', 'DAI'], + }, + [ROPSTEN_CHAIN_ID]: { + nativeCurrency: ETH_SYMBOL, + network: BUYABLE_CHAIN_ETHEREUM_NETWORK_NAME, + }, + [RINKEBY_CHAIN_ID]: { + nativeCurrency: ETH_SYMBOL, + network: BUYABLE_CHAIN_ETHEREUM_NETWORK_NAME, + }, + [GOERLI_CHAIN_ID]: { + nativeCurrency: ETH_SYMBOL, + network: BUYABLE_CHAIN_ETHEREUM_NETWORK_NAME, + }, + [KOVAN_CHAIN_ID]: { + nativeCurrency: ETH_SYMBOL, + network: BUYABLE_CHAIN_ETHEREUM_NETWORK_NAME, + }, + [BSC_CHAIN_ID]: { + nativeCurrency: BNB_SYMBOL, + network: 'bsc', + transakCurrencies: [BNB_SYMBOL, 'BUSD'], + }, + [POLYGON_CHAIN_ID]: { + nativeCurrency: MATIC_SYMBOL, + network: 'polygon', + transakCurrencies: [MATIC_SYMBOL, 'USDT', 'USDC', 'DAI'], + }, + [AVALANCHE_CHAIN_ID]: { + nativeCurrency: AVALANCHE_SYMBOL, + network: 'avaxcchain', + transakCurrencies: [AVALANCHE_SYMBOL], + }, + [FANTOM_CHAIN_ID]: { + nativeCurrency: FANTOM_SYMBOL, + network: 'fantom', + transakCurrencies: [FANTOM_SYMBOL], + }, + [CELO_CHAIN_ID]: { + nativeCurrency: CELO_SYMBOL, + network: 'celo', + transakCurrencies: [CELO_SYMBOL], + }, +}; diff --git a/ui/components/app/modals/deposit-ether-modal/deposit-ether-modal.component.js b/ui/components/app/modals/deposit-ether-modal/deposit-ether-modal.component.js index 59fb89831..399c3fb44 100644 --- a/ui/components/app/modals/deposit-ether-modal/deposit-ether-modal.component.js +++ b/ui/components/app/modals/deposit-ether-modal/deposit-ether-modal.component.js @@ -1,6 +1,9 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; -import { NETWORK_TO_NAME_MAP } from '../../../../../shared/constants/network'; +import { + NETWORK_TO_NAME_MAP, + BUYABLE_CHAINS_MAP, +} from '../../../../../shared/constants/network'; import Button from '../../../ui/button'; export default class DepositEtherModal extends Component { @@ -13,6 +16,7 @@ export default class DepositEtherModal extends Component { chainId: PropTypes.string.isRequired, isTestnet: PropTypes.bool.isRequired, isMainnet: PropTypes.bool.isRequired, + isBuyableTransakChain: PropTypes.bool.isRequired, toWyre: PropTypes.func.isRequired, toTransak: PropTypes.func.isRequired, address: PropTypes.string.isRequired, @@ -93,17 +97,20 @@ export default class DepositEtherModal extends Component { toFaucet, isTestnet, isMainnet, + isBuyableTransakChain, } = this.props; + const { t } = this.context; const networkName = NETWORK_TO_NAME_MAP[chainId]; + const symbol = BUYABLE_CHAINS_MAP[chainId].nativeCurrency; return (
- {this.context.t('depositEther')} + {t('depositCrypto', [symbol])}
- {this.context.t('needEtherInWallet')} + {t('needCryptoInWallet', [symbol])}
), - title: this.context.t('buyWithWyre'), - text: this.context.t('buyWithWyreDescription'), - buttonLabel: this.context.t('continueToWyre'), + title: t('buyWithWyre'), + text: t('buyWithWyreDescription'), + buttonLabel: t('continueToWyre'), onButtonClick: () => { this.context.metricsEvent({ eventOpts: { @@ -150,9 +157,9 @@ export default class DepositEtherModal extends Component { }} /> ), - title: this.context.t('buyWithTransak'), - text: this.context.t('buyWithTransakDescription'), - buttonLabel: this.context.t('continueToTransak'), + title: t('buyCryptoWithTransak', [symbol]), + text: t('buyCryptoWithTransakDescription', [symbol]), + buttonLabel: t('continueToTransak'), onButtonClick: () => { this.context.metricsEvent({ eventOpts: { @@ -161,9 +168,9 @@ export default class DepositEtherModal extends Component { name: 'Click buy Ether via Transak', }, }); - toTransak(address); + toTransak(address, chainId); }, - hide: !isMainnet, + hide: !isBuyableTransakChain, })} {this.renderRow({ logo: ( @@ -177,17 +184,17 @@ export default class DepositEtherModal extends Component { }} /> ), - title: this.context.t('directDepositEther'), - text: this.context.t('directDepositEtherExplainer'), - buttonLabel: this.context.t('viewAccount'), + title: t('directDepositEther'), + text: t('directDepositEtherExplainer'), + buttonLabel: t('viewAccount'), onButtonClick: () => this.goToAccountDetailsModal(), })} {networkName && this.renderRow({ logo: , - title: this.context.t('testFaucet'), - text: this.context.t('getEtherFromFaucet', [networkName]), - buttonLabel: this.context.t('getEther'), + title: t('testFaucet'), + text: t('getEtherFromFaucet', [networkName]), + buttonLabel: t('getEther'), onButtonClick: () => toFaucet(chainId), hide: !isTestnet, })} diff --git a/ui/components/app/modals/deposit-ether-modal/deposit-ether-modal.container.js b/ui/components/app/modals/deposit-ether-modal/deposit-ether-modal.container.js index 908408ab3..c6eba37b6 100644 --- a/ui/components/app/modals/deposit-ether-modal/deposit-ether-modal.container.js +++ b/ui/components/app/modals/deposit-ether-modal/deposit-ether-modal.container.js @@ -10,6 +10,7 @@ import { getIsMainnet, getCurrentChainId, getSelectedAddress, + getIsBuyableTransakChain, } from '../../../../selectors/selectors'; import DepositEtherModal from './deposit-ether-modal.component'; @@ -19,6 +20,7 @@ function mapStateToProps(state) { isTestnet: getIsTestnet(state), isMainnet: getIsMainnet(state), address: getSelectedAddress(state), + isBuyableTransakChain: getIsBuyableTransakChain(state), }; } @@ -27,8 +29,8 @@ function mapDispatchToProps(dispatch) { toWyre: (address) => { dispatch(buyEth({ service: 'wyre', address })); }, - toTransak: (address) => { - dispatch(buyEth({ service: 'transak', address })); + toTransak: (address, chainId) => { + dispatch(buyEth({ service: 'transak', address, chainId })); }, hideModal: () => { dispatch(hideModal()); diff --git a/ui/components/app/wallet-overview/eth-overview.js b/ui/components/app/wallet-overview/eth-overview.js index 1579c5830..1ecfe4719 100644 --- a/ui/components/app/wallet-overview/eth-overview.js +++ b/ui/components/app/wallet-overview/eth-overview.js @@ -22,11 +22,10 @@ import { isBalanceCached, getSelectedAccount, getShouldShowFiat, - getIsMainnet, - getIsTestnet, getCurrentKeyring, getSwapsDefaultToken, getIsSwapsChain, + getIsBuyableChain, getNativeCurrencyImage, } from '../../../selectors/selectors'; import SwapIcon from '../../ui/icon/swap-icon.component'; @@ -61,9 +60,8 @@ const EthOverview = ({ className }) => { const showFiat = useSelector(getShouldShowFiat); const selectedAccount = useSelector(getSelectedAccount); const { balance } = selectedAccount; - const isMainnetChain = useSelector(getIsMainnet); - const isTestnetChain = useSelector(getIsTestnet); const isSwapsChain = useSelector(getIsSwapsChain); + const isBuyableChain = useSelector(getIsBuyableChain); const primaryTokenImage = useSelector(getNativeCurrencyImage); const enteredSwapsEvent = useNewMetricEvent({ @@ -118,7 +116,7 @@ const EthOverview = ({ className }) => { { depositEvent(); diff --git a/ui/selectors/selectors.js b/ui/selectors/selectors.js index 0c0ce397d..f61daadd2 100644 --- a/ui/selectors/selectors.js +++ b/ui/selectors/selectors.js @@ -7,6 +7,7 @@ import { NATIVE_CURRENCY_TOKEN_IMAGE_MAP, OPTIMISM_CHAIN_ID, OPTIMISM_TESTNET_CHAIN_ID, + BUYABLE_CHAINS_MAP, } from '../../shared/constants/network'; import { KEYRING_TYPES, @@ -626,6 +627,16 @@ export function getIsSwapsChain(state) { return ALLOWED_SWAPS_CHAIN_IDS[chainId]; } +export function getIsBuyableChain(state) { + const chainId = getCurrentChainId(state); + return Object.keys(BUYABLE_CHAINS_MAP).includes(chainId); +} + +export function getIsBuyableTransakChain(state) { + const chainId = getCurrentChainId(state); + return Boolean(BUYABLE_CHAINS_MAP?.[chainId]?.transakCurrencies); +} + export function getNativeCurrencyImage(state) { const nativeCurrency = getNativeCurrency(state).toUpperCase(); return NATIVE_CURRENCY_TOKEN_IMAGE_MAP[nativeCurrency]; diff --git a/ui/store/actions.js b/ui/store/actions.js index 6800a9ced..96226df26 100644 --- a/ui/store/actions.js +++ b/ui/store/actions.js @@ -2,7 +2,7 @@ import pify from 'pify'; import log from 'loglevel'; import { captureException } from '@sentry/browser'; import { capitalize, isEqual } from 'lodash'; -import getBuyEthUrl from '../../app/scripts/lib/buy-eth-url'; +import getBuyUrl from '../../app/scripts/lib/buy-url'; import { fetchLocale, loadRelativeTimeFormatLocaleData, @@ -2002,7 +2002,7 @@ export function showSendTokenPage() { export function buyEth(opts) { return async (dispatch) => { - const url = await getBuyEthUrl(opts); + const url = await getBuyUrl(opts); global.platform.openTab({ url }); dispatch({ type: actionConstants.BUY_ETH, From 3eb99babf27059ce71f76af928bf8468504f6f1d Mon Sep 17 00:00:00 2001 From: yanjade <97837371+yanjade@users.noreply.github.com> Date: Fri, 28 Jan 2022 23:09:07 +0800 Subject: [PATCH 058/115] batch fix misspelling (#13449) --- CHANGELOG.md | 6 +++--- app/scripts/controllers/metametrics.js | 2 +- .../app/edit-gas-fee-button/edit-gas-fee-button.test.js | 2 +- ui/ducks/send/send.js | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d70fa6ef..4b385f7f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -414,7 +414,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#11093](https://github.com/MetaMask/metamask-extension/pull/11093): Update all uses of "Seed Phrase" to "Secret Recovery Phrase" ### Fixed -- [#11025](https://github.com/MetaMask/metamask-extension/pull/11025): Fixed redirection to the build quotes page from the swaps page when failure has occured +- [#11025](https://github.com/MetaMask/metamask-extension/pull/11025): Fixed redirection to the build quotes page from the swaps page when failure has occurred - [#11015](https://github.com/MetaMask/metamask-extension/pull/11015): Prevent an undefined gas price from breaking the transaction list - [#11013](https://github.com/MetaMask/metamask-extension/pull/11013): Prevent signature request component from canceling hardware wallet signing - [#10982](https://github.com/MetaMask/metamask-extension/pull/10982): Re-validating chain id when rpc url changes [custom network form] @@ -468,7 +468,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [9.5.1] ### Fixed - Fixed icon on approval screen ([#11048](https://github.com/MetaMask/metamask-extension/pull/11048)) -- Fixed broken app state for some users with Chinese, Portugese or Spanish browser language settings. ([#11036](https://github.com/MetaMask/metamask-extension/pull/11036)) +- Fixed broken app state for some users with Chinese, Portuguese or Spanish browser language settings. ([#11036](https://github.com/MetaMask/metamask-extension/pull/11036)) ## [9.5.0] - 2021-04-28 ### Added @@ -557,7 +557,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Update Japanese translations. ([#10265](https://github.com/MetaMask/metamask-extension/pull/10265)) - Update Chinese(Simplified) translations. ([#9388](https://github.com/MetaMask/metamask-extension/pull/9388)) - Update Vietnamese translations. ([#10270](https://github.com/MetaMask/metamask-extension/pull/10270)) -- Update Spanish and Spanish(Latin American and Carribean) translations. ([#10258](https://github.com/MetaMask/metamask-extension/pull/10258)) +- Update Spanish and Spanish(Latin American and Caribbean) translations. ([#10258](https://github.com/MetaMask/metamask-extension/pull/10258)) - Update Russian translations. ([#10268](https://github.com/MetaMask/metamask-extension/pull/10268)) - Update Tagalog localized messages. ([#10269](https://github.com/MetaMask/metamask-extension/pull/10269)) - Fix 'imported' translation use case for Dutch. ([#10448](https://github.com/MetaMask/metamask-extension/pull/10448)) diff --git a/app/scripts/controllers/metametrics.js b/app/scripts/controllers/metametrics.js index e88b8c721..fb0164153 100644 --- a/app/scripts/controllers/metametrics.js +++ b/app/scripts/controllers/metametrics.js @@ -11,7 +11,7 @@ import { SECOND } from '../../../shared/constants/time'; const defaultCaptureException = (err) => { // throw error on clean stack so its captured by platform integrations (eg sentry) - // but does not interupt the call stack + // but does not interrupt the call stack setTimeout(() => { throw err; }); diff --git a/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.test.js b/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.test.js index 5c08fe457..c6ac0ae88 100644 --- a/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.test.js +++ b/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.test.js @@ -60,7 +60,7 @@ describe('EditGasFeeButton', () => { expect(screen.queryByText('Market')).toBeInTheDocument(); }); - it('should render edit link with text agressive if high gas estimates are selected', () => { + it('should render edit link with text aggressive if high gas estimates are selected', () => { render({ contextProps: { transaction: { userFeeLevel: 'high' } } }); expect(screen.queryByText('🦍')).toBeInTheDocument(); expect(screen.queryByText('Aggressive')).toBeInTheDocument(); diff --git a/ui/ducks/send/send.js b/ui/ducks/send/send.js index 8df8cbc9d..abd74a4dc 100644 --- a/ui/ducks/send/send.js +++ b/ui/ducks/send/send.js @@ -581,7 +581,7 @@ export const initialState = { gas: { // indicate whether the gas estimate is loading isGasEstimateLoading: true, - // String token indentifying a listener for polling on the gasFeeController + // String token identifying a listener for polling on the gasFeeController gasEstimatePollToken: null, // has the user set custom gas in the custom gas modal isCustomGasSet: false, From 2825b74a550d05800717de6ee16498520062ef3b Mon Sep 17 00:00:00 2001 From: Hassan Malik <41640681+hmalik88@users.noreply.github.com> Date: Fri, 28 Jan 2022 09:39:32 -0800 Subject: [PATCH 059/115] added extension changes from snaps branch (#13433) --- .../app/permissions-connect-footer/index.scss | 2 +- ui/pages/confirmation/confirmation.js | 37 ++++++++----------- ui/pages/confirmation/templates/index.js | 1 + 3 files changed, 18 insertions(+), 22 deletions(-) diff --git a/ui/components/app/permissions-connect-footer/index.scss b/ui/components/app/permissions-connect-footer/index.scss index 699bd777e..56ffbc3fe 100644 --- a/ui/components/app/permissions-connect-footer/index.scss +++ b/ui/components/app/permissions-connect-footer/index.scss @@ -7,7 +7,7 @@ &__text { @include H7; - color: #6a737d; + color: var(--ui-4); display: flex; margin-top: 10px; diff --git a/ui/pages/confirmation/confirmation.js b/ui/pages/confirmation/confirmation.js index 8aa01ea79..44768c633 100644 --- a/ui/pages/confirmation/confirmation.js +++ b/ui/pages/confirmation/confirmation.js @@ -10,17 +10,15 @@ import { useHistory } from 'react-router-dom'; import { isEqual } from 'lodash'; import { produce } from 'immer'; import Box from '../../components/ui/box'; -import Chip from '../../components/ui/chip'; import MetaMaskTemplateRenderer from '../../components/app/metamask-template-renderer'; -import SiteIcon from '../../components/ui/site-icon'; import { DEFAULT_ROUTE } from '../../helpers/constants/routes'; -import { stripHttpsScheme } from '../../helpers/utils/util'; import { useI18nContext } from '../../hooks/useI18nContext'; import { useOriginMetadata } from '../../hooks/useOriginMetadata'; import { getUnapprovedTemplatedConfirmations } from '../../selectors'; import NetworkDisplay from '../../components/app/network-display/network-display'; import { COLORS, SIZES } from '../../helpers/constants/design-system'; import Callout from '../../components/ui/callout'; +import SiteOrigin from '../../components/ui/site-origin'; import ConfirmationFooter from './components/confirmation-footer'; import { getTemplateValues, getTemplateAlerts } from './templates'; @@ -124,7 +122,7 @@ export default function ConfirmationPage() { 0, ); const pendingConfirmation = pendingConfirmations[currentPendingConfirmation]; - const originMetadata = useOriginMetadata(pendingConfirmation?.origin); + const originMetadata = useOriginMetadata(pendingConfirmation?.origin) || {}; const [alertState, dismissAlert] = useAlertState(pendingConfirmation); // Generating templatedValues is potentially expensive, and if done on every render @@ -185,23 +183,20 @@ export default function ConfirmationPage() {
)}
- - - - - - } + {templatedValues.networkDisplay ? ( + + + + ) : null} + + diff --git a/ui/pages/confirmation/templates/index.js b/ui/pages/confirmation/templates/index.js index 790827178..2bbf54b1e 100644 --- a/ui/pages/confirmation/templates/index.js +++ b/ui/pages/confirmation/templates/index.js @@ -22,6 +22,7 @@ const ALLOWED_TEMPLATE_KEYS = [ 'cancelText', 'onApprove', 'onCancel', + 'networkDisplay', ]; /** From d5491de6dbcbd72187f2742ec81875fa1a7d8c1a Mon Sep 17 00:00:00 2001 From: Daniil Okhlopkov <5613295+ohld@users.noreply.github.com> Date: Fri, 28 Jan 2022 10:00:25 -0800 Subject: [PATCH 060/115] Up year in License (#13330) --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 2e9d8be49..f245dcd0e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright ConsenSys Software Inc. 2020. All rights reserved. +Copyright ConsenSys Software Inc. 2022. All rights reserved. You acknowledge and agree that ConsenSys Software Inc. (“ConsenSys”) (or ConsenSys’s licensors) own all legal right, title and interest in and to the work, software, application, source code, documentation and any other documents in this repository (collectively, the “Program”), including any intellectual property rights which subsist in the Program (whether those rights happen to be registered or not, and wherever in the world those rights may exist), whether in source code or any other form. From 3729e15c0c8a70deaa6b8bf2364f9a3e81e6e953 Mon Sep 17 00:00:00 2001 From: kumavis Date: Fri, 28 Jan 2022 10:02:49 -1000 Subject: [PATCH 061/115] lavamoat - @lavamoat/allow-scripts v2 (#13428) --- package.json | 73 ++++++++++++++++++++++++++++++++++------------------ yarn.lock | 22 +++------------- 2 files changed, 52 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index 9cb43e831..a2f4165c4 100644 --- a/package.json +++ b/package.json @@ -230,7 +230,7 @@ "@babel/preset-env": "^7.5.5", "@babel/preset-react": "^7.0.0", "@babel/register": "^7.5.5", - "@lavamoat/allow-scripts": "^1.0.6", + "@lavamoat/allow-scripts": "^2.0.0", "@lavamoat/lavapack": "^2.0.4", "@metamask/auto-changelog": "^2.1.0", "@metamask/eslint-config": "^9.0.0", @@ -361,31 +361,54 @@ }, "lavamoat": { "allowScripts": { - "gridplus-sdk": false, - "chromedriver": true, - "geckodriver": true, + "3box>3box-orbitdb-plugins>ipfs-log>orbit-db-identity-provider>orbit-db-keystore>leveldown": false, + "3box>3box-orbitdb-plugins>ipfs-log>orbit-db-identity-provider>orbit-db-keystore>libp2p-crypto-secp256k1>secp256k1": false, + "3box>3box-orbitdb-plugins>ipfs-log>orbit-db-identity-provider>orbit-db-keystore>libp2p-crypto>libp2p-crypto-secp256k1>secp256k1": false, + "3box>3box-orbitdb-plugins>ipfs-log>orbit-db-identity-provider>orbit-db-keystore>libp2p-crypto>ursa-optional": false, + "3box>ipfs-postmsg-proxy>peer-id>libp2p-crypto>libp2p-crypto-secp256k1>secp256k1": false, + "3box>ipfs>ipfs-mfs>ipfs-unixfs-exporter>ipfs-unixfs-importer>rabin-wasm>assemblyscript": false, + "3box>ipfs>ipfs-repo>datastore-level>leveldown": false, + "3box>ipfs>ipld-bitcoin>bitcoinjs-lib>bip32>tiny-secp256k1": false, + "3box>ipfs>ipld-ethereum>ethereumjs-account>ethereumjs-util>keccak": false, + "3box>ipfs>ipld-ethereum>ethereumjs-account>ethereumjs-util>secp256k1": false, + "3box>ipfs>ipld-ethereum>ethereumjs-block>ethereumjs-tx>ethereumjs-util>ethereum-cryptography>keccak": false, + "3box>ipfs>ipld-ethereum>ethereumjs-block>ethereumjs-tx>ethereumjs-util>ethereum-cryptography>secp256k1": false, + "3box>ipfs>ipld-ethereum>ethereumjs-block>ethereumjs-util>keccak": false, + "3box>ipfs>ipld-ethereum>ethereumjs-block>ethereumjs-util>secp256k1": false, + "3box>ipfs>ipld-ethereum>ethereumjs-block>merkle-patricia-tree>ethereumjs-util>keccak": false, + "3box>ipfs>ipld-ethereum>ethereumjs-block>merkle-patricia-tree>ethereumjs-util>secp256k1": false, + "3box>ipfs>ipld-ethereum>ethereumjs-tx>ethereumjs-util>keccak": false, + "3box>ipfs>ipld-ethereum>ethereumjs-tx>ethereumjs-util>secp256k1": false, + "3box>ipfs>ipld-ethereum>merkle-patricia-tree>ethereumjs-util>keccak": false, + "3box>ipfs>ipld-ethereum>merkle-patricia-tree>ethereumjs-util>secp256k1": false, + "3box>orbit-db>orbit-db-cache>leveldown": false, + "@lavamoat/allow-scripts>@lavamoat/preinstall-always-fail": false, + "@metamask/controllers>babel-runtime>core-js": false, + "@metamask/controllers>eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>keccak": false, + "@metamask/controllers>eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>secp256k1": false, + "@metamask/controllers>eth-keyring-controller>eth-hd-keyring>eth-sig-util>ethereumjs-util>keccak": false, + "@metamask/controllers>eth-keyring-controller>eth-hd-keyring>eth-sig-util>ethereumjs-util>secp256k1": false, + "@metamask/controllers>web3-provider-engine>eth-json-rpc-filters>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>keccak": false, + "@metamask/controllers>web3-provider-engine>eth-json-rpc-filters>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>secp256k1": false, + "@metamask/controllers>web3-provider-engine>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>keccak": false, + "@metamask/controllers>web3-provider-engine>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>secp256k1": false, + "@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util>keccak": false, + "@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util>secp256k1": false, "@sentry/cli": true, - "electron": true, - "core-js": false, - "core-js-pure": false, - "keccak": false, - "secp256k1": false, - "web3": false, - "sha3": false, - "bufferutil": false, - "utf-8-validate": false, - "leveldown": false, - "ursa-optional": false, - "gc-stats": false, - "github:assemblyscript/assemblyscript": false, - "tiny-secp256k1": false, - "@lavamoat/preinstall-always-fail": false, - "fsevents": false, - "node-hid": false, - "usb": false, - "blake-hash": false, - "protobufjs": false, - "@trufflesuite/bigint-buffer": false + "@storybook/addon-a11y>@storybook/addons>@storybook/api>@storybook/channels>core-js": false, + "@storybook/addon-essentials>@storybook/addon-docs>@storybook/builder-webpack4>@storybook/ui>core-js-pure": false, + "chromedriver": true, + "eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>keccak": false, + "eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>secp256k1": false, + "eth-lattice-keyring>gridplus-sdk": false, + "eth-trezor-keyring>hdkey>secp256k1": false, + "eth-trezor-keyring>trezor-connect>@trezor/utxo-lib>blake-hash": false, + "eth-trezor-keyring>trezor-connect>trezor-link>protobufjs": false, + "ganache>@trufflesuite/bigint-buffer": false, + "ganache>keccak": false, + "ganache>leveldown": false, + "geckodriver": true, + "react-devtools>electron": true } } } diff --git a/yarn.lock b/yarn.lock index e45a72e68..247b3c7dd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2355,17 +2355,13 @@ rlp "^2.2.6" uuid "^8.3.2" -"@lavamoat/allow-scripts@^1.0.6": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@lavamoat/allow-scripts/-/allow-scripts-1.0.6.tgz#fbdf7c35a5c2c2cff05ba002b7bc8f3355bda22c" - integrity sha512-bBUN2xuQEXWmWTJrfkwaM8Ige7TNfTTRodyW353VYnzX7kW866Tm/Ag0hdbukFvJfNjRHabVmLKxYYL8l/uyZQ== +"@lavamoat/allow-scripts@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@lavamoat/allow-scripts/-/allow-scripts-2.0.0.tgz#d2b84491961c8b2b80281112e19654beae9eb584" + integrity sha512-WC8cvStg5/MZ0JwccYsLNhtFSiK4tGEfv4kdlMoWfji4sB053HB1xCLDMlhFSMM6m0ecKA18CmzhI6J6iyCc0w== dependencies: - "@lavamoat/preinstall-always-fail" "^1.0.0" "@npmcli/run-script" "^1.8.1" - "@yarnpkg/lockfile" "^1.1.0" - npm-logical-tree "^1.2.1" resolve "^1.20.0" - semver "^7.3.4" yargs "^16.2.0" "@lavamoat/lavapack@^2.0.3", "@lavamoat/lavapack@^2.0.4": @@ -2381,11 +2377,6 @@ through2 "^4.0.2" umd "^3.0.3" -"@lavamoat/preinstall-always-fail@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@lavamoat/preinstall-always-fail/-/preinstall-always-fail-1.0.0.tgz#e78a6e3d9e212a4fef869ec37d4f5fb498dea373" - integrity sha512-vD2DcC0ffJj1w2y1Lu0OU39wHmlPEd2tCDW04Bm6Kf4LyRnCHCezTsS8yzeSJ+4so7XP+TITuR5FGJRWxPb+GA== - "@ledgerhq/cryptoassets@^5.27.2": version "5.53.0" resolved "https://registry.yarnpkg.com/@ledgerhq/cryptoassets/-/cryptoassets-5.53.0.tgz#11dcc93211960c6fd6620392e4dd91896aaabe58" @@ -19590,11 +19581,6 @@ npm-conf@^1.1.3: config-chain "^1.1.11" pify "^3.0.0" -npm-logical-tree@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/npm-logical-tree/-/npm-logical-tree-1.2.1.tgz#44610141ca24664cad35d1e607176193fd8f5b88" - integrity sha512-AJI/qxDB2PWI4LG1CYN579AY1vCiNyWfkiquCsJWqntRu/WwimVrC8yXeILBFHDwxfOejxewlmnvW9XXjMlYIg== - npm-normalize-package-bin@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" From bac20099e52f95ff440a58e8bf0729f9e42227ae Mon Sep 17 00:00:00 2001 From: Shane Date: Fri, 28 Jan 2022 13:40:13 -0800 Subject: [PATCH 062/115] Removed memo status from snap-settings-card (#13458) --- .../snap-settings-card/snap-settings-card.js | 36 ++----------------- 1 file changed, 3 insertions(+), 33 deletions(-) diff --git a/ui/components/app/flask/snap-settings-card/snap-settings-card.js b/ui/components/app/flask/snap-settings-card/snap-settings-card.js index c16068dfb..09debc698 100644 --- a/ui/components/app/flask/snap-settings-card/snap-settings-card.js +++ b/ui/components/app/flask/snap-settings-card/snap-settings-card.js @@ -1,4 +1,4 @@ -import React, { useState, useEffect, useCallback } from 'react'; +import React from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; @@ -55,36 +55,6 @@ const SnapSettingsCard = ({ chipProps, }) => { const t = useI18nContext(); - const [chipStatus, setChipStatus] = useState(STATUSES.INSTALLING); - - // TODO: use state directly in place of memoization - const handleStatus = useCallback(() => { - switch (status) { - case STATUSES.INSTALLING: { - setChipStatus(STATUSES.INSTALLING); - break; - } - case STATUSES.RUNNING: { - setChipStatus(STATUSES.RUNNING); - break; - } - case STATUSES.STOPPED: { - setChipStatus(STATUSES.STOPPED); - break; - } - case STATUSES.CRASHED: { - setChipStatus(STATUSES.CRASHED); - break; - } - default: { - setChipStatus(STATUSES.INSTALLING); - } - } - }, [status]); - - useEffect(() => { - handleStatus(status); - }, [handleStatus, status]); return ( } - label={chipStatus} + label={status} labelProps={{ color: COLORS.UI4, margin: [0, 1], From 3772dfee117b191037cd5bd03639aea279109f0f Mon Sep 17 00:00:00 2001 From: Shane Date: Fri, 28 Jan 2022 13:42:32 -0800 Subject: [PATCH 063/115] Added `subjectType` to `setupProviderConnection` and `setupUntrustedCommunication` (#13437) These changes were split off from the snaps branch [here](https://github.com/MetaMask/metamask-extension/pull/11837#discussion_r792942834). The `subjectType` is necessary to handle connecting to snaps using these methods. --- app/scripts/background.js | 5 +- app/scripts/metamask-controller.js | 92 ++++++++++++++++--------- app/scripts/metamask-controller.test.js | 18 +++-- 3 files changed, 76 insertions(+), 39 deletions(-) diff --git a/app/scripts/background.js b/app/scripts/background.js index 47945a25d..0c941c7f9 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -414,7 +414,10 @@ function setupController(initState, initLangCode) { // communication with page or other extension function connectExternal(remotePort) { const portStream = new PortStream(remotePort); - controller.setupUntrustedCommunication(portStream, remotePort.sender); + controller.setupUntrustedCommunication({ + connectionStream: portStream, + sender: remotePort.sender, + }); } // diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index c8d2931a1..2ff28ba96 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -2650,28 +2650,47 @@ export default class MetamaskController extends EventEmitter { * Used to create a multiplexed stream for connecting to an untrusted context * like a Dapp or other extension. * - * @param {*} connectionStream - The Duplex stream to connect to. - * @param {MessageSender} sender - The sender of the messages on this stream + * @param options - Options bag. + * @param {ReadableStream} options.connectionStream - The Duplex stream to connect to. + * @param {MessageSender | SnapSender} options.sender - The sender of the messages on this stream. + * @param {string} [options.subjectType] - The type of the sender, i.e. subject. */ - setupUntrustedCommunication(connectionStream, sender) { + setupUntrustedCommunication({ connectionStream, sender, subjectType }) { const { usePhishDetect } = this.preferencesController.store.getState(); - const { hostname } = new URL(sender.url); - // Check if new connection is blocked if phishing detection is on - if (usePhishDetect && this.phishingController.test(hostname)) { - log.debug('MetaMask - sending phishing warning for', hostname); - this.sendPhishingWarning(connectionStream, hostname); - return; + let _subjectType; + if (subjectType) { + _subjectType = subjectType; + } else if (sender.id && sender.id !== this.extension.runtime.id) { + _subjectType = SUBJECT_TYPES.EXTENSION; + } else { + _subjectType = SUBJECT_TYPES.WEBSITE; + } + + if (sender.url) { + const { hostname } = new URL(sender.url); + // Check if new connection is blocked if phishing detection is on + if (usePhishDetect && this.phishingController.test(hostname)) { + log.debug('MetaMask - sending phishing warning for', hostname); + this.sendPhishingWarning(connectionStream, hostname); + return; + } } // setup multiplexing const mux = setupMultiplex(connectionStream); // messages between inpage and background - this.setupProviderConnection(mux.createStream('metamask-provider'), sender); + this.setupProviderConnection( + mux.createStream('metamask-provider'), + sender, + _subjectType, + ); // TODO:LegacyProvider: Delete - // legacy streams - this.setupPublicConfig(mux.createStream('publicConfig')); + if (sender.url) { + // legacy streams + this.setupPublicConfig(mux.createStream('publicConfig')); + } } /** @@ -2688,7 +2707,11 @@ export default class MetamaskController extends EventEmitter { const mux = setupMultiplex(connectionStream); // connect features this.setupControllerConnection(mux.createStream('controller')); - this.setupProviderConnection(mux.createStream('provider'), sender, true); + this.setupProviderConnection( + mux.createStream('provider'), + sender, + SUBJECT_TYPES.INTERNAL, + ); } /** @@ -2747,17 +2770,19 @@ export default class MetamaskController extends EventEmitter { * * @param {*} outStream - The stream to provide over. * @param {MessageSender} sender - The sender of the messages on this stream - * @param {boolean} isInternal - True if this is a connection with an internal process + * @param {string} subjectType - The type of the sender, i.e. subject. */ - setupProviderConnection(outStream, sender, isInternal) { - const origin = isInternal ? 'metamask' : new URL(sender.url).origin; - let subjectType = isInternal - ? SUBJECT_TYPES.INTERNAL - : SUBJECT_TYPES.WEBSITE; + setupProviderConnection(outStream, sender, subjectType) { + let origin; + if (subjectType === SUBJECT_TYPES.INTERNAL) { + origin = 'metamask'; + } else { + origin = new URL(sender.url).origin; + } - if (sender.id !== this.extension.runtime.id) { - subjectType = SUBJECT_TYPES.EXTENSION; - this.subjectMetadataController.addSubjectMetadata(origin, { + if (sender.id && sender.id !== this.extension.runtime.id) { + this.subjectMetadataController.addSubjectMetadata({ + origin, extensionId: sender.id, subjectType: SUBJECT_TYPES.EXTENSION, }); @@ -2770,8 +2795,8 @@ export default class MetamaskController extends EventEmitter { const engine = this.setupProviderEngine({ origin, - location: sender.url, tabId, + sender, subjectType, }); @@ -2799,14 +2824,14 @@ export default class MetamaskController extends EventEmitter { * * @param {Object} options - Provider engine options * @param {string} options.origin - The origin of the sender - * @param {string} options.location - The full URL of the sender + * @param {MessageSender | SnapSender} options.sender - The sender object. * @param {string} options.subjectType - The type of the sender subject. * @param {tabId} [options.tabId] - The tab ID of the sender - if the sender is within a tab */ - setupProviderEngine({ origin, location, subjectType, tabId }) { + setupProviderEngine({ origin, subjectType, sender, tabId }) { // setup json rpc engine stack const engine = new JsonRpcEngine(); - const { provider, blockTracker } = this; + const { blockTracker, provider } = this; // create filter polyfill middleware const filterMiddleware = createFilterMiddleware({ provider, blockTracker }); @@ -2828,13 +2853,16 @@ export default class MetamaskController extends EventEmitter { } // logging engine.push(createLoggerMiddleware({ origin })); - engine.push( - createOnboardingMiddleware({ - location, - registerOnboarding: this.onboardingController.registerOnboarding, - }), - ); engine.push(this.permissionLogController.createMiddleware()); + // onboarding + if (subjectType === SUBJECT_TYPES.WEBSITE) { + engine.push( + createOnboardingMiddleware({ + location: sender.url, + registerOnboarding: this.onboardingController.registerOnboarding, + }), + ); + } engine.push( createMethodMiddleware({ origin, diff --git a/app/scripts/metamask-controller.test.js b/app/scripts/metamask-controller.test.js index f7323388d..5e5414aae 100644 --- a/app/scripts/metamask-controller.test.js +++ b/app/scripts/metamask-controller.test.js @@ -995,10 +995,10 @@ describe('MetaMaskController', function () { cb(); }); - metamaskController.setupUntrustedCommunication( - streamTest, - phishingMessageSender, - ); + metamaskController.setupUntrustedCommunication({ + connectionStream: streamTest, + sender: phishingMessageSender, + }); await promise; streamTest.end(); }); @@ -1016,7 +1016,10 @@ describe('MetaMaskController', function () { cb(); }); - metamaskController.setupUntrustedCommunication(streamTest, messageSender); + metamaskController.setupUntrustedCommunication({ + connectionStream: streamTest, + sender: messageSender, + }); const message = { id: 1999133338649204, @@ -1055,7 +1058,10 @@ describe('MetaMaskController', function () { cb(); }); - metamaskController.setupUntrustedCommunication(streamTest, messageSender); + metamaskController.setupUntrustedCommunication({ + connectionStream: streamTest, + sender: messageSender, + }); const message = { id: 1999133338649204, From 869d7a21bfc359fbcd32f2ce580873a713b5ac85 Mon Sep 17 00:00:00 2001 From: Ariella Vu <20778143+digiwand@users.noreply.github.com> Date: Fri, 28 Jan 2022 21:59:15 +0000 Subject: [PATCH 064/115] Revert "#10168 - Fix to Can't open settings if browser zoom level > 100% (#13281)" (#13459) This reverts commit 05f9ceda77953068647c4b369004a9361d68d5f0. --- ui/components/app/account-menu/index.scss | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ui/components/app/account-menu/index.scss b/ui/components/app/account-menu/index.scss index 820e25906..05d3fd6e5 100644 --- a/ui/components/app/account-menu/index.scss +++ b/ui/components/app/account-menu/index.scss @@ -10,9 +10,7 @@ color: var(--white); @media screen and (max-width: $break-small) { - position: initial; - margin-top: -10px; - margin-left: calc(((100vw - 100%) / 2) + 8px); + right: calc(((100vw - 100%) / 2) + 8px); } @media screen and (min-width: $break-large) { From 11c61a3ead8a79a3803ae36dada023aefa8c30e3 Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Mon, 31 Jan 2022 11:21:43 +0530 Subject: [PATCH 065/115] EIP-1559 V2 UI/UX improvements (#13419) --- app/images/curve-high.svg | 26 +------------ app/images/curve-low.svg | 21 +---------- app/images/curve-medium.svg | 17 +-------- app/scripts/controllers/transactions/index.js | 2 +- .../advanced-gas-fee-defaults.js | 17 ++++++--- .../advanced-gas-fee-defaults.test.js | 37 +++++++------------ .../advanced-gas-fee-defaults/index.scss | 5 ++- .../advanced-gas-fee-gas-limit.js | 2 +- .../advanced-gas-fee-gas-limit/index.scss | 2 + .../advanced-gas-fee-inputs.js | 1 - .../advanced-gas-fee-inputs/index.scss | 5 --- .../priority-fee-input/index.scss | 4 ++ .../priority-fee-input/priority-fee-input.js | 2 +- .../advanced-gas-fee-popover.js | 2 - .../app/advanced-gas-fee-popover/index.scss | 5 --- ui/components/app/app-components.scss | 1 + .../app/app-loading-spinner/index.scss | 1 + .../cancel-speedup-popover.js | 2 +- .../edit-gas-fee-button.js | 2 +- .../app/edit-gas-fee-button/index.scss | 1 + .../edit-gas-tooltip/edit-gas-tooltip.js | 20 ++++++---- .../edit-gas-tooltip/index.scss | 6 +-- ui/components/ui/loading-heartbeat/index.js | 4 +- ui/helpers/utils/gas.js | 2 +- 24 files changed, 65 insertions(+), 122 deletions(-) create mode 100644 ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/priority-fee-input/index.scss diff --git a/app/images/curve-high.svg b/app/images/curve-high.svg index bd6d8d0ce..f8d0f0c00 100644 --- a/app/images/curve-high.svg +++ b/app/images/curve-high.svg @@ -1,25 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/app/images/curve-low.svg b/app/images/curve-low.svg index 9f98826ea..385f89f86 100644 --- a/app/images/curve-low.svg +++ b/app/images/curve-low.svg @@ -1,20 +1 @@ - - - - - - - - - - - - - - - - - - - - + diff --git a/app/images/curve-medium.svg b/app/images/curve-medium.svg index 9a454bc99..e8a8f6a3f 100644 --- a/app/images/curve-medium.svg +++ b/app/images/curve-medium.svg @@ -1,16 +1 @@ - - - - - - - - - - - - - - - - + diff --git a/app/scripts/controllers/transactions/index.js b/app/scripts/controllers/transactions/index.js index 771fc0ee7..217ad82eb 100644 --- a/app/scripts/controllers/transactions/index.js +++ b/app/scripts/controllers/transactions/index.js @@ -434,7 +434,6 @@ export default class TransactionController extends EventEmitter { gasLimit: defaultGasLimit, simulationFails, } = await this._getDefaultGasLimit(txMeta, getCodeResponse); - const advancedGasFeeDefaultValues = this.getAdvancedGasFee(); // eslint-disable-next-line no-param-reassign txMeta = this.txStateManager.getTransaction(txMeta.id); @@ -444,6 +443,7 @@ export default class TransactionController extends EventEmitter { if (eip1559Compatibility) { const { eip1559V2Enabled } = this.preferencesStore.getState(); + const advancedGasFeeDefaultValues = this.getAdvancedGasFee(); if (eip1559V2Enabled && Boolean(advancedGasFeeDefaultValues)) { txMeta.userFeeLevel = CUSTOM_GAS_ESTIMATE; txMeta.txParams.maxFeePerGas = decGWEIToHexWEI( diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.js b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.js index a5b7c04c4..6cd7a20e6 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.js +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.js @@ -1,6 +1,7 @@ import React, { useEffect, useState } from 'react'; import { useSelector, useDispatch } from 'react-redux'; +import { EDIT_GAS_MODES } from '../../../../../shared/constants/gas'; import Box from '../../../ui/box'; import Typography from '../../../ui/typography'; import CheckBox from '../../../ui/check-box'; @@ -12,6 +13,7 @@ import { } from '../../../../helpers/constants/design-system'; import { getAdvancedGasFeeValues } from '../../../../selectors'; import { setAdvancedGasFee } from '../../../../store/actions'; +import { useGasFeeContext } from '../../../../contexts/gasFee'; import { useAdvancedGasFeePopoverContext } from '../context'; import { useI18nContext } from '../../../../hooks/useI18nContext'; @@ -25,6 +27,7 @@ const AdvancedGasFeeDefaults = () => { maxPriorityFeePerGas, } = useAdvancedGasFeePopoverContext(); const advancedGasFeeValues = useSelector(getAdvancedGasFeeValues); + const { editGasMode } = useGasFeeContext(); const [isDefaultSettingsSelected, setDefaultSettingsSelected] = useState( Boolean(advancedGasFeeValues) && @@ -55,11 +58,15 @@ const AdvancedGasFeeDefaults = () => { } }; + if (editGasMode === EDIT_GAS_MODES.SWAPS) { + return null; + } + return ( diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js index e7e280889..8fb127311 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js @@ -1,7 +1,10 @@ import React from 'react'; import { fireEvent, screen } from '@testing-library/react'; -import { GAS_ESTIMATE_TYPES } from '../../../../../shared/constants/gas'; +import { + EDIT_GAS_MODES, + GAS_ESTIMATE_TYPES, +} from '../../../../../shared/constants/gas'; import { renderWithProvider } from '../../../../../test/lib/render-helpers'; import mockEstimates from '../../../../../test/data/mock-estimates.json'; import mockState from '../../../../../test/data/mock-state.json'; @@ -24,7 +27,7 @@ jest.mock('../../../../store/actions', () => ({ setAdvancedGasFee: jest.fn(), })); -const render = (defaultGasParams) => { +const render = (defaultGasParams, contextParams) => { const store = configureStore({ metamask: { ...mockState.metamask, @@ -45,6 +48,7 @@ const render = (defaultGasParams) => { transaction={{ userFeeLevel: 'medium', }} + {...contextParams} > @@ -57,11 +61,7 @@ const render = (defaultGasParams) => { describe('AdvancedGasFeeDefaults', () => { it('should renders correct message when the default is not set', () => { render({ advancedGasFee: null }); - expect( - screen.queryByText( - 'Always use these values and advanced setting as default.', - ), - ).toBeInTheDocument(); + expect(screen.queryByText('new values')).toBeInTheDocument(); }); it('should renders correct message when the default values are set', () => { render({ @@ -73,22 +73,6 @@ describe('AdvancedGasFeeDefaults', () => { ), ).toBeInTheDocument(); }); - it('should renders correct message when checkbox is selected and default values are saved', () => { - render({ - advancedGasFee: null, - }); - expect( - screen.queryByText( - 'Always use these values and advanced setting as default.', - ), - ).toBeInTheDocument(); - fireEvent.change(document.getElementsByTagName('input')[0], { - target: { value: 100 }, - }); - fireEvent.change(document.getElementsByTagName('input')[1], { - target: { value: 4 }, - }); - }); it('should renders correct message when the default values are set and the maxBaseFee values are updated', () => { render({ advancedGasFee: { maxBaseFee: 50, priorityFee: 2 }, @@ -144,4 +128,11 @@ describe('AdvancedGasFeeDefaults', () => { fireEvent.click(checkbox); expect(mock).toHaveBeenCalledTimes(2); }); + + it('should not render option to set default gas options in a swaps transaction', () => { + render({}, { editGasMode: EDIT_GAS_MODES.SWAPS }); + expect( + document.querySelector('input[type=checkbox]'), + ).not.toBeInTheDocument(); + }); }); diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/index.scss b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/index.scss index 771e3a1cb..90c37de2b 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/index.scss +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/index.scss @@ -1,7 +1,10 @@ .advanced-gas-fee-defaults { + border-top: 1px solid var(--ui-grey); + padding-top: 16px; + & &__checkbox { font-size: $font-size-h4; - margin: 0 8px 0 8px; + margin: 0 8px; } &__label { diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-gas-limit/advanced-gas-fee-gas-limit.js b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-gas-limit/advanced-gas-fee-gas-limit.js index facc3b132..c5e42146b 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-gas-limit/advanced-gas-fee-gas-limit.js +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-gas-limit/advanced-gas-fee-gas-limit.js @@ -64,7 +64,7 @@ const AdvancedGasFeeGasLimit = () => { tag={TYPOGRAPHY.Paragraph} variant={TYPOGRAPHY.H7} className="advanced-gas-fee-gas-limit" - margin={[0, 2]} + margin={[4, 2, 0, 2]} > diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-gas-limit/index.scss b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-gas-limit/index.scss index 562a00db3..27db64b06 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-gas-limit/index.scss +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-gas-limit/index.scss @@ -2,6 +2,8 @@ display: flex; align-items: center; white-space: nowrap; + border-top: 1px solid var(--ui-grey); + padding-top: 16px; > * { margin-right: 4px; diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/advanced-gas-fee-inputs.js b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/advanced-gas-fee-inputs.js index f6f1eaea3..dcbbeff0a 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/advanced-gas-fee-inputs.js +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/advanced-gas-fee-inputs.js @@ -8,7 +8,6 @@ const AdvancedGasFeeInputs = () => { return ( -
); diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/index.scss b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/index.scss index 60dda01ed..875d199d1 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/index.scss +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/index.scss @@ -6,9 +6,4 @@ .form-field__heading-title > h6 { font-size: $font-size-h7; } - - &__separator { - border-top: 1px solid var(--ui-grey); - margin: 16px 0; - } } diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/priority-fee-input/index.scss b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/priority-fee-input/index.scss new file mode 100644 index 000000000..5d212fd90 --- /dev/null +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/priority-fee-input/index.scss @@ -0,0 +1,4 @@ +.priority-fee-input { + border-top: 1px solid var(--ui-grey); + padding-top: 16px; +} diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/priority-fee-input/priority-fee-input.js b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/priority-fee-input/priority-fee-input.js index 5fc92121b..b4f277070 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/priority-fee-input/priority-fee-input.js +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-inputs/priority-fee-input/priority-fee-input.js @@ -98,7 +98,7 @@ const PriorityFeeInput = () => { ]); return ( - + { > -
-
diff --git a/ui/components/app/advanced-gas-fee-popover/index.scss b/ui/components/app/advanced-gas-fee-popover/index.scss index a512495e4..4aab51f56 100644 --- a/ui/components/app/advanced-gas-fee-popover/index.scss +++ b/ui/components/app/advanced-gas-fee-popover/index.scss @@ -1,9 +1,4 @@ .advanced-gas-fee-popover { - &__separator { - border-top: 1px solid var(--ui-grey); - margin: 16px 0; - } - .form-field__heading-title > h6 { font-size: $font-size-h7; } diff --git a/ui/components/app/app-components.scss b/ui/components/app/app-components.scss index fdeaf9b54..4cfede5e5 100644 --- a/ui/components/app/app-components.scss +++ b/ui/components/app/app-components.scss @@ -72,6 +72,7 @@ @import 'advanced-gas-fee-popover/advanced-gas-fee-gas-limit/index'; @import 'advanced-gas-fee-popover/advanced-gas-fee-inputs/index'; @import 'advanced-gas-fee-popover/advanced-gas-fee-inputs/base-fee-input/index'; +@import 'advanced-gas-fee-popover/advanced-gas-fee-inputs/priority-fee-input/index'; @import 'advanced-gas-fee-popover/advanced-gas-fee-input-subtext/index'; @import 'advanced-gas-fee-popover/advanced-gas-fee-defaults/index'; @import 'currency-input/index'; diff --git a/ui/components/app/app-loading-spinner/index.scss b/ui/components/app/app-loading-spinner/index.scss index 7f12ef827..271b40c9d 100644 --- a/ui/components/app/app-loading-spinner/index.scss +++ b/ui/components/app/app-loading-spinner/index.scss @@ -6,6 +6,7 @@ position: absolute; height: 100%; width: 100%; + z-index: 1; &__inner { width: 50px; diff --git a/ui/components/app/cancel-speedup-popover/cancel-speedup-popover.js b/ui/components/app/cancel-speedup-popover/cancel-speedup-popover.js index fdd18a420..f9f57d8fc 100644 --- a/ui/components/app/cancel-speedup-popover/cancel-speedup-popover.js +++ b/ui/components/app/cancel-speedup-popover/cancel-speedup-popover.js @@ -142,7 +142,7 @@ const CancelSpeedupPopover = () => { marginTop={4} > - + {!appIsLoading && } diff --git a/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.js b/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.js index 468624408..ef59c761a 100644 --- a/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.js +++ b/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.js @@ -54,7 +54,7 @@ export default function EditGasFeeButton({ userAcknowledgedGasMissing }) { > {icon && ( - {`${PRIORITY_LEVEL_ICON_MAP[icon]} `} + {PRIORITY_LEVEL_ICON_MAP[icon]} )} {t(title)} diff --git a/ui/components/app/edit-gas-fee-button/index.scss b/ui/components/app/edit-gas-fee-button/index.scss index e2787a829..ada2348fc 100644 --- a/ui/components/app/edit-gas-fee-button/index.scss +++ b/ui/components/app/edit-gas-fee-button/index.scss @@ -22,6 +22,7 @@ &__icon { font-size: 16px; + margin-right: 4px; } &__label { diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/edit-gas-tooltip.js b/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/edit-gas-tooltip.js index 0a80a8c63..0447513a2 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/edit-gas-tooltip.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/edit-gas-tooltip.js @@ -9,6 +9,7 @@ import { FONT_WEIGHT, TYPOGRAPHY, } from '../../../../helpers/constants/design-system'; +import { isMetamaskSuggestedGasEstimate } from '../../../../helpers/utils/gas'; import { roundToDecimalPlacesRemovingExtraZeroes } from '../../../../helpers/utils/util'; import Typography from '../../../ui/typography'; @@ -88,15 +89,20 @@ const EditGasToolTip = ({ imgAltText = t('curveHighGasEstimate'); } + // Gas estimate curve is visible for low/medium/high gas estimates + // the curve is not visible for high estimates for swaps + // also it is not visible in case of cancel/speedup if the medium/high option is disabled + const showGasEstimateCurve = + isMetamaskSuggestedGasEstimate(priorityLevel) && + !( + priorityLevel === PRIORITY_LEVELS.HIGH && + editGasMode === EDIT_GAS_MODES.SWAPS + ) && + !estimateGreaterThanGasUse; + return (
- {priorityLevel !== PRIORITY_LEVELS.CUSTOM && - priorityLevel !== PRIORITY_LEVELS.DAPP_SUGGESTED && - !( - priorityLevel === PRIORITY_LEVELS.HIGH && - editGasMode === EDIT_GAS_MODES.SWAPS - ) && - !estimateGreaterThanGasUse ? ( + {showGasEstimateCurve ? ( {imgAltText} ) : null} {toolTipMessage && ( diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/index.scss b/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/index.scss index f8d55c4ec..05b8d4963 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/index.scss +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-tooltip/index.scss @@ -1,8 +1,4 @@ .edit-gas-tooltip { - display: inline-block; - text-align: right; - width: 10%; - &__container { display: flex; justify-content: center; @@ -10,6 +6,7 @@ flex-direction: column; width: 100%; height: 100%; + min-width: 160px; img { margin-bottom: 8px; @@ -28,6 +25,7 @@ } &__label { + white-space: nowrap; width: 50%; } diff --git a/ui/components/ui/loading-heartbeat/index.js b/ui/components/ui/loading-heartbeat/index.js index 2aed84dd2..ab69a465a 100644 --- a/ui/components/ui/loading-heartbeat/index.js +++ b/ui/components/ui/loading-heartbeat/index.js @@ -3,7 +3,7 @@ import classNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; -import { isVolatileGasEstimate } from '../../../helpers/utils/gas'; +import { isMetamaskSuggestedGasEstimate } from '../../../helpers/utils/gas'; import { getGasLoadingAnimationIsShowing } from '../../../ducks/app/app'; import { useShouldAnimateGasEstimations } from '../../../hooks/useShouldAnimateGasEstimations'; @@ -19,7 +19,7 @@ export default function LoadingHeartBeat({ if ( process.env.IN_TEST || - (estimateUsed && !isVolatileGasEstimate(estimateUsed)) + (estimateUsed && !isMetamaskSuggestedGasEstimate(estimateUsed)) ) { return null; } diff --git a/ui/helpers/utils/gas.js b/ui/helpers/utils/gas.js index fa4d34a4c..9b2c06e89 100644 --- a/ui/helpers/utils/gas.js +++ b/ui/helpers/utils/gas.js @@ -55,7 +55,7 @@ export function addTenPercentAndRound(hexStringValue) { return addTenPercent(hexStringValue, { numberOfDecimals: 0 }); } -export function isVolatileGasEstimate(estimate) { +export function isMetamaskSuggestedGasEstimate(estimate) { return [ GAS_RECOMMENDATIONS.HIGH, GAS_RECOMMENDATIONS.MEDIUM, From 5889d0ac453103f789fc1bda2fb0210fa868a654 Mon Sep 17 00:00:00 2001 From: Brad Decker Date: Mon, 31 Jan 2022 08:46:25 -0600 Subject: [PATCH 066/115] add resolution for simple-get (#13471) --- package.json | 3 ++- yarn.lock | 37 ++++++++++++++----------------------- 2 files changed, 16 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index a2f4165c4..69de126e0 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,8 @@ "pubnub/superagent-proxy": "^3.0.0", "pull-ws": "^3.3.2", "ws": "^7.4.6", - "json-schema": "^0.4.0" + "json-schema": "^0.4.0", + "simple-get": "^4.0.1" }, "dependencies": { "3box": "^1.10.2", diff --git a/yarn.lock b/yarn.lock index 247b3c7dd..9f4947ba5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9024,12 +9024,12 @@ decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" -decompress-response@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" - integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== dependencies: - mimic-response "^2.0.0" + mimic-response "^3.1.0" dedent@^0.7.0: version "0.7.0" @@ -18528,10 +18528,10 @@ mimic-response@^1.0.0, mimic-response@^1.0.1: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== -mimic-response@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" - integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== min-document@^2.19.0: version "2.19.0" @@ -24242,21 +24242,12 @@ simple-concat@^1.0.0: resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= -simple-get@^2.7.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" - integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw== +simple-get@^2.7.0, simple-get@^3.0.3, simple-get@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== dependencies: - decompress-response "^3.3.0" - once "^1.3.1" - simple-concat "^1.0.0" - -simple-get@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" - integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== - dependencies: - decompress-response "^4.2.0" + decompress-response "^6.0.0" once "^1.3.1" simple-concat "^1.0.0" From c3265727f2f4ff5f529cacd3ee8e873b90fcb882 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Jan 2022 13:23:15 -0330 Subject: [PATCH 067/115] Bump node-fetch from 2.6.1 to 2.6.7 (#13397) Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.1 to 2.6.7. - [Release notes](https://github.com/node-fetch/node-fetch/releases) - [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.1...v2.6.7) --- updated-dependencies: - dependency-name: node-fetch dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index 9f4947ba5..ff0114883 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19282,11 +19282,18 @@ node-fetch@2.1.2: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5" integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U= -node-fetch@2.6.1, node-fetch@^2.3.0, node-fetch@^2.6.0, node-fetch@^2.6.1: +node-fetch@2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-fetch@^2.3.0, node-fetch@^2.6.0, node-fetch@^2.6.1: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + node-forge@^0.7.1, node-forge@^0.7.5, node-forge@^1.0.0, node-forge@~0.7.6: version "1.2.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.2.1.tgz#82794919071ef2eb5c509293325cec8afd0fd53c" @@ -25964,6 +25971,11 @@ tr46@^2.0.2: dependencies: punycode "^2.1.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + tree-kill@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" @@ -27152,6 +27164,11 @@ webextension-polyfill@^0.7.0: resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.7.0.tgz#0df1120ff0266056319ce1a622b09ad8d4a56505" integrity sha512-su48BkMLxqzTTvPSE1eWxKToPS2Tv5DLGxKexLEVpwFd6Po6N8hhSLIvG6acPAg7qERoEaDL+Y5HQJeJeml5Aw== +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + webidl-conversions@^4.0.1, webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -27293,6 +27310,14 @@ whatwg-url@7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + whatwg-url@^6.3.0: version "6.4.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.0.tgz#08fdf2b9e872783a7a1f6216260a1d66cc722e08" From 516de24cbe394faff7dba31d1d2f8752793709ff Mon Sep 17 00:00:00 2001 From: Shane Date: Mon, 31 Jan 2022 09:09:21 -0800 Subject: [PATCH 068/115] Fixed multiple-notifications css (#13469) --- ui/components/app/multiple-notifications/index.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/components/app/multiple-notifications/index.scss b/ui/components/app/multiple-notifications/index.scss index 2427f7cbe..529e6658a 100644 --- a/ui/components/app/multiple-notifications/index.scss +++ b/ui/components/app/multiple-notifications/index.scss @@ -56,8 +56,8 @@ .home-notification-wrapper--show-first { > div { position: fixed; - bottom: 10px; - right: 10px; + bottom: 8px; + right: 8px; visibility: hidden; } From 41df6eac1cfe3292a9820453197a864802a23544 Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Mon, 31 Jan 2022 22:57:46 +0530 Subject: [PATCH 069/115] Capturing default gas estimates in txMeta and passing it to metrics (#13385) --- app/scripts/controllers/transactions/index.js | 62 +++++++++++-- .../controllers/transactions/index.test.js | 88 +++++++++++++------ 2 files changed, 119 insertions(+), 31 deletions(-) diff --git a/app/scripts/controllers/transactions/index.js b/app/scripts/controllers/transactions/index.js index 217ad82eb..d4d3e3e70 100644 --- a/app/scripts/controllers/transactions/index.js +++ b/app/scripts/controllers/transactions/index.js @@ -543,6 +543,13 @@ export default class TransactionController extends EventEmitter { txMeta.txParams.gas = defaultGasLimit; txMeta.originalGasEstimate = defaultGasLimit; } + txMeta.defaultGasEstimates = { + estimateType: txMeta.userFeeLevel, + gas: txMeta.txParams.gas, + gasPrice: txMeta.txParams.gasPrice, + maxFeePerGas: txMeta.txParams.maxFeePerGas, + maxPriorityFeePerGas: txMeta.txParams.maxPriorityFeePerGas, + }; return txMeta; } @@ -1130,12 +1137,12 @@ export default class TransactionController extends EventEmitter { * fragment for * @param {valueOf} event - event type to create */ - createTransactionEventFragment(transactionId, event) { + async createTransactionEventFragment(transactionId, event) { const txMeta = this.txStateManager.getTransaction(transactionId); const { properties, sensitiveProperties, - } = this._buildEventFragmentProperties(txMeta); + } = await this._buildEventFragmentProperties(txMeta); this._createTransactionEventFragment( txMeta, event, @@ -1474,7 +1481,7 @@ export default class TransactionController extends EventEmitter { } } - _buildEventFragmentProperties(txMeta, extraParams) { + async _buildEventFragmentProperties(txMeta, extraParams) { const { type, time, @@ -1489,6 +1496,7 @@ export default class TransactionController extends EventEmitter { estimateSuggested, estimateUsed, }, + defaultGasEstimates, metamaskNetworkId: network, } = txMeta; const source = referrer === 'metamask' ? 'user' : 'dapp'; @@ -1502,6 +1510,43 @@ export default class TransactionController extends EventEmitter { gasParams.gas_price = gasPrice; } + if (defaultGasEstimates) { + const { estimateType } = defaultGasEstimates; + if (estimateType) { + gasParams.default_estimate = estimateType; + let defaultMaxFeePerGas = txMeta.defaultGasEstimates.maxFeePerGas; + let defaultMaxPriorityFeePerGas = + txMeta.defaultGasEstimates.maxPriorityFeePerGas; + + if ( + [ + GAS_RECOMMENDATIONS.LOW, + GAS_RECOMMENDATIONS.MEDIUM, + GAS_RECOMMENDATIONS.MEDIUM.HIGH, + ].includes(estimateType) + ) { + const { gasFeeEstimates } = await this._getEIP1559GasFeeEstimates(); + if (gasFeeEstimates?.[estimateType]?.suggestedMaxFeePerGas) { + defaultMaxFeePerGas = + gasFeeEstimates[estimateType]?.suggestedMaxFeePerGas; + gasParams.default_max_fee_per_gas = defaultMaxFeePerGas; + } + if (gasFeeEstimates?.[estimateType]?.suggestedMaxPriorityFeePerGas) { + defaultMaxPriorityFeePerGas = + gasFeeEstimates[estimateType]?.suggestedMaxPriorityFeePerGas; + gasParams.default_max_priority_fee_per_gas = defaultMaxPriorityFeePerGas; + } + } + } + + if (txMeta.defaultGasEstimates.gas) { + gasParams.default_gas = txMeta.defaultGasEstimates.gas; + } + if (txMeta.defaultGasEstimates.gasPrice) { + gasParams.default_gas_price = txMeta.defaultGasEstimates.gasPrice; + } + } + if (estimateSuggested) { gasParams.estimate_suggested = estimateSuggested; } @@ -1512,12 +1557,19 @@ export default class TransactionController extends EventEmitter { const gasParamsInGwei = this._getGasValuesInGWEI(gasParams); + let eip1559Version = '0'; + if (txMeta.txParams.maxFeePerGas) { + const { eip1559V2Enabled } = this.preferencesStore.getState(); + eip1559Version = eip1559V2Enabled ? '2' : '1'; + } + const properties = { chain_id: chainId, referrer, source, network, type, + eip_1559_version: eip1559Version, }; const sensitiveProperties = { @@ -1661,14 +1713,14 @@ export default class TransactionController extends EventEmitter { * @param {TransactionMetaMetricsEventString} event - the name of the transaction event * @param {Object} extraParams - optional props and values to include in sensitiveProperties */ - _trackTransactionMetricsEvent(txMeta, event, extraParams = {}) { + async _trackTransactionMetricsEvent(txMeta, event, extraParams = {}) { if (!txMeta) { return; } const { properties, sensitiveProperties, - } = this._buildEventFragmentProperties(txMeta, extraParams); + } = await this._buildEventFragmentProperties(txMeta, extraParams); // Create event fragments for event types that spawn fragments, and ensure // existence of fragments for event types that act upon them. diff --git a/app/scripts/controllers/transactions/index.test.js b/app/scripts/controllers/transactions/index.test.js index 81d113362..36e254f3d 100644 --- a/app/scripts/controllers/transactions/index.test.js +++ b/app/scripts/controllers/transactions/index.test.js @@ -9,6 +9,7 @@ import { createTestProviderTools, getTestAccounts, } from '../../../../test/stub/provider'; +import mockEstimates from '../../../../test/data/mock-estimates.json'; import { TRANSACTION_STATUSES, TRANSACTION_TYPES, @@ -1561,6 +1562,10 @@ describe('Transaction Controller', function () { txController, 'finalizeEventFragment', ); + + sinon + .stub(txController, '_getEIP1559GasFeeEstimates') + .resolves(mockEstimates['fee-market']); }); afterEach(function () { @@ -1587,10 +1592,14 @@ describe('Transaction Controller', function () { chainId: currentChainId, time: 1624408066355, metamaskNetworkId: currentNetworkId, + defaultGasEstimates: { + gas: '0x7b0d', + gasPrice: '0x77359400', + }, }; }); - it('should create an event fragment when transaction added', function () { + it('should create an event fragment when transaction added', async function () { const expectedPayload = { initialEvent: 'Transaction Added', successEvent: 'Transaction Approved', @@ -1600,12 +1609,15 @@ describe('Transaction Controller', function () { persist: true, properties: { chain_id: '0x2a', + eip_1559_version: '0', network: '42', referrer: 'metamask', source: 'user', type: TRANSACTION_TYPES.SIMPLE_SEND, }, sensitiveProperties: { + default_gas: '0.000031501', + default_gas_price: '2', gas_price: '2', gas_limit: '0x7b0d', first_seen: 1624408066355, @@ -1614,7 +1626,7 @@ describe('Transaction Controller', function () { }, }; - txController._trackTransactionMetricsEvent( + await txController._trackTransactionMetricsEvent( txMeta, TRANSACTION_EVENTS.ADDED, ); @@ -1626,9 +1638,9 @@ describe('Transaction Controller', function () { ); }); - it('Should finalize the transaction added fragment as abandoned if user rejects transaction', function () { + it('Should finalize the transaction added fragment as abandoned if user rejects transaction', async function () { fragmentExists = true; - txController._trackTransactionMetricsEvent( + await txController._trackTransactionMetricsEvent( txMeta, TRANSACTION_EVENTS.REJECTED, ); @@ -1643,9 +1655,9 @@ describe('Transaction Controller', function () { }); }); - it('Should finalize the transaction added fragment if user approves transaction', function () { + it('Should finalize the transaction added fragment if user approves transaction', async function () { fragmentExists = true; - txController._trackTransactionMetricsEvent( + await txController._trackTransactionMetricsEvent( txMeta, TRANSACTION_EVENTS.APPROVED, ); @@ -1661,7 +1673,7 @@ describe('Transaction Controller', function () { ); }); - it('should create an event fragment when transaction is submitted', function () { + it('should create an event fragment when transaction is submitted', async function () { const expectedPayload = { initialEvent: 'Transaction Submitted', successEvent: 'Transaction Finalized', @@ -1670,12 +1682,15 @@ describe('Transaction Controller', function () { persist: true, properties: { chain_id: '0x2a', + eip_1559_version: '0', network: '42', referrer: 'metamask', source: 'user', type: TRANSACTION_TYPES.SIMPLE_SEND, }, sensitiveProperties: { + default_gas: '0.000031501', + default_gas_price: '2', gas_price: '2', gas_limit: '0x7b0d', first_seen: 1624408066355, @@ -1684,7 +1699,7 @@ describe('Transaction Controller', function () { }, }; - txController._trackTransactionMetricsEvent( + await txController._trackTransactionMetricsEvent( txMeta, TRANSACTION_EVENTS.SUBMITTED, ); @@ -1696,9 +1711,9 @@ describe('Transaction Controller', function () { ); }); - it('Should finalize the transaction submitted fragment when transaction finalizes', function () { + it('Should finalize the transaction submitted fragment when transaction finalizes', async function () { fragmentExists = true; - txController._trackTransactionMetricsEvent( + await txController._trackTransactionMetricsEvent( txMeta, TRANSACTION_EVENTS.FINALIZED, ); @@ -1733,10 +1748,14 @@ describe('Transaction Controller', function () { chainId: currentChainId, time: 1624408066355, metamaskNetworkId: currentNetworkId, + defaultGasEstimates: { + gas: '0x7b0d', + gasPrice: '0x77359400', + }, }; }); - it('should create an event fragment when transaction added', function () { + it('should create an event fragment when transaction added', async function () { const expectedPayload = { initialEvent: 'Transaction Added', successEvent: 'Transaction Approved', @@ -1746,12 +1765,15 @@ describe('Transaction Controller', function () { persist: true, properties: { chain_id: '0x2a', + eip_1559_version: '0', network: '42', referrer: 'other', source: 'dapp', type: TRANSACTION_TYPES.SIMPLE_SEND, }, sensitiveProperties: { + default_gas: '0.000031501', + default_gas_price: '2', gas_price: '2', gas_limit: '0x7b0d', first_seen: 1624408066355, @@ -1760,7 +1782,7 @@ describe('Transaction Controller', function () { }, }; - txController._trackTransactionMetricsEvent( + await txController._trackTransactionMetricsEvent( txMeta, TRANSACTION_EVENTS.ADDED, ); @@ -1772,10 +1794,10 @@ describe('Transaction Controller', function () { ); }); - it('Should finalize the transaction added fragment as abandoned if user rejects transaction', function () { + it('Should finalize the transaction added fragment as abandoned if user rejects transaction', async function () { fragmentExists = true; - txController._trackTransactionMetricsEvent( + await txController._trackTransactionMetricsEvent( txMeta, TRANSACTION_EVENTS.REJECTED, ); @@ -1790,10 +1812,10 @@ describe('Transaction Controller', function () { }); }); - it('Should finalize the transaction added fragment if user approves transaction', function () { + it('Should finalize the transaction added fragment if user approves transaction', async function () { fragmentExists = true; - txController._trackTransactionMetricsEvent( + await txController._trackTransactionMetricsEvent( txMeta, TRANSACTION_EVENTS.APPROVED, ); @@ -1809,7 +1831,7 @@ describe('Transaction Controller', function () { ); }); - it('should create an event fragment when transaction is submitted', function () { + it('should create an event fragment when transaction is submitted', async function () { const expectedPayload = { initialEvent: 'Transaction Submitted', successEvent: 'Transaction Finalized', @@ -1818,12 +1840,15 @@ describe('Transaction Controller', function () { persist: true, properties: { chain_id: '0x2a', + eip_1559_version: '0', network: '42', referrer: 'other', source: 'dapp', type: TRANSACTION_TYPES.SIMPLE_SEND, }, sensitiveProperties: { + default_gas: '0.000031501', + default_gas_price: '2', gas_price: '2', gas_limit: '0x7b0d', first_seen: 1624408066355, @@ -1832,7 +1857,7 @@ describe('Transaction Controller', function () { }, }; - txController._trackTransactionMetricsEvent( + await txController._trackTransactionMetricsEvent( txMeta, TRANSACTION_EVENTS.SUBMITTED, ); @@ -1844,10 +1869,10 @@ describe('Transaction Controller', function () { ); }); - it('Should finalize the transaction submitted fragment when transaction finalizes', function () { + it('Should finalize the transaction submitted fragment when transaction finalizes', async function () { fragmentExists = true; - txController._trackTransactionMetricsEvent( + await txController._trackTransactionMetricsEvent( txMeta, TRANSACTION_EVENTS.FINALIZED, ); @@ -1864,7 +1889,7 @@ describe('Transaction Controller', function () { }); }); - it('should create missing fragments when events happen out of order or are missing', function () { + it('should create missing fragments when events happen out of order or are missing', async function () { const txMeta = { id: 1, status: TRANSACTION_STATUSES.UNAPPROVED, @@ -1890,6 +1915,7 @@ describe('Transaction Controller', function () { persist: true, properties: { chain_id: '0x2a', + eip_1559_version: '0', network: '42', referrer: 'other', source: 'dapp', @@ -1903,7 +1929,7 @@ describe('Transaction Controller', function () { status: 'unapproved', }, }; - txController._trackTransactionMetricsEvent( + await txController._trackTransactionMetricsEvent( txMeta, TRANSACTION_EVENTS.APPROVED, ); @@ -1920,7 +1946,7 @@ describe('Transaction Controller', function () { assert.deepEqual(finalizeEventFragmentSpy.getCall(0).args[1], undefined); }); - it('should call _trackMetaMetricsEvent with the correct payload (extra params)', function () { + it('should call _trackMetaMetricsEvent with the correct payload (extra params)', async function () { const txMeta = { id: 1, status: TRANSACTION_STATUSES.UNAPPROVED, @@ -1950,6 +1976,7 @@ describe('Transaction Controller', function () { source: 'dapp', type: TRANSACTION_TYPES.SIMPLE_SEND, chain_id: '0x2a', + eip_1559_version: '0', }, sensitiveProperties: { baz: 3.0, @@ -1962,7 +1989,7 @@ describe('Transaction Controller', function () { }, }; - txController._trackTransactionMetricsEvent( + await txController._trackTransactionMetricsEvent( txMeta, TRANSACTION_EVENTS.ADDED, { @@ -1978,7 +2005,7 @@ describe('Transaction Controller', function () { ); }); - it('should call _trackMetaMetricsEvent with the correct payload (EIP-1559)', function () { + it('should call _trackMetaMetricsEvent with the correct payload (EIP-1559)', async function () { const txMeta = { id: 1, status: TRANSACTION_STATUSES.UNAPPROVED, @@ -1997,6 +2024,11 @@ describe('Transaction Controller', function () { chainId: currentChainId, time: 1624408066355, metamaskNetworkId: currentNetworkId, + defaultGasEstimates: { + estimateType: 'medium', + maxFeePerGas: '0x77359400', + maxPriorityFeePerGas: '0x77359400', + }, }; const expectedPayload = { initialEvent: 'Transaction Added', @@ -2007,6 +2039,7 @@ describe('Transaction Controller', function () { category: 'Transactions', properties: { chain_id: '0x2a', + eip_1559_version: '1', network: '42', referrer: 'other', source: 'dapp', @@ -2023,10 +2056,13 @@ describe('Transaction Controller', function () { status: 'unapproved', estimate_suggested: GAS_RECOMMENDATIONS.MEDIUM, estimate_used: GAS_RECOMMENDATIONS.HIGH, + default_estimate: 'medium', + default_max_fee_per_gas: '70', + default_max_priority_fee_per_gas: '7', }, }; - txController._trackTransactionMetricsEvent( + await txController._trackTransactionMetricsEvent( txMeta, TRANSACTION_EVENTS.ADDED, { From 09ac38977e6d4b142123d0bc2da0cb7f60ddd507 Mon Sep 17 00:00:00 2001 From: Shane Date: Mon, 31 Jan 2022 10:41:07 -0800 Subject: [PATCH 070/115] Add TextArea to safe components list (#13468) These changes were split off from the snaps branch [here](https://github.com/MetaMask/metamask-extension/pull/11837#discussion_r792944264). --- .../app/metamask-template-renderer/safe-component-list.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/components/app/metamask-template-renderer/safe-component-list.js b/ui/components/app/metamask-template-renderer/safe-component-list.js index 72571832b..5e57b954f 100644 --- a/ui/components/app/metamask-template-renderer/safe-component-list.js +++ b/ui/components/app/metamask-template-renderer/safe-component-list.js @@ -7,6 +7,7 @@ import Typography from '../../ui/typography'; import Box from '../../ui/box'; import MetaMaskTranslation from '../metamask-translation'; import NetworkDisplay from '../network-display'; +import TextArea from '../../ui/textarea/textarea'; export const safeComponentList = { MetaMaskTranslation, @@ -23,4 +24,5 @@ export const safeComponentList = { Popover, Box, NetworkDisplay, + TextArea, }; From dc217dd536690067cf020fb7ed652ed56a7e79c3 Mon Sep 17 00:00:00 2001 From: Alex Donesky Date: Mon, 31 Jan 2022 12:56:49 -0600 Subject: [PATCH 071/115] Yet more NFT UX cleanups (#13435) * yet more nft ux cleanups --- app/_locales/en/messages.json | 3 + app/scripts/controllers/preferences.js | 12 +-- .../collectibles-items/collectibles-items.js | 55 ++++++++++--- .../app/collectibles-items/index.scss | 1 - .../app/collectibles-tab/collectibles-tab.js | 61 +++----------- .../collectibles-tab/collectibles-tab.test.js | 2 + ui/components/app/collectibles-tab/index.scss | 8 ++ ui/hooks/useCollectiblesCollections.js | 80 +++++++++++++++++++ 8 files changed, 152 insertions(+), 70 deletions(-) create mode 100644 ui/hooks/useCollectiblesCollections.js diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 57d75d983..aab5b20e3 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -1640,6 +1640,9 @@ "loading": { "message": "Loading..." }, + "loadingNFTs": { + "message": "Loading NFTs..." + }, "loadingTokens": { "message": "Loading Tokens..." }, diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index 037359453..f63a883b6 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -134,16 +134,10 @@ export default class PreferencesController { /** * Setter for the `useCollectibleDetection` property * - * @param {boolean} val - Whether or not the user prefers to autodetect collectibles. + * @param {boolean} useCollectibleDetection - Whether or not the user prefers to autodetect collectibles. */ - setUseCollectibleDetection(val) { - const { openSeaEnabled } = this.store.getState(); - if (val && !openSeaEnabled) { - throw new Error( - 'useCollectibleDetection cannot be enabled if openSeaEnabled is false', - ); - } - this.store.updateState({ useCollectibleDetection: val }); + setUseCollectibleDetection(useCollectibleDetection) { + this.store.updateState({ useCollectibleDetection }); } /** diff --git a/ui/components/app/collectibles-items/collectibles-items.js b/ui/components/app/collectibles-items/collectibles-items.js index 43f2af6fc..90bf3e48b 100644 --- a/ui/components/app/collectibles-items/collectibles-items.js +++ b/ui/components/app/collectibles-items/collectibles-items.js @@ -17,7 +17,11 @@ import { } from '../../../helpers/constants/design-system'; import { ENVIRONMENT_TYPE_POPUP } from '../../../../shared/constants/app'; import { getEnvironmentType } from '../../../../app/scripts/lib/util'; -import { getIpfsGateway } from '../../../selectors'; +import { + getCurrentChainId, + getIpfsGateway, + getSelectedAddress, +} from '../../../selectors'; import { ASSET_ROUTE } from '../../../helpers/constants/routes'; import { getAssetImageURL } from '../../../helpers/utils/util'; import { updateCollectibleDropDownState } from '../../../store/actions'; @@ -39,22 +43,39 @@ export default function CollectiblesItems({ const collectionsKeys = Object.keys(collections); const collectiblesDropdownState = useSelector(getCollectiblesDropdownState); const previousCollectionKeys = usePrevious(collectionsKeys); + const selectedAddress = useSelector(getSelectedAddress); + const chainId = useSelector(getCurrentChainId); useEffect(() => { if ( - !Object.keys(collectiblesDropdownState).length && - previousCollectionKeys !== collectionsKeys + chainId !== undefined && + selectedAddress !== undefined && + previousCollectionKeys !== collectionsKeys && + (collectiblesDropdownState?.[selectedAddress]?.[chainId] === undefined || + Object.keys(collectiblesDropdownState?.[selectedAddress]?.[chainId]) + .length === 0) ) { const initState = {}; collectionsKeys.forEach((key) => { initState[key] = true; }); - dispatch(updateCollectibleDropDownState(initState)); + + const newCollectibleDropdownState = { + ...collectiblesDropdownState, + [selectedAddress]: { + ...collectiblesDropdownState?.[selectedAddress], + [chainId]: initState, + }, + }; + + dispatch(updateCollectibleDropDownState(newCollectibleDropdownState)); } }, [ collectionsKeys, previousCollectionKeys, collectiblesDropdownState, + selectedAddress, + chainId, dispatch, ]); @@ -84,6 +105,22 @@ export default function CollectiblesItems({ ); }; + const updateCollectibleDropDownStateKey = (key, isExpanded) => { + const currentAccountCollectibleDropdownState = + collectiblesDropdownState[selectedAddress][chainId]; + + const newCurrentAccountState = { + ...currentAccountCollectibleDropdownState, + [key]: !isExpanded, + }; + + collectiblesDropdownState[selectedAddress][ + chainId + ] = newCurrentAccountState; + + dispatch(updateCollectibleDropDownState(collectiblesDropdownState)); + }; + const renderCollection = ({ collectibles, collectionName, @@ -95,17 +132,13 @@ export default function CollectiblesItems({ return null; } - const isExpanded = collectiblesDropdownState[key]; + const isExpanded = + collectiblesDropdownState[selectedAddress]?.[chainId]?.[key]; return (
))} diff --git a/ui/components/app/connected-sites-list/index.scss b/ui/components/app/connected-sites-list/index.scss index a46b2c13e..21167a9ce 100644 --- a/ui/components/app/connected-sites-list/index.scss +++ b/ui/components/app/connected-sites-list/index.scss @@ -13,6 +13,14 @@ align-items: center; border-top: 1px solid #d2d8dd; padding: 16px 24px; + + & &-link-button { + @include H7; + + padding: 0; + width: auto; + padding-inline-start: 24px; + } } &__subject-info { @@ -32,8 +40,4 @@ text-overflow: ellipsis; margin-left: 6px; } - - &__trash { - cursor: pointer; - } } From 37f930ddf67c04437ecbd70e0564692df4a0a8aa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Jan 2022 16:30:44 -0700 Subject: [PATCH 074/115] Bump cached-path-relative from 1.0.2 to 1.1.0 (#13424) Bumps [cached-path-relative](https://github.com/ashaffer/cached-path-relative) from 1.0.2 to 1.1.0. - [Release notes](https://github.com/ashaffer/cached-path-relative/releases) - [Commits](https://github.com/ashaffer/cached-path-relative/commits) --- updated-dependencies: - dependency-name: cached-path-relative dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index ff0114883..c2c7fe226 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7311,9 +7311,9 @@ cacheable-request@^6.0.0: responselike "^1.0.2" cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db" - integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.1.0.tgz#865576dfef39c0d6a7defde794d078f5308e3ef3" + integrity sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA== caching-transform@^4.0.0: version "4.0.0" From 3a75f68a154d5c3c70c3b5a7abe46cff3c9ba822 Mon Sep 17 00:00:00 2001 From: Ariella Vu <20778143+digiwand@users.noreply.github.com> Date: Tue, 1 Feb 2022 03:32:43 +0000 Subject: [PATCH 075/115] #10168 - Fix to Can't open settings if browser zoom level > 100% part 2 (#13460) * AccountMenu: fix #10168 w/ position: absolute - use right: 1rem to match .app-header padding * scss: Use px instead of rem for positioning Co-authored-by: George Marshall Co-authored-by: George Marshall --- ui/components/app/account-menu/index.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/components/app/account-menu/index.scss b/ui/components/app/account-menu/index.scss index 05d3fd6e5..1b5099678 100644 --- a/ui/components/app/account-menu/index.scss +++ b/ui/components/app/account-menu/index.scss @@ -1,5 +1,5 @@ .account-menu { - position: fixed; + position: absolute; z-index: 100; top: 58px; width: 320px; @@ -10,7 +10,7 @@ color: var(--white); @media screen and (max-width: $break-small) { - right: calc(((100vw - 100%) / 2) + 8px); + right: 16px; } @media screen and (min-width: $break-large) { From a5b114c4f9085ff1dbc3432eec55bfd87fde7ada Mon Sep 17 00:00:00 2001 From: Ariella Vu <20778143+digiwand@users.noreply.github.com> Date: Tue, 1 Feb 2022 15:30:15 +0000 Subject: [PATCH 076/115] Use ActionableMessage for ConfirmAddSuggestionToken warnings (#13402) * ConfirmAddSuggestedToken: update duplicate logic * ConfirmAddSuggestedToken: update duplicate fn names * ConfirmAddSuggestedToken: add ActionableMessage - fixes #13347 * base-styles.scss: deprecate .warning * ConfirmAddSuggestedTokens: update @param desc Co-authored-by: Alex Donesky * ConfirmAddSuggestedTokens: update @param desc Co-authored-by: Alex Donesky * ConfirmAddSuggestedTokens: update @param desc Co-authored-by: Alex Donesky * ConfirmAddSuggestedTokens: update @param desc Co-authored-by: Alex Donesky * ConfirmAddSuggestedToken: clean JSDoc comments - following GitHub suggestion commits * ConfirmAddSuggestedToken: warning Learn More btn * add zendesk-url constants - use for ConfirmAddSuggestedToken & ImportToken pages * storybook: add ConfirmAddSuggestedToken controls * stories: add ConfirmAddSuggestedTokens states * stories: rm unused args ConfirmAddSuggestedToken * rn ZENDESK_URL -> ZENDESK_URLS * AddSuggestedToken: check case-insensitive symbols Co-authored-by: Alex Donesky --- .storybook/test-data.js | 2 +- app/_locales/el/messages.json | 2 +- app/_locales/en/messages.json | 2 +- app/_locales/fr/messages.json | 2 +- app/_locales/hi/messages.json | 2 +- app/_locales/id/messages.json | 2 +- app/_locales/ja/messages.json | 2 +- app/_locales/ko/messages.json | 2 +- app/_locales/ru/messages.json | 2 +- app/_locales/tl/messages.json | 2 +- app/_locales/tr/messages.json | 2 +- app/_locales/vi/messages.json | 2 +- app/_locales/zh_CN/messages.json | 2 +- ui/css/base-styles.scss | 8 -- ui/helpers/constants/zendesk-url.js | 6 + .../confirm-add-suggested-token.component.js | 117 +++++++++++----- .../confirm-add-suggested-token.stories.js | 126 +++++++++++++----- .../confirm-add-suggested-token/index.scss | 9 ++ .../import-token/import-token.component.js | 3 +- ui/pages/pages.scss | 1 + 20 files changed, 207 insertions(+), 89 deletions(-) create mode 100644 ui/helpers/constants/zendesk-url.js create mode 100644 ui/pages/confirm-add-suggested-token/index.scss diff --git a/.storybook/test-data.js b/.storybook/test-data.js index 3f732bc90..0c5a3e68d 100644 --- a/.storybook/test-data.js +++ b/.storybook/test-data.js @@ -907,7 +907,7 @@ const state = { '0xaD6D458402F60fD3Bd25163575031ACDce07538D': './sai.svg', }, hiddenTokens: [], - suggestedAssets: {}, + suggestedAssets: [], useNonceField: false, usePhishDetect: true, lostIdentities: {}, diff --git a/app/_locales/el/messages.json b/app/_locales/el/messages.json index 54bfac435..84c2c8c6d 100644 --- a/app/_locales/el/messages.json +++ b/app/_locales/el/messages.json @@ -1444,7 +1444,7 @@ "message": "Γνωστή διεύθυνση συμβολαίου." }, "knownTokenWarning": { - "message": "Αυτή η ενέργεια θα επεξεργαστεί tokens που είναι ήδη εισηγμένα στο πορτοφόλι σας, τα οποίαο μπορεί να χρησιμοποιηθούν για να σας κλέψουν στοιχεία. Αποδεχθείτε μόνο αν είστε σίγουροι ότι θέλετε να αλλάξετε αυτό που αντιπροσωπεύουν αυτά τα νομίσματα." + "message": "Αυτή η ενέργεια θα επεξεργαστεί tokens που είναι ήδη εισηγμένα στο πορτοφόλι σας, τα οποίαο μπορεί να χρησιμοποιηθούν για να σας κλέψουν στοιχεία. Αποδεχθείτε μόνο αν είστε σίγουροι ότι θέλετε να αλλάξετε αυτό που αντιπροσωπεύουν αυτά τα νομίσματα. Μάθετε περισσότερά γι'αυτό $1" }, "kovan": { "message": "Δίκτυο Δοκιμής Kovan" diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index aab5b20e3..9ee9a52a9 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -1547,7 +1547,7 @@ "message": "Known contract address." }, "knownTokenWarning": { - "message": "This action will edit tokens that are already listed in your wallet, which can be used to phish you. Only approve if you are certain that you mean to change what these tokens represent." + "message": "This action will edit tokens that are already listed in your wallet, which can be used to phish you. Only approve if you are certain that you mean to change what these tokens represent. Learn more about $1" }, "kovan": { "message": "Kovan Test Network" diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json index 0ffc814c2..e27785877 100644 --- a/app/_locales/fr/messages.json +++ b/app/_locales/fr/messages.json @@ -1444,7 +1444,7 @@ "message": "Adresse contractuelle connue." }, "knownTokenWarning": { - "message": "Cette action modifiera les jetons déjà présents dans votre portefeuille, et risque de favoriser les tentatives d’hameçonnage. N’approuvez que si vous êtes certain·e de vouloir modifier ce que ces jetons représentent." + "message": "Cette action modifiera les jetons déjà présents dans votre portefeuille, et risque de favoriser les tentatives d’hameçonnage. N’approuvez que si vous êtes certain·e de vouloir modifier ce que ces jetons représentent. En savoir plus sur $1" }, "kovan": { "message": "Réseau de test Kovan" diff --git a/app/_locales/hi/messages.json b/app/_locales/hi/messages.json index a8d4771f6..9dfa6f75b 100644 --- a/app/_locales/hi/messages.json +++ b/app/_locales/hi/messages.json @@ -1444,7 +1444,7 @@ "message": "ज्ञात अनुबंध पता।" }, "knownTokenWarning": { - "message": "यह कार्रवाई उन टोकन को संपादित करेगी, जो पहले से ही आपके वॉलेट में सूचीबद्ध हैं, जिसका उपयोग आपको फ़िश करने के लिए किया जा सकता है। केवल तभी अनुमोदित करें, जब आप इस बात को लेकर सुनिश्चित हों कि आप इन टोकन का प्रतिनिधित्व बदलना चाहते हैं।" + "message": "यह कार्रवाई उन टोकन को संपादित करेगी, जो पहले से ही आपके वॉलेट में सूचीबद्ध हैं, जिसका उपयोग आपको फ़िश करने के लिए किया जा सकता है। केवल तभी अनुमोदित करें, जब आप इस बात को लेकर सुनिश्चित हों कि आप इन टोकन का प्रतिनिधित्व बदलना चाहते हैं। $1 के बारे में और अधिक जानें" }, "kovan": { "message": "Kovan टेस्ट नेटवर्क" diff --git a/app/_locales/id/messages.json b/app/_locales/id/messages.json index 517246dba..6148f18f9 100644 --- a/app/_locales/id/messages.json +++ b/app/_locales/id/messages.json @@ -1444,7 +1444,7 @@ "message": "Alamat kontrak yang diketahui." }, "knownTokenWarning": { - "message": "Tindakan ini akan mengedit token yang telah terdaftar dalam dompet Anda, yang dapat digunakan untuk menipu Anda. Setujui hanya jika Anda yakin bahwa Anda ingin mengubah apa yang diwakili token ini." + "message": "Tindakan ini akan mengedit token yang telah terdaftar dalam dompet Anda, yang dapat digunakan untuk menipu Anda. Setujui hanya jika Anda yakin bahwa Anda ingin mengubah apa yang diwakili token ini. Pelajari selengkapnya seputar $1" }, "kovan": { "message": "Jaringan Uji Kovan" diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json index 5ee38a574..b1fae7296 100644 --- a/app/_locales/ja/messages.json +++ b/app/_locales/ja/messages.json @@ -1444,7 +1444,7 @@ "message": "既知のコントラクト アドレスです。" }, "knownTokenWarning": { - "message": "このアクションは、ウォレットに既に一覧表示されているトークンを編集します。これは、フィッシングに使用される可能性があります。これらのトークンの表す内容を変更する意図が確実な場合にのみ承認します。" + "message": "このアクションは、ウォレットに既に一覧表示されているトークンを編集します。これは、フィッシングに使用される可能性があります。これらのトークンの表す内容を変更する意図が確実な場合にのみ承認します。$1に関する詳細をご覧ください" }, "kovan": { "message": "Kovan テスト ネットワーク" diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index 5e0f350f8..3cffd545f 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -1444,7 +1444,7 @@ "message": "알려진 계약 주소입니다." }, "knownTokenWarning": { - "message": "이 작업은 지갑에 이미 나열되어 있고 피싱에 사용될 수 있는 토큰을 편집합니다. 해당 토큰이 나타내는 내용을 변경하려는 경우에만 작업을 승인하세요." + "message": "이 작업은 지갑에 이미 나열되어 있고 피싱에 사용될 수 있는 토큰을 편집합니다. 해당 토큰이 나타내는 내용을 변경하려는 경우에만 작업을 승인하세요. $1에 대해 자세히 알아보기" }, "kovan": { "message": "Kovan 테스트 네트워크" diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json index 75eec4dad..94cf6bc5d 100644 --- a/app/_locales/ru/messages.json +++ b/app/_locales/ru/messages.json @@ -1444,7 +1444,7 @@ "message": "Известный адрес контракта." }, "knownTokenWarning": { - "message": "Это действие изменит токены, уже указанные в вашем кошельке, которые можно использовать для фишинга. Утверждайте, только если вы уверены, что хотите изменить то, что представляют эти токены." + "message": "Это действие изменит токены, уже указанные в вашем кошельке, которые можно использовать для фишинга. Утверждайте, только если вы уверены, что хотите изменить то, что представляют эти токены. Узнайте подробнее о $1" }, "kovan": { "message": "Тестовая сеть Kovan" diff --git a/app/_locales/tl/messages.json b/app/_locales/tl/messages.json index 02d2ccda2..91d3afe05 100644 --- a/app/_locales/tl/messages.json +++ b/app/_locales/tl/messages.json @@ -1444,7 +1444,7 @@ "message": "Kilalang address ng kontrata." }, "knownTokenWarning": { - "message": "Mae-edit ng aksyong ito ang mga token na nakalista na sa iyong wallet, na puwedeng gamitin para i-phish ka. Aprubahan lang kung sigurado kang gusto mong baguhin kung ano ang kinakatawan ng mga token na ito." + "message": "Mae-edit ng aksyong ito ang mga token na nakalista na sa iyong wallet, na puwedeng gamitin para i-phish ka. Aprubahan lang kung sigurado kang gusto mong baguhin kung ano ang kinakatawan ng mga token na ito. Alamin pa ang tungkol sa $1" }, "kovan": { "message": "Kovan Test Network" diff --git a/app/_locales/tr/messages.json b/app/_locales/tr/messages.json index 42e5c4e2e..664f13ee9 100644 --- a/app/_locales/tr/messages.json +++ b/app/_locales/tr/messages.json @@ -1444,7 +1444,7 @@ "message": "Bilinen sözleşme adresi." }, "knownTokenWarning": { - "message": "Bu eylem kimlik avı için kullanılabilecek şekilde cüzdanınızda zaten listelenmiş olan tokenleri düzenleyecektir. Sadece bu tokenlerin neyi temsil ettiğini değiştirmek istediğinizden eminseniz onaylayın." + "message": "Bu eylem kimlik avı için kullanılabilecek şekilde cüzdanınızda zaten listelenmiş olan tokenleri düzenleyecektir. Sadece bu tokenlerin neyi temsil ettiğini değiştirmek istediğinizden eminseniz onaylayın. $1 hakkında daha fazla bilgi edinin" }, "kovan": { "message": "Kovan Test Ağı" diff --git a/app/_locales/vi/messages.json b/app/_locales/vi/messages.json index 08e7c9211..24d61f173 100644 --- a/app/_locales/vi/messages.json +++ b/app/_locales/vi/messages.json @@ -1444,7 +1444,7 @@ "message": "Địa chỉ hợp đồng đã biết." }, "knownTokenWarning": { - "message": "Hành động này sẽ chỉnh sửa các token đã niêm yết trong ví của bạn, kẻ xấu có thể lợi dụng việc này để lừa đảo bạn. Chỉ phê duyệt nếu bạn chắc chắn rằng bạn muốn thay đổi giá trị mà những token này đại diện cho." + "message": "Hành động này sẽ chỉnh sửa các token đã niêm yết trong ví của bạn, kẻ xấu có thể lợi dụng việc này để lừa đảo bạn. Chỉ phê duyệt nếu bạn chắc chắn rằng bạn muốn thay đổi giá trị mà những token này đại diện cho. Tìm hiểu thêm về $1" }, "kovan": { "message": "Mạng thử nghiệm Kovan" diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index 5d8c4c2a8..42c8f7b6f 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -1444,7 +1444,7 @@ "message": "已知接收方地址。" }, "knownTokenWarning": { - "message": "此操作将编辑已经在您的钱包中列出的代币,有肯能被用来欺骗您。只有确定要更改这些代币的内容时,才通过此操作。" + "message": "此操作将编辑已经在您的钱包中列出的代币,有肯能被用来欺骗您。只有确定要更改这些代币的内容时,才通过此操作。了解更多关于 $1" }, "kovan": { "message": "Kovan 测试网络" diff --git a/ui/css/base-styles.scss b/ui/css/base-styles.scss index b3fe24ac0..22f9acd31 100644 --- a/ui/css/base-styles.scss +++ b/ui/css/base-styles.scss @@ -43,14 +43,6 @@ html { margin-bottom: 9px; } -/* - This warning class is used in the following files still: - /ui/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js -*/ -.warning { - color: #ffae00; -} - /* stylelint-disable */ #app-content { overflow-x: hidden; diff --git a/ui/helpers/constants/zendesk-url.js b/ui/helpers/constants/zendesk-url.js new file mode 100644 index 000000000..d9d2e3d2b --- /dev/null +++ b/ui/helpers/constants/zendesk-url.js @@ -0,0 +1,6 @@ +const ZENDESK_URLS = { + TOKEN_SAFETY_PRACTICES: + 'https://metamask.zendesk.com/hc/en-us/articles/4403988839451', +}; + +export default ZENDESK_URLS; diff --git a/ui/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js b/ui/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js index 60656b753..45a5e8566 100644 --- a/ui/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js +++ b/ui/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js @@ -1,15 +1,56 @@ -import React, { useContext, useEffect } from 'react'; +import React, { useContext, useEffect, useMemo } from 'react'; import PropTypes from 'prop-types'; +import ActionableMessage from '../../components/ui/actionable-message/actionable-message'; import Button from '../../components/ui/button'; import Identicon from '../../components/ui/identicon'; import TokenBalance from '../../components/ui/token-balance'; import { I18nContext } from '../../contexts/i18n'; import { MetaMetricsContext } from '../../contexts/metametrics'; +import ZENDESK_URLS from '../../helpers/constants/zendesk-url'; import { isEqualCaseInsensitive } from '../../helpers/utils/util'; function getTokenName(name, symbol) { return typeof name === 'undefined' ? symbol : `${name} (${symbol})`; } + +/** + * @param {Array} suggestedAssets - an array of assets suggested to add to the user's wallet + * via the RPC method `wallet_watchAsset` + * @param {Array} tokens - the list of tokens currently tracked in state + * @returns {boolean} Returns true when the list of suggestedAssets contains an entry with + * an address that matches an existing token. + */ +function hasDuplicateAddress(suggestedAssets, tokens) { + const duplicate = suggestedAssets.find(({ asset }) => { + const dupe = tokens.find(({ address }) => { + return isEqualCaseInsensitive(address, asset.address); + }); + return Boolean(dupe); + }); + return Boolean(duplicate); +} + +/** + * @param {Array} suggestedAssets - a list of assets suggested to add to the user's wallet + * via RPC method `wallet_watchAsset` + * @param {Array} tokens - the list of tokens currently tracked in state + * @returns {boolean} Returns true when the list of suggestedAssets contains an entry with both + * 1. a symbol that matches an existing token + * 2. an address that does not match an existing token + */ +function hasDuplicateSymbolAndDiffAddress(suggestedAssets, tokens) { + const duplicate = suggestedAssets.find(({ asset }) => { + const dupe = tokens.find((token) => { + return ( + isEqualCaseInsensitive(token.symbol, asset.symbol) && + !isEqualCaseInsensitive(token.address, asset.address) + ); + }); + return Boolean(dupe); + }); + return Boolean(duplicate); +} + const ConfirmAddSuggestedToken = (props) => { const { acceptWatchAsset, @@ -37,38 +78,44 @@ const ConfirmAddSuggestedToken = (props) => { }); }; - /** - * Returns true if any suggestedAssets both: - * - Share a symbol with an existing `tokens` member. - * - Does not share an address with that same `tokens` member. - * This should be flagged as possibly deceptive or confusing. - */ - const checkNameReuse = () => { - const duplicates = suggestedAssets.filter(({ asset }) => { - const dupes = tokens.filter( - (old) => - old.symbol === asset.symbol && - !isEqualCaseInsensitive(old.address, asset.address), - ); - return dupes.length > 0; - }); - return duplicates.length > 0; - }; - - const checkTokenDuplicates = () => { - const pending = suggestedAssets.map(({ asset }) => - asset.address.toUpperCase(), + const knownTokenActionableMessage = useMemo(() => { + return ( + hasDuplicateAddress(suggestedAssets, tokens) && ( + + {t('learnScamRisk')} + , + ])} + type="warning" + withRightButton + useIcon + iconFillColor="#f8c000" + /> + ) ); - const existing = tokens.map((token) => token.address.toUpperCase()); - const dupes = pending.filter((proposed) => { - return existing.includes(proposed); - }); + }, [suggestedAssets, tokens, t]); - return dupes.length > 0; - }; - - const hasTokenDuplicates = checkTokenDuplicates(); - const reusesName = checkNameReuse(); + const reusedTokenNameActionableMessage = useMemo(() => { + return ( + hasDuplicateSymbolAndDiffAddress(suggestedAssets, tokens) && ( + + ) + ); + }, [suggestedAssets, tokens, t]); useEffect(() => { if (!suggestedAssets.length) { @@ -83,12 +130,8 @@ const ConfirmAddSuggestedToken = (props) => {
{t('likeToImportTokens')}
- {hasTokenDuplicates ? ( -
{t('knownTokenWarning')}
- ) : null} - {reusesName ? ( -
{t('reusedTokenNameWarning')}
- ) : null} + {knownTokenActionableMessage} + {reusedTokenNameActionableMessage}
diff --git a/ui/pages/confirm-add-suggested-token/confirm-add-suggested-token.stories.js b/ui/pages/confirm-add-suggested-token/confirm-add-suggested-token.stories.js index 4969ef6f2..c5cf1f5e4 100644 --- a/ui/pages/confirm-add-suggested-token/confirm-add-suggested-token.stories.js +++ b/ui/pages/confirm-add-suggested-token/confirm-add-suggested-token.stories.js @@ -2,61 +2,127 @@ import React, { useEffect } from 'react'; import { text } from '@storybook/addon-knobs'; import { store, getNewState } from '../../../.storybook/preview'; -import { suggestedAssets } from '../../../.storybook/initial-states/approval-screens/add-suggested-token'; +import { suggestedAssets as mockSuggestedAssets } from '../../../.storybook/initial-states/approval-screens/add-suggested-token'; import { updateMetamaskState } from '../../store/actions'; import ConfirmAddSuggestedToken from '.'; export default { title: 'Pages/ConfirmAddSuggestedToken', id: __filename, + argTypes: { + // Data + tokens: { + control: 'array', + table: { category: 'Data' }, + }, + suggestedAssets: { + control: 'array', + table: { category: 'Data' }, + }, + + // Text + mostRecentOverviewPage: { + control: { type: 'text', disable: true }, + table: { category: 'Text' }, + }, + + // Events + acceptWatchAsset: { + action: 'acceptWatchAsset', + table: { category: 'Events' }, + }, + history: { + action: 'history', + table: { category: 'Events' }, + }, + rejectWatchAsset: { + action: 'rejectWatchAsset', + table: { category: 'Events' }, + }, + }, }; -const PageSet = ({ children }) => { +const { metamask: state } = store.getState(); + +const PageSet = ({ children, suggestedAssets, tokens }) => { const symbol = text('symbol', 'META'); const image = text('Icon URL', 'metamark.svg'); - const state = store.getState(); - const suggestedAssetsState = state.metamask.suggestedAssets; + useEffect(() => { + if (!suggestedAssets?.length) { + return; + } + + suggestedAssets[0].asset.image = image; + suggestedAssets[0].asset.symbol = symbol; + + store.dispatch( + updateMetamaskState( + getNewState(state, { + suggestedAssets, + }), + ), + ); + }, [image, suggestedAssets, symbol]); useEffect(() => { - suggestedAssetsState[0].symbol = symbol; store.dispatch( updateMetamaskState( - getNewState(state.metamask, { - suggestedAssets: suggestedAssetsState, + getNewState(state, { + tokens, }), ), ); - }, [symbol, suggestedAssetsState, state.metamask]); - useEffect(() => { - suggestedAssetsState[0].image = image; - store.dispatch( - updateMetamaskState( - getNewState(state.metamask, { - suggestedAssets: suggestedAssetsState, - }), - ), - ); - }, [image, suggestedAssetsState, state.metamask]); + }, [tokens]); return children; }; -export const DefaultStory = () => { - const state = store.getState(); - store.dispatch( - updateMetamaskState( - getNewState(state.metamask, { - suggestedAssets, - }), - ), - ); - +export const DefaultStory = ({ suggestedAssets, tokens }) => { return ( - + ); }; - DefaultStory.storyName = 'Default'; +DefaultStory.args = { + suggestedAssets: [...mockSuggestedAssets], + tokens: [], +}; + +export const WithDuplicateAddress = ({ suggestedAssets, tokens }) => { + return ( + + + + ); +}; +WithDuplicateAddress.args = { + suggestedAssets: [...mockSuggestedAssets], + tokens: [ + { + ...mockSuggestedAssets[0].asset, + }, + ], +}; + +export const WithDuplicateSymbolAndDifferentAddress = ({ + suggestedAssets, + tokens, +}) => { + return ( + + + + ); +}; +WithDuplicateSymbolAndDifferentAddress.args = { + suggestedAssets: [...mockSuggestedAssets], + tokens: [ + { + ...mockSuggestedAssets[0].asset, + address: '0xNonSuggestedAddress', + }, + ], +}; diff --git a/ui/pages/confirm-add-suggested-token/index.scss b/ui/pages/confirm-add-suggested-token/index.scss new file mode 100644 index 000000000..63ee8c657 --- /dev/null +++ b/ui/pages/confirm-add-suggested-token/index.scss @@ -0,0 +1,9 @@ +.confirm-add-suggested-token { + &__link { + @include H7; + + display: inline; + color: var(--primary-blue); + padding-left: 0; + } +} diff --git a/ui/pages/import-token/import-token.component.js b/ui/pages/import-token/import-token.component.js index ec52f6c44..77cc89657 100644 --- a/ui/pages/import-token/import-token.component.js +++ b/ui/pages/import-token/import-token.component.js @@ -2,6 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { getTokenTrackerLink } from '@metamask/etherscan-link'; import contractMap from '@metamask/contract-metadata'; +import ZENDESK_URLS from '../../helpers/constants/zendesk-url'; import { checkExistingAddresses, getURLHostName, @@ -359,7 +360,7 @@ class ImportToken extends Component { className="import-token__link" rel="noopener noreferrer" target="_blank" - href="https://metamask.zendesk.com/hc/en-us/articles/4403988839451" + href={ZENDESK_URLS.TOKEN_SAFETY_PRACTICES} > {this.context.t('learnScamRisk')} , diff --git a/ui/pages/pages.scss b/ui/pages/pages.scss index 7dd854a29..175f9145a 100644 --- a/ui/pages/pages.scss +++ b/ui/pages/pages.scss @@ -2,6 +2,7 @@ @import 'import-token/index'; @import 'asset/asset'; @import 'confirm-import-token/index'; +@import 'confirm-add-suggested-token/index'; @import 'confirm-approve/index'; @import 'confirm-decrypt-message/confirm-decrypt-message'; @import 'confirm-encryption-public-key/confirm-encryption-public-key'; From cc1861a34eea48cd6d337476e0e553b3aa50653e Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Tue, 1 Feb 2022 23:23:03 +0530 Subject: [PATCH 077/115] Adding metrics events for EIP-1559 V2 flow (#13329) --- app/scripts/controllers/transactions/index.js | 2 ++ .../controllers/transactions/index.test.js | 14 ++++++++ .../advanced-gas-fee-defaults.js | 16 +++++++-- .../advanced-gas-fee-defaults.test.js | 1 + .../advanced-gas-fee-save.js | 9 ++++- .../cancel-speedup-popover.js | 2 +- .../edit-gas-fee-button.js | 23 +++++++++--- .../edit-gas-item/edit-gas-item.js | 15 +++++++- .../transaction-list-item.component.js | 2 +- ui/contexts/transaction-modal.js | 36 +------------------ .../useTransactionFunction.test.js | 2 +- .../gasFeeInput/useTransactionFunctions.js | 36 ++++++++++++------- ui/hooks/useEventFragment.js | 2 +- ui/hooks/useTransactionEventFragment.js | 22 ++++++++++++ ui/pages/confirm-approve/confirm-approve.js | 2 +- .../confirm-transaction-base.component.js | 6 +--- ui/pages/swaps/view-quote/view-quote.js | 2 +- 17 files changed, 125 insertions(+), 67 deletions(-) create mode 100644 ui/hooks/useTransactionEventFragment.js diff --git a/app/scripts/controllers/transactions/index.js b/app/scripts/controllers/transactions/index.js index d4d3e3e70..cddd0669a 100644 --- a/app/scripts/controllers/transactions/index.js +++ b/app/scripts/controllers/transactions/index.js @@ -1570,6 +1570,8 @@ export default class TransactionController extends EventEmitter { network, type, eip_1559_version: eip1559Version, + gas_edit_type: 'none', + gas_edit_attempted: 'none', }; const sensitiveProperties = { diff --git a/app/scripts/controllers/transactions/index.test.js b/app/scripts/controllers/transactions/index.test.js index 36e254f3d..c20fd5459 100644 --- a/app/scripts/controllers/transactions/index.test.js +++ b/app/scripts/controllers/transactions/index.test.js @@ -1610,6 +1610,8 @@ describe('Transaction Controller', function () { properties: { chain_id: '0x2a', eip_1559_version: '0', + gas_edit_attempted: 'none', + gas_edit_type: 'none', network: '42', referrer: 'metamask', source: 'user', @@ -1683,6 +1685,8 @@ describe('Transaction Controller', function () { properties: { chain_id: '0x2a', eip_1559_version: '0', + gas_edit_attempted: 'none', + gas_edit_type: 'none', network: '42', referrer: 'metamask', source: 'user', @@ -1766,6 +1770,8 @@ describe('Transaction Controller', function () { properties: { chain_id: '0x2a', eip_1559_version: '0', + gas_edit_attempted: 'none', + gas_edit_type: 'none', network: '42', referrer: 'other', source: 'dapp', @@ -1841,6 +1847,8 @@ describe('Transaction Controller', function () { properties: { chain_id: '0x2a', eip_1559_version: '0', + gas_edit_attempted: 'none', + gas_edit_type: 'none', network: '42', referrer: 'other', source: 'dapp', @@ -1916,6 +1924,8 @@ describe('Transaction Controller', function () { properties: { chain_id: '0x2a', eip_1559_version: '0', + gas_edit_attempted: 'none', + gas_edit_type: 'none', network: '42', referrer: 'other', source: 'dapp', @@ -1977,6 +1987,8 @@ describe('Transaction Controller', function () { type: TRANSACTION_TYPES.SIMPLE_SEND, chain_id: '0x2a', eip_1559_version: '0', + gas_edit_attempted: 'none', + gas_edit_type: 'none', }, sensitiveProperties: { baz: 3.0, @@ -2040,6 +2052,8 @@ describe('Transaction Controller', function () { properties: { chain_id: '0x2a', eip_1559_version: '1', + gas_edit_attempted: 'none', + gas_edit_type: 'none', network: '42', referrer: 'other', source: 'dapp', diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.js b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.js index 6cd7a20e6..55a450090 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.js +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.js @@ -1,6 +1,7 @@ import React, { useEffect, useState } from 'react'; import { useSelector, useDispatch } from 'react-redux'; +import { useTransactionEventFragment } from '../../../../hooks/useTransactionEventFragment'; import { EDIT_GAS_MODES } from '../../../../../shared/constants/gas'; import Box from '../../../ui/box'; import Typography from '../../../ui/typography'; @@ -27,8 +28,8 @@ const AdvancedGasFeeDefaults = () => { maxPriorityFeePerGas, } = useAdvancedGasFeePopoverContext(); const advancedGasFeeValues = useSelector(getAdvancedGasFeeValues); + const { updateTransactionEventFragment } = useTransactionEventFragment(); const { editGasMode } = useGasFeeContext(); - const [isDefaultSettingsSelected, setDefaultSettingsSelected] = useState( Boolean(advancedGasFeeValues) && advancedGasFeeValues.maxBaseFee === maxBaseFee && @@ -47,6 +48,12 @@ const AdvancedGasFeeDefaults = () => { if (isDefaultSettingsSelected) { dispatch(setAdvancedGasFee(null)); setDefaultSettingsSelected(false); + updateTransactionEventFragment({ + properties: { + advanced_gas_defaults_updated_maxbasefee: null, + advanced_gas_defaults_updated_priorityfee: null, + }, + }); } else { dispatch( setAdvancedGasFee({ @@ -54,7 +61,12 @@ const AdvancedGasFeeDefaults = () => { priorityFee: maxPriorityFeePerGas, }), ); - setDefaultSettingsSelected(true); + updateTransactionEventFragment({ + properties: { + advanced_gas_defaults_updated_maxbasefee: maxBaseFee, + advanced_gas_defaults_updated_priorityfee: maxPriorityFeePerGas, + }, + }); } }; diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js index 8fb127311..2d462738f 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js @@ -25,6 +25,7 @@ jest.mock('../../../../store/actions', () => ({ addPollingTokenToAppState: jest.fn(), removePollingTokenFromAppState: jest.fn(), setAdvancedGasFee: jest.fn(), + updateEventFragment: jest.fn(), })); const render = (defaultGasParams, contextParams) => { diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-save/advanced-gas-fee-save.js b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-save/advanced-gas-fee-save.js index 9b59c4de5..98ec9261b 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-save/advanced-gas-fee-save.js +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-save/advanced-gas-fee-save.js @@ -1,16 +1,18 @@ import React from 'react'; import { PRIORITY_LEVELS } from '../../../../../shared/constants/gas'; +import { decGWEIToHexWEI } from '../../../../../shared/modules/conversion.utils'; import { useTransactionModalContext } from '../../../../contexts/transaction-modal'; import { useGasFeeContext } from '../../../../contexts/gasFee'; +import { useTransactionEventFragment } from '../../../../hooks/useTransactionEventFragment'; import Button from '../../../ui/button'; import I18nValue from '../../../ui/i18n-value'; import { useAdvancedGasFeePopoverContext } from '../context'; -import { decGWEIToHexWEI } from '../../../../../shared/modules/conversion.utils'; const AdvancedGasFeeSaveButton = () => { const { closeAllModals } = useTransactionModalContext(); + const { updateTransactionEventFragment } = useTransactionEventFragment(); const { updateTransaction } = useGasFeeContext(); const { gasLimit, @@ -26,6 +28,11 @@ const AdvancedGasFeeSaveButton = () => { maxPriorityFeePerGas: decGWEIToHexWEI(maxPriorityFeePerGas), gasLimit, }); + updateTransactionEventFragment({ + properties: { + gas_edit_type: 'advanced', + }, + }); closeAllModals(); }; diff --git a/ui/components/app/cancel-speedup-popover/cancel-speedup-popover.js b/ui/components/app/cancel-speedup-popover/cancel-speedup-popover.js index f9f57d8fc..077b19ca6 100644 --- a/ui/components/app/cancel-speedup-popover/cancel-speedup-popover.js +++ b/ui/components/app/cancel-speedup-popover/cancel-speedup-popover.js @@ -62,7 +62,7 @@ const CancelSpeedupPopover = () => { updateTransactionUsingEstimate(PRIORITY_LEVELS.MEDIUM); return; } - updateTransactionToTenPercentIncreasedGasFee(); + updateTransactionToTenPercentIncreasedGasFee(true); }, [ appIsLoading, currentModal, diff --git a/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.js b/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.js index ef59c761a..b3610c2b6 100644 --- a/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.js +++ b/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.js @@ -9,6 +9,7 @@ import { COLORS, TYPOGRAPHY } from '../../../helpers/constants/design-system'; import { PRIORITY_LEVEL_ICON_MAP } from '../../../helpers/constants/gas'; import { useGasFeeContext } from '../../../contexts/gasFee'; import { useI18nContext } from '../../../hooks/useI18nContext'; +import { useTransactionEventFragment } from '../../../hooks/useTransactionEventFragment'; import { useTransactionModalContext } from '../../../contexts/transaction-modal'; import InfoTooltip from '../../ui/info-tooltip/info-tooltip'; import Typography from '../../ui/typography/typography'; @@ -25,6 +26,7 @@ export default function EditGasFeeButton({ userAcknowledgedGasMissing }) { supportsEIP1559V2, transaction, } = useGasFeeContext(); + const { updateTransactionEventFragment } = useTransactionEventFragment(); const { openModal } = useTransactionModalContext(); const editEnabled = !hasSimulationError || userAcknowledgedGasMissing === true; @@ -46,12 +48,23 @@ export default function EditGasFeeButton({ userAcknowledgedGasMissing }) { title = 'tenPercentIncreased'; } + const openEditGasFeeModal = () => { + updateTransactionEventFragment({ + gas_edit_attempted: 'basic', + }); + openModal('editGasFee'); + }; + + const openAdvancedGasFeeModal = () => { + updateTransactionEventFragment({ + gas_edit_attempted: 'advanced', + }); + openModal('advancedGasFee'); + }; + return (
- {estimateUsed === 'custom' && ( - + )} {estimateUsed === 'dappSuggested' && ( { updateTransactionUsingEstimate, transaction, } = useGasFeeContext(); + const { updateTransactionEventFragment } = useTransactionEventFragment(); const t = useI18nContext(); const { closeModal, openModal } = useTransactionModalContext(); const { dappSuggestedGasFees } = transaction; @@ -72,8 +74,19 @@ const EditGasItem = ({ priorityLevel }) => { const onOptionSelect = () => { if (priorityLevel === PRIORITY_LEVELS.CUSTOM) { + updateTransactionEventFragment({ + properties: { + gas_edit_attempted: 'advanced', + }, + }); openModal('advancedGasFee'); } else { + updateTransactionEventFragment({ + properties: { + gas_edit_type: 'basic', + }, + }); + closeModal('editGasFee'); if (priorityLevel === PRIORITY_LEVELS.TEN_PERCENT_INCREASED) { diff --git a/ui/components/app/transaction-list-item/transaction-list-item.component.js b/ui/components/app/transaction-list-item/transaction-list-item.component.js index cb6752309..e503c294c 100644 --- a/ui/components/app/transaction-list-item/transaction-list-item.component.js +++ b/ui/components/app/transaction-list-item/transaction-list-item.component.js @@ -296,7 +296,7 @@ const TransactionListItem = (props) => { transaction={transactionGroup.primaryTransaction} editGasMode={editGasMode} > - + {supportsEIP1559V2 && ( <> diff --git a/ui/contexts/transaction-modal.js b/ui/contexts/transaction-modal.js index d7967ba7f..51ebffa51 100644 --- a/ui/contexts/transaction-modal.js +++ b/ui/contexts/transaction-modal.js @@ -1,40 +1,10 @@ import React, { createContext, useContext, useState } from 'react'; import PropTypes from 'prop-types'; -import { TRANSACTION_TYPES } from '../../shared/constants/transaction'; -import { getMethodName } from '../helpers/utils/metrics'; -import { useGasFeeContext } from './gasFee'; -import { MetaMetricsContext } from './metametrics'; - export const TransactionModalContext = createContext({}); -export const TransactionModalContextProvider = ({ - actionKey, - children, - methodData, - captureEventEnabled = true, -}) => { +export const TransactionModalContextProvider = ({ children }) => { const [openModals, setOpenModals] = useState([]); - const metricsEvent = useContext(MetaMetricsContext); - const { transaction: { origin } = {} } = useGasFeeContext(); - - const captureEvent = () => { - metricsEvent({ - eventOpts: { - category: 'Transactions', - action: 'Confirm Screen', - name: 'User clicks "Edit" on gas', - }, - customVariables: { - recipientKnown: null, - functionType: - actionKey || - getMethodName(methodData?.name) || - TRANSACTION_TYPES.CONTRACT_INTERACTION, - origin, - }, - }); - }; const closeModal = (modalName) => { const index = openModals.indexOf(modalName); @@ -54,7 +24,6 @@ export const TransactionModalContextProvider = ({ if (openModals.includes(modalName)) { return; } - captureEventEnabled && captureEvent(); const modals = [...openModals]; modals.push(modalName); setOpenModals(modals); @@ -80,8 +49,5 @@ export function useTransactionModalContext() { } TransactionModalContextProvider.propTypes = { - actionKey: PropTypes.string, children: PropTypes.node.isRequired, - methodData: PropTypes.object, - captureEventEnabled: PropTypes.bool, }; diff --git a/ui/hooks/gasFeeInput/useTransactionFunction.test.js b/ui/hooks/gasFeeInput/useTransactionFunction.test.js index 1bfef861c..f4c11dbf0 100644 --- a/ui/hooks/gasFeeInput/useTransactionFunction.test.js +++ b/ui/hooks/gasFeeInput/useTransactionFunction.test.js @@ -79,7 +79,7 @@ describe('useMaxPriorityFeePerGasInput', () => { expect(mock).toHaveBeenCalledTimes(1); expect(mock).toHaveBeenCalledWith({ txParams: { - estimateSuggested: 'medium', + estimateSuggested: 'tenPercentIncreased', estimateUsed: 'tenPercentIncreased', gas: '5208', gasLimit: '5208', diff --git a/ui/hooks/gasFeeInput/useTransactionFunctions.js b/ui/hooks/gasFeeInput/useTransactionFunctions.js index ca152e5bc..967842026 100644 --- a/ui/hooks/gasFeeInput/useTransactionFunctions.js +++ b/ui/hooks/gasFeeInput/useTransactionFunctions.js @@ -49,11 +49,17 @@ export const useTransactionFunctions = ({ }, [editGasMode, transaction?.previousGas, transaction?.txParams]); const updateTransaction = useCallback( - ({ estimateUsed, gasLimit, maxFeePerGas, maxPriorityFeePerGas }) => { + ({ + estimateUsed, + gasLimit, + maxFeePerGas, + maxPriorityFeePerGas, + estimateSuggested, + }) => { const newGasSettings = { gas: decimalToHex(gasLimit || gasLimitValue), gasLimit: decimalToHex(gasLimit || gasLimitValue), - estimateSuggested: defaultEstimateToUse, + estimateSuggested: estimateSuggested || defaultEstimateToUse, estimateUsed, }; if (maxFeePerGas) { @@ -111,17 +117,23 @@ export const useTransactionFunctions = ({ ); }, [dispatch, estimatedBaseFee, transaction]); - const updateTransactionToTenPercentIncreasedGasFee = useCallback(() => { - const { gas: gasLimit, maxFeePerGas, maxPriorityFeePerGas } = - transaction.previousGas || transaction.txParams; + const updateTransactionToTenPercentIncreasedGasFee = useCallback( + (initTransaction = false) => { + const { gas: gasLimit, maxFeePerGas, maxPriorityFeePerGas } = + transaction.previousGas || transaction.txParams; - updateTransaction({ - estimateUsed: PRIORITY_LEVELS.TEN_PERCENT_INCREASED, - gasLimit, - maxFeePerGas: addTenPercentAndRound(maxFeePerGas), - maxPriorityFeePerGas: addTenPercentAndRound(maxPriorityFeePerGas), - }); - }, [transaction, updateTransaction]); + updateTransaction({ + estimateSuggested: initTransaction + ? defaultEstimateToUse + : PRIORITY_LEVELS.TEN_PERCENT_INCREASED, + estimateUsed: PRIORITY_LEVELS.TEN_PERCENT_INCREASED, + gasLimit, + maxFeePerGas: addTenPercentAndRound(maxFeePerGas), + maxPriorityFeePerGas: addTenPercentAndRound(maxPriorityFeePerGas), + }); + }, + [defaultEstimateToUse, transaction, updateTransaction], + ); const updateTransactionUsingEstimate = useCallback( (gasFeeEstimateToUse) => { diff --git a/ui/hooks/useEventFragment.js b/ui/hooks/useEventFragment.js index abdbb4244..2e8d9ec0d 100644 --- a/ui/hooks/useEventFragment.js +++ b/ui/hooks/useEventFragment.js @@ -18,7 +18,7 @@ import { useMetaMetricsContext } from './useMetricEvent'; * @param {Object} fragmentOptions * @returns */ -export function useEventFragment(existingId, fragmentOptions) { +export function useEventFragment(existingId, fragmentOptions = {}) { // To prevent overcalling the createEventFragment background method a ref // is used to store a boolean value of whether we have already called the // method. diff --git a/ui/hooks/useTransactionEventFragment.js b/ui/hooks/useTransactionEventFragment.js new file mode 100644 index 000000000..10f44df83 --- /dev/null +++ b/ui/hooks/useTransactionEventFragment.js @@ -0,0 +1,22 @@ +import { useCallback } from 'react'; + +import { useGasFeeContext } from '../contexts/gasFee'; +import { updateEventFragment } from '../store/actions'; + +export const useTransactionEventFragment = () => { + const { transaction } = useGasFeeContext(); + + const updateTransactionEventFragment = useCallback( + (params) => { + if (!transaction) { + return; + } + updateEventFragment(`transaction-added-${transaction.id}`, params); + }, + [transaction], + ); + + return { + updateTransactionEventFragment, + }; +}; diff --git a/ui/pages/confirm-approve/confirm-approve.js b/ui/pages/confirm-approve/confirm-approve.js index b8b5bb287..5ba090fed 100644 --- a/ui/pages/confirm-approve/confirm-approve.js +++ b/ui/pages/confirm-approve/confirm-approve.js @@ -180,7 +180,7 @@ export default function ConfirmApprove() { showAccountInHeader title={tokensText} contentComponent={ - + + - +
Date: Tue, 1 Feb 2022 20:11:42 -0700 Subject: [PATCH 078/115] Handling array type values for image in Identicon component (#13484) * Handling array type values for image in Identicon component * Adding additional type check --- ui/components/ui/identicon/identicon.component.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ui/components/ui/identicon/identicon.component.js b/ui/components/ui/identicon/identicon.component.js index b546b85c1..8174ab38e 100644 --- a/ui/components/ui/identicon/identicon.component.js +++ b/ui/components/ui/identicon/identicon.component.js @@ -34,7 +34,7 @@ export default class Identicon extends PureComponent { /** * Used as the image source of the Identicon */ - image: PropTypes.string, + image: PropTypes.oneOfType([PropTypes.string, PropTypes.array]), /** * Use the blockie type random image generator */ @@ -76,7 +76,14 @@ export default class Identicon extends PureComponent { const { className, diameter, alt, imageBorder, ipfsGateway } = this.props; let { image } = this.props; - if (image.toLowerCase().startsWith('ipfs://')) { + if (Array.isArray(image) && image.length) { + image = image[0]; + } + + if ( + typeof image === 'string' && + image.toLowerCase().startsWith('ipfs://') + ) { image = getAssetImageURL(image, ipfsGateway); } From 3301fd8121ccbb0fd6292ac462ffd4d52bca0e8e Mon Sep 17 00:00:00 2001 From: MG Date: Wed, 2 Feb 2022 12:32:16 +0100 Subject: [PATCH 079/115] Feat/hide 0 balances (#13306) * Added token list functional component * Added list - img not showing up * Changed render list * Removed unused code * Clean up * Lint * Linted * Add newline * Filter out isERC721 * Added token list * Cleaned up style * Fixed typography * Fixed lint * Fixed spacing measure * Lint cleanup --- ui/components/app/app-components.scss | 1 + ui/components/app/token-list-display/index.js | 1 + .../token-list-display/token-list-display.js | 61 +++++++++++++++++++ .../token-list-display.scss | 45 ++++++++++++++ .../send-asset-row.component.js | 10 ++- 5 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 ui/components/app/token-list-display/index.js create mode 100644 ui/components/app/token-list-display/token-list-display.js create mode 100644 ui/components/app/token-list-display/token-list-display.scss diff --git a/ui/components/app/app-components.scss b/ui/components/app/app-components.scss index 4cfede5e5..17653fee7 100644 --- a/ui/components/app/app-components.scss +++ b/ui/components/app/app-components.scss @@ -53,6 +53,7 @@ @import 'flask/snap-settings-card/index'; @import 'tab-bar/index'; @import 'token-cell/token-cell'; +@import 'token-list-display/token-list-display'; @import 'transaction-activity-log/index'; @import 'transaction-breakdown/index'; @import 'transaction-detail/index'; diff --git a/ui/components/app/token-list-display/index.js b/ui/components/app/token-list-display/index.js new file mode 100644 index 000000000..54b9cb487 --- /dev/null +++ b/ui/components/app/token-list-display/index.js @@ -0,0 +1 @@ +export { default } from './token-list-display'; diff --git a/ui/components/app/token-list-display/token-list-display.js b/ui/components/app/token-list-display/token-list-display.js new file mode 100644 index 000000000..0c06d0ca2 --- /dev/null +++ b/ui/components/app/token-list-display/token-list-display.js @@ -0,0 +1,61 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { useSelector } from 'react-redux'; +import { isEqual } from 'lodash'; + +import { getShouldHideZeroBalanceTokens } from '../../../selectors'; +import { useTokenTracker } from '../../../hooks/useTokenTracker'; +import Identicon from '../../ui/identicon'; +import TokenBalance from '../../ui/token-balance'; +import { useI18nContext } from '../../../hooks/useI18nContext'; +import { getTokens } from '../../../ducks/metamask/metamask'; + +export default function TokenListDisplay({ clickHandler }) { + const t = useI18nContext(); + const shouldHideZeroBalanceTokens = useSelector( + getShouldHideZeroBalanceTokens, + ); + + const tokens = useSelector(getTokens, isEqual); + const { loading, tokensWithBalances } = useTokenTracker( + tokens, + true, + shouldHideZeroBalanceTokens, + ); + if (loading) { + return
{t('loadingTokens')}
; + } + + const sendableTokens = tokensWithBalances.filter((token) => !token.isERC721); + + return ( + <> + {sendableTokens.map((tokenData) => { + const { address, symbol, image } = tokenData; + + return ( +
clickHandler(tokenData)} + > + +
+
{symbol}
+
+ + {`${t('balance')}:`} + + +
+
+
+ ); + })} + + ); +} + +TokenListDisplay.propTypes = { + clickHandler: PropTypes.func, +}; diff --git a/ui/components/app/token-list-display/token-list-display.scss b/ui/components/app/token-list-display/token-list-display.scss new file mode 100644 index 000000000..9982af0cd --- /dev/null +++ b/ui/components/app/token-list-display/token-list-display.scss @@ -0,0 +1,45 @@ +.loading-span { + display: flex; + height: 250px; + align-items: center; + justify-content: center; + padding: 32px; +} + +.token-list-item { + padding: 8px; + display: flex; + flex-flow: row nowrap; + align-items: center; + cursor: pointer; + padding: 8px; + + &:hover { + background-color: rgba($alto, 0.2); + } + + &__data { + margin-left: 8px; + } + + &__symbol { + @include Paragraph; + + line-height: 140%; + margin-bottom: 2px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + &__balance { + @include H7; + + display: flex; + flex-flow: row nowrap; + } + + &__balance__label { + margin-right: 4px; + } +} diff --git a/ui/pages/send/send-content/send-asset-row/send-asset-row.component.js b/ui/pages/send/send-content/send-asset-row/send-asset-row.component.js index d1e308c70..3f28f967c 100644 --- a/ui/pages/send/send-content/send-asset-row/send-asset-row.component.js +++ b/ui/pages/send/send-content/send-asset-row/send-asset-row.component.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import SendRowWrapper from '../send-row-wrapper'; import Identicon from '../../../../components/ui/identicon'; import TokenBalance from '../../../../components/ui/token-balance'; +import TokenListDisplay from '../../../../components/app/token-list-display'; import UserPreferencedCurrencyDisplay from '../../../../components/app/user-preferenced-currency-display'; import { ERC20, ERC721, PRIMARY } from '../../../../helpers/constants/common'; import { ASSET_TYPES } from '../../../../ducks/send'; @@ -162,9 +163,12 @@ export default class SendAssetRow extends Component { />
{this.renderNativeCurrency(true)} - {this.state.sendableTokens.map((token) => - this.renderToken(token, true), - )} + + this.selectToken(ASSET_TYPES.TOKEN, token) + } + /> + {this.state.sendableCollectibles.map((collectible) => this.renderCollectible(collectible, true), )} From 2e38eeb55f38c17ecc761447252a40cbcf1d677f Mon Sep 17 00:00:00 2001 From: Leandro Lima Date: Wed, 2 Feb 2022 15:33:53 -0300 Subject: [PATCH 080/115] Adding Brazilian Portuguese translation (#13470) * Adding Brazilian Portuguese translation * fixing lint --- app/_locales/pt_BR/messages.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/_locales/pt_BR/messages.json b/app/_locales/pt_BR/messages.json index 8fc76849b..d0570be1a 100644 --- a/app/_locales/pt_BR/messages.json +++ b/app/_locales/pt_BR/messages.json @@ -254,6 +254,9 @@ "buildContactList": { "message": "Crie sua lista de contatos" }, + "builtAroundTheWorld": { + "message": "MetaMask é projetado e construído em todo o mundo.." + }, "buy": { "message": "Comprar" }, From 760ed3457d13582dd7adfa71b66db023d19a9d14 Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Thu, 3 Feb 2022 05:58:28 +0530 Subject: [PATCH 081/115] Removing EIP_1559_V2 feature flag (#13481) --- .metamaskrc.dist | 1 - development/build/scripts.js | 2 - test/e2e/tests/edit-gas-fee.spec.js | 518 +++++++++--------- test/e2e/tests/send-edit.spec.js | 206 +++---- .../advanced-gas-fee-defaults.test.js | 1 + .../advanced-gas-fee-popover.test.js | 1 + .../cancel-speedup-popover.test.js | 1 + .../confirm-page-container-container.test.js | 1 + .../enableEIP1559V2-notice.js | 10 +- .../edit-gas-fee-button.test.js | 1 + .../edit-gas-fee-popover.test.js | 1 + .../edit-gas-item/edit-gas-item.test.js | 1 + .../transaction-detail.component.test.js | 1 + ui/hooks/useTransactionEventFragment.js | 25 +- .../experimental-tab.component.js | 6 - ui/pages/swaps/fee-card/fee-card.test.js | 1 + ui/store/actions.js | 7 + 17 files changed, 401 insertions(+), 383 deletions(-) diff --git a/.metamaskrc.dist b/.metamaskrc.dist index da42a6508..8d7507e86 100644 --- a/.metamaskrc.dist +++ b/.metamaskrc.dist @@ -3,6 +3,5 @@ PASSWORD=METAMASK PASSWORD INFURA_PROJECT_ID=00000000000 SEGMENT_WRITE_KEY= ONBOARDING_V2= -EIP_1559_V2= SWAPS_USE_DEV_APIS= COLLECTIBLES_V1= diff --git a/development/build/scripts.js b/development/build/scripts.js index 156f49e6e..c317180e2 100644 --- a/development/build/scripts.js +++ b/development/build/scripts.js @@ -34,7 +34,6 @@ const metamaskrc = require('rc')('metamask', { INFURA_PROD_PROJECT_ID: process.env.INFURA_PROD_PROJECT_ID, ONBOARDING_V2: process.env.ONBOARDING_V2, COLLECTIBLES_V1: process.env.COLLECTIBLES_V1, - EIP_1559_V2: process.env.EIP_1559_V2, SEGMENT_HOST: process.env.SEGMENT_HOST, SEGMENT_WRITE_KEY: process.env.SEGMENT_WRITE_KEY, SEGMENT_BETA_WRITE_KEY: process.env.SEGMENT_BETA_WRITE_KEY, @@ -797,7 +796,6 @@ function getEnvironmentVariables({ buildType, devMode, testing }) { SWAPS_USE_DEV_APIS: process.env.SWAPS_USE_DEV_APIS === '1', ONBOARDING_V2: metamaskrc.ONBOARDING_V2 === '1', COLLECTIBLES_V1: metamaskrc.COLLECTIBLES_V1 === '1', - EIP_1559_V2: metamaskrc.EIP_1559_V2 === '1', }; } diff --git a/test/e2e/tests/edit-gas-fee.spec.js b/test/e2e/tests/edit-gas-fee.spec.js index 9c43c9e79..a00b18a0c 100644 --- a/test/e2e/tests/edit-gas-fee.spec.js +++ b/test/e2e/tests/edit-gas-fee.spec.js @@ -8,270 +8,268 @@ const { regularDelayMs, } = require('../helpers'); -if (process.env.EIP_1559_V2 === '1') { - describe('Editing Confirm Transaction', function () { - it('allows selecting high, medium, low gas estimates on edit gas fee popover', async function () { - const ganacheOptions = { - hardfork: 'london', - accounts: [ - { - secretKey: - '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: convertToHexValue(25000000000000000000), - }, - ], - }; - await withFixtures( +describe('Editing Confirm Transaction', function () { + it('allows selecting high, medium, low gas estimates on edit gas fee popover', async function () { + const ganacheOptions = { + hardfork: 'london', + accounts: [ { - fixtures: 'eip-1559-v2', - ganacheOptions, - title: this.test.title, + secretKey: + '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: convertToHexValue(25000000000000000000), }, - async ({ driver }) => { - await driver.navigate(); + ], + }; + await withFixtures( + { + fixtures: 'eip-1559-v2', + ganacheOptions, + title: this.test.title, + }, + async ({ driver }) => { + await driver.navigate(); - await driver.fill('#password', 'correct horse battery staple'); - await driver.press('#password', driver.Key.ENTER); + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); - const transactionAmounts = await driver.findElements( - '.currency-display-component__text', + const transactionAmounts = await driver.findElements( + '.currency-display-component__text', + ); + const transactionAmount = transactionAmounts[0]; + assert.equal(await transactionAmount.getText(), '2.2'); + + // update estimates to high + await driver.clickElement('[data-testid="edit-gas-fee-button"]'); + await driver.delay(regularDelayMs); + await driver.clickElement('[data-testid="edit-gas-fee-item-high"]'); + await driver.delay(regularDelayMs); + await driver.waitForSelector({ text: '🦍' }); + await driver.waitForSelector({ + text: 'Aggressive', + }); + + // update estimates to medium + await driver.clickElement('[data-testid="edit-gas-fee-button"]'); + await driver.delay(regularDelayMs); + await driver.clickElement('[data-testid="edit-gas-fee-item-medium"]'); + await driver.delay(regularDelayMs); + await driver.waitForSelector({ text: '🦊' }); + await driver.waitForSelector({ + text: 'Market', + }); + + // update estimates to low + await driver.clickElement('[data-testid="edit-gas-fee-button"]'); + await driver.delay(regularDelayMs); + await driver.clickElement('[data-testid="edit-gas-fee-item-low"]'); + await driver.delay(regularDelayMs); + await driver.waitForSelector({ text: '🐢' }); + await driver.waitForSelector({ + text: 'Low', + }); + await driver.waitForSelector('[data-testid="low-gas-fee-alert"]'); + + // confirms the transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.delay(regularDelayMs); + + await driver.clickElement('[data-testid="home__activity-tab"]'); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .transaction-list-item', ); - const transactionAmount = transactionAmounts[0]; - assert.equal(await transactionAmount.getText(), '2.2'); + return confirmedTxes.length === 1; + }, 10000); - // update estimates to high - await driver.clickElement('[data-testid="edit-gas-fee-button"]'); - await driver.delay(regularDelayMs); - await driver.clickElement('[data-testid="edit-gas-fee-item-high"]'); - await driver.delay(regularDelayMs); - await driver.waitForSelector({ text: '🦍' }); - await driver.waitForSelector({ - text: 'Aggressive', - }); - - // update estimates to medium - await driver.clickElement('[data-testid="edit-gas-fee-button"]'); - await driver.delay(regularDelayMs); - await driver.clickElement('[data-testid="edit-gas-fee-item-medium"]'); - await driver.delay(regularDelayMs); - await driver.waitForSelector({ text: '🦊' }); - await driver.waitForSelector({ - text: 'Market', - }); - - // update estimates to low - await driver.clickElement('[data-testid="edit-gas-fee-button"]'); - await driver.delay(regularDelayMs); - await driver.clickElement('[data-testid="edit-gas-fee-item-low"]'); - await driver.delay(regularDelayMs); - await driver.waitForSelector({ text: '🐢' }); - await driver.waitForSelector({ - text: 'Low', - }); - await driver.waitForSelector('[data-testid="low-gas-fee-alert"]'); - - // confirms the transaction - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - await driver.delay(regularDelayMs); - - await driver.clickElement('[data-testid="home__activity-tab"]'); - await driver.wait(async () => { - const confirmedTxes = await driver.findElements( - '.transaction-list__completed-transactions .transaction-list-item', - ); - return confirmedTxes.length === 1; - }, 10000); - - const txValues = await driver.findElements( - '.transaction-list-item__primary-currency', - ); - assert.equal(txValues.length, 1); - assert.ok(/-2.2\s*ETH/u.test(await txValues[0].getText())); - }, - ); - }); - - it('allows accessing advance gas fee popover from edit gas fee popover', async function () { - const ganacheOptions = { - hardfork: 'london', - accounts: [ - { - secretKey: - '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: convertToHexValue(25000000000000000000), - }, - ], - }; - await withFixtures( - { - fixtures: 'eip-1559-v2', - ganacheOptions, - title: this.test.title, - }, - async ({ driver }) => { - await driver.navigate(); - - await driver.fill('#password', 'correct horse battery staple'); - await driver.press('#password', driver.Key.ENTER); - - const transactionAmounts = await driver.findElements( - '.currency-display-component__text', - ); - const transactionAmount = transactionAmounts[0]; - assert.equal(await transactionAmount.getText(), '2.2'); - - // update estimates to high - await driver.clickElement('[data-testid="edit-gas-fee-button"]'); - await driver.delay(regularDelayMs); - await driver.clickElement('[data-testid="edit-gas-fee-item-custom"]'); - await driver.delay(regularDelayMs); - - // enter max fee - const maxBaseFee = await driver.findElement( - '[data-testid="base-fee-input"]', - ); - await maxBaseFee.clear(); - await maxBaseFee.sendKeys('8'); - await driver.delay(regularDelayMs); - - // enter priority fee - const priorityFee = await driver.findElement( - '[data-testid="priority-fee-input"]', - ); - await priorityFee.clear(); - await priorityFee.sendKeys('8'); - await driver.delay(regularDelayMs); - - // save default values - await driver.clickElement('input[type="checkbox"]'); - await driver.delay(regularDelayMs); - - // edit gas limit - await driver.clickElement('[data-testid="advanced-gas-fee-edit"]'); - await driver.delay(regularDelayMs); - const gasLimit = await driver.findElement( - '[data-testid="gas-limit-input"]', - ); - await gasLimit.clear(); - await gasLimit.sendKeys('100000'); - await driver.delay(regularDelayMs); - - // Submit gas fee changes - await driver.clickElement({ text: 'Save', tag: 'button' }); - - // has correct updated value on the confirm screen the transaction - const editedTransactionAmounts = await driver.findElements( - '.transaction-detail-item__row .transaction-detail-item__detail-values .currency-display-component__text:last-of-type', - ); - const editedTransactionAmount = editedTransactionAmounts[0]; - assert.equal(await editedTransactionAmount.getText(), '0.0008'); - - const editedTransactionFee = editedTransactionAmounts[1]; - assert.equal(await editedTransactionFee.getText(), '2.2008'); - - // confirms the transaction - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - await driver.delay(regularDelayMs); - - await driver.clickElement('[data-testid="home__activity-tab"]'); - await driver.wait(async () => { - const confirmedTxes = await driver.findElements( - '.transaction-list__completed-transactions .transaction-list-item', - ); - return confirmedTxes.length === 1; - }, 10000); - - const txValues = await driver.findElements( - '.transaction-list-item__primary-currency', - ); - assert.equal(txValues.length, 1); - assert.ok(/-2.2\s*ETH/u.test(await txValues[0].getText())); - }, - ); - }); - - it('should use dapp suggested estimates for transaction coming from dapp', async function () { - const ganacheOptions = { - hardfork: 'london', - accounts: [ - { - secretKey: - '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: convertToHexValue(25000000000000000000), - }, - ], - }; - await withFixtures( - { - fixtures: 'eip-1559-v2-dapp', - ganacheOptions, - title: this.test.title, - dapp: true, - }, - async ({ driver }) => { - await driver.navigate(); - - // login to extension - await driver.fill('#password', 'correct horse battery staple'); - await driver.press('#password', driver.Key.ENTER); - - // open dapp and connect - await connectDappWithExtensionPopup(driver); - await driver.clickElement({ text: 'Send', tag: 'button' }); - - // check transaction in extension popup - const windowHandles = await getWindowHandles(driver, 3); - await driver.switchToWindow(windowHandles.popup); - await driver.delay(largeDelayMs); - await driver.waitForSelector({ text: '🌐' }); - await driver.waitForSelector({ - text: 'Site suggested', - }); - - await driver.clickElement('[data-testid="edit-gas-fee-button"]'); - await driver.delay(regularDelayMs); - await driver.clickElement( - '[data-testid="edit-gas-fee-item-dappSuggested"]', - ); - await driver.delay(regularDelayMs); - - const transactionAmounts = await driver.findElements( - '.currency-display-component__text', - ); - const transactionAmount = transactionAmounts[0]; - assert.equal(await transactionAmount.getText(), '3'); - - // has correct updated value on the confirm screen the transaction - const editedTransactionAmounts = await driver.findElements( - '.transaction-detail-item__row .transaction-detail-item__detail-values .currency-display-component__text:last-of-type', - ); - const editedTransactionAmount = editedTransactionAmounts[0]; - assert.equal(await editedTransactionAmount.getText(), '0.00042'); - - const editedTransactionFee = editedTransactionAmounts[1]; - assert.equal(await editedTransactionFee.getText(), '3.00042'); - - // confirms the transaction - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - await driver.delay(regularDelayMs); - - // transaction should correct values in activity tab - await driver.switchToWindow(windowHandles.extension); - await driver.clickElement('[data-testid="home__activity-tab"]'); - await driver.wait(async () => { - const confirmedTxes = await driver.findElements( - '.transaction-list__completed-transactions .transaction-list-item', - ); - return confirmedTxes.length === 1; - }, 10000); - - const txValues = await driver.findElements( - '.transaction-list-item__primary-currency', - ); - assert.equal(txValues.length, 1); - assert.ok(/-3\s*ETH/u.test(await txValues[0].getText())); - }, - ); - }); + const txValues = await driver.findElements( + '.transaction-list-item__primary-currency', + ); + assert.equal(txValues.length, 1); + assert.ok(/-2.2\s*ETH/u.test(await txValues[0].getText())); + }, + ); }); -} + + it('allows accessing advance gas fee popover from edit gas fee popover', async function () { + const ganacheOptions = { + hardfork: 'london', + accounts: [ + { + secretKey: + '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: convertToHexValue(25000000000000000000), + }, + ], + }; + await withFixtures( + { + fixtures: 'eip-1559-v2', + ganacheOptions, + title: this.test.title, + }, + async ({ driver }) => { + await driver.navigate(); + + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + + const transactionAmounts = await driver.findElements( + '.currency-display-component__text', + ); + const transactionAmount = transactionAmounts[0]; + assert.equal(await transactionAmount.getText(), '2.2'); + + // update estimates to high + await driver.clickElement('[data-testid="edit-gas-fee-button"]'); + await driver.delay(regularDelayMs); + await driver.clickElement('[data-testid="edit-gas-fee-item-custom"]'); + await driver.delay(regularDelayMs); + + // enter max fee + const maxBaseFee = await driver.findElement( + '[data-testid="base-fee-input"]', + ); + await maxBaseFee.clear(); + await maxBaseFee.sendKeys('8'); + await driver.delay(regularDelayMs); + + // enter priority fee + const priorityFee = await driver.findElement( + '[data-testid="priority-fee-input"]', + ); + await priorityFee.clear(); + await priorityFee.sendKeys('8'); + await driver.delay(regularDelayMs); + + // save default values + await driver.clickElement('input[type="checkbox"]'); + await driver.delay(regularDelayMs); + + // edit gas limit + await driver.clickElement('[data-testid="advanced-gas-fee-edit"]'); + await driver.delay(regularDelayMs); + const gasLimit = await driver.findElement( + '[data-testid="gas-limit-input"]', + ); + await gasLimit.clear(); + await gasLimit.sendKeys('100000'); + await driver.delay(regularDelayMs); + + // Submit gas fee changes + await driver.clickElement({ text: 'Save', tag: 'button' }); + + // has correct updated value on the confirm screen the transaction + const editedTransactionAmounts = await driver.findElements( + '.transaction-detail-item__row .transaction-detail-item__detail-values .currency-display-component__text:last-of-type', + ); + const editedTransactionAmount = editedTransactionAmounts[0]; + assert.equal(await editedTransactionAmount.getText(), '0.0008'); + + const editedTransactionFee = editedTransactionAmounts[1]; + assert.equal(await editedTransactionFee.getText(), '2.2008'); + + // confirms the transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.delay(regularDelayMs); + + await driver.clickElement('[data-testid="home__activity-tab"]'); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .transaction-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); + + const txValues = await driver.findElements( + '.transaction-list-item__primary-currency', + ); + assert.equal(txValues.length, 1); + assert.ok(/-2.2\s*ETH/u.test(await txValues[0].getText())); + }, + ); + }); + + it('should use dapp suggested estimates for transaction coming from dapp', async function () { + const ganacheOptions = { + hardfork: 'london', + accounts: [ + { + secretKey: + '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: convertToHexValue(25000000000000000000), + }, + ], + }; + await withFixtures( + { + fixtures: 'eip-1559-v2-dapp', + ganacheOptions, + title: this.test.title, + dapp: true, + }, + async ({ driver }) => { + await driver.navigate(); + + // login to extension + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + + // open dapp and connect + await connectDappWithExtensionPopup(driver); + await driver.clickElement({ text: 'Send', tag: 'button' }); + + // check transaction in extension popup + const windowHandles = await getWindowHandles(driver, 3); + await driver.switchToWindow(windowHandles.popup); + await driver.delay(largeDelayMs); + await driver.waitForSelector({ text: '🌐' }); + await driver.waitForSelector({ + text: 'Site suggested', + }); + + await driver.clickElement('[data-testid="edit-gas-fee-button"]'); + await driver.delay(regularDelayMs); + await driver.clickElement( + '[data-testid="edit-gas-fee-item-dappSuggested"]', + ); + await driver.delay(regularDelayMs); + + const transactionAmounts = await driver.findElements( + '.currency-display-component__text', + ); + const transactionAmount = transactionAmounts[0]; + assert.equal(await transactionAmount.getText(), '3'); + + // has correct updated value on the confirm screen the transaction + const editedTransactionAmounts = await driver.findElements( + '.transaction-detail-item__row .transaction-detail-item__detail-values .currency-display-component__text:last-of-type', + ); + const editedTransactionAmount = editedTransactionAmounts[0]; + assert.equal(await editedTransactionAmount.getText(), '0.00042'); + + const editedTransactionFee = editedTransactionAmounts[1]; + assert.equal(await editedTransactionFee.getText(), '3.00042'); + + // confirms the transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.delay(regularDelayMs); + + // transaction should correct values in activity tab + await driver.switchToWindow(windowHandles.extension); + await driver.clickElement('[data-testid="home__activity-tab"]'); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .transaction-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); + + const txValues = await driver.findElements( + '.transaction-list-item__primary-currency', + ); + assert.equal(txValues.length, 1); + assert.ok(/-3\s*ETH/u.test(await txValues[0].getText())); + }, + ); + }); +}); diff --git a/test/e2e/tests/send-edit.spec.js b/test/e2e/tests/send-edit.spec.js index f63796d53..ec25342fc 100644 --- a/test/e2e/tests/send-edit.spec.js +++ b/test/e2e/tests/send-edit.spec.js @@ -23,6 +23,7 @@ describe('Editing Confirm Transaction', function () { fixtures: 'send-edit', ganacheOptions, title: this.test.title, + failOnConsoleError: false, }, async ({ driver }) => { await driver.navigate(); @@ -92,113 +93,112 @@ describe('Editing Confirm Transaction', function () { ); }); - if (process.env.EIP_1559_V2 === '1') { - it('goes back from confirm page to edit eth value, baseFee, priorityFee and gas limit - 1559 V2', async function () { - const ganacheOptions = { - hardfork: 'london', - accounts: [ - { - secretKey: - '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: convertToHexValue(25000000000000000000), - }, - ], - }; - await withFixtures( + it('goes back from confirm page to edit eth value, baseFee, priorityFee and gas limit - 1559 V2', async function () { + const ganacheOptions = { + hardfork: 'london', + accounts: [ { - fixtures: 'send-edit-v2', - ganacheOptions, - title: this.test.title, + secretKey: + '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: convertToHexValue(25000000000000000000), }, - async ({ driver }) => { - await driver.navigate(); + ], + }; + await withFixtures( + { + fixtures: 'send-edit-v2', + ganacheOptions, + title: this.test.title, + failOnConsoleError: false, + }, + async ({ driver }) => { + await driver.navigate(); - await driver.fill('#password', 'correct horse battery staple'); - await driver.press('#password', driver.Key.ENTER); + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); - const transactionAmounts = await driver.findElements( - '.currency-display-component__text', + const transactionAmounts = await driver.findElements( + '.currency-display-component__text', + ); + const transactionAmount = transactionAmounts[0]; + assert.equal(await transactionAmount.getText(), '1'); + + const transactionFee = transactionAmounts[1]; + assert.equal(await transactionFee.getText(), '0.0000375'); + + await driver.clickElement( + '.confirm-page-container-header__back-button', + ); + await driver.fill('.unit-input__input', '2.2'); + + await driver.clickElement({ text: 'Next', tag: 'button' }); + + // open gas fee popover + await driver.clickElement({ text: 'Edit', tag: 'button' }); + + // show gas limit + await driver.clickElement('[data-testid="advanced-gas-fee-edit"]'); + await driver.delay(largeDelayMs); + + // enter max fee + const maxBaseFee = await driver.findElement( + '[data-testid="base-fee-input"]', + ); + await maxBaseFee.clear(); + await maxBaseFee.sendKeys('8'); + await driver.delay(regularDelayMs); + + // enter priority fee + const priorityFee = await driver.findElement( + '[data-testid="priority-fee-input"]', + ); + await priorityFee.clear(); + await priorityFee.sendKeys('8'); + await driver.delay(regularDelayMs); + + // edit gas limit + const gasLimit = await driver.findElement( + '[data-testid="gas-limit-input"]', + ); + await gasLimit.clear(); + await gasLimit.sendKeys('100000'); + await driver.delay(regularDelayMs); + + // save default values + await driver.clickElement('input[type="checkbox"]'); + await driver.delay(regularDelayMs); + + // Submit gas fee changes + await driver.clickElement({ text: 'Save', tag: 'button' }); + + // has correct updated value on the confirm screen the transaction + const editedTransactionAmounts = await driver.findElements( + '.transaction-detail-item__row .transaction-detail-item__detail-values .currency-display-component__text:last-of-type', + ); + const editedTransactionAmount = editedTransactionAmounts[0]; + assert.equal(await editedTransactionAmount.getText(), '0.0008'); + + const editedTransactionFee = editedTransactionAmounts[1]; + assert.equal(await editedTransactionFee.getText(), '2.2008'); + + // confirms the transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.delay(regularDelayMs); + + await driver.clickElement('[data-testid="home__activity-tab"]'); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .transaction-list-item', ); - const transactionAmount = transactionAmounts[0]; - assert.equal(await transactionAmount.getText(), '1'); + return confirmedTxes.length === 1; + }, 10000); - const transactionFee = transactionAmounts[1]; - assert.equal(await transactionFee.getText(), '0.0000375'); - - await driver.clickElement( - '.confirm-page-container-header__back-button', - ); - await driver.fill('.unit-input__input', '2.2'); - - await driver.clickElement({ text: 'Next', tag: 'button' }); - - // open gas fee popover - await driver.clickElement({ text: 'Edit', tag: 'button' }); - - // show gas limit - await driver.clickElement('[data-testid="advanced-gas-fee-edit"]'); - await driver.delay(largeDelayMs); - - // enter max fee - const maxBaseFee = await driver.findElement( - '[data-testid="base-fee-input"]', - ); - await maxBaseFee.clear(); - await maxBaseFee.sendKeys('8'); - await driver.delay(regularDelayMs); - - // enter priority fee - const priorityFee = await driver.findElement( - '[data-testid="priority-fee-input"]', - ); - await priorityFee.clear(); - await priorityFee.sendKeys('8'); - await driver.delay(regularDelayMs); - - // edit gas limit - const gasLimit = await driver.findElement( - '[data-testid="gas-limit-input"]', - ); - await gasLimit.clear(); - await gasLimit.sendKeys('100000'); - await driver.delay(regularDelayMs); - - // save default values - await driver.clickElement('input[type="checkbox"]'); - await driver.delay(regularDelayMs); - - // Submit gas fee changes - await driver.clickElement({ text: 'Save', tag: 'button' }); - - // has correct updated value on the confirm screen the transaction - const editedTransactionAmounts = await driver.findElements( - '.transaction-detail-item__row .transaction-detail-item__detail-values .currency-display-component__text:last-of-type', - ); - const editedTransactionAmount = editedTransactionAmounts[0]; - assert.equal(await editedTransactionAmount.getText(), '0.0008'); - - const editedTransactionFee = editedTransactionAmounts[1]; - assert.equal(await editedTransactionFee.getText(), '2.2008'); - - // confirms the transaction - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - await driver.delay(regularDelayMs); - - await driver.clickElement('[data-testid="home__activity-tab"]'); - await driver.wait(async () => { - const confirmedTxes = await driver.findElements( - '.transaction-list__completed-transactions .transaction-list-item', - ); - return confirmedTxes.length === 1; - }, 10000); - - const txValues = await driver.findElements( - '.transaction-list-item__primary-currency', - ); - assert.equal(txValues.length, 1); - assert.ok(/-2.2\s*ETH/u.test(await txValues[0].getText())); - }, - ); - }); - } + const txValues = await driver.findElements( + '.transaction-list-item__primary-currency', + ); + assert.equal(txValues.length, 1); + assert.ok(/-2.2\s*ETH/u.test(await txValues[0].getText())); + }, + ); + }); }); diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js index 2d462738f..58e40e209 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js @@ -26,6 +26,7 @@ jest.mock('../../../../store/actions', () => ({ removePollingTokenFromAppState: jest.fn(), setAdvancedGasFee: jest.fn(), updateEventFragment: jest.fn(), + createTransactionEventFragment: jest.fn(), })); const render = (defaultGasParams, contextParams) => { diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-popover.test.js b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-popover.test.js index 1767143b9..2a0f18ba5 100644 --- a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-popover.test.js +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-popover.test.js @@ -17,6 +17,7 @@ jest.mock('../../../store/actions', () => ({ .mockImplementation(() => Promise.resolve()), addPollingTokenToAppState: jest.fn(), removePollingTokenFromAppState: jest.fn(), + createTransactionEventFragment: jest.fn(), })); jest.mock('../../../contexts/transaction-modal', () => ({ diff --git a/ui/components/app/cancel-speedup-popover/cancel-speedup-popover.test.js b/ui/components/app/cancel-speedup-popover/cancel-speedup-popover.test.js index be8bee870..89b1151d0 100644 --- a/ui/components/app/cancel-speedup-popover/cancel-speedup-popover.test.js +++ b/ui/components/app/cancel-speedup-popover/cancel-speedup-popover.test.js @@ -22,6 +22,7 @@ jest.mock('../../../store/actions', () => ({ addPollingTokenToAppState: jest.fn(), removePollingTokenFromAppState: jest.fn(), updateTransaction: () => ({ type: 'UPDATE_TRANSACTION_PARAMS' }), + createTransactionEventFragment: jest.fn(), })); jest.mock('../../../contexts/transaction-modal', () => ({ diff --git a/ui/components/app/confirm-page-container/confirm-page-container-container.test.js b/ui/components/app/confirm-page-container/confirm-page-container-container.test.js index 757e86670..92fa00dc4 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container-container.test.js +++ b/ui/components/app/confirm-page-container/confirm-page-container-container.test.js @@ -41,6 +41,7 @@ describe('Confirm Page Container Container Test', () => { chainId: 'test', identities: [], featureFlags: {}, + enableEIP1559V2NoticeDismissed: true, }, }; diff --git a/ui/components/app/confirm-page-container/enableEIP1559V2-notice/enableEIP1559V2-notice.js b/ui/components/app/confirm-page-container/enableEIP1559V2-notice/enableEIP1559V2-notice.js index 1dd2dd71d..f0b92ff03 100644 --- a/ui/components/app/confirm-page-container/enableEIP1559V2-notice/enableEIP1559V2-notice.js +++ b/ui/components/app/confirm-page-container/enableEIP1559V2-notice/enableEIP1559V2-notice.js @@ -20,10 +20,6 @@ import { setEnableEIP1559V2NoticeDismissed } from '../../../../store/actions'; import { getEnableEIP1559V2NoticeDismissed } from '../../../../ducks/metamask/metamask'; import { getEIP1559V2Enabled } from '../../../../selectors'; -const EIP_1559_V2_ENABLED = - // This is a string in unit tests but is a boolean in the browser - process.env.EIP_1559_V2 === true || process.env.EIP_1559_V2 === 'true'; - export default function EnableEIP1559V2Notice({ isFirstAlert }) { const t = useI18nContext(); const history = useHistory(); @@ -32,11 +28,7 @@ export default function EnableEIP1559V2Notice({ isFirstAlert }) { ); const eip1559V2Enabled = useSelector(getEIP1559V2Enabled); - if ( - !EIP_1559_V2_ENABLED || - eip1559V2Enabled || - enableEIP1559V2NoticeDismissed - ) { + if (eip1559V2Enabled || enableEIP1559V2NoticeDismissed) { return null; } diff --git a/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.test.js b/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.test.js index c6ac0ae88..696fd7d6a 100644 --- a/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.test.js +++ b/ui/components/app/edit-gas-fee-button/edit-gas-fee-button.test.js @@ -22,6 +22,7 @@ jest.mock('../../../store/actions', () => ({ .fn() .mockImplementation(() => Promise.resolve()), addPollingTokenToAppState: jest.fn(), + createTransactionEventFragment: jest.fn(), })); const render = ({ componentProps, contextProps } = {}) => { diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js index 165cb3de0..f4fc6c651 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js @@ -15,6 +15,7 @@ jest.mock('../../../store/actions', () => ({ .fn() .mockImplementation(() => Promise.resolve()), addPollingTokenToAppState: jest.fn(), + createTransactionEventFragment: jest.fn(), })); jest.mock('../../../contexts/transaction-modal', () => ({ diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js index 469348e2a..c4fdc679b 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js @@ -18,6 +18,7 @@ jest.mock('../../../../store/actions', () => ({ getGasFeeTimeEstimate: jest .fn() .mockImplementation(() => Promise.resolve('unknown')), + createTransactionEventFragment: jest.fn(), })); const MOCK_FEE_ESTIMATE = { diff --git a/ui/components/app/transaction-detail/transaction-detail.component.test.js b/ui/components/app/transaction-detail/transaction-detail.component.test.js index 7a0396377..958e0e9d2 100644 --- a/ui/components/app/transaction-detail/transaction-detail.component.test.js +++ b/ui/components/app/transaction-detail/transaction-detail.component.test.js @@ -18,6 +18,7 @@ jest.mock('../../../store/actions', () => ({ .fn() .mockImplementation(() => Promise.resolve()), addPollingTokenToAppState: jest.fn(), + createTransactionEventFragment: jest.fn(), })); const render = ({ componentProps, contextProps } = {}) => { diff --git a/ui/hooks/useTransactionEventFragment.js b/ui/hooks/useTransactionEventFragment.js index 10f44df83..21ea11e6b 100644 --- a/ui/hooks/useTransactionEventFragment.js +++ b/ui/hooks/useTransactionEventFragment.js @@ -1,10 +1,31 @@ -import { useCallback } from 'react'; +import { useCallback, useEffect } from 'react'; +import { useSelector } from 'react-redux'; import { useGasFeeContext } from '../contexts/gasFee'; -import { updateEventFragment } from '../store/actions'; +import { + createTransactionEventFragment, + updateEventFragment, +} from '../store/actions'; +import { selectMatchingFragment } from '../selectors'; +import { TRANSACTION_EVENTS } from '../../shared/constants/transaction'; export const useTransactionEventFragment = () => { const { transaction } = useGasFeeContext(); + const fragment = useSelector((state) => + selectMatchingFragment(state, { + fragmentOptions: {}, + existingId: `transaction-added-${transaction?.id}`, + }), + ); + + useEffect(() => { + if (!fragment && transaction) { + createTransactionEventFragment( + transaction.id, + TRANSACTION_EVENTS.APPROVED, + ); + } + }, [fragment, transaction]); const updateTransactionEventFragment = useCallback( (params) => { diff --git a/ui/pages/settings/experimental-tab/experimental-tab.component.js b/ui/pages/settings/experimental-tab/experimental-tab.component.js index 6b37d955a..1312af5cd 100644 --- a/ui/pages/settings/experimental-tab/experimental-tab.component.js +++ b/ui/pages/settings/experimental-tab/experimental-tab.component.js @@ -148,12 +148,6 @@ export default class ExperimentalTab extends PureComponent { } renderEIP1559V2EnabledToggle() { - const EIP_1559_V2_ENABLED = - // This is a string in unit tests but is a boolean in the browser - process.env.EIP_1559_V2 === true || process.env.EIP_1559_V2 === 'true'; - if (!EIP_1559_V2_ENABLED) { - return null; - } const { t } = this.context; const { eip1559V2Enabled, setEIP1559V2Enabled } = this.props; diff --git a/ui/pages/swaps/fee-card/fee-card.test.js b/ui/pages/swaps/fee-card/fee-card.test.js index 16f43da8d..f87078d96 100644 --- a/ui/pages/swaps/fee-card/fee-card.test.js +++ b/ui/pages/swaps/fee-card/fee-card.test.js @@ -63,6 +63,7 @@ const generateUseSelectorRouter = () => (selector) => { setBackgroundConnection({ getGasFeeTimeEstimate: jest.fn(), getGasFeeEstimatesAndStartPolling: jest.fn(), + createTransactionEventFragment: jest.fn(), }); const createProps = (customProps = {}) => { diff --git a/ui/store/actions.js b/ui/store/actions.js index 96226df26..5500cfbd1 100644 --- a/ui/store/actions.js +++ b/ui/store/actions.js @@ -3108,6 +3108,13 @@ export function createEventFragment(options) { return promisifiedBackground.createEventFragment(options); } +export function createTransactionEventFragment(transactionId, event) { + return promisifiedBackground.createTransactionEventFragment( + transactionId, + event, + ); +} + export function updateEventFragment(id, payload) { return promisifiedBackground.updateEventFragment(id, payload); } From 429451de236b28cf30b53362a07bad58b7b3a22a Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Thu, 3 Feb 2022 10:36:43 -0330 Subject: [PATCH 082/115] Extract "create vault" form to separate component (#13461) The form used for creating a vault on the "Import" page of onboarding and on the "Restore vault" page is nearly identical, yet the implementation is totally separate. It has now been extracted to a separate component, consolidating the two implementations. There is a "terms of use" checkbox on the import page that isn't on the restore vault page, so that part has been made optional. The "submit" button text differs between the two uses as well, so that is customizable. There are slight styling differences between the old and new versions of this form. The fonts and spacing are all using our new standard design system guidelines, and we're using our standard checkbox now as well. The spacing and font sizes were chosen somewhat arbitrarily by me to resemble the old styles, so please feel free to suggest changes if you think they can be improved upon. There are some slight copy changes to the "Restore vault" page as well; the placeholder text and the label for the "Secret Recovery Phrase" field now matches the "Import" page copy. --- app/_locales/am/messages.json | 3 - app/_locales/ar/messages.json | 3 - app/_locales/bg/messages.json | 3 - app/_locales/bn/messages.json | 3 - app/_locales/ca/messages.json | 3 - app/_locales/da/messages.json | 3 - app/_locales/de/messages.json | 3 - app/_locales/el/messages.json | 6 - app/_locales/en/messages.json | 6 - app/_locales/es/messages.json | 6 - app/_locales/es_419/messages.json | 6 - app/_locales/et/messages.json | 3 - app/_locales/fa/messages.json | 3 - app/_locales/fi/messages.json | 3 - app/_locales/fil/messages.json | 3 - app/_locales/fr/messages.json | 6 - app/_locales/he/messages.json | 3 - app/_locales/hi/messages.json | 6 - app/_locales/hr/messages.json | 3 - app/_locales/ht/messages.json | 3 - app/_locales/hu/messages.json | 3 - app/_locales/id/messages.json | 6 - app/_locales/it/messages.json | 3 - app/_locales/ja/messages.json | 6 - app/_locales/kn/messages.json | 3 - app/_locales/ko/messages.json | 6 - app/_locales/lt/messages.json | 3 - app/_locales/lv/messages.json | 3 - app/_locales/ms/messages.json | 3 - app/_locales/no/messages.json | 3 - app/_locales/ph/messages.json | 6 - app/_locales/pl/messages.json | 3 - app/_locales/pt_BR/messages.json | 6 - app/_locales/ro/messages.json | 3 - app/_locales/ru/messages.json | 6 - app/_locales/sk/messages.json | 3 - app/_locales/sl/messages.json | 3 - app/_locales/sr/messages.json | 3 - app/_locales/sv/messages.json | 3 - app/_locales/sw/messages.json | 3 - app/_locales/tl/messages.json | 6 - app/_locales/tr/messages.json | 6 - app/_locales/uk/messages.json | 3 - app/_locales/vi/messages.json | 6 - app/_locales/zh_CN/messages.json | 6 - app/_locales/zh_TW/messages.json | 3 - test/e2e/metamask-ui.spec.js | 7 +- test/e2e/tests/from-import-ui.spec.js | 4 +- test/e2e/tests/metamask-responsive-ui.spec.js | 7 +- ui/components/app/app-components.scss | 1 + .../app/create-new-vault/create-new-vault.js | 249 ++++++++++++++++ .../create-new-vault/create-new-vault.scss | 53 ++++ .../create-new-vault.stories.js | 29 ++ ui/components/app/create-new-vault/index.js | 1 + .../parse-secret-recovery-phrase'.test.js | 40 +++ .../parse-secret-recovery-phrase.js | 2 + .../import-with-seed-phrase.component.js | 281 +----------------- .../import-with-seed-phrase.component.test.js | 99 ------ ui/pages/first-time-flow/index.scss | 43 +-- ui/pages/keychains/index.scss | 88 +----- ui/pages/keychains/restore-vault.js | 210 +------------ 61 files changed, 416 insertions(+), 884 deletions(-) create mode 100644 ui/components/app/create-new-vault/create-new-vault.js create mode 100644 ui/components/app/create-new-vault/create-new-vault.scss create mode 100644 ui/components/app/create-new-vault/create-new-vault.stories.js create mode 100644 ui/components/app/create-new-vault/index.js create mode 100644 ui/components/app/create-new-vault/parse-secret-recovery-phrase'.test.js create mode 100644 ui/components/app/create-new-vault/parse-secret-recovery-phrase.js delete mode 100644 ui/pages/first-time-flow/create-password/import-with-seed-phrase/import-with-seed-phrase.component.test.js diff --git a/app/_locales/am/messages.json b/app/_locales/am/messages.json index 6c747ac6e..b07f467b1 100644 --- a/app/_locales/am/messages.json +++ b/app/_locales/am/messages.json @@ -861,9 +861,6 @@ "sendTokens": { "message": "ተለዋጭ ስሞችን ላክ" }, - "separateEachWord": { - "message": "እያንዳንዱን ቃል በነጠላ ክፍት ቦታ ይለያዩ" - }, "settings": { "message": "ቅንብሮች" }, diff --git a/app/_locales/ar/messages.json b/app/_locales/ar/messages.json index b64d23ccb..d84d78738 100644 --- a/app/_locales/ar/messages.json +++ b/app/_locales/ar/messages.json @@ -877,9 +877,6 @@ "sendTokens": { "message": "إرسال عملات رمزية" }, - "separateEachWord": { - "message": "افصل كل كلمة بمسافة واحدة" - }, "settings": { "message": "الإعدادات" }, diff --git a/app/_locales/bg/messages.json b/app/_locales/bg/messages.json index ee655931b..3147c8d4a 100644 --- a/app/_locales/bg/messages.json +++ b/app/_locales/bg/messages.json @@ -872,9 +872,6 @@ "sendTokens": { "message": "Изпращане на жетони" }, - "separateEachWord": { - "message": "Отделете всяка дума с интервал" - }, "settings": { "message": "Настройки" }, diff --git a/app/_locales/bn/messages.json b/app/_locales/bn/messages.json index df49e9050..3c18a2b2c 100644 --- a/app/_locales/bn/messages.json +++ b/app/_locales/bn/messages.json @@ -876,9 +876,6 @@ "sendTokens": { "message": "টোকেনগুলি পাঠান" }, - "separateEachWord": { - "message": "প্রতিটি শব্দকে একটি স্পেস দিয়ে আলাদা করুন" - }, "settings": { "message": "সেটিংস" }, diff --git a/app/_locales/ca/messages.json b/app/_locales/ca/messages.json index bebf48582..bda94d4c1 100644 --- a/app/_locales/ca/messages.json +++ b/app/_locales/ca/messages.json @@ -854,9 +854,6 @@ "sendTokens": { "message": "Enviar Fitxes" }, - "separateEachWord": { - "message": "Separa cada paraula amb un sol espai" - }, "settings": { "message": "Configuració" }, diff --git a/app/_locales/da/messages.json b/app/_locales/da/messages.json index 4a45e5e43..9106e784e 100644 --- a/app/_locales/da/messages.json +++ b/app/_locales/da/messages.json @@ -854,9 +854,6 @@ "sendTokens": { "message": "Send tokens" }, - "separateEachWord": { - "message": "Separer hvert ord med et enkelt mellemrum" - }, "settings": { "message": "Indstillinger " }, diff --git a/app/_locales/de/messages.json b/app/_locales/de/messages.json index 19e5ecf54..d4f963ee6 100644 --- a/app/_locales/de/messages.json +++ b/app/_locales/de/messages.json @@ -838,9 +838,6 @@ "sendTokens": { "message": "Token senden" }, - "separateEachWord": { - "message": "Trennen Sie die Wörter mit einem einzelnen Leerzeichen voneinander" - }, "settings": { "message": "Einstellungen" }, diff --git a/app/_locales/el/messages.json b/app/_locales/el/messages.json index 84c2c8c6d..4b51d9658 100644 --- a/app/_locales/el/messages.json +++ b/app/_locales/el/messages.json @@ -2460,9 +2460,6 @@ "message": "Αποστολή $1", "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" }, - "separateEachWord": { - "message": "Διαχωρίστε κάθε λέξη με ένα μόνο κενό" - }, "setAdvancedPrivacySettings": { "message": "Ορίστε ρυθμίσεις απορρήτου για προχωρημένους" }, @@ -3375,9 +3372,6 @@ "walletCreationSuccessTitle": { "message": "Επιτυχής δημιουργία πορτοφολιού" }, - "walletSeedRestore": { - "message": "Μυστικής Φράσης Ανάκτησης Πορτοφολιού" - }, "web3ShimUsageNotification": { "message": "Παρατηρήσαμε ότι η τρέχουσα ιστοσελίδα προσπάθησε να χρησιμοποιήσει το αφαιρεθέν window.web3 API. Αν η ιστοσελίδα φαίνεται να έχει παραβιαστεί, κάντε κλικ στο $1 για περισσότερες πληροφορίες.", "description": "$1 is a clickable link." diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 9ee9a52a9..258bcdc50 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -2582,9 +2582,6 @@ "message": "Sending $1", "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" }, - "separateEachWord": { - "message": "Separate each word with a single space" - }, "setAdvancedPrivacySettings": { "message": "Set advanced privacy settings" }, @@ -3503,9 +3500,6 @@ "walletCreationSuccessTitle": { "message": "Wallet creation successful" }, - "walletSeedRestore": { - "message": "Wallet Secret Recovery Phrase" - }, "web3ShimUsageNotification": { "message": "We noticed that the current website tried to use the removed window.web3 API. If the site appears to be broken, please click $1 for more information.", "description": "$1 is a clickable link." diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index 110ff0fee..b2c8eb472 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -1612,9 +1612,6 @@ "sendTokens": { "message": "Enviar tokens" }, - "separateEachWord": { - "message": "Separar cada palabra con un solo espacio" - }, "settings": { "message": "Configuración" }, @@ -2263,9 +2260,6 @@ "walletConnectionGuide": { "message": "nuestra guía de conexión de la cartera de hardware" }, - "walletSeedRestore": { - "message": "Frase secreta de recuperación de la cartera" - }, "web3ShimUsageNotification": { "message": "Parece que el sitio web actual intentó utilizar la API de window.web3 que se eliminó. Si el sitio no funciona, haga clic en $1 para obtener más información.", "description": "$1 is a clickable link." diff --git a/app/_locales/es_419/messages.json b/app/_locales/es_419/messages.json index 2d0b0c652..a30565aaa 100644 --- a/app/_locales/es_419/messages.json +++ b/app/_locales/es_419/messages.json @@ -1624,9 +1624,6 @@ "sendTokens": { "message": "Enviar tokens" }, - "separateEachWord": { - "message": "Separar cada palabra con un solo espacio" - }, "settings": { "message": "Configuración" }, @@ -2275,9 +2272,6 @@ "walletConnectionGuide": { "message": "nuestra guía de conexión de la cartera de hardware" }, - "walletSeedRestore": { - "message": "Frase secreta de recuperación de la cartera" - }, "web3ShimUsageNotification": { "message": "Parece que el sitio web actual intentó utilizar la API de window.web3 que se eliminó. Si el sitio no funciona, haga clic en $1 para obtener más información.", "description": "$1 is a clickable link." diff --git a/app/_locales/et/messages.json b/app/_locales/et/messages.json index 9e60e88de..416754b7e 100644 --- a/app/_locales/et/messages.json +++ b/app/_locales/et/messages.json @@ -866,9 +866,6 @@ "sendTokens": { "message": "Saada lube" }, - "separateEachWord": { - "message": "Eraldage iga sõna ühe tühikuga" - }, "settings": { "message": "Seaded" }, diff --git a/app/_locales/fa/messages.json b/app/_locales/fa/messages.json index 8f875e8f9..94e76b94f 100644 --- a/app/_locales/fa/messages.json +++ b/app/_locales/fa/messages.json @@ -876,9 +876,6 @@ "sendTokens": { "message": "رمزیاب ها را ارسال کنید" }, - "separateEachWord": { - "message": "هر کلمه را با یک فاصله واحد جدا سازید" - }, "settings": { "message": "تنظیمات" }, diff --git a/app/_locales/fi/messages.json b/app/_locales/fi/messages.json index ef644d7ba..e0beecfee 100644 --- a/app/_locales/fi/messages.json +++ b/app/_locales/fi/messages.json @@ -873,9 +873,6 @@ "sendTokens": { "message": "Lähetä tietueita" }, - "separateEachWord": { - "message": "Erottele sanat toisistaan yhdellä välilyönnillä" - }, "settings": { "message": "Asetukset" }, diff --git a/app/_locales/fil/messages.json b/app/_locales/fil/messages.json index b712d7644..7ad87f6a4 100644 --- a/app/_locales/fil/messages.json +++ b/app/_locales/fil/messages.json @@ -794,9 +794,6 @@ "sendTokens": { "message": "Magpadala ng Mga Token" }, - "separateEachWord": { - "message": "Paghiwa-hiwalayin ang bawat salita gamit ang isang space" - }, "settings": { "message": "Mga Setting" }, diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json index e27785877..05db3511f 100644 --- a/app/_locales/fr/messages.json +++ b/app/_locales/fr/messages.json @@ -2460,9 +2460,6 @@ "message": "Envoi de $1", "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" }, - "separateEachWord": { - "message": "Separez chaque mot avec un espace simple" - }, "setAdvancedPrivacySettings": { "message": "Définir des paramètres de confidentialité avancés" }, @@ -3375,9 +3372,6 @@ "walletCreationSuccessTitle": { "message": "Portefeuille créé avec succès" }, - "walletSeedRestore": { - "message": "Phrase secrète de récupération du portefeuille" - }, "web3ShimUsageNotification": { "message": "Nous avons remarqué que ce site Web a essayé d’utiliser l’API window.web3 supprimée. Si le site semble être défectueux, veuillez cliquer sur $1 pour plus d’informations.", "description": "$1 is a clickable link." diff --git a/app/_locales/he/messages.json b/app/_locales/he/messages.json index 5a8a936b3..da929cd5a 100644 --- a/app/_locales/he/messages.json +++ b/app/_locales/he/messages.json @@ -870,9 +870,6 @@ "sendTokens": { "message": "שלח טוקנים" }, - "separateEachWord": { - "message": "יש להפריד כל מילה עם רווח יחיד" - }, "settings": { "message": "הגדרות" }, diff --git a/app/_locales/hi/messages.json b/app/_locales/hi/messages.json index 9dfa6f75b..e314198e6 100644 --- a/app/_locales/hi/messages.json +++ b/app/_locales/hi/messages.json @@ -2460,9 +2460,6 @@ "message": "$1 भेजा जा रहा है", "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" }, - "separateEachWord": { - "message": "प्रत्येक शब्द को एक रिक्ति से अलग करें" - }, "setAdvancedPrivacySettings": { "message": "एडवांस गोपनीयता सेटिंग्स निर्धारित करें" }, @@ -3375,9 +3372,6 @@ "walletCreationSuccessTitle": { "message": "वॉलेट का निर्माण सफल हुआ" }, - "walletSeedRestore": { - "message": "वॉलेट का गुप्त रिकवरी फ्रेज़" - }, "web3ShimUsageNotification": { "message": "हमने देखा है कि वर्तमान वेबसाइट ने हटाए गए window.web3 API का उपयोग करने की कोशिश की। यदि साइट में गड़बड़ी लगती है, तो कृपया अधिक जानकारी के लिए $1 पर क्लिक करें।", "description": "$1 is a clickable link." diff --git a/app/_locales/hr/messages.json b/app/_locales/hr/messages.json index ea8254d9d..1562e2e73 100644 --- a/app/_locales/hr/messages.json +++ b/app/_locales/hr/messages.json @@ -869,9 +869,6 @@ "sendTokens": { "message": "Pošalji tokene" }, - "separateEachWord": { - "message": "Odvojite pojedinačne riječi jednim razmakom" - }, "settings": { "message": "Postavke" }, diff --git a/app/_locales/ht/messages.json b/app/_locales/ht/messages.json index 60edde94d..2e80f5b5c 100644 --- a/app/_locales/ht/messages.json +++ b/app/_locales/ht/messages.json @@ -551,9 +551,6 @@ "sendTokens": { "message": "Voye Tokens" }, - "separateEachWord": { - "message": "Separe chak mo ak yon sèl espas" - }, "settings": { "message": "Paramèt" }, diff --git a/app/_locales/hu/messages.json b/app/_locales/hu/messages.json index c13dcc19b..0f7883a60 100644 --- a/app/_locales/hu/messages.json +++ b/app/_locales/hu/messages.json @@ -869,9 +869,6 @@ "sendTokens": { "message": "Token küldése" }, - "separateEachWord": { - "message": "Minden egyes szavat szóközzel válasszon el" - }, "settings": { "message": "Beállítások" }, diff --git a/app/_locales/id/messages.json b/app/_locales/id/messages.json index 6148f18f9..1762d3a43 100644 --- a/app/_locales/id/messages.json +++ b/app/_locales/id/messages.json @@ -2460,9 +2460,6 @@ "message": "Mengirim $1", "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" }, - "separateEachWord": { - "message": "Pisahkan setiap kata dengan satu spasi" - }, "setAdvancedPrivacySettings": { "message": "Atur pengaturan privasi lanjutan" }, @@ -3375,9 +3372,6 @@ "walletCreationSuccessTitle": { "message": "Dompet berhasil dibuat" }, - "walletSeedRestore": { - "message": "Frasa Pemulihan Rahasia Dompet" - }, "web3ShimUsageNotification": { "message": "Kami melihat situs web saat ini mencoba menggunakan API window.web3 yang dihapus. Jika situs tersebut tampak bermasalah, silakan klik $1 untuk informasi selengkapnya.", "description": "$1 is a clickable link." diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json index 7bad7940d..b37948744 100644 --- a/app/_locales/it/messages.json +++ b/app/_locales/it/messages.json @@ -1298,9 +1298,6 @@ "sendTokens": { "message": "Invia Tokens" }, - "separateEachWord": { - "message": "Separa ogni parola con un solo spazio" - }, "settings": { "message": "Impostazioni" }, diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json index b1fae7296..2e009a113 100644 --- a/app/_locales/ja/messages.json +++ b/app/_locales/ja/messages.json @@ -2460,9 +2460,6 @@ "message": "$1を送信中", "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" }, - "separateEachWord": { - "message": "単語ごとにスペースを 1 つ置いて分離します" - }, "setAdvancedPrivacySettings": { "message": "高度なプライバシー設定を設定" }, @@ -3375,9 +3372,6 @@ "walletCreationSuccessTitle": { "message": "ウォレットが作成されました" }, - "walletSeedRestore": { - "message": "ウォレット シークレット リカバリー フレーズ" - }, "web3ShimUsageNotification": { "message": "現在のウェブサイトが、削除済の window.web3 API の使用を検知しました。サイトが壊れているようであれば、$1 をクリックして詳細を確認してください。", "description": "$1 is a clickable link." diff --git a/app/_locales/kn/messages.json b/app/_locales/kn/messages.json index 5126c5b97..a03cfb633 100644 --- a/app/_locales/kn/messages.json +++ b/app/_locales/kn/messages.json @@ -876,9 +876,6 @@ "sendTokens": { "message": "ಟೋಕನ್‌ಗಳನ್ನು ಕಳುಹಿಸಿ" }, - "separateEachWord": { - "message": "ಒಂದು ಸ್ಪೇಸ್ ಮೂಲಕ ಪ್ರತಿ ಪದವನ್ನು ಬೇರ್ಪಡಿಸಿ" - }, "settings": { "message": "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" }, diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index 3cffd545f..f49a3fadf 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -2460,9 +2460,6 @@ "message": "$1 보내기", "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" }, - "separateEachWord": { - "message": "공백 한 칸으로 각 단어를 구분하세요." - }, "setAdvancedPrivacySettings": { "message": "개인정보 설정 고급 지정" }, @@ -3375,9 +3372,6 @@ "walletCreationSuccessTitle": { "message": "지갑 생성 성공" }, - "walletSeedRestore": { - "message": "지갑 비밀 복구 구문" - }, "web3ShimUsageNotification": { "message": "현재의 웹사이트가 제거된 window.web3 API를 이용하려고 합니다. 이 사이트가 제대로 작동하지 않는 경우, $1을(를) 클릭해 자세히 알아보세요.", "description": "$1 is a clickable link." diff --git a/app/_locales/lt/messages.json b/app/_locales/lt/messages.json index 9a6df90fd..641ae4c38 100644 --- a/app/_locales/lt/messages.json +++ b/app/_locales/lt/messages.json @@ -876,9 +876,6 @@ "sendTokens": { "message": "Siųsti žetonus" }, - "separateEachWord": { - "message": "Kiekvieną žodį atskirkite viengubu tarpu" - }, "settings": { "message": "Nustatymai" }, diff --git a/app/_locales/lv/messages.json b/app/_locales/lv/messages.json index fea8634a8..294417151 100644 --- a/app/_locales/lv/messages.json +++ b/app/_locales/lv/messages.json @@ -872,9 +872,6 @@ "sendTokens": { "message": "Nosūtīt marķierus" }, - "separateEachWord": { - "message": "Atdaliet katru vārdu ar vienu atstarpi" - }, "settings": { "message": "Iestatījumi" }, diff --git a/app/_locales/ms/messages.json b/app/_locales/ms/messages.json index af2f7244e..a35c4cdee 100644 --- a/app/_locales/ms/messages.json +++ b/app/_locales/ms/messages.json @@ -856,9 +856,6 @@ "sendTokens": { "message": "Hantar Token" }, - "separateEachWord": { - "message": "Pisahkan setiap perkataan dengan ruang tunggal" - }, "settings": { "message": "Tetapan" }, diff --git a/app/_locales/no/messages.json b/app/_locales/no/messages.json index 4c17be907..331ba4405 100644 --- a/app/_locales/no/messages.json +++ b/app/_locales/no/messages.json @@ -857,9 +857,6 @@ "sendTokens": { "message": "Send tokener" }, - "separateEachWord": { - "message": "Del hvert ord med et enkelt mellomrom " - }, "settings": { "message": "Innstillinger" }, diff --git a/app/_locales/ph/messages.json b/app/_locales/ph/messages.json index 5aff3d204..2c39ffd62 100644 --- a/app/_locales/ph/messages.json +++ b/app/_locales/ph/messages.json @@ -1637,9 +1637,6 @@ "sendTokens": { "message": "Magpadala ng Mga Token" }, - "separateEachWord": { - "message": "Paghiwa-hiwalayin ang bawat salita gamit ang isang space" - }, "settings": { "message": "Mga Setting" }, @@ -2294,9 +2291,6 @@ "walletConnectionGuide": { "message": "ang aming gabay sa pagkonekta ng hardware wallet" }, - "walletSeedRestore": { - "message": "Recovery Phrase ng Wallet Secret" - }, "web3ShimUsageNotification": { "message": "Napansin naming sinubukang gamitin ng kasalukuyang website ang tinanggal na window.web3 API. Kung mukhang sira ang site, paki-click ang $1 para sa higit pang impormasyon.", "description": "$1 is a clickable link." diff --git a/app/_locales/pl/messages.json b/app/_locales/pl/messages.json index 13a43808b..a16bfdf3b 100644 --- a/app/_locales/pl/messages.json +++ b/app/_locales/pl/messages.json @@ -870,9 +870,6 @@ "sendTokens": { "message": "Wyślij tokeny" }, - "separateEachWord": { - "message": "Oddziel słowa pojedynczą spacją" - }, "settings": { "message": "Ustawienia" }, diff --git a/app/_locales/pt_BR/messages.json b/app/_locales/pt_BR/messages.json index d0570be1a..346bd2166 100644 --- a/app/_locales/pt_BR/messages.json +++ b/app/_locales/pt_BR/messages.json @@ -1612,9 +1612,6 @@ "sendTokens": { "message": "Enviar tokens" }, - "separateEachWord": { - "message": "Separe cada palavra com um único espaço" - }, "settings": { "message": "Configurações" }, @@ -2260,9 +2257,6 @@ "walletConnectionGuide": { "message": "nosso guia de conexão com a carteira de hardware" }, - "walletSeedRestore": { - "message": "Frase de recuperação secreta da carteira" - }, "web3ShimUsageNotification": { "message": "Percebemos que o site atual tentou usar a API window.web3 removida. Se o site parecer estar corrompido, clique em $1 para obter mais informações.", "description": "$1 is a clickable link." diff --git a/app/_locales/ro/messages.json b/app/_locales/ro/messages.json index 21fe2cafe..fadf0ec66 100644 --- a/app/_locales/ro/messages.json +++ b/app/_locales/ro/messages.json @@ -863,9 +863,6 @@ "sendTokens": { "message": "Trimiteți indicative" }, - "separateEachWord": { - "message": "Despărțiți fiecare cuvânt cu un spațiu" - }, "settings": { "message": "Setări" }, diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json index 94cf6bc5d..a4e213e6a 100644 --- a/app/_locales/ru/messages.json +++ b/app/_locales/ru/messages.json @@ -2460,9 +2460,6 @@ "message": "Отправка $1...", "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" }, - "separateEachWord": { - "message": "Отделяйте каждое слово одним пробелом" - }, "setAdvancedPrivacySettings": { "message": "Задать дополнительные настройки конфиденциальности" }, @@ -3375,9 +3372,6 @@ "walletCreationSuccessTitle": { "message": "Кошелек создан" }, - "walletSeedRestore": { - "message": "Секретная фраза восстановления кошелька" - }, "web3ShimUsageNotification": { "message": "Мы заметили, что текущий веб-сайт пытался использовать удаленный API window.web3. Если сайт не работает, нажмите $1 для получения дополнительной информации.", "description": "$1 is a clickable link." diff --git a/app/_locales/sk/messages.json b/app/_locales/sk/messages.json index 1b7217cad..05076ce66 100644 --- a/app/_locales/sk/messages.json +++ b/app/_locales/sk/messages.json @@ -839,9 +839,6 @@ "sendTokens": { "message": "Odeslat tokeny" }, - "separateEachWord": { - "message": "Každé slovo oddeľte jednou medzerou" - }, "settings": { "message": "Nastavení" }, diff --git a/app/_locales/sl/messages.json b/app/_locales/sl/messages.json index 75ce873a5..c4354dbb5 100644 --- a/app/_locales/sl/messages.json +++ b/app/_locales/sl/messages.json @@ -864,9 +864,6 @@ "sendTokens": { "message": "Pošlji žetone" }, - "separateEachWord": { - "message": "Vsako besedo ločite z enim presledkom" - }, "settings": { "message": "Nastavitve" }, diff --git a/app/_locales/sr/messages.json b/app/_locales/sr/messages.json index 7f6354378..809e44c23 100644 --- a/app/_locales/sr/messages.json +++ b/app/_locales/sr/messages.json @@ -867,9 +867,6 @@ "sendTokens": { "message": "Pošalji tokene" }, - "separateEachWord": { - "message": "Razdvojite svaku reč jednim mestom razmaka" - }, "settings": { "message": "Podešavanja" }, diff --git a/app/_locales/sv/messages.json b/app/_locales/sv/messages.json index 22930ea92..21ee8520d 100644 --- a/app/_locales/sv/messages.json +++ b/app/_locales/sv/messages.json @@ -860,9 +860,6 @@ "sendTokens": { "message": "Skicka tokens" }, - "separateEachWord": { - "message": "Lägg in ett mellanslag mellan varje ord" - }, "settings": { "message": "Inställningar" }, diff --git a/app/_locales/sw/messages.json b/app/_locales/sw/messages.json index 01ad96959..c854540da 100644 --- a/app/_locales/sw/messages.json +++ b/app/_locales/sw/messages.json @@ -854,9 +854,6 @@ "sendTokens": { "message": "Tuma Vianzio" }, - "separateEachWord": { - "message": "Tenganisha kila neno kwa nafasi moja" - }, "settings": { "message": "Mipangilio" }, diff --git a/app/_locales/tl/messages.json b/app/_locales/tl/messages.json index 91d3afe05..0eb671b15 100644 --- a/app/_locales/tl/messages.json +++ b/app/_locales/tl/messages.json @@ -2460,9 +2460,6 @@ "message": "Nagpapadala ng $1", "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" }, - "separateEachWord": { - "message": "Paghiwa-hiwalayin ang bawat salita gamit ang espasyo" - }, "setAdvancedPrivacySettings": { "message": "Magtakda ng advanced privacy settings" }, @@ -3375,9 +3372,6 @@ "walletCreationSuccessTitle": { "message": "Matagumpay ang paggawa ng wallet" }, - "walletSeedRestore": { - "message": "Recovery Phrase ng Wallet Secret" - }, "web3ShimUsageNotification": { "message": "Napansin namin na sinubukan ng kasalukuyang website na gamitin ang inalis na window.web3 API. Kung mukhang sira ang site, paki-click ang $1 para sa karagdagang impormasyon.", "description": "$1 is a clickable link." diff --git a/app/_locales/tr/messages.json b/app/_locales/tr/messages.json index 664f13ee9..0e4b73f85 100644 --- a/app/_locales/tr/messages.json +++ b/app/_locales/tr/messages.json @@ -2460,9 +2460,6 @@ "message": "$1 gönderiliyor", "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" }, - "separateEachWord": { - "message": "Her kelimeyi tek bir boşluk ile ayırın" - }, "setAdvancedPrivacySettings": { "message": "Gelişmiş gizlilik ayarlarını ayarlayın" }, @@ -3375,9 +3372,6 @@ "walletCreationSuccessTitle": { "message": "Cüzdan oluşturma başarılı" }, - "walletSeedRestore": { - "message": "Cüzdan Gizli Kurtarma İfadesi" - }, "web3ShimUsageNotification": { "message": "Mevcut web sitesinin kaldırılmış olan window.web3 API'sini kullanmaya çalıştığını fark ettik. Site bozuk olarak görülüyorsa daha fazla bilgi için lütfen şuna tıklayın: $1.", "description": "$1 is a clickable link." diff --git a/app/_locales/uk/messages.json b/app/_locales/uk/messages.json index 89c53568d..d61757b54 100644 --- a/app/_locales/uk/messages.json +++ b/app/_locales/uk/messages.json @@ -876,9 +876,6 @@ "sendTokens": { "message": "Надіслати токени" }, - "separateEachWord": { - "message": "Відділіть кожне слово одним пробілом" - }, "settings": { "message": "Налаштування" }, diff --git a/app/_locales/vi/messages.json b/app/_locales/vi/messages.json index 24d61f173..fc40fff39 100644 --- a/app/_locales/vi/messages.json +++ b/app/_locales/vi/messages.json @@ -2460,9 +2460,6 @@ "message": "Gửi $1", "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" }, - "separateEachWord": { - "message": "Phân tách mỗi từ bằng một dấu cách" - }, "setAdvancedPrivacySettings": { "message": "Thiết lập cài đặt quyền riêng tư nâng cao" }, @@ -3375,9 +3372,6 @@ "walletCreationSuccessTitle": { "message": "Tạo ví thành công" }, - "walletSeedRestore": { - "message": "Cụm mật khẩu khôi phục bí mật của ví" - }, "web3ShimUsageNotification": { "message": "Chúng tôi nhận thấy rằng trang web hiện tại đã cố dùng API window.web3 đã bị xóa. Nếu trang web có vẻ như đã bị lỗi, vui lòng nhấp vào $1 để biết thêm thông tin.", "description": "$1 is a clickable link." diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index 42c8f7b6f..dd380c079 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -2460,9 +2460,6 @@ "message": "正在发送$1", "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" }, - "separateEachWord": { - "message": "用空格分隔每个单词" - }, "setAdvancedPrivacySettings": { "message": "设置高级隐私设置" }, @@ -3375,9 +3372,6 @@ "walletCreationSuccessTitle": { "message": "钱包创建成功" }, - "walletSeedRestore": { - "message": "钱包账户助记词" - }, "web3ShimUsageNotification": { "message": "我们发现当前的网站尝试使用已经删除的 window.web3 API。如果这个网站网站已经无法正常使用,请点击 $1 获取更多信息。", "description": "$1 is a clickable link." diff --git a/app/_locales/zh_TW/messages.json b/app/_locales/zh_TW/messages.json index c662ad2e8..3e281b358 100644 --- a/app/_locales/zh_TW/messages.json +++ b/app/_locales/zh_TW/messages.json @@ -855,9 +855,6 @@ "sendTokens": { "message": "發送代幣" }, - "separateEachWord": { - "message": "單詞之間請以空白間隔" - }, "settings": { "message": "設定" }, diff --git a/test/e2e/metamask-ui.spec.js b/test/e2e/metamask-ui.spec.js index 5ffd36c7f..69b5e6353 100644 --- a/test/e2e/metamask-ui.spec.js +++ b/test/e2e/metamask-ui.spec.js @@ -200,9 +200,10 @@ describe('MetaMask', function () { await restoreSeedLink.click(); await driver.delay(regularDelayMs); - await driver.clickElement('.import-account__checkbox-container'); - - await driver.fill('.import-account__secret-phrase', testSeedPhrase); + await driver.fill( + 'input[placeholder="Enter your Secret Recovery Phrase"]', + testSeedPhrase, + ); await driver.delay(regularDelayMs); await driver.fill('#password', 'correct horse battery staple'); diff --git a/test/e2e/tests/from-import-ui.spec.js b/test/e2e/tests/from-import-ui.spec.js index fc34a2f78..a1a8e1da4 100644 --- a/test/e2e/tests/from-import-ui.spec.js +++ b/test/e2e/tests/from-import-ui.spec.js @@ -87,7 +87,9 @@ describe('Metamask Import UI', function () { 'correct horse battery staple', ); - await driver.clickElement('.first-time-flow__terms'); + await driver.clickElement( + '[data-testid="create-new-vault__terms-checkbox"]', + ); await driver.clickElement({ text: 'Import', tag: 'button' }); diff --git a/test/e2e/tests/metamask-responsive-ui.spec.js b/test/e2e/tests/metamask-responsive-ui.spec.js index cff4f6fb1..3bf8684fb 100644 --- a/test/e2e/tests/metamask-responsive-ui.spec.js +++ b/test/e2e/tests/metamask-responsive-ui.spec.js @@ -172,9 +172,10 @@ describe('Metamask Responsive UI', function () { ); await restoreSeedLink.click(); - await driver.clickElement('.import-account__checkbox-container'); - - await driver.fill('.import-account__secret-phrase', testSeedPhrase); + await driver.fill( + 'input[placeholder="Enter your Secret Recovery Phrase"]', + testSeedPhrase, + ); await driver.fill('#password', 'correct horse battery staple'); await driver.fill('#confirm-password', 'correct horse battery staple'); diff --git a/ui/components/app/app-components.scss b/ui/components/app/app-components.scss index 17653fee7..69bdcf240 100644 --- a/ui/components/app/app-components.scss +++ b/ui/components/app/app-components.scss @@ -19,6 +19,7 @@ @import 'connected-accounts-permissions/index'; @import 'connected-sites-list/index'; @import 'connected-status-indicator/index'; +@import 'create-new-vault/create-new-vault.scss'; @import 'edit-gas-display/index'; @import 'edit-gas-display-education/index'; @import 'edit-gas-fee-button/index'; diff --git a/ui/components/app/create-new-vault/create-new-vault.js b/ui/components/app/create-new-vault/create-new-vault.js new file mode 100644 index 000000000..3c2b5007b --- /dev/null +++ b/ui/components/app/create-new-vault/create-new-vault.js @@ -0,0 +1,249 @@ +import { ethers } from 'ethers'; +import React, { useCallback, useContext, useState } from 'react'; +import PropTypes from 'prop-types'; +import { useI18nContext } from '../../../hooks/useI18nContext'; +import { MetaMetricsContext } from '../../../contexts/metametrics'; +import TextField from '../../ui/text-field'; +import Button from '../../ui/button'; +import { clearClipboard } from '../../../helpers/utils/util'; +import CheckBox from '../../ui/check-box'; +import Typography from '../../ui/typography'; +import { COLORS } from '../../../helpers/constants/design-system'; +import { parseSecretRecoveryPhrase } from './parse-secret-recovery-phrase'; + +const { isValidMnemonic } = ethers.utils; + +export default function CreateNewVault({ + disabled = false, + includeTerms = false, + onSubmit, + submitText, +}) { + const [confirmPassword, setConfirmPassword] = useState(''); + const [confirmPasswordError, setConfirmPasswordError] = useState(''); + const [password, setPassword] = useState(''); + const [passwordError, setPasswordError] = useState(''); + const [seedPhrase, setSeedPhrase] = useState(''); + const [seedPhraseError, setSeedPhraseError] = useState(''); + const [showSeedPhrase, setShowSeedPhrase] = useState(false); + const [termsChecked, setTermsChecked] = useState(false); + + const t = useI18nContext(); + const metricsEvent = useContext(MetaMetricsContext); + + const onSeedPhraseChange = useCallback( + (rawSeedPhrase) => { + let newSeedPhraseError = ''; + + if (rawSeedPhrase) { + const parsedSeedPhrase = parseSecretRecoveryPhrase(rawSeedPhrase); + const wordCount = parsedSeedPhrase.split(/\s/u).length; + if (wordCount % 3 !== 0 || wordCount > 24 || wordCount < 12) { + newSeedPhraseError = t('seedPhraseReq'); + } else if (!isValidMnemonic(parsedSeedPhrase)) { + newSeedPhraseError = t('invalidSeedPhrase'); + } + } + + setSeedPhrase(rawSeedPhrase); + setSeedPhraseError(newSeedPhraseError); + }, + [setSeedPhrase, setSeedPhraseError, t], + ); + + const onPasswordChange = useCallback( + (newPassword) => { + let newConfirmPasswordError = ''; + let newPasswordError = ''; + + if (newPassword && newPassword.length < 8) { + newPasswordError = t('passwordNotLongEnough'); + } + + if (confirmPassword && newPassword !== confirmPassword) { + newConfirmPasswordError = t('passwordsDontMatch'); + } + + setPassword(newPassword); + setPasswordError(newPasswordError); + setConfirmPasswordError(newConfirmPasswordError); + }, + [confirmPassword, t], + ); + + const onConfirmPasswordChange = useCallback( + (newConfirmPassword) => { + let newConfirmPasswordError = ''; + + if (password !== newConfirmPassword) { + newConfirmPasswordError = t('passwordsDontMatch'); + } + + setConfirmPassword(newConfirmPassword); + setConfirmPasswordError(newConfirmPasswordError); + }, + [password, t], + ); + + const isValid = + !disabled && + password && + confirmPassword && + password === confirmPassword && + seedPhrase && + (!includeTerms || termsChecked) && + !passwordError && + !confirmPasswordError && + !seedPhraseError; + + const onImport = useCallback( + async (event) => { + event.preventDefault(); + + if (!isValid) { + return; + } + + await onSubmit(password, parseSecretRecoveryPhrase(seedPhrase)); + }, + [isValid, onSubmit, password, seedPhrase], + ); + + const toggleTermsCheck = useCallback(() => { + metricsEvent({ + eventOpts: { + category: 'Onboarding', + action: 'Import Seed Phrase', + name: 'Check ToS', + }, + }); + + setTermsChecked((currentTermsChecked) => !currentTermsChecked); + }, [metricsEvent]); + + const toggleShowSeedPhrase = useCallback(() => { + setShowSeedPhrase((currentShowSeedPhrase) => !currentShowSeedPhrase); + }, []); + + const termsOfUse = t('acceptTermsOfUse', [ + + {t('terms')} + , + ]); + + return ( +
+
+ + {showSeedPhrase ? ( +