aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md11
-rw-r--r--app/_locales/en/messages.json15
-rw-r--r--app/_locales/sl/messages.json819
-rw-r--r--app/_locales/th/messages.json819
-rw-r--r--app/_locales/zh_TW/messages.json864
-rw-r--r--app/manifest.json2
-rw-r--r--app/scripts/background.js2
-rw-r--r--app/scripts/migrations/022.js39
-rw-r--r--app/scripts/migrations/index.js1
-rw-r--r--mascara/src/app/first-time/index.css9
-rw-r--r--mascara/src/app/first-time/index.js7
-rw-r--r--test/integration/lib/add-token.js17
-rw-r--r--test/integration/lib/mascara-first-time.js6
-rw-r--r--test/integration/lib/send-new-ui.js1
-rw-r--r--test/unit/migrations/022-test.js32
-rw-r--r--ui/app/add-token.js182
-rw-r--r--ui/app/app.js6
-rw-r--r--ui/app/css/itcss/components/add-token.scss184
-rw-r--r--ui/app/css/itcss/components/request-signature.scss1
-rw-r--r--ui/app/css/itcss/settings/variables.scss1
-rw-r--r--yarn.lock44
21 files changed, 2922 insertions, 140 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 40d77bc9e..fa4493278 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,17 @@
## Current Master
+## 4.4.0 Mon Mar 26 2018
+
+- Internationalization: Taiwanese, Thai, Slovenian
+- Fixes bug where MetaMask would not open once its storage grew too large.
+- Updates design of new-ui Add Token screen
+- New-ui can send to ens addresses
+- Update new-ui button styles
+- Signed-type-data notification handles long messages
+- Popup extension in new-ui uses new on-boarding designs
+- Buy ether step of new-ui on-boarding uses new buy ether modal designs
+
## 4.3.0 Wed Mar 21 2018
- (beta) Add internationalization support! Includes translations for 13 (!!) new languages: French, Spanish, Italian, German, Dutch, Portuguese, Japanese, Korean, Vietnamese, Mandarin, Hindi, Tagalog, and Russian! Select "Try Beta" in the menu to take them for a spin. Read more about the community effort [here](https://medium.com/gitcoin/metamask-internationalizes-via-gitcoin-bf1390c0301c)
diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json
index 9fac9c248..3e469cf44 100644
--- a/app/_locales/en/messages.json
+++ b/app/_locales/en/messages.json
@@ -171,6 +171,9 @@
"customGas": {
"message": "Customize Gas"
},
+ "customToken": {
+ "message": "Custom Token"
+ },
"customize": {
"message": "Customize"
},
@@ -415,6 +418,9 @@
"message": "JSON File",
"description": "format for importing an account"
},
+ "keepTrackTokens": {
+ "message": "Keep track of the tokens you’ve bought with your MetaMask account."
+ },
"kovan": {
"message": "Kovan Test Network"
},
@@ -424,6 +430,9 @@
"max": {
"message": "Max"
},
+ "learnMore": {
+ "message": "Learn more."
+ },
"lessThanMax": {
"message": "must be less than or equal to $1.",
"description": "helper for inputting hex as decimal input"
@@ -564,6 +573,9 @@
"pleaseReviewTransaction": {
"message": "Please review your transaction."
},
+ "popularTokens": {
+ "message": "Popular Tokens"
+ },
"privacyMsg": {
"message": "Privacy Policy"
},
@@ -708,6 +720,9 @@
"onlySendToEtherAddress": {
"message": "Only send ETH to an Ethereum address."
},
+ "searchTokens": {
+ "message": "Search Tokens"
+ },
"sendTokensAnywhere": {
"message": "Send Tokens to anyone with an Ethereum account"
},
diff --git a/app/_locales/sl/messages.json b/app/_locales/sl/messages.json
new file mode 100644
index 000000000..0532f11b2
--- /dev/null
+++ b/app/_locales/sl/messages.json
@@ -0,0 +1,819 @@
+{
+ "accept": {
+ "message": "Sprejmi"
+ },
+ "account": {
+ "message": "Račun"
+ },
+ "accountDetails": {
+ "message": "Podrobnosti računa"
+ },
+ "accountName": {
+ "message": "Ime računa"
+ },
+ "address": {
+ "message": "Naslov"
+ },
+ "addCustomToken": {
+ "message": "Dodaj žeton po meri"
+ },
+ "addToken": {
+ "message": "Dodaj žeton"
+ },
+ "addTokens": {
+ "message": "Dodaj žetone"
+ },
+ "amount": {
+ "message": "Znesek"
+ },
+ "amountPlusGas": {
+ "message": "Znesek + Gas"
+ },
+ "appDescription": {
+ "message": "Denarnica za Ethereum v brskalniku",
+ "description": "The description of the application"
+ },
+ "appName": {
+ "message": "MetaMask",
+ "description": "The name of the application"
+ },
+ "attemptingConnect": {
+ "message": "Povezovanje z verigo blokov ..."
+ },
+ "attributions": {
+ "message": "Dodelitve"
+ },
+ "available": {
+ "message": "Na voljo"
+ },
+ "back": {
+ "message": "Nazaj"
+ },
+ "balance": {
+ "message": "Znesek:"
+ },
+ "balances": {
+ "message": "Vaš znesek"
+ },
+ "balanceIsInsufficientGas": {
+ "message": "Napačen znesek za skupno gas vrednost"
+ },
+ "beta": {
+ "message": "BETA"
+ },
+ "betweenMinAndMax": {
+ "message": "mora biti večji ali enak $1 in manjši ali enak $1.",
+ "description": "helper for inputting hex as decimal input"
+ },
+ "blockiesIdenticon": {
+ "message": "Uporabite Blockies Identicon"
+ },
+ "borrowDharma": {
+ "message": "Izposoja z Dharma (Beta)"
+ },
+ "builtInCalifornia": {
+ "message": "MetaMask je ustvarjen v Kaliforniji."
+ },
+ "buy": {
+ "message": "Kupi"
+ },
+ "buyCoinbase": {
+ "message": "Kupi na Coinbase"
+ },
+ "buyCoinbaseExplainer": {
+ "message": "Coinbase je najpopularnejši načun za kupovanje in prodajo bitcoinov, ethereuma, in litecoina."
+ },
+ "cancel": {
+ "message": "Prekliči"
+ },
+ "classicInterface": {
+ "message": "Uporabi navaden način"
+ },
+ "clickCopy": {
+ "message": "Kliknite za kopiranje"
+ },
+ "confirm": {
+ "message": "Potrdi"
+ },
+ "confirmContract": {
+ "message": "Potrdi pogodbo"
+ },
+ "confirmPassword": {
+ "message": "Potrdi geslo"
+ },
+ "confirmTransaction": {
+ "message": "Potrdi transakcijo"
+ },
+ "continue": {
+ "message": "Nadaljuj"
+ },
+ "continueToCoinbase": {
+ "message": "Nadaljuj na Coinbase"
+ },
+ "contractDeployment": {
+ "message": "Ustvarjanje pogodbe"
+ },
+ "conversionProgress": {
+ "message": "Poteka pretvorba"
+ },
+ "copiedButton": {
+ "message": "Kopirano"
+ },
+ "copiedClipboard": {
+ "message": "Kopirano v odložišče"
+ },
+ "copiedExclamation": {
+ "message": "Kopirano!"
+ },
+ "copiedSafe": {
+ "message": "Prilepil sem ga na varno!"
+ },
+ "copy": {
+ "message": "Kopiraj"
+ },
+ "copyToClipboard": {
+ "message": "Kopiraj v odložišče"
+ },
+ "copyButton": {
+ "message": " Kopiraj "
+ },
+ "copyPrivateKey": {
+ "message": "To je vaš zesebni ključ (kliknite za kopiranje)"
+ },
+ "create": {
+ "message": "Ustvari"
+ },
+ "createAccount": {
+ "message": "Ustvari račun"
+ },
+ "createDen": {
+ "message": "Ustvari"
+ },
+ "crypto": {
+ "message": "Kripto",
+ "description": "Exchange type (cryptocurrencies)"
+ },
+ "currentConversion": {
+ "message": "Trenutna cena"
+ },
+ "currentNetwork": {
+ "message": "Trenutno omrežje"
+ },
+ "customGas": {
+ "message": "Prilagodi gas"
+ },
+ "customize": {
+ "message": "Prilagodi"
+ },
+ "customRPC": {
+ "message": "Poljuben RPC"
+ },
+ "decimalsMustZerotoTen": {
+ "message": "Decimalk mora biti vsaj 0, in ne več kot 36."
+ },
+ "decimal": {
+ "message": "Decimalke natančnosti"
+ },
+ "defaultNetwork": {
+ "message": "Privzeto omrežje za transakcije je Main Net."
+ },
+ "denExplainer": {
+ "message": "DEN je vaša šifrirana shramba v MetaMasku."
+ },
+ "deposit": {
+ "message": "Vplačilo"
+ },
+ "depositBTC": {
+ "message": "Vplačajte vaš BTC na spodnji naslov:"
+ },
+ "depositCoin": {
+ "message": "Vplačajte $1 na spodnji naslov",
+ "description": "Tells the user what coin they have selected to deposit with shapeshift"
+ },
+ "depositEth": {
+ "message": "Vplačilo ETH"
+ },
+ "depositEther": {
+ "message": "Vplačilo ethera"
+ },
+ "depositFiat": {
+ "message": "Vplačilo s klasičnimi valutami"
+ },
+ "depositFromAccount": {
+ "message": "Vplačilo iz drugega računa"
+ },
+ "depositShapeShift": {
+ "message": "Vplačilo z ShapeShift"
+ },
+ "depositShapeShiftExplainer": {
+ "message": "Če imate druge kriptovalute, lahko vpačate ether neposredno v MetaMask. Brez računov."
+ },
+ "details": {
+ "message": "Podrobnosti"
+ },
+ "directDeposit": {
+ "message": "Direktno vplačilo"
+ },
+ "directDepositEther": {
+ "message": "Direktno vplačilo ehera"
+ },
+ "directDepositEtherExplainer": {
+ "message": "Če že imate ether, ga lahko najhitreje dobite v MetaMask z direktnim vplačilom."
+ },
+ "done": {
+ "message": "Končano"
+ },
+ "downloadStatelogs": {
+ "message": "Prenesi state dnevnike"
+ },
+ "edit": {
+ "message": "Uredi"
+ },
+ "editAccountName": {
+ "message": "Uredi ime računa"
+ },
+ "emailUs": {
+ "message": "Pišite nam!"
+ },
+ "encryptNewDen": {
+ "message": "Šifrirajte DEN"
+ },
+ "enterPassword": {
+ "message": "Vpišite geslo"
+ },
+ "enterPasswordConfirm": {
+ "message": "Potrdite geslo"
+ },
+ "etherscanView": {
+ "message": "Poglejte račun na Etherscan"
+ },
+ "exchangeRate": {
+ "message": "Menjalni tečaj"
+ },
+ "exportPrivateKey": {
+ "message": "Izvozi zasebni ključ"
+ },
+ "exportPrivateKeyWarning": {
+ "message": "Izvažanje zasebnih ključev je na lastno odgovornost."
+ },
+ "failed": {
+ "message": "Ni uspelo"
+ },
+ "fiat": {
+ "message": "FIAT",
+ "description": "Exchange type"
+ },
+ "fileImportFail": {
+ "message": "Uvoz z datoteko ni uspel? Kliknite tukaj!",
+ "description": "Helps user import their account from a JSON file"
+ },
+ "followTwitter": {
+ "message": "Sledite nam na Twitterju"
+ },
+ "from": {
+ "message": "Od"
+ },
+ "fromToSame": {
+ "message": "From and To address cannot be the same"
+ },
+ "fromShapeShift": {
+ "message": "Od ShapeShift"
+ },
+ "gas": {
+ "message": "Gas",
+ "description": "Short indication of gas cost"
+ },
+ "gasFee": {
+ "message": "Gas fee"
+ },
+ "gasLimit": {
+ "message": "Gas limit"
+ },
+ "gasLimitCalculation": {
+ "message": "Priporočen gas limit je izračunan glede na omrežje."
+ },
+ "gasLimitRequired": {
+ "message": "Gas limit je zahtevan"
+ },
+ "gasLimitTooLow": {
+ "message": "Gas limit mora biti najmanj 21000"
+ },
+ "generatingSeed": {
+ "message": "Ustvarjenje seed ..."
+ },
+ "gasPrice": {
+ "message": "Gas price (GWEI)"
+ },
+ "gasPriceCalculation": {
+ "message": "Priporočen gas price je izračunan glede na omrežje"
+ },
+ "gasPriceRequired": {
+ "message": "Gas price je zahtevan"
+ },
+ "getEther": {
+ "message": "Pridobite ether"
+ },
+ "getEtherFromFaucet": {
+ "message": "Pridobite ether iz fauceta za $1",
+ "description": "Displays network name for Ether faucet"
+ },
+ "greaterThanMin": {
+ "message": "mora biti višji ali enak $1.",
+ "description": "helper for inputting hex as decimal input"
+ },
+ "here": {
+ "message": "tukaj",
+ "description": "as in -click here- for more information (goes with troubleTokenBalances)"
+ },
+ "hereList": {
+ "message": "Tukaj je seznam!!!"
+ },
+ "hide": {
+ "message": "Skrij"
+ },
+ "hideToken": {
+ "message": "Skrij žeton"
+ },
+ "hideTokenPrompt": {
+ "message": "Skrijem žeton?"
+ },
+ "howToDeposit": {
+ "message": "Kako želite vplačati ether?"
+ },
+ "holdEther": {
+ "message": "Omogoča vam, da imate eter in žetone in služi kot most za decentralizirane aplikacije."
+ },
+ "import": {
+ "message": "Uvozi",
+ "description": "Button to import an account from a selected file"
+ },
+ "importAccount": {
+ "message": "Uvozi račun"
+ },
+ "importAccountMsg": {
+ "message":" Uvoženi računi ne bodo povezani s prvotnim seedphaseom. Preberite več o uvoženih računih "
+ },
+ "importAnAccount": {
+ "message": "Uvozi račun"
+ },
+ "importDen": {
+ "message": "Uvozi DEN"
+ },
+ "imported": {
+ "message": "Uvoženo",
+ "description": "status showing that an account has been fully loaded into the keyring"
+ },
+ "infoHelp": {
+ "message": "Info & Pomoč"
+ },
+ "insufficientFunds": {
+ "message": "Nezadostna sredstva."
+ },
+ "insufficientTokens": {
+ "message": "Nezadostni žetoni."
+ },
+ "invalidAddress": {
+ "message": "Nepravilen naslov"
+ },
+ "invalidAddressRecipient": {
+ "message": "Prejemnikov naslov je neveljaven"
+ },
+ "invalidGasParams": {
+ "message": "Nepravilno nastavljen gas"
+ },
+ "invalidInput": {
+ "message": "Napačen vnos."
+ },
+ "invalidRequest": {
+ "message": "Napačna zahteva"
+ },
+ "invalidRPC": {
+ "message": "Napačen RPC URI"
+ },
+ "jsonFail": {
+ "message": "Nekaj je bilo narobe. Prepričajte se, da je JSON datoteka pravilno oblikovana."
+ },
+ "jsonFile": {
+ "message": "JSON datoteka",
+ "description": "format for importing an account"
+ },
+ "kovan": {
+ "message": "Testno omrežje Kovan"
+ },
+ "knowledgeDataBase": {
+ "message": "Obiščite našo pomoč"
+ },
+ "lessThanMax": {
+ "message": "mora biti večji ali enak $1.",
+ "description": "helper for inputting hex as decimal input"
+ },
+ "likeToAddTokens": {
+ "message": "Želite dodati te žetone?"
+ },
+ "limit": {
+ "message": "Omejitev"
+ },
+ "loading": {
+ "message": "Nalaganje ..."
+ },
+ "loadingTokens": {
+ "message": "Nalaganje žetonov ..."
+ },
+ "localhost": {
+ "message": "Localhost 8545"
+ },
+ "login": {
+ "message": "Prijava"
+ },
+ "logout": {
+ "message": "Odjava"
+ },
+ "loose": {
+ "message": "Loose"
+ },
+ "loweCaseWords": {
+ "message": "seed words imajo lahko le male črke"
+ },
+ "mainnet": {
+ "message": "Glavno omrežje"
+ },
+ "message": {
+ "message": "Sporočilo"
+ },
+ "metamaskDescription": {
+ "message": "MetaMask je varen identitetni sklad za Ethereum."
+ },
+ "min": {
+ "message": "Najmanj"
+ },
+ "myAccounts": {
+ "message": "Moji računi"
+ },
+ "mustSelectOne": {
+ "message": "Izbran mora biti vsaj 1 žeton."
+ },
+ "needEtherInWallet": {
+ "message": "Za interakcijo z decentraliziranimi aplikacijami, ki uporabljajo MetaMask, boste v svoji denarnici potrebovali eter."
+ },
+ "needImportFile": {
+ "message": "Za uvoz morate izbrati datoteko.",
+ "description": "User is important an account and needs to add a file to continue"
+ },
+ "needImportPassword": {
+ "message": "Za izbrano datoteko morate vnesti geslo.",
+ "description": "Password and file needed to import an account"
+ },
+ "negativeETH": {
+ "message": "Ni mogoče poslati negativne vsote ETH."
+ },
+ "networks": {
+ "message": "Omrežja"
+ },
+ "newAccount": {
+ "message": "Nov račun"
+ },
+ "newAccountNumberName": {
+ "message": "Račun $1",
+ "description": "Default name of next account to be created on create account screen"
+ },
+ "newContract": {
+ "message": "Nova pogodba"
+ },
+ "newPassword": {
+ "message": "Novo geslo (min. 8. črk)"
+ },
+ "newRecipient": {
+ "message": "Nov prejemnik"
+ },
+ "newRPC": {
+ "message": "Nov RPC URL"
+ },
+ "next": {
+ "message": "Naprej"
+ },
+ "noAddressForName": {
+ "message": "Za to ime ni bil nastavljen noben naslov."
+ },
+ "noDeposits": {
+ "message": "Ni prejetih vplačil"
+ },
+ "noTransactionHistory": {
+ "message": "Ni zgodovine transakcij."
+ },
+ "noTransactions": {
+ "message": "Ni transakcij"
+ },
+ "notStarted": {
+ "message": "Ni se začelo"
+ },
+ "oldUI": {
+ "message": "Starejši uporabniški vmesnik"
+ },
+ "oldUIMessage": {
+ "message": "Vrnili ste se v starejši uporabniški vmesnik. V novega se lahko vrnete z možnostjo v spustnem meniju v zgornjem desnem kotu."
+ },
+ "or": {
+ "message": "ali",
+ "description": "choice between creating or importing a new account"
+ },
+ "passwordCorrect": {
+ "message": "Prepričajte se, da je geslo pravilno."
+ },
+ "passwordMismatch": {
+ "message": "gesli se ne ujemata",
+ "description": "in password creation process, the two new password fields did not match"
+ },
+ "passwordShort": {
+ "message": "geslo ni dovolj dolgo",
+ "description": "in password creation process, the password is not long enough to be secure"
+ },
+ "pastePrivateKey": {
+ "message": "Tukaj prilepite zasebni ključ:",
+ "description": "For importing an account from a private key"
+ },
+ "pasteSeed": {
+ "message": "Tukaj prilepite seed phrase!"
+ },
+ "personalAddressDetected": {
+ "message": "Osebni naslov je zaznan. Vnesite naslov žetona."
+ },
+ "pleaseReviewTransaction": {
+ "message": "Preglejte transakcijo."
+ },
+ "privacyMsg": {
+ "message": "Politika zasebnosti"
+ },
+ "privateKey": {
+ "message": "Zasebni ključ",
+ "description": "select this type of file to use to import an account"
+ },
+ "privateKeyWarning": {
+ "message": "Opozorilo: Nikoli ne razkrijte tega ključa. Vsakdo s svojimi zasebnimi ključi lahko ukrade vse premoženje v računu."
+ },
+ "privateNetwork": {
+ "message": "Zasebno omrežje"
+ },
+ "qrCode": {
+ "message": "Prikaži QR kodo"
+ },
+ "readdToken": {
+ "message": "Ta žeton lahko dodate tudi v prihodnosti, tako da odprete možnost »Dodaj žeton« v meniju z računi."
+ },
+ "readMore": {
+ "message": "Preberite več."
+ },
+ "readMore2": {
+ "message": "Preberite več."
+ },
+ "receive": {
+ "message": "Prejmite"
+ },
+ "recipientAddress": {
+ "message": "Prejemnikov naslov"
+ },
+ "refundAddress": {
+ "message": "Vaš naslov za vračilo"
+ },
+ "rejected": {
+ "message": "Zavrnjeno"
+ },
+ "resetAccount": {
+ "message": "Ponastavi račun"
+ },
+ "restoreFromSeed": {
+ "message": "Obnovi iz seed phrase"
+ },
+ "required": {
+ "message": "Zahtevano"
+ },
+ "retryWithMoreGas": {
+ "message": "Poskusi z višjim gas price"
+ },
+ "revealSeedWords": {
+ "message": "Prikaži seed words"
+ },
+ "revealSeedWordsWarning": {
+ "message": "Ne obnovite seed words na javnem mestu! Te besede se lahko uporabijo za krajo vseh vaših računov."
+ },
+ "revert": {
+ "message": "Povrni"
+ },
+ "rinkeby": {
+ "message": "Testno omrežje Rinkeby"
+ },
+ "ropsten": {
+ "message": "Testno omrežje Ropsten"
+ },
+ "sampleAccountName": {
+ "message": "npr. Moj nov račun",
+ "description": "Help user understand concept of adding a human-readable name to their account"
+ },
+ "save": {
+ "message": "Shrani"
+ },
+ "saveAsFile": {
+ "message": "Shrani kot datoteko",
+ "description": "Account export process"
+ },
+ "saveSeedAsFile": {
+ "message": "Shrani seed words kot datoteko"
+ },
+ "search": {
+ "message": "Iskanje"
+ },
+ "secretPhrase": {
+ "message": "Tukaj vnesite svoje seed words, da obnovite svoje račune."
+ },
+ "seedPhraseReq": {
+ "message": "seed phrases so dolgi 12 besed"
+ },
+ "select": {
+ "message": "Izberi"
+ },
+ "selectCurrency": {
+ "message": "Izberi valuto"
+ },
+ "selectService": {
+ "message": "Izberi storitev"
+ },
+ "selectType": {
+ "message": "Izberi vrsto"
+ },
+ "send": {
+ "message": "Pošlji"
+ },
+ "sendETH": {
+ "message": "Pošlji ETH"
+ },
+ "sendTokens": {
+ "message": "Pošlji žetone"
+ },
+ "sendTokensAnywhere": {
+ "message": "Pošljite žetone vsem, ki imajo Ethereum račun"
+ },
+ "settings": {
+ "message": "Nastavitve"
+ },
+ "shapeshiftBuy": {
+ "message": "Kupite z Shapeshift"
+ },
+ "showPrivateKeys": {
+ "message": "Prikaži zasebne ključe"
+ },
+ "showQRCode": {
+ "message": "Prikaži QR kodo"
+ },
+ "sign": {
+ "message": "Podpiši"
+ },
+ "signMessage": {
+ "message": "Podpiši sporočilo"
+ },
+ "signNotice": {
+ "message": "To podpisovanje lahko povzroči \nnevarne stranske učinke. Podpisujte samo sporočila \nstrani, ki jim zaupate s svojim celotnim računom.\n Ta nevarna funkcija bo odstranjena v prihodnji različici. "
+ },
+ "sigRequest": {
+ "message": "Zahteva za podpis"
+ },
+ "sigRequested": {
+ "message": "Podpis je zahtevan"
+ },
+ "spaceBetween": {
+ "message": "med besedami je lahko samo presledek"
+ },
+ "status": {
+ "message": "Status"
+ },
+ "stateLogs": {
+ "message": "State dnevniki"
+ },
+ "stateLogsDescription": {
+ "message": "State dnevniki vsebujejo naslove vašega računa in poslane transakcije.."
+ },
+ "submit": {
+ "message": "Potrdi"
+ },
+ "supportCenter": {
+ "message": "Obiščite našo podporo"
+ },
+ "symbolBetweenZeroTen": {
+ "message": "Simbol mora biti dolg od 0 do 10 znakov."
+ },
+ "takesTooLong": {
+ "message": "Traja predolgo?"
+ },
+ "terms": {
+ "message": "Pogoji uporabe"
+ },
+ "testFaucet": {
+ "message": "Testni faucet"
+ },
+ "to": {
+ "message": "Za"
+ },
+ "toETHviaShapeShift": {
+ "message": "$1 v ETH prek ShapeShift",
+ "description": "system will fill in deposit type in start of message"
+ },
+ "tokenAddress": {
+ "message": "Naslov žetona"
+ },
+ "tokenAlreadyAdded": {
+ "message": "Žeton je že bil dodan."
+ },
+ "tokenBalance": {
+ "message": "Vaš znesek žetona:"
+ },
+ "tokenSelection": {
+ "message": "Poiščite žetone ali jih izberite z našega seznama priljubljenih žetonov."
+ },
+ "tokenSymbol": {
+ "message": "Simbol žetona"
+ },
+ "tokenWarning1": {
+ "message": "Spremljajte žetone, ki ste jih kupili s svojim MetaMask računom. Če ste kupili žetone z drugačnim računom, ti žetoni ne bodo prikazani tukaj."
+ },
+ "total": {
+ "message": "Skupno"
+ },
+ "transactions": {
+ "message": "transakcije"
+ },
+ "transactionMemo": {
+ "message": "Opis transakcije (ni zahtevano)"
+ },
+ "transactionNumber": {
+ "message": "Številka transakcije"
+ },
+ "transfers": {
+ "message": "Prenosi"
+ },
+ "troubleTokenBalances": {
+ "message": "Imeli smo težave pri nalaganju vaših žetonov. Ogledate si jih lahko ",
+ "description": "Followed by a link (here) to view token balances"
+ },
+ "twelveWords": {
+ "message": "Edini način za obnovitev MetaMask računa, je teh 12 besed.\nShranite jih na varno in skrivno mesto."
+ },
+ "typePassword": {
+ "message": "Vpišite vaše geslo"
+ },
+ "uiWelcome": {
+ "message": "Dobrodošli v novem uporabniškem vmesniku (Beta)"
+ },
+ "uiWelcomeMessage": {
+ "message": "Zdaj uporabljate novi MetaMask uporabniški vmesnik. Razglejte se, preizkusite nove funkcije, kot so pošiljanje žetonov, in nas obvestite, če imate kakšne težave."
+ },
+ "unavailable": {
+ "message": "Ni na voljo"
+ },
+ "unknown": {
+ "message": "Neznano"
+ },
+ "unknownNetwork": {
+ "message": "Neznano zasebno omrežje"
+ },
+ "unknownNetworkId": {
+ "message": "Neznan ID omrežja"
+ },
+ "uriErrorMsg": {
+ "message": "URI-ji zahtevajo ustrezno HTTP/HTTPS predpono."
+ },
+ "usaOnly": {
+ "message": "Samo za ZDA",
+ "description": "Using this exchange is limited to people inside the USA"
+ },
+ "usedByClients": {
+ "message": "Uporablja jih več različnih odjemalcev"
+ },
+ "useOldUI": {
+ "message": "Uporabi star uporabniški vmesnik"
+ },
+ "validFileImport": {
+ "message": "Za uvoz morate izbrati pravilno datoteko."
+ },
+ "vaultCreated": {
+ "message": "Račun je ustvarjen"
+ },
+ "viewAccount": {
+ "message": "Poglej račun"
+ },
+ "visitWebSite": {
+ "message": "Obiščite našo spletno stran"
+ },
+ "warning": {
+ "message": "Opozorilo"
+ },
+ "welcomeBeta": {
+ "message": "Dobrodošli v MetaMask Beta"
+ },
+ "whatsThis": {
+ "message": "Kaj je to?"
+ },
+ "yourSigRequested": {
+ "message": "Vaš podpis je bil zahtevan"
+ },
+ "youSign": {
+ "message": "Podpisani ste"
+ }
+}
diff --git a/app/_locales/th/messages.json b/app/_locales/th/messages.json
new file mode 100644
index 000000000..887714f3f
--- /dev/null
+++ b/app/_locales/th/messages.json
@@ -0,0 +1,819 @@
+{
+ "accept": {
+ "message": "ยอมรับ"
+ },
+ "account": {
+ "message": "บัญชี"
+ },
+ "accountDetails": {
+ "message": "รายละเอียดบัญชี"
+ },
+ "accountName": {
+ "message": "ชื่อบัญชี"
+ },
+ "address": {
+ "message": "แอดเดรส"
+ },
+ "addCustomToken": {
+ "message": "เพิ่มโทเค็นด้วยตัวเอง"
+ },
+ "addToken": {
+ "message": "เพิ่มโทเค็น"
+ },
+ "addTokens": {
+ "message": "เพิ่มหลายโทเค็น"
+ },
+ "amount": {
+ "message": "จำนวน"
+ },
+ "amountPlusGas": {
+ "message": "จำนวน + แก๊ส"
+ },
+ "appDescription": {
+ "message": "ส่วนขยายเบราว์เซอร์สำหรับอีเธอเรียม",
+ "description": "The description of the application"
+ },
+ "appName": {
+ "message": "MetaMask",
+ "description": "The name of the application"
+ },
+ "attemptingConnect": {
+ "message": "กำลังเชื่อมต่อกับบล็อกเชน"
+ },
+ "attributions": {
+ "message": "อ้างถึง"
+ },
+ "available": {
+ "message": "ว่าง"
+ },
+ "back": {
+ "message": "กลับ"
+ },
+ "balance": {
+ "message": "ยอดคงเหลือ:"
+ },
+ "balances": {
+ "message": "ยอดคงเหลือของคุณ"
+ },
+ "balanceIsInsufficientGas": {
+ "message": "ยอดคงเหลือไม่พอสำหรับจ่ายค่าแก๊สทั้งหมด"
+ },
+ "beta": {
+ "message": "เบต้า"
+ },
+ "betweenMinAndMax": {
+ "message": "ต้องมากกว่าหรือเท่ากับ $1 และน้อยกว่าหรือเท่ากับ $2",
+ "description": "helper for inputting hex as decimal input"
+ },
+ "blockiesIdenticon": {
+ "message": "ใช้งาน Blockies Identicon"
+ },
+ "borrowDharma": {
+ "message": "ยืมด้วย Dharma (เบต้า)"
+ },
+ "builtInCalifornia": {
+ "message": "MetaMask ออกแบบและพัฒนาที่แคลิฟอร์เนีย"
+ },
+ "buy": {
+ "message": "ซื้อ"
+ },
+ "buyCoinbase": {
+ "message": "ซื้อด้วย Coinbase"
+ },
+ "buyCoinbaseExplainer": {
+ "message": "Coinbase เป็นแหล่งซื้อขายบิตคอยน์ไลท์คอยน์และอีเธอเรียมที่ได้รับความนิยมสูงสุดในโลก"
+ },
+ "cancel": {
+ "message": "ยกเลิก"
+ },
+ "classicInterface": {
+ "message": "ใช้หน้าตาแบบเก่า"
+ },
+ "clickCopy": {
+ "message": "กดเพื่อคัดลอก"
+ },
+ "confirm": {
+ "message": "ยืนยัน"
+ },
+ "confirmContract": {
+ "message": "ยืนยันสัญญา"
+ },
+ "confirmPassword": {
+ "message": "ยืนยันรหัสผ่าน"
+ },
+ "confirmTransaction": {
+ "message": "ยืนยันการทำรายการธุรกรรม"
+ },
+ "continue": {
+ "message": "ทำต่อไป"
+ },
+ "continueToCoinbase": {
+ "message": "ไปที่ Coinbase"
+ },
+ "contractDeployment": {
+ "message": "การติดตั้งสัญญา"
+ },
+ "conversionProgress": {
+ "message": "กำลังดำเนินการแปลงหน่วย"
+ },
+ "copiedButton": {
+ "message": "คัดลอกแล้ว"
+ },
+ "copiedClipboard": {
+ "message": "คัดลอกไปที่คลิบบอร์ดแล้ว"
+ },
+ "copiedExclamation": {
+ "message": "คัดลอกแล้ว!"
+ },
+ "copiedSafe": {
+ "message": "ฉันได้คัดลอกเก็บไว้ในที่ปลอดภัยเรียบร้อยแล้ว"
+ },
+ "copy": {
+ "message": "คัดลอก"
+ },
+ "copyToClipboard": {
+ "message": "คัดลอกไปคลิปบอร์ด"
+ },
+ "copyButton": {
+ "message": " คัดลอก "
+ },
+ "copyPrivateKey": {
+ "message": "นี่คือคีย์ส่วนตัวของคุณ(กดเพื่อคัดลอก)"
+ },
+ "create": {
+ "message": "สร้าง"
+ },
+ "createAccount": {
+ "message": "สร้างบัญชี"
+ },
+ "createDen": {
+ "message": "สร้าง"
+ },
+ "crypto": {
+ "message": "คริปโต",
+ "description": "Exchange type (cryptocurrencies)"
+ },
+ "currentConversion": {
+ "message": "อัตราแลกเปลี่ยนปัจจุบัน"
+ },
+ "currentNetwork": {
+ "message": "เครือข่ายปัจจุบัน"
+ },
+ "customGas": {
+ "message": "กำหนดค่าแก็สเอง"
+ },
+ "customize": {
+ "message": "กำหนดค่าเอง"
+ },
+ "customRPC": {
+ "message": "กำหนดค่า RPC เอง"
+ },
+ "decimalsMustZerotoTen": {
+ "message": "จำนวนต้องมากกว่า 0 และไม่เกิน 36"
+ },
+ "decimal": {
+ "message": "ตำแหน่งของทศนิยม"
+ },
+ "defaultNetwork": {
+ "message": "ค่าเริ่มต้นของเครือข่ายสำหรับทำรายการธุรกรรมอีเธอร์คือ Main Net"
+ },
+ "denExplainer": {
+ "message": "DEN ของคุณคือตัวเก็บข้อมูลที่เข้ารหัสไว้ด้วยรหัสผ่านของคุณภายใน MetaMask "
+ },
+ "deposit": {
+ "message": "ฝาก"
+ },
+ "depositBTC": {
+ "message": "ฝากบิตคอยน์ของคุณไปที่แอดเดรสด้านล่างนี้:"
+ },
+ "depositCoin": {
+ "message": "ฝาก $1 ของคุณไปที่แอดเดรสด้านล่างนี้:",
+ "description": "Tells the user what coin they have selected to deposit with shapeshift"
+ },
+ "depositEth": {
+ "message": "การฝากอีเธอร์"
+ },
+ "depositEther": {
+ "message": "การฝากอีเธอร์"
+ },
+ "depositFiat": {
+ "message": "ฝากด้วยเงินตรา"
+ },
+ "depositFromAccount": {
+ "message": "ฝากจากบัญชีอื่น"
+ },
+ "depositShapeShift": {
+ "message": "ฝากด้วย ShapeShift"
+ },
+ "depositShapeShiftExplainer": {
+ "message": "ถ้ามีเงินสกุลอื่นอยู่ก็สามารถแลกเงินและฝากเป็นอีเธอร์ได้โดยตรงเข้ากระเป๋า MetaMask ได้เลยไม่ต้องสมัครบัญชี"
+ },
+ "details": {
+ "message": "รายละเอียด"
+ },
+ "directDeposit": {
+ "message": "ฝากตรง"
+ },
+ "directDepositEther": {
+ "message": "ฝากอีเธอร์โดยตรง"
+ },
+ "directDepositEtherExplainer": {
+ "message": "ถ้าคุณมีอีเธอร์อยู่แล้ววิธีการที่เร็วที่สุดในการเอาเงินเข้ากระเป๋าใหม่ก็คือการโอนตรงๆ"
+ },
+ "done": {
+ "message": "เสร็จสิ้น"
+ },
+ "downloadStatelogs": {
+ "message": "ดาวน์โหลดล็อกสถานะ"
+ },
+ "edit": {
+ "message": "แก้ไข"
+ },
+ "editAccountName": {
+ "message": "แก้ไขชื่อบัญชี"
+ },
+ "emailUs": {
+ "message": "อีเมลหาเรา!"
+ },
+ "encryptNewDen": {
+ "message": "เข้ารหัส DEN ของคุณ"
+ },
+ "enterPassword": {
+ "message": "ใส่รหัสผ่าน"
+ },
+ "enterPasswordConfirm": {
+ "message": "ใส่รหัสผ่านอีกครั้งเพื่อยืนยัน"
+ },
+ "etherscanView": {
+ "message": "ดูบัญชีบน Etherscan"
+ },
+ "exchangeRate": {
+ "message": "อัตราแลกเปลี่ยน"
+ },
+ "exportPrivateKey": {
+ "message": "ส่งออกคีย์ส่วนตัว"
+ },
+ "exportPrivateKeyWarning": {
+ "message": "ส่งออกคีย์ส่วนตัวโดยคุณรับความเสี่ยงเอง"
+ },
+ "failed": {
+ "message": "ล้มเหลว"
+ },
+ "fiat": {
+ "message": "เงินตรา",
+ "description": "Exchange type"
+ },
+ "fileImportFail": {
+ "message": "นำเข้าไฟล์ไม่สำเหร็จ กดที่นี่!",
+ "description": "Helps user import their account from a JSON file"
+ },
+ "followTwitter": {
+ "message": "ติดตามเราบนทวิตเตอร์"
+ },
+ "from": {
+ "message": "จาก"
+ },
+ "fromToSame": {
+ "message": "แอดเดรสที่ส่งกับที่รับจะต้องไม่ไช่อันเดียวกัน"
+ },
+ "fromShapeShift": {
+ "message": "จาก ShapeShift"
+ },
+ "gas": {
+ "message": "แก็ส",
+ "description": "Short indication of gas cost"
+ },
+ "gasFee": {
+ "message": "ค่าแก๊ส"
+ },
+ "gasLimit": {
+ "message": "วงเงินแก็ส"
+ },
+ "gasLimitCalculation": {
+ "message": "เราแนะนำวงเงินแก็สตามความสำเร็จบนเครือข่าย"
+ },
+ "gasLimitRequired": {
+ "message": "ต้องกำหนดวงเงินแก็ส"
+ },
+ "gasLimitTooLow": {
+ "message": "วงเงินแก็สต้องอย่างน้อย 21000"
+ },
+ "generatingSeed": {
+ "message": "กำลังสร้างชีด..."
+ },
+ "gasPrice": {
+ "message": "ราคาแก๊ส (GWEI)"
+ },
+ "gasPriceCalculation": {
+ "message": "เราแนะนำราคาแก็สตามความสำเร็จบนเครือข่าย"
+ },
+ "gasPriceRequired": {
+ "message": "ต้องมีราคาแก๊ส"
+ },
+ "getEther": {
+ "message": "รับอีเธอร์"
+ },
+ "getEtherFromFaucet": {
+ "message": "รับอีเธอร์ที่ปล่อยจาก $1",
+ "description": "Displays network name for Ether faucet"
+ },
+ "greaterThanMin": {
+ "message": "ต้องมากกว่าหรือเท่ากับ $1.",
+ "description": "helper for inputting hex as decimal input"
+ },
+ "here": {
+ "message": "ที่นี่",
+ "description": "as in -click here- for more information (goes with troubleTokenBalances)"
+ },
+ "hereList": {
+ "message": "รายการอยู่ที่นี่!!!!"
+ },
+ "hide": {
+ "message": "ซ่อน"
+ },
+ "hideToken": {
+ "message": "ซ่อนโทเค็น"
+ },
+ "hideTokenPrompt": {
+ "message": "ซ่อนโทเค็นหรือไม่?"
+ },
+ "howToDeposit": {
+ "message": "คุณต้องการฝากอีเธอร์อย่างไร?"
+ },
+ "holdEther": {
+ "message": "ช่วยคุณถืออีเทอร์และโทเค็นและทำหน้าที่เป็นสะพานเชื่อมต่อกับแอพพลิเคชันแบบกระจาย"
+ },
+ "import": {
+ "message": "นำเข้า",
+ "description": "Button to import an account from a selected file"
+ },
+ "importAccount": {
+ "message": "นำเข้าบัญชี"
+ },
+ "importAccountMsg": {
+ "message":"บัญชีที่นำเข้าจะไม่ถูกรวมกับบัญชีที่สร้างด้วยคำเเริ่มต้นบนเมต้ามาร์สในตอนแรก เรียนรู้เพิ่มเติมเกี่ยวกับบัญชีที่นำเข้า"
+ },
+ "importAnAccount": {
+ "message": "นำเข้าบัญชี"
+ },
+ "importDen": {
+ "message": "นำเข้า DEN ที่มีอยู่แล้ว"
+ },
+ "imported": {
+ "message": "นำเข้าเรียบร้อย",
+ "description": "status showing that an account has been fully loaded into the keyring"
+ },
+ "infoHelp": {
+ "message": "ข้อมูลและความช่วยเหลือ"
+ },
+ "insufficientFunds": {
+ "message": "เงินทุนไม่เพียงพอ"
+ },
+ "insufficientTokens": {
+ "message": "โทเค็นไม่เพียงพอ"
+ },
+ "invalidAddress": {
+ "message": "แอดแดรสไม่ถูกต้อง"
+ },
+ "invalidAddressRecipient": {
+ "message": "แอดแดรสผู้รับไม่ถูกต้อง"
+ },
+ "invalidGasParams": {
+ "message": "ตั้งค่าแก๊สไม่ถูกต้อง"
+ },
+ "invalidInput": {
+ "message": "อินพุทไม่ถูกต้อง"
+ },
+ "invalidRequest": {
+ "message": "คำร้องขอไม่ถูกต้อง"
+ },
+ "invalidRPC": {
+ "message": "RPC URI ไม่ถูกต้อง"
+ },
+ "jsonFail": {
+ "message": "เกิดบางอย่างผิดพลาด โปรดตรวจสอบว่าไฟล์ JSON ของคุณมีรูปแบบที่ถูกต้อง."
+ },
+ "jsonFile": {
+ "message": "ไฟล์ JSON",
+ "description": "format for importing an account"
+ },
+ "kovan": {
+ "message": "เครือข่ายทดสอบ Kovan"
+ },
+ "knowledgeDataBase": {
+ "message": "ไปที่คลังความรู้ของเรา"
+ },
+ "lessThanMax": {
+ "message": "ต้องน้อยกว่าหรือเท่ากับ $1.",
+ "description": "helper for inputting hex as decimal input"
+ },
+ "likeToAddTokens": {
+ "message": "คุณต้องการเพิ่มโทเค็นเหล่านี้หรือไม่?"
+ },
+ "limit": {
+ "message": "ข้อจำกัด"
+ },
+ "loading": {
+ "message": "กำลังโหลด..."
+ },
+ "loadingTokens": {
+ "message": "กำลังโหลดโทเค็น..."
+ },
+ "localhost": {
+ "message": "Localhost 8545"
+ },
+ "login": {
+ "message": "เข้าสู่ระบบ"
+ },
+ "logout": {
+ "message": "ออกจากระบบ"
+ },
+ "loose": {
+ "message": "อิสระ"
+ },
+ "loweCaseWords": {
+ "message": "กลุ่มคำชีดมีเพียงตัวพิมพ์เล็กเท่านั้น"
+ },
+ "mainnet": {
+ "message": "เครือข่าย Main Net"
+ },
+ "message": {
+ "message": "ข้อความ"
+ },
+ "metamaskDescription": {
+ "message": "MetaMask คือที่เก็บตัวตนนิรภัยสำหรับอีเธอเรียม"
+ },
+ "min": {
+ "message": "ขั้นต่ำ"
+ },
+ "myAccounts": {
+ "message": "บัญชีของฉัน"
+ },
+ "mustSelectOne": {
+ "message": "ต้องเลือกอย่างน้อย 1 โทเค็น"
+ },
+ "needEtherInWallet": {
+ "message": "คุณจะต้องมีอีเธอร์ในกระเป๋าเงินของคุณในการใช้งานกับแอพพลิเคชันแบบกระจายด้วย MetaMask"
+ },
+ "needImportFile": {
+ "message": "คุณต้องเลือกไฟล์ที่จะนำเข้า",
+ "description": "User is important an account and needs to add a file to continue"
+ },
+ "needImportPassword": {
+ "message": "คุณต้องป้อนรหัสผ่านสำหรับไฟล์ที่เลือก",
+ "description": "Password and file needed to import an account"
+ },
+ "negativeETH": {
+ "message": "ไม่สามารถส่งอีเธอร์เป็นจำนวนติดลบได้"
+ },
+ "networks": {
+ "message": "เครือข่าย"
+ },
+ "newAccount": {
+ "message": "บัญชีใหม่"
+ },
+ "newAccountNumberName": {
+ "message": "บัญชี $1",
+ "description": "Default name of next account to be created on create account screen"
+ },
+ "newContract": {
+ "message": "สร้างสัญญาใหม่"
+ },
+ "newPassword": {
+ "message": "รหัสผ่านใหม่(ขั้นต่ำ 8 ตัวอักษร)"
+ },
+ "newRecipient": {
+ "message": "ผู้รับใหม่"
+ },
+ "newRPC": {
+ "message": "RPC URL ใหม่"
+ },
+ "next": {
+ "message": "ถัดไป"
+ },
+ "noAddressForName": {
+ "message": "ยังไม่มีแอดแดรสไหนตั้งในชื่อนี้"
+ },
+ "noDeposits": {
+ "message": "ไม่มีเงินฝากเข้ามา"
+ },
+ "noTransactionHistory": {
+ "message": "ไม่มีรายการธุรกรรมในอดีต"
+ },
+ "noTransactions": {
+ "message": "ยังไม่มีรายการธุรกรรม"
+ },
+ "notStarted": {
+ "message": "ยังไม่เริ่ม"
+ },
+ "oldUI": {
+ "message": "หน้าตาแบบเก่า"
+ },
+ "oldUIMessage": {
+ "message": "คุณได้เปลี่ยนเป็นหน้าตาแบบเก่าแล้ว คุณสามารถเปลี่ยนเป็นหน้าตาแบบใหม่ได้โดยไปที่ตัวเลือกตรงเมนูมุมขวาบน"
+ },
+ "or": {
+ "message": "หรือ",
+ "description": "choice between creating or importing a new account"
+ },
+ "passwordCorrect": {
+ "message": "โปรดตรวจสอบว่ารหัสผ่านของคุณถูกต้อง"
+ },
+ "passwordMismatch": {
+ "message": "รหัสผ่านไม่ตรงกัน",
+ "description": "in password creation process, the two new password fields did not match"
+ },
+ "passwordShort": {
+ "message": "รหัสผ่านไม่ยาวพอ",
+ "description": "in password creation process, the password is not long enough to be secure"
+ },
+ "pastePrivateKey": {
+ "message": "วางคีย์ส่วนตัวของคุณที่นี่:",
+ "description": "For importing an account from a private key"
+ },
+ "pasteSeed": {
+ "message": "วางคำชีดของคุณที่นี่!"
+ },
+ "personalAddressDetected": {
+ "message": "ตรวจพบแอดแดรสส่วนตัวแล้ว ใส่แอดแดรสสัญญาโทเค็น"
+ },
+ "pleaseReviewTransaction": {
+ "message": "โปรดตรวจสอบธุรกรรมของคุณ"
+ },
+ "privacyMsg": {
+ "message": "นโยบายสความเป็นส่วนตัว"
+ },
+ "privateKey": {
+ "message": "คีย์ส่วนตัว",
+ "description": "select this type of file to use to import an account"
+ },
+ "privateKeyWarning": {
+ "message": "คำเตือน: ห้ามเปิดเผยคีย์นี้ ทุกคนที่มีคีย์ส่วนตัวสามารถขโมยข้อมูลใด ๆ ที่เก็บไว้ในบัญชีของคุณได้"
+ },
+ "privateNetwork": {
+ "message": "เครือข่ายส่วนตัว"
+ },
+ "qrCode": {
+ "message": "แสดง QR Code"
+ },
+ "readdToken": {
+ "message": "คุณสามารถเพิ่มโทเค็นนี้ในอนาคตได้โดยไปที่ “เพิ่มโทเค็น” ในเมนูตัวเลือกบัญชีของคุณ"
+ },
+ "readMore": {
+ "message": "อ่านเพิ่มเติมที่นี่"
+ },
+ "readMore2": {
+ "message": "อ่านเพิ่มเติม"
+ },
+ "receive": {
+ "message": "รับ"
+ },
+ "recipientAddress": {
+ "message": "แอดแดรสผู้รับ"
+ },
+ "refundAddress": {
+ "message": "แอดแดรสสำหรับการคืนเงินของคุณ"
+ },
+ "rejected": {
+ "message": "ถูกปฏิเสธ"
+ },
+ "resetAccount": {
+ "message": "รีเซ็ตบัญชี"
+ },
+ "restoreFromSeed": {
+ "message": "กู้คืนจากกลุ่มคำชีด"
+ },
+ "required": {
+ "message": "จำเป็น"
+ },
+ "retryWithMoreGas": {
+ "message": "ลองใหม่ด้วยราคาแก๊สที่สูงกว่านี้ที่นี่"
+ },
+ "revealSeedWords": {
+ "message": "เปิดเผยกลุ่มคำชีด"
+ },
+ "revealSeedWordsWarning": {
+ "message": "อย่าเปิดเผยคำกลุ่มคำชีดของคุณในที่สาธารณะ! คำเหล่านี้สามารถใช้เพื่อขโมยบัญชีทั้งหมดของคุณ"
+ },
+ "revert": {
+ "message": "ย้อนกลับ"
+ },
+ "rinkeby": {
+ "message": "เครือข่ายทดสอบ Rinkeby"
+ },
+ "ropsten": {
+ "message": "เครือข่ายทดสอบ Ropsten"
+ },
+ "sampleAccountName": {
+ "message": "เช่น บัญชีเฮงเฮงของฉัน",
+ "description": "Help user understand concept of adding a human-readable name to their account"
+ },
+ "save": {
+ "message": "บันทึก"
+ },
+ "saveAsFile": {
+ "message": "บันทึกเป็นไฟล์",
+ "description": "Account export process"
+ },
+ "saveSeedAsFile": {
+ "message": "บันทึกกลุ่มคำชีดเป็นไฟล์"
+ },
+ "search": {
+ "message": "ค้นหา"
+ },
+ "secretPhrase": {
+ "message": "ป้อนกลุ่มคำสิบสองคำเพื่อกู้คืนตู้เซฟของคุณ"
+ },
+ "seedPhraseReq": {
+ "message": "กลุ่มคำชีดมีความยาว 12 คำ"
+ },
+ "select": {
+ "message": "เลือก"
+ },
+ "selectCurrency": {
+ "message": "เลือกสกุลเงิน"
+ },
+ "selectService": {
+ "message": "เลือกบริการ"
+ },
+ "selectType": {
+ "message": "เลือกประเภท"
+ },
+ "send": {
+ "message": "ส่ง"
+ },
+ "sendETH": {
+ "message": "ส่งอีเธอร์"
+ },
+ "sendTokens": {
+ "message": "ส่งโทเค็น"
+ },
+ "sendTokensAnywhere": {
+ "message": "ส่งโทเค็นไปให้ทุกคนที่มีบัญชีอีเธอเรียม"
+ },
+ "settings": {
+ "message": "การตั้งค่า"
+ },
+ "shapeshiftBuy": {
+ "message": "ซื้อด้วย Shapeshift"
+ },
+ "showPrivateKeys": {
+ "message": "แสดงคีย์ส่วนตัว"
+ },
+ "showQRCode": {
+ "message": "แสดง QR Code"
+ },
+ "sign": {
+ "message": "เซ็นชื่อ"
+ },
+ "signMessage": {
+ "message": "เซ็นชื่อในข้อความ"
+ },
+ "signNotice": {
+ "message": "การเซ็นชื่อในข้อความนี้อาจจะเป็นอันตรายได้ \nเซ็นชื่อเฉพาะข้อความจากแหล่งที่คุณไว้วางใจได้จริง ๆ เท่านั้น \nวิธีที่อันตรายนี้จะถูกลบออกในอนาคต"
+ },
+ "sigRequest": {
+ "message": "ขอลายเซ็น"
+ },
+ "sigRequested": {
+ "message": "ขอลายเซ็นแล้ว"
+ },
+ "spaceBetween": {
+ "message": "มีช่องว่างได้เพียงตัวเดียวระหว่างคำเท่านั้น"
+ },
+ "status": {
+ "message": "สถานะ"
+ },
+ "stateLogs": {
+ "message": "บันทึกของสถานะ"
+ },
+ "stateLogsDescription": {
+ "message": "บันทึกของสถานะประกอบด้วยแอดแดรสสาธารณะและธุรกรรมที่ส่ง"
+ },
+ "submit": {
+ "message": "ตกลง"
+ },
+ "supportCenter": {
+ "message": "ไปที่ศูนย์สนับสนุนของเรา"
+ },
+ "symbolBetweenZeroTen": {
+ "message": "สัญลักษณ์ต้องมีความยาวตั้งแต่ 0 ถึง 10 อักขระ"
+ },
+ "takesTooLong": {
+ "message": "ใช้เวลานานเกินไปใช่หรือไม่?"
+ },
+ "terms": {
+ "message": "ข้อตกลงในการใช้งาน"
+ },
+ "testFaucet": {
+ "message": "ตัวแจกจ่ายเพื่อการทดสอบ"
+ },
+ "to": {
+ "message": "ถึง"
+ },
+ "toETHviaShapeShift": {
+ "message": "$1 เป็นอีเธอร์โดย ShapeShift",
+ "description": "system will fill in deposit type in start of message"
+ },
+ "tokenAddress": {
+ "message": "แอดแดรสโทเค็น"
+ },
+ "tokenAlreadyAdded": {
+ "message": "โทเคนได้ถูกเพิ่มไปแล้ว"
+ },
+ "tokenBalance": {
+ "message": "ยอดโทเค็นคงเหลือของคุณคือ:"
+ },
+ "tokenSelection": {
+ "message": "ค้นหาโทเค็นหรือเลือกจากรายการโทเค็นยอดนิยมของเรา"
+ },
+ "tokenSymbol": {
+ "message": "สัญลักษณ์ประจำตัว"
+ },
+ "tokenWarning1": {
+ "message": "ติดตามโทเค็นที่คุณซื้อด้วยบัญชี MetaMask ของคุณ หากคุณซื้อโทเค็นโดยใช้บัญชีอื่นโทเค็นเหล่านั้นจะไม่ปรากฏที่นี่"
+ },
+ "total": {
+ "message": "รวม"
+ },
+ "transactions": {
+ "message": "ธุรกรรม"
+ },
+ "transactionMemo": {
+ "message": "บันทึกช่วยจำของการทำธุรกรรม (ไม่บังคับ)"
+ },
+ "transactionNumber": {
+ "message": "หมายเลขธุรกรรม"
+ },
+ "transfers": {
+ "message": "โอน"
+ },
+ "troubleTokenBalances": {
+ "message": "เรามีปัญหาในการโหลดยอดโทเค็นคงเหลือของคุณ คุณสามารถดูได้ที่นี่",
+ "description": "Followed by a link (here) to view token balances"
+ },
+ "twelveWords": {
+ "message": "กลุ่มคำ 12 คำเหล่านี้เป็นวิธีเดียวที่จะกู้คืนบัญชี MetaMask ของคุณ \n กรุณาเก็บไว้ในที่ปลอดภัยและเก็บเป็นความลับ"
+ },
+ "typePassword": {
+ "message": "พิมพ์รหัสผ่านของคุณ"
+ },
+ "uiWelcome": {
+ "message": "ยินดีต้อนรับสู่หน้าตาใหม่ (เบต้า)"
+ },
+ "uiWelcomeMessage": {
+ "message": "ขณะนี้คุณใช้งาน Metamask หน้าตาใหม่แล้ว ลองใช้ความสามรถใหม่ ๆ เช่นการส่งโทเค็นและหากพบปัญหากรุณาแจ้งให้เราทราบ"
+ },
+ "unavailable": {
+ "message": "ใช้งานไม่ได้"
+ },
+ "unknown": {
+ "message": "ไม่รู้จัก"
+ },
+ "unknownNetwork": {
+ "message": "ไม่รู้จักเครือข่ายส่วนตัว"
+ },
+ "unknownNetworkId": {
+ "message": "ไม่รู้จักหมายเลขเครือข่าย"
+ },
+ "uriErrorMsg": {
+ "message": "URI ต้องมีคำนำหน้าเป็น HTTP หรือ HTTPS"
+ },
+ "usaOnly": {
+ "message": "ในสหรัฐอเมริกาเท่านั้น",
+ "description": "Using this exchange is limited to people inside the USA"
+ },
+ "usedByClients": {
+ "message": "ถูกใช้งานโดยหลายไคลเอนท์"
+ },
+ "useOldUI": {
+ "message": "ใช้หน้าตาเก่า"
+ },
+ "validFileImport": {
+ "message": "คุณต้องเลือกไฟล์ที่ถูกต้องเพื่อนำเข้า"
+ },
+ "vaultCreated": {
+ "message": "สร้างตู้เซฟแล้ว"
+ },
+ "viewAccount": {
+ "message": "ดูบัญชี"
+ },
+ "visitWebSite": {
+ "message": "เยี่ยมชมเว็บไซต์ของเรา"
+ },
+ "warning": {
+ "message": "คำเตือน"
+ },
+ "welcomeBeta": {
+ "message": "ยินดีต้อนรับสู่ MetaMask เบต้า"
+ },
+ "whatsThis": {
+ "message": "นี่คืออะไร?"
+ },
+ "yourSigRequested": {
+ "message": "ลายเซ็นของคุณกำลังได้รับการร้องขอ"
+ },
+ "youSign": {
+ "message": "คุณกำลังเซ็นชื่อ"
+ }
+}
diff --git a/app/_locales/zh_TW/messages.json b/app/_locales/zh_TW/messages.json
new file mode 100644
index 000000000..90f63c6a6
--- /dev/null
+++ b/app/_locales/zh_TW/messages.json
@@ -0,0 +1,864 @@
+{
+ "accept": {
+ "message": "接受"
+ },
+ "account": {
+ "message": "帳戶"
+ },
+ "accountDetails": {
+ "message": "帳戶詳情"
+ },
+ "accountName": {
+ "message": "帳戶名稱"
+ },
+ "address": {
+ "message": "帳戶地址"
+ },
+ "addCustomToken": {
+ "message": "加入自訂代幣"
+ },
+ "addToken": {
+ "message": "加入代幣"
+ },
+ "addTokens": {
+ "message": "加入多筆代幣"
+ },
+ "amount": {
+ "message": "數額"
+ },
+ "amountPlusGas": {
+ "message": "數額 + Gas"
+ },
+ "appDescription": {
+ "message": "乙太坊瀏覽器擴充插件",
+ "description": "The description of the application"
+ },
+ "appName": {
+ "message": "MetaMask",
+ "description": "The name of the application"
+ },
+ "approved": {
+ "message": "已同意"
+ },
+ "attemptingConnect": {
+ "message": "正在嘗試連接區塊鏈。"
+ },
+ "attributions": {
+ "message": "來源"
+ },
+ "available": {
+ "message": "可使用"
+ },
+ "back": {
+ "message": "上一頁"
+ },
+ "balance": {
+ "message": "餘額:"
+ },
+ "balances": {
+ "message": "你的餘額:"
+ },
+ "balanceIsInsufficientGas": {
+ "message": "當前餘額不足以支付 Gas"
+ },
+ "beta": {
+ "message": "BETA"
+ },
+ "betweenMinAndMax": {
+ "message": "必須大於等於 $1 並且小於等於 $2 。",
+ "description": "helper for inputting hex as decimal input"
+ },
+ "blockiesIdenticon": {
+ "message": "使用 Blockies Identicon"
+ },
+ "borrowDharma": {
+ "message": "透過 Dharma (Beta) 借用"
+ },
+ "builtInCalifornia": {
+ "message": "MetaMask 是在加州設計製造."
+ },
+ "buy": {
+ "message": "購買"
+ },
+ "buyCoinbase": {
+ "message": "在 Coinbase 上購買"
+ },
+ "buyCoinbaseExplainer": {
+ "message": "Coinbase 是世界上最流行的買賣比特幣,以太幣和萊特幣的交易所。"
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "cancel": {
+ "message": "取消"
+ },
+ "classicInterface": {
+ "message": "使用舊版界面"
+ },
+ "clickCopy": {
+ "message": "點擊複製"
+ },
+ "confirm": {
+ "message": "確認"
+ },
+ "confirmed": {
+ "message": "已確認"
+ },
+ "confirmContract": {
+ "message": "確認合約"
+ },
+ "confirmPassword": {
+ "message": "確認密碼"
+ },
+ "confirmTransaction": {
+ "message": "確認交易"
+ },
+ "continue": {
+ "message": "繼續"
+ },
+ "continueToCoinbase": {
+ "message": "繼續前往 Coinbase"
+ },
+ "contractDeployment": {
+ "message": "合約部署"
+ },
+ "conversionProgress": {
+ "message": "正在取得匯率"
+ },
+ "copiedButton": {
+ "message": "已複製"
+ },
+ "copiedClipboard": {
+ "message": "已複製到剪貼簿"
+ },
+ "copiedExclamation": {
+ "message": "已複製!"
+ },
+ "copiedSafe": {
+ "message": "我已經複製到某個安全的地方了"
+ },
+ "copy": {
+ "message": "複製"
+ },
+ "copyToClipboard": {
+ "message": "複製到剪貼簿"
+ },
+ "copyButton": {
+ "message": " 複製 "
+ },
+ "copyPrivateKey": {
+ "message": "這是你的私鑰(點擊複製)"
+ },
+ "create": {
+ "message": "建立"
+ },
+ "createAccount": {
+ "message": "建立帳戶"
+ },
+ "createDen": {
+ "message": "建立"
+ },
+ "crypto": {
+ "message": "加密",
+ "description": "Exchange type (cryptocurrencies)"
+ },
+ "currentConversion": {
+ "message": "當前匯率"
+ },
+ "currentNetwork": {
+ "message": "當前網路"
+ },
+ "customGas": {
+ "message": "自訂 Gas"
+ },
+ "customize": {
+ "message": "自訂"
+ },
+ "customRPC": {
+ "message": "自訂 RPC"
+ },
+ "decimalsMustZerotoTen": {
+ "message": "小數點後位數至少為0, 最多為36."
+ },
+ "decimal": {
+ "message": "小數點精度"
+ },
+ "defaultNetwork": {
+ "message": "預設Ether交易網路為主網(Main Net)。"
+ },
+ "denExplainer": {
+ "message": "你的 DEN 是在你的 MetaMask 中的加密密碼儲存庫。"
+ },
+ "deposit": {
+ "message": "存入"
+ },
+ "depositBTC": {
+ "message": "將你的 BTC 存入到下面的地址:"
+ },
+ "depositCoin": {
+ "message": "將你的 $1 存入到下面的地址",
+ "description": "Tells the user what coin they have selected to deposit with shapeshift"
+ },
+ "depositEth": {
+ "message": "存入 Eth"
+ },
+ "depositEther": {
+ "message": "存入 Ether"
+ },
+ "depositFiat": {
+ "message": "從法定貨幣存入"
+ },
+ "depositFromAccount": {
+ "message": "從其他帳戶存入"
+ },
+ "depositShapeShift": {
+ "message": "從 ShapeShift 存入"
+ },
+ "depositShapeShiftExplainer": {
+ "message": "如果你擁有其他加密貨幣,你可以直接交易並存入 Ether 到你的MetaMask錢包。不需要開帳戶。"
+ },
+ "details": {
+ "message": "詳情"
+ },
+ "directDeposit": {
+ "message": "直接存入"
+ },
+ "directDepositEther": {
+ "message": "直接存入 Ether"
+ },
+ "directDepositEtherExplainer": {
+ "message": "如果你已經擁有了一些Ether,使用直接存入功能是讓你的新錢包最快取得Ether的方式。"
+ },
+ "done": {
+ "message": "完成"
+ },
+ "downloadStatelogs": {
+ "message": "下載狀態紀錄"
+ },
+ "dropped": {
+ "message": "丟棄"
+ },
+ "edit": {
+ "message": "編輯"
+ },
+ "editAccountName": {
+ "message": "編輯帳戶名稱"
+ },
+ "emailUs": {
+ "message": "寄 Email 給我們!"
+ },
+ "encryptNewDen": {
+ "message": "加密你的新 DEN"
+ },
+ "enterPassword": {
+ "message": "請輸入密碼"
+ },
+ "enterPasswordConfirm": {
+ "message": "請再次輸入密碼確認"
+ },
+ "passwordNotLongEnough": {
+ "message": "您所輸入的密碼長度不足"
+ },
+ "passwordsDontMatch": {
+ "message": "您所輸入的密碼不一致"
+ },
+ "etherscanView": {
+ "message": "在 Etherscan 上查看帳戶"
+ },
+ "exchangeRate": {
+ "message": "匯率"
+ },
+ "exportPrivateKey": {
+ "message": "導出私鑰"
+ },
+ "exportPrivateKeyWarning": {
+ "message": "您需要自行負擔導出私鑰產生的風險"
+ },
+ "failed": {
+ "message": "失败"
+ },
+ "fiat": {
+ "message": "FIAT",
+ "description": "Exchange type"
+ },
+ "fileImportFail": {
+ "message": "檔案導入失敗?點擊這裡!",
+ "description": "Helps user import their account from a JSON file"
+ },
+ "from": {
+ "message": "來源地址"
+ },
+ "fromToSame": {
+ "message": "來源和目的地址不能一樣"
+ },
+ "fromShapeShift": {
+ "message": "來自 ShapeShift"
+ },
+ "gas": {
+ "message": "Gas",
+ "description": "Short indication of gas cost"
+ },
+ "gasFee": {
+ "message": "Gas 費用"
+ },
+ "gasLimit": {
+ "message": "Gas 上限"
+ },
+ "gasLimitCalculation": {
+ "message": "我們根據網路成功率算出建議的 Gas 上限。"
+ },
+ "gasLimitRequired": {
+ "message": "必需填寫 Gas 上限"
+ },
+ "gasLimitTooLow": {
+ "message": "Gas 上限至少為 21000"
+ },
+ "gasPrice": {
+ "message": "Gas 價格 (GWEI)"
+ },
+ "gasPriceCalculation": {
+ "message": "我們根據網路成功率算出建議的 Gas 價格"
+ },
+ "gasPriceRequired": {
+ "message": "必需填寫 Gas 價格"
+ },
+ "getEther": {
+ "message": "取得 Ether"
+ },
+ "getEtherFromFaucet": {
+ "message": "從水管取得$1 Ether",
+ "description": "Displays network name for Ether faucet"
+ },
+ "greaterThanMin": {
+ "message": "必須要大於等於 $1。",
+ "description": "helper for inputting hex as decimal input"
+ },
+ "here": {
+ "message": "這裡",
+ "description": "as in -click here- for more information (goes with troubleTokenBalances)"
+ },
+ "hereList": {
+ "message": "Here's a list!!!!"
+ },
+ "hide": {
+ "message": "隱藏"
+ },
+ "hideToken": {
+ "message": "隱藏代幣"
+ },
+ "hideTokenPrompt": {
+ "message": "隱藏代幣?"
+ },
+ "howToDeposit": {
+ "message": "你想怎麼存入 Ether?"
+ },
+ "holdEther": {
+ "message": "Metamask 讓您能保存 ether 和代幣, 並成為您接觸分散式應用程式的途徑."
+ },
+ "import": {
+ "message": "導入",
+ "description": "Button to import an account from a selected file"
+ },
+ "importAccount": {
+ "message": "導入帳戶"
+ },
+ "importAnAccount": {
+ "message": "導入一個帳戶"
+ },
+ "importDen": {
+ "message": "導入現成的 DEN"
+ },
+ "imported": {
+ "message": "已導入私鑰",
+ "description": "status showing that an account has been fully loaded into the keyring"
+ },
+ "infoHelp": {
+ "message": "說明 & 資訊"
+ },
+ "insufficientFunds": {
+ "message": "資金不足."
+ },
+ "insufficientTokens": {
+ "message": "代幣不足."
+ },
+ "invalidAddress": {
+ "message": "錯誤的地址"
+ },
+ "invalidAddressRecipient": {
+ "message": "接收地址錯誤"
+ },
+ "invalidGasParams": {
+ "message": "Gas 參數錯誤"
+ },
+ "invalidInput": {
+ "message": "輸入錯誤。"
+ },
+ "invalidRequest": {
+ "message": "無效的請求"
+ },
+ "invalidRPC": {
+ "message": "無效的 RPC URI"
+ },
+ "jsonFail": {
+ "message": "有東西出錯了. 請確認你的 JSON 檔案格式正確."
+ },
+ "jsonFile": {
+ "message": "JSON 檔案",
+ "description": "format for importing an account"
+ },
+ "kovan": {
+ "message": "Kovan 測試網路"
+ },
+ "knowledgeDataBase": {
+ "message": "查看我們的知識庫"
+ },
+ "max": {
+ "message": "最大值"
+ },
+ "lessThanMax": {
+ "message": "必須小於等於 $1.",
+ "description": "helper for inputting hex as decimal input"
+ },
+ "likeToAddTokens": {
+ "message": "您確定要加入這些代幣嗎?"
+ },
+ "links": {
+ "message": "連結"
+ },
+ "limit": {
+ "message": "上限"
+ },
+ "loading": {
+ "message": "載入..."
+ },
+ "loadingTokens": {
+ "message": "載入代幣..."
+ },
+ "localhost": {
+ "message": "Localhost 8545"
+ },
+ "logout": {
+ "message": "登出"
+ },
+ "loose": {
+ "message": "非Metamask帳號"
+ },
+ "loweCaseWords": {
+ "message": "助憶詞僅包含小寫字元"
+ },
+ "mainnet": {
+ "message": "主乙太坊網路"
+ },
+ "message": {
+ "message": "訊息"
+ },
+ "metamaskDescription": {
+ "message": "MetaMask 是Ethereum的安全身份識別金庫."
+ },
+ "min": {
+ "message": "最小"
+ },
+ "myAccounts": {
+ "message": "我的帳戶"
+ },
+ "mustSelectOne": {
+ "message": "必須選擇至少 1 代幣."
+ },
+ "needEtherInWallet": {
+ "message": "要使用 MetaMask 存取 DAPP時,您的錢包中需要有 Ether。"
+ },
+ "needImportFile": {
+ "message": "您必須選擇一個檔案來導入。",
+ "description": "User is important an account and needs to add a file to continue"
+ },
+ "needImportPassword": {
+ "message": "您必須為選擇好的檔案輸入密碼。",
+ "description": "Password and file needed to import an account"
+ },
+ "networks": {
+ "message": "網路"
+ },
+ "newAccount": {
+ "message": "新帳戶"
+ },
+ "newAccountNumberName": {
+ "message": "帳戶 $1",
+ "description": "Default name of next account to be created on create account screen"
+ },
+ "newContract": {
+ "message": "新合約"
+ },
+ "newPassword": {
+ "message": "新密碼(至少8個字)"
+ },
+ "newRecipient": {
+ "message": "新收款人"
+ },
+ "newRPC": {
+ "message": "New RPC URL"
+ },
+ "next": {
+ "message": "下一頁"
+ },
+ "noAddressForName": {
+ "message": "此 ENS 尚未指定地址。"
+ },
+ "noDeposits": {
+ "message": "尚未有存款"
+ },
+ "noTransactionHistory": {
+ "message": "尚未有交易紀錄。"
+ },
+ "noTransactions": {
+ "message": "尚未有交易"
+ },
+ "notStarted": {
+ "message": "尚未開始"
+ },
+ "oldUI": {
+ "message": "舊版界面"
+ },
+ "oldUIMessage": {
+ "message": "你已經切換到舊版界面。可以通過右上方下拉選單中的選項切換回新的使用者界面。"
+ },
+ "or": {
+ "message": "或",
+ "description": "choice between creating or importing a new account"
+ },
+ "passwordMismatch": {
+ "message": "密碼不一致",
+ "description": "in password creation process, the two new password fields did not match"
+ },
+ "passwordShort": {
+ "message": "密碼不夠長",
+ "description": "in password creation process, the password is not long enough to be secure"
+ },
+ "pastePrivateKey": {
+ "message": "請貼上你的私鑰串:",
+ "description": "For importing an account from a private key"
+ },
+ "pasteSeed": {
+ "message": "請貼上你的助憶詞!"
+ },
+ "personalAddressDetected": {
+ "message": "已偵測到個人地址. 請輸入代幣合約地址."
+ },
+ "pleaseReviewTransaction": {
+ "message": "請檢查你的交易。"
+ },
+ "privateKey": {
+ "message": "私鑰",
+ "description": "select this type of file to use to import an account"
+ },
+ "privateKeyWarning": {
+ "message": "注意:永遠不要公開這個私鑰。任何取得這把私鑰的人都可以竊取這個帳號中的任何資產。"
+ },
+ "privateNetwork": {
+ "message": "私有網路"
+ },
+ "qrCode": {
+ "message": "顯示 QR Code"
+ },
+ "readdToken": {
+ "message": "之後還可以透過帳戶選單中的“加入代幣”來加入此代幣。"
+ },
+ "readMore": {
+ "message": "了解更多。"
+ },
+ "readMore2": {
+ "message": "了解更多。"
+ },
+ "receive": {
+ "message": "接收"
+ },
+ "recipientAddress": {
+ "message": "接收地址"
+ },
+ "refundAddress": {
+ "message": "你的退款地址"
+ },
+ "rejected": {
+ "message": "拒絕"
+ },
+ "resetAccount": {
+ "message": "重置帳戶"
+ },
+ "restoreFromSeed": {
+ "message": "透過助憶詞重置"
+ },
+ "restoreVault": {
+ "message": "重置金庫"
+ },
+ "required": {
+ "message": "必填"
+ },
+ "retryWithMoreGas": {
+ "message": "改用更高的 Gas 價格重試"
+ },
+ "walletSeed": {
+ "message": "錢包助憶詞"
+ },
+ "revealSeedWords": {
+ "message": "顯示助憶詞"
+ },
+ "revealSeedWordsWarning": {
+ "message": "別在公共場合回復你的助憶詞!這些詞可被用來竊取你的帳戶."
+ },
+ "revert": {
+ "message": "還原"
+ },
+ "rinkeby": {
+ "message": "Rinkeby 測試網路"
+ },
+ "ropsten": {
+ "message": "Ropsten 測試網路"
+ },
+ "currentRpc": {
+ "message": "當前的 RPC"
+ },
+ "connectingToMainnet": {
+ "message": "連線到主 Ethereum 網路"
+ },
+ "connectingToRopsten": {
+ "message": "連線到 Ropsten 測試網路"
+ },
+ "connectingToKovan": {
+ "message": "連線到 Kovan 測試網路"
+ },
+ "connectingToRinkeby": {
+ "message": "連線到 Rinkeby 測試網路"
+ },
+ "connectingToUnknown": {
+ "message": "連線到未知網路"
+ },
+ "sampleAccountName": {
+ "message": "例如:我的新帳戶",
+ "description": "Help user understand concept of adding a human-readable name to their account"
+ },
+ "save": {
+ "message": "儲存"
+ },
+ "saveAsFile": {
+ "message": "儲存檔案",
+ "description": "Account export process"
+ },
+ "saveSeedAsFile": {
+ "message": "將助憶詞儲存成檔案"
+ },
+ "search": {
+ "message": "搜尋"
+ },
+ "secretPhrase": {
+ "message": "在此輸入你的12個祕密助憶詞以回復金庫."
+ },
+ "newPassword8Chars": {
+ "message": "新密碼 (至少 8 個字元)"
+ },
+ "seedPhraseReq": {
+ "message": "助憶詞為 12 個詞語"
+ },
+ "select": {
+ "message": "選擇"
+ },
+ "selectCurrency": {
+ "message": "選擇幣別"
+ },
+ "selectService": {
+ "message": "選擇服務"
+ },
+ "selectType": {
+ "message": "選擇類型"
+ },
+ "send": {
+ "message": "發送"
+ },
+ "sendETH": {
+ "message": "發送 ETH"
+ },
+ "sendTokens": {
+ "message": "發送代幣"
+ },
+ "onlySendToEtherAddress": {
+ "message": "只發送 ETH 到乙太坊地址."
+ },
+ "sendTokensAnywhere": {
+ "message": "發送代幣給擁有乙太坊帳戶的任何人"
+ },
+ "settings": {
+ "message": "設定"
+ },
+ "info": {
+ "message": "資訊"
+ },
+ "shapeshiftBuy": {
+ "message": "從 Shapeshift 購買"
+ },
+ "showPrivateKeys": {
+ "message": "顯示私鑰"
+ },
+ "showQRCode": {
+ "message": "顯示 QR Code"
+ },
+ "sign": {
+ "message": "簽名"
+ },
+ "signMessage": {
+ "message": "簽署訊息"
+ },
+ "signNotice": {
+ "message": "簽署此訊息可能會產生危險的副作用。 \n只從你完全信任的網站上簽名。這種危險的方法;將在未來的版本中被移除。"
+ },
+ "sigRequest": {
+ "message": "請求簽署"
+ },
+ "sigRequested": {
+ "message": "已請求簽署"
+ },
+ "spaceBetween": {
+ "message": "there can only be a space between words"
+ },
+ "status": {
+ "message": "狀態"
+ },
+ "stateLogs": {
+ "message": "狀態紀錄"
+ },
+ "stateLogsDescription": {
+ "message": "狀態紀錄包含你的公開帳戶地址和已傳送的交易資訊."
+ },
+ "stateLogError": {
+ "message": "在取得狀態紀錄時發生錯誤."
+ },
+ "submit": {
+ "message": "送出"
+ },
+ "submitted": {
+ "message": "已送出"
+ },
+ "supportCenter": {
+ "message": "造訪我們的協助中心"
+ },
+ "symbolBetweenZeroTen": {
+ "message": "代號必須介於 0 到 10 字元間."
+ },
+ "takesTooLong": {
+ "message": "花費太長時間?"
+ },
+ "terms": {
+ "message": "使用條款"
+ },
+ "testFaucet": {
+ "message": "測試水管"
+ },
+ "to": {
+ "message": "目的帳號"
+ },
+ "toETHviaShapeShift": {
+ "message": "$1 ETH 透過 ShapeShift",
+ "description": "system will fill in deposit type in start of message"
+ },
+ "tokenAddress": {
+ "message": "代幣地址"
+ },
+ "tokenAlreadyAdded": {
+ "message": "已加入過此代幣。"
+ },
+ "tokenBalance": {
+ "message": "代幣餘額:"
+ },
+ "tokenSelection": {
+ "message": "搜尋代幣或是從熱門代幣列表中選擇。"
+ },
+ "tokenSymbol": {
+ "message": "代幣代號"
+ },
+ "tokenWarning1": {
+ "message": "使用 MetaMask 帳戶追蹤你已購得的代幣。如果你使用不同的帳戶保存購得的代幣,那些代幣就不會出現在這裡。"
+ },
+ "total": {
+ "message": "總量"
+ },
+ "transactions": {
+ "message": "交易紀錄"
+ },
+ "transactionMemo": {
+ "message": "交易備註(選填)"
+ },
+ "transactionNumber": {
+ "message": "交易號碼"
+ },
+ "transfers": {
+ "message": "交易"
+ },
+ "troubleTokenBalances": {
+ "message": "無法取得代幣餘額。您k可以到這裡查看 ",
+ "description": "Followed by a link (here) to view token balances"
+ },
+ "twelveWords": {
+ "message": "這 12 個單詞是唯一回復你的 MetaMask 帳號的方法。\n將它們儲存到那些安全且隱密的地方吧。"
+ },
+ "typePassword": {
+ "message": "請輸入密碼"
+ },
+ "uiWelcome": {
+ "message": "歡迎使用新版界面 (Beta)"
+ },
+ "uiWelcomeMessage": {
+ "message": "你現在正在使用新的 Metamask 界面。試試諸如發送代幣等新功能,有任何問題請告知我們。"
+ },
+ "unapproved": {
+ "message": "未同意"
+ },
+ "unavailable": {
+ "message": "不可用"
+ },
+ "unknown": {
+ "message": "未知"
+ },
+ "unknownNetwork": {
+ "message": "未知私有網路"
+ },
+ "unknownNetworkId": {
+ "message": "未知網路 ID"
+ },
+ "uriErrorMsg": {
+ "message": "URIs 需要加入適當的 HTTP/HTTPS 前綴."
+ },
+ "usaOnly": {
+ "message": "僅限美國",
+ "description": "Using this exchange is limited to people inside the USA"
+ },
+ "usedByClients": {
+ "message": "可用於各種不同的客戶端"
+ },
+ "useOldUI": {
+ "message": "使用舊版界面"
+ },
+ "validFileImport": {
+ "message": "您必須選擇一個合法的檔案來導入."
+ },
+ "vaultCreated": {
+ "message": "已建立金庫"
+ },
+ "viewAccount": {
+ "message": "查看帳戶"
+ },
+ "visitWebSite": {
+ "message": "造訪我們的網站"
+ },
+ "warning": {
+ "message": "警告"
+ },
+ "welcomeBeta": {
+ "message": "歡迎到 MetaMask Beta"
+ },
+ "whatsThis": {
+ "message": "這是什麼?"
+ },
+ "yourSigRequested": {
+ "message": "正在請求你的簽署"
+ },
+ "youSign": {
+ "message": "正在簽署"
+ }
+}
diff --git a/app/manifest.json b/app/manifest.json
index 0aac1c8df..a20f9b976 100644
--- a/app/manifest.json
+++ b/app/manifest.json
@@ -1,7 +1,7 @@
{
"name": "__MSG_appName__",
"short_name": "__MSG_appName__",
- "version": "4.3.0",
+ "version": "4.4.0",
"manifest_version": 2,
"author": "https://metamask.io",
"description": "__MSG_appDescription__",
diff --git a/app/scripts/background.js b/app/scripts/background.js
index c8fe1cd63..98de1d278 100644
--- a/app/scripts/background.js
+++ b/app/scripts/background.js
@@ -85,7 +85,6 @@ async function loadStateFromPersistence () {
// write to disk
if (localStore.isSupported) localStore.set(versionedData)
- diskStore.putState(versionedData)
// return just the data
return versionedData.data
@@ -123,7 +122,6 @@ function setupController (initState, initLangCode) {
debounce(1000),
storeTransform(versionifyData),
storeTransform(syncDataWithExtension),
- asStream(diskStore),
(error) => {
log.error('pump hit error', error)
}
diff --git a/app/scripts/migrations/022.js b/app/scripts/migrations/022.js
new file mode 100644
index 000000000..c3c0d53ef
--- /dev/null
+++ b/app/scripts/migrations/022.js
@@ -0,0 +1,39 @@
+
+const version = 22
+
+/*
+
+This migration adds submittedTime to the txMeta if it is not their
+
+*/
+
+const clone = require('clone')
+
+module.exports = {
+ version,
+
+ migrate: function (originalVersionedData) {
+ const versionedData = clone(originalVersionedData)
+ versionedData.meta.version = version
+ try {
+ const state = versionedData.data
+ const newState = transformState(state)
+ versionedData.data = newState
+ } catch (err) {
+ console.warn(`MetaMask Migration #${version}` + err.stack)
+ }
+ return Promise.resolve(versionedData)
+ },
+}
+
+function transformState (state) {
+ const newState = state
+ const transactions = newState.TransactionController.transactions
+
+ newState.TransactionController.transactions = transactions.map((txMeta) => {
+ if (txMeta.status !== 'submitted' || txMeta.submittedTime) return txMeta
+ txMeta.submittedTime = (new Date()).getTime()
+ return txMeta
+ })
+ return newState
+}
diff --git a/app/scripts/migrations/index.js b/app/scripts/migrations/index.js
index a0cf5f4d4..b49a40c65 100644
--- a/app/scripts/migrations/index.js
+++ b/app/scripts/migrations/index.js
@@ -32,4 +32,5 @@ module.exports = [
require('./019'),
require('./020'),
require('./021'),
+ require('./022'),
]
diff --git a/mascara/src/app/first-time/index.css b/mascara/src/app/first-time/index.css
index d7b146e51..5f8bbd4be 100644
--- a/mascara/src/app/first-time/index.css
+++ b/mascara/src/app/first-time/index.css
@@ -122,6 +122,10 @@
width: calc(100vw - 80px);
}
+ .unique-image {
+ width: auto;
+ }
+
.create-password__title,
.unique-image__title,
.tou__title,
@@ -221,10 +225,6 @@
max-width: 46rem;
}
-.backup-phrase {
- width: 100%;
-}
-
.create-password__title,
.unique-image__title,
.tou__title,
@@ -674,7 +674,6 @@ button.backup-phrase__confirm-seed-option:hover {
}
.buy-ether__action-content-wrapper {
- width: 360px;
display: flex;
flex-flow: column nowrap;
}
diff --git a/mascara/src/app/first-time/index.js b/mascara/src/app/first-time/index.js
index da2f6bab9..c0bba53d6 100644
--- a/mascara/src/app/first-time/index.js
+++ b/mascara/src/app/first-time/index.js
@@ -10,6 +10,7 @@ import ImportSeedPhraseScreen from './import-seed-phrase-screen'
import {
onboardingBuyEthView,
unMarkPasswordForgotten,
+ showModal,
} from '../../../../ui/app/actions'
class FirstTimeFlow extends Component {
@@ -80,7 +81,7 @@ class FirstTimeFlow extends Component {
renderScreen () {
const {SCREEN_TYPE} = FirstTimeFlow
const {
- goToBuyEtherView,
+ openBuyEtherModal,
address,
restoreCreatePasswordScreen,
forgottenPassword,
@@ -131,7 +132,7 @@ class FirstTimeFlow extends Component {
case SCREEN_TYPE.BACK_UP_PHRASE:
return (
<BackupPhraseScreen
- next={() => goToBuyEtherView(address)}
+ next={() => openBuyEtherModal()}
/>
)
default:
@@ -167,7 +168,7 @@ export default connect(
}),
dispatch => ({
leaveImportSeedScreenState: () => dispatch(unMarkPasswordForgotten()),
- goToBuyEtherView: address => dispatch(onboardingBuyEthView(address)),
+ openBuyEtherModal: () => dispatch(showModal({ name: 'DEPOSIT_ETHER'})),
})
)(FirstTimeFlow)
diff --git a/test/integration/lib/add-token.js b/test/integration/lib/add-token.js
index 228192e7b..cc04beb21 100644
--- a/test/integration/lib/add-token.js
+++ b/test/integration/lib/add-token.js
@@ -34,8 +34,8 @@ async function runAddTokenFlowTest (assert, done) {
let addTokenWrapper = await queryAsync($, '.add-token__wrapper')
assert.ok(addTokenWrapper[0], 'add token wrapper renders')
- let addTokenTitle = await queryAsync($, '.add-token__title')
- assert.equal(addTokenTitle[0].textContent, 'Add Token', 'add token title is correct')
+ let addTokenTitle = await queryAsync($, '.add-token__header__title')
+ assert.equal(addTokenTitle[0].textContent, 'Add Tokens', 'add token title is correct')
// Cancel Add Token
const cancelAddTokenButton = await queryAsync($, 'button.btn-secondary--lg.add-token__cancel-button')
@@ -51,9 +51,9 @@ async function runAddTokenFlowTest (assert, done) {
// Verify Add Token Screen
addTokenWrapper = await queryAsync($, '.add-token__wrapper')
- addTokenTitle = await queryAsync($, '.add-token__title')
+ addTokenTitle = await queryAsync($, '.add-token__header__title')
assert.ok(addTokenWrapper[0], 'add token wrapper renders')
- assert.equal(addTokenTitle[0].textContent, 'Add Token', 'add token title is correct')
+ assert.equal(addTokenTitle[0].textContent, 'Add Tokens', 'add token title is correct')
// Search for token
const searchInput = await queryAsync($, 'input.add-token__input')
@@ -91,9 +91,11 @@ async function runAddTokenFlowTest (assert, done) {
assert.ok(addTokenButton[0], 'add token button present')
addTokenButton[0].click()
- const addCustom = await queryAsync($, '.add-token__add-custom')
- assert.ok(addCustom[0], 'add custom token button present')
- addCustom[0].click()
+ const addTokenTabs = await queryAsync($, '.add-token__header__tabs__tab')
+ assert.equal(addTokenTabs.length, 2, 'expected number of tabs')
+ assert.equal(addTokenTabs[1].textContent, 'Custom Token', 'Custom Token tab present')
+ assert.ok(addTokenTabs[1], 'add custom token tab present')
+ addTokenTabs[1].click()
// Input token contract address
const customInput = await queryAsync($, 'input.add-token__add-custom-input')
@@ -108,6 +110,7 @@ async function runAddTokenFlowTest (assert, done) {
// Verify symbol length error since contract address won't return symbol
const errorMessage = await queryAsync($, '.add-token__add-custom-error-message')
assert.ok(errorMessage[0], 'error rendered')
+
$('button.btn-secondary--lg')[0].click()
// // Confirm Add token
diff --git a/test/integration/lib/mascara-first-time.js b/test/integration/lib/mascara-first-time.js
index bcbc94ff6..564852585 100644
--- a/test/integration/lib/mascara-first-time.js
+++ b/test/integration/lib/mascara-first-time.js
@@ -57,9 +57,9 @@ async function runFirstTimeUsageTest (assert, done) {
;(await findAsync(app, '.first-time-flow__button')).click()
// Deposit Ether Screen
- const buyEthTitle = (await findAsync(app, '.buy-ether__title'))[0]
- assert.equal(buyEthTitle.textContent, 'Deposit Ether', 'deposit ether screen')
- ;(await findAsync(app, '.buy-ether__do-it-later')).click()
+ const depositEthTitle = (await findAsync(app, '.page-container__title'))[0]
+ assert.equal(depositEthTitle.textContent, 'Deposit Ether', 'deposit ether screen')
+ ;(await findAsync(app, '.page-container__header-close')).click()
const menu = (await findAsync(app, '.account-menu__icon'))[0]
menu.click()
diff --git a/test/integration/lib/send-new-ui.js b/test/integration/lib/send-new-ui.js
index 7bd9a7a65..163f3658c 100644
--- a/test/integration/lib/send-new-ui.js
+++ b/test/integration/lib/send-new-ui.js
@@ -129,7 +129,6 @@ async function runSendFlowTest(assert, done) {
selectState.val('send edit')
reactTriggerChange(selectState[0])
- await timeout(10000)
const confirmFromName = (await queryAsync($, '.sender-to-recipient__sender-name')).first()
assert.equal(confirmFromName[0].textContent, 'Send Account 2', 'confirm screen should show correct from name')
diff --git a/test/unit/migrations/022-test.js b/test/unit/migrations/022-test.js
new file mode 100644
index 000000000..1333d929d
--- /dev/null
+++ b/test/unit/migrations/022-test.js
@@ -0,0 +1,32 @@
+const assert = require('assert')
+const migration22 = require('../../../app/scripts/migrations/022')
+const properTime = (new Date()).getTime()
+const storage = {
+ "meta": {},
+ "data": {
+ "TransactionController": {
+ "transactions": [
+ { "status": "submitted" },
+ { "status": "submitted", "submittedTime": properTime },
+ {"status": "confirmed"},
+ ]
+ },
+ },
+}
+
+describe('storage is migrated successfully where transactions that are submitted have submittedTimes', () => {
+ it('should add submittedTime key on the txMeta if appropriate', (done) => {
+ migration22.migrate(storage)
+ .then((migratedData) => {
+ const [txMeta1, txMeta2, txMeta3] = migratedData.data.TransactionController.transactions
+ assert.equal(migratedData.meta.version, 22)
+ // should have written a submitted time
+ assert(txMeta1.submittedTime)
+ // should not have written a submitted time because it already has one
+ assert.equal(txMeta2.submittedTime, properTime)
+ // should not have written a submitted time
+ assert(!txMeta3.submittedTime)
+ done()
+ }).catch(done)
+ })
+})
diff --git a/ui/app/add-token.js b/ui/app/add-token.js
index 021087ff1..a96871853 100644
--- a/ui/app/add-token.js
+++ b/ui/app/add-token.js
@@ -54,10 +54,10 @@ function AddTokenScreen () {
customSymbol: '',
customDecimals: '',
searchQuery: '',
- isCollapsed: true,
selectedTokens: {},
errors: {},
autoFilled: false,
+ displayedTab: 'SEARCH',
}
this.tokenAddressDidChange = this.tokenAddressDidChange.bind(this)
this.tokenSymbolDidChange = this.tokenSymbolDidChange.bind(this)
@@ -191,7 +191,7 @@ AddTokenScreen.prototype.attemptToAutoFillTokenParams = async function (address)
AddTokenScreen.prototype.renderCustomForm = function () {
const { autoFilled, customAddress, customSymbol, customDecimals, errors } = this.state
- return !this.state.isCollapsed && (
+ return (
h('div.add-token__add-custom-form', [
h('div', {
className: classnames('add-token__add-custom-field', {
@@ -246,33 +246,36 @@ AddTokenScreen.prototype.renderTokenList = function () {
})
const results = [...addressSearchResult, ...fuseSearchResult]
- return Array(6).fill(undefined)
- .map((_, i) => {
- const { logo, symbol, name, address } = results[i] || {}
- const tokenAlreadyAdded = this.checkExistingAddresses(address)
- return Boolean(logo || symbol || name) && (
- h('div.add-token__token-wrapper', {
- className: classnames({
- 'add-token__token-wrapper--selected': selectedTokens[address],
- 'add-token__token-wrapper--disabled': tokenAlreadyAdded,
- }),
- onClick: () => !tokenAlreadyAdded && this.toggleToken(address, results[i]),
- }, [
- h('div.add-token__token-icon', {
- style: {
- backgroundImage: logo && `url(images/contract/${logo})`,
- },
- }),
- h('div.add-token__token-data', [
- h('div.add-token__token-symbol', symbol),
- h('div.add-token__token-name', name),
- ]),
- // tokenAlreadyAdded && (
- // h('div.add-token__token-message', 'Already added')
- // ),
- ])
- )
- })
+ return h('div', [
+ results.length > 0 && h('div.add-token__token-icons-title', this.props.t('popularTokens')),
+ h('div.add-token__token-icons-container', Array(6).fill(undefined)
+ .map((_, i) => {
+ const { logo, symbol, name, address } = results[i] || {}
+ const tokenAlreadyAdded = this.checkExistingAddresses(address)
+ return Boolean(logo || symbol || name) && (
+ h('div.add-token__token-wrapper', {
+ className: classnames({
+ 'add-token__token-wrapper--selected': selectedTokens[address],
+ 'add-token__token-wrapper--disabled': tokenAlreadyAdded,
+ }),
+ onClick: () => !tokenAlreadyAdded && this.toggleToken(address, results[i]),
+ }, [
+ h('div.add-token__token-icon', {
+ style: {
+ backgroundImage: logo && `url(images/contract/${logo})`,
+ },
+ }),
+ h('div.add-token__token-data', [
+ h('div.add-token__token-symbol', symbol),
+ h('div.add-token__token-name', name),
+ ]),
+ // tokenAlreadyAdded && (
+ // h('div.add-token__token-message', 'Already added')
+ // ),
+ ])
+ )
+ })),
+ ])
}
AddTokenScreen.prototype.renderConfirmation = function () {
@@ -299,7 +302,6 @@ AddTokenScreen.prototype.renderConfirmation = function () {
h('div.add-token', [
h('div.add-token__wrapper', [
h('div.add-token__title-container.add-token__confirmation-title', [
- h('div.add-token__title', this.props.t('addToken')),
h('div.add-token__description', this.props.t('likeToAddTokens')),
]),
h('div.add-token__content-container.add-token__confirmation-content', [
@@ -331,52 +333,86 @@ AddTokenScreen.prototype.renderConfirmation = function () {
)
}
-AddTokenScreen.prototype.render = function () {
- const { isCollapsed, errors, isShowingConfirmation } = this.state
- const { goHome } = this.props
+AddTokenScreen.prototype.displayTab = function (selectedTab) {
+ this.setState({ displayedTab: selectedTab })
+}
- return isShowingConfirmation
- ? this.renderConfirmation()
- : (
- h('div.add-token', [
- h('div.add-token__wrapper', [
- h('div.add-token__title-container', [
- h('div.add-token__title', this.props.t('addToken')),
- h('div.add-token__description', this.props.t('tokenWarning1')),
- h('div.add-token__description', this.props.t('tokenSelection')),
- ]),
- h('div.add-token__content-container', [
- h('div.add-token__input-container', [
- h('input.add-token__input', {
- type: 'text',
- placeholder: this.props.t('search'),
- onChange: e => this.setState({ searchQuery: e.target.value }),
- }),
- h('div.add-token__search-input-error-message', errors.tokenSelector),
- ]),
- h(
- 'div.add-token__token-icons-container',
- this.renderTokenList(),
- ),
+AddTokenScreen.prototype.renderTabs = function () {
+ const { displayedTab, errors } = this.state
+
+ return displayedTab === 'CUSTOM_TOKEN'
+ ? this.renderCustomForm()
+ : h('div', [
+ h('div.add-token__wrapper', [
+ h('div.add-token__content-container', [
+ h('div.add-token__info-box', [
+ h('div.add-token__info-box__close'),
+ h('div.add-token__info-box__title', this.props.t('whatsThis')),
+ h('div.add-token__info-box__copy', this.props.t('keepTrackTokens')),
+ h('div.add-token__info-box__copy--blue', this.props.t('learnMore')),
]),
- h('div.add-token__footers', [
- h('div.add-token__add-custom', {
- onClick: () => this.setState({ isCollapsed: !isCollapsed }),
- }, [
- this.props.t('addCustomToken'),
- h(`i.fa.fa-angle-${isCollapsed ? 'down' : 'up'}`),
- ]),
- this.renderCustomForm(),
+ h('div.add-token__input-container', [
+ h('input.add-token__input', {
+ type: 'text',
+ placeholder: this.props.t('searchTokens'),
+ onChange: e => this.setState({ searchQuery: e.target.value }),
+ }),
+ h('div.add-token__search-input-error-message', errors.tokenSelector),
]),
+ this.renderTokenList(),
]),
- h('div.add-token__buttons', [
- h('button.btn-secondary--lg.add-token__cancel-button', {
- onClick: goHome,
- }, this.props.t('cancel')),
- h('button.btn-primary--lg', {
- onClick: this.onNext,
- }, this.props.t('next')),
+ ]),
+ ])
+}
+
+AddTokenScreen.prototype.render = function () {
+ const {
+ isShowingConfirmation,
+ displayedTab,
+ } = this.state
+ const { goHome } = this.props
+
+ return h('div.add-token', [
+ h('div.add-token__header', [
+ h('div.add-token__header__cancel', {
+ onClick: () => goHome(),
+ }, [
+ h('i.fa.fa-angle-left.fa-lg'),
+ h('span', this.props.t('cancel')),
]),
- ])
- )
+ h('div.add-token__header__title', this.props.t('addTokens')),
+ !isShowingConfirmation && h('div.add-token__header__tabs', [
+
+ h('div.add-token__header__tabs__tab', {
+ className: classnames('add-token__header__tabs__tab', {
+ 'add-token__header__tabs__selected': displayedTab === 'SEARCH',
+ 'add-token__header__tabs__unselected cursor-pointer': displayedTab !== 'SEARCH',
+ }),
+ onClick: () => this.displayTab('SEARCH'),
+ }, this.props.t('search')),
+
+ h('div.add-token__header__tabs__tab', {
+ className: classnames('add-token__header__tabs__tab', {
+ 'add-token__header__tabs__selected': displayedTab === 'CUSTOM_TOKEN',
+ 'add-token__header__tabs__unselected cursor-pointer': displayedTab !== 'CUSTOM_TOKEN',
+ }),
+ onClick: () => this.displayTab('CUSTOM_TOKEN'),
+ }, this.props.t('customToken')),
+
+ ]),
+ ]),
+//
+ isShowingConfirmation
+ ? this.renderConfirmation()
+ : this.renderTabs(),
+
+ !isShowingConfirmation && h('div.add-token__buttons', [
+ h('button.btn-secondary--lg.add-token__cancel-button', {
+ onClick: goHome,
+ }, this.props.t('cancel')),
+ h('button.btn-primary--lg.add-token__confirm-button', {
+ onClick: this.onNext,
+ }, this.props.t('next')),
+ ]),
+ ])
}
diff --git a/ui/app/app.js b/ui/app/app.js
index 91d5af899..d23238bab 100644
--- a/ui/app/app.js
+++ b/ui/app/app.js
@@ -385,7 +385,7 @@ App.prototype.renderPrimary = function () {
isUnlocked,
} = props
const isMascaraOnboarding = isMascara && isOnboarding
- const isBetaUIOnboarding = betaUI && isOnboarding && !props.isPopup && !isRevealingSeedWords
+ const isBetaUIOnboarding = betaUI && isOnboarding
if (!welcomeScreenSeen && betaUI && !isInitialized && !isUnlocked) {
return h(WelcomeScreen)
@@ -396,7 +396,7 @@ App.prototype.renderPrimary = function () {
}
// notices
- if (!props.noActiveNotices) {
+ if (!props.noActiveNotices && !betaUI) {
log.debug('rendering notice screen for unread notices.')
return h(NoticeScreen, {
notice: props.lastUnreadNotice,
@@ -417,7 +417,7 @@ App.prototype.renderPrimary = function () {
return h(HDRestoreVaultScreen, {key: 'HDRestoreVaultScreen'})
} else if (!props.isInitialized && !props.isUnlocked && !isRevealingSeedWords) {
log.debug('rendering menu screen')
- return props.isPopup
+ return !betaUI
? h(OldUIInitializeMenuScreen, {key: 'menuScreenInit'})
: h(InitializeMenuScreen, {key: 'menuScreenInit'})
}
diff --git a/ui/app/css/itcss/components/add-token.scss b/ui/app/css/itcss/components/add-token.scss
index bdf9da385..f5c1de67c 100644
--- a/ui/app/css/itcss/components/add-token.scss
+++ b/ui/app/css/itcss/components/add-token.scss
@@ -1,37 +1,118 @@
.add-token {
width: 498px;
+ max-height: 805px;
display: flex;
flex-flow: column nowrap;
- align-items: center;
position: relative;
z-index: 12;
- font-family: 'DIN Next Light';
+ font-family: 'Roboto';
+ background: white;
+ border-radius: 8px;
&__wrapper {
background-color: $white;
- box-shadow: 0 2px 4px 0 rgba($black, .08);
display: flex;
flex-flow: column nowrap;
align-items: center;
flex: 0 0 auto;
}
- &__title-container {
+ &__header {
display: flex;
flex-flow: column nowrap;
- align-items: center;
- padding: 30px 60px 12px;
- border-bottom: 1px solid $gallery;
+ padding: 16px 16px 0px;
+ border-bottom: 1px solid $geyser;
flex: 0 0 auto;
+
+ &__cancel {
+ color: $dodger-blue;
+ display: flex;
+ align-items: center;
+
+ span {
+ font-family: Roboto;
+ font-size: 16px;
+ line-height: 21px;
+ margin-left: 8px;
+ }
+ }
+
+ &__title {
+ color: $tundora;
+ font-size: 32px;
+ font-weight: 500;
+ margin-top: 4px;
+ }
+
+ &__tabs {
+ margin-left: 22px;
+ display: flex;
+
+ &__tab {
+ height: 54px;
+ padding: 15px 10px;
+ color: $dusty-gray;
+ font-family: Roboto;
+ font-size: 18px;
+ line-height: 24px;
+ text-align: center;
+ }
+
+ &__tab:first-of-type {
+ margin-right: 20px;
+ }
+
+ &__unselected:hover {
+ color: $black;
+ border-bottom: none;
+ }
+
+ &__selected {
+ color: $curious-blue;
+ border-bottom: 3px solid $curious-blue;
+ }
+ }
}
- &__title {
- color: $scorpion;
- font-size: 20px;
- line-height: 26px;
- text-align: center;
- font-weight: 600;
- margin-bottom: 12px;
+ &__info-box {
+ height: 96px;
+ margin: 20px 24px 0px;
+ border-radius: 4px;
+ background-color: $alabaster;
+ position: relative;
+ padding-left: 18px;
+ display: flex;
+ flex-flow: column;
+
+ &__close::after {
+ content: '\00D7';
+ font-size: 29px;
+ font-weight: 200;
+ color: $dusty-gray;
+ position: absolute;
+ right: 17px;
+ cursor: pointer;
+ }
+
+ &__title {
+ color: $mid-gray;
+ font-family: Roboto;
+ font-size: 14px;
+ margin-top: 15px;
+ margin-bottom: 9px;
+ }
+
+ &__copy,
+ &__copy--blue {
+ color: $mid-gray;
+ font-family: Roboto;
+ font-size: 12px;
+ line-height: 18px;
+ }
+
+ &__copy--blue {
+ color: $curious-blue;
+ }
}
&__description {
@@ -48,19 +129,17 @@
&__content-container {
width: 100%;
- border-bottom: 1px solid $gallery;
}
&__input-container {
- padding: 11px 0;
- width: 263px;
- margin: 0 auto;
+ display: flex;
position: relative;
}
&__search-input-error-message {
position: absolute;
bottom: -10px;
+ left: 22px;
font-size: 12px;
width: 100%;
text-overflow: ellipsis;
@@ -69,16 +148,24 @@
color: $red;
}
- &__input {
- width: 100%;
- border: 2px solid $gallery;
+ &__input,
+ &__add-custom-input {
+ height: 54px;
+ padding: 21px 6px;
+ border: 1px solid $geyser;
border-radius: 4px;
- padding: 5px 15px;
- font-size: 14px;
- line-height: 19px;
+ margin: 22px 24px;
+ position: relative;
+ flex: 1 0 auto;
+ color: $scorpion;
+ font-family: Roboto;
+ font-size: 16px;
&::placeholder {
- color: $silver;
+ color: $scorpion;
+ font-family: Roboto;
+ font-size: 16px;
+ line-height: 21px;
}
}
@@ -115,13 +202,14 @@
&__add-custom-form {
display: flex;
flex-flow: column nowrap;
- margin: 8px 0 51px;
+ margin: 40px 0 30px;
}
&__add-custom-field {
- width: 290px;
- margin: 0 auto;
position: relative;
+ display: flex;
+ flex-flow: column;
+ flex: 1 0 auto;
&--error {
.add-token__add-custom-input {
@@ -132,7 +220,8 @@
&__add-custom-error-message {
position: absolute;
- bottom: -21px;
+ bottom: 1px;
+ left: 22px;
font-size: 12px;
width: 100%;
text-overflow: ellipsis;
@@ -144,38 +233,52 @@
&__add-custom-label {
font-size: 16px;
line-height: 21px;
- margin-bottom: 8px;
+ margin-left: 22px;
+ color: $scorpion;
}
&__add-custom-input {
- width: 100%;
- border: 1px solid $silver;
- padding: 5px 15px;
- font-size: 14px;
- line-height: 19px;
+ margin-top: 6px;
+ font-size: 16px;
&::placeholder {
color: $silver;
+ font-size: 16px;
}
}
&__add-custom-field + &__add-custom-field {
- margin-top: 21px;
+ margin-top: 6px;
}
&__buttons {
display: flex;
flex-flow: row nowrap;
- margin: 30px 0 51px;
flex: 0 0 auto;
align-items: center;
justify-content: center;
+ padding-bottom: 30px;
+ padding-top: 20px;
}
+ &__confirm-button,
&__cancel-button {
+ margin: 0 12px;
+ padding: 10px 13px;
+ height: 54px;
+ width: 133px;
margin-right: 1.2rem;
}
+ &__token-icons-title {
+ color: #5B5D67;
+ font-family: Roboto;
+ font-size: 18px;
+ line-height: 24px;
+ margin-left: 24px;
+ margin-top: 8px;
+ }
+
&__token-icons-container {
display: flex;
flex-flow: row wrap;
@@ -188,7 +291,7 @@
flex: 0 0 42.5%;
align-items: center;
padding: 12px;
- margin: 2.5%;
+ margin: 0% 2.5% 1.5%;
box-sizing: border-box;
border-radius: 10px;
cursor: pointer;
@@ -302,13 +405,14 @@
top: 0;
width: 100%;
overflow: hidden;
- height: 100%;
+ flex: 1 0 auto;
&__wrapper {
box-shadow: none !important;
flex: 1 1 auto;
width: 100%;
- overflow-y: auto;
+ overflow-y: scroll;
+ height: 400px;
}
&__footers {
diff --git a/ui/app/css/itcss/components/request-signature.scss b/ui/app/css/itcss/components/request-signature.scss
index a4728afef..083481b8f 100644
--- a/ui/app/css/itcss/components/request-signature.scss
+++ b/ui/app/css/itcss/components/request-signature.scss
@@ -162,6 +162,7 @@
&__row {
display: flex;
flex-flow: column;
+ flex: 1 0 auto;
}
&__row-title {
diff --git a/ui/app/css/itcss/settings/variables.scss b/ui/app/css/itcss/settings/variables.scss
index 0031238a8..51548306f 100644
--- a/ui/app/css/itcss/settings/variables.scss
+++ b/ui/app/css/itcss/settings/variables.scss
@@ -51,6 +51,7 @@ $java: #29b6af;
$wild-strawberry: #ff4a8d;
$cornflower-blue: #7057ff;
$saffron: #f6c343;
+$dodger-blue: #3099f2;
$zumthor: #edf7ff;
$ecstasy: #f7861c;
diff --git a/yarn.lock b/yarn.lock
index c1b9bef83..35365248a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -72,6 +72,15 @@
normalize-path "^2.0.1"
through2 "^2.0.3"
+"@sentry/cli@^1.30.3":
+ version "1.30.3"
+ resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.30.3.tgz#02d0f7781c1ee5e1be5a4312a325fbe8b1b37231"
+ dependencies:
+ https-proxy-agent "^2.1.1"
+ node-fetch "^1.7.3"
+ progress "2.0.0"
+ proxy-from-env "^1.0.0"
+
"@types/node@*":
version "8.5.2"
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.5.2.tgz#83b8103fa9a2c2e83d78f701a9aa7c9539739aa5"
@@ -201,6 +210,12 @@ agent-base@2:
extend "~3.0.0"
semver "~5.0.1"
+agent-base@^4.1.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.0.tgz#9838b5c3392b962bad031e6a4c5e1024abec45ce"
+ dependencies:
+ es6-promisify "^5.0.0"
+
ajv-keywords@^1.1.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
@@ -3771,6 +3786,16 @@ es6-map@^0.1.3:
es6-symbol "~3.1.1"
event-emitter "~0.3.5"
+es6-promise@^4.0.3:
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29"
+
+es6-promisify@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
+ dependencies:
+ es6-promise "^4.0.3"
+
es6-set@~0.1.5:
version "0.1.5"
resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
@@ -6008,6 +6033,13 @@ https-proxy-agent@1:
debug "2"
extend "3"
+https-proxy-agent@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.0.tgz#7fbba856be8cd677986f42ebd3664f6317257887"
+ dependencies:
+ agent-base "^4.1.0"
+ debug "^3.1.0"
+
human-standard-token-abi@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/human-standard-token-abi/-/human-standard-token-abi-1.0.2.tgz#207d7846796ee5bb85fdd336e769cb38045b2ae0"
@@ -8138,7 +8170,7 @@ nock@^9.0.14:
qs "^6.5.1"
semver "^5.3.0"
-node-fetch@^1.0.1, node-fetch@~1.7.1:
+node-fetch@^1.0.1, node-fetch@^1.7.3, node-fetch@~1.7.1:
version "1.7.3"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
dependencies:
@@ -9168,7 +9200,7 @@ process@~0.5.1:
version "0.5.2"
resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
-progress@^2.0.0:
+progress@2.0.0, progress@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
@@ -9244,6 +9276,10 @@ proxy-agent@~2.0.0:
pac-proxy-agent "1"
socks-proxy-agent "2"
+proxy-from-env@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee"
+
prr@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
@@ -9422,6 +9458,10 @@ raphael@^2.2.0:
dependencies:
eve-raphael "0.5.0"
+raven-js@^3.24.0:
+ version "3.24.0"
+ resolved "https://registry.yarnpkg.com/raven-js/-/raven-js-3.24.0.tgz#59464d8bc4b3812ae87a282e9bb98ecad5b4b047"
+
raw-body@2, raw-body@2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"