From 9f6882b6514b4a34f9dcc732ef815beb20c263a0 Mon Sep 17 00:00:00 2001 From: kumavis Date: Wed, 21 Mar 2018 15:44:48 -0700 Subject: [PATCH 01/34] ci - add build step --- .circleci/config.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index c14909783..b147200da 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,6 +6,9 @@ workflows: jobs: - prep-deps-npm - prep-deps-firefox + - build: + requires: + - prep-deps-npm - prep-scss: requires: - prep-deps-npm @@ -200,3 +203,14 @@ jobs: - run: name: test:integration:mascara command: npm run test:mascara + + build: + docker: + - image: circleci/node:8-browsers + steps: + - checkout + - restore_cache: + key: dependency-cache-{{ checksum "package-lock.json" }} + - run: + name: test:integration:mascara + command: npm run dist && find dist/ -type f -exec md5sum {} \; | sort -k 2 > dist_md5 && echo dist_md5 From 000edc8fd27f5c8bd3ca9f69e54df5a0929463e7 Mon Sep 17 00:00:00 2001 From: kumavis Date: Wed, 21 Mar 2018 15:50:34 -0700 Subject: [PATCH 02/34] ci - fix build job logging --- .circleci/config.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b147200da..bcc9a299f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -212,5 +212,8 @@ jobs: - restore_cache: key: dependency-cache-{{ checksum "package-lock.json" }} - run: - name: test:integration:mascara - command: npm run dist && find dist/ -type f -exec md5sum {} \; | sort -k 2 > dist_md5 && echo dist_md5 + name: build:dist + command: npm run dist + - run: + name: build:debug + command: find dist/ -type f -exec md5sum {} \; | sort -k 2 From 6393c381173e854e280025e8b89d7e0f105984fc Mon Sep 17 00:00:00 2001 From: Dan Date: Thu, 22 Mar 2018 14:29:18 -0230 Subject: [PATCH 03/34] Pop uses new ui onboarding when in beta. --- mascara/src/app/first-time/index.css | 5 ----- mascara/src/app/first-time/index.js | 4 ++-- ui/app/app.js | 6 +++--- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/mascara/src/app/first-time/index.css b/mascara/src/app/first-time/index.css index d7b146e51..2c5439cec 100644 --- a/mascara/src/app/first-time/index.css +++ b/mascara/src/app/first-time/index.css @@ -221,10 +221,6 @@ max-width: 46rem; } -.backup-phrase { - width: 100%; -} - .create-password__title, .unique-image__title, .tou__title, @@ -674,7 +670,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..d2f444fe7 100644 --- a/mascara/src/app/first-time/index.js +++ b/mascara/src/app/first-time/index.js @@ -131,7 +131,7 @@ class FirstTimeFlow extends Component { case SCREEN_TYPE.BACK_UP_PHRASE: return ( goToBuyEtherView(address)} + next={() => openBuyEtherModal()} /> ) default: @@ -167,7 +167,7 @@ export default connect( }), dispatch => ({ leaveImportSeedScreenState: () => dispatch(unMarkPasswordForgotten()), - goToBuyEtherView: address => dispatch(onboardingBuyEthView(address)), + openBuyEtherModal: () => dispatch(showModal({ name: 'DEPOSIT_ETHER'})), }) )(FirstTimeFlow) diff --git a/ui/app/app.js b/ui/app/app.js index 6d9296131..d1b17ab5d 100644 --- a/ui/app/app.js +++ b/ui/app/app.js @@ -386,7 +386,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) @@ -397,7 +397,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, @@ -418,7 +418,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'}) } From 07f483960033f28109afdcf99fb08c48b0231434 Mon Sep 17 00:00:00 2001 From: Dan Date: Thu, 22 Mar 2018 16:49:07 -0230 Subject: [PATCH 04/34] Signed type data notification handles long messages. --- ui/app/css/itcss/components/request-signature.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/app/css/itcss/components/request-signature.scss b/ui/app/css/itcss/components/request-signature.scss index d81099bfa..9ad69dfc0 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 { From 47e09b0f2b42922a5225cd1b023fc9f8d1ab52a1 Mon Sep 17 00:00:00 2001 From: artiya4u Date: Fri, 23 Mar 2018 02:33:57 +0700 Subject: [PATCH 05/34] First add Thai translate. --- app/_locales/th/messages.json | 819 ++++++++++++++++++++++++++++++++++ 1 file changed, 819 insertions(+) create mode 100644 app/_locales/th/messages.json diff --git a/app/_locales/th/messages.json b/app/_locales/th/messages.json new file mode 100644 index 000000000..fd41bd8b9 --- /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": "เครือข่ายอีเธอเรียมหลัก" + }, + "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": "คุณกำลังเซ็นชื่อ" + } +} From d4da7c984f222a255a149425ca29e4fd8ebf297b Mon Sep 17 00:00:00 2001 From: Dan Date: Thu, 22 Mar 2018 14:49:46 -0230 Subject: [PATCH 06/34] Improve responsivensss of unique image screen. --- mascara/src/app/first-time/index.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mascara/src/app/first-time/index.css b/mascara/src/app/first-time/index.css index 2c5439cec..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, From 4c15a121a34fd76e4ab810ef14f13dce4b6f0742 Mon Sep 17 00:00:00 2001 From: artiya4u Date: Sat, 24 Mar 2018 02:38:31 +0700 Subject: [PATCH 07/34] =?UTF-8?q?=E0=B9=8A=E0=B9=8AUpdate=20Thai=20transla?= =?UTF-8?q?te.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/_locales/th/messages.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/_locales/th/messages.json b/app/_locales/th/messages.json index fd41bd8b9..6b25f4dc4 100644 --- a/app/_locales/th/messages.json +++ b/app/_locales/th/messages.json @@ -81,7 +81,7 @@ "message": "ซื้อด้วย Coinbase" }, "buyCoinbaseExplainer": { - "message": "Coinbase เป็นที่ซื้อขายบิตคอยน์ไลท์คอยน์และอีเธอเรียมที่ได้รับความนิยมสูงสุดในโลก" + "message": "Coinbase เป็นแหล่งซื้อขายบิตคอยน์ไลท์คอยน์และอีเธอเรียมที่ได้รับความนิยมสูงสุดในโลก" }, "cancel": { "message": "ยกเลิก" @@ -108,7 +108,7 @@ "message": "ทำต่อไป" }, "continueToCoinbase": { - "message": "ทำต่อไปที่ Coinbase" + "message": "ไปที่ Coinbase" }, "contractDeployment": { "message": "การติดตั้งสัญญา" @@ -191,10 +191,10 @@ "description": "Tells the user what coin they have selected to deposit with shapeshift" }, "depositEth": { - "message": "ฝากอีเธอร์" + "message": "การฝากอีเธอร์" }, "depositEther": { - "message": "ฝากอีเธอร์" + "message": "การฝากอีเธอร์" }, "depositFiat": { "message": "ฝากด้วยเงินตรา" @@ -435,7 +435,7 @@ "message": "กลุ่มคำชีดมีเพียงตัวพิมพ์เล็กเท่านั้น" }, "mainnet": { - "message": "เครือข่ายอีเธอเรียมหลัก" + "message": "เครือข่าย Main Net" }, "message": { "message": "ข้อความ" @@ -501,7 +501,7 @@ "message": "ไม่มีรายการธุรกรรมในอดีต" }, "noTransactions": { - "message": "ไม่มีรายการธุรกรรม" + "message": "ยังไม่มีรายการธุรกรรม" }, "notStarted": { "message": "ยังไม่เริ่ม" @@ -599,10 +599,10 @@ "message": "ย้อนกลับคืน" }, "rinkeby": { - "message": "เครือขายทดสอบ Rinkeby" + "message": "เครือข่ายทดสอบ Rinkeby" }, "ropsten": { - "message": "เครือขายทดสอบ Ropsten" + "message": "เครือข่ายทดสอบ Ropsten" }, "sampleAccountName": { "message": "เช่น บัญชีเฮงเฮงของฉัน", @@ -762,7 +762,7 @@ "message": "ยินดีต้อนรับสู่หน้าตาใหม่ (เบต้า)" }, "uiWelcomeMessage": { - "message": "ขณะนี้คุณใช้งาน Metamask หน้าตาใหม่แล้ว ลองเล่ยคุณลักษณะใหม่ ๆ เช่นการส่งโทเค็นและหากคุณพบปัญหากรุณาแจ้งให้เราทราบ" + "message": "ขณะนี้คุณใช้งาน Metamask หน้าตาใหม่แล้ว ลองเล่นคุณลักษณะใหม่ ๆ เช่นการส่งโทเค็นและหากคุณพบปัญหากรุณาแจ้งให้เราทราบ" }, "unavailable": { "message": "ใช้งานไม่ได้" From fa022e0883ce4634864ead04eac676c64ed6c6c1 Mon Sep 17 00:00:00 2001 From: Dan Date: Sat, 24 Mar 2018 01:13:43 -0230 Subject: [PATCH 08/34] Updates Add token screen to latest design. --- app/_locales/en/messages.json | 15 ++ ui/app/add-token.js | 143 +++++++++------ ui/app/css/itcss/components/add-token.scss | 196 ++++++++++++++++----- ui/app/css/itcss/settings/variables.scss | 1 + 4 files changed, 256 insertions(+), 99 deletions(-) diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index c64b7248b..0bfa992b4 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" }, @@ -702,6 +714,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/ui/app/add-token.js b/ui/app/add-token.js index b3a5bdc20..2b323da93 100644 --- a/ui/app/add-token.js +++ b/ui/app/add-token.js @@ -55,10 +55,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) @@ -192,7 +192,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', { @@ -247,33 +247,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', 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 () { @@ -332,46 +335,76 @@ AddTokenScreen.prototype.renderConfirmation = function () { ) } +AddTokenScreen.prototype.displayTab = function (selectedTab) { + this.setState({ displayedTab: selectedTab }) +} + AddTokenScreen.prototype.render = function () { - const { isCollapsed, errors, isShowingConfirmation } = this.state + const { + errors, + isShowingConfirmation, + displayedTab, + } = this.state const { goHome } = this.props return isShowingConfirmation ? this.renderConfirmation() : ( h('div.add-token', [ - h('div.add-token__wrapper', [ - h('div.add-token__title-container', [ - h('div.add-token__title', t('addToken')), - h('div.add-token__description', t('tokenWarning1')), - h('div.add-token__description', t('tokenSelection')), + h('div.add-token__header', [ + h('div.add-token__header__cancel', { + onClick: () => goHome(), + }, [ + h('i.fa.fa-angle-left.fa-lg'), + h('span', t('cancel')), ]), - h('div.add-token__content-container', [ - h('div.add-token__input-container', [ - h('input.add-token__input', { - type: 'text', - placeholder: t('search'), - onChange: e => this.setState({ searchQuery: e.target.value }), + h('div.add-token__header__title', t('addTokens')), + 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', }), - h('div.add-token__search-input-error-message', errors.tokenSelector), - ]), - h( - 'div.add-token__token-icons-container', - this.renderTokenList(), - ), + onClick: () => this.displayTab('SEARCH'), + }, 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'), + }, t('customToken')), + ]), - h('div.add-token__footers', [ - h('div.add-token__add-custom', { - onClick: () => this.setState({ isCollapsed: !isCollapsed }), - }, [ - t('addCustomToken'), - h(`i.fa.fa-angle-${isCollapsed ? 'down' : 'up'}`), + ]), + + 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', t('whatsThis')), + h('div.add-token__info-box__copy', t('keepTrackTokens')), + h('div.add-token__info-box__copy--blue', t('learnMore')), + ]), + h('div.add-token__input-container', [ + h('input.add-token__input', { + type: 'text', + placeholder: t('searchTokens'), + onChange: e => this.setState({ searchQuery: e.target.value }), + }), + h('div.add-token__search-input-error-message', errors.tokenSelector), + ]), + this.renderTokenList(), ]), - this.renderCustomForm(), ]), ]), h('div.add-token__buttons', [ - h('button.btn-cancel.add-token__button', { + h('button.btn-cancel.add-token__button--cancel', { onClick: goHome, }, t('cancel')), h('button.btn-clear.add-token__button', { diff --git a/ui/app/css/itcss/components/add-token.scss b/ui/app/css/itcss/components/add-token.scss index 13020f62f..f72396735 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,39 +233,57 @@ &__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; } - &__button { - flex: 1 0 141px; + &__button, + &__button--cancel { margin: 0 12px; - padding: 10px 22px; - height: 54px; + padding: 10px 13px; + height: 44px; + width: 133px; + border: 1px solid $curious-blue; + border-radius: 2px; + font-color: $curious-blue; + } + + &__button--cancel { + border-color: $dusty-gray; + font-color: $dusty-gray; + } + + &__token-icons-title { + color: #5B5D67; + font-family: Roboto; + font-size: 18px; + line-height: 24px; + margin-left: 24px; + margin-top: 8px; } &__token-icons-container { @@ -191,7 +298,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; @@ -305,13 +412,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/settings/variables.scss b/ui/app/css/itcss/settings/variables.scss index 640fd95b8..f29d99872 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; /* Z-Indicies From 33f43a7e7a98044f3cec66269e6b0af0bd8eeacd Mon Sep 17 00:00:00 2001 From: artiya4u Date: Sat, 24 Mar 2018 11:06:49 +0700 Subject: [PATCH 09/34] Update Thai translate. --- app/_locales/th/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/_locales/th/messages.json b/app/_locales/th/messages.json index 6b25f4dc4..0e761781f 100644 --- a/app/_locales/th/messages.json +++ b/app/_locales/th/messages.json @@ -762,7 +762,7 @@ "message": "ยินดีต้อนรับสู่หน้าตาใหม่ (เบต้า)" }, "uiWelcomeMessage": { - "message": "ขณะนี้คุณใช้งาน Metamask หน้าตาใหม่แล้ว ลองเล่นคุณลักษณะใหม่ ๆ เช่นการส่งโทเค็นและหากคุณพบปัญหากรุณาแจ้งให้เราทราบ" + "message": "ขณะนี้คุณใช้งาน Metamask หน้าตาใหม่แล้ว ลองใช้ความสามรถใหม่ ๆ เช่นการส่งโทเค็นและหากพบปัญหากรุณาแจ้งให้เราทราบ" }, "unavailable": { "message": "ใช้งานไม่ได้" From 3db8b84eff587c145bad2070081f73b18b872589 Mon Sep 17 00:00:00 2001 From: artiya4u Date: Sat, 24 Mar 2018 11:20:21 +0700 Subject: [PATCH 10/34] Update Thai translate. --- app/_locales/th/messages.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/_locales/th/messages.json b/app/_locales/th/messages.json index 0e761781f..d417763ec 100644 --- a/app/_locales/th/messages.json +++ b/app/_locales/th/messages.json @@ -290,7 +290,7 @@ "message": "วงเงินแก็ส" }, "gasLimitCalculation": { - "message": "เราคำนวณวงเงินแก็สที่แนะนำตามอัตราความสำเร็จบนเครือข่าย" + "message": "เราแนะนำวงเงินแก็สตามความสำเร็จบนเครือข่าย" }, "gasLimitRequired": { "message": "ต้องกำหนดวงเงินแก็ส" @@ -305,7 +305,7 @@ "message": "ราคาแก๊ส (GWEI)" }, "gasPriceCalculation": { - "message": "เราคำนวณวงเงินแก็สที่แนะนำตามอัตราความสำเร็จบนเครือข่าย" + "message": "เราแนะนำราคาแก็สตามความสำเร็จบนเครือข่าย" }, "gasPriceRequired": { "message": "ต้องมีราคาแก๊ส" From 47ee86e9fde6ebcbd936ba63eda33a398460d423 Mon Sep 17 00:00:00 2001 From: artiya4u Date: Sat, 24 Mar 2018 11:59:23 +0700 Subject: [PATCH 11/34] Update Thai translate. --- app/_locales/th/messages.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/_locales/th/messages.json b/app/_locales/th/messages.json index d417763ec..887714f3f 100644 --- a/app/_locales/th/messages.json +++ b/app/_locales/th/messages.json @@ -401,7 +401,7 @@ "message": "เครือข่ายทดสอบ Kovan" }, "knowledgeDataBase": { - "message": "ไปที่ฐานความรู้ของเรา" + "message": "ไปที่คลังความรู้ของเรา" }, "lessThanMax": { "message": "ต้องน้อยกว่าหรือเท่ากับ $1.", @@ -453,7 +453,7 @@ "message": "ต้องเลือกอย่างน้อย 1 โทเค็น" }, "needEtherInWallet": { - "message": "ในการโต้ตอบกับแอพพลิเคชันแบบกระจายโดยใช้ MetaMask คุณจะต้องใช้อีเธอร์ในกระเป๋าเงินของคุณ" + "message": "คุณจะต้องมีอีเธอร์ในกระเป๋าเงินของคุณในการใช้งานกับแอพพลิเคชันแบบกระจายด้วย MetaMask" }, "needImportFile": { "message": "คุณต้องเลือกไฟล์ที่จะนำเข้า", @@ -596,7 +596,7 @@ "message": "อย่าเปิดเผยคำกลุ่มคำชีดของคุณในที่สาธารณะ! คำเหล่านี้สามารถใช้เพื่อขโมยบัญชีทั้งหมดของคุณ" }, "revert": { - "message": "ย้อนกลับคืน" + "message": "ย้อนกลับ" }, "rinkeby": { "message": "เครือข่ายทดสอบ Rinkeby" From c710fb8f50eb0cb11e709bb7baa545455724801a Mon Sep 17 00:00:00 2001 From: Dan Date: Sun, 25 Mar 2018 15:17:10 -0230 Subject: [PATCH 12/34] Use new header on add token confirmation screen. --- ui/app/add-token.js | 133 ++++++++++++++++++++++---------------------- 1 file changed, 68 insertions(+), 65 deletions(-) diff --git a/ui/app/add-token.js b/ui/app/add-token.js index 2b323da93..7e22c0c9e 100644 --- a/ui/app/add-token.js +++ b/ui/app/add-token.js @@ -303,7 +303,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', t('addToken')), h('div.add-token__description', t('likeToAddTokens')), ]), h('div.add-token__content-container.add-token__confirmation-content', [ @@ -339,78 +338,82 @@ AddTokenScreen.prototype.displayTab = function (selectedTab) { this.setState({ displayedTab: selectedTab }) } +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', t('whatsThis')), + h('div.add-token__info-box__copy', t('keepTrackTokens')), + h('div.add-token__info-box__copy--blue', t('learnMore')), + ]), + h('div.add-token__input-container', [ + h('input.add-token__input', { + type: 'text', + placeholder: t('searchTokens'), + onChange: e => this.setState({ searchQuery: e.target.value }), + }), + h('div.add-token__search-input-error-message', errors.tokenSelector), + ]), + this.renderTokenList(), + ]), + ]), + ]) +} + AddTokenScreen.prototype.render = function () { const { - errors, isShowingConfirmation, displayedTab, } = this.state const { goHome } = this.props - return isShowingConfirmation - ? this.renderConfirmation() - : ( - 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', t('cancel')), - ]), - h('div.add-token__header__title', t('addTokens')), - 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'), - }, 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'), - }, t('customToken')), - - ]), + 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', t('cancel')), ]), + h('div.add-token__header__title', 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'), + }, 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'), + }, t('customToken')), - 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', t('whatsThis')), - h('div.add-token__info-box__copy', t('keepTrackTokens')), - h('div.add-token__info-box__copy--blue', t('learnMore')), - ]), - h('div.add-token__input-container', [ - h('input.add-token__input', { - type: 'text', - placeholder: 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-cancel.add-token__button--cancel', { - onClick: goHome, - }, t('cancel')), - h('button.btn-clear.add-token__button', { - onClick: this.onNext, - }, t('next')), - ]), - ]) - ) + ]), + + isShowingConfirmation + ? this.renderConfirmation() + : this.renderTabs(), + + !isShowingConfirmation && h('div.add-token__buttons', [ + h('button.btn-cancel.add-token__button--cancel', { + onClick: goHome, + }, t('cancel')), + h('button.btn-clear.add-token__button', { + onClick: this.onNext, + }, t('next')), + ]), + ]) } From a30b5ccd951e9a7b90cf7cd3a22c72cca1520275 Mon Sep 17 00:00:00 2001 From: Dan Date: Mon, 26 Mar 2018 06:06:28 -0230 Subject: [PATCH 13/34] Update add token integration tests. --- test/integration/lib/add-token.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/test/integration/lib/add-token.js b/test/integration/lib/add-token.js index 42ed28dca..5567de0d0 100644 --- a/test/integration/lib/add-token.js +++ b/test/integration/lib/add-token.js @@ -34,11 +34,11 @@ 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-cancel.add-token__button') + const cancelAddTokenButton = await queryAsync($, 'button.btn-cancel.add-token__button--cancel') assert.ok(cancelAddTokenButton[0], 'cancel add token button present') cancelAddTokenButton.click() @@ -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,7 +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-cancel.add-token__button')[0].click() + $('button.btn-cancel.add-token__button--cancel')[0].click() // // Confirm Add token // assert.equal( From d1927d14079d4f57b5e138ccc7da6a9df6f8326a Mon Sep 17 00:00:00 2001 From: gasolin Date: Tue, 27 Mar 2018 02:53:36 +0800 Subject: [PATCH 15/34] i18n - zh_tw traditional chinese (taiwanese) * translate to Traditional Chinese, fix #3529 --- app/_locales/zh_TW/messages.json | 864 +++++++++++++++++++++++++++++++ 1 file changed, 864 insertions(+) create mode 100644 app/_locales/zh_TW/messages.json 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": "正在簽署" + } +} From b2f454a03ca6f2ce98c494aa4e77aa8aaa82bf8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20=C5=A0?= Date: Mon, 26 Mar 2018 20:57:04 +0200 Subject: [PATCH 16/34] i18n - sl Slovenian translation (#3724) --- app/_locales/sl/messages.json | 819 ++++++++++++++++++++++++++++++++++ 1 file changed, 819 insertions(+) create mode 100644 app/_locales/sl/messages.json 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" + } +} From 07dd06424741c5a43de136496d44a6f9089e837b Mon Sep 17 00:00:00 2001 From: Dan Date: Mon, 26 Mar 2018 16:27:19 -0230 Subject: [PATCH 17/34] Fix tests. --- mascara/src/app/first-time/index.js | 3 ++- test/integration/lib/mascara-first-time.js | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/mascara/src/app/first-time/index.js b/mascara/src/app/first-time/index.js index d2f444fe7..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, 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() From e5af7e1abdb750a8aa2a69245a6cb2c85943b85d Mon Sep 17 00:00:00 2001 From: Dan Date: Mon, 26 Mar 2018 16:54:56 -0230 Subject: [PATCH 27/34] New-ui changelog updates (March 26) --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40d77bc9e..e2896153e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ # Changelog ## Current Master +- 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 From 15952816c17e4a0ac962c66a74abad0ab1013ef1 Mon Sep 17 00:00:00 2001 From: kumavis Date: Mon, 26 Mar 2018 13:58:04 -0700 Subject: [PATCH 28/34] test - remove timeout causing mocha disconnect issues Revert "test - flat - add extra timeout" This reverts commit 4c2cf15d2ad9cdfee4ce67b795877c7ab60231a7. --- test/integration/lib/send-new-ui.js | 1 - 1 file changed, 1 deletion(-) 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') From 5a61a6d57af62bd4dea8f1563a9edde6a03e439b Mon Sep 17 00:00:00 2001 From: Frankie Date: Mon, 26 Mar 2018 14:24:12 -0700 Subject: [PATCH 29/34] migration for adding submittedTime to the txMeta (#3727) * test for migration 022 * write migration 022 adding submittedTime to txMetas whove been submitted --- app/scripts/migrations/022.js | 39 ++++++++++++++++++++++++++++++++ test/unit/migrations/022-test.js | 32 ++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 app/scripts/migrations/022.js create mode 100644 test/unit/migrations/022-test.js 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/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) + }) +}) From 63967ebf4724ba31d3fd4f8039ce52e9e613e3db Mon Sep 17 00:00:00 2001 From: Dan Finlay <542863+danfinlay@users.noreply.github.com> Date: Mon, 26 Mar 2018 14:26:39 -0700 Subject: [PATCH 30/34] Revert "Ci - introduce a build job" --- .circleci/config.yml | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index bcc9a299f..c14909783 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,9 +6,6 @@ workflows: jobs: - prep-deps-npm - prep-deps-firefox - - build: - requires: - - prep-deps-npm - prep-scss: requires: - prep-deps-npm @@ -203,17 +200,3 @@ jobs: - run: name: test:integration:mascara command: npm run test:mascara - - build: - docker: - - image: circleci/node:8-browsers - steps: - - checkout - - restore_cache: - key: dependency-cache-{{ checksum "package-lock.json" }} - - run: - name: build:dist - command: npm run dist - - run: - name: build:debug - command: find dist/ -type f -exec md5sum {} \; | sort -k 2 From e196b6dcb7c9a0df059491b7f0d75b50d54c1b66 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Mon, 26 Mar 2018 15:25:26 -0700 Subject: [PATCH 31/34] Fix bug where full localStorage would crash on start --- CHANGELOG.md | 2 ++ app/scripts/background.js | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2896153e..2d8db6272 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # Changelog ## Current Master + +- 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 diff --git a/app/scripts/background.js b/app/scripts/background.js index 8bd7766ad..7bbaa89d6 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -84,7 +84,6 @@ async function loadStateFromPersistence () { // write to disk if (localStore.isSupported) localStore.set(versionedData) - diskStore.putState(versionedData) // return just the data return versionedData.data @@ -121,7 +120,6 @@ function setupController (initState) { debounce(1000), storeTransform(versionifyData), storeTransform(syncDataWithExtension), - asStream(diskStore), (error) => { log.error('pump hit error', error) } From e0576d052607a9f6b3bf2ffb2d316afef06fe8c4 Mon Sep 17 00:00:00 2001 From: kumavis Date: Mon, 26 Mar 2018 17:05:52 -0700 Subject: [PATCH 32/34] v4.4.0 --- CHANGELOG.md | 2 ++ app/manifest.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d8db6272..25863f1ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Current Master +## 4.4.0 Mon Mar 26 2018 + - 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 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__", From 3b54541a5f7fd5721a23b13720fdec6ec135dd55 Mon Sep 17 00:00:00 2001 From: kumavis Date: Mon, 26 Mar 2018 17:11:00 -0700 Subject: [PATCH 33/34] changelog - add note ofr i18n zh_tw th sl --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25863f1ec..fa4493278 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ## 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 From 0a2616a37fad6573b3543c39ca4f5c557198ad0c Mon Sep 17 00:00:00 2001 From: frankiebee Date: Mon, 26 Mar 2018 18:12:16 -0700 Subject: [PATCH 34/34] include migration 22 --- app/scripts/migrations/index.js | 1 + 1 file changed, 1 insertion(+) 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'), ]