A Metamask fork with Infura removed and default networks editable
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ciphermask/app/_locales/vi/messages.json

1984 lines
68 KiB

{
"about": {
"message": "Giới thiệu"
},
"aboutSettingsDescription": {
"message": "Phiên bản, trung tâm trợ giúp và thông tin liên hệ"
},
"acceleratingATransaction": {
"message": "* Việc đẩy nhanh giao dịch bằng cách sử dụng giá gas cao hơn sẽ tăng khả năng được mạng xử lý nhanh hơn, nhưng không phải lúc nào điều này cũng được đảm bảo."
},
"acceptTermsOfUse": {
"message": "Tôi đã đọc và đồng ý với $1",
"description": "$1 is the `terms` message"
},
"accessAndSpendNotice": {
"message": "$1 có thể truy cập và chi tiêu đến số tiền tối đa",
"description": "$1 is the url of the site requesting ability to spend"
},
"accessingYourCamera": {
"message": "Đang truy cập camera..."
},
"account": {
"message": "Tài khoản"
},
"accountDetails": {
"message": "Chi tiết tài khoản"
},
"accountName": {
"message": "Tên tài khoản"
},
"accountOptions": {
"message": "Tùy chọn tài khoản"
},
"accountSelectionRequired": {
"message": "Bạn cần chọn một tài khoản!"
},
"active": {
"message": "Đang hoạt động"
},
"activity": {
"message": "Hoạt động"
},
"activityLog": {
"message": "nhật ký hoạt động"
},
"addAcquiredTokens": {
"message": "Thêm token mà bạn đã mua bằng MetaMask"
},
"addAlias": {
"message": "Thêm biệt danh"
},
"addNetwork": {
"message": "Thêm mạng"
},
"addRecipient": {
"message": "Thêm người nhận"
},
"addSuggestedTokens": {
"message": "Thêm token được đề xuất"
},
"addToAddressBook": {
"message": "Thêm vào sổ địa chỉ"
},
"addToAddressBookModalPlaceholder": {
"message": "ví dụ: John D."
},
"addToken": {
"message": "Thêm token"
},
"addTokens": {
"message": "Thêm token"
},
"advanced": {
"message": "Nâng cao"
},
"advancedOptions": {
"message": "Tùy chọn nâng cao"
},
"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"
},
"affirmAgree": {
"message": "Tôi đồng ý"
},
"aggregatorFeeCost": {
"message": "Phí mạng cho trình tổng hợp"
},
"alertDisableTooltip": {
"message": "Bạn có thể thay đổi tùy chọn này trong phần \"Cài đặt > Cảnh báo\""
},
"alertSettingsUnconnectedAccount": {
"message": "Đang duyệt trang web khi chọn một tài khoản không được kết nối"
},
"alertSettingsUnconnectedAccountDescription": {
"message": "Cảnh báo này hiển thị trong cửa sổ bật lên khi bạn đang duyệt một trang web đã được kết nối trên Web3, nhưng tài khoản đang chọn không được kết nối."
},
"alerts": {
"message": "Cảnh báo"
},
"alertsSettingsDescription": {
"message": "Bật hoặc tắt từng cảnh báo"
},
"allowExternalExtensionTo": {
"message": "Cho phép tiện ích bên ngoài này:"
},
"allowOriginSpendToken": {
"message": "Cho phép $1 chi tiêu $2 của bạn?",
"description": "$1 is the url of the site and $2 is the symbol of the token they are requesting to spend"
},
"allowThisSiteTo": {
"message": "Cho phép trang web này:"
},
"allowWithdrawAndSpend": {
"message": "Cho phép $1 rút và chi tiêu tối đa số tiền sau đây:",
"description": "The url of the site that requested permission to 'withdraw and spend'"
},
"amount": {
"message": "Số tiền"
},
"amountWithColon": {
"message": "Số tiền:"
},
"appDescription": {
"message": "Ví Ethereum trên trình duyệt của bạn",
"description": "The description of the application"
},
"appName": {
"message": "MetaMask",
"description": "The name of the application"
},
"approvalAndAggregatorTxFeeCost": {
"message": "Phí mạng cho trình tổng hợp và việc phê duyệt"
},
"approvalTxGasCost": {
"message": "Chi phí gas cho giao dịch phê duyệt"
},
"approve": {
"message": "Phê duyệt giới hạn chi tiêu"
},
"approveSpendLimit": {
"message": "Phê duyệt giới hạn chi tiêu $1",
"description": "The token symbol that is being approved"
},
"approved": {
"message": "Đã phê duyệt"
},
"asset": {
"message": "Tài sản"
},
"assets": {
"message": "Tài sản"
},
"attemptToCancel": {
"message": "Cố gắng hủy?"
},
"attemptToCancelDescription": {
"message": "Việc gửi lần thử này không đảm bảo rằng giao dịch gốc của bạn sẽ được hủy. Nếu lần hủy này thành công, bạn sẽ chịu phí giao dịch nêu ở trên."
},
"attemptingConnect": {
"message": "Đang cố gắng kết nối với chuỗi khối."
},
"attributions": {
"message": "Ghi nhận đóng góp"
},
"authorizedPermissions": {
"message": "Bạn đã cấp các quyền sau đây"
},
"autoLockTimeLimit": {
"message": "Hẹn giờ tự động khóa (phút)"
},
"autoLockTimeLimitDescription": {
"message": "Đặt khoảng thời gian không hoạt động tính bằng phút trước khi MetaMask khóa."
},
"average": {
"message": "Trung bình"
},
"back": {
"message": "Quay lại"
},
"backToAll": {
"message": "Quay lại toàn bộ danh sách"
},
"backupApprovalInfo": {
"message": "Đây là mã bí mật bắt buộc phải dùng để khôi phục ví trong trường hợp bạn bị mất thiết bị, quên mật khẩu, phải cài đặt lại MetaMask hoặc muốn truy cập ví của mình trên một thiết bị khác."
},
"backupApprovalNotice": {
"message": "Sao lưu Mã khôi phục bí mật để đảm bảo an toàn cho ví và tiền của bạn."
},
"backupNow": {
"message": "Sao lưu ngay"
},
"balance": {
"message": "Số dư"
},
"balanceOutdated": {
"message": "Số dư có thể đã cũ"
},
"basic": {
"message": "Cơ bản"
},
"blockExplorerUrl": {
"message": "Trình khám phá khối"
},
"blockExplorerView": {
"message": "Xem tài khoản tại $1",
"description": "$1 replaced by URL for custom block explorer"
},
"blockiesIdenticon": {
"message": "Dùng biểu tượng nhận dạng kiểu Blockies"
},
"browserNotSupported": {
"message": "Trình duyệt của bạn không được hỗ trợ..."
},
"builtInCalifornia": {
"message": "MetaMask được thiết kế và phát triển tại California."
},
"buy": {
"message": "Mua"
},
"buyWithWyre": {
"message": "Mua ETH qua Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre cho phép bạn dùng thẻ ghi nợ để nộp ETH trực tiếp vào tài khoản MetaMask của mình."
},
"bytes": {
"message": "Byte"
},
"cancel": {
"message": "Hủy"
},
"cancellationGasFee": {
"message": "Phí gas hủy"
},
"cancelled": {
"message": "Đã hủy"
},
"chainId": {
"message": "Mã chuỗi"
},
"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."
},
"clickToRevealSeed": {
"message": "Nhấp vào đây để hiện các từ bí mật"
},
"close": {
"message": "Đóng"
},
"confirm": {
"message": "Xác nhận"
},
"confirmPassword": {
"message": "Xác nhận mật khẩu"
},
"confirmSecretBackupPhrase": {
"message": "Xác nhận Cụm mật khẩu sao lưu bí mật"
},
"confirmed": {
"message": "Đã xác nhận"
},
"congratulations": {
"message": "Chúc mừng bạn"
},
"connect": {
"message": "Kết nối"
},
"connectAccountOrCreate": {
"message": "Tạo tài khoản hoặc tạo tài khoản mới"
},
"connectHardwareWallet": {
"message": "Kết nối với ví cứng"
},
"connectManually": {
"message": "Kết nối thủ công với trang web hiện tại"
},
"connectTo": {
"message": "Kết nối với $1",
"description": "$1 is the name/origin of a web3 site/application that the user can connect to metamask"
},
"connectToAll": {
"message": "Kết nối với tất cả các $1 của bạn",
"description": "$1 will be replaced by the translation of connectToAllAccounts"
},
"connectToAllAccounts": {
"message": "tài khoản",
"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": "Kết nối với $1",
"description": "$1 will be replaced by the translation of connectToMultipleNumberOfAccounts"
},
"connectToMultipleNumberOfAccounts": {
"message": "$1 tài khoản",
"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": "Kết nối với MetaMask"
},
"connectedAccountsDescriptionPlural": {
"message": "Bạn có $1 tài khoản kết nối với trang web này.",
"description": "$1 is the number of accounts"
},
"connectedAccountsDescriptionSingular": {
"message": "Bạn có 1 tài khoản kết nối với trang web này."
},
"connectedAccountsEmptyDescription": {
"message": "MetaMask chưa kết nối với trang web này. Để kết nối với một trang web trên web3, hãy tìm nút kết nối trên trang web của họ."
},
"connectedSites": {
"message": "Trang web đã kết nối"
},
"connectedSitesDescription": {
"message": "$1 đã kết nối với các trang web này. Các trang web này có thể xem địa chỉ tài khoản của bạn.",
"description": "$1 is the account name"
},
"connectedSitesEmptyDescription": {
"message": "$1 chưa kết nối với bất kỳ trang web nào.",
"description": "$1 is the account name"
},
"connecting": {
"message": "Đang kết nối..."
},
"connectingTo": {
"message": "Đang kết nối với $1"
},
"connectingToGoerli": {
"message": "Đang kết nối với mạng thử nghiệm Goerli"
},
"connectingToKovan": {
"message": "Đang kết nối với mạng thử nghiệm Kovan"
},
"connectingToMainnet": {
"message": "Đang kết nối với mạng chính thức của Ethereum"
},
"connectingToRinkeby": {
"message": "Đang kết nối với mạng thử nghiệm Rinkeby"
},
"connectingToRopsten": {
"message": "Đang kết nối với mạng thử nghiệm Ropsten"
},
"contactUs": {
"message": "Liên hệ với chúng tôi"
},
"contacts": {
"message": "Danh bạ"
},
"contactsSettingsDescription": {
"message": "Thêm, chỉnh sửa, xóa và quản lý danh bạ của bạn"
},
"continueToWyre": {
"message": "Tiếp tục chuyển đến Wyre"
},
"contractDeployment": {
"message": "Triển khai hợp đồng"
},
"contractInteraction": {
"message": "Tương tác với hợp đồng"
},
"copiedExclamation": {
"message": "Đã sao chép!"
},
"copiedTransactionId": {
"message": "Đã sao chép mã giao dịch"
},
"copyAddress": {
"message": "Sao chép địa chỉ vào khay nhớ tạm"
},
"copyPrivateKey": {
"message": "Đây là khóa riêng tư của bạn (hãy nhấp vào để sao chép)"
},
"copyToClipboard": {
"message": "Sao chép vào khay nhớ tạm"
},
"copyTransactionId": {
"message": "Sao chép mã giao dịch"
},
"create": {
"message": "Tạo"
},
"createAWallet": {
"message": "Tạo ví"
},
"createAccount": {
"message": "Tạo tài khoản"
},
"createPassword": {
"message": "Tạo mật khẩu"
},
"currencyConversion": {
"message": "Quy đổi tiền"
},
"currentAccountNotConnected": {
"message": "Tài khoản hiện tại của bạn chưa được kết nối"
},
"currentExtension": {
"message": "Trang tiện ích hiện tại"
},
"currentLanguage": {
"message": "Ngôn ngữ hiện tại"
},
"customGas": {
"message": "Tùy chỉnh gas"
},
"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."
},
"customRPC": {
"message": "RPC tùy chỉnh"
},
"customSpendLimit": {
"message": "Giới hạn chi tiêu tùy chỉnh"
},
"customToken": {
"message": "Token tùy chỉnh"
},
"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?"
},
"decimal": {
"message": "Số vị trí thập phân của độ chính xác"
},
"decimalsMustZerotoTen": {
"message": "Số vị trí thập phân ít nhất phải bằng 0 và không được quá 36."
},
"decrypt": {
"message": "Decrypt"
},
"decryptCopy": {
"message": "Sao chép thông báo đã mã hóa"
},
"decryptInlineError": {
"message": "Không thể giải mã thông báo này do lỗi: $1",
"description": "$1 is error message"
},
"decryptMessageNotice": {
"message": "$1 muốn đọc thông báo này để hoàn tất hành động của bạn",
"description": "$1 is the web3 site name"
},
"decryptMetamask": {
"message": "Thông báo của Decrypt"
},
"decryptRequest": {
"message": "Yêu cầu của Decrypt"
},
"defaultNetwork": {
"message": "Mạng mặc định cho các giao dịch Ether là Mạng chính thức."
},
"delete": {
"message": "Xóa"
},
"deleteAccount": {
"message": "Xóa tài khoản"
},
"deleteNetwork": {
"message": "Xóa mạng?"
},
"deleteNetworkDescription": {
"message": "Bạn có chắc chắn muốn xóa mạng này không?"
},
"depositEther": {
"message": "Nộp Ether"
},
"details": {
"message": "Chi tiết"
},
"directDepositEther": {
"message": "Nộp trực tiếp Ether"
},
"directDepositEtherExplainer": {
"message": "Nếu bạn đã có một lượng Ether, cách nhanh nhất để chuyển Ether vào ví mới của bạn là nộp trực tiếp."
},
"disconnect": {
"message": "Ngắt kết nối"
},
"disconnectAllAccounts": {
"message": "Ngắt kết nối tất cả các tài khoản"
},
"disconnectAllAccountsConfirmationDescription": {
"message": "Bạn có chắc chắn muốn ngắt kết nối không? Bạn có thể bị mất chức năng của trang web."
},
"disconnectPrompt": {
"message": "Ngắt kết nối $1"
},
"disconnectThisAccount": {
"message": "Ngắt kết nối tài khoản này"
},
"dismiss": {
"message": "Đóng"
},
"done": {
"message": "Hoàn tất"
},
"dontShowThisAgain": {
"message": "Không hiển thị lại"
},
"downloadGoogleChrome": {
"message": "Tải Google Chrome xuống"
},
"downloadSecretBackup": {
"message": "Tải Cụm mật khẩu sao lưu bí mật này xuống và lưu giữ trên một ổ đĩa cứng hoặc môi trường lưu trữ bên ngoài được mã hóa."
},
"downloadStateLogs": {
"message": "Tải nhật ký trạng thái xuống"
},
"dropped": {
"message": "Đã ngừng"
},
"edit": {
"message": "Chỉnh sửa"
},
"editContact": {
"message": "Chỉnh sửa người liên hệ"
},
"editPermission": {
"message": "Chỉnh sửa quyền"
},
"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"
},
"encryptionPublicKeyRequest": {
"message": "Yêu cầu khóa mã hóa công khai"
},
"endOfFlowMessage1": {
"message": "Bạn đã vượt qua bài kiểm tra. Hãy lưu giữ cụm mật khẩu gốc của bạn an toàn, đó là trách nhiệm của bạn!"
},
"endOfFlowMessage10": {
"message": "Tất cả đã hoàn tất"
},
"endOfFlowMessage2": {
"message": "Mẹo lưu trữ an toàn"
},
"endOfFlowMessage3": {
"message": "Lưu bản sao lưu ở nhiều nơi."
},
"endOfFlowMessage4": {
"message": "Tuyệt đối không chia sẻ cụm mật khẩu với bất kỳ ai."
},
"endOfFlowMessage5": {
"message": "Hãy cẩn thận với hoạt động lừa đảo! MetaMask sẽ không bao giờ tự ý hỏi cụm mật khẩu gốc của bạn."
},
"endOfFlowMessage6": {
"message": "Nếu cần sao lưu lại cụm mật khẩu gốc của mình, bạn có thể tìm thấy cụm mật khẩu này trong phần Cài đặt -> Bảo mật."
},
"endOfFlowMessage8": {
"message": "MetaMask không thể khôi phục cụm mật khẩu gốc của bạn."
},
"endOfFlowMessage9": {
"message": "Tìm hiểu thêm."
},
"endpointReturnedDifferentChainId": {
"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"
},
"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."
},
"ensRegistrationError": {
"message": "Lỗi khi đăng ký tên ENS"
},
"enterAnAlias": {
"message": "Nhập một biệt danh"
},
"enterMaxSpendLimit": {
"message": "Nhập giới hạn chi tiêu tối đa"
},
"enterPassword": {
"message": "Nhập mật khẩu"
},
"enterPasswordContinue": {
"message": "Nhập mật khẩu để tiếp tục"
},
"errorCode": {
"message": "Mã: $1",
"description": "Displayed error code for debugging purposes. $1 is the error code"
},
"errorDetails": {
"message": "Chi tiết về lỗi",
"description": "Title for collapsible section that displays error details for debugging purposes"
},
"errorMessage": {
"message": "Thông báo: $1",
"description": "Displayed error message for debugging purposes. $1 is the error message"
},
"errorName": {
"message": "Mã: $1",
"description": "Displayed error name for debugging purposes. $1 is the error name"
},
"errorPageTitle": {
"message": "MetaMask đã gặp lỗi",
"description": "Title of generic error page"
},
"errorStack": {
"message": "Cụm:",
"description": "Title for error stack, which is displayed for debugging purposes"
},
"estimatedProcessingTimes": {
"message": "Thời gian xử lý ước tính"
},
"eth_accounts": {
"message": "Xem địa chỉ của các tài khoản được cho phép của bạn (bắt buộc)",
"description": "The description for the `eth_accounts` permission"
},
"ethereumPublicAddress": {
"message": "Địa chỉ công khai trên Ethereum"
},
"etherscan": {
"message": "Etherscan"
},
"etherscanView": {
"message": "Xem tài khoản trên Etherscan"
},
"expandView": {
"message": "Mở rộng cửa sổ xem"
},
"exportPrivateKey": {
"message": "Xuất khóa riêng tư"
},
"externalExtension": {
"message": "Tiện ích bên ngoài"
},
"extraApprovalGas": {
"message": "+$1 gas phê duyệt",
"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": "Không thành công"
},
"failedToFetchChainId": {
"message": "Không thể tìm nạp mã chuỗi. URL RPC của bạn có chính xác không?"
},
"failureMessage": {
"message": "Đã xảy ra sự cố và chúng tôi không thể hoàn tất hành động"
},
"fast": {
"message": "Nhanh"
},
"fastest": {
"message": "Nhanh nhất"
},
"feeAssociatedRequest": {
"message": "Yêu cầu này có kèm theo một khoản phí."
},
"fiat": {
"message": "Pháp định",
"description": "Exchange type"
},
"fileImportFail": {
"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"
},
"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"
},
"forgetDevice": {
"message": "Quên thiết bị này"
},
"from": {
"message": "Từ"
},
"fromAddress": {
"message": "Từ: $1",
"description": "$1 is the address to include in the From label. It is typically shortened first using shortenAddress"
},
"functionApprove": {
"message": "Chức năng: Phê duyệt"
},
"functionType": {
"message": "Loại chức năng"
},
"gasLimit": {
"message": "Giới hạn gas"
},
"gasLimitInfoTooltipContent": {
"message": "Giới hạn gas là số lượng đơn vị gas tối đa mà bạn sẵn sàng chi tiêu."
},
"gasLimitTooLow": {
"message": "Giới hạn gas ít nhất phải là 21000"
},
"gasLimitTooLowWithDynamicFee": {
"message": "Giới hạn gas ít nhất phải là $1",
"description": "$1 is the custom gas limit, in decimal."
},
"gasPrice": {
"message": "Giá gas (GWEI)"
},
"gasPriceExtremelyLow": {
"message": "Giá gas cực kỳ thấp"
},
"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."
},
"gasUsed": {
"message": "Đã dùng gas"
},
"gdprMessage": {
"message": "Đây là dữ liệu tổng hợp, do đó ở trạng thái ẩn danh để phục vụ cho mục đích của Quy định chung về bảo vệ dữ liệu (Liên minh Châu Âu) 2016/679. Để biết thêm thông tin liên quan đến các phương thức bảo vệ quyền riêng tư của chúng tôi, vui lòng xem $1 của chúng tôi.",
"description": "$1 refers to the gdprMessagePrivacyPolicy message, the translation of which is meant to be used exclusively in the context of gdprMessage"
},
"gdprMessagePrivacyPolicy": {
"message": "Chính sách quyền riêng tư tại đây",
"description": "this translation is intended to be exclusively used as the replacement for the $1 in the gdprMessage translation"
},
"general": {
"message": "Chung"
},
"generalSettingsDescription": {
"message": "Quy đổi tiền, đơn vị tiền chính, ngôn ngữ, biểu tượng nhận dạng kiểu blockies"
},
"getEther": {
"message": "Nhận Ether"
},
"getEtherFromFaucet": {
"message": "Nhận Ether từ một vòi dành cho $1",
"description": "Displays network name for Ether faucet"
},
"getStarted": {
"message": "Bắt đầu"
},
"goerli": {
"message": "Mạng thử nghiệm Goerli"
},
"happyToSeeYou": {
"message": "Chúng tôi rất vui khi được gặp bạn."
},
"hardware": {
"message": "Phần cứng"
},
"hardwareWalletConnected": {
"message": "Đã kết nối với ví cứng"
},
"hardwareWallets": {
"message": "Kết nối với một ví cứng"
},
"hardwareWalletsMsg": {
"message": "Chọn một ví cứng mà bạn muốn sử dụng với MetaMask"
},
"here": {
"message": "tại đây",
"description": "as in -click here- for more information (goes with troubleTokenBalances)"
},
"hexData": {
"message": "Dữ liệu thập lục phân"
},
"hide": {
"message": "Ẩn"
},
"hideTokenPrompt": {
"message": "Ẩn token?"
},
"hideTokenSymbol": {
"message": "Ẩn $1",
"description": "$1 is the symbol for a token (e.g. 'DAI')"
},
"history": {
"message": "Lịch sử"
},
"import": {
"message": "Nhập",
"description": "Button to import an account from a selected file"
},
"importAccount": {
"message": "Nhập tài khoản"
},
"importAccountMsg": {
"message": " Tài khoản đã nhập sẽ không được liên kết với cụm mật khẩu gốc cho tài khoản MetaMask đã tạo ban đầu của bạn. Tìm hiểu thêm về các tài khoản đã nhập "
},
"importAccountSeedPhrase": {
"message": "Nhập một tài khoản bằng cụm mật khẩu gốc"
},
"importWallet": {
"message": "Nhập ví"
},
"imported": {
"message": "Đã nhập",
"description": "status showing that an account has been fully loaded into the keyring"
},
"initialTransactionConfirmed": {
"message": "Mạng đã xác nhận giao dịch ban đầu của bạn. Nhấp vào OK để quay lại."
},
"insufficientBalance": {
"message": "Không đủ số dư."
},
"insufficientFunds": {
"message": "Không đủ tiền."
},
"insufficientTokens": {
"message": "Không đủ token."
},
"invalidAddress": {
"message": "Địa chỉ không hợp lệ"
},
"invalidAddressRecipient": {
"message": "Địa chỉ người nhận không hợp lệ"
},
"invalidAddressRecipientNotEthNetwork": {
"message": "Không phải mạng ETH, hãy đặt ở chữ viết thường"
},
"invalidBlockExplorerURL": {
"message": "URL trình khám phá khối không hợp lệ"
},
"invalidCustomNetworkAlertContent1": {
"message": "Phải nhập lại mã chuỗi cho mạng tùy chỉnh “$1”.",
"description": "$1 is the name/identifier of the network."
},
"invalidCustomNetworkAlertContent2": {
"message": "Để bảo vệ bạn khỏi các nhà cung cấp mạng độc hại hoặc bị lỗi, mã chuỗi giờ đây là yêu cầu bắt buộc đối với tất cả các mạng tùy chỉnh."
},
"invalidCustomNetworkAlertContent3": {
"message": "Chuyển đến phần Cài đặt > Mạng, rồi nhập mã chuỗi. Bạn có thể tìm được mã chuỗi của hầu hết các mạng phổ biến trên $1.",
"description": "$1 is a link to https://chainid.network"
},
"invalidCustomNetworkAlertTitle": {
"message": "Mạng tùy chỉnh không hợp lệ"
},
"invalidHexNumber": {
"message": "Số thập lục phân không hợp lệ."
},
"invalidHexNumberLeadingZeros": {
"message": "Số thập lục phân không hợp lệ. Xóa mọi chữ số 0 ở đầu."
},
"invalidIpfsGateway": {
"message": "Cổng kết nối IPFS không hợp lệ. Giá trị phải là URL hợp lệ"
},
"invalidNumber": {
"message": "Số không hợp lệ. Hãy nhập một số thập phân hoặc số thập lục phân bắt đầu bằng “0x”."
},
"invalidNumberLeadingZeros": {
"message": "Số không hợp lệ. Xóa mọi chữ số 0 ở đầu."
},
"invalidRPC": {
"message": "URL RPC không hợp lệ"
},
"invalidSeedPhrase": {
"message": "Cụm mật khẩu gốc không hợp lệ"
},
"ipfsGateway": {
"message": "Cổng kết nối IPFS"
},
"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."
},
"jsonFile": {
"message": "Tệp JSON",
"description": "format for importing an account"
},
"knownAddressRecipient": {
"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."
},
"kovan": {
"message": "Mạng thử nghiệm Kovan"
},
"lastConnected": {
"message": "Đã kết nối lần gần đây nhất"
},
"learnMore": {
"message": "Tìm hiểu thêm"
},
"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."
},
"letsGoSetUp": {
"message": "Có, hãy thiết lập!"
},
"likeToAddTokens": {
"message": "Bạn có muốn thêm những token này không?"
},
"links": {
"message": "Đường liên kết"
},
"loadMore": {
"message": "Nạp thêm"
},
"loading": {
"message": "Đang tải..."
},
"loadingTokens": {
"message": "Đang nạp token..."
},
"localhost": {
"message": "Máy chủ cục bộ 8545"
},
"lock": {
"message": "Khóa"
},
"lockTimeTooGreat": {
"message": "Thời gian khóa quá lớn"
},
"mainnet": {
"message": "Mạng chính thức của Ethereum"
},
"max": {
"message": "Tối đa"
},
"memo": {
"message": "memo"
},
"memorizePhrase": {
"message": "Lưu cụm mật khẩu này."
},
"message": {
"message": "Thông báo"
},
"metaMaskConnectStatusParagraphOne": {
"message": "Giờ đây bạn có thể kiểm soát chi tiết hơn đối với các mối liên kết với tài khoản của mình trong MetaMask."
},
"metaMaskConnectStatusParagraphThree": {
"message": "Nhấp vào đó để quản lý các tài khoản bạn đã kết nối."
},
"metaMaskConnectStatusParagraphTwo": {
"message": "Nút trạng thái kết nối sẽ hiển thị nếu trang web mà bạn đang truy cập được kết nối với tài khoản bạn đang chọn."
},
"metamaskDescription": {
"message": "Kết nối bạn với Ethereum và Web phi tập trung."
},
"metamaskSwapsOfflineDescription": {
"message": "Tính năng Hoán đổi trên MetaMask đang được bảo trì. Vui lòng kiểm tra lại sau."
},
"metamaskVersion": {
"message": "Phiên bản MetaMask"
},
"metametricsCommitmentsAllowOptOut": {
"message": "Luôn cho phép bạn chọn không tham gia thông qua 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"
},
"metametricsCommitmentsIntro": {
"message": "MetaMask sẽ.."
},
"metametricsCommitmentsNeverCollectIP": {
"message": "$1 thu thập địa chỉ IP đầy đủ của bạn",
"description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'"
},
"metametricsCommitmentsNeverCollectKeysEtc": {
"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'"
},
"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'"
},
"metametricsCommitmentsSendAnonymizedEvents": {
"message": "Gửi các lượt nhấp và xem trang đã được ẩn danh"
},
"metametricsHelpImproveMetaMask": {
"message": "Giúp chúng tôi cải thiện MetaMask"
},
"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."
},
"mobileSyncText": {
"message": "Vui lòng nhập mật khẩu để xác nhận đây là bạn!"
},
"mustSelectOne": {
"message": "Phải chọn ít nhất 1 token."
},
"myAccounts": {
"message": "Tài khoản của tôi"
},
"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."
},
"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"
},
"negativeETH": {
"message": "Không thể gửi khoản ETH âm."
},
"networkName": {
"message": "Tên mạng"
},
"networkSettingsChainIdDescription": {
"message": "Mã chuỗi được dùng để ký các giao dịch. Giá trị này phải khớp với mã chuỗi do mạng trả về. Bạn có thể nhập một số thập phân hoặc số thập lục phân bắt đầu bằng “0x” nhưng chúng tôi sẽ hiển thị số ở dạng thập phân."
},
"networkSettingsDescription": {
"message": "Thêm và chỉnh sửa mạng RPC tùy chỉnh"
},
"networks": {
"message": "Mạng"
},
"nevermind": {
"message": "Bỏ qua"
},
"newAccount": {
"message": "Tài khoản mới"
},
"newAccountDetectedDialogMessage": {
"message": "Đã tìm thấy địa chỉ mới! Nhấp vào đây để thêm địa chỉ này vào sổ địa chỉ của bạn."
},
"newAccountNumberName": {
"message": "Tài khoản $1",
"description": "Default name of next account to be created on create account screen"
},
"newContact": {
"message": "Người liên hệ mới"
},
"newContract": {
"message": "Hợp đồng mới"
},
"newNetwork": {
"message": "Mạng mới"
},
"newPassword": {
"message": "Mật khẩu mới (tối thiểu 8 ký tự)"
},
"newToMetaMask": {
"message": "Bạn mới sử dụng MetaMask?"
},
"newTotal": {
"message": "Tổng mới"
},
"newTransactionFee": {
"message": "Phí giao dịch mới"
},
"next": {
"message": "Tiếp theo"
},
"nextNonceWarning": {
"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"
},
"noAccountsFound": {
"message": "Không tìm thấy tài khoản nào cho cụm từ tìm kiếm đã đưa ra"
},
"noAddressForName": {
"message": "Chưa có địa chỉ nào được đặt cho tên này."
},
"noAlreadyHaveSeed": {
"message": "Không, tôi đã có cụm mật khẩu gốc"
},
"noConversionRateAvailable": {
"message": "Không có sẵn tỷ lệ quy đổi nào"
},
"noThanks": {
"message": "Không, cảm ơn"
},
"noTransactions": {
"message": "Bạn không có giao dịch nào"
},
"noWebcamFound": {
"message": "Không tìm thấy webcam trên máy tính của bạn. Vui lòng thử lại."
},
"noWebcamFoundTitle": {
"message": "Không tìm thấy webcam"
},
"nonceField": {
"message": "Tùy chỉnh số chỉ dùng một lần của giao dịch"
},
"nonceFieldDescription": {
"message": "Bật tùy chọn này để thay đổi số dùng một lần (số giao dịch) trên màn hình xác nhận. Đây là tính năng nâng cao, hãy dùng một cách thận trọng."
},
"nonceFieldHeading": {
"message": "Số dùng một lần tùy chỉnh"
},
"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"
},
"notEnoughGas": {
"message": "Không đủ gas"
},
"ofTextNofM": {
"message": "trên"
},
"off": {
"message": "Tắt"
},
"offlineForMaintenance": {
"message": "Ngoại tuyến để bảo trì"
},
"ok": {
"message": "Ok"
},
"on": {
"message": "Bật"
},
"onboardingReturnNotice": {
"message": "\"$1\" sẽ đóng tab này và chuyển về $2",
"description": "Return the user to the site that initiated onboarding"
},
"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."
},
"onlyAvailableOnMainnet": {
"message": "Chỉ có trên mạng chính thức"
},
"onlyConnectTrust": {
"message": "Chỉ kết nối với các trang web mà bạn tin tưởng."
},
"optionalBlockExplorerUrl": {
"message": "URL trình khám phá khối (không bắt buộc)"
},
"optionalCurrencySymbol": {
"message": "Ký hiệu tiền tệ (không bắt buộc)"
},
"origin": {
"message": "Nguồn gốc"
},
"parameters": {
"message": "Tham số"
},
"participateInMetaMetrics": {
"message": "Tham gia MetaMetrics"
},
"participateInMetaMetricsDescription": {
"message": "Tham gia MetaMetrics để giúp chúng tôi cải thiện MetaMask"
},
"password": {
"message": "Mật khẩu"
},
"passwordNotLongEnough": {
"message": "Mật khẩu không đủ dài"
},
"passwordsDontMatch": {
"message": "Mật khẩu không khớp"
},
"pastePrivateKey": {
"message": "Dán chuỗi khóa riêng tư của bạn vào đây:",
"description": "For importing an account from a private key"
},
"pending": {
"message": "Đang chờ xử lý"
},
"permissionCheckedIconDescription": {
"message": "Bạn đã phê duyệt quyền này"
},
"permissionUncheckedIconDescription": {
"message": "Bạn chưa phê duyệt quyền này"
},
"permissions": {
"message": "Quyền"
},
"personalAddressDetected": {
"message": "Đã tìm thấy địa chỉ cá nhân. Nhập địa chỉ hợp đồng token."
},
"plusXMore": {
"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"
},
"prev": {
"message": "Trước"
},
"primaryCurrencySetting": {
"message": "Đơn vị tiền chính"
},
"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."
},
"privacyMsg": {
"message": "Chính sách quyền riêng tư"
},
"privateKey": {
"message": "Khóa riêng tư",
"description": "select this type of file to use to import an account"
},
"privateKeyWarning": {
"message": "Cảnh báo: Tuyệt đối không để lộ mã khóa này. Bất kỳ ai có mã khóa riêng tư của bạn cũng có thể đánh cắp tài sản được giữ trong tài khoản của bạn."
},
"privateNetwork": {
"message": "Mạng riêng"
},
"proposedApprovalLimit": {
"message": "Giới hạn phê duyệt đề xuất"
},
"provide": {
"message": "Cung cấp"
},
"queue": {
"message": "Hàng đợi"
},
"queued": {
"message": "Đã đưa vào hàng đợi"
},
"readdToken": {
"message": "Bạn có thể thêm lại token này trong tương lai bằng cách chuyển đến mục “Thêm token” trong trình đơn tùy chọn tài khoản."
},
"receive": {
"message": "Nhận"
},
"recents": {
"message": "Gần đây"
},
"recipientAddress": {
"message": "Địa chỉ người nhận"
},
"recipientAddressPlaceholder": {
"message": "Tìm kiếm, địa chỉ công khai (0x) hoặc ENS"
},
"reject": {
"message": "Từ chối"
},
"rejectAll": {
"message": "Từ chối tất cả"
},
"rejectTxsDescription": {
"message": "Bạn chuẩn bị từ chối hàng loạt $1 giao dịch."
},
"rejectTxsN": {
"message": "Từ chối $1 giao dịch"
},
"rejected": {
"message": "Đã từ chối"
},
"remindMeLater": {
"message": "Nhắc tôi sau"
},
"remove": {
"message": "Xóa"
},
"removeAccount": {
"message": "Xóa tài khoản"
},
"removeAccountDescription": {
"message": "Tài khoản này sẽ được xóa khỏi ví của bạn. Xin đảm bảo rằng bạn có cụm mật khẩu gốc 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. "
},
"requestsAwaitingAcknowledgement": {
"message": "yêu cầu đang chờ xác nhận"
},
"required": {
"message": "Bắt buộc"
},
"reset": {
"message": "Đặt lại"
},
"resetAccount": {
"message": "Đặt lại tài khoản"
},
"resetAccountDescription": {
"message": "Nếu đặt lại tài khoản của bạn, toàn bộ lịch sử giao dịch sẽ bị xóa. Việc này sẽ không làm thay đổi số dư trong tài khoản của bạn hoặc yêu cầu bạn phải nhập lại cụm mật khẩu gốc."
},
"restore": {
"message": "Khôi phục"
},
"restoreAccountWithSeed": {
"message": "Khôi phục tài khoản của bạn bằng cụm mật khẩu gốc"
},
"restoreWalletPreferences": {
"message": "Đã tìm thấy bản sao lưu dữ liệu của bạn từ $1. Bạn có muốn khôi phục các tùy chọn ưu tiên trong ví của mình không?",
"description": "$1 is the date at which the data was backed up"
},
"retryTransaction": {
"message": "Thử lại giao dịch"
},
"reusedTokenNameWarning": {
"message": "Một token trong đây sử dụng lại ký hiệu của một token khác mà bạn thấy, điều này có thể gây nhầm lẫn hoặc mang tính lừa dối."
},
"revealSeedWords": {
"message": "Hiện cụm mật khẩu gốc"
},
"revealSeedWordsDescription": {
"message": "Nếu thay đổi trình duyệt hoặc chuyển máy tính, bạn sẽ cần cụm mật khẩu gốc này để truy cập tài khoản của mình. Hãy lưu cụm mật khẩu gốc này ở nơi an toàn và bí mật."
},
"revealSeedWordsTitle": {
"message": "Cụm mật khẩu gốc"
},
"revealSeedWordsWarning": {
"message": "Kẻ xấu có thể dùng các từ này để đánh cắp tất cả các tài khoản của bạn."
},
"revealSeedWordsWarningTitle": {
"message": "KHÔNG chia sẻ cụm mật khẩu này với bất kỳ ai!"
},
"rinkeby": {
"message": "Mạng thử nghiệm Rinkeby"
},
"ropsten": {
"message": "Mạng thử nghiệm Ropsten"
},
"rpcUrl": {
"message": "URL RPC mới"
},
"save": {
"message": "Lưu"
},
"saveAsCsvFile": {
"message": "Lưu dưới dạng tệp CSV"
},
"scanInstructions": {
"message": "Đặt mã QR vào trước máy ảnh"
},
"scanQrCode": {
"message": "Quét mã QR"
},
"scrollDown": {
"message": "Cuộn xuống"
},
"search": {
"message": "Tìm kiếm"
},
"searchAccounts": {
"message": "Tìm kiếm tài khoản"
},
"searchResults": {
"message": "Kết quả tìm kiếm"
},
"searchTokens": {
"message": "Tìm kiếm token"
},
"secretBackupPhrase": {
"message": "Cụm mật khẩu sao lưu bí mật"
},
"secretBackupPhraseDescription": {
"message": "Cụm mật khẩu sao lưu bí mật giúp việc sao lưu và khôi phục tài khoản trở nên dễ dàng."
},
"secretBackupPhraseWarning": {
"message": "CẢNH BÁO: Tuyệt đối không để lộ cụm mật khẩu sao lưu của bạn. Bất kỳ ai có cụm mật khẩu này cũng có thể lấy Ether của bạn vĩnh viễn."
},
"securityAndPrivacy": {
"message": "Bảo mật và quyền riêng tư"
},
"securitySettingsDescription": {
"message": "Cụm mật khẩu gốc của ví và các tùy chọn cài đặt quyền riêng tư"
},
"seedPhrasePlaceholder": {
"message": "Phân tách mỗi từ bằng một dấu cách"
},
"seedPhrasePlaceholderPaste": {
"message": "Dán cụm mật khẩu gốc từ khay nhớ tạm"
},
"seedPhraseReq": {
"message": "Cụm mật khẩu gốc gồm 12, 15, 18, 21 hoặc 24 từ"
},
"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.*"
},
"selectAccounts": {
"message": "Chọn (các) tài khoản"
},
"selectAll": {
"message": "Chọn tất cả"
},
"selectAnAccount": {
"message": "Chọn một tài khoản"
},
"selectAnAccountHelp": {
"message": "Chọn tài khoản để xem trong MetaMask"
},
"selectEachPhrase": {
"message": "Vui lòng chọn từng cụm mật khẩu theo thứ tự để đảm bảo sự chính xác."
},
"selectHdPath": {
"message": "Chọn đường dẫn phân cấp xác định"
},
"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)\""
},
"selectType": {
"message": "Chọn loại"
},
"selectingAllWillAllow": {
"message": "Việc chọn tất cả sẽ cho phép trang này xem tất cả các tài khoản hiện tại của bạn. Đảm bảo rằng bạn tin tưởng trang web này."
},
"send": {
"message": "Gửi"
},
"sendAmount": {
"message": "Gửi khoản tiền"
},
"sendSpecifiedTokens": {
"message": "Gửi $1",
"description": "Symbol of the specified token"
},
"sendTokens": {
"message": "Gửi token"
},
"sentEther": {
"message": "đã gửi ether"
},
"separateEachWord": {
"message": "Phân tách mỗi từ bằng một dấu cách"
},
"settings": {
"message": "Cài đặt"
},
"showAdvancedGasInline": {
"message": "Quyền kiểm soát gas nâng cao"
},
"showAdvancedGasInlineDescription": {
"message": "Chọn tùy chọn này để hiển thị các quyền kiểm soát giá và giới hạn ngay trên màn hình gửi và xác nhận."
},
"showFiatConversionInTestnets": {
"message": "Hiển thị tỷ lệ quy đổi trên các mạng thử nghiệm"
},
"showFiatConversionInTestnetsDescription": {
"message": "Chọn tùy chọn này để hiển thị tỷ lệ quy đổi pháp định trên Mạng thử nghiệm"
},
"showHexData": {
"message": "Hiển thị dữ liệu thập lục phân"
},
"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"
},
"showIncomingTransactions": {
"message": "Hiển thị các giao dịch đến"
},
"showIncomingTransactionsDescription": {
"message": "Chọn tùy chọn này nếu bạn muốn dùng Etherscan để hiển thị các giao dịch đến trong danh sách giao dịch"
},
"showPermissions": {
"message": "Hiển thị quyền"
},
"showPrivateKeys": {
"message": "Hiện khóa riêng tư"
},
"showSeedPhrase": {
"message": "Hiển thị cụm mật khẩu gốc"
},
"sigRequest": {
"message": "Yêu cầu chữ ký"
},
"sign": {
"message": "Ký"
},
"signNotice": {
"message": "Việc ký thông báo này có thể gây ra \nảnh hưởng nguy hiểm ngoài ý muốn. Chỉ ký những thông báo từ \ncác trang web mà bạn hoàn toàn tin tưởng bằng toàn bộ tài khoản của mình.\n Chúng tôi sẽ loại bỏ phương thức nguy hiểm này trong phiên bản sau này. "
},
"signatureRequest": {
"message": "Yêu cầu chữ ký"
},
"signatureRequest1": {
"message": "Thông báo"
},
"signed": {
"message": "Đã ký"
},
"slow": {
"message": "Chậm"
},
"somethingWentWrong": {
"message": "Rất tiếc! Đã xảy ra sự cố."
},
"speedUp": {
"message": "Tăng tốc"
},
"speedUpCancellation": {
"message": "Tăng tốc lệnh hủy này"
},
"speedUpTransaction": {
"message": "Tăng tốc giao dịch này"
},
"spendLimitAmount": {
"message": "Khoản tiền giới hạn chi tiêu"
},
"spendLimitInsufficient": {
"message": "Giới hạn chi tiêu không đủ"
},
"spendLimitInvalid": {
"message": "Giới hạn chi tiêu không hợp lệ; giá trị này phải là số dương."
},
"spendLimitPermission": {
"message": "Quyền đối với giới hạn chi tiêu"
},
"spendLimitRequestedBy": {
"message": "Bên yêu cầu giới hạn chi tiêu: $1",
"description": "Origin of the site requesting the spend limit"
},
"spendLimitTooLarge": {
"message": "Giới hạn chi tiêu quá lớn"
},
"stateLogError": {
"message": "Lỗi khi truy xuất nhật ký trạng thái."
},
"stateLogFileName": {
"message": "Nhật ký trạng thái của MetaMask"
},
"stateLogs": {
"message": "Nhật ký trạng thái"
},
"stateLogsDescription": {
"message": "Nhật ký trạng thái có chứa các địa chỉ tài khoản công khai của bạn và các giao dịch đã gửi."
},
"statusConnected": {
"message": "Đã kết nối"
},
"statusNotConnected": {
"message": "Chưa kết nối"
},
"storePhrase": {
"message": "Lưu cụm mật khẩu này trong trình quản lý mật khẩu chẳng hạn như 1Password."
},
"submit": {
"message": "Gửi"
},
"submitted": {
"message": "Đã gửi"
},
"supportCenter": {
"message": "Truy cập Trung tâm hỗ trợ của chúng tôi"
},
"swap": {
"message": "Hoán đổi"
},
"swapAdvancedSlippageInfo": {
"message": "Giá thay đổi giữa thời điểm đặt và xác nhận lệnh, việc này được gọi là “trượt giá”. Giao dịch hoán đổi của bạn sẽ tự động hủy nếu mức trượt giá vượt quá “mức trượt giá tối đa” đã cài đặt."
},
"swapAggregator": {
"message": "Trình tổng hợp"
},
"swapAmountReceived": {
"message": "Số tiền được đảm bảo"
},
"swapAmountReceivedInfo": {
"message": "Đây là số tiền tối thiểu mà bạn sẽ nhận được. Bạn sẽ nhận được nhiều hơn tùy thuộc vào mức trượt giá."
},
"swapApproval": {
"message": "Phê duyệt $1 cho các giao dịch hoán đổi",
"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": "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."
},
"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"
},
"swapCheckingQuote": {
"message": "Đang kiểm tra $1",
"description": "Shown to the user during quote loading. $1 is the name of an aggregator. The message indicates that metamask is currently checking if that aggregator has a trade/quote for their requested swap."
},
"swapCustom": {
"message": "tùy chỉnh"
},
"swapDecentralizedExchange": {
"message": "Sàn giao dịch phi tập trung"
},
"swapEditLimit": {
"message": "Chỉnh sửa giới hạn"
},
"swapEnableDescription": {
"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."
},
"swapEstimatedNetworkFee": {
"message": "Phí mạng ước tính"
},
"swapEstimatedNetworkFeeSummary": {
"message": "“$1” là giá trị mà chúng tôi dự kiến sẽ là khoản phí thực sự. Số tiền chính xác phụ thuộc vào tình trạng mạng.",
"description": "$1 will be the translation of swapEstimatedNetworkFee, with the font bolded"
},
"swapEstimatedNetworkFees": {
"message": "Phí mạng ước tính"
},
"swapEstimatedNetworkFeesInfo": {
"message": "Đây là giá trị ước tính của phí mạng sẽ dùng để hoàn thành giao dịch hoán đổi của bạn. Số tiền thực tế có thể thay đổi tùy theo tình trạng mạng."
},
"swapFailedErrorTitle": {
"message": "Hoán đổi không thành công"
},
"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."
},
"swapFetchingQuotesErrorTitle": {
"message": "Lỗi tìm nạp báo giá"
},
"swapFetchingTokens": {
"message": "Đang tìm nạp token..."
},
"swapFinalizing": {
"message": "Đang hoàn tất..."
},
"swapHighSlippageWarning": {
"message": "Số tiền trượt giá rất cao. Hãy chắc chắn rằng bạn hiểu những gì mình đang làm!"
},
"swapLowSlippageError": {
"message": "Giao dịch có thể không thành công, mức trượt giá tối đa quá thấp."
},
"swapMaxNetworkFeeInfo": {
"message": "“$1” là mức chi tiêu cao nhất của bạn. Khi mạng không ổn định, đây có thể là số tiền lớn.",
"description": "$1 will be the translation of swapMaxNetworkFees, with the font bolded"
},
"swapMaxNetworkFees": {
"message": "Phí mạng tối đa"
},
"swapMaxSlippage": {
"message": "Mức trượt giá tối đa"
},
"swapMetaMaskFee": {
"message": "Phí của MetaMask"
},
"swapMetaMaskFeeDescription": {
"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. Khoản phí $1% tự động được tính vào mỗi báo giá để hỗ trợ sự phát triển liên tục và giúp MetaMask hoàn thiện hơn nữa.",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapNetworkFeeSummary": {
Version v9.5.0 RC (#10944) * add trezor HD path for ledger wallets (#10616) Co-authored-by: Barry Gitarts <bgitarts@gmail.com> * Replace logic for eth swap token in fetchQuotesAndSetQuoteState with getSwapsEthToken call (#10624) * Ensure permission log will only store JSON-able data (#10524) * remove transactionCategory in favor of more types (#10615) * remove transactionCategory in favor of more types * remove reference to STANDARD in stubs * Removing double click bug from delete custom network modal (#10628) Fixes MetaMask/metamask-extension#10626 * Hide zero balance tokens at useTokenTracker layer (#10630) * Setting balance to 0x0 when the original value is undefined (#10634) * fix: speedup cancellation (#10579) fixes #7305 * no more node:console (#10640) * prefer chainId over networkId in most cases (#10594) * Move swaps constants to the shared constants directory (#10614) * Position the 3dot menu in the same spot on asset screen and home screen (#10642) * Ensure swaps detail height doesn't create jump in vertical height (#10644) * Fix: ETH 'token' now only appears once in the swaps to and from dropdowns. (#10650) * Prevent network menu highlighting (#10643) * Allow TextField to receive min and max attributes (#10656) * colocate tests in flat structure (#10655) * Fixing migration script generation paths (#10664) * Improve specificity of `test:unit:lax` npm script (#10661) The unit test npm script `test:unit:lax` is now more specific about which tests files to exclude. An `--ignore` CLI option is used to specify the files to ignore, rather than using the braces glob syntax to ignore them from the target glob itself. This makes the option easier to update going forward as we move more tests into the "strict" group, because the options are exactly the same between the two scripts. It also ensures we don't accidentally exclude other subdirectories that happen to also be named `permissions`. In trying to implement this, I stumbled at first because mocha expects the ignore pattern to be a relative path if the target is a relative path (i.e. they need to both start with `./` or neither). The script `test:unit:strict` has been updated to use a relative target pattern for consistency. * Swaps support for local testnet (#10658) * Swaps support for local testnet * Create util method for comparison of token addresses/symbols to default swaps token * Get chainId from txMeta in _trackSwapsMetrics of transaction controller * Add comment to document purpose of getTransactionGroupRecipientAddressFilter * Use isSwapsDefaultTokenSymbol in place of repeated defaultTokenSymbol comparisons in build-quote.js * fix: replace dnode background with JSON-RPC (#10627) fixes #10090 * Don't render faucet row in deposit modal for custom chains (#10674) Fixes MetaMask/metamask-extension#10038 * Change 'Send ETH' title to 'Send' (#10651) * Fixing incorrectly typed token decimal attribute (#10666) * refactor incoming tx controller (#10639) * make migration more safe (#10689) * Adding default properties to NetworkForm (#10682) Fixes MetaMask/metamask-extension#10681 * deps - remove "remotedev-server" (#10687) * deps - remove remotedev-server * Remove stale references from allow-scripts config Any packages that are no longer in the dependency tree have been removed from the `allow-scripts` config. Co-authored-by: Mark Stacey <markjstacey@gmail.com> * Excluding sourcemaps comment in production builds (#10695) * Excluding sourcemaps comment in production builds Fixes MetaMask/metamask-extension#7077 * Fix source map explorer script The source map explorer script now re-adds the source map comment to each file to ensure the source map visualization still works. Each module with a sourcemap is copied to a temporary directory along with the module it corresponds to, and from there it's passed into `source-map-explorer`. This should ensure the resulting visualization matches what it was before. Everything has been moved inside of functions to generally improve readability, and to allow the use of local variables. Co-authored-by: Mark Stacey <markjstacey@gmail.com> * Delete setupFetchDebugging.js (#10636) * Delete setupFetchDebugging.js * remove fetch-debugging (now handled corrently by sentry) * resolve issue with missing template error (#10692) * resolve issue with missing template error * also apply filtering to confirmation page * rename variable * Add MetaMask to list of BIP44 HD path examples (#10703) The "BIP44 Standard" HD path option in the Ledger connect flow listed only Trezor as an example. It seemed appropriate to include MetaMask as well, since we use the same path. This helps users who have imported their MetaMask seed phrase onto a Ledger device to discover this option. * Removing hard references to 12 word seed phrases in copy (#10704) Adding translation entry for "Wallet Seed" Fixed label padding issue by adding missing CSS rule * rule out empty string for symbol (#10712) * fix: remove unused `metamask.rpcUrl` from redux state + fix tests to reflect that (#10714) * Fix 10706 - Prevent autocomplete from add token input (#10700) * Fix mismatchedChain typo in custom network approval screen (#10723) * Fix 10562 - Hide the suggested token pane when not on Mainnet or test network (#10702) * Update @metamask/controllers to v6.2.1 (#10701) * Additional swaps network support (#10721) * Add swaps support for bnc chain * Use single default token address in shared/constants/swaps * ci - cache deps before patch-package (#10735) * ci - cache deps before patch-package * ci - bump dep cache number (cache break) * build - refactor build system for easier configuration (#10718) * build - refactor build system for easier configuration of before and after bundle * build - fix dependenciesToBundle option * build - fix bify external options and other config * build - refactor for cleanliness * build - fix minify argument * build - fix sourcemaps setup * scripts - refactor setupBundlerDefaults in anticipation of factor bundles * build - scripts - remove unused pipeline label * build - scripts - make filepath entry optional * build - scripts - rename filepath and filename options to entryFilepath and destFilepath * Update development/build/scripts.js Co-authored-by: Mark Stacey <markjstacey@gmail.com> Co-authored-by: Mark Stacey <markjstacey@gmail.com> * security - update SES lockdown (#10663) * update ses * build - reference ses directly * deps - unify regenerator-runtime versions on 0.13.7 * patches - apply regenerator-runtime ses compat patch\nhttps://github.com/facebook/regenerator/pull/411 * patches - patch regenerator-runtime for latest ses fix * reduc patch, new lockdown severe override taming * updated redux patch * update redux patch for production * ignore lockdown in lint * deps - bump patch-package just in case * trailing comma * remove ses as dep * fix path for frozen promise * remove js extension in lockdown require * Revert "ignore lockdown in lint" This reverts commit 8cefdc94dd25d7781bb09eed8af36441397676da. * Revert "build - reference ses directly" This reverts commit 30371a377dcdd781c1bf9abe55e9c8ae34da26b5. * deps - update ses * Revert "fix path for frozen promise" This reverts commit 966e4c60921a25befe8ca8dea58313cc25852f72. Co-authored-by: kumavis <aaron@kumavis.me> * Allow 11 characters in symbol for RPC (#10670) * Add error in RPC for zero length symbols * Increase RPC symbol length allowed to 11 * Add RPC tests for new symbol length checks * eth-block-tracker@5.0.1 (#10737) * Ensure swaps gas prices are fetched from the correct chain specific endpoint (#10744) * Ensure swaps gas prices are fetched from the correct chain specific endpoint * Just rely on fetchWithCache to cache swaps gas prices, instead of directly using storage in getSwapsPriceEstimatesLastRetrieved * Empty commit * update @metamask/etherscan-link to v2.0.0 (#10747) * Use correct block explorer name and link in swaps when on custom network (#10743) * Use correct block explorer name and link in swaps when on custom network. * Fix up custom etherscan link code in build-quote.js * Use blockExplorerUrl hostname instead of 'blockExplorerBaseUrl' * Use correct etherscan-link method for token links in build-quote * Create correct token link in build-quote for mainnet AND custom networks * Block explorer url improvements in awaiting-swap.js and build-quote.js * Use swapVerifyTokenExplanation message with substitutable block explorer for all applicable locales * Ensure that block explorer links are not shown in awaiting-swap if no url is available * Add New Zealand Dollar to currency options (#10746) * Ensure that the correct default currency symbols are used for fees on the view quote screen (#10753) * Fix 10517 - Prevent tokens without addresses from being added to token list (#10593) * Updating y18n and netmask to resolve dependency issues (#10765) netmask@1.0.6 -> 2.0.1, y18n@3.2.1 -> 3.2.2, y18n@4.0.0 -> 4.0.1 * Refactor Tx State Manager (#10672) Co-authored-by: Mark Stacey <markjstacey@gmail.com> * Ensure that the approval fee in the swaps custom gas modal is in network specific currency (#10763) * Ensure that priceSlippage fiat amounts are always shown in view-quote.js (#10762) * Use network specific swaps contract address when checking swap contract token approval (#10774) * Build - refactor background process to use html (#10769) * build - declare background as html * build - fill in empty file when a missing file is expected * lint - fix * Update development/build/manifest.js Co-authored-by: Mark Stacey <markjstacey@gmail.com> * Update development/build/manifest.js Co-authored-by: Mark Stacey <markjstacey@gmail.com> Co-authored-by: Mark Stacey <markjstacey@gmail.com> * build - fix use of empty file to replace unused js files (#10780) * cache lint results for faster repeat execution (#10773) * eslint perf improvement (#10775) * Improve detection of task process exit (#10776) Our build script waits for the `close` event to determine whether the task has exited. The `exit` event is a better representation of this, because if a stream is shared between multiple processes, the process may exit without the `close` event being emitted. We aren't sharing streams between processes, so this edge case doesn't apply to us. This just seemed like a more suitable event to listen to, since we care about the process exiting not the stream ending. See this description of the `close` event from the Node.js documentation [1]: >The `'close'` event is emitted when the stdio streams of a child >process have been closed. This is distinct from the `'exit'` event, >since multiple processes might share the same stdio streams. And see this description of the `exit` event: >The `'exit'` event is emitted after the child process ends. [1]: https://nodejs.org/docs/latest-v14.x/api/child_process.html#child_process_event_exit * Rewrite changelog script from Bash to JavaScript (#10782) The `auto-changelog` script has been rewritten from Bash to JavaScript. Functionally it should behave identically. * Refactoring ethereum-on.spec.js to use fixtures (#10778) * Remove useless negation (#10787) !contentComponent always evaluates to true * Remove date from changelog release header (#10790) New changelog release headers now omit the date. These headers are added automatically when a new release branch is created, and that rarely ends up being the actual date of the release, so these dates have all been inaccurate anyway. The date will be re-added to the changelog later as part of a new script, after a release has been published. * Remove script for creating master sync PR (#10791) The script responsible for creating the "Sync `master` with `develop`" PR has been removed. We will soon be eliminating the need for a `master` branch altogether, so we don't need this anymore. Also, this script hasn't been running correctly in a long time. We've been creating this PR manually. * Add changelog entries under release candidate header (#10784) Instead of always placing new changelog entries under the "Current Develop Branch" header, the changelog script now places them under the header for the current release if that release has not yet been tagged. This eliminates one manual step from the release process. Relates to #10752 * Prevent duplicate changelog entries (#10786) The changelog update script now prevents duplicate entries from being added. Specifically, it will ensure that if a PR has been referenced already in an entry, it will not add it again. This should prevent it from adding duplicate entries for changes that were cherry-picked into hotfix releases. Note that this duplication prevention only works for entries containing a PR number. We don't have any way to prevent duplicate entries yet in cases where we don't know the associated PR. We will be preventing this possibility entirely pretty soon in some upcoming release automation changes though, so I'm not concerned about this omission. * Set the BSC_CONTRACT_ADDRESS to lowercase (#10800) * only applies rules to the appropriate files (#10788) * upgrade eslint deps (#10789) * Ensure correct primary currency image is displayed on home screen and token list (#10777) * Add release header when updating changelog (#10794) The changelog update script now adds a release header if it doesn't find one already that matches the current release candidate version. * remove node-sass dependency (#10797) * Add support for locators into driver abstraction (#10802) * Update changelog headers and fix dates (#10805) The changelog release header format has been updated to match the "keep a changelog" [1] format. Each header is now the bracketed version number followed by a dash, then the release date in ISO-8601 format. The release dates in each header were also updated to match the date of the corresponding GitHub Release [2]. Many of these dates were incorrect because they were set on the day we created the release candidate, rather than on the day of release. Any changelog release entries without a corresponding GitHub release was left with the date already specified. The three oldest release headers were missing dates. For the first two, I used the date of the version bump commit. For the third, I removed it since no changes were listed anyway, and it represented a range of releases rather than a single one. The `auto-changelog.js` script has been updated to account for this new format as well. [1]: https://keepachangelog.com/en/1.0.0/ [2]: https://github.com/MetaMask/metamask-extension/releases * Update the changelog when creating an RC (#10795) The changelog will now be automatically updated when a release branch is created. A new release header along with changelog entries for any new commits will be added. Note that this changelog will still need to be manually cleaned up, but it's one less manual step at least. The old Bash script for adding a new release header to the changelog has been removed, as that functionality is now built into the changelog update script. A new script has been added to commit any changes made to the manifest and changelog. This step used to happen at the end of the bump manifest version script, but now the changelog update relies upon the manifest version bump happening first, so it needed to be re-ordered. The changes should only be committed on the first run of the branch, as it's contingent upon the manifest changing (due to the version bump). Further changelog updates won't trigger new automatic commits. * Refactoring address-book.spec.js to use fixtures (#10804) * Refactoring send-edit.spec.js to use fixtures (#10792) * Fix _getPermittedAccounts type safety (#10819) * Removing unnecessary params from withFixtures function call. (#10831) * Add links to release headers (#10808) Each release header now includes a link to the range of commits included with that release. These links are at the end of the document, in accordance with the "keep a changelog" [1] format. For the purpose of this changelog, the "previous release" is the most recent release mentioned in the changelogs. The diffs ignore any releases that were omitted from the changelog. This is mainly an issue with older releases, so it seemed acceptable. All releases have been documented for a couple of years now, and will be going forward as well. The name of the "Current Develop Branch" section was changed to "Unreleased" to confirm with "keep a changelog". The `auto-changelog.js` script has been updated to update/add these links whenever adding a new release header as well. [1]: https://keepachangelog.com/en/1.0.0/ * Refactoring permissions.spec.js to use fixtures (#10829) * Add validation for the `fee` property from the `/trades` API response (#10836) * Refactoring signature-request.spec.js to use fixtures (#10820) * use locator abstraction in tests folder (#10833) * Move BSC chain ID, rename some BSC-related vars (#10807) * Add categories to each changelog release (#10837) Each changelog release now has category headers. The standard "keep a changelog" [1] categories are used, along with the addition of "Uncategorized" for any changes that have not yet been categorized. The changelog script has been updated to add this "Uncategorized" header if it isn't already present, and to place any new commits under this header. The changelog has been updated to property categorize each change in recent releases, and to place changes in older releases under the header "Uncategorized". [1]: https://keepachangelog.com/en/1.0.0/ * Remove unused CI script (#10840) This script has not been used since #10795. It is now gone. * Add `--rc` flag to changelog script (#10839) The changelog script now accepts an `--rc` flag to tell it whether to add new changes to `Unreleased` or to the header for the current version. Previously this was inferred from whether the current version matched the most recent tag. However this method only works for the first update. Using a flag simplifies this logic, and makes it possible to manually re-run this for further updates to a release candidate. * Add `--help` flag to changelog script (#10846) The changelog script now accepts a `--help` flag, which prints a help text explaining how the script works and what each flag does. * add abstraction for waitForSelector (#10844) * Adds jest dependency (#10845) * Add Jest * Refactor changelog parsing and generation (#10847) The `auto-changelog.js` script has been refactoring into various different modules. This was done in preparation for migrating this to a separate repository, where it can be used in our libraries as well. Functionally this should act _mostly_ the same way, but there have been some changes. It was difficult to make this a pure refactor because of the strategy used to validate the changelog and ensure each addition remained valid. Instead of being updated in-place, the changelog is now parsed upfront and stored as a "Changelog" instance, which is a new class that was written to allow only valid changes. The new changelog is then stringified and completely overwrites the old one. The parsing had to be much more strict, as any unanticipated content would otherwise be erased unintentionally. This script now also normalizes the formatting of the changelog (though the individual change descriptions are still unformatted). The changelog stringification now accommodates non-linear releases as well. For example, you can now release v1.0.1 *after* v2.0.0, and it will be listed in chronological order while also correctly constructing the `compare` URLs for each release. * Increase default slippage from 2% to 3%, show Advanced Options by default (#10842) * Increase default slippage from 2% to 3%, show Advanced Options by default * Disable opening / closing of Advanced Options on the Swap page * Pre-select previously used slippage value when going back to the Swap page * Fix lint issues * Use a callback for setting up an initial customValue * Migrate unreleased changes in changelog (#10853) When updating the changelog for a release candidate, any unreleased changes are now migrated to the release header. Generally we don't make a habit of adding changes to the changelog prior to creating a release candidate, but if any are there we certainly don't want them duplicated. * @metamask/eslint-config*@6.0.0 (#10858) * @metamask/eslint-config*@6.0.0 * Minor eslintrc reorg * Refactoring threebox.spec.js to use fixtures (#10849) * Adjust renderWithProvider to accommodate redux-less components (#10857) * Jest config (#10855) * Setup jest config * Adjust test for jest. * Adjust lint config * Omit swaps ui folder for unit testing * Omit swaps from test:unit:lax * Add jest.config.js to script files * Restore mocks rather than clearing them. * Update jest config and adjust lint to include subdirs * Convert view-quote-price-difference test to jest * Add jest ci and ci coverage scripts. Add jest unit test to general test command * Add test coverage to ci * Use --ignore flag * Fixup * Add @metamask/eslint-config-jest * Update .eslintrc.js Co-authored-by: Mark Stacey <markjstacey@gmail.com> * Adds jest-coverage/ Co-authored-by: Mark Stacey <markjstacey@gmail.com> * Add jest-coverage/ to prettierignore (#10865) * Add jest coverage (#10868) * Add jest coverage This will add coverage for any tests ran in jest under the `test:coverage:jest` command, which is currently being used in CI. I set the values to the current test coverage in `ui/app/pages/swaps`. * Lint * Fix crash when adding new changelog release header (#10870) The `auto-changelog.js` script crashes when trying to add a new release header. This bug was introduced in #10847. The cause was a simple misnamed parameter. * Change caching for Swaps APIs from 1 hour to 5 minutes (#10871) * Change caching for the /tokens API from 1 hour to 5 minutes * Use 5 minutes caching for /topAssets and /aggregatorMetadata APIs as well * add key literals to driver (#10854) * Quote globs in prettier scripts (#10867) * use waitForSelector instead of until (#10852) * complete abstraction of until method * response to feedback * Adding recovery phrase video to onboarding process (#10717) * Adding recovery phrase video to onboarding process Adding english subtitles * Support textAlign in Box, converting sidebar to Box * Reduce calls of the `/featureFlag` API (#10859) * Remove periodic calls to the /featureFlag API * Always show the Swap button on the main page * Check if the Swaps feature is enabled, show loading animation while waiting * Reuse an existing useEffect call * Use ‘isFeatureFlagLoaded’ in React’s state, resolve lint issues * Add a watch mode for Jest testing * Add unit tests for Swaps: fetchSwapsLiveness, add /ducks/swaps into Jest testing * Remove Swaps Jest tests from Mocha’s ESLint rules * Ignore Swaps Jest tests while running Mocha, update paths * Increase test coverage to the current max * Fix ESLint issues for Swaps * Enable the Swaps feature by default and after state reset, remove loading screen before seeing Swaps * Update Jest config, fix tests * Update Jest coverage threshold to the current maximum * Update ESLint rule in jest.config.js * Disable the “Review Swap” button if the feature flag hasn’t loaded yet * Update jest threshold * Fix 10036 - Prevent odd localStorage migration error in Firefox (#10884) * Add jest watch mode script (#10869) * Refactoring metamask-responsive-ui.spec.js to use fixtures (#10866) * Handling infura blockage (#10883) * Handling infura blockage * Adding blockage home notification * Updating copy, adding temporary notification dismissal * Addressing review feedback * Using eth_blockNumber method to check Infura availability * Handling network changes in availability check * Use jest to run ui/**/*.test.js (#10885) * upgrade ethereumjs util (#10886) * Swaps: Show a network name dynamically in a tooltip (#10882) * Swaps: Show a network name dynamically in a tooltip * Replace “Ethereum” with “$1”, change “Test” to “Testnet” * Replace 이더리움 with $1 * Translate network names, use ‘Ethereum’ by default if a translation is not available yet * Reorder messages to resolve ESLint issues * Add a snapshot test for the FeeCard component, increase Jest threshold * Enable snapshot testing into external .snap files in ESLint * Add the “networkNameEthereum” key in ko/messages.json, remove default “Ethereum” value * Throw an error if chain ID is not supported by the Swaps feature * Use string literals when calling the `t` fn, * Adding option to set Custom Nonce to Confirm Approve Page (#10595) * Dep Upgrades for Lavamoat Patches (#10902) * dep upgrades * apply more patches * Dep upgrades and patches (#10903) * apply patches * lavamoat dep upgrades * remove lavamoat browserify * Increase Jest unit test coverage for the Swaps feature to ~25% (#10900) * Swaps: Show a network name dynamically in a tooltip * Replace “Ethereum” with “$1”, change “Test” to “Testnet” * Replace 이더리움 with $1 * Translate network names, use ‘Ethereum’ by default if a translation is not available yet * Reorder messages to resolve ESLint issues * Add a snapshot test for the FeeCard component, increase Jest threshold * Enable snapshot testing into external .snap files in ESLint * Add the “networkNameEthereum” key in ko/messages.json, remove default “Ethereum” value * Throw an error if chain ID is not supported by the Swaps feature * Use string literals when calling the `t` fn, * Watch Jest tests silently (no React warnings in terminal, only errors) * Add @testing-library/jest-dom, import it before running Jest tests * Add snapshot testing of Swaps’ React components for happy paths, increase minimum threshold for Jest * Add the test/jest folder for Jest setup and shared functions, use it in Swaps Jest tests * Fix ESLint issues, update linting config * Enable ESLint for .snap files (Jest snapshots), throw an error if a snapshot is bigger than 50 lines * Don’t run lint:fix for .snap files * Move `createProps` outside of `describe` blocks, move store creation inside tests * Use translations instead of keys, update a rendering function to load translations * Make sure all Jest snapshots are shorter than 50 lines (default limit) * Add / update props for Swaps tests * Fix React warnings when running tests for Swaps * Bump @metamask/contract-metadata from 1.23.0 to 1.25.0 (#10899) Bumps [@metamask/contract-metadata](https://github.com/MetaMask/contract-metadata) from 1.23.0 to 1.25.0. - [Release notes](https://github.com/MetaMask/contract-metadata/releases) - [Commits](https://github.com/MetaMask/contract-metadata/compare/v1.23.0...v1.25.0) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Refactoring from-import-ui.spec.js to use fixtures (#10907) * Fix 10458 - Understand where to get support (#10895) * Add contract address validation for token swaps (#10912) * Fixing ENS input entry in send flow (#10923) * Fixing ENS input entry in send flow Fixes MetaMask/metamask-extension#10691 * removed unnecessary apostrophe * Refactoring incremental-security.spec.js to use fixtures (#10917) * use one segment instance (#10915) * Implement Ledger Live bridge (#10293) * add view account-details menu item to token-options menu (#10932) * add view account-details menu item to token-options menu * add onViewAccountDetails propType * Fix 10609 - Prevent overflow of confirmation page hostname (#10935) * upgrade eth-keyring-controller (#10933) * [Fix] 10365 My Accounts Removal (#10680) * pushing my-accounts removal * removed CONTACT_MY_ACCOUNTS_ROUTE * removed CONTACT_MY_ACCOUNTS_VIEW_ROUTE * removing CONTACT_MY_ACCOUNTS_EDIT_ROUTE * removing CONTACT_MY_ACCOUNTS_EDIT_ROUTE * removed showingMyAccounts dead code * removed more dead code related to isMyAccountsPage * removing more dead code * fixed linting error(s) * removing my-accounts component/folder * added empty contact screen ui * styled empty contact page ui * fixed linting, removed add contacts button, and fixed errors * localized text and centered No Contacts * pushing localized verification and fixed e2e test * added listRoute redirect * added listroute and fixed linting error * Increase Jest unit test coverage for the Swaps feature to ~43% (#10934) * add hamburger menu to eth page (#10938) * add hamburger menu to eth page * change token-options to asset-options, use more direct selector for user address fetch * use token custom icons where possible (#10939) * Whats new popup (#10583) * Add 'What's New' notification popup * Move selectors from shared/notifications into ui/ directory * Use keys for localized message in whats new notifications objects, to ensure notifications will be translated. * Remove unused swaps intro popup locale messages * Fix keys of whats new notification locales * Remove notifications messages and descriptions from comment in shared/notifications * Move notifcationActionFunctions to shared/notifications and make it stateless * Get notification data from constants instead of state in whats-new-popup * Code cleanup * Fix build quote reference to swapsEthToken, broken during rebase * Rename notificationFilters to notificationToExclude to clarify its purpose * Documentation for getSortedNotificationsToShow * Move notification action functions from shared/ to whats-new-popup.js * Stop setting swapsWelcomeMessageHasBeenShown to state in app-state controller * Update e2e tests for whats new popup changes * Updating migration files * Addressing feedback part 1 * Addressing feedback part 2 * Remove unnecessary div in whats-new-popup * Change getNotificationsToExclude to getNotificationsToInclude for use in the getSortedNotificationsToShow selector * Delete intro-popup directory and test files * Lint fix * Add notifiction state to address-entry fixture * Use two separate functions for rendering first and subsequent notifications in the whats-new-popup * Ensure that string literals are passed to t for whats new popup text * Update import-ui fixtures to include notificaiton controller state * Remove unnecessary, accidental change confirm-approve * Remove swaps notification in favour of mobile swaps as first notifcation and TBD 3rd notification * Update whats-new-popup to use intersection observer api to detect if notification has been seen * Add notifications to send-edit and threebox e2e test fixtures * Update ui/app/selectors/selectors.js Co-authored-by: Mark Stacey <markjstacey@gmail.com> * Update ui/app/selectors/selectors.js Co-authored-by: Mark Stacey <markjstacey@gmail.com> * Clean up locale code for whats-new-popup notifications * Disconnect observers in whats-new-popup when their callback is first called * Add test case for migration 58 for when the AppStateController does not exist * Rename popover components containerRef to popoverWrapRef * Fix messages.json * Update notification messages and images * Rename popoverWrapRef -> popoverRef in whats-new-popup and popover.component * Only create one observer, and only after images have loaded, in whats-new-popup * Set width and height on whats-new-popup image, instead of setting state on img load * Update ui/app/components/app/whats-new-popup/whats-new-popup.js Co-authored-by: Mark Stacey <markjstacey@gmail.com> * Code clean up in whats new popup re: notification rendering and action functions * Code cleanup in render notification functions of whats-new-popup * Update ui/app/components/app/whats-new-popup/whats-new-popup.js Co-authored-by: Mark Stacey <markjstacey@gmail.com> * lint fix * Update and localize notification dates * Clean up date code in shred/notifications/index.js Co-authored-by: ryanml <ryanlanese@gmail.com> Co-authored-by: Mark Stacey <markjstacey@gmail.com> * Revert "Implement Ledger Live bridge (#10293)" This reverts commit 15b596ad15f2d569255c39e5e7babc8b7ab700ca. * Version v9.5.0 * Update changelog for v9.5.0 * yarn allow-scripts and yarn lavamoat:auto for Version-v9.5.0 branch * Anchor the Need Help text to the bottom of the expanded page (#10955) * fix transaction sync logic (#10954) * Add backwards compatibility for ETH <-> WETH contract address validation (#10962) * Whats new popup design fixes (#10964) * Remove padding on QR code image * Allow the qr code to be below the description in the whats new popup * Fix size and position of QR code in whats new notification * Add right caret to action links in whats new popup * Clean up placeImageBelowDescription logic * Fix display of whats-new-popup image * Improve spacing and sizing of whats new popup in both full screen and popup view * refactor * Ensure method of adding contact when contacts exist (#10963) * Fixing alignment issue with bottom notification (#10979) * Revert "Adding recovery phrase video to onboarding process (#10717)" This reverts commit 9e918b602655e0e4620ab19a3959a8fc08ec0f47. * Removing recovery video entry from changelog * Remove tests that are only needed for the commit reverted in 68c5defc * Fix dependency vulnerability by upgrading xmlhttprequest-ssl via yarn.lock (#10990) Co-authored-by: Mark Stacey <markjstacey@gmail.com> Co-authored-by: Barry Gitarts <bgitarts@gmail.com> Co-authored-by: Dan J Miller <danjm.com@gmail.com> Co-authored-by: Erik Marks <25517051+rekmarks@users.noreply.github.com> Co-authored-by: Brad Decker <git@braddecker.dev> Co-authored-by: ryanml <ryanlanese@gmail.com> Co-authored-by: David Walsh <davidwalsh83@gmail.com> Co-authored-by: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Co-authored-by: Shane <jonas.shane@gmail.com> Co-authored-by: gitpurva <47534619+gitpurva@users.noreply.github.com> Co-authored-by: kumavis <kumavis@users.noreply.github.com> Co-authored-by: Etienne Dusseault <etienne.dusseault@gmail.com> Co-authored-by: kumavis <aaron@kumavis.me> Co-authored-by: Grant Bakker <grant@bakker.pw> Co-authored-by: Michael Standen <screaminghawk@gmail.com> Co-authored-by: Muhammet Kara <mrkara@users.noreply.github.com> Co-authored-by: Daniel <80175477+dan437@users.noreply.github.com> Co-authored-by: Thomas Huang <tmashuang@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Thomas <thomas.b.huang@gmail.com> Co-authored-by: Alex Donesky <alex.donesky@consensys.net> Co-authored-by: Austin Akers <austin.akers5@gmail.com> Co-authored-by: MetaMask Bot <metamaskbot@users.noreply.github.com>
4 years ago
"message": "Phí mạng dùng để chi trả chi phí xử lý giao dịch hoán đổi của bạn và lưu trữ giao dịch đó trên mạng $1. MetaMask không thu lợi từ khoản phí này."
},
"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"
},
"swapOnceTransactionHasProcess": {
"message": "$1 của bạn sẽ được thêm vào tài khoản sau khi xử lý xong giao dịch.",
"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."
},
"swapProcessing": {
"message": "Đang xử lý"
},
"swapQuoteDetails": {
"message": "Chi tiết báo giá"
},
"swapQuoteDetailsSlippageInfo": {
"message": "Giá thay đổi giữa thời điểm đặt và xác nhận lệnh, việc này được gọi là \"trượt giá\". Giao dịch Hoán đổi của bạn sẽ tự động hủy nếu mức trượt giá vượt quá \"mức trượt giá tối đa\" đã cài đặt."
},
"swapQuoteIncludesRate": {
"message": "Báo giá có bao gồm khoản phí $1% cho MetaMask",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapQuoteNofN": {
"message": "Báo giá $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": "Nguồn báo giá"
},
"swapQuotesAreRefreshed": {
"message": "Báo giá được làm mới thường xuyên để thể hiện tình trạng hiện tại của thị trường."
},
"swapQuotesExpiredErrorDescription": {
"message": "Vui lòng yêu cầu báo giá mới để biết các mức tỷ lệ mới nhất."
},
"swapQuotesExpiredErrorTitle": {
"message": "Hết thời gian chờ báo giá"
},
"swapQuotesNotAvailableErrorDescription": {
"message": "Hãy thử điều chỉnh số tiền hoặc tùy chọn cài đặt mức trượt giá và thử lại."
},
"swapQuotesNotAvailableErrorTitle": {
"message": "Không có báo giá"
},
"swapRate": {
"message": "Tỷ lệ"
},
"swapReceiving": {
"message": "Đang nhận"
},
"swapReceivingInfoTooltip": {
"message": "Đây là giá trị ước tính. Số tiền chính xác phụ thuộc vào mức trượt giá."
},
"swapRequestForQuotation": {
"message": "Yêu cầu báo giá"
},
"swapSearchForAToken": {
"message": "Tìm kiếm token"
},
"swapSelect": {
"message": "Chọn"
},
"swapSelectAQuote": {
"message": "Chọn một báo giá"
},
"swapSelectAToken": {
"message": "Chọn một token"
},
"swapSelectQuotePopoverDescription": {
"message": "Dưới đây là tất cả các báo giá thu thập từ nhiều nguồn thanh khoản."
},
"swapSlippageTooLow": {
"message": "Mức trượt giá phải lớn hơn 0"
},
"swapSource": {
"message": "Nguồn thanh khoản"
},
"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."
},
"swapSwapFrom": {
"message": "Hoán đổi từ"
},
"swapSwapSwitch": {
"message": "Chuyển từ và chuyển sang token khác"
},
"swapSwapTo": {
"message": "Hoán đổi sang"
},
"swapThisWillAllowApprove": {
"message": "Thao tác này sẽ cho phép hoán đổi $1"
},
"swapTokenAvailable": {
"message": "Đã thêm $1 vào tài khoản của bạn.",
"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."
},
"swapTokenToToken": {
"message": "Hoán đổi $1 sang $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."
},
"swapTransactionComplete": {
"message": "Đã hoàn tất giao dịch"
},
"swapUnknown": {
"message": "Không xác định"
},
"swapVerifyTokenExplanation": {
Version v9.3.0 RC (#10739) * Replace logic for eth swap token in fetchQuotesAndSetQuoteState with getSwapsEthToken call (#10624) * Move swaps constants to the shared constants directory (#10614) * Fix: ETH 'token' now only appears once in the swaps to and from dropdowns. (#10650) * Swaps support for local testnet (#10658) * Swaps support for local testnet * Create util method for comparison of token addresses/symbols to default swaps token * Get chainId from txMeta in _trackSwapsMetrics of transaction controller * Add comment to document purpose of getTransactionGroupRecipientAddressFilter * Use isSwapsDefaultTokenSymbol in place of repeated defaultTokenSymbol comparisons in build-quote.js * Additional swaps network support (#10721) * Add swaps support for bnc chain * Use single default token address in shared/constants/swaps * Ensure swaps gas prices are fetched from the correct chain specific endpoint (#10744) * Ensure swaps gas prices are fetched from the correct chain specific endpoint * Just rely on fetchWithCache to cache swaps gas prices, instead of directly using storage in getSwapsPriceEstimatesLastRetrieved * Empty commit * update @metamask/etherscan-link to v2.0.0 (#10747) * Use correct block explorer name and link in swaps when on custom network (#10743) * Use correct block explorer name and link in swaps when on custom network. * Fix up custom etherscan link code in build-quote.js * Use blockExplorerUrl hostname instead of 'blockExplorerBaseUrl' * Use correct etherscan-link method for token links in build-quote * Create correct token link in build-quote for mainnet AND custom networks * Block explorer url improvements in awaiting-swap.js and build-quote.js * Use swapVerifyTokenExplanation message with substitutable block explorer for all applicable locales * Ensure that block explorer links are not shown in awaiting-swap if no url is available * Ensure that the correct default currency symbols are used for fees on the view quote screen (#10753) * Updating y18n and netmask to resolve dependency issues (#10765) netmask@1.0.6 -> 2.0.1, y18n@3.2.1 -> 3.2.2, y18n@4.0.0 -> 4.0.1 * Ensure that priceSlippage fiat amounts are always shown in view-quote.js (#10762) * Ensure that the approval fee in the swaps custom gas modal is in network specific currency (#10763) * Use network specific swaps contract address when checking swap contract token approval (#10774) * Set the BSC_CONTRACT_ADDRESS to lowercase (#10800) * Ensure correct primary currency image is displayed on home screen and token list (#10777) * [skip e2e] Update changelog for v9.3.0 (#10740) * Version v9.3.0 * [skip e2e] Update changelog for v9.3.0 (#10803) Co-authored-by: Dan J Miller <danjm.com@gmail.com> Co-authored-by: ryanml <ryanlanese@gmail.com> Co-authored-by: David Walsh <davidwalsh83@gmail.com> Co-authored-by: MetaMask Bot <metamaskbot@users.noreply.github.com>
4 years ago
"message": "Nhiều token có thể dùng cùng một tên và ký hiệu. Hãy kiểm tra trên $1 để xác minh xem đây có phải là token bạn đang tìm kiếm không.",
"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."
},
"swapViewToken": {
"message": "Xem $1"
},
"swapYourTokenBalance": {
"message": "Có sẵn $1 $2 để hoán đổi",
"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": "Mức trượt giá 0%"
},
"swapsAdvancedOptions": {
"message": "Tùy chọn nâng cao"
},
"swapsMaxSlippage": {
"message": "Mức trượt giá tối đa"
},
"swapsNotEnoughForTx": {
"message": "Không đủ $1 để hoàn thành giao dịch này",
"description": "Tells the user that they don't have enough of a token for a proposed swap. $1 is a token symbol"
},
"swapsViewInActivity": {
"message": "Xem hoạt động"
},
"switchNetworks": {
"message": "Thay đổi mạng"
},
"switchToThisAccount": {
"message": "Chuyển sang tài khoản này"
},
"symbol": {
"message": "Ký hiệu"
},
"symbolBetweenZeroTwelve": {
"message": "Ký hiệu không được dài quá 11 ký tự."
},
"syncWithMobile": {
"message": "Đồng bộ hóa với thiết bị di động"
},
"syncWithMobileBeCareful": {
"message": "Đảm bảo rằng không có ai nhìn vào màn hình của bạn khi quét mã này"
},
"syncWithMobileComplete": {
"message": "Đã đồng bộ hóa thành công dữ liệu của bạn. Tận hưởng ứng dụng MetaMask trên thiết bị di động!"
},
"syncWithMobileDesc": {
"message": "Bạn có thể đồng bộ hóa tài khoản và thông tin của mình với thiết bị di động. Mở ứng dụng MetaMask trên thiết bị di động, chuyển đến phần \"Cài đặt\" và nhấn vào \"Đồng bộ hóa với tiện ích trình duyệt\""
},
"syncWithMobileDescNewUsers": {
"message": "Nếu mới mở ứng dụng MetaMask trên thiết bị di động lần đầu tiên, bạn chỉ cần làm theo các bước hướng dẫn trên điện thoại."
},
"syncWithMobileScanThisCode": {
"message": "Quét mã này bằng ứng dụng MetaMask trên thiết bị di động"
},
"syncWithMobileTitle": {
"message": "Đồng bộ hóa với thiết bị di động"
},
"syncWithThreeBox": {
"message": "Đồng bộ hóa dữ liệu với 3Box (thử nghiệm)"
},
"syncWithThreeBoxDescription": {
"message": "Bật để sao lưu các tùy chọn cài đặt của bạn với 3Box. Tính năng này hiện đang trong giai đoạn thử nghiệm; bạn tự chịu rủi ro khi sử dụng."
},
"syncWithThreeBoxDisabled": {
"message": "Đã tắt 3Box do có lỗi xảy ra trong quá trình đồng bộ hóa ban đầu"
},
"terms": {
"message": "Điều khoản sử dụng"
},
"termsOfService": {
"message": "Điều khoản dịch vụ"
},
"testFaucet": {
"message": "Vòi thử nghiệm"
},
"thisWillCreate": {
"message": "Thao tác này sẽ tạo một ví mới và cụm mật khẩu gốc"
},
"tips": {
"message": "Mẹo"
},
"to": {
"message": "Đến"
},
"toAddress": {
"message": "Đến: $1",
"description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress"
},
"toWithColon": {
"message": "Đến:"
},
"token": {
"message": "Token"
},
"tokenAlreadyAdded": {
"message": "Đã thêm token."
},
"tokenContractAddress": {
"message": "Địa chỉ hợp đồng token"
},
"tokenSymbol": {
"message": "Ký hiệu token"
},
"total": {
"message": "Tổng"
},
"transaction": {
"message": "giao dịch"
},
"transactionCancelAttempted": {
"message": "Đã cố gắng hủy giao dịch với mức phí gas $1 lúc $2"
},
"transactionCancelSuccess": {
"message": "Đã hủy thành công giao dịch lúc $2"
},
"transactionConfirmed": {
"message": "Đã xác nhận giao dịch lúc $2."
},
"transactionCreated": {
"message": "Đã tạo giao dịch với giá trị $1 lúc $2"
},
"transactionDropped": {
"message": "Đã ngừng giao dịch lúc $2."
},
"transactionError": {
"message": "Lỗi giao dịch. Đã xảy ra ngoại lệ trong mã hợp đồng."
},
"transactionErrorNoContract": {
"message": "Đang cố gắng gọi một hàm trên địa chỉ không có hợp đồng."
},
"transactionErrored": {
"message": "Giao dịch đã gặp lỗi."
},
"transactionFee": {
"message": "Phí giao dịch"
},
"transactionResubmitted": {
"message": "Đã gửi lại giao dịch với mức phí gas tăng lên $1 lúc $2"
},
"transactionSubmitted": {
"message": "Đã gửi giao dịch với mức phí gas $1 lúc $2."
},
"transactionUpdated": {
"message": "Đã cập nhật giao dịch lúc $2."
},
"transfer": {
"message": "Chuyển"
},
"transferBetweenAccounts": {
"message": "Chuyển giữa các tài khoản của tôi"
},
"transferFrom": {
"message": "Chuyển từ"
},
"troubleConnectingToWallet": {
"message": "Chúng tôi đã gặp phải sự cố khi kết nối với $1 của bạn, hãy thử xem lại $2 và thử lại.",
"description": "$1 is the wallet device name; $2 is a link to wallet connection guide"
},
"troubleTokenBalances": {
"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ạn có tin tưởng trang web này không? Bằng việc cấp quyền này, bạn sẽ cho phép $1 rút $2 của bạn và tự động thực hiện các giao dịch cho bạn.",
"description": "$1 is the url requesting permission and $2 is the symbol of the currency that the request is for"
},
"tryAgain": {
"message": "Thử lại"
},
"typePassword": {
"message": "Nhập mật khẩu MetaMask của bạn"
},
"unapproved": {
"message": "Chưa phê duyệt"
},
"units": {
"message": "đơn vị"
},
"unknown": {
"message": "Không xác định"
},
"unknownCameraError": {
"message": "Đã xảy ra lỗi khi cố gắng truy cập máy ảnh của bạn. Vui lòng thử lại..."
},
"unknownCameraErrorTitle": {
"message": "Rất tiếc! Đã xảy ra sự cố...."
},
"unknownNetwork": {
"message": "Mạng riêng không xác định"
},
"unknownQrCode": {
"message": "Lỗi: Chúng tôi không thể xác định mã QR đó"
},
"unlimited": {
"message": "Không giới hạn"
},
"unlock": {
"message": "Mở khóa"
},
"unlockMessage": {
"message": "Web phi tập trung đang chờ đón bạn"
},
"updatedWithDate": {
"message": "Đã cập nhật vào $1"
},
"urlErrorMsg": {
"message": "URL phải có tiền tố HTTP/HTTPS phù hợp."
},
"urlExistsErrorMsg": {
"message": "URL đã có trong danh sách mạng hiện tại"
},
"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"
},
"usedByClients": {
"message": "Được nhiều ví khác nhau sử dụng"
},
"userName": {
"message": "Tên người dùng"
},
"verifyThisTokenOn": {
"message": "Xác minh token này trê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\""
},
"viewAccount": {
"message": "Xem tài khoản"
},
"viewContact": {
"message": "Xem người liên hệ"
},
"viewOnCustomBlockExplorer": {
"message": "Xem tại $1"
},
"viewOnEtherscan": {
"message": "Xem trên Etherscan"
},
"viewinExplorer": {
"message": "Xem trên trình khám phá"
},
"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"
},
"walletSeed": {
"message": "Cụm mật khẩu gốc"
},
"welcome": {
"message": "Chào mừng bạn đến với MetaMask"
},
"welcomeBack": {
"message": "Chào mừng bạn trở lại!"
},
"whatsThis": {
"message": "Đây là gì?"
},
"writePhrase": {
"message": "Ghi cụm mật khẩu này ra giấy và lưu giữ ở một nơi an toàn. Nếu bạn cần độ bảo mật cao hơn nữa, hãy ghi ra nhiều tờ giấy và lưu giữ ở 2 đến 3 nơi khác nhau."
},
"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"
},
"yesLetsTry": {
"message": "Có, hãy thử"
},
"youNeedToAllowCameraAccess": {
"message": "Bạn cần cho phép truy cập vào camera để sử dụng tính năng này."
},
"youSign": {
"message": "Bạn đang ký"
},
"yourPrivateSeedPhrase": {
"message": "Cụm mật khẩu gốc riêng tư của bạn"
},
"zeroGasPriceOnSpeedUpError": {
"message": "Giá gas bằng 0 khi tăng tốc"
}
}