diff options
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | app/_locales/en/messages.json | 3 | ||||
-rw-r--r-- | app/_locales/es/messages.json | 14 | ||||
-rw-r--r-- | app/_locales/it/messages.json | 485 | ||||
-rw-r--r-- | app/_locales/ko/messages.json | 92 | ||||
-rw-r--r-- | app/scripts/controllers/transactions/index.js | 35 | ||||
-rw-r--r-- | app/scripts/controllers/transactions/tx-state-manager.js | 5 | ||||
-rw-r--r-- | ui/app/components/transaction-activity-log/transaction-activity-log.util.js | 6 | ||||
-rw-r--r-- | ui/app/components/transaction-breakdown/transaction-breakdown.component.js | 20 | ||||
-rw-r--r-- | ui/app/components/transaction-list-item/transaction-list-item.component.js | 3 | ||||
-rw-r--r-- | ui/app/components/transaction-status/index.scss | 7 | ||||
-rw-r--r-- | ui/app/helpers/tests/transactions.util.test.js | 35 | ||||
-rw-r--r-- | ui/app/helpers/transactions.util.js | 18 |
13 files changed, 699 insertions, 25 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cb8197d4..94265257f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Update transaction statuses when switching networks. - [#5470](https://github.com/MetaMask/metamask-extension/pull/5470) 100% coverage in French locale, fixed the procedure to verify proposed locale. - Added rudimentary support for the subscription API to support web3 1.0 and Truffle's Drizzle. +- [#5502](https://github.com/MetaMask/metamask-extension/pull/5502) Update Italian translation. ## 4.12.0 Thursday September 27 2018 diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index d8467e9eb..13b0da230 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -424,6 +424,9 @@ "gasLimitTooLow": { "message": "Gas limit must be at least 21000" }, + "gasUsed": { + "message": "Gas Used" + }, "generatingSeed": { "message": "Generating Seed..." }, diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index 3e43a7b43..be2a29ab5 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -156,7 +156,7 @@ "message": " Copiar " }, "copyPrivateKey": { - "message": "Ésta es tu llave privada (haz click para copiar)" + "message": "Ésta es tu clave privada (haz click para copiar)" }, "copyToClipboard": { "message": "Copiar al portapapeles" @@ -278,10 +278,10 @@ "message": "Tipo de cambio" }, "exportPrivateKey": { - "message": "Exportar llave privada" + "message": "Exportar clave privada" }, "exportPrivateKeyWarning": { - "message": "Exportar llaves privadas bajo TU PROPIO riesgo" + "message": "Exportar claves privadas bajo TU PROPIO riesgo" }, "failed": { "message": "Fallo" @@ -579,8 +579,8 @@ "description": "En el proceso de creación de contraseña, esta no es lo suficientemente larga para ser segura" }, "pastePrivateKey": { - "message": "Pega tu llave privada aqui", - "description": "Para importar una cuenta desde una llave privada" + "message": "Pega tu clave privada aqui", + "description": "Para importar una cuenta desde una clave privada" }, "pasteSeed": { "message": "¡Pega tu frase semilla aquí!" @@ -595,7 +595,7 @@ "message": "Política de privacidad" }, "privateKey": { - "message": "Llave privada", + "message": "Clave privada", "description": "Selecciona este tupo de archivo para importar una cuenta" }, "privateKeyWarning": { @@ -712,7 +712,7 @@ "message": "Comprar con ShapeShift" }, "showPrivateKeys": { - "message": "Mostrar llaves privadas" + "message": "Mostrar claves privadas" }, "showQRCode": { "message": "Mostrar codigo QR" diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json index 492bcc3de..06e3dc855 100644 --- a/app/_locales/it/messages.json +++ b/app/_locales/it/messages.json @@ -2,6 +2,9 @@ "accept": { "message": "Accetta" }, + "accessingYourCamera": { + "message": "Accesso alla fotocamera..." + }, "account": { "message": "Account" }, @@ -11,6 +14,15 @@ "accountName": { "message": "Nome Account" }, + "accountOptions": { + "message": "Account Options" + }, + "accountSelectionRequired": { + "message": "Devi selezionare un account!" + }, + "activityLog": { + "message": "log attività" + }, "address": { "message": "Indirizzo" }, @@ -23,6 +35,12 @@ "addTokens": { "message": "Aggiungi più token" }, + "addSuggestedTokens": { + "message": "Aggiungi Token Suggeriti" + }, + "addAcquiredTokens": { + "message": "Aggiungi i token che hai acquistato usando MetaMask" + }, "amount": { "message": "Importo" }, @@ -37,9 +55,21 @@ "message": "MetaMask", "description": "Il nome dell'applicazione" }, + "approve": { + "message": "Approva" + }, + "approved": { + "message": "Approvato" + }, "attemptingConnect": { "message": "Tentativo di connessione alla blockchain." }, + "attemptToCancel": { + "message": "Tentativo di Annullamento?" + }, + "attemptToCancelDescription": { + "message": "Tentare di annullare non garantisce che la transazione verrà annullata. Se annullata, è comunque richiesto pagare alla rete la commissione sulla transazione." + }, "attributions": { "message": "Attribuzioni" }, @@ -71,8 +101,11 @@ "borrowDharma": { "message": "Prendi in presisito con Dharma (Beta)" }, + "browserNotSupported": { + "message": "Il tuo Browser non è supportato..." + }, "builtInCalifornia": { - "message": "MetaMask è progettato e costruito in California." + "message": "MetaMask è progettato e realizzato in California." }, "buy": { "message": "Compra" @@ -83,8 +116,23 @@ "buyCoinbaseExplainer": { "message": "Coinbase è il servizio più popolare al mondo per comprare e vendere Bitcoin, Ethereum e Litecoin." }, + "bytes": { + "message": "Bytes" + }, + "ok": { + "message": "Ok" + }, "cancel": { - "message": "Cancella" + "message": "Annulla" + }, + "cancelAttempt": { + "message": "Tentativo di Annullamento" + }, + "cancellationGasFee": { + "message": "Commissione di Annullamento in Gas" + }, + "cancelN": { + "message": "Cancel all $1 transactions" }, "classicInterface": { "message": "Usa l'interfaccia classica" @@ -92,9 +140,18 @@ "clickCopy": { "message": "Clicca per Copiare" }, + "close": { + "message": "Chiudi" + }, + "chromeRequiredForHardwareWallets": { + "message": "Devi usare MetaMask con Google Chrome per connettere il tuo Portafoglio Hardware" + }, "confirm": { "message": "Conferma" }, + "confirmed": { + "message": "Confermata" + }, "confirmContract": { "message": "Conferma Contratto" }, @@ -104,6 +161,36 @@ "confirmTransaction": { "message": "Conferma Transazione" }, + "connectHardwareWallet": { + "message": "Connetti Portafoglio Hardware" + }, + "connect": { + "message": "Connetti" + }, + "connecting": { + "message": "Connessione..." + }, + "connectingToKovan": { + "message": "Connessione alla Rete di test Kovan" + }, + "connectingToMainnet": { + "message": "Connessione alla Rete Ethereum Principale" + }, + "connectingToRopsten": { + "message": "Connessione alla Rete di test Ropsten" + }, + "connectingToRinkeby": { + "message": "Connessione alla Rete di test Rinkeby" + }, + "connectingToUnknown": { + "message": "Connessione ad una Rete Sconosciuta" + }, + "connectToLedger": { + "message": "Connettersi al Ledger" + }, + "connectToTrezor": { + "message": "Connettersi al Trezor" + }, "continue": { "message": "Continua" }, @@ -131,6 +218,9 @@ "copy": { "message": "Copia" }, + "copyAddress": { + "message": "Copia l'indirizzo" + }, "copyToClipboard": { "message": "Copia negli appunti" }, @@ -156,12 +246,21 @@ "currentConversion": { "message": "Cambio Corrente" }, + "currentLanguage": { + "message": "Lingua Corrente" + }, "currentNetwork": { "message": "Rete Corrente" }, + "currentRpc": { + "message": "RPC Corrente" + }, "customGas": { "message": "Personalizza Gas" }, + "customToken": { + "message": "Token Personalizzato" + }, "customize": { "message": "Personalizza" }, @@ -223,33 +322,54 @@ "done": { "message": "Finito" }, + "downloadGoogleChrome": { + "message": "Scarica Google Chrome" + }, "downloadStateLogs": { "message": "Scarica i log di Stato" }, + "dontHaveAHardwareWallet": { + "message": "Non hai un portafoglio hardware?" + }, + "dropped": { + "message": "Abbandonata" + }, "edit": { "message": "Modifica" }, "editAccountName": { "message": "Modifica Nome Account" }, + "editingTransaction": { + "message": "Modifica la transazione" + }, "emailUs": { "message": "Mandaci una mail!" }, "encryptNewDen": { "message": "Cripta il tuo nuovo DEN" }, + "ensNameNotFound": { + "message": "Nome ENS non trovato" + }, "enterPassword": { "message": "Inserisci password" }, "enterPasswordConfirm": { "message": "Inserisci la tua password per confermare" }, + "enterPasswordContinue": { + "message": "Inserisci la tua password per continuare" + }, "etherscanView": { "message": "Vedi account su Etherscan" }, "exchangeRate": { "message": "Tasso di cambio" }, + "expandView": { + "message": "Expand View" + }, "exportPrivateKey": { "message": "Esporta Chiave Privata" }, @@ -257,7 +377,7 @@ "message": "Esporta chiave privata a tuo rischio." }, "failed": { - "message": "Fallito" + "message": "Fallita" }, "fiat": { "message": "FIAT", @@ -270,6 +390,9 @@ "followTwitter": { "message": "Seguici su Twitter" }, + "forgetDevice": { + "message": "Dimentica questo dispositivo" + }, "from": { "message": "Da" }, @@ -279,6 +402,9 @@ "fromShapeShift": { "message": "Da ShapeShift" }, + "functionType": { + "message": "Tipo della Funzione" + }, "gas": { "message": "Gas", "description": "Piccola indicazione del costo del gas" @@ -310,6 +436,9 @@ "gasPriceRequired": { "message": "Prezzo Gas Richiesto" }, + "generatingTransaction": { + "message": "Generando la transazione" + }, "getEther": { "message": "Ottieni Ether" }, @@ -317,10 +446,28 @@ "message": "Ottieni Get Ether da un faucet per $1", "description": "Visualizza il nome della rete per il faucet Ether" }, + "getHelp": { + "message": "Aiuto." + }, "greaterThanMin": { "message": "deve essere maggiore o uguale a $1.", "description": "aiuto per inserire un input esadecimale come decimale" }, + "hardware": { + "message": "hardware" + }, + "hardwareWalletConnected": { + "message": "Portafoglio hardware connesso" + }, + "hardwareWallets": { + "message": "Connetti portafoglio hardware" + }, + "hardwareWalletsMsg": { + "message": "Selezione un portafoglio hardware che vuoi utilizzare con MetaMask" + }, + "havingTroubleConnecting": { + "message": "Problemi di connessione?" + }, "here": { "message": "qui", "description": "per intendere -clicca qui- per maggiori informazioni (va con troubleTokenBalances)" @@ -328,6 +475,9 @@ "hereList": { "message": "Questa è una lista!!!!" }, + "hexData": { + "message": "Dati Hex" + }, "hide": { "message": "Nascondi" }, @@ -337,6 +487,9 @@ "hideTokenPrompt": { "message": "Nascondi Token?" }, + "history": { + "message": "Storico" + }, "howToDeposit": { "message": "Come vuoi depositare Ether?" }, @@ -363,9 +516,18 @@ "message": "Importato", "description": "stato che conferma che un account è stato totalmente caricato nel portachiavi" }, + "importUsingSeed": { + "message": "Importa account con frase seed" + }, + "info": { + "message": "Informazioni" + }, "infoHelp": { "message": "Informazioni & Aiuto" }, + "initialTransactionConfirmed": { + "message": "La transazione iniziale è stata confermata dalla rete. Clicca OK per tornare indietro." + }, "insufficientFunds": { "message": "Fondi non sufficienti." }, @@ -390,6 +552,9 @@ "invalidRPC": { "message": "URI RPC invalido" }, + "invalidSeedPhrase": { + "message": "Frase seed non valida" + }, "jsonFail": { "message": "Qualcosa è andato storto. Assicurati che il file JSON sia formattato correttamente." }, @@ -397,12 +562,24 @@ "message": "File JSON", "description": "formato per importare un account" }, + "keepTrackTokens": { + "message": "Tieni traccia dei tokens che hai acquistato con il tuo account MetaMask." + }, "kovan": { "message": "Rete di test Kovan" }, "knowledgeDataBase": { "message": "Visita la nostra Knowledge Base" }, + "max": { + "message": "Massimo" + }, + "learnMore": { + "message": "Scopri di più" + }, + "ledgerAccountRestriction": { + "message": "E' necessario utilizzare l'ultimo account prima di poterne aggiungere uno nuovo." + }, "lessThanMax": { "message": "deve essere minore o uguale a $1.", "description": "aiuto per inserire un input esadecimale come decimale" @@ -410,6 +587,9 @@ "likeToAddTokens": { "message": "Vorresti aggiungere questi token?" }, + "links": { + "message": "Collegamenti" + }, "limit": { "message": "Limite" }, @@ -437,17 +617,26 @@ "mainnet": { "message": "Rete Ethereum Principale" }, + "menu": { + "message": "Menu" + }, "message": { "message": "Messaggio" }, "metamaskDescription": { "message": "MetaMask è una cassaforte sicura per identità su Ethereum." }, + "metamaskSeedWords": { + "message": "Parole Seed di MetaMask" + }, + "metamaskVersion": { + "message": "versione di MetaMask" + }, "min": { "message": "Minimo" }, "myAccounts": { - "message": "Account Miei" + "message": "Miei Account" }, "mustSelectOne": { "message": "Devi selezionare almeno un token." @@ -469,6 +658,9 @@ "networks": { "message": "Reti" }, + "nevermind": { + "message": "Non importa" + }, "newAccount": { "message": "Nuovo Account" }, @@ -482,6 +674,9 @@ "newPassword": { "message": "Nuova Password (minimo 8 caratteri)" }, + "newPassword8Chars": { + "message": "Nuova Password (minimo 8 caratteri)" + }, "newRecipient": { "message": "Nuovo Destinatario" }, @@ -489,7 +684,7 @@ "message": "Nuovo URL RPC" }, "next": { - "message": "Prossimo" + "message": "Avanti" }, "noAddressForName": { "message": "Nessun indirizzo è stato impostato per questo nome." @@ -497,32 +692,75 @@ "noDeposits": { "message": "Nessun deposito ricevuto" }, + "noConversionRateAvailable": { + "message": "Tasso di Conversione non Disponibile" + }, "noTransactionHistory": { "message": "Nessuna cronologia delle transazioni." }, "noTransactions": { "message": "Nessuna Transazione" }, + "notFound": { + "message": "Non Trovata" + }, "notStarted": { "message": "Non Iniziato" }, + "noWebcamFoundTitle": { + "message": "Webcam non trovata" + }, + "noWebcamFound": { + "message": "La webcam del tuo computer non è stata trovata. Per favore riprovaci." + }, "oldUI": { "message": "Vecchia interfaccia" }, "oldUIMessage": { "message": "Sei ritornato alla vecchia interfaccia. Puoi ritornare alla nuova interfaccia tramite l'opzione nel menu a discesa in alto a destra." }, + "onlySendToEtherAddress": { + "message": "Invia ETH solamente ad un account Ethereum." + }, + "onlySendTokensToAccountAddress": { + "message": "Invia solamente $1 ad un account Ethereum.", + "description": "mostra il simbolo del token" + }, + "openInTab": { + "message": "Apri in una scheda" + }, "or": { "message": "o", "description": "scelta tra creare o importare un nuovo account" }, + "orderOneHere": { + "message": "Compra un Trezor o un Ledger e tieni i tuoi soldi al sicuro" + }, + "origin": { + "message": "Origine" + }, + "outgoing": { + "message": "In Uscita" + }, + "parameters": { + "message": "Parametri" + }, + "password": { + "message": "Password" + }, "passwordCorrect": { "message": "Assicurati che la password sia corretta." }, + "passwordsDontMatch": { + "message": "Le Password Non Corrispondonos" + }, "passwordMismatch": { "message": "le password non corrispondono", "description": "nella creazione della password, le due password all'interno dei campi non corrispondono" }, + "passwordNotLongEnough": { + "message": "Password non abbastanza lunga" + }, "passwordShort": { "message": "password non sufficientemente lunga", "description": "nella creazione della password, la password non è lunga abbastanza" @@ -534,12 +772,21 @@ "pasteSeed": { "message": "Incolla la tua frase seed qui!" }, + "pending": { + "message": "in corso" + }, "personalAddressDetected": { "message": "Rilevato indirizzo personale. Inserisci l'indirizzo del contratto del token." }, "pleaseReviewTransaction": { "message": "Ricontrolla la tua transazione." }, + "popularTokens": { + "message": "Tokens Popolari" + }, + "prev": { + "message": "Precedente" + }, "privacyMsg": { "message": "Politica sulla Privacy" }, @@ -556,6 +803,9 @@ "qrCode": { "message": "Mostra Codice QR" }, + "queue": { + "message": "Coda" + }, "readdToken": { "message": "Puoi aggiungere nuovamente questo token in futuro andando in “Aggiungi token” nel menu delle opzioni del tuo account." }, @@ -574,36 +824,87 @@ "refundAddress": { "message": "Indirizzo di Rimborso" }, + "reject": { + "message": "Reject" + }, + "rejectAll": { + "message": "Reject All" + }, + "rejectTxsN": { + "message": "Reject $1 transactions" + }, + "rejectTxsDescription": { + "message": "You are about to batch reject $1 transactions." + }, "rejected": { "message": "Respinta" }, + "reset": { + "message": "Reset" + }, "resetAccount": { "message": "Resetta Account" }, + "resetAccountDescription": { + "message": "Resettare il tuo account cancellerà lo storico delle transazioni." + }, "restoreFromSeed": { "message": "Ripristina da una frase seed" }, + "restoreVault": { + "message": "Ripristina Cassaforte" + }, + "restoreAccountWithSeed": { + "message": "Ripristina Account con la Frase Seed" + }, "required": { "message": "Richiesto" }, "retryWithMoreGas": { "message": "Riprova con un prezzo del Gas maggiore qui" }, + "restore": { + "message": "Ripristina" + }, "revealSeedWords": { "message": "Rivela Frase Seed" }, + "revealSeedWordsTitle": { + "message": "Frase Seed" + }, + "revealSeedWordsDescription": { + "message": "Se cambierai browser o computer, ti servirà questa frase seed per accedere ai tuoi account. Salvala in un posto sicuro e segreto." + }, + "revealSeedWordsWarningTitle": { + "message": "NON CONDIVIDERE questa frase con nessuno!" + }, "revealSeedWordsWarning": { "message": "Non ripristinare la tua frase seed in pubblico!. Queste parole possono essere usate per rubare il tuo account." }, "revert": { "message": "Annulla" }, + "remove": { + "message": "rimuovi" + }, + "removeAccount": { + "message": "Rimuovi account" + }, + "removeAccountDescription": { + "message": "Questo account sarà rimosso dal tuo portafoglio. Per favore assicurati che hai la frase seed originale o la chiave privata per questo account importato prima di continuare. Puoi nuovamente importare o creare un account dal menù a tendina. " + }, + "readyToConnect": { + "message": "Pronto a Connetterti?" + }, "rinkeby": { "message": "Rete di test Rinkeby" }, "ropsten": { "message": "Rete di test Ropsten" }, + "rpc": { + "message": "RPC Personalizzata" + }, "sampleAccountName": { "message": "Es: Il mio nuovo account", "description": "Aiuta l'utente a capire il concetto di aggiungere un nome leggibile al loro account" @@ -611,6 +912,9 @@ "save": { "message": "Salva" }, + "saveAsCsvFile": { + "message": "Salva Come File CSV" + }, "saveAsFile": { "message": "Salva come File", "description": "Processo per esportare un account" @@ -618,9 +922,18 @@ "saveSeedAsFile": { "message": "Salva la Frase Seed come File" }, + "scanInstructions": { + "message": "Posizione il codice QR davanti alla fotocamera" + }, + "scanQrCode": { + "message": "Scansiona Codice QR" + }, "search": { "message": "Cerca" }, + "searchResults": { + "message": "Risultati Ricerca" + }, "secretPhrase": { "message": "Inserisci la tua frase segreta di dodici parole per ripristinare la cassaforte." }, @@ -633,6 +946,9 @@ "selectCurrency": { "message": "Seleziona Moneta" }, + "selectLocale": { + "message": "Selezione Lingua" + }, "selectService": { "message": "Seleziona Servizio" }, @@ -648,6 +964,33 @@ "sendTokens": { "message": "Invia Tokens" }, + "sentEther": { + "message": "ether inviati" + }, + "sentTokens": { + "message": "tokens inviati" + }, + "separateEachWord": { + "message": "Separa ogni parola con un solo spazio" + }, + "searchTokens": { + "message": "Cerca Tokens" + }, + "selectAnAddress": { + "message": "Seleziona un Indirizzo" + }, + "selectAnAccount": { + "message": "Seleziona un Account" + }, + "selectAnAccountHelp": { + "message": "Selezione l'account da visualizzare in MetaMask" + }, + "selectHdPath": { + "message": "Seleziona Percorso HD" + }, + "selectPathHelp": { + "message": "Se non vedi il tuo account Ledger esistente di seguito, prova a cambiare il percorso in \"Legacy (MEW / MyCrypto)\"" + }, "sendTokensAnywhere": { "message": "Invia Tokens a chiunque abbia un account Ethereum" }, @@ -663,9 +1006,21 @@ "showQRCode": { "message": "Mostra Codie QR" }, + "showHexData": { + "message": "Mostra Dati Hex" + }, + "showHexDataDescription": { + "message": "Seleziona per mostrare il campo dei dati hex nella schermata di invio" + }, "sign": { "message": "Firma" }, + "signatureRequest": { + "message": "Firma Richiesta" + }, + "signed": { + "message": "Firmata" + }, "signMessage": { "message": "Firma Messaggio" }, @@ -681,6 +1036,15 @@ "spaceBetween": { "message": "ci può essere solo uno spazio tra le parole" }, + "speedUp": { + "message": "velocizza" + }, + "speedUpTitle": { + "message": "Velocizza Transazione" + }, + "speedUpSubtitle": { + "message": "Aumenta il prezzo del gas per tentare di sovrascrivere e velocizzare la transazione" + }, "status": { "message": "Stato" }, @@ -690,9 +1054,33 @@ "stateLogsDescription": { "message": "I log di stato contengono i tuoi indirizzi pubblici e le transazioni effettuate." }, + "stateLogError": { + "message": "Errore nel recupero dei log di stato." + }, + "step1HardwareWallet": { + "message": "1. Connetti Portafoglio Hardware" + }, + "step1HardwareWalletMsg": { + "message": "Connetti il tuo portafoglio hardware al tuo computer." + }, + "step2HardwareWallet": { + "message": "2. Seleziona un Account" + }, + "step2HardwareWalletMsg": { + "message": "Selezione l'account che vuoi vedere. Puoi selezionarne solo uno alla volta." + }, + "step3HardwareWallet": { + "message": "3. Inizia a usare dApps e molto altro ancora!" + }, + "step3HardwareWalletMsg": { + "message": "Usa il tuo account hardware come utilizzeresti qualsiasi account Ethereum. Accedi alle dApps, invia Eth, compra e conserva token ERC20 e token non fungibili come CryptoKitties" + }, "submit": { "message": "Invia" }, + "submitted": { + "message": "Inviata" + }, "supportCenter": { "message": "Visita il nostro Centro di Supporto" }, @@ -715,6 +1103,9 @@ "message": "$1 a ETH via ShapeShift", "description": "il sistema riempirà il tipo di deposito all'inizio del messaggio" }, + "token": { + "message": "Token" + }, "tokenAddress": { "message": "Indirizzo Token" }, @@ -736,22 +1127,61 @@ "total": { "message": "Totale" }, + "transaction": { + "message": "transazione" + }, + "transactionConfirmed": { + "message": "Transazione confermata il $2." + }, + "transactionCreated": { + "message": "Transazione di valore $1 creata il $2." + }, + "transactionWithNonce": { + "message": "Transazione $1" + }, + "transactionDropped": { + "message": "Transazione abbandonata il $2." + }, + "transactionSubmitted": { + "message": "Transazione inviata il $2." + }, + "transactionUpdated": { + "message": "Transazione aggiornata il $2." + }, + "transactionUpdatedGas": { + "message": "Transazione aggiornata con un prezzo del gas di $1 il $2." + }, "transactions": { "message": "transazioni" }, + "transactionError": { + "message": "Errore Transazione. Eccceziona generata nel codice del contratto." + }, "transactionMemo": { "message": "Promemoria Transazione (opzionale)" }, "transactionNumber": { "message": "Numero Transazione" }, + "transfer": { + "message": "Trasferisci" + }, + "transferFrom": { + "message": "Transfer From" + }, "transfers": { "message": "Trasferimenti" }, + "trezorHardwareWallet": { + "message": "TREZOR Portafoglio Hardware" + }, "troubleTokenBalances": { "message": "Abbiamo avuto un problema a caricare il bilancio dei tuoi token. Puoi vederlo ", "description": "Seguito da un link (qui) per vedere il bilancio dei token" }, + "tryAgain": { + "message": "Prova di nuovo" + }, "twelveWords": { "message": "Queste 12 parole sono l'unico modo per ripristinare i tuoi account MetaMask. \nSalvale in un posto sicuro e segreto." }, @@ -764,18 +1194,45 @@ "uiWelcomeMessage": { "message": "Stai utilizzanto la nuova interfaccia di MetaMask. Guarda in giro, prova nuove funzionalità come inviare token, e facci sapere se hai dei problemi." }, + "unapproved": { + "message": "Non approvata" + }, "unavailable": { "message": "Non Disponibile" }, + "units": { + "message": "unità" + }, "unknown": { "message": "Sconosciuto" }, + "unknownFunction": { + "message": "Funzione Sconosciuta" + }, "unknownNetwork": { "message": "Rete Privata Sconosciuta" }, "unknownNetworkId": { "message": "ID rete sconosciuto" }, + "unknownQrCode": { + "message": "Errore: Non siamo riusciti a identificare il codice QR" + }, + "unknownCameraErrorTitle": { + "message": "Ooops! Qualcosa è andato storto...." + }, + "unknownCameraError": { + "message": "C'è stato un errore nel tentativo di accedere alla fotocamera. Per favore prova di nuovo..." + }, + "unlock": { + "message": "Sblocca" + }, + "unlockMessage": { + "message": "Il web decentralizzato ti attende" + }, + "updatedWithDate": { + "message": "Aggiornata $1" + }, "uriErrorMsg": { "message": "Gli URI richiedono un prefisso HTTP/HTTPS." }, @@ -798,22 +1255,40 @@ "viewAccount": { "message": "Vedi Account" }, + "viewOnEtherscan": { + "message": "Vedi su Etherscan" + }, "visitWebSite": { "message": "Visita il nostro sito web" }, + "walletSeed": { + "message": "Seed del Portafoglio" + }, "warning": { "message": "Attenzione" }, + "welcomeBack": { + "message": "Bentornato!" + }, "welcomeBeta": { "message": "Benvenuto nella Beta di MetaMask" }, "whatsThis": { "message": "Cos'è questo?" }, + "yesLetsTry": { + "message": "Si, proviamo" + }, + "youNeedToAllowCameraAccess": { + "message": "Devi consentire l'accesso alla fotocamera per usare questa funzionalità." + }, "yourSigRequested": { "message": "E' richiesta la tua firma" }, "youSign": { "message": "Ti stai connettendo" + }, + "yourPrivateSeedPhrase": { + "message": "La tua frase seed privata" } } diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index 55549bb87..c8d470188 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -14,9 +14,15 @@ "accountName": { "message": "계정 이름" }, + "accountOptions": { + "message": "계정 옵션" + }, "accountSelectionRequired": { "message": "계정을 선택하셔야 합니다!" }, + "activityLog": { + "message": "활동 로그" + }, "address": { "message": "주소" }, @@ -29,6 +35,9 @@ "addTokens": { "message": "토큰 추가" }, + "addSuggestedTokens": { + "message": "제안된 토큰 추가" + }, "addAcquiredTokens": { "message": "메타마스크를 통해 획득한 토큰 추가" }, @@ -55,6 +64,9 @@ "attemptingConnect": { "message": "블록체인에 접속을 시도하는 중입니다." }, + "attemptToCancel": { + "message": "취소 하시겠습니까?" + }, "attributions": { "message": "속성" }, @@ -110,6 +122,15 @@ "cancel": { "message": "취소" }, + "cancelAttempt": { + "message": "취소 시도" + }, + "cancellationGasFee": { + "message": "취소 가스 수수료" + }, + "cancelN": { + "message": "모든 $1 트랜잭션 취소" + }, "classicInterface": { "message": "예전 인터페이스" }, @@ -220,7 +241,10 @@ "description": "거래 유형 (암호화폐)" }, "currentConversion": { - "message": "선택된 단위" + "message": "현재 통화" + }, + "currentLanguage": { + "message": "현재 언어" }, "currentNetwork": { "message": "현재 네트워크" @@ -340,6 +364,9 @@ "exchangeRate": { "message": "환율" }, + "expandView": { + "message": "큰 화면으로 보기" + }, "exportPrivateKey": { "message": "개인키 내보내기" }, @@ -457,6 +484,9 @@ "hideTokenPrompt": { "message": "토큰 숨기기?" }, + "history": { + "message": "히스토리" + }, "howToDeposit": { "message": "어떤 방법으로 이더를 입금하시겠습니까?" }, @@ -486,6 +516,9 @@ "importUsingSeed": { "message": "계정 시드 구문으로 가져오기" }, + "info": { + "message": "정보" + }, "infoHelp": { "message": "정보 및 도움말" }, @@ -539,7 +572,7 @@ "message": "최대" }, "learnMore": { - "message": "더 배우기." + "message": "더 알아보기." }, "ledgerAccountRestriction": { "message": "새 계정을 추가하려면 최소 마지막 계정을 사용해야 합니다." @@ -590,6 +623,9 @@ "metamaskDescription": { "message": "메타마스크는 이더리움을 위한 안전한 신분 저장소입니다." }, + "metamaskVersion": { + "message": "메타마스크 버전" + }, "metamaskSeedWords": { "message": "메타마스크 시드 단어" }, @@ -610,7 +646,7 @@ "description": "사용자는 계정을 가져오기 위해서 파일을 추가후 계속 진행해야 합니다" }, "needImportPassword": { - "message": "선택 된 파일에 대한 비밀번호를 입력해주세요.", + "message": "선택된 파일에 대한 비밀번호를 입력해주세요.", "description": "계정을 가져오기 위해서 비밀번호와 파일이 필요합니다." }, "negativeETH": { @@ -727,6 +763,9 @@ "pasteSeed": { "message": "시드 구문을 이곳에 붙여넣어 주세요!" }, + "pending": { + "message": "펜딩 중" + }, "personalAddressDetected": { "message": "개인 주소가 탐지됨. 토큰 컨트랙트 주소를 입력하세요." }, @@ -755,6 +794,9 @@ "qrCode": { "message": "QR 코드 보기" }, + "queue": { + "message": "큐" + }, "readdToken": { "message": "옵션 메뉴에서 “토큰 추가”를 눌러서 추후에 다시 이 토큰을 추가하실 수 있습니다." }, @@ -773,6 +815,18 @@ "refundAddress": { "message": "환불받을 주소" }, + "reject": { + "message": "거부" + }, + "rejectAll": { + "message": "모두 거부" + }, + "rejectTxsN": { + "message": "$1 트랜잭션 거부" + }, + "rejectTxsDescription": { + "message": "$1 트랜잭션을 거부합니다." + }, "rejected": { "message": "거부됨" }, @@ -892,6 +946,9 @@ "selectCurrency": { "message": "통화 선택" }, + "selectLocale": { + "message": "언어 선택" + }, "selectService": { "message": "서비스 선택" }, @@ -907,6 +964,12 @@ "sendTokens": { "message": "토큰 전송" }, + "sentEther": { + "message": "전송된 이더" + }, + "sentTokens": { + "message": "전송된 토큰" + }, "separateEachWord": { "message": "각 단어는 공백 한칸으로 분리합니다" }, @@ -934,9 +997,6 @@ "settings": { "message": "설정" }, - "info": { - "message": "정보" - }, "shapeshiftBuy": { "message": "Shapeshift를 통해서 구매하기" }, @@ -946,12 +1006,21 @@ "showQRCode": { "message": "QR 코드 보기" }, + "showHexData": { + "message": "Hex 데이터 보기" + }, + "showHexDataDescription": { + "message": "선택하면 전송화면의 hex 데이터 필드 값을 보여줍니다." + }, "sign": { "message": "서명" }, "signed": { "message": "서명됨" }, + "signatureRequest": { + "message": "서명 요청" + }, "signMessage": { "message": "메시지 서명" }, @@ -1049,6 +1118,9 @@ "total": { "message": "합계" }, + "transaction": { + "message": "트랜잭션" + }, "transactions": { "message": "트랜잭션" }, @@ -1095,6 +1167,9 @@ "unavailable": { "message": "이용할 수 없음" }, + "units": { + "message": "단위" + }, "unknown": { "message": "알 수 없음" }, @@ -1165,11 +1240,14 @@ "whatsThis": { "message": "이것은 무엇인가요?" }, + "yesLetsTry": { + "message": "네, 시도해보겠습니다." + }, "yourSigRequested": { "message": "서명을 요청 중입니다." }, "youSign": { - "message": "서명 중입니다" + "message": "서명합니다" }, "yourPrivateSeedPhrase": { "message": "개인 시드 구문" diff --git a/app/scripts/controllers/transactions/index.js b/app/scripts/controllers/transactions/index.js index a57c85f50..9f2290924 100644 --- a/app/scripts/controllers/transactions/index.js +++ b/app/scripts/controllers/transactions/index.js @@ -366,7 +366,40 @@ class TransactionController extends EventEmitter { this.txStateManager.setTxStatusSubmitted(txId) } - confirmTransaction (txId) { + /** + * Sets the status of the transaction to confirmed and sets the status of nonce duplicates as + * dropped if the txParams have data it will fetch the txReceipt + * @param {number} txId - The tx's ID + * @returns {Promise<void>} + */ + async confirmTransaction (txId) { + // get the txReceipt before marking the transaction confirmed + // to ensure the receipt is gotten before the ui revives the tx + const txMeta = this.txStateManager.getTx(txId) + + if (!txMeta) { + return + } + + try { + const txReceipt = await this.query.getTransactionReceipt(txMeta.hash) + + // It seems that sometimes the numerical values being returned from + // this.query.getTransactionReceipt are BN instances and not strings. + const gasUsed = typeof txReceipt.gasUsed !== 'string' + ? txReceipt.gasUsed.toString(16) + : txReceipt.gasUsed + + txMeta.txReceipt = { + ...txReceipt, + gasUsed, + } + + this.txStateManager.updateTx(txMeta, 'transactions#confirmTransaction - add txReceipt') + } catch (err) { + log.error(err) + } + this.txStateManager.setTxStatusConfirmed(txId) this._markNonceDuplicatesDropped(txId) } diff --git a/app/scripts/controllers/transactions/tx-state-manager.js b/app/scripts/controllers/transactions/tx-state-manager.js index daa6cc388..58c48e34e 100644 --- a/app/scripts/controllers/transactions/tx-state-manager.js +++ b/app/scripts/controllers/transactions/tx-state-manager.js @@ -400,6 +400,11 @@ class TransactionStateManager extends EventEmitter { */ _setTxStatus (txId, status) { const txMeta = this.getTx(txId) + + if (!txMeta) { + return + } + txMeta.status = status setTimeout(() => { try { diff --git a/ui/app/components/transaction-activity-log/transaction-activity-log.util.js b/ui/app/components/transaction-activity-log/transaction-activity-log.util.js index 32834ff47..97aa9a8f1 100644 --- a/ui/app/components/transaction-activity-log/transaction-activity-log.util.js +++ b/ui/app/components/transaction-activity-log/transaction-activity-log.util.js @@ -46,11 +46,15 @@ export function getActivities (transaction) { if (!Array.isArray(base) && base.status === UNAPPROVED_STATUS && base.txParams) { const { time, txParams: { value } = {} } = base return acc.concat(eventCreator(TRANSACTION_CREATED_EVENT, time, value)) + // An entry in the history may be an array of more sub-entries. } else if (Array.isArray(base)) { const events = [] base.forEach(entry => { - const { op, path, value, timestamp } = entry + const { op, path, value, timestamp: entryTimestamp } = entry + // Not all sub-entries in a history entry have a timestamp. If the sub-entry does not have a + // timestamp, the first sub-entry in a history entry should. + const timestamp = entryTimestamp || base[0] && base[0].timestamp if (path in eventPathsHash && op === REPLACE_OP) { switch (path) { diff --git a/ui/app/components/transaction-breakdown/transaction-breakdown.component.js b/ui/app/components/transaction-breakdown/transaction-breakdown.component.js index bb6075e9f..5a2b4a481 100644 --- a/ui/app/components/transaction-breakdown/transaction-breakdown.component.js +++ b/ui/app/components/transaction-breakdown/transaction-breakdown.component.js @@ -26,8 +26,11 @@ export default class TransactionBreakdown extends PureComponent { render () { const { t } = this.context const { transaction, className } = this.props - const { txParams: { gas, gasPrice, value } = {} } = transaction - const hexGasTotal = getHexGasTotal({ gasLimit: gas, gasPrice }) + const { txParams: { gas, gasPrice, value } = {}, txReceipt: { gasUsed } = {} } = transaction + + const gasLimit = typeof gasUsed === 'string' ? gasUsed : gas + + const hexGasTotal = getHexGasTotal({ gasLimit, gasPrice }) const totalInHex = sumHexes(hexGasTotal, value) return ( @@ -52,6 +55,19 @@ export default class TransactionBreakdown extends PureComponent { value={gas} /> </TransactionBreakdownRow> + { + typeof gasUsed === 'string' && ( + <TransactionBreakdownRow + title={`${t('gasUsed')} (${t('units')})`} + className="transaction-breakdown__row-title" + > + <HexToDecimal + className="transaction-breakdown__value" + value={gasUsed} + /> + </TransactionBreakdownRow> + ) + } <TransactionBreakdownRow title={t('gasPrice')}> <CurrencyDisplay className="transaction-breakdown__value" diff --git a/ui/app/components/transaction-list-item/transaction-list-item.component.js b/ui/app/components/transaction-list-item/transaction-list-item.component.js index c1c69f59b..40eef5e15 100644 --- a/ui/app/components/transaction-list-item/transaction-list-item.component.js +++ b/ui/app/components/transaction-list-item/transaction-list-item.component.js @@ -11,6 +11,7 @@ import { CONFIRM_TRANSACTION_ROUTE } from '../../routes' import { UNAPPROVED_STATUS, TOKEN_METHOD_TRANSFER } from '../../constants/transactions' import { ETH } from '../../constants/common' import { ENVIRONMENT_TYPE_FULLSCREEN } from '../../../../app/scripts/lib/enums' +import { getStatusKey } from '../../helpers/transactions.util' export default class TransactionListItem extends PureComponent { static propTypes = { @@ -167,7 +168,7 @@ export default class TransactionListItem extends PureComponent { </div> <TransactionStatus className="transaction-list-item__status" - statusKey={transaction.status} + statusKey={getStatusKey(transaction)} title={( (transaction.err && transaction.err.rpc) ? transaction.err.rpc.message diff --git a/ui/app/components/transaction-status/index.scss b/ui/app/components/transaction-status/index.scss index 35be550f7..26a1f5d38 100644 --- a/ui/app/components/transaction-status/index.scss +++ b/ui/app/components/transaction-status/index.scss @@ -25,4 +25,9 @@ background-color: #FFF2DB; color: #CA810A; } -}
\ No newline at end of file + + &--failed { + background: lighten($monzo, 56%); + color: $monzo; + } +} diff --git a/ui/app/helpers/tests/transactions.util.test.js b/ui/app/helpers/tests/transactions.util.test.js index 103a84a8c..838522e35 100644 --- a/ui/app/helpers/tests/transactions.util.test.js +++ b/ui/app/helpers/tests/transactions.util.test.js @@ -19,4 +19,39 @@ describe('Transactions utils', () => { assert.doesNotThrow(() => utils.getTokenData()) }) }) + + describe('getStatusKey', () => { + it('should return the correct status', () => { + const tests = [ + { + transaction: { + status: 'confirmed', + txReceipt: { + status: '0x0', + }, + }, + expected: 'failed', + }, + { + transaction: { + status: 'confirmed', + txReceipt: { + status: '0x1', + }, + }, + expected: 'confirmed', + }, + { + transaction: { + status: 'pending', + }, + expected: 'pending', + }, + ] + + tests.forEach(({ transaction, expected }) => { + assert.equal(utils.getStatusKey(transaction), expected) + }) + }) + }) }) diff --git a/ui/app/helpers/transactions.util.js b/ui/app/helpers/transactions.util.js index f7d249e63..e50196196 100644 --- a/ui/app/helpers/transactions.util.js +++ b/ui/app/helpers/transactions.util.js @@ -126,3 +126,21 @@ export function sumHexes (...args) { return ethUtil.addHexPrefix(total) } + +/** + * Returns a status key for a transaction. Requires parsing the txMeta.txReceipt on top of + * txMeta.status because txMeta.status does not reflect on-chain errors. + * @param {Object} transaction - The txMeta object of a transaction. + * @param {Object} transaction.txReceipt - The transaction receipt. + * @returns {string} + */ +export function getStatusKey (transaction) { + const { txReceipt: { status } = {} } = transaction + + // There was an on-chain failure + if (status === '0x0') { + return 'failed' + } + + return transaction.status +} |